From 1b51f9e9b202d43944d10c4127d8a821d8907e7d Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 10 May 2013 13:43:01 -0400 Subject: [PATCH 001/412] Credit where credit is due --- src/main/java/me/lemire/integercompression/Benchmark.java | 5 +++++ .../integercompression/synth/ClusteredDataGenerator.java | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/me/lemire/integercompression/Benchmark.java b/src/main/java/me/lemire/integercompression/Benchmark.java index 8e22b68..1fc1b36 100644 --- a/src/main/java/me/lemire/integercompression/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/Benchmark.java @@ -18,6 +18,11 @@ public class Benchmark { public static void main(String args[]) { + System.out.println("# benchmark based on the ClusterData model from:"); + System.out.println("# Vo Ngoc Anh and Alistair Moffat. "); + System.out.println("# Index compression using 64-bit words.") ; + System.out.println("# Softw. Pract. Exper.40, 2 (February 2010), 131-147. "); + System.out.println(); test(20, 18, 10); } diff --git a/src/main/java/me/lemire/integercompression/synth/ClusteredDataGenerator.java b/src/main/java/me/lemire/integercompression/synth/ClusteredDataGenerator.java index 897b3e5..b1b3880 100644 --- a/src/main/java/me/lemire/integercompression/synth/ClusteredDataGenerator.java +++ b/src/main/java/me/lemire/integercompression/synth/ClusteredDataGenerator.java @@ -7,7 +7,11 @@ package me.lemire.integercompression.synth; /** - * This class will generate uniformly distributed lists of random integers. + * This class will generate lists of random integers based on the clustered model: + * + * Reference: + * Vo Ngoc Anh and Alistair Moffat. 2010. Index compression using 64-bit words. + * Softw. Pract. Exper.40, 2 (February 2010), 131-147. * * @author Daniel Lemire */ From 6d892d2bd8e7090ed67c0b1c570106135f7b744d Mon Sep 17 00:00:00 2001 From: JD Maturen Date: Tue, 21 May 2013 18:44:14 -0700 Subject: [PATCH 002/412] reformat for readability --- .../com/kamikaze/pfordelta/LCPForDelta.java | 813 +- .../com/kamikaze/pfordelta/PForDelta.java | 659 +- .../pfordelta/PForDeltaUnpack128.java | 1726 +- .../PForDeltaUnpack128WIthIntBuffer.java | 1696 +- .../java/com/kamikaze/pfordelta/Simple16.java | 190 +- .../pfordelta/Simple16WithHardCodes.java | 1258 +- .../lemire/integercompression/Benchmark.java | 487 +- .../BenchmarkBitPacking.java | 329 +- .../integercompression/BinaryPacking.java | 98 +- .../lemire/integercompression/BitPacking.java | 14047 ++++++++-------- .../integercompression/Composition.java | 60 +- .../me/lemire/integercompression/Delta.java | 46 +- .../lemire/integercompression/FastPFOR.java | 436 +- .../integercompression/IntegerCODEC.java | 24 +- .../IntegratedBinaryPacking.java | 118 +- .../IntegratedBitPacking.java | 9695 ++++++----- .../IntegratedComposition.java | 52 +- .../IntegratedIntegerCODEC.java | 4 +- .../IntegratedVariableByte.java | 112 +- .../lemire/integercompression/JustCopy.java | 43 +- .../me/lemire/integercompression/NewPFD.java | 259 +- .../lemire/integercompression/NewPFDS9.java | 259 +- .../me/lemire/integercompression/OptPFD.java | 315 +- .../lemire/integercompression/OptPFDS9.java | 285 +- .../me/lemire/integercompression/S16.java | 298 +- .../java/me/lemire/integercompression/S9.java | 292 +- .../me/lemire/integercompression/Simple9.java | 530 +- .../me/lemire/integercompression/Util.java | 49 +- .../integercompression/VariableByte.java | 99 +- .../synth/ClusteredDataGenerator.java | 92 +- .../synth/UniformDataGenerator.java | 48 +- 31 files changed, 17011 insertions(+), 17408 deletions(-) diff --git a/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java b/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java index 45bcc66..6eb489c 100644 --- a/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java +++ b/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java @@ -24,531 +24,488 @@ * limitations under the License. */ -import java.util.Arrays; import java.nio.IntBuffer; +import java.util.Arrays; /** * Implementation of the optimized PForDelta algorithm for sorted integer arrays. The basic ideas are based on - * + *

* 1. Original algorithm from - * http://homepages.cwi.nl/~heman/downloads/msthesis.pdf - * + * http://homepages.cwi.nl/~heman/downloads/msthesis.pdf + *

* 2. Optimization and - * variation from http://www2008.org/papers/pdf/p387-zhangA.pdf - * + * variation from http://www2008.org/papers/pdf/p387-zhangA.pdf + *

* 3. Further optimization * http://www2009.org/proceedings/pdf/p401.pdf - * - * As a part of the PForDelta implementation, Simple16 is used to compress exceptions. - * The original Simple16 algorithm can also be found in the above literatures. - * - * This implementation overcomes the problem that Simple16 cannot deal with >2^28 numbers. - * - * This implemtatation is almost same as PForDelta in the same package, except that it is tuned especially for Lucene-4.0 Codec to achieve - * the best performance in Lucene-4.0. - * + *

+ * As a part of the PForDelta implementation, Simple16 is used to compress exceptions. + * The original Simple16 algorithm can also be found in the above literature. + *

+ * This implementation overcomes the problem that Simple16 cannot deal with >2^28 numbers. + *

+ * This implementation is almost same as PForDelta in the same package, except that it is tuned especially for Lucene-4.0 Codec to achieve + * the best performance in Lucene-4.0. + * * @author hao yan, hyan2008@gmail.com */ -public class LCPForDelta{ - - // NOTE: we expect the blockSize is always < (1<<(31-POSSIBLE_B_BITS)). For example, in the current default settings, - // the blockSize < (1<<(31-5)), that is, < 2^27 - - //All possible values of b in the PForDelta algorithm - private static final int[] POSSIBLE_B = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,16,20,28}; - - // POSSIBLE_B.length < (1<>>5)]; - - int[] expPosBuffer = new int[blockSize]; - int[] expHighBitsBuffer = new int[blockSize]; - - // compress the b-bit slots - for (int i = 0; i>> 5)]; + + int[] expPosBuffer = new int[blockSize]; + int[] expHighBitsBuffer = new int[blockSize]; + + // compress the b-bit slots + for (int i = 0; i < blockSize; ++i) { + int value = inputBlock[i]; + if (value < expUpperBound) { writeBits(tmpCompBuffer, value, outputOffset, bits); - } - else // exp - { + } else // exp + { // store the lower bits-bits of the exception - writeBits(tmpCompBuffer, value & MASK[bits], outputOffset, bits); + writeBits(tmpCompBuffer, value & MASK[bits], outputOffset, bits); // write the position of exception - expPosBuffer[expNum] = i; + expPosBuffer[expNum] = i; // write the higher 32-bits bits of the exception - expHighBitsBuffer[expNum] = (value >>> bits) & MASK[32-bits]; + expHighBitsBuffer[expNum] = (value >>> bits) & MASK[32 - bits]; expNum++; - } - outputOffset += bits; - } + } + outputOffset += bits; + } - tmpCompBuffer[0] = ((bits & MASK[POSSIBLE_B_BITS]) << (31-POSSIBLE_B_BITS)) | (expNum & MASK[31-POSSIBLE_B_BITS]); + tmpCompBuffer[0] = ((bits & MASK[POSSIBLE_B_BITS]) << (31 - POSSIBLE_B_BITS)) | (expNum & MASK[31 - POSSIBLE_B_BITS]); - // compress exceptions - if(expNum>0) - { - int compressedBitSize; - - compressedBitSize = compressBlockByS16(tmpCompBuffer, outputOffset, expPosBuffer, expNum, blockSize, inputBlock); - outputOffset += compressedBitSize; - - compressedBitSize = compressBlockByS16(tmpCompBuffer, outputOffset, expHighBitsBuffer, expNum, blockSize, inputBlock); - outputOffset += compressedBitSize; - } + // compress exceptions + if (expNum > 0) { + int compressedBitSize; - // discard the redundant parts in the tmpCompressedBlock - int compressedSizeInInts = (outputOffset+31)>>>5; - - compBuffer = tmpCompBuffer; - return compressedSizeInInts; - } - - public int compressOneBlockCore2(int[] inputBlock, int blockSize, int bits) throws IllegalArgumentException { - int outputOffset = HEADER_SIZE; - int expUpperBound = 1<>>5)]; - - int[] expPosBuffer = new int[blockSize]; - int[] expHighBitsBuffer = new int[blockSize]; - - // compress the b-bit slots - for (int i = 0; i>> 5; + + compBuffer = tmpCompBuffer; + return compressedSizeInInts; + } + + public int compressOneBlockCore2(int[] inputBlock, int blockSize, int bits) throws IllegalArgumentException { + int outputOffset = HEADER_SIZE; + int expUpperBound = 1 << bits; + int expNum = 0; + int maxCompBitSize = HEADER_SIZE + blockSize * (MAX_BITS + MAX_BITS + MAX_BITS) + 32; + int[] tmpCompBuffer = new int[(maxCompBitSize >>> 5)]; + + int[] expPosBuffer = new int[blockSize]; + int[] expHighBitsBuffer = new int[blockSize]; + + // compress the b-bit slots + for (int i = 0; i < blockSize; ++i) { int value = inputBlock[i]; - if (value < expUpperBound) - { - writeBits(tmpCompBuffer, value, outputOffset, bits); - } - else // exp + if (value < expUpperBound) { + writeBits(tmpCompBuffer, value, outputOffset, bits); + } else // exp { - // store the lower bits-bits of the exception - writeBits(tmpCompBuffer, value & MASK[bits], outputOffset, bits); - // write the position of exception - expPosBuffer[expNum] = i; - // write the higher 32-bits bits of the exception - expHighBitsBuffer[expNum] = (value >>> bits) & MASK[32-bits]; - expNum++; + // store the lower bits-bits of the exception + writeBits(tmpCompBuffer, value & MASK[bits], outputOffset, bits); + // write the position of exception + expPosBuffer[expNum] = i; + // write the higher 32-bits bits of the exception + expHighBitsBuffer[expNum] = (value >>> bits) & MASK[32 - bits]; + expNum++; } outputOffset += bits; - } + } - tmpCompBuffer[0] = ((bits & MASK[POSSIBLE_B_BITS]) << (31-POSSIBLE_B_BITS)) | (expNum & MASK[31-POSSIBLE_B_BITS]); + tmpCompBuffer[0] = ((bits & MASK[POSSIBLE_B_BITS]) << (31 - POSSIBLE_B_BITS)) | (expNum & MASK[31 - POSSIBLE_B_BITS]); - // compress exceptions - if(expNum>0) - { + // compress exceptions + if (expNum > 0) { int compressedBitSize; - - int[] expBuffer = new int[expNum*2]; - System.arraycopy(expPosBuffer,0, expBuffer,0,expNum); - System.arraycopy(expHighBitsBuffer,0,expBuffer,expNum,expNum); - - compressedBitSize = compressBlockByS16(tmpCompBuffer, outputOffset, expBuffer, expNum*2, blockSize, inputBlock); - outputOffset += compressedBitSize; - } - // discard the redundant parts in the tmpCompressedBlock - int compressedSizeInInts = (outputOffset+31)>>>5; + int[] expBuffer = new int[expNum * 2]; + System.arraycopy(expPosBuffer, 0, expBuffer, 0, expNum); + System.arraycopy(expHighBitsBuffer, 0, expBuffer, expNum, expNum); - compBuffer = tmpCompBuffer; - return compressedSizeInInts; + compressedBitSize = compressBlockByS16(tmpCompBuffer, outputOffset, expBuffer, expNum * 2, blockSize, inputBlock); + outputOffset += compressedBitSize; } - - /** - * Decompress one block using PForDelta - * @param decompBlock the block that was decompressed - * @param inBlock the block to be decompressed - * @param blockSize the number of elements in the decompressed block - * - */ - public static void decompressOneBlock(int[] decompBlock, int[] inBlock, int blockSize) - { - int expNum = inBlock[0] & MASK[31-POSSIBLE_B_BITS]; - int bits = (inBlock[0]>>>(31-POSSIBLE_B_BITS)) & (0x1f); + + // discard the redundant parts in the tmpCompressedBlock + int compressedSizeInInts = (outputOffset + 31) >>> 5; + + compBuffer = tmpCompBuffer; + return compressedSizeInInts; + } + + /** + * Decompress one block using PForDelta + * + * @param decompBlock the block that was decompressed + * @param inBlock the block to be decompressed + * @param blockSize the number of elements in the decompressed block + */ + public static void decompressOneBlock(int[] decompBlock, int[] inBlock, int blockSize) { + int expNum = inBlock[0] & MASK[31 - POSSIBLE_B_BITS]; + int bits = (inBlock[0] >>> (31 - POSSIBLE_B_BITS)) & (0x1f); int[] expPosBuffer = new int[blockSize]; int[] expHighBitsBuffer = new int[blockSize]; - + // decompress the b-bit slots int offset = HEADER_SIZE; int compressedBits = 0; - if(bits == 0) - { - Arrays.fill(decompBlock,0); - } - else - { - compressedBits = decompressBBitSlots(decompBlock, inBlock, blockSize, bits); - //compressedBits = decompressBBitSlotsWithHardCodes(decompBlock, inBlock, blockSize, bits); + if (bits == 0) { + Arrays.fill(decompBlock, 0); + } else { + compressedBits = decompressBBitSlots(decompBlock, inBlock, blockSize, bits); + //compressedBits = decompressBBitSlotsWithHardCodes(decompBlock, inBlock, blockSize, bits); } offset += compressedBits; // decompress exceptions - if(expNum>0) - { - compressedBits = decompressBlockByS16(expPosBuffer, inBlock, offset, expNum); - offset += compressedBits; - compressedBits = decompressBlockByS16(expHighBitsBuffer, inBlock, offset, expNum); - offset += compressedBits; - - for (int i = 0; i < expNum; i++) - { - int curExpPos = expPosBuffer[i] ; - int curHighBits = expHighBitsBuffer[i]; - decompBlock[curExpPos] = (decompBlock[curExpPos] & MASK[bits]) | ((curHighBits & MASK[32-bits] ) << bits); - } + if (expNum > 0) { + compressedBits = decompressBlockByS16(expPosBuffer, inBlock, offset, expNum); + offset += compressedBits; + compressedBits = decompressBlockByS16(expHighBitsBuffer, inBlock, offset, expNum); + offset += compressedBits; + + for (int i = 0; i < expNum; i++) { + int curExpPos = expPosBuffer[i]; + int curHighBits = expHighBitsBuffer[i]; + decompBlock[curExpPos] = (decompBlock[curExpPos] & MASK[bits]) | ((curHighBits & MASK[32 - bits]) << bits); + } } - } - - public static void decompressOneBlockWithSize(int[] decompBlock, int[] inBlock, int blockSize, int[] expPosBuffer, int[] expHighBitsBuffer, int inBlockLen) - { - int expNum = inBlock[0] & MASK[31-POSSIBLE_B_BITS]; - int bits = (inBlock[0]>>>(31-POSSIBLE_B_BITS)) & (0x1f); + } + + public static void decompressOneBlockWithSize(int[] decompBlock, int[] inBlock, int blockSize, int[] expPosBuffer, int[] expHighBitsBuffer, int inBlockLen) { + int expNum = inBlock[0] & MASK[31 - POSSIBLE_B_BITS]; + int bits = (inBlock[0] >>> (31 - POSSIBLE_B_BITS)) & (0x1f); // decompress the b-bit slots int offset = HEADER_SIZE; int compressedBits = 0; - if(bits == 0) - { - Arrays.fill(decompBlock,0, inBlockLen, 0); - } - else - { - //compressedBits = decompressBBitSlotsWithHardCodes(decompBlock, inBlock, blockSize, bits); - compressedBits = decompressBBitSlots(decompBlock, inBlock, blockSize, bits); + if (bits == 0) { + Arrays.fill(decompBlock, 0, inBlockLen, 0); + } else { + //compressedBits = decompressBBitSlotsWithHardCodes(decompBlock, inBlock, blockSize, bits); + compressedBits = decompressBBitSlots(decompBlock, inBlock, blockSize, bits); } offset += compressedBits; // decompress exceptions - if(expNum>0) - { - compressedBits = decompressBlockByS16(expPosBuffer, inBlock, offset, expNum); - offset += compressedBits; - compressedBits = decompressBlockByS16(expHighBitsBuffer, inBlock, offset, expNum); - offset += compressedBits; - - for (int i = 0; i < expNum; i++) - { - int curExpPos = expPosBuffer[i] ; - int curHighBits = expHighBitsBuffer[i]; - decompBlock[curExpPos] = (decompBlock[curExpPos] & MASK[bits]) | ((curHighBits & MASK[32-bits] ) << bits); - } + if (expNum > 0) { + compressedBits = decompressBlockByS16(expPosBuffer, inBlock, offset, expNum); + offset += compressedBits; + compressedBits = decompressBlockByS16(expHighBitsBuffer, inBlock, offset, expNum); + offset += compressedBits; + + for (int i = 0; i < expNum; i++) { + int curExpPos = expPosBuffer[i]; + int curHighBits = expHighBitsBuffer[i]; + decompBlock[curExpPos] = (decompBlock[curExpPos] & MASK[bits]) | ((curHighBits & MASK[32 - bits]) << bits); + } } - } - - public static void decompressOneBlockWithSizeWithIntBuffer(final int[] decompBlock, final IntBuffer inBlock, final int blockSize, final int[] expPosBuffer, final int[] expHighBitsBuffer, final int inBlockLen) - { + } + + public static void decompressOneBlockWithSizeWithIntBuffer(final int[] decompBlock, final IntBuffer inBlock, final int blockSize, final int[] expPosBuffer, final int[] expHighBitsBuffer, final int inBlockLen) { final int flag = inBlock.get(); - final int expNum = flag & MASK[31-POSSIBLE_B_BITS]; - final int bits = (flag>>>(31-POSSIBLE_B_BITS)) & (0x1f); - if(bits == 0) - { - Arrays.fill(decompBlock,0, inBlockLen, 0); + final int expNum = flag & MASK[31 - POSSIBLE_B_BITS]; + final int bits = (flag >>> (31 - POSSIBLE_B_BITS)) & (0x1f); + if (bits == 0) { + Arrays.fill(decompBlock, 0, inBlockLen, 0); + } else { + PForDeltaUnpack128WIthIntBuffer.unpack(decompBlock, inBlock, bits); } - else - { - PForDeltaUnpack128WIthIntBuffer.unpack(decompBlock, inBlock, bits); - } - - if(expNum>0) - { + + if (expNum > 0) { // decompress expPos - int num, outOffset=0, numLeft; - for(numLeft=expNum; numLeft>0; numLeft -= num) - { + int num, outOffset = 0, numLeft; + for (numLeft = expNum; numLeft > 0; numLeft -= num) { num = Simple16WithHardCodes.s16DecompressWithIntBufferWithHardCodes(expPosBuffer, outOffset, inBlock.get(), numLeft); outOffset += num; } // decompress expHighBits and decompBlock at the same time - for(outOffset=0, numLeft=expNum; numLeft>0; numLeft -= num) - { + for (outOffset = 0, numLeft = expNum; numLeft > 0; numLeft -= num) { num = Simple16WithHardCodes.s16DecompressWithIntBufferIntegrated2(decompBlock, outOffset, inBlock.get(), numLeft, expPosBuffer, bits); outOffset += num; } } - } - - - /** - * Estimate the compressed size in ints of a block - * @param inputBlock the block to be compressed - * @param bits the value of the parameter b - * @param blockSize the block size - * @return the compressed size in ints - * @throws IllegalArgumentException - */ - public static int estimateCompressedSize(int[] inputBlock, int blockSize, int bits) throws IllegalArgumentException { - int maxNoExp = (1< maxNoExp) - { - expNum++; - } - } - outputOffset += (expNum<<5); + int outputOffset = HEADER_SIZE + bits * blockSize; + int expNum = 0; + + for (int i = 0; i < blockSize; ++i) { + if (inputBlock[i] > maxNoExp) { + expNum++; + } + } + outputOffset += (expNum << 5); return outputOffset; - } - - /** - * Check if the block contains big numbers that is greater than ((1<< bits)-1) - * @param inputBlock the block to be compressed - * @param bits the numbers of bits to decide whether a number is a big number - * @param blockSize the block size - * @return true if there is any big numbers in the block - * @throws IllegalArgumentException - */ - public static boolean checkBigNumbers(int[] inputBlock, int blockSize, int bits) throws IllegalArgumentException { - int maxNoExp = (1< maxNoExp) return true; - } + } + + /** + * Check if the block contains big numbers that is greater than ((1<< bits)-1) + * + * @param inputBlock the block to be compressed + * @param bits the numbers of bits to decide whether a number is a big number + * @param blockSize the block size + * @return true if there is any big numbers in the block + * @throws IllegalArgumentException + */ + public static boolean checkBigNumbers(int[] inputBlock, int blockSize, int bits) throws IllegalArgumentException { + int maxNoExp = (1 << bits) - 1; + for (int i = 0; i < blockSize; ++i) { + if (inputBlock[i] > maxNoExp) return true; + } return false; - } - - - /** - * Decompress b-bit slots - * @param outDecompSlots decompressed block which is the output - * @param inCompBlock the compressed block which is the input - * @param blockSize the block size - * @param bits the value of the parameter b - * @return the compressed size in bits of the data that has been decompressed - */ - public static int decompressBBitSlots(int[] outDecompSlots, int[] inCompBlock, int blockSize, int bits) - { + } + + + /** + * Decompress b-bit slots + * + * @param outDecompSlots decompressed block which is the output + * @param inCompBlock the compressed block which is the input + * @param blockSize the block size + * @param bits the value of the parameter b + * @return the compressed size in bits of the data that has been decompressed + */ + public static int decompressBBitSlots(int[] outDecompSlots, int[] inCompBlock, int blockSize, int bits) { int compressedBitSize = 0; int offset = HEADER_SIZE; - for(int i =0; i>>5; - int num, inOffset=0, numLeft; - for(numLeft=blockSize; numLeft>0; numLeft -= num) - { - num = Simple16WithHardCodes.s16Compress(outCompBlock, outOffset, inBlock, inOffset, numLeft, blockSize, oriBlockSize, oriInputBlock); - outOffset++; - inOffset += num; + return bits * blockSize; + } + + + /** + * Compress a block of blockSize integers using Simple16 algorithm + * + * @param outCompBlock the compressed block which is the output + * @param outStartOffsetInBits the start offset in bits of the compressed block + * @param inBlock the block to be compressed + * @param blockSize the block size + * @return the compressed size in bits + */ + private static int compressBlockByS16(int[] outCompBlock, int outStartOffsetInBits, int[] inBlock, int blockSize, int oriBlockSize, int[] oriInputBlock) { + int outOffset = (outStartOffsetInBits + 31) >>> 5; + int num, inOffset = 0, numLeft; + for (numLeft = blockSize; numLeft > 0; numLeft -= num) { + num = Simple16WithHardCodes.s16Compress(outCompBlock, outOffset, inBlock, inOffset, numLeft, blockSize, oriBlockSize, oriInputBlock); + outOffset++; + inOffset += num; } - int compressedBitSize = (outOffset<<5)-outStartOffsetInBits; - return compressedBitSize; - } - - /** - * Decompress a block of blockSize integers using Simple16 algorithm - * @param outDecompBlock the decompressed block which is the output - * @param inCompBlock the compressed block which is the input - * @param blockSize the block size - * @param inStartOffsetInBits the start offset in bits of the compressed block - * @return the compressed size in bits of the data that has been decompressed - */ - public static int decompressBlockByS16(int[] outDecompBlock, int[] inCompBlock, int inStartOffsetInBits, int blockSize) - { - int inOffset = (inStartOffsetInBits+31)>>>5; - int num, outOffset=0, numLeft; - for(numLeft=blockSize; numLeft>0; numLeft -= num) - { - num = Simple16.s16Decompress(outDecompBlock, outOffset, inCompBlock, inOffset, numLeft); - outOffset += num; - inOffset++; + int compressedBitSize = (outOffset << 5) - outStartOffsetInBits; + return compressedBitSize; + } + + /** + * Decompress a block of blockSize integers using Simple16 algorithm + * + * @param outDecompBlock the decompressed block which is the output + * @param inCompBlock the compressed block which is the input + * @param blockSize the block size + * @param inStartOffsetInBits the start offset in bits of the compressed block + * @return the compressed size in bits of the data that has been decompressed + */ + public static int decompressBlockByS16(int[] outDecompBlock, int[] inCompBlock, int inStartOffsetInBits, int blockSize) { + int inOffset = (inStartOffsetInBits + 31) >>> 5; + int num, outOffset = 0, numLeft; + for (numLeft = blockSize; numLeft > 0; numLeft -= num) { + num = Simple16.s16Decompress(outDecompBlock, outOffset, inCompBlock, inOffset, numLeft); + outOffset += num; + inOffset++; } - int compressedBitSize = (inOffset<<5)-inStartOffsetInBits; - return compressedBitSize; - } - - public static void decompressBlockByS16WithIntBuffer(final int[] outDecompBlock, final IntBuffer inCompBlock, final int blockSize) - { - int num, outOffset=0, numLeft; - for(numLeft=blockSize; numLeft>0; numLeft -= num) - { - num = Simple16WithHardCodes.s16DecompressWithIntBuffer(outDecompBlock, outOffset, inCompBlock.get(), numLeft); - outOffset += num; + int compressedBitSize = (inOffset << 5) - inStartOffsetInBits; + return compressedBitSize; + } + + public static void decompressBlockByS16WithIntBuffer(final int[] outDecompBlock, final IntBuffer inCompBlock, final int blockSize) { + int num, outOffset = 0, numLeft; + for (numLeft = blockSize; numLeft > 0; numLeft -= num) { + num = Simple16WithHardCodes.s16DecompressWithIntBuffer(outDecompBlock, outOffset, inCompBlock.get(), numLeft); + outOffset += num; } - } - - public static void decompressBlockByS16WithIntBufferIntegrated(final int[] outDecompBlock, final IntBuffer inCompBlock, final int blockSize, int[] expPosBuffer, int oribits) - { - int num, outOffset=0, numLeft; - for(numLeft=blockSize; numLeft>0; numLeft -= num) - { - num = Simple16WithHardCodes.s16DecompressWithIntBufferIntegrated(outDecompBlock, outOffset, inCompBlock.get(), numLeft, expPosBuffer, oribits); - outOffset += num; + } + + public static void decompressBlockByS16WithIntBufferIntegrated(final int[] outDecompBlock, final IntBuffer inCompBlock, final int blockSize, int[] expPosBuffer, int oribits) { + int num, outOffset = 0, numLeft; + for (numLeft = blockSize; numLeft > 0; numLeft -= num) { + num = Simple16WithHardCodes.s16DecompressWithIntBufferIntegrated(outDecompBlock, outOffset, inCompBlock.get(), numLeft, expPosBuffer, oribits); + outOffset += num; } - } - - - /** - * Write a certain number of bits of an integer into an integer array starting from the given start offset - * - * @param out the output array - * @param val the integer to be written - * @param outOffset the start offset in bits in the output array - * @param bits the number of bits to be written (bits>=0) - */ - public static final void writeBits(int[] out, int val, int outOffset, int bits) { - if(bits == 0) - return; + } + + + /** + * Write a certain number of bits of an integer into an integer array starting from the given start offset + * + * @param out the output array + * @param val the integer to be written + * @param outOffset the start offset in bits in the output array + * @param bits the number of bits to be written (bits>=0) + */ + public static final void writeBits(int[] out, int val, int outOffset, int bits) { + if (bits == 0) + return; final int index = outOffset >>> 5; final int skip = outOffset & 0x1f; - val &= (0xffffffff >>> (32 - bits)); + val &= (0xffffffff >>> (32 - bits)); out[index] |= (val << skip); if (32 - skip < bits) { - out[index + 1] |= (val >>> (32 - skip)); + out[index + 1] |= (val >>> (32 - skip)); } - } - - /** - * Read a certain number of bits of an integer into an integer array starting from the given start offset - * - * @param in the input array - * @param val the integer to be read - * @param inOffset the start offset in bits in the input array - * @param bits the number of bits to be read, unlike writeBits(), readBits() does not deal with bits==0 and thus bits must > 0. When bits ==0, the calling functions will just skip the entire bits-bit slots without decoding them - * @return the bits bits of the input - */ - public static final int readBits(int[] in, final int inOffset, final int bits) { + } + + /** + * Read a certain number of bits of an integer into an integer array starting from the given start offset + * + * @param in the input array + * @param val the integer to be read + * @param inOffset the start offset in bits in the input array + * @param bits the number of bits to be read, unlike writeBits(), readBits() does not deal with bits==0 and thus bits must > 0. When bits ==0, the calling functions will just skip the entire bits-bit slots without decoding them + * @return the bits bits of the input + */ + public static final int readBits(int[] in, final int inOffset, final int bits) { final int index = inOffset >>> 5; final int skip = inOffset & 0x1f; int val = in[index] >>> skip; - if (32 - skip < bits) { - val |= (in[index + 1] << (32 - skip)); + if (32 - skip < bits) { + val |= (in[index + 1] << (32 - skip)); } return val & (0xffffffff >>> (32 - bits)); - } + } - public static final int readBitsWithBuffer(int[] in, final int inOffset, final int bits) { - final int index = inOffset >>> 5; - final int skip = inOffset & 0x1f; - int val = in[index] >>> skip; - if (32 - skip < bits) { + public static final int readBitsWithBuffer(int[] in, final int inOffset, final int bits) { + final int index = inOffset >>> 5; + final int skip = inOffset & 0x1f; + int val = in[index] >>> skip; + if (32 - skip < bits) { val |= (in[index + 1] << (32 - skip)); - } - return val & (0xffffffff >>> (32 - bits)); } - + return val & (0xffffffff >>> (32 - bits)); } +} + diff --git a/src/main/java/com/kamikaze/pfordelta/PForDelta.java b/src/main/java/com/kamikaze/pfordelta/PForDelta.java index 7bbe862..f826ce5 100644 --- a/src/main/java/com/kamikaze/pfordelta/PForDelta.java +++ b/src/main/java/com/kamikaze/pfordelta/PForDelta.java @@ -11,366 +11,347 @@ /** * Implementation of the optimized PForDelta algorithm for sorted integer arrays. The basic ideas are based on - * + *

* 1. Original algorithm from - * http://homepages.cwi.nl/~heman/downloads/msthesis.pdf - * + * http://homepages.cwi.nl/~heman/downloads/msthesis.pdf + *

* 2. Optimization and - * variation from http://www2008.org/papers/pdf/p387-zhangA.pdf - * + * variation from http://www2008.org/papers/pdf/p387-zhangA.pdf + *

* 3. Further optimization * http://www2009.org/proceedings/pdf/p401.pdf - * - * As a part of the PForDelta implementation, Simple16 is used to compress exceptions. The original Simple16 algorithm can also be found in the above literatures. - * + *

+ * As a part of the PForDelta implementation, Simple16 is used to compress exceptions. The original Simple16 algorithm can also be found in the above literatures. + *

* This implementation overcomes the problem that Simple16 cannot deal with >2^28 numbers. - * + *

* Author: hao yan hyan2008@gmail.com */ -public class PForDelta{ - - // NOTE: we expect the blockSize is always < (1<<(31-POSSIBLE_B_BITS)). For example, in the current default settings, - // the blockSize < (1<<(31-5)), that is, < 2^27, the commonly used block size is 128 or 256. - - //All possible values of b in the PForDelta algorithm - private static final int[] POSSIBLE_B = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,16,20,28}; - - // Max number of bits to store an uncompressed value - private static final int MAX_BITS = 32; - // Header records the value of b and the number of exceptions in the block - private static final int HEADER_NUM = 2; - // Header size in bits - private static final int HEADER_SIZE = MAX_BITS * HEADER_NUM; - - private static final int[] MASK = {0x00000000, - 0x00000001, 0x00000003, 0x00000007, 0x0000000f, 0x0000001f, 0x0000003f, - 0x0000007f, 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff, - 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff, 0x0001ffff, 0x0003ffff, - 0x0007ffff, 0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff, 0x00ffffff, - 0x01ffffff, 0x03ffffff, 0x07ffffff, 0x0fffffff, 0x1fffffff, 0x3fffffff, - 0x7fffffff, 0xffffffff}; - - /** - * Compress one block of blockSize integers using PForDelta with the optimal parameter b - * @param inBlock the block to be compressed - * @param blockSize the block size - * @return the compressed block - */ - public static int[] compressOneBlockOpt(final int[] inBlock, int blockSize) - { - // find the best b that may lead to the smallest overall compressed size - int currentB = POSSIBLE_B[0]; - int[] outBlock = null; - int tmpB = currentB; - // deal with the large exception cases - boolean hasBigNum = checkBigNumbers(inBlock, POSSIBLE_B[POSSIBLE_B.length-1], blockSize); - if(hasBigNum) - { - currentB = 4; - System.out.println("has big num and the currentB is: " + currentB); - } - else - { - int optSize = estimateCompressedSize(inBlock, tmpB, blockSize); - for (int i = 1; i < POSSIBLE_B.length; ++i) - { - tmpB = POSSIBLE_B[i]; - int curSize = estimateCompressedSize(inBlock, tmpB, blockSize); - if(curSize < optSize) - { - currentB = tmpB; - optSize = curSize; +public class PForDelta { + + // NOTE: we expect the blockSize is always < (1<<(31-POSSIBLE_B_BITS)). For example, in the current default settings, + // the blockSize < (1<<(31-5)), that is, < 2^27, the commonly used block size is 128 or 256. + + //All possible values of b in the PForDelta algorithm + private static final int[] POSSIBLE_B = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 20, 28}; + + // Max number of bits to store an uncompressed value + private static final int MAX_BITS = 32; + // Header records the value of b and the number of exceptions in the block + private static final int HEADER_NUM = 2; + // Header size in bits + private static final int HEADER_SIZE = MAX_BITS * HEADER_NUM; + + private static final int[] MASK = {0x00000000, + 0x00000001, 0x00000003, 0x00000007, 0x0000000f, 0x0000001f, 0x0000003f, + 0x0000007f, 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff, + 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff, 0x0001ffff, 0x0003ffff, + 0x0007ffff, 0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff, 0x00ffffff, + 0x01ffffff, 0x03ffffff, 0x07ffffff, 0x0fffffff, 0x1fffffff, 0x3fffffff, + 0x7fffffff, 0xffffffff}; + + /** + * Compress one block of blockSize integers using PForDelta with the optimal parameter b + * + * @param inBlock the block to be compressed + * @param blockSize the block size + * @return the compressed block + */ + public static int[] compressOneBlockOpt(final int[] inBlock, int blockSize) { + // find the best b that may lead to the smallest overall compressed size + int currentB = POSSIBLE_B[0]; + int[] outBlock = null; + int tmpB = currentB; + // deal with the large exception cases + boolean hasBigNum = checkBigNumbers(inBlock, POSSIBLE_B[POSSIBLE_B.length - 1], blockSize); + if (hasBigNum) { + currentB = 4; + System.out.println("has big num and the currentB is: " + currentB); + } else { + int optSize = estimateCompressedSize(inBlock, tmpB, blockSize); + for (int i = 1; i < POSSIBLE_B.length; ++i) { + tmpB = POSSIBLE_B[i]; + int curSize = estimateCompressedSize(inBlock, tmpB, blockSize); + if (curSize < optSize) { + currentB = tmpB; + optSize = curSize; + } + } } - } + + // compress the block using the above best b + outBlock = compressOneBlock(inBlock, currentB, blockSize); + + return outBlock; } - - // compress the block using the above best b - outBlock = compressOneBlock(inBlock, currentB, blockSize); - - return outBlock; - } - - /** - * Decompress one block using PForDelta - * @param outBlock the block that was decompressed - * @param inBlock the block to be decompressed - * @param blockSize the number of elements in the decompressed block - * @return the compressed size in bits - */ - public static int decompressOneBlock(int[] outBlock, int[] inBlock, int blockSize) - { - int[] expAux = new int[blockSize*2]; - - int expNum = inBlock[0] & 0x3ff; - int bits = (inBlock[0]>>>10) & (0x1f); - - // decompress the b-bit slots - int offset = HEADER_SIZE; - int compressedBits = 0; - if(bits == 0) - { - Arrays.fill(outBlock,0); + + /** + * Decompress one block using PForDelta + * + * @param outBlock the block that was decompressed + * @param inBlock the block to be decompressed + * @param blockSize the number of elements in the decompressed block + * @return the compressed size in bits + */ + public static int decompressOneBlock(int[] outBlock, int[] inBlock, int blockSize) { + int[] expAux = new int[blockSize * 2]; + + int expNum = inBlock[0] & 0x3ff; + int bits = (inBlock[0] >>> 10) & (0x1f); + + // decompress the b-bit slots + int offset = HEADER_SIZE; + int compressedBits = 0; + if (bits == 0) { + Arrays.fill(outBlock, 0); + } else { + compressedBits = decompressBBitSlots(outBlock, inBlock, blockSize, bits); + // Note that blocksize must be ==128 in order to use decompressBBitSlotsWithHardCodes + //compressedBits = decompressBBitSlotsWithHardCodes(outBlock, inBlock, blockSize, bits); + } + offset += compressedBits; + + // decompress exceptions + if (expNum > 0) { + compressedBits = decompressBlockByS16(expAux, inBlock, offset, expNum * 2); + offset += compressedBits; + + for (int i = 0; i < expNum; i++) { + int curExpPos = expAux[i]; + int curHighBits = expAux[i + expNum]; + outBlock[curExpPos] = (outBlock[curExpPos] & MASK[bits]) | ((curHighBits & MASK[32 - bits]) << bits); + } + } + return offset; } - else - { - compressedBits = decompressBBitSlots(outBlock, inBlock, blockSize, bits); - // Note that blocksize must be ==128 in order to use decompressBBitSlotsWithHardCodes - //compressedBits = decompressBBitSlotsWithHardCodes(outBlock, inBlock, blockSize, bits); + + /** + * Estimate the compressed size in ints of a block + * + * @param inputBlock the block to be compressed + * @param bits the value of the parameter b + * @param blockSize the block size + * @return the compressed size in ints + * @throws IllegalArgumentException + */ + public static int estimateCompressedSize(int[] inputBlock, int bits, int blockSize) throws IllegalArgumentException { + int maxNoExp = (1 << bits) - 1; + // Size of the header and the bits-bit slots + int outputOffset = HEADER_SIZE + bits * blockSize; + int expNum = 0; + + for (int i = 0; i < blockSize; ++i) { + if (inputBlock[i] > maxNoExp) { + expNum++; + } + } + outputOffset += (expNum << 5); + + return outputOffset; } - offset += compressedBits; - - // decompress exceptions - if(expNum>0) - { - compressedBits = decompressBlockByS16(expAux, inBlock, offset, expNum*2); - offset += compressedBits; - - for (int i = 0; i < expNum; i++) - { - int curExpPos = expAux[i] ; - int curHighBits = expAux[i+expNum]; - outBlock[curExpPos] = (outBlock[curExpPos] & MASK[bits]) | ((curHighBits & MASK[32-bits] ) << bits); - } + + /** + * Check if the block contains big numbers that is greater than ((1<< bits)-1) + * + * @param inputBlock the block to be compressed + * @param bits the numbers of bits to decide whether a number is a big number + * @param blockSize the block size + * @return true if there is any big numbers in the block + * @throws IllegalArgumentException + */ + public static boolean checkBigNumbers(int[] inputBlock, int bits, int blockSize) throws IllegalArgumentException { + int maxNoExp = (1 << bits) - 1; + for (int i = 0; i < blockSize; ++i) { + if (inputBlock[i] > maxNoExp) return true; + } + return false; } - return offset; - } - - /** - * Estimate the compressed size in ints of a block - * @param inputBlock the block to be compressed - * @param bits the value of the parameter b - * @param blockSize the block size - * @return the compressed size in ints - * @throws IllegalArgumentException - */ - public static int estimateCompressedSize(int[] inputBlock, int bits, int blockSize) throws IllegalArgumentException { - int maxNoExp = (1< maxNoExp) - { - expNum++; - } - } - outputOffset += (expNum<<5); - - return outputOffset; - } - - /** - * Check if the block contains big numbers that is greater than ((1<< bits)-1) - * @param inputBlock the block to be compressed - * @param bits the numbers of bits to decide whether a number is a big number - * @param blockSize the block size - * @return true if there is any big numbers in the block - * @throws IllegalArgumentException - */ - public static boolean checkBigNumbers(int[] inputBlock, int bits, int blockSize) throws IllegalArgumentException { - int maxNoExp = (1< maxNoExp) return true; - } - return false; - } - /** - * The core implementation of compressing a block with blockSize integers using PForDelta with the given parameter b - * @param inputBlock the block to be compressed - * @param bits the the value of the parameter b - * @param blockSize the block size - * @return the compressed block - * @throws IllegalArgumentException - */ - public static int[] compressOneBlock(int[] inputBlock, int bits, int blockSize) throws IllegalArgumentException { - - int[] expAux = new int[blockSize*2]; - - int maxCompBitSize = HEADER_SIZE + blockSize * (MAX_BITS + MAX_BITS + MAX_BITS) + 32; - int[] tmpCompressedBlock = new int[(maxCompBitSize>>>5)]; - - int outputOffset = HEADER_SIZE; - int expUpperBound = 1<= expUpperBound) - { - expNum++; - } + + /** + * The core implementation of compressing a block with blockSize integers using PForDelta with the given parameter b + * + * @param inputBlock the block to be compressed + * @param bits the the value of the parameter b + * @param blockSize the block size + * @return the compressed block + * @throws IllegalArgumentException + */ + public static int[] compressOneBlock(int[] inputBlock, int bits, int blockSize) throws IllegalArgumentException { + + int[] expAux = new int[blockSize * 2]; + + int maxCompBitSize = HEADER_SIZE + blockSize * (MAX_BITS + MAX_BITS + MAX_BITS) + 32; + int[] tmpCompressedBlock = new int[(maxCompBitSize >>> 5)]; + + int outputOffset = HEADER_SIZE; + int expUpperBound = 1 << bits; + int expNum = 0; + + for (int elem : inputBlock) { + if (elem >= expUpperBound) { + expNum++; + } + } + + int expIndex = 0; + // compress the b-bit slots + for (int i = 0; i < blockSize; ++i) { + if (inputBlock[i] < expUpperBound) { + writeBits(tmpCompressedBlock, inputBlock[i], outputOffset, bits); + } else // exp + { + // store the lower bits-bits of the exception + writeBits(tmpCompressedBlock, inputBlock[i] & MASK[bits], outputOffset, bits); + // write the position of exception + expAux[expIndex] = i; + // write the higher 32-bits bits of the exception + expAux[expIndex + expNum] = (inputBlock[i] >>> bits) & MASK[32 - bits]; + expIndex++; + } + outputOffset += bits; + } + + // the first int in the compressed block stores the value of b and the number of exceptions + //tmpCompressedBlock[0] = ((bits & MASK[POSSIBLE_B_BITS]) << (31-POSSIBLE_B_BITS)) | (expNum & MASK[31-POSSIBLE_B_BITS]); + tmpCompressedBlock[0] = ((bits & MASK[10]) << 10) | (expNum & 0x3ff); + tmpCompressedBlock[1] = inputBlock[blockSize - 1]; + + // compress exceptions + if (expNum > 0) { + int compressedBitSize = compressBlockByS16(tmpCompressedBlock, outputOffset, expAux, expNum * 2); + outputOffset += compressedBitSize; + } + + // discard the redundant parts in the tmpCompressedBlock + int compressedSizeInInts = (outputOffset + 31) >>> 5; + int[] compBlock; + compBlock = new int[compressedSizeInInts]; + System.arraycopy(tmpCompressedBlock, 0, compBlock, 0, compressedSizeInInts); + + return compBlock; } - - int expIndex = 0; - // compress the b-bit slots - for (int i = 0; i>> bits) & MASK[32-bits]; - expIndex++; - } - outputOffset += bits; - } - - // the first int in the compressed block stores the value of b and the number of exceptions - //tmpCompressedBlock[0] = ((bits & MASK[POSSIBLE_B_BITS]) << (31-POSSIBLE_B_BITS)) | (expNum & MASK[31-POSSIBLE_B_BITS]); - tmpCompressedBlock[0] = ((bits & MASK[10]) << 10) | (expNum & 0x3ff); - tmpCompressedBlock[1] = inputBlock[blockSize-1]; - - // compress exceptions - if(expNum>0) - { - int compressedBitSize = compressBlockByS16(tmpCompressedBlock, outputOffset, expAux, expNum*2); - outputOffset += compressedBitSize; + + /** + * Decompress b-bit slots + * + * @param outDecompSlots decompressed block which is the output + * @param inCompBlock the compressed block which is the input + * @param blockSize the block size + * @param bits the value of the parameter b + * @return the compressed size in bits of the data that has been decompressed + */ + public static int decompressBBitSlots(int[] outDecompSlots, int[] inCompBlock, int blockSize, int bits) { + int compressedBitSize = 0; + int offset = HEADER_SIZE; + for (int i = 0; i < blockSize; i++) { + outDecompSlots[i] = readBits(inCompBlock, offset, bits); + offset += bits; + } + compressedBitSize = bits * blockSize; + + return compressedBitSize; } - // discard the redundant parts in the tmpCompressedBlock - int compressedSizeInInts = (outputOffset+31)>>>5; - int[] compBlock; - compBlock = new int[compressedSizeInInts]; - System.arraycopy(tmpCompressedBlock,0, compBlock, 0, compressedSizeInInts); - - return compBlock; - } - - /** - * Decompress b-bit slots - * @param outDecompSlots decompressed block which is the output - * @param inCompBlock the compressed block which is the input - * @param blockSize the block size - * @param bits the value of the parameter b - * @return the compressed size in bits of the data that has been decompressed - */ - public static int decompressBBitSlots(int[] outDecompSlots, int[] inCompBlock, int blockSize, int bits) - { - int compressedBitSize = 0; - int offset = HEADER_SIZE; - for(int i =0; i>> 5; + int num, inOffset = 0, numLeft; + for (numLeft = blockSize; numLeft > 0; numLeft -= num) { + num = Simple16.s16Compress(outCompBlock, outOffset, inBlock, inOffset, numLeft, blockSize); + outOffset++; + inOffset += num; + } + int compressedBitSize = (outOffset << 5) - outStartOffsetInBits; + return compressedBitSize; } - compressedBitSize = bits * blockSize; - - return compressedBitSize; - } - - - /** - * Compress a block of blockSize integers using Simple16 algorithm - * @param outCompBlock the compressed block which is the output - * @param outStartOffsetInBits the start offset in bits of the compressed block - * @param inBlock the block to be compressed - * @param blockSize the block size - * @return the compressed size in bits - */ - private static int compressBlockByS16(int[] outCompBlock, int outStartOffsetInBits, int[] inBlock, int blockSize) - { - int outOffset = (outStartOffsetInBits+31)>>>5; - int num, inOffset=0, numLeft; - for(numLeft=blockSize; numLeft>0; numLeft -= num) - { - num = Simple16.s16Compress(outCompBlock, outOffset, inBlock, inOffset, numLeft, blockSize); - outOffset++; - inOffset += num; + + /** + * Decompress a block of blockSize integers using Simple16 algorithm + * + * @param outDecompBlock the decompressed block which is the output + * @param inCompBlock the compressed block which is the input + * @param blockSize the block size + * @param inStartOffsetInBits the start offset in bits of the compressed block + * @return the compressed size in bits of the data that has been decompressed + */ + public static int decompressBlockByS16(int[] outDecompBlock, int[] inCompBlock, int inStartOffsetInBits, int blockSize) { + int inOffset = (inStartOffsetInBits + 31) >>> 5; + int num, outOffset = 0, numLeft; + for (numLeft = blockSize; numLeft > 0; numLeft -= num) { + num = Simple16.s16Decompress(outDecompBlock, outOffset, inCompBlock, inOffset, numLeft); + outOffset += num; + inOffset++; + } + int compressedBitSize = (inOffset << 5) - inStartOffsetInBits; + return compressedBitSize; } - int compressedBitSize = (outOffset<<5)-outStartOffsetInBits; - return compressedBitSize; - } - - /** - * Decompress a block of blockSize integers using Simple16 algorithm - * @param outDecompBlock the decompressed block which is the output - * @param inCompBlock the compressed block which is the input - * @param blockSize the block size - * @param inStartOffsetInBits the start offset in bits of the compressed block - * @return the compressed size in bits of the data that has been decompressed - */ - public static int decompressBlockByS16(int[] outDecompBlock, int[] inCompBlock, int inStartOffsetInBits, int blockSize) - { - int inOffset = (inStartOffsetInBits+31)>>>5; - int num, outOffset=0, numLeft; - for(numLeft=blockSize; numLeft>0; numLeft -= num) - { - num = Simple16.s16Decompress(outDecompBlock, outOffset, inCompBlock, inOffset, numLeft); - outOffset += num; - inOffset++; + + + /** + * Write a certain number of bits of an integer into an integer array starting from the given start offset + * + * @param out the output array + * @param val the integer to be written + * @param outOffset the start offset in bits in the output array + * @param bits the number of bits to be written (bits>=0) + */ + public static final void writeBits(int[] out, int val, int outOffset, int bits) { + if (bits == 0) + return; + final int index = outOffset >>> 5; + final int skip = outOffset & 0x1f; + val &= (0xffffffff >>> (32 - bits)); + out[index] |= (val << skip); + if (32 - skip < bits) { + out[index + 1] |= (val >>> (32 - skip)); + } } - int compressedBitSize = (inOffset<<5)-inStartOffsetInBits; - return compressedBitSize; - } - - - /** - * Write a certain number of bits of an integer into an integer array starting from the given start offset - * - * @param out the output array - * @param val the integer to be written - * @param outOffset the start offset in bits in the output array - * @param bits the number of bits to be written (bits>=0) - */ - public static final void writeBits(int[] out, int val, int outOffset, int bits) { - if(bits == 0) - return; - final int index = outOffset >>> 5; - final int skip = outOffset & 0x1f; - val &= (0xffffffff >>> (32 - bits)); - out[index] |= (val << skip); - if (32 - skip < bits) { - out[index + 1] |= (val >>> (32 - skip)); + + /** + * Decompress the b-bit slots using hardcoded unpack methods + * + * @param decompressedSlots the decompressed output + * @param compBlock the compressed input block + * @param blockSize the block size which is 256 by default + * @param bits the value of b + * @return the processed data size (the number of bits in the compressed form) + */ + static int decompressBBitSlotsWithHardCodes(int[] decompressedSlots, int[] compBlock, int blockSize, int bits) { + int compressedBitSize = 0; + PForDeltaUnpack128.unpack(decompressedSlots, compBlock, bits); + compressedBitSize = bits * blockSize; + + return compressedBitSize; } - } - - /** - * Decompress the b-bit slots using hardcoded unpack methods - * - * @param decompressedSlots the decompressed output - * @param compBlock the compressed input block - * @param blockSize the block size which is 256 by default - * @param bits the value of b - * @return the processed data size (the number of bits in the compressed form) - */ - static int decompressBBitSlotsWithHardCodes(int[] decompressedSlots, int[] compBlock, int blockSize, int bits) - { - int compressedBitSize = 0; - PForDeltaUnpack128.unpack(decompressedSlots, compBlock, bits); - compressedBitSize = bits * blockSize; - - return compressedBitSize; - } - - /** - * Read a certain number of bits of an integer into an integer array starting from the given start offset - * - * @param in the input array - * @param val the integer to be read - * @param inOffset the start offset in bits in the input array - * @param bits the number of bits to be read, unlike writeBits(), readBits() does not deal with bits==0 and thus bits must > 0. When bits ==0, the calling functions will just skip the entire bits-bit slots without decoding them - * @return the bits bits of the input - */ - public static final int readBits(int[] in, final int inOffset, final int bits) { - final int index = inOffset >>> 5; - final int skip = inOffset & 0x1f; - int val = in[index] >>> skip; - if (32 - skip < bits) { - val |= (in[index + 1] << (32 - skip)); + + /** + * Read a certain number of bits of an integer into an integer array starting from the given start offset + * + * @param in the input array + * @param val the integer to be read + * @param inOffset the start offset in bits in the input array + * @param bits the number of bits to be read, unlike writeBits(), readBits() does not deal with bits==0 and thus bits must > 0. When bits ==0, the calling functions will just skip the entire bits-bit slots without decoding them + * @return the bits bits of the input + */ + public static final int readBits(int[] in, final int inOffset, final int bits) { + final int index = inOffset >>> 5; + final int skip = inOffset & 0x1f; + int val = in[index] >>> skip; + if (32 - skip < bits) { + val |= (in[index + 1] << (32 - skip)); + } + return val & (0xffffffff >>> (32 - bits)); } - return val & (0xffffffff >>> (32 - bits)); - } } diff --git a/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128.java b/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128.java index cc33f88..a32208c 100644 --- a/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128.java +++ b/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128.java @@ -6,859 +6,877 @@ * JavaFastPFOR library for comparison purposes. As the original */ -public class PForDeltaUnpack128{ - - static public void unpack(int[] out, int[] in, int bits) { - switch (bits) { - case 0: unpack0(out, in); break; - case 1: unpack1(out, in); break; - case 2: unpack2(out, in); break; - case 3: unpack3(out, in); break; - case 4: unpack4(out, in); break; - case 5: unpack5(out, in); break; - case 6: unpack6(out, in); break; - case 7: unpack7(out, in); break; - case 8: unpack8(out, in); break; - case 9: unpack9(out, in); break; - case 10: unpack10(out, in); break; - case 11: unpack11(out, in); break; - case 12: unpack12(out, in); break; - case 13: unpack13(out, in); break; - case 16: unpack16(out, in); break; - case 20: unpack20(out, in); break; - case 28: unpack28(out, in); break; - default: break; +public class PForDeltaUnpack128 { + + static public void unpack(int[] out, int[] in, int bits) { + switch (bits) { + case 0: + unpack0(out, in); + break; + case 1: + unpack1(out, in); + break; + case 2: + unpack2(out, in); + break; + case 3: + unpack3(out, in); + break; + case 4: + unpack4(out, in); + break; + case 5: + unpack5(out, in); + break; + case 6: + unpack6(out, in); + break; + case 7: + unpack7(out, in); + break; + case 8: + unpack8(out, in); + break; + case 9: + unpack9(out, in); + break; + case 10: + unpack10(out, in); + break; + case 11: + unpack11(out, in); + break; + case 12: + unpack12(out, in); + break; + case 13: + unpack13(out, in); + break; + case 16: + unpack16(out, in); + break; + case 20: + unpack20(out, in); + break; + case 28: + unpack28(out, in); + break; + default: + break; + } + } + + static private void unpack0(int[] out, int[] in) { + } + + static private void unpack1(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 1; + for (i = 0, w = 1; i < 4; ++i, w += 1) { + int curInputValue0 = in[w]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 1) & mask; + out[2 + outOffset] = (curInputValue0 >>> 2) & mask; + out[3 + outOffset] = (curInputValue0 >>> 3) & mask; + out[4 + outOffset] = (curInputValue0 >>> 4) & mask; + out[5 + outOffset] = (curInputValue0 >>> 5) & mask; + out[6 + outOffset] = (curInputValue0 >>> 6) & mask; + out[7 + outOffset] = (curInputValue0 >>> 7) & mask; + out[8 + outOffset] = (curInputValue0 >>> 8) & mask; + out[9 + outOffset] = (curInputValue0 >>> 9) & mask; + out[10 + outOffset] = (curInputValue0 >>> 10) & mask; + out[11 + outOffset] = (curInputValue0 >>> 11) & mask; + out[12 + outOffset] = (curInputValue0 >>> 12) & mask; + out[13 + outOffset] = (curInputValue0 >>> 13) & mask; + out[14 + outOffset] = (curInputValue0 >>> 14) & mask; + out[15 + outOffset] = (curInputValue0 >>> 15) & mask; + out[16 + outOffset] = (curInputValue0 >>> 16) & mask; + out[17 + outOffset] = (curInputValue0 >>> 17) & mask; + out[18 + outOffset] = (curInputValue0 >>> 18) & mask; + out[19 + outOffset] = (curInputValue0 >>> 19) & mask; + out[20 + outOffset] = (curInputValue0 >>> 20) & mask; + out[21 + outOffset] = (curInputValue0 >>> 21) & mask; + out[22 + outOffset] = (curInputValue0 >>> 22) & mask; + out[23 + outOffset] = (curInputValue0 >>> 23) & mask; + out[24 + outOffset] = (curInputValue0 >>> 24) & mask; + out[25 + outOffset] = (curInputValue0 >>> 25) & mask; + out[26 + outOffset] = (curInputValue0 >>> 26) & mask; + out[27 + outOffset] = (curInputValue0 >>> 27) & mask; + out[28 + outOffset] = (curInputValue0 >>> 28) & mask; + out[29 + outOffset] = (curInputValue0 >>> 29) & mask; + out[30 + outOffset] = (curInputValue0 >>> 30) & mask; + out[31 + outOffset] = curInputValue0 >>> 31; + outOffset += 32; + } + } + + static private void unpack2(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 3; + for (i = 0, w = 1; i < 4; ++i, w += 2) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 2) & mask; + out[2 + outOffset] = (curInputValue0 >>> 4) & mask; + out[3 + outOffset] = (curInputValue0 >>> 6) & mask; + out[4 + outOffset] = (curInputValue0 >>> 8) & mask; + out[5 + outOffset] = (curInputValue0 >>> 10) & mask; + out[6 + outOffset] = (curInputValue0 >>> 12) & mask; + out[7 + outOffset] = (curInputValue0 >>> 14) & mask; + out[8 + outOffset] = (curInputValue0 >>> 16) & mask; + out[9 + outOffset] = (curInputValue0 >>> 18) & mask; + out[10 + outOffset] = (curInputValue0 >>> 20) & mask; + out[11 + outOffset] = (curInputValue0 >>> 22) & mask; + out[12 + outOffset] = (curInputValue0 >>> 24) & mask; + out[13 + outOffset] = (curInputValue0 >>> 26) & mask; + out[14 + outOffset] = (curInputValue0 >>> 28) & mask; + out[15 + outOffset] = curInputValue0 >>> 30; + out[16 + outOffset] = curInputValue1 & mask; + out[17 + outOffset] = (curInputValue1 >>> 2) & mask; + out[18 + outOffset] = (curInputValue1 >>> 4) & mask; + out[19 + outOffset] = (curInputValue1 >>> 6) & mask; + out[20 + outOffset] = (curInputValue1 >>> 8) & mask; + out[21 + outOffset] = (curInputValue1 >>> 10) & mask; + out[22 + outOffset] = (curInputValue1 >>> 12) & mask; + out[23 + outOffset] = (curInputValue1 >>> 14) & mask; + out[24 + outOffset] = (curInputValue1 >>> 16) & mask; + out[25 + outOffset] = (curInputValue1 >>> 18) & mask; + out[26 + outOffset] = (curInputValue1 >>> 20) & mask; + out[27 + outOffset] = (curInputValue1 >>> 22) & mask; + out[28 + outOffset] = (curInputValue1 >>> 24) & mask; + out[29 + outOffset] = (curInputValue1 >>> 26) & mask; + out[30 + outOffset] = (curInputValue1 >>> 28) & mask; + out[31 + outOffset] = curInputValue1 >>> 30; + outOffset += 32; + } + } + + static private void unpack3(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 7; + for (i = 0, w = 1; i < 4; ++i, w += 3) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + int curInputValue2 = in[w + 2]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 3) & mask; + out[2 + outOffset] = (curInputValue0 >>> 6) & mask; + out[3 + outOffset] = (curInputValue0 >>> 9) & mask; + out[4 + outOffset] = (curInputValue0 >>> 12) & mask; + out[5 + outOffset] = (curInputValue0 >>> 15) & mask; + out[6 + outOffset] = (curInputValue0 >>> 18) & mask; + out[7 + outOffset] = (curInputValue0 >>> 21) & mask; + out[8 + outOffset] = (curInputValue0 >>> 24) & mask; + out[9 + outOffset] = (curInputValue0 >>> 27) & mask; + out[10 + outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) & mask; + out[11 + outOffset] = (curInputValue1 >>> 1) & mask; + out[12 + outOffset] = (curInputValue1 >>> 4) & mask; + out[13 + outOffset] = (curInputValue1 >>> 7) & mask; + out[14 + outOffset] = (curInputValue1 >>> 10) & mask; + out[15 + outOffset] = (curInputValue1 >>> 13) & mask; + out[16 + outOffset] = (curInputValue1 >>> 16) & mask; + out[17 + outOffset] = (curInputValue1 >>> 19) & mask; + out[18 + outOffset] = (curInputValue1 >>> 22) & mask; + out[19 + outOffset] = (curInputValue1 >>> 25) & mask; + out[20 + outOffset] = (curInputValue1 >>> 28) & mask; + out[21 + outOffset] = ((curInputValue1 >>> 31) | (curInputValue2 << 1)) & mask; + out[22 + outOffset] = (curInputValue2 >>> 2) & mask; + out[23 + outOffset] = (curInputValue2 >>> 5) & mask; + out[24 + outOffset] = (curInputValue2 >>> 8) & mask; + out[25 + outOffset] = (curInputValue2 >>> 11) & mask; + out[26 + outOffset] = (curInputValue2 >>> 14) & mask; + out[27 + outOffset] = (curInputValue2 >>> 17) & mask; + out[28 + outOffset] = (curInputValue2 >>> 20) & mask; + out[29 + outOffset] = (curInputValue2 >>> 23) & mask; + out[30 + outOffset] = (curInputValue2 >>> 26) & mask; + out[31 + outOffset] = curInputValue2 >>> 29; + outOffset += 32; + } + } + + static private void unpack4(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 15; + for (i = 0, w = 1; i < 4; ++i, w += 4) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + int curInputValue2 = in[w + 2]; + int curInputValue3 = in[w + 3]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 4) & mask; + out[2 + outOffset] = (curInputValue0 >>> 8) & mask; + out[3 + outOffset] = (curInputValue0 >>> 12) & mask; + out[4 + outOffset] = (curInputValue0 >>> 16) & mask; + out[5 + outOffset] = (curInputValue0 >>> 20) & mask; + out[6 + outOffset] = (curInputValue0 >>> 24) & mask; + out[7 + outOffset] = curInputValue0 >>> 28; + out[8 + outOffset] = curInputValue1 & mask; + out[9 + outOffset] = (curInputValue1 >>> 4) & mask; + out[10 + outOffset] = (curInputValue1 >>> 8) & mask; + out[11 + outOffset] = (curInputValue1 >>> 12) & mask; + out[12 + outOffset] = (curInputValue1 >>> 16) & mask; + out[13 + outOffset] = (curInputValue1 >>> 20) & mask; + out[14 + outOffset] = (curInputValue1 >>> 24) & mask; + out[15 + outOffset] = curInputValue1 >>> 28; + out[16 + outOffset] = curInputValue2 & mask; + out[17 + outOffset] = (curInputValue2 >>> 4) & mask; + out[18 + outOffset] = (curInputValue2 >>> 8) & mask; + out[19 + outOffset] = (curInputValue2 >>> 12) & mask; + out[20 + outOffset] = (curInputValue2 >>> 16) & mask; + out[21 + outOffset] = (curInputValue2 >>> 20) & mask; + out[22 + outOffset] = (curInputValue2 >>> 24) & mask; + out[23 + outOffset] = curInputValue2 >>> 28; + out[24 + outOffset] = curInputValue3 & mask; + out[25 + outOffset] = (curInputValue3 >>> 4) & mask; + out[26 + outOffset] = (curInputValue3 >>> 8) & mask; + out[27 + outOffset] = (curInputValue3 >>> 12) & mask; + out[28 + outOffset] = (curInputValue3 >>> 16) & mask; + out[29 + outOffset] = (curInputValue3 >>> 20) & mask; + out[30 + outOffset] = (curInputValue3 >>> 24) & mask; + out[31 + outOffset] = curInputValue3 >>> 28; + outOffset += 32; + } + } + + static private void unpack5(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 31; + for (i = 0, w = 1; i < 4; ++i, w += 5) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + int curInputValue2 = in[w + 2]; + int curInputValue3 = in[w + 3]; + int curInputValue4 = in[w + 4]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 5) & mask; + out[2 + outOffset] = (curInputValue0 >>> 10) & mask; + out[3 + outOffset] = (curInputValue0 >>> 15) & mask; + out[4 + outOffset] = (curInputValue0 >>> 20) & mask; + out[5 + outOffset] = (curInputValue0 >>> 25) & mask; + out[6 + outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) & mask; + out[7 + outOffset] = (curInputValue1 >>> 3) & mask; + out[8 + outOffset] = (curInputValue1 >>> 8) & mask; + out[9 + outOffset] = (curInputValue1 >>> 13) & mask; + out[10 + outOffset] = (curInputValue1 >>> 18) & mask; + out[11 + outOffset] = (curInputValue1 >>> 23) & mask; + out[12 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; + out[13 + outOffset] = (curInputValue2 >>> 1) & mask; + out[14 + outOffset] = (curInputValue2 >>> 6) & mask; + out[15 + outOffset] = (curInputValue2 >>> 11) & mask; + out[16 + outOffset] = (curInputValue2 >>> 16) & mask; + out[17 + outOffset] = (curInputValue2 >>> 21) & mask; + out[18 + outOffset] = (curInputValue2 >>> 26) & mask; + out[19 + outOffset] = ((curInputValue2 >>> 31) | (curInputValue3 << 1)) & mask; + out[20 + outOffset] = (curInputValue3 >>> 4) & mask; + out[21 + outOffset] = (curInputValue3 >>> 9) & mask; + out[22 + outOffset] = (curInputValue3 >>> 14) & mask; + out[23 + outOffset] = (curInputValue3 >>> 19) & mask; + out[24 + outOffset] = (curInputValue3 >>> 24) & mask; + out[25 + outOffset] = ((curInputValue3 >>> 29) | (curInputValue4 << 3)) & mask; + out[26 + outOffset] = (curInputValue4 >>> 2) & mask; + out[27 + outOffset] = (curInputValue4 >>> 7) & mask; + out[28 + outOffset] = (curInputValue4 >>> 12) & mask; + out[29 + outOffset] = (curInputValue4 >>> 17) & mask; + out[30 + outOffset] = (curInputValue4 >>> 22) & mask; + out[31 + outOffset] = curInputValue4 >>> 27; + outOffset += 32; + } + } + + static private void unpack6(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 63; + for (i = 0, w = 1; i < 4; ++i, w += 6) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + int curInputValue2 = in[w + 2]; + int curInputValue3 = in[w + 3]; + int curInputValue4 = in[w + 4]; + int curInputValue5 = in[w + 5]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 6) & mask; + out[2 + outOffset] = (curInputValue0 >>> 12) & mask; + out[3 + outOffset] = (curInputValue0 >>> 18) & mask; + out[4 + outOffset] = (curInputValue0 >>> 24) & mask; + out[5 + outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) & mask; + out[6 + outOffset] = (curInputValue1 >>> 4) & mask; + out[7 + outOffset] = (curInputValue1 >>> 10) & mask; + out[8 + outOffset] = (curInputValue1 >>> 16) & mask; + out[9 + outOffset] = (curInputValue1 >>> 22) & mask; + out[10 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; + out[11 + outOffset] = (curInputValue2 >>> 2) & mask; + out[12 + outOffset] = (curInputValue2 >>> 8) & mask; + out[13 + outOffset] = (curInputValue2 >>> 14) & mask; + out[14 + outOffset] = (curInputValue2 >>> 20) & mask; + out[15 + outOffset] = curInputValue2 >>> 26; + out[16 + outOffset] = curInputValue3 & mask; + out[17 + outOffset] = (curInputValue3 >>> 6) & mask; + out[18 + outOffset] = (curInputValue3 >>> 12) & mask; + out[19 + outOffset] = (curInputValue3 >>> 18) & mask; + out[20 + outOffset] = (curInputValue3 >>> 24) & mask; + out[21 + outOffset] = ((curInputValue3 >>> 30) | (curInputValue4 << 2)) & mask; + out[22 + outOffset] = (curInputValue4 >>> 4) & mask; + out[23 + outOffset] = (curInputValue4 >>> 10) & mask; + out[24 + outOffset] = (curInputValue4 >>> 16) & mask; + out[25 + outOffset] = (curInputValue4 >>> 22) & mask; + out[26 + outOffset] = ((curInputValue4 >>> 28) | (curInputValue5 << 4)) & mask; + out[27 + outOffset] = (curInputValue5 >>> 2) & mask; + out[28 + outOffset] = (curInputValue5 >>> 8) & mask; + out[29 + outOffset] = (curInputValue5 >>> 14) & mask; + out[30 + outOffset] = (curInputValue5 >>> 20) & mask; + out[31 + outOffset] = curInputValue5 >>> 26; + outOffset += 32; + } + } + + static private void unpack7(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 127; + for (i = 0, w = 1; i < 4; ++i, w += 7) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + int curInputValue2 = in[w + 2]; + int curInputValue3 = in[w + 3]; + int curInputValue4 = in[w + 4]; + int curInputValue5 = in[w + 5]; + int curInputValue6 = in[w + 6]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 7) & mask; + out[2 + outOffset] = (curInputValue0 >>> 14) & mask; + out[3 + outOffset] = (curInputValue0 >>> 21) & mask; + out[4 + outOffset] = ((curInputValue0 >>> 28) | (curInputValue1 << 4)) & mask; + out[5 + outOffset] = (curInputValue1 >>> 3) & mask; + out[6 + outOffset] = (curInputValue1 >>> 10) & mask; + out[7 + outOffset] = (curInputValue1 >>> 17) & mask; + out[8 + outOffset] = (curInputValue1 >>> 24) & mask; + out[9 + outOffset] = ((curInputValue1 >>> 31) | (curInputValue2 << 1)) & mask; + out[10 + outOffset] = (curInputValue2 >>> 6) & mask; + out[11 + outOffset] = (curInputValue2 >>> 13) & mask; + out[12 + outOffset] = (curInputValue2 >>> 20) & mask; + out[13 + outOffset] = ((curInputValue2 >>> 27) | (curInputValue3 << 5)) & mask; + out[14 + outOffset] = (curInputValue3 >>> 2) & mask; + out[15 + outOffset] = (curInputValue3 >>> 9) & mask; + out[16 + outOffset] = (curInputValue3 >>> 16) & mask; + out[17 + outOffset] = (curInputValue3 >>> 23) & mask; + out[18 + outOffset] = ((curInputValue3 >>> 30) | (curInputValue4 << 2)) & mask; + out[19 + outOffset] = (curInputValue4 >>> 5) & mask; + out[20 + outOffset] = (curInputValue4 >>> 12) & mask; + out[21 + outOffset] = (curInputValue4 >>> 19) & mask; + out[22 + outOffset] = ((curInputValue4 >>> 26) | (curInputValue5 << 6)) & mask; + out[23 + outOffset] = (curInputValue5 >>> 1) & mask; + out[24 + outOffset] = (curInputValue5 >>> 8) & mask; + out[25 + outOffset] = (curInputValue5 >>> 15) & mask; + out[26 + outOffset] = (curInputValue5 >>> 22) & mask; + out[27 + outOffset] = ((curInputValue5 >>> 29) | (curInputValue6 << 3)) & mask; + out[28 + outOffset] = (curInputValue6 >>> 4) & mask; + out[29 + outOffset] = (curInputValue6 >>> 11) & mask; + out[30 + outOffset] = (curInputValue6 >>> 18) & mask; + out[31 + outOffset] = curInputValue6 >>> 25; + outOffset += 32; + } + } + + static private void unpack8(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 255; + for (i = 0, w = 1; i < 4; ++i, w += 8) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + int curInputValue2 = in[w + 2]; + int curInputValue3 = in[w + 3]; + int curInputValue4 = in[w + 4]; + int curInputValue5 = in[w + 5]; + int curInputValue6 = in[w + 6]; + int curInputValue7 = in[w + 7]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 8) & mask; + out[2 + outOffset] = (curInputValue0 >>> 16) & mask; + out[3 + outOffset] = curInputValue0 >>> 24; + out[4 + outOffset] = curInputValue1 & mask; + out[5 + outOffset] = (curInputValue1 >>> 8) & mask; + out[6 + outOffset] = (curInputValue1 >>> 16) & mask; + out[7 + outOffset] = curInputValue1 >>> 24; + out[8 + outOffset] = curInputValue2 & mask; + out[9 + outOffset] = (curInputValue2 >>> 8) & mask; + out[10 + outOffset] = (curInputValue2 >>> 16) & mask; + out[11 + outOffset] = curInputValue2 >>> 24; + out[12 + outOffset] = curInputValue3 & mask; + out[13 + outOffset] = (curInputValue3 >>> 8) & mask; + out[14 + outOffset] = (curInputValue3 >>> 16) & mask; + out[15 + outOffset] = curInputValue3 >>> 24; + out[16 + outOffset] = curInputValue4 & mask; + out[17 + outOffset] = (curInputValue4 >>> 8) & mask; + out[18 + outOffset] = (curInputValue4 >>> 16) & mask; + out[19 + outOffset] = curInputValue4 >>> 24; + out[20 + outOffset] = curInputValue5 & mask; + out[21 + outOffset] = (curInputValue5 >>> 8) & mask; + out[22 + outOffset] = (curInputValue5 >>> 16) & mask; + out[23 + outOffset] = curInputValue5 >>> 24; + out[24 + outOffset] = curInputValue6 & mask; + out[25 + outOffset] = (curInputValue6 >>> 8) & mask; + out[26 + outOffset] = (curInputValue6 >>> 16) & mask; + out[27 + outOffset] = curInputValue6 >>> 24; + out[28 + outOffset] = curInputValue7 & mask; + out[29 + outOffset] = (curInputValue7 >>> 8) & mask; + out[30 + outOffset] = (curInputValue7 >>> 16) & mask; + out[31 + outOffset] = curInputValue7 >>> 24; + outOffset += 32; + } + } + + static private void unpack9(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 511; + for (i = 0, w = 1; i < 4; ++i, w += 9) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + int curInputValue2 = in[w + 2]; + int curInputValue3 = in[w + 3]; + int curInputValue4 = in[w + 4]; + int curInputValue5 = in[w + 5]; + int curInputValue6 = in[w + 6]; + int curInputValue7 = in[w + 7]; + int curInputValue8 = in[w + 8]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 9) & mask; + out[2 + outOffset] = (curInputValue0 >>> 18) & mask; + out[3 + outOffset] = ((curInputValue0 >>> 27) | (curInputValue1 << 5)) & mask; + out[4 + outOffset] = (curInputValue1 >>> 4) & mask; + out[5 + outOffset] = (curInputValue1 >>> 13) & mask; + out[6 + outOffset] = (curInputValue1 >>> 22) & mask; + out[7 + outOffset] = ((curInputValue1 >>> 31) | (curInputValue2 << 1)) & mask; + out[8 + outOffset] = (curInputValue2 >>> 8) & mask; + out[9 + outOffset] = (curInputValue2 >>> 17) & mask; + out[10 + outOffset] = ((curInputValue2 >>> 26) | (curInputValue3 << 6)) & mask; + out[11 + outOffset] = (curInputValue3 >>> 3) & mask; + out[12 + outOffset] = (curInputValue3 >>> 12) & mask; + out[13 + outOffset] = (curInputValue3 >>> 21) & mask; + out[14 + outOffset] = ((curInputValue3 >>> 30) | (curInputValue4 << 2)) & mask; + out[15 + outOffset] = (curInputValue4 >>> 7) & mask; + out[16 + outOffset] = (curInputValue4 >>> 16) & mask; + out[17 + outOffset] = ((curInputValue4 >>> 25) | (curInputValue5 << 7)) & mask; + out[18 + outOffset] = (curInputValue5 >>> 2) & mask; + out[19 + outOffset] = (curInputValue5 >>> 11) & mask; + out[20 + outOffset] = (curInputValue5 >>> 20) & mask; + out[21 + outOffset] = ((curInputValue5 >>> 29) | (curInputValue6 << 3)) & mask; + out[22 + outOffset] = (curInputValue6 >>> 6) & mask; + out[23 + outOffset] = (curInputValue6 >>> 15) & mask; + out[24 + outOffset] = ((curInputValue6 >>> 24) | (curInputValue7 << 8)) & mask; + out[25 + outOffset] = (curInputValue7 >>> 1) & mask; + out[26 + outOffset] = (curInputValue7 >>> 10) & mask; + out[27 + outOffset] = (curInputValue7 >>> 19) & mask; + out[28 + outOffset] = ((curInputValue7 >>> 28) | (curInputValue8 << 4)) & mask; + out[29 + outOffset] = (curInputValue8 >>> 5) & mask; + out[30 + outOffset] = (curInputValue8 >>> 14) & mask; + out[31 + outOffset] = curInputValue8 >>> 23; + outOffset += 32; + } + } + + static private void unpack10(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 1023; + for (i = 0, w = 1; i < 4; ++i, w += 10) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + int curInputValue2 = in[w + 2]; + int curInputValue3 = in[w + 3]; + int curInputValue4 = in[w + 4]; + int curInputValue5 = in[w + 5]; + int curInputValue6 = in[w + 6]; + int curInputValue7 = in[w + 7]; + int curInputValue8 = in[w + 8]; + int curInputValue9 = in[w + 9]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 10) & mask; + out[2 + outOffset] = (curInputValue0 >>> 20) & mask; + out[3 + outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) & mask; + out[4 + outOffset] = (curInputValue1 >>> 8) & mask; + out[5 + outOffset] = (curInputValue1 >>> 18) & mask; + out[6 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; + out[7 + outOffset] = (curInputValue2 >>> 6) & mask; + out[8 + outOffset] = (curInputValue2 >>> 16) & mask; + out[9 + outOffset] = ((curInputValue2 >>> 26) | (curInputValue3 << 6)) & mask; + out[10 + outOffset] = (curInputValue3 >>> 4) & mask; + out[11 + outOffset] = (curInputValue3 >>> 14) & mask; + out[12 + outOffset] = ((curInputValue3 >>> 24) | (curInputValue4 << 8)) & mask; + out[13 + outOffset] = (curInputValue4 >>> 2) & mask; + out[14 + outOffset] = (curInputValue4 >>> 12) & mask; + out[15 + outOffset] = curInputValue4 >>> 22; + out[16 + outOffset] = curInputValue5 & mask; + out[17 + outOffset] = (curInputValue5 >>> 10) & mask; + out[18 + outOffset] = (curInputValue5 >>> 20) & mask; + out[19 + outOffset] = ((curInputValue5 >>> 30) | (curInputValue6 << 2)) & mask; + out[20 + outOffset] = (curInputValue6 >>> 8) & mask; + out[21 + outOffset] = (curInputValue6 >>> 18) & mask; + out[22 + outOffset] = ((curInputValue6 >>> 28) | (curInputValue7 << 4)) & mask; + out[23 + outOffset] = (curInputValue7 >>> 6) & mask; + out[24 + outOffset] = (curInputValue7 >>> 16) & mask; + out[25 + outOffset] = ((curInputValue7 >>> 26) | (curInputValue8 << 6)) & mask; + out[26 + outOffset] = (curInputValue8 >>> 4) & mask; + out[27 + outOffset] = (curInputValue8 >>> 14) & mask; + out[28 + outOffset] = ((curInputValue8 >>> 24) | (curInputValue9 << 8)) & mask; + out[29 + outOffset] = (curInputValue9 >>> 2) & mask; + out[30 + outOffset] = (curInputValue9 >>> 12) & mask; + out[31 + outOffset] = curInputValue9 >>> 22; + outOffset += 32; + } + } + + static private void unpack11(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 2047; + for (i = 0, w = 1; i < 4; ++i, w += 11) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + int curInputValue2 = in[w + 2]; + int curInputValue3 = in[w + 3]; + int curInputValue4 = in[w + 4]; + int curInputValue5 = in[w + 5]; + int curInputValue6 = in[w + 6]; + int curInputValue7 = in[w + 7]; + int curInputValue8 = in[w + 8]; + int curInputValue9 = in[w + 9]; + int curInputValue10 = in[w + 10]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 11) & mask; + out[2 + outOffset] = ((curInputValue0 >>> 22) | (curInputValue1 << 10)) & mask; + out[3 + outOffset] = (curInputValue1 >>> 1) & mask; + out[4 + outOffset] = (curInputValue1 >>> 12) & mask; + out[5 + outOffset] = ((curInputValue1 >>> 23) | (curInputValue2 << 9)) & mask; + out[6 + outOffset] = (curInputValue2 >>> 2) & mask; + out[7 + outOffset] = (curInputValue2 >>> 13) & mask; + out[8 + outOffset] = ((curInputValue2 >>> 24) | (curInputValue3 << 8)) & mask; + out[9 + outOffset] = (curInputValue3 >>> 3) & mask; + out[10 + outOffset] = (curInputValue3 >>> 14) & mask; + out[11 + outOffset] = ((curInputValue3 >>> 25) | (curInputValue4 << 7)) & mask; + out[12 + outOffset] = (curInputValue4 >>> 4) & mask; + out[13 + outOffset] = (curInputValue4 >>> 15) & mask; + out[14 + outOffset] = ((curInputValue4 >>> 26) | (curInputValue5 << 6)) & mask; + out[15 + outOffset] = (curInputValue5 >>> 5) & mask; + out[16 + outOffset] = (curInputValue5 >>> 16) & mask; + out[17 + outOffset] = ((curInputValue5 >>> 27) | (curInputValue6 << 5)) & mask; + out[18 + outOffset] = (curInputValue6 >>> 6) & mask; + out[19 + outOffset] = (curInputValue6 >>> 17) & mask; + out[20 + outOffset] = ((curInputValue6 >>> 28) | (curInputValue7 << 4)) & mask; + out[21 + outOffset] = (curInputValue7 >>> 7) & mask; + out[22 + outOffset] = (curInputValue7 >>> 18) & mask; + out[23 + outOffset] = ((curInputValue7 >>> 29) | (curInputValue8 << 3)) & mask; + out[24 + outOffset] = (curInputValue8 >>> 8) & mask; + out[25 + outOffset] = (curInputValue8 >>> 19) & mask; + out[26 + outOffset] = ((curInputValue8 >>> 30) | (curInputValue9 << 2)) & mask; + out[27 + outOffset] = (curInputValue9 >>> 9) & mask; + out[28 + outOffset] = (curInputValue9 >>> 20) & mask; + out[29 + outOffset] = ((curInputValue9 >>> 31) | (curInputValue10 << 1)) & mask; + out[30 + outOffset] = (curInputValue10 >>> 10) & mask; + out[31 + outOffset] = curInputValue10 >>> 21; + outOffset += 32; + } + } + + static private void unpack12(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 4095; + for (i = 0, w = 1; i < 4; ++i, w += 12) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + int curInputValue2 = in[w + 2]; + int curInputValue3 = in[w + 3]; + int curInputValue4 = in[w + 4]; + int curInputValue5 = in[w + 5]; + int curInputValue6 = in[w + 6]; + int curInputValue7 = in[w + 7]; + int curInputValue8 = in[w + 8]; + int curInputValue9 = in[w + 9]; + int curInputValue10 = in[w + 10]; + int curInputValue11 = in[w + 11]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 12) & mask; + out[2 + outOffset] = ((curInputValue0 >>> 24) | (curInputValue1 << 8)) & mask; + out[3 + outOffset] = (curInputValue1 >>> 4) & mask; + out[4 + outOffset] = (curInputValue1 >>> 16) & mask; + out[5 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; + out[6 + outOffset] = (curInputValue2 >>> 8) & mask; + out[7 + outOffset] = curInputValue2 >>> 20; + out[8 + outOffset] = curInputValue3 & mask; + out[9 + outOffset] = (curInputValue3 >>> 12) & mask; + out[10 + outOffset] = ((curInputValue3 >>> 24) | (curInputValue4 << 8)) & mask; + out[11 + outOffset] = (curInputValue4 >>> 4) & mask; + out[12 + outOffset] = (curInputValue4 >>> 16) & mask; + out[13 + outOffset] = ((curInputValue4 >>> 28) | (curInputValue5 << 4)) & mask; + out[14 + outOffset] = (curInputValue5 >>> 8) & mask; + out[15 + outOffset] = curInputValue5 >>> 20; + out[16 + outOffset] = curInputValue6 & mask; + out[17 + outOffset] = (curInputValue6 >>> 12) & mask; + out[18 + outOffset] = ((curInputValue6 >>> 24) | (curInputValue7 << 8)) & mask; + out[19 + outOffset] = (curInputValue7 >>> 4) & mask; + out[20 + outOffset] = (curInputValue7 >>> 16) & mask; + out[21 + outOffset] = ((curInputValue7 >>> 28) | (curInputValue8 << 4)) & mask; + out[22 + outOffset] = (curInputValue8 >>> 8) & mask; + out[23 + outOffset] = curInputValue8 >>> 20; + out[24 + outOffset] = curInputValue9 & mask; + out[25 + outOffset] = (curInputValue9 >>> 12) & mask; + out[26 + outOffset] = ((curInputValue9 >>> 24) | (curInputValue10 << 8)) & mask; + out[27 + outOffset] = (curInputValue10 >>> 4) & mask; + out[28 + outOffset] = (curInputValue10 >>> 16) & mask; + out[29 + outOffset] = ((curInputValue10 >>> 28) | (curInputValue11 << 4)) & mask; + out[30 + outOffset] = (curInputValue11 >>> 8) & mask; + out[31 + outOffset] = curInputValue11 >>> 20; + outOffset += 32; + } + } + + static private void unpack13(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 8191; + for (i = 0, w = 1; i < 4; ++i, w += 13) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + int curInputValue2 = in[w + 2]; + int curInputValue3 = in[w + 3]; + int curInputValue4 = in[w + 4]; + int curInputValue5 = in[w + 5]; + int curInputValue6 = in[w + 6]; + int curInputValue7 = in[w + 7]; + int curInputValue8 = in[w + 8]; + int curInputValue9 = in[w + 9]; + int curInputValue10 = in[w + 10]; + int curInputValue11 = in[w + 11]; + int curInputValue12 = in[w + 12]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 13) & mask; + out[2 + outOffset] = ((curInputValue0 >>> 26) | (curInputValue1 << 6)) & mask; + out[3 + outOffset] = (curInputValue1 >>> 7) & mask; + out[4 + outOffset] = ((curInputValue1 >>> 20) | (curInputValue2 << 12)) & mask; + out[5 + outOffset] = (curInputValue2 >>> 1) & mask; + out[6 + outOffset] = (curInputValue2 >>> 14) & mask; + out[7 + outOffset] = ((curInputValue2 >>> 27) | (curInputValue3 << 5)) & mask; + out[8 + outOffset] = (curInputValue3 >>> 8) & mask; + out[9 + outOffset] = ((curInputValue3 >>> 21) | (curInputValue4 << 11)) & mask; + out[10 + outOffset] = (curInputValue4 >>> 2) & mask; + out[11 + outOffset] = (curInputValue4 >>> 15) & mask; + out[12 + outOffset] = ((curInputValue4 >>> 28) | (curInputValue5 << 4)) & mask; + out[13 + outOffset] = (curInputValue5 >>> 9) & mask; + out[14 + outOffset] = ((curInputValue5 >>> 22) | (curInputValue6 << 10)) & mask; + out[15 + outOffset] = (curInputValue6 >>> 3) & mask; + out[16 + outOffset] = (curInputValue6 >>> 16) & mask; + out[17 + outOffset] = ((curInputValue6 >>> 29) | (curInputValue7 << 3)) & mask; + out[18 + outOffset] = (curInputValue7 >>> 10) & mask; + out[19 + outOffset] = ((curInputValue7 >>> 23) | (curInputValue8 << 9)) & mask; + out[20 + outOffset] = (curInputValue8 >>> 4) & mask; + out[21 + outOffset] = (curInputValue8 >>> 17) & mask; + out[22 + outOffset] = ((curInputValue8 >>> 30) | (curInputValue9 << 2)) & mask; + out[23 + outOffset] = (curInputValue9 >>> 11) & mask; + out[24 + outOffset] = ((curInputValue9 >>> 24) | (curInputValue10 << 8)) & mask; + out[25 + outOffset] = (curInputValue10 >>> 5) & mask; + out[26 + outOffset] = (curInputValue10 >>> 18) & mask; + out[27 + outOffset] = ((curInputValue10 >>> 31) | (curInputValue11 << 1)) & mask; + out[28 + outOffset] = (curInputValue11 >>> 12) & mask; + out[29 + outOffset] = ((curInputValue11 >>> 25) | (curInputValue12 << 7)) & mask; + out[30 + outOffset] = (curInputValue12 >>> 6) & mask; + out[31 + outOffset] = curInputValue12 >>> 19; + outOffset += 32; + } + } + + static private void unpack16(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 65535; + for (i = 0, w = 1; i < 4; ++i, w += 16) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + int curInputValue2 = in[w + 2]; + int curInputValue3 = in[w + 3]; + int curInputValue4 = in[w + 4]; + int curInputValue5 = in[w + 5]; + int curInputValue6 = in[w + 6]; + int curInputValue7 = in[w + 7]; + int curInputValue8 = in[w + 8]; + int curInputValue9 = in[w + 9]; + int curInputValue10 = in[w + 10]; + int curInputValue11 = in[w + 11]; + int curInputValue12 = in[w + 12]; + int curInputValue13 = in[w + 13]; + int curInputValue14 = in[w + 14]; + int curInputValue15 = in[w + 15]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = curInputValue0 >>> 16; + out[2 + outOffset] = curInputValue1 & mask; + out[3 + outOffset] = curInputValue1 >>> 16; + out[4 + outOffset] = curInputValue2 & mask; + out[5 + outOffset] = curInputValue2 >>> 16; + out[6 + outOffset] = curInputValue3 & mask; + out[7 + outOffset] = curInputValue3 >>> 16; + out[8 + outOffset] = curInputValue4 & mask; + out[9 + outOffset] = curInputValue4 >>> 16; + out[10 + outOffset] = curInputValue5 & mask; + out[11 + outOffset] = curInputValue5 >>> 16; + out[12 + outOffset] = curInputValue6 & mask; + out[13 + outOffset] = curInputValue6 >>> 16; + out[14 + outOffset] = curInputValue7 & mask; + out[15 + outOffset] = curInputValue7 >>> 16; + out[16 + outOffset] = curInputValue8 & mask; + out[17 + outOffset] = curInputValue8 >>> 16; + out[18 + outOffset] = curInputValue9 & mask; + out[19 + outOffset] = curInputValue9 >>> 16; + out[20 + outOffset] = curInputValue10 & mask; + out[21 + outOffset] = curInputValue10 >>> 16; + out[22 + outOffset] = curInputValue11 & mask; + out[23 + outOffset] = curInputValue11 >>> 16; + out[24 + outOffset] = curInputValue12 & mask; + out[25 + outOffset] = curInputValue12 >>> 16; + out[26 + outOffset] = curInputValue13 & mask; + out[27 + outOffset] = curInputValue13 >>> 16; + out[28 + outOffset] = curInputValue14 & mask; + out[29 + outOffset] = curInputValue14 >>> 16; + out[30 + outOffset] = curInputValue15 & mask; + out[31 + outOffset] = curInputValue15 >>> 16; + outOffset += 32; + } + } + + static private void unpack20(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 1048575; + for (i = 0, w = 1; i < 4; ++i, w += 20) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + int curInputValue2 = in[w + 2]; + int curInputValue3 = in[w + 3]; + int curInputValue4 = in[w + 4]; + int curInputValue5 = in[w + 5]; + int curInputValue6 = in[w + 6]; + int curInputValue7 = in[w + 7]; + int curInputValue8 = in[w + 8]; + int curInputValue9 = in[w + 9]; + int curInputValue10 = in[w + 10]; + int curInputValue11 = in[w + 11]; + int curInputValue12 = in[w + 12]; + int curInputValue13 = in[w + 13]; + int curInputValue14 = in[w + 14]; + int curInputValue15 = in[w + 15]; + int curInputValue16 = in[w + 16]; + int curInputValue17 = in[w + 17]; + int curInputValue18 = in[w + 18]; + int curInputValue19 = in[w + 19]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = ((curInputValue0 >>> 20) | (curInputValue1 << 12)) & mask; + out[2 + outOffset] = (curInputValue1 >>> 8) & mask; + out[3 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; + out[4 + outOffset] = ((curInputValue2 >>> 16) | (curInputValue3 << 16)) & mask; + out[5 + outOffset] = (curInputValue3 >>> 4) & mask; + out[6 + outOffset] = ((curInputValue3 >>> 24) | (curInputValue4 << 8)) & mask; + out[7 + outOffset] = curInputValue4 >>> 12; + out[8 + outOffset] = curInputValue5 & mask; + out[9 + outOffset] = ((curInputValue5 >>> 20) | (curInputValue6 << 12)) & mask; + out[10 + outOffset] = (curInputValue6 >>> 8) & mask; + out[11 + outOffset] = ((curInputValue6 >>> 28) | (curInputValue7 << 4)) & mask; + out[12 + outOffset] = ((curInputValue7 >>> 16) | (curInputValue8 << 16)) & mask; + out[13 + outOffset] = (curInputValue8 >>> 4) & mask; + out[14 + outOffset] = ((curInputValue8 >>> 24) | (curInputValue9 << 8)) & mask; + out[15 + outOffset] = curInputValue9 >>> 12; + out[16 + outOffset] = curInputValue10 & mask; + out[17 + outOffset] = ((curInputValue10 >>> 20) | (curInputValue11 << 12)) & mask; + out[18 + outOffset] = (curInputValue11 >>> 8) & mask; + out[19 + outOffset] = ((curInputValue11 >>> 28) | (curInputValue12 << 4)) & mask; + out[20 + outOffset] = ((curInputValue12 >>> 16) | (curInputValue13 << 16)) & mask; + out[21 + outOffset] = (curInputValue13 >>> 4) & mask; + out[22 + outOffset] = ((curInputValue13 >>> 24) | (curInputValue14 << 8)) & mask; + out[23 + outOffset] = curInputValue14 >>> 12; + out[24 + outOffset] = curInputValue15 & mask; + out[25 + outOffset] = ((curInputValue15 >>> 20) | (curInputValue16 << 12)) & mask; + out[26 + outOffset] = (curInputValue16 >>> 8) & mask; + out[27 + outOffset] = ((curInputValue16 >>> 28) | (curInputValue17 << 4)) & mask; + out[28 + outOffset] = ((curInputValue17 >>> 16) | (curInputValue18 << 16)) & mask; + out[29 + outOffset] = (curInputValue18 >>> 4) & mask; + out[30 + outOffset] = ((curInputValue18 >>> 24) | (curInputValue19 << 8)) & mask; + out[31 + outOffset] = curInputValue19 >>> 12; + outOffset += 32; + } + } + + static private void unpack28(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 268435455; + for (i = 0, w = 1; i < 4; ++i, w += 28) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + int curInputValue2 = in[w + 2]; + int curInputValue3 = in[w + 3]; + int curInputValue4 = in[w + 4]; + int curInputValue5 = in[w + 5]; + int curInputValue6 = in[w + 6]; + int curInputValue7 = in[w + 7]; + int curInputValue8 = in[w + 8]; + int curInputValue9 = in[w + 9]; + int curInputValue10 = in[w + 10]; + int curInputValue11 = in[w + 11]; + int curInputValue12 = in[w + 12]; + int curInputValue13 = in[w + 13]; + int curInputValue14 = in[w + 14]; + int curInputValue15 = in[w + 15]; + int curInputValue16 = in[w + 16]; + int curInputValue17 = in[w + 17]; + int curInputValue18 = in[w + 18]; + int curInputValue19 = in[w + 19]; + int curInputValue20 = in[w + 20]; + int curInputValue21 = in[w + 21]; + int curInputValue22 = in[w + 22]; + int curInputValue23 = in[w + 23]; + int curInputValue24 = in[w + 24]; + int curInputValue25 = in[w + 25]; + int curInputValue26 = in[w + 26]; + int curInputValue27 = in[w + 27]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = ((curInputValue0 >>> 28) | (curInputValue1 << 4)) & mask; + out[2 + outOffset] = ((curInputValue1 >>> 24) | (curInputValue2 << 8)) & mask; + out[3 + outOffset] = ((curInputValue2 >>> 20) | (curInputValue3 << 12)) & mask; + out[4 + outOffset] = ((curInputValue3 >>> 16) | (curInputValue4 << 16)) & mask; + out[5 + outOffset] = ((curInputValue4 >>> 12) | (curInputValue5 << 20)) & mask; + out[6 + outOffset] = ((curInputValue5 >>> 8) | (curInputValue6 << 24)) & mask; + out[7 + outOffset] = curInputValue6 >>> 4; + out[8 + outOffset] = curInputValue7 & mask; + out[9 + outOffset] = ((curInputValue7 >>> 28) | (curInputValue8 << 4)) & mask; + out[10 + outOffset] = ((curInputValue8 >>> 24) | (curInputValue9 << 8)) & mask; + out[11 + outOffset] = ((curInputValue9 >>> 20) | (curInputValue10 << 12)) & mask; + out[12 + outOffset] = ((curInputValue10 >>> 16) | (curInputValue11 << 16)) & mask; + out[13 + outOffset] = ((curInputValue11 >>> 12) | (curInputValue12 << 20)) & mask; + out[14 + outOffset] = ((curInputValue12 >>> 8) | (curInputValue13 << 24)) & mask; + out[15 + outOffset] = curInputValue13 >>> 4; + out[16 + outOffset] = curInputValue14 & mask; + out[17 + outOffset] = ((curInputValue14 >>> 28) | (curInputValue15 << 4)) & mask; + out[18 + outOffset] = ((curInputValue15 >>> 24) | (curInputValue16 << 8)) & mask; + out[19 + outOffset] = ((curInputValue16 >>> 20) | (curInputValue17 << 12)) & mask; + out[20 + outOffset] = ((curInputValue17 >>> 16) | (curInputValue18 << 16)) & mask; + out[21 + outOffset] = ((curInputValue18 >>> 12) | (curInputValue19 << 20)) & mask; + out[22 + outOffset] = ((curInputValue19 >>> 8) | (curInputValue20 << 24)) & mask; + out[23 + outOffset] = curInputValue20 >>> 4; + out[24 + outOffset] = curInputValue21 & mask; + out[25 + outOffset] = ((curInputValue21 >>> 28) | (curInputValue22 << 4)) & mask; + out[26 + outOffset] = ((curInputValue22 >>> 24) | (curInputValue23 << 8)) & mask; + out[27 + outOffset] = ((curInputValue23 >>> 20) | (curInputValue24 << 12)) & mask; + out[28 + outOffset] = ((curInputValue24 >>> 16) | (curInputValue25 << 16)) & mask; + out[29 + outOffset] = ((curInputValue25 >>> 12) | (curInputValue26 << 20)) & mask; + out[30 + outOffset] = ((curInputValue26 >>> 8) | (curInputValue27 << 24)) & mask; + out[31 + outOffset] = curInputValue27 >>> 4; + outOffset += 32; + } } - } - - static private void unpack0(int[] out, int[] in) - { - } - - static private void unpack1(int[] out, int[] in) - { - int i, w; - int outOffset = 0; - final int mask = 1; - for(i=0, w=1; i<4; ++i, w+=1){ - int curInputValue0 = in[w]; - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = (curInputValue0 >>> 1) & mask; - out[2+outOffset] = (curInputValue0 >>> 2) & mask; - out[3+outOffset] = (curInputValue0 >>> 3) & mask; - out[4+outOffset] = (curInputValue0 >>> 4) & mask; - out[5+outOffset] = (curInputValue0 >>> 5) & mask; - out[6+outOffset] = (curInputValue0 >>> 6) & mask; - out[7+outOffset] = (curInputValue0 >>> 7) & mask; - out[8+outOffset] = (curInputValue0 >>> 8) & mask; - out[9+outOffset] = (curInputValue0 >>> 9) & mask; - out[10+outOffset] = (curInputValue0 >>> 10) & mask; - out[11+outOffset] = (curInputValue0 >>> 11) & mask; - out[12+outOffset] = (curInputValue0 >>> 12) & mask; - out[13+outOffset] = (curInputValue0 >>> 13) & mask; - out[14+outOffset] = (curInputValue0 >>> 14) & mask; - out[15+outOffset] = (curInputValue0 >>> 15) & mask; - out[16+outOffset] = (curInputValue0 >>> 16) & mask; - out[17+outOffset] = (curInputValue0 >>> 17) & mask; - out[18+outOffset] = (curInputValue0 >>> 18) & mask; - out[19+outOffset] = (curInputValue0 >>> 19) & mask; - out[20+outOffset] = (curInputValue0 >>> 20) & mask; - out[21+outOffset] = (curInputValue0 >>> 21) & mask; - out[22+outOffset] = (curInputValue0 >>> 22) & mask; - out[23+outOffset] = (curInputValue0 >>> 23) & mask; - out[24+outOffset] = (curInputValue0 >>> 24) & mask; - out[25+outOffset] = (curInputValue0 >>> 25) & mask; - out[26+outOffset] = (curInputValue0 >>> 26) & mask; - out[27+outOffset] = (curInputValue0 >>> 27) & mask; - out[28+outOffset] = (curInputValue0 >>> 28) & mask; - out[29+outOffset] = (curInputValue0 >>> 29) & mask; - out[30+outOffset] = (curInputValue0 >>> 30) & mask; - out[31+outOffset] = curInputValue0 >>> 31; - outOffset += 32; - } - } - - static private void unpack2(int[] out, int[] in) - { - int i, w; - int outOffset = 0; - final int mask = 3; - for(i=0, w=1; i<4; ++i, w+=2){ - int curInputValue0 = in[w]; - int curInputValue1 = in[w+1]; - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = (curInputValue0 >>> 2) & mask; - out[2+outOffset] = (curInputValue0 >>> 4) & mask; - out[3+outOffset] = (curInputValue0 >>> 6) & mask; - out[4+outOffset] = (curInputValue0 >>> 8) & mask; - out[5+outOffset] = (curInputValue0 >>> 10) & mask; - out[6+outOffset] = (curInputValue0 >>> 12) & mask; - out[7+outOffset] = (curInputValue0 >>> 14) & mask; - out[8+outOffset] = (curInputValue0 >>> 16) & mask; - out[9+outOffset] = (curInputValue0 >>> 18) & mask; - out[10+outOffset] = (curInputValue0 >>> 20) & mask; - out[11+outOffset] = (curInputValue0 >>> 22) & mask; - out[12+outOffset] = (curInputValue0 >>> 24) & mask; - out[13+outOffset] = (curInputValue0 >>> 26) & mask; - out[14+outOffset] = (curInputValue0 >>> 28) & mask; - out[15+outOffset] = curInputValue0 >>> 30; - out[16+outOffset] = curInputValue1 & mask; - out[17+outOffset] = (curInputValue1 >>> 2) & mask; - out[18+outOffset] = (curInputValue1 >>> 4) & mask; - out[19+outOffset] = (curInputValue1 >>> 6) & mask; - out[20+outOffset] = (curInputValue1 >>> 8) & mask; - out[21+outOffset] = (curInputValue1 >>> 10) & mask; - out[22+outOffset] = (curInputValue1 >>> 12) & mask; - out[23+outOffset] = (curInputValue1 >>> 14) & mask; - out[24+outOffset] = (curInputValue1 >>> 16) & mask; - out[25+outOffset] = (curInputValue1 >>> 18) & mask; - out[26+outOffset] = (curInputValue1 >>> 20) & mask; - out[27+outOffset] = (curInputValue1 >>> 22) & mask; - out[28+outOffset] = (curInputValue1 >>> 24) & mask; - out[29+outOffset] = (curInputValue1 >>> 26) & mask; - out[30+outOffset] = (curInputValue1 >>> 28) & mask; - out[31+outOffset] = curInputValue1 >>> 30; - outOffset += 32; - } - } - - static private void unpack3(int[] out, int[] in) - { - int i, w; - int outOffset = 0; - final int mask = 7; - for(i=0, w=1; i<4; ++i, w+=3){ - int curInputValue0 = in[w]; - int curInputValue1 = in[w+1]; - int curInputValue2 = in[w+2]; - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = (curInputValue0 >>> 3) & mask; - out[2+outOffset] = (curInputValue0 >>> 6) & mask; - out[3+outOffset] = (curInputValue0 >>> 9) & mask; - out[4+outOffset] = (curInputValue0 >>> 12) & mask; - out[5+outOffset] = (curInputValue0 >>> 15) & mask; - out[6+outOffset] = (curInputValue0 >>> 18) & mask; - out[7+outOffset] = (curInputValue0 >>> 21) & mask; - out[8+outOffset] = (curInputValue0 >>> 24) & mask; - out[9+outOffset] = (curInputValue0 >>> 27) & mask; - out[10+outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) & mask; - out[11+outOffset] = (curInputValue1 >>> 1) & mask; - out[12+outOffset] = (curInputValue1 >>> 4) & mask; - out[13+outOffset] = (curInputValue1 >>> 7) & mask; - out[14+outOffset] = (curInputValue1 >>> 10) & mask; - out[15+outOffset] = (curInputValue1 >>> 13) & mask; - out[16+outOffset] = (curInputValue1 >>> 16) & mask; - out[17+outOffset] = (curInputValue1 >>> 19) & mask; - out[18+outOffset] = (curInputValue1 >>> 22) & mask; - out[19+outOffset] = (curInputValue1 >>> 25) & mask; - out[20+outOffset] = (curInputValue1 >>> 28) & mask; - out[21+outOffset] = ((curInputValue1 >>> 31) | (curInputValue2 << 1)) & mask; - out[22+outOffset] = (curInputValue2 >>> 2) & mask; - out[23+outOffset] = (curInputValue2 >>> 5) & mask; - out[24+outOffset] = (curInputValue2 >>> 8) & mask; - out[25+outOffset] = (curInputValue2 >>> 11) & mask; - out[26+outOffset] = (curInputValue2 >>> 14) & mask; - out[27+outOffset] = (curInputValue2 >>> 17) & mask; - out[28+outOffset] = (curInputValue2 >>> 20) & mask; - out[29+outOffset] = (curInputValue2 >>> 23) & mask; - out[30+outOffset] = (curInputValue2 >>> 26) & mask; - out[31+outOffset] = curInputValue2 >>> 29; - outOffset += 32; - } - } - - static private void unpack4(int[] out, int[] in) - { - int i, w; - int outOffset = 0; - final int mask = 15; - for(i=0, w=1; i<4; ++i, w+=4){ - int curInputValue0 = in[w]; - int curInputValue1 = in[w+1]; - int curInputValue2 = in[w+2]; - int curInputValue3 = in[w+3]; - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = (curInputValue0 >>> 4) & mask; - out[2+outOffset] = (curInputValue0 >>> 8) & mask; - out[3+outOffset] = (curInputValue0 >>> 12) & mask; - out[4+outOffset] = (curInputValue0 >>> 16) & mask; - out[5+outOffset] = (curInputValue0 >>> 20) & mask; - out[6+outOffset] = (curInputValue0 >>> 24) & mask; - out[7+outOffset] = curInputValue0 >>> 28; - out[8+outOffset] = curInputValue1 & mask; - out[9+outOffset] = (curInputValue1 >>> 4) & mask; - out[10+outOffset] = (curInputValue1 >>> 8) & mask; - out[11+outOffset] = (curInputValue1 >>> 12) & mask; - out[12+outOffset] = (curInputValue1 >>> 16) & mask; - out[13+outOffset] = (curInputValue1 >>> 20) & mask; - out[14+outOffset] = (curInputValue1 >>> 24) & mask; - out[15+outOffset] = curInputValue1 >>> 28; - out[16+outOffset] = curInputValue2 & mask; - out[17+outOffset] = (curInputValue2 >>> 4) & mask; - out[18+outOffset] = (curInputValue2 >>> 8) & mask; - out[19+outOffset] = (curInputValue2 >>> 12) & mask; - out[20+outOffset] = (curInputValue2 >>> 16) & mask; - out[21+outOffset] = (curInputValue2 >>> 20) & mask; - out[22+outOffset] = (curInputValue2 >>> 24) & mask; - out[23+outOffset] = curInputValue2 >>> 28; - out[24+outOffset] = curInputValue3 & mask; - out[25+outOffset] = (curInputValue3 >>> 4) & mask; - out[26+outOffset] = (curInputValue3 >>> 8) & mask; - out[27+outOffset] = (curInputValue3 >>> 12) & mask; - out[28+outOffset] = (curInputValue3 >>> 16) & mask; - out[29+outOffset] = (curInputValue3 >>> 20) & mask; - out[30+outOffset] = (curInputValue3 >>> 24) & mask; - out[31+outOffset] = curInputValue3 >>> 28; - outOffset += 32; - } - } - - static private void unpack5(int[] out, int[] in) - { - int i, w; - int outOffset = 0; - final int mask = 31; - for(i=0, w=1; i<4; ++i, w+=5){ - int curInputValue0 = in[w]; - int curInputValue1 = in[w+1]; - int curInputValue2 = in[w+2]; - int curInputValue3 = in[w+3]; - int curInputValue4 = in[w+4]; - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = (curInputValue0 >>> 5) & mask; - out[2+outOffset] = (curInputValue0 >>> 10) & mask; - out[3+outOffset] = (curInputValue0 >>> 15) & mask; - out[4+outOffset] = (curInputValue0 >>> 20) & mask; - out[5+outOffset] = (curInputValue0 >>> 25) & mask; - out[6+outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) & mask; - out[7+outOffset] = (curInputValue1 >>> 3) & mask; - out[8+outOffset] = (curInputValue1 >>> 8) & mask; - out[9+outOffset] = (curInputValue1 >>> 13) & mask; - out[10+outOffset] = (curInputValue1 >>> 18) & mask; - out[11+outOffset] = (curInputValue1 >>> 23) & mask; - out[12+outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; - out[13+outOffset] = (curInputValue2 >>> 1) & mask; - out[14+outOffset] = (curInputValue2 >>> 6) & mask; - out[15+outOffset] = (curInputValue2 >>> 11) & mask; - out[16+outOffset] = (curInputValue2 >>> 16) & mask; - out[17+outOffset] = (curInputValue2 >>> 21) & mask; - out[18+outOffset] = (curInputValue2 >>> 26) & mask; - out[19+outOffset] = ((curInputValue2 >>> 31) | (curInputValue3 << 1)) & mask; - out[20+outOffset] = (curInputValue3 >>> 4) & mask; - out[21+outOffset] = (curInputValue3 >>> 9) & mask; - out[22+outOffset] = (curInputValue3 >>> 14) & mask; - out[23+outOffset] = (curInputValue3 >>> 19) & mask; - out[24+outOffset] = (curInputValue3 >>> 24) & mask; - out[25+outOffset] = ((curInputValue3 >>> 29) | (curInputValue4 << 3)) & mask; - out[26+outOffset] = (curInputValue4 >>> 2) & mask; - out[27+outOffset] = (curInputValue4 >>> 7) & mask; - out[28+outOffset] = (curInputValue4 >>> 12) & mask; - out[29+outOffset] = (curInputValue4 >>> 17) & mask; - out[30+outOffset] = (curInputValue4 >>> 22) & mask; - out[31+outOffset] = curInputValue4 >>> 27; - outOffset += 32; - } - } - - static private void unpack6(int[] out, int[] in) - { - int i, w; - int outOffset = 0; - final int mask = 63; - for(i=0, w=1; i<4; ++i, w+=6){ - int curInputValue0 = in[w]; - int curInputValue1 = in[w+1]; - int curInputValue2 = in[w+2]; - int curInputValue3 = in[w+3]; - int curInputValue4 = in[w+4]; - int curInputValue5 = in[w+5]; - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = (curInputValue0 >>> 6) & mask; - out[2+outOffset] = (curInputValue0 >>> 12) & mask; - out[3+outOffset] = (curInputValue0 >>> 18) & mask; - out[4+outOffset] = (curInputValue0 >>> 24) & mask; - out[5+outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) & mask; - out[6+outOffset] = (curInputValue1 >>> 4) & mask; - out[7+outOffset] = (curInputValue1 >>> 10) & mask; - out[8+outOffset] = (curInputValue1 >>> 16) & mask; - out[9+outOffset] = (curInputValue1 >>> 22) & mask; - out[10+outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; - out[11+outOffset] = (curInputValue2 >>> 2) & mask; - out[12+outOffset] = (curInputValue2 >>> 8) & mask; - out[13+outOffset] = (curInputValue2 >>> 14) & mask; - out[14+outOffset] = (curInputValue2 >>> 20) & mask; - out[15+outOffset] = curInputValue2 >>> 26; - out[16+outOffset] = curInputValue3 & mask; - out[17+outOffset] = (curInputValue3 >>> 6) & mask; - out[18+outOffset] = (curInputValue3 >>> 12) & mask; - out[19+outOffset] = (curInputValue3 >>> 18) & mask; - out[20+outOffset] = (curInputValue3 >>> 24) & mask; - out[21+outOffset] = ((curInputValue3 >>> 30) | (curInputValue4 << 2)) & mask; - out[22+outOffset] = (curInputValue4 >>> 4) & mask; - out[23+outOffset] = (curInputValue4 >>> 10) & mask; - out[24+outOffset] = (curInputValue4 >>> 16) & mask; - out[25+outOffset] = (curInputValue4 >>> 22) & mask; - out[26+outOffset] = ((curInputValue4 >>> 28) | (curInputValue5 << 4)) & mask; - out[27+outOffset] = (curInputValue5 >>> 2) & mask; - out[28+outOffset] = (curInputValue5 >>> 8) & mask; - out[29+outOffset] = (curInputValue5 >>> 14) & mask; - out[30+outOffset] = (curInputValue5 >>> 20) & mask; - out[31+outOffset] = curInputValue5 >>> 26; - outOffset += 32; - } - } - - static private void unpack7(int[] out, int[] in) - { - int i, w; - int outOffset = 0; - final int mask = 127; - for(i=0, w=1; i<4; ++i, w+=7){ - int curInputValue0 = in[w]; - int curInputValue1 = in[w+1]; - int curInputValue2 = in[w+2]; - int curInputValue3 = in[w+3]; - int curInputValue4 = in[w+4]; - int curInputValue5 = in[w+5]; - int curInputValue6 = in[w+6]; - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = (curInputValue0 >>> 7) & mask; - out[2+outOffset] = (curInputValue0 >>> 14) & mask; - out[3+outOffset] = (curInputValue0 >>> 21) & mask; - out[4+outOffset] = ((curInputValue0 >>> 28) | (curInputValue1 << 4)) & mask; - out[5+outOffset] = (curInputValue1 >>> 3) & mask; - out[6+outOffset] = (curInputValue1 >>> 10) & mask; - out[7+outOffset] = (curInputValue1 >>> 17) & mask; - out[8+outOffset] = (curInputValue1 >>> 24) & mask; - out[9+outOffset] = ((curInputValue1 >>> 31) | (curInputValue2 << 1)) & mask; - out[10+outOffset] = (curInputValue2 >>> 6) & mask; - out[11+outOffset] = (curInputValue2 >>> 13) & mask; - out[12+outOffset] = (curInputValue2 >>> 20) & mask; - out[13+outOffset] = ((curInputValue2 >>> 27) | (curInputValue3 << 5)) & mask; - out[14+outOffset] = (curInputValue3 >>> 2) & mask; - out[15+outOffset] = (curInputValue3 >>> 9) & mask; - out[16+outOffset] = (curInputValue3 >>> 16) & mask; - out[17+outOffset] = (curInputValue3 >>> 23) & mask; - out[18+outOffset] = ((curInputValue3 >>> 30) | (curInputValue4 << 2)) & mask; - out[19+outOffset] = (curInputValue4 >>> 5) & mask; - out[20+outOffset] = (curInputValue4 >>> 12) & mask; - out[21+outOffset] = (curInputValue4 >>> 19) & mask; - out[22+outOffset] = ((curInputValue4 >>> 26) | (curInputValue5 << 6)) & mask; - out[23+outOffset] = (curInputValue5 >>> 1) & mask; - out[24+outOffset] = (curInputValue5 >>> 8) & mask; - out[25+outOffset] = (curInputValue5 >>> 15) & mask; - out[26+outOffset] = (curInputValue5 >>> 22) & mask; - out[27+outOffset] = ((curInputValue5 >>> 29) | (curInputValue6 << 3)) & mask; - out[28+outOffset] = (curInputValue6 >>> 4) & mask; - out[29+outOffset] = (curInputValue6 >>> 11) & mask; - out[30+outOffset] = (curInputValue6 >>> 18) & mask; - out[31+outOffset] = curInputValue6 >>> 25; - outOffset += 32; - } - } - - static private void unpack8(int[] out, int[] in) - { - int i, w; - int outOffset = 0; - final int mask = 255; - for(i=0, w=1; i<4; ++i, w+=8){ - int curInputValue0 = in[w]; - int curInputValue1 = in[w+1]; - int curInputValue2 = in[w+2]; - int curInputValue3 = in[w+3]; - int curInputValue4 = in[w+4]; - int curInputValue5 = in[w+5]; - int curInputValue6 = in[w+6]; - int curInputValue7 = in[w+7]; - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = (curInputValue0 >>> 8) & mask; - out[2+outOffset] = (curInputValue0 >>> 16) & mask; - out[3+outOffset] = curInputValue0 >>> 24; - out[4+outOffset] = curInputValue1 & mask; - out[5+outOffset] = (curInputValue1 >>> 8) & mask; - out[6+outOffset] = (curInputValue1 >>> 16) & mask; - out[7+outOffset] = curInputValue1 >>> 24; - out[8+outOffset] = curInputValue2 & mask; - out[9+outOffset] = (curInputValue2 >>> 8) & mask; - out[10+outOffset] = (curInputValue2 >>> 16) & mask; - out[11+outOffset] = curInputValue2 >>> 24; - out[12+outOffset] = curInputValue3 & mask; - out[13+outOffset] = (curInputValue3 >>> 8) & mask; - out[14+outOffset] = (curInputValue3 >>> 16) & mask; - out[15+outOffset] = curInputValue3 >>> 24; - out[16+outOffset] = curInputValue4 & mask; - out[17+outOffset] = (curInputValue4 >>> 8) & mask; - out[18+outOffset] = (curInputValue4 >>> 16) & mask; - out[19+outOffset] = curInputValue4 >>> 24; - out[20+outOffset] = curInputValue5 & mask; - out[21+outOffset] = (curInputValue5 >>> 8) & mask; - out[22+outOffset] = (curInputValue5 >>> 16) & mask; - out[23+outOffset] = curInputValue5 >>> 24; - out[24+outOffset] = curInputValue6 & mask; - out[25+outOffset] = (curInputValue6 >>> 8) & mask; - out[26+outOffset] = (curInputValue6 >>> 16) & mask; - out[27+outOffset] = curInputValue6 >>> 24; - out[28+outOffset] = curInputValue7 & mask; - out[29+outOffset] = (curInputValue7 >>> 8) & mask; - out[30+outOffset] = (curInputValue7 >>> 16) & mask; - out[31+outOffset] = curInputValue7 >>> 24; - outOffset += 32; - } - } - - static private void unpack9(int[] out, int[] in) - { - int i, w; - int outOffset = 0; - final int mask = 511; - for(i=0, w=1; i<4; ++i, w+=9){ - int curInputValue0 = in[w]; - int curInputValue1 = in[w+1]; - int curInputValue2 = in[w+2]; - int curInputValue3 = in[w+3]; - int curInputValue4 = in[w+4]; - int curInputValue5 = in[w+5]; - int curInputValue6 = in[w+6]; - int curInputValue7 = in[w+7]; - int curInputValue8 = in[w+8]; - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = (curInputValue0 >>> 9) & mask; - out[2+outOffset] = (curInputValue0 >>> 18) & mask; - out[3+outOffset] = ((curInputValue0 >>> 27) | (curInputValue1 << 5)) & mask; - out[4+outOffset] = (curInputValue1 >>> 4) & mask; - out[5+outOffset] = (curInputValue1 >>> 13) & mask; - out[6+outOffset] = (curInputValue1 >>> 22) & mask; - out[7+outOffset] = ((curInputValue1 >>> 31) | (curInputValue2 << 1)) & mask; - out[8+outOffset] = (curInputValue2 >>> 8) & mask; - out[9+outOffset] = (curInputValue2 >>> 17) & mask; - out[10+outOffset] = ((curInputValue2 >>> 26) | (curInputValue3 << 6)) & mask; - out[11+outOffset] = (curInputValue3 >>> 3) & mask; - out[12+outOffset] = (curInputValue3 >>> 12) & mask; - out[13+outOffset] = (curInputValue3 >>> 21) & mask; - out[14+outOffset] = ((curInputValue3 >>> 30) | (curInputValue4 << 2)) & mask; - out[15+outOffset] = (curInputValue4 >>> 7) & mask; - out[16+outOffset] = (curInputValue4 >>> 16) & mask; - out[17+outOffset] = ((curInputValue4 >>> 25) | (curInputValue5 << 7)) & mask; - out[18+outOffset] = (curInputValue5 >>> 2) & mask; - out[19+outOffset] = (curInputValue5 >>> 11) & mask; - out[20+outOffset] = (curInputValue5 >>> 20) & mask; - out[21+outOffset] = ((curInputValue5 >>> 29) | (curInputValue6 << 3)) & mask; - out[22+outOffset] = (curInputValue6 >>> 6) & mask; - out[23+outOffset] = (curInputValue6 >>> 15) & mask; - out[24+outOffset] = ((curInputValue6 >>> 24) | (curInputValue7 << 8)) & mask; - out[25+outOffset] = (curInputValue7 >>> 1) & mask; - out[26+outOffset] = (curInputValue7 >>> 10) & mask; - out[27+outOffset] = (curInputValue7 >>> 19) & mask; - out[28+outOffset] = ((curInputValue7 >>> 28) | (curInputValue8 << 4)) & mask; - out[29+outOffset] = (curInputValue8 >>> 5) & mask; - out[30+outOffset] = (curInputValue8 >>> 14) & mask; - out[31+outOffset] = curInputValue8 >>> 23; - outOffset += 32; - } - } - - static private void unpack10(int[] out, int[] in) - { - int i, w; - int outOffset = 0; - final int mask = 1023; - for(i=0, w=1; i<4; ++i, w+=10){ - int curInputValue0 = in[w]; - int curInputValue1 = in[w+1]; - int curInputValue2 = in[w+2]; - int curInputValue3 = in[w+3]; - int curInputValue4 = in[w+4]; - int curInputValue5 = in[w+5]; - int curInputValue6 = in[w+6]; - int curInputValue7 = in[w+7]; - int curInputValue8 = in[w+8]; - int curInputValue9 = in[w+9]; - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = (curInputValue0 >>> 10) & mask; - out[2+outOffset] = (curInputValue0 >>> 20) & mask; - out[3+outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) & mask; - out[4+outOffset] = (curInputValue1 >>> 8) & mask; - out[5+outOffset] = (curInputValue1 >>> 18) & mask; - out[6+outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; - out[7+outOffset] = (curInputValue2 >>> 6) & mask; - out[8+outOffset] = (curInputValue2 >>> 16) & mask; - out[9+outOffset] = ((curInputValue2 >>> 26) | (curInputValue3 << 6)) & mask; - out[10+outOffset] = (curInputValue3 >>> 4) & mask; - out[11+outOffset] = (curInputValue3 >>> 14) & mask; - out[12+outOffset] = ((curInputValue3 >>> 24) | (curInputValue4 << 8)) & mask; - out[13+outOffset] = (curInputValue4 >>> 2) & mask; - out[14+outOffset] = (curInputValue4 >>> 12) & mask; - out[15+outOffset] = curInputValue4 >>> 22; - out[16+outOffset] = curInputValue5 & mask; - out[17+outOffset] = (curInputValue5 >>> 10) & mask; - out[18+outOffset] = (curInputValue5 >>> 20) & mask; - out[19+outOffset] = ((curInputValue5 >>> 30) | (curInputValue6 << 2)) & mask; - out[20+outOffset] = (curInputValue6 >>> 8) & mask; - out[21+outOffset] = (curInputValue6 >>> 18) & mask; - out[22+outOffset] = ((curInputValue6 >>> 28) | (curInputValue7 << 4)) & mask; - out[23+outOffset] = (curInputValue7 >>> 6) & mask; - out[24+outOffset] = (curInputValue7 >>> 16) & mask; - out[25+outOffset] = ((curInputValue7 >>> 26) | (curInputValue8 << 6)) & mask; - out[26+outOffset] = (curInputValue8 >>> 4) & mask; - out[27+outOffset] = (curInputValue8 >>> 14) & mask; - out[28+outOffset] = ((curInputValue8 >>> 24) | (curInputValue9 << 8)) & mask; - out[29+outOffset] = (curInputValue9 >>> 2) & mask; - out[30+outOffset] = (curInputValue9 >>> 12) & mask; - out[31+outOffset] = curInputValue9 >>> 22; - outOffset += 32; - } - } - - static private void unpack11(int[] out, int[] in) - { - int i, w; - int outOffset = 0; - final int mask = 2047; - for(i=0, w=1; i<4; ++i, w+=11){ - int curInputValue0 = in[w]; - int curInputValue1 = in[w+1]; - int curInputValue2 = in[w+2]; - int curInputValue3 = in[w+3]; - int curInputValue4 = in[w+4]; - int curInputValue5 = in[w+5]; - int curInputValue6 = in[w+6]; - int curInputValue7 = in[w+7]; - int curInputValue8 = in[w+8]; - int curInputValue9 = in[w+9]; - int curInputValue10 = in[w+10]; - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = (curInputValue0 >>> 11) & mask; - out[2+outOffset] = ((curInputValue0 >>> 22) | (curInputValue1 << 10)) & mask; - out[3+outOffset] = (curInputValue1 >>> 1) & mask; - out[4+outOffset] = (curInputValue1 >>> 12) & mask; - out[5+outOffset] = ((curInputValue1 >>> 23) | (curInputValue2 << 9)) & mask; - out[6+outOffset] = (curInputValue2 >>> 2) & mask; - out[7+outOffset] = (curInputValue2 >>> 13) & mask; - out[8+outOffset] = ((curInputValue2 >>> 24) | (curInputValue3 << 8)) & mask; - out[9+outOffset] = (curInputValue3 >>> 3) & mask; - out[10+outOffset] = (curInputValue3 >>> 14) & mask; - out[11+outOffset] = ((curInputValue3 >>> 25) | (curInputValue4 << 7)) & mask; - out[12+outOffset] = (curInputValue4 >>> 4) & mask; - out[13+outOffset] = (curInputValue4 >>> 15) & mask; - out[14+outOffset] = ((curInputValue4 >>> 26) | (curInputValue5 << 6)) & mask; - out[15+outOffset] = (curInputValue5 >>> 5) & mask; - out[16+outOffset] = (curInputValue5 >>> 16) & mask; - out[17+outOffset] = ((curInputValue5 >>> 27) | (curInputValue6 << 5)) & mask; - out[18+outOffset] = (curInputValue6 >>> 6) & mask; - out[19+outOffset] = (curInputValue6 >>> 17) & mask; - out[20+outOffset] = ((curInputValue6 >>> 28) | (curInputValue7 << 4)) & mask; - out[21+outOffset] = (curInputValue7 >>> 7) & mask; - out[22+outOffset] = (curInputValue7 >>> 18) & mask; - out[23+outOffset] = ((curInputValue7 >>> 29) | (curInputValue8 << 3)) & mask; - out[24+outOffset] = (curInputValue8 >>> 8) & mask; - out[25+outOffset] = (curInputValue8 >>> 19) & mask; - out[26+outOffset] = ((curInputValue8 >>> 30) | (curInputValue9 << 2)) & mask; - out[27+outOffset] = (curInputValue9 >>> 9) & mask; - out[28+outOffset] = (curInputValue9 >>> 20) & mask; - out[29+outOffset] = ((curInputValue9 >>> 31) | (curInputValue10 << 1)) & mask; - out[30+outOffset] = (curInputValue10 >>> 10) & mask; - out[31+outOffset] = curInputValue10 >>> 21; - outOffset += 32; - } - } - - static private void unpack12(int[] out, int[] in) - { - int i, w; - int outOffset = 0; - final int mask = 4095; - for(i=0, w=1; i<4; ++i, w+=12){ - int curInputValue0 = in[w]; - int curInputValue1 = in[w+1]; - int curInputValue2 = in[w+2]; - int curInputValue3 = in[w+3]; - int curInputValue4 = in[w+4]; - int curInputValue5 = in[w+5]; - int curInputValue6 = in[w+6]; - int curInputValue7 = in[w+7]; - int curInputValue8 = in[w+8]; - int curInputValue9 = in[w+9]; - int curInputValue10 = in[w+10]; - int curInputValue11 = in[w+11]; - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = (curInputValue0 >>> 12) & mask; - out[2+outOffset] = ((curInputValue0 >>> 24) | (curInputValue1 << 8)) & mask; - out[3+outOffset] = (curInputValue1 >>> 4) & mask; - out[4+outOffset] = (curInputValue1 >>> 16) & mask; - out[5+outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; - out[6+outOffset] = (curInputValue2 >>> 8) & mask; - out[7+outOffset] = curInputValue2 >>> 20; - out[8+outOffset] = curInputValue3 & mask; - out[9+outOffset] = (curInputValue3 >>> 12) & mask; - out[10+outOffset] = ((curInputValue3 >>> 24) | (curInputValue4 << 8)) & mask; - out[11+outOffset] = (curInputValue4 >>> 4) & mask; - out[12+outOffset] = (curInputValue4 >>> 16) & mask; - out[13+outOffset] = ((curInputValue4 >>> 28) | (curInputValue5 << 4)) & mask; - out[14+outOffset] = (curInputValue5 >>> 8) & mask; - out[15+outOffset] = curInputValue5 >>> 20; - out[16+outOffset] = curInputValue6 & mask; - out[17+outOffset] = (curInputValue6 >>> 12) & mask; - out[18+outOffset] = ((curInputValue6 >>> 24) | (curInputValue7 << 8)) & mask; - out[19+outOffset] = (curInputValue7 >>> 4) & mask; - out[20+outOffset] = (curInputValue7 >>> 16) & mask; - out[21+outOffset] = ((curInputValue7 >>> 28) | (curInputValue8 << 4)) & mask; - out[22+outOffset] = (curInputValue8 >>> 8) & mask; - out[23+outOffset] = curInputValue8 >>> 20; - out[24+outOffset] = curInputValue9 & mask; - out[25+outOffset] = (curInputValue9 >>> 12) & mask; - out[26+outOffset] = ((curInputValue9 >>> 24) | (curInputValue10 << 8)) & mask; - out[27+outOffset] = (curInputValue10 >>> 4) & mask; - out[28+outOffset] = (curInputValue10 >>> 16) & mask; - out[29+outOffset] = ((curInputValue10 >>> 28) | (curInputValue11 << 4)) & mask; - out[30+outOffset] = (curInputValue11 >>> 8) & mask; - out[31+outOffset] = curInputValue11 >>> 20; - outOffset += 32; - } - } - - static private void unpack13(int[] out, int[] in) - { - int i, w; - int outOffset = 0; - final int mask = 8191; - for(i=0, w=1; i<4; ++i, w+=13){ - int curInputValue0 = in[w]; - int curInputValue1 = in[w+1]; - int curInputValue2 = in[w+2]; - int curInputValue3 = in[w+3]; - int curInputValue4 = in[w+4]; - int curInputValue5 = in[w+5]; - int curInputValue6 = in[w+6]; - int curInputValue7 = in[w+7]; - int curInputValue8 = in[w+8]; - int curInputValue9 = in[w+9]; - int curInputValue10 = in[w+10]; - int curInputValue11 = in[w+11]; - int curInputValue12 = in[w+12]; - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = (curInputValue0 >>> 13) & mask; - out[2+outOffset] = ((curInputValue0 >>> 26) | (curInputValue1 << 6)) & mask; - out[3+outOffset] = (curInputValue1 >>> 7) & mask; - out[4+outOffset] = ((curInputValue1 >>> 20) | (curInputValue2 << 12)) & mask; - out[5+outOffset] = (curInputValue2 >>> 1) & mask; - out[6+outOffset] = (curInputValue2 >>> 14) & mask; - out[7+outOffset] = ((curInputValue2 >>> 27) | (curInputValue3 << 5)) & mask; - out[8+outOffset] = (curInputValue3 >>> 8) & mask; - out[9+outOffset] = ((curInputValue3 >>> 21) | (curInputValue4 << 11)) & mask; - out[10+outOffset] = (curInputValue4 >>> 2) & mask; - out[11+outOffset] = (curInputValue4 >>> 15) & mask; - out[12+outOffset] = ((curInputValue4 >>> 28) | (curInputValue5 << 4)) & mask; - out[13+outOffset] = (curInputValue5 >>> 9) & mask; - out[14+outOffset] = ((curInputValue5 >>> 22) | (curInputValue6 << 10)) & mask; - out[15+outOffset] = (curInputValue6 >>> 3) & mask; - out[16+outOffset] = (curInputValue6 >>> 16) & mask; - out[17+outOffset] = ((curInputValue6 >>> 29) | (curInputValue7 << 3)) & mask; - out[18+outOffset] = (curInputValue7 >>> 10) & mask; - out[19+outOffset] = ((curInputValue7 >>> 23) | (curInputValue8 << 9)) & mask; - out[20+outOffset] = (curInputValue8 >>> 4) & mask; - out[21+outOffset] = (curInputValue8 >>> 17) & mask; - out[22+outOffset] = ((curInputValue8 >>> 30) | (curInputValue9 << 2)) & mask; - out[23+outOffset] = (curInputValue9 >>> 11) & mask; - out[24+outOffset] = ((curInputValue9 >>> 24) | (curInputValue10 << 8)) & mask; - out[25+outOffset] = (curInputValue10 >>> 5) & mask; - out[26+outOffset] = (curInputValue10 >>> 18) & mask; - out[27+outOffset] = ((curInputValue10 >>> 31) | (curInputValue11 << 1)) & mask; - out[28+outOffset] = (curInputValue11 >>> 12) & mask; - out[29+outOffset] = ((curInputValue11 >>> 25) | (curInputValue12 << 7)) & mask; - out[30+outOffset] = (curInputValue12 >>> 6) & mask; - out[31+outOffset] = curInputValue12 >>> 19; - outOffset += 32; - } - } - - static private void unpack16(int[] out, int[] in) - { - int i, w; - int outOffset = 0; - final int mask = 65535; - for(i=0, w=1; i<4; ++i, w+=16){ - int curInputValue0 = in[w]; - int curInputValue1 = in[w+1]; - int curInputValue2 = in[w+2]; - int curInputValue3 = in[w+3]; - int curInputValue4 = in[w+4]; - int curInputValue5 = in[w+5]; - int curInputValue6 = in[w+6]; - int curInputValue7 = in[w+7]; - int curInputValue8 = in[w+8]; - int curInputValue9 = in[w+9]; - int curInputValue10 = in[w+10]; - int curInputValue11 = in[w+11]; - int curInputValue12 = in[w+12]; - int curInputValue13 = in[w+13]; - int curInputValue14 = in[w+14]; - int curInputValue15 = in[w+15]; - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = curInputValue0 >>> 16; - out[2+outOffset] = curInputValue1 & mask; - out[3+outOffset] = curInputValue1 >>> 16; - out[4+outOffset] = curInputValue2 & mask; - out[5+outOffset] = curInputValue2 >>> 16; - out[6+outOffset] = curInputValue3 & mask; - out[7+outOffset] = curInputValue3 >>> 16; - out[8+outOffset] = curInputValue4 & mask; - out[9+outOffset] = curInputValue4 >>> 16; - out[10+outOffset] = curInputValue5 & mask; - out[11+outOffset] = curInputValue5 >>> 16; - out[12+outOffset] = curInputValue6 & mask; - out[13+outOffset] = curInputValue6 >>> 16; - out[14+outOffset] = curInputValue7 & mask; - out[15+outOffset] = curInputValue7 >>> 16; - out[16+outOffset] = curInputValue8 & mask; - out[17+outOffset] = curInputValue8 >>> 16; - out[18+outOffset] = curInputValue9 & mask; - out[19+outOffset] = curInputValue9 >>> 16; - out[20+outOffset] = curInputValue10 & mask; - out[21+outOffset] = curInputValue10 >>> 16; - out[22+outOffset] = curInputValue11 & mask; - out[23+outOffset] = curInputValue11 >>> 16; - out[24+outOffset] = curInputValue12 & mask; - out[25+outOffset] = curInputValue12 >>> 16; - out[26+outOffset] = curInputValue13 & mask; - out[27+outOffset] = curInputValue13 >>> 16; - out[28+outOffset] = curInputValue14 & mask; - out[29+outOffset] = curInputValue14 >>> 16; - out[30+outOffset] = curInputValue15 & mask; - out[31+outOffset] = curInputValue15 >>> 16; - outOffset += 32; - } - } - - static private void unpack20(int[] out, int[] in) - { - int i, w; - int outOffset = 0; - final int mask = 1048575; - for(i=0, w=1; i<4; ++i, w+=20){ - int curInputValue0 = in[w]; - int curInputValue1 = in[w+1]; - int curInputValue2 = in[w+2]; - int curInputValue3 = in[w+3]; - int curInputValue4 = in[w+4]; - int curInputValue5 = in[w+5]; - int curInputValue6 = in[w+6]; - int curInputValue7 = in[w+7]; - int curInputValue8 = in[w+8]; - int curInputValue9 = in[w+9]; - int curInputValue10 = in[w+10]; - int curInputValue11 = in[w+11]; - int curInputValue12 = in[w+12]; - int curInputValue13 = in[w+13]; - int curInputValue14 = in[w+14]; - int curInputValue15 = in[w+15]; - int curInputValue16 = in[w+16]; - int curInputValue17 = in[w+17]; - int curInputValue18 = in[w+18]; - int curInputValue19 = in[w+19]; - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = ((curInputValue0 >>> 20) | (curInputValue1 << 12)) & mask; - out[2+outOffset] = (curInputValue1 >>> 8) & mask; - out[3+outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; - out[4+outOffset] = ((curInputValue2 >>> 16) | (curInputValue3 << 16)) & mask; - out[5+outOffset] = (curInputValue3 >>> 4) & mask; - out[6+outOffset] = ((curInputValue3 >>> 24) | (curInputValue4 << 8)) & mask; - out[7+outOffset] = curInputValue4 >>> 12; - out[8+outOffset] = curInputValue5 & mask; - out[9+outOffset] = ((curInputValue5 >>> 20) | (curInputValue6 << 12)) & mask; - out[10+outOffset] = (curInputValue6 >>> 8) & mask; - out[11+outOffset] = ((curInputValue6 >>> 28) | (curInputValue7 << 4)) & mask; - out[12+outOffset] = ((curInputValue7 >>> 16) | (curInputValue8 << 16)) & mask; - out[13+outOffset] = (curInputValue8 >>> 4) & mask; - out[14+outOffset] = ((curInputValue8 >>> 24) | (curInputValue9 << 8)) & mask; - out[15+outOffset] = curInputValue9 >>> 12; - out[16+outOffset] = curInputValue10 & mask; - out[17+outOffset] = ((curInputValue10 >>> 20) | (curInputValue11 << 12)) & mask; - out[18+outOffset] = (curInputValue11 >>> 8) & mask; - out[19+outOffset] = ((curInputValue11 >>> 28) | (curInputValue12 << 4)) & mask; - out[20+outOffset] = ((curInputValue12 >>> 16) | (curInputValue13 << 16)) & mask; - out[21+outOffset] = (curInputValue13 >>> 4) & mask; - out[22+outOffset] = ((curInputValue13 >>> 24) | (curInputValue14 << 8)) & mask; - out[23+outOffset] = curInputValue14 >>> 12; - out[24+outOffset] = curInputValue15 & mask; - out[25+outOffset] = ((curInputValue15 >>> 20) | (curInputValue16 << 12)) & mask; - out[26+outOffset] = (curInputValue16 >>> 8) & mask; - out[27+outOffset] = ((curInputValue16 >>> 28) | (curInputValue17 << 4)) & mask; - out[28+outOffset] = ((curInputValue17 >>> 16) | (curInputValue18 << 16)) & mask; - out[29+outOffset] = (curInputValue18 >>> 4) & mask; - out[30+outOffset] = ((curInputValue18 >>> 24) | (curInputValue19 << 8)) & mask; - out[31+outOffset] = curInputValue19 >>> 12; - outOffset += 32; - } - } - - static private void unpack28(int[] out, int[] in) - { - int i, w; - int outOffset = 0; - final int mask = 268435455; - for(i=0, w=1; i<4; ++i, w+=28){ - int curInputValue0 = in[w]; - int curInputValue1 = in[w+1]; - int curInputValue2 = in[w+2]; - int curInputValue3 = in[w+3]; - int curInputValue4 = in[w+4]; - int curInputValue5 = in[w+5]; - int curInputValue6 = in[w+6]; - int curInputValue7 = in[w+7]; - int curInputValue8 = in[w+8]; - int curInputValue9 = in[w+9]; - int curInputValue10 = in[w+10]; - int curInputValue11 = in[w+11]; - int curInputValue12 = in[w+12]; - int curInputValue13 = in[w+13]; - int curInputValue14 = in[w+14]; - int curInputValue15 = in[w+15]; - int curInputValue16 = in[w+16]; - int curInputValue17 = in[w+17]; - int curInputValue18 = in[w+18]; - int curInputValue19 = in[w+19]; - int curInputValue20 = in[w+20]; - int curInputValue21 = in[w+21]; - int curInputValue22 = in[w+22]; - int curInputValue23 = in[w+23]; - int curInputValue24 = in[w+24]; - int curInputValue25 = in[w+25]; - int curInputValue26 = in[w+26]; - int curInputValue27 = in[w+27]; - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = ((curInputValue0 >>> 28) | (curInputValue1 << 4)) & mask; - out[2+outOffset] = ((curInputValue1 >>> 24) | (curInputValue2 << 8)) & mask; - out[3+outOffset] = ((curInputValue2 >>> 20) | (curInputValue3 << 12)) & mask; - out[4+outOffset] = ((curInputValue3 >>> 16) | (curInputValue4 << 16)) & mask; - out[5+outOffset] = ((curInputValue4 >>> 12) | (curInputValue5 << 20)) & mask; - out[6+outOffset] = ((curInputValue5 >>> 8) | (curInputValue6 << 24)) & mask; - out[7+outOffset] = curInputValue6 >>> 4; - out[8+outOffset] = curInputValue7 & mask; - out[9+outOffset] = ((curInputValue7 >>> 28) | (curInputValue8 << 4)) & mask; - out[10+outOffset] = ((curInputValue8 >>> 24) | (curInputValue9 << 8)) & mask; - out[11+outOffset] = ((curInputValue9 >>> 20) | (curInputValue10 << 12)) & mask; - out[12+outOffset] = ((curInputValue10 >>> 16) | (curInputValue11 << 16)) & mask; - out[13+outOffset] = ((curInputValue11 >>> 12) | (curInputValue12 << 20)) & mask; - out[14+outOffset] = ((curInputValue12 >>> 8) | (curInputValue13 << 24)) & mask; - out[15+outOffset] = curInputValue13 >>> 4; - out[16+outOffset] = curInputValue14 & mask; - out[17+outOffset] = ((curInputValue14 >>> 28) | (curInputValue15 << 4)) & mask; - out[18+outOffset] = ((curInputValue15 >>> 24) | (curInputValue16 << 8)) & mask; - out[19+outOffset] = ((curInputValue16 >>> 20) | (curInputValue17 << 12)) & mask; - out[20+outOffset] = ((curInputValue17 >>> 16) | (curInputValue18 << 16)) & mask; - out[21+outOffset] = ((curInputValue18 >>> 12) | (curInputValue19 << 20)) & mask; - out[22+outOffset] = ((curInputValue19 >>> 8) | (curInputValue20 << 24)) & mask; - out[23+outOffset] = curInputValue20 >>> 4; - out[24+outOffset] = curInputValue21 & mask; - out[25+outOffset] = ((curInputValue21 >>> 28) | (curInputValue22 << 4)) & mask; - out[26+outOffset] = ((curInputValue22 >>> 24) | (curInputValue23 << 8)) & mask; - out[27+outOffset] = ((curInputValue23 >>> 20) | (curInputValue24 << 12)) & mask; - out[28+outOffset] = ((curInputValue24 >>> 16) | (curInputValue25 << 16)) & mask; - out[29+outOffset] = ((curInputValue25 >>> 12) | (curInputValue26 << 20)) & mask; - out[30+outOffset] = ((curInputValue26 >>> 8) | (curInputValue27 << 24)) & mask; - out[31+outOffset] = curInputValue27 >>> 4; - outOffset += 32; - } - } } diff --git a/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128WIthIntBuffer.java b/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128WIthIntBuffer.java index ef5b6e1..59ac09c 100644 --- a/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128WIthIntBuffer.java +++ b/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128WIthIntBuffer.java @@ -10,846 +10,864 @@ import java.nio.IntBuffer; /** - * PForDeltaUnpack128WIthIntBuffer is almost the same as PForDeltaUnpack128, except that it use IntBuffer as input instead of int[]. + * PForDeltaUnpack128WIthIntBuffer is almost the same as PForDeltaUnpack128, except that it use IntBuffer as input instead of int[]. */ -public class PForDeltaUnpack128WIthIntBuffer{ - - static public void unpack(int[] out, IntBuffer in, int bits) { - switch (bits) { - case 0: unpack0(out, in); break; - case 1: unpack1(out, in); break; - case 2: unpack2(out, in); break; - case 3: unpack3(out, in); break; - case 4: unpack4(out, in); break; - case 5: unpack5(out, in); break; - case 6: unpack6(out, in); break; - case 7: unpack7(out, in); break; - case 8: unpack8(out, in); break; - case 9: unpack9(out, in); break; - case 10: unpack10(out, in); break; - case 11: unpack11(out, in); break; - case 12: unpack12(out, in); break; - case 13: unpack13(out, in); break; - case 16: unpack16(out, in); break; - case 20: unpack20(out, in); break; - case 28: unpack28(out, in); break; - default: break; +public class PForDeltaUnpack128WIthIntBuffer { + + static public void unpack(int[] out, IntBuffer in, int bits) { + switch (bits) { + case 0: + unpack0(out, in); + break; + case 1: + unpack1(out, in); + break; + case 2: + unpack2(out, in); + break; + case 3: + unpack3(out, in); + break; + case 4: + unpack4(out, in); + break; + case 5: + unpack5(out, in); + break; + case 6: + unpack6(out, in); + break; + case 7: + unpack7(out, in); + break; + case 8: + unpack8(out, in); + break; + case 9: + unpack9(out, in); + break; + case 10: + unpack10(out, in); + break; + case 11: + unpack11(out, in); + break; + case 12: + unpack12(out, in); + break; + case 13: + unpack13(out, in); + break; + case 16: + unpack16(out, in); + break; + case 20: + unpack20(out, in); + break; + case 28: + unpack28(out, in); + break; + default: + break; + } + } + + static private void unpack0(int[] out, IntBuffer in) { + } + + static private void unpack1(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 1; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 1) & mask; + out[2 + outOffset] = (curInputValue0 >>> 2) & mask; + out[3 + outOffset] = (curInputValue0 >>> 3) & mask; + out[4 + outOffset] = (curInputValue0 >>> 4) & mask; + out[5 + outOffset] = (curInputValue0 >>> 5) & mask; + out[6 + outOffset] = (curInputValue0 >>> 6) & mask; + out[7 + outOffset] = (curInputValue0 >>> 7) & mask; + out[8 + outOffset] = (curInputValue0 >>> 8) & mask; + out[9 + outOffset] = (curInputValue0 >>> 9) & mask; + out[10 + outOffset] = (curInputValue0 >>> 10) & mask; + out[11 + outOffset] = (curInputValue0 >>> 11) & mask; + out[12 + outOffset] = (curInputValue0 >>> 12) & mask; + out[13 + outOffset] = (curInputValue0 >>> 13) & mask; + out[14 + outOffset] = (curInputValue0 >>> 14) & mask; + out[15 + outOffset] = (curInputValue0 >>> 15) & mask; + out[16 + outOffset] = (curInputValue0 >>> 16) & mask; + out[17 + outOffset] = (curInputValue0 >>> 17) & mask; + out[18 + outOffset] = (curInputValue0 >>> 18) & mask; + out[19 + outOffset] = (curInputValue0 >>> 19) & mask; + out[20 + outOffset] = (curInputValue0 >>> 20) & mask; + out[21 + outOffset] = (curInputValue0 >>> 21) & mask; + out[22 + outOffset] = (curInputValue0 >>> 22) & mask; + out[23 + outOffset] = (curInputValue0 >>> 23) & mask; + out[24 + outOffset] = (curInputValue0 >>> 24) & mask; + out[25 + outOffset] = (curInputValue0 >>> 25) & mask; + out[26 + outOffset] = (curInputValue0 >>> 26) & mask; + out[27 + outOffset] = (curInputValue0 >>> 27) & mask; + out[28 + outOffset] = (curInputValue0 >>> 28) & mask; + out[29 + outOffset] = (curInputValue0 >>> 29) & mask; + out[30 + outOffset] = (curInputValue0 >>> 30) & mask; + out[31 + outOffset] = curInputValue0 >>> 31; + outOffset += 32; + } + } + + static private void unpack2(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 3; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 2) & mask; + out[2 + outOffset] = (curInputValue0 >>> 4) & mask; + out[3 + outOffset] = (curInputValue0 >>> 6) & mask; + out[4 + outOffset] = (curInputValue0 >>> 8) & mask; + out[5 + outOffset] = (curInputValue0 >>> 10) & mask; + out[6 + outOffset] = (curInputValue0 >>> 12) & mask; + out[7 + outOffset] = (curInputValue0 >>> 14) & mask; + out[8 + outOffset] = (curInputValue0 >>> 16) & mask; + out[9 + outOffset] = (curInputValue0 >>> 18) & mask; + out[10 + outOffset] = (curInputValue0 >>> 20) & mask; + out[11 + outOffset] = (curInputValue0 >>> 22) & mask; + out[12 + outOffset] = (curInputValue0 >>> 24) & mask; + out[13 + outOffset] = (curInputValue0 >>> 26) & mask; + out[14 + outOffset] = (curInputValue0 >>> 28) & mask; + out[15 + outOffset] = curInputValue0 >>> 30; + out[16 + outOffset] = curInputValue1 & mask; + out[17 + outOffset] = (curInputValue1 >>> 2) & mask; + out[18 + outOffset] = (curInputValue1 >>> 4) & mask; + out[19 + outOffset] = (curInputValue1 >>> 6) & mask; + out[20 + outOffset] = (curInputValue1 >>> 8) & mask; + out[21 + outOffset] = (curInputValue1 >>> 10) & mask; + out[22 + outOffset] = (curInputValue1 >>> 12) & mask; + out[23 + outOffset] = (curInputValue1 >>> 14) & mask; + out[24 + outOffset] = (curInputValue1 >>> 16) & mask; + out[25 + outOffset] = (curInputValue1 >>> 18) & mask; + out[26 + outOffset] = (curInputValue1 >>> 20) & mask; + out[27 + outOffset] = (curInputValue1 >>> 22) & mask; + out[28 + outOffset] = (curInputValue1 >>> 24) & mask; + out[29 + outOffset] = (curInputValue1 >>> 26) & mask; + out[30 + outOffset] = (curInputValue1 >>> 28) & mask; + out[31 + outOffset] = curInputValue1 >>> 30; + outOffset += 32; + } + } + + static private void unpack3(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 7; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + int curInputValue2 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 3) & mask; + out[2 + outOffset] = (curInputValue0 >>> 6) & mask; + out[3 + outOffset] = (curInputValue0 >>> 9) & mask; + out[4 + outOffset] = (curInputValue0 >>> 12) & mask; + out[5 + outOffset] = (curInputValue0 >>> 15) & mask; + out[6 + outOffset] = (curInputValue0 >>> 18) & mask; + out[7 + outOffset] = (curInputValue0 >>> 21) & mask; + out[8 + outOffset] = (curInputValue0 >>> 24) & mask; + out[9 + outOffset] = (curInputValue0 >>> 27) & mask; + out[10 + outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) & mask; + out[11 + outOffset] = (curInputValue1 >>> 1) & mask; + out[12 + outOffset] = (curInputValue1 >>> 4) & mask; + out[13 + outOffset] = (curInputValue1 >>> 7) & mask; + out[14 + outOffset] = (curInputValue1 >>> 10) & mask; + out[15 + outOffset] = (curInputValue1 >>> 13) & mask; + out[16 + outOffset] = (curInputValue1 >>> 16) & mask; + out[17 + outOffset] = (curInputValue1 >>> 19) & mask; + out[18 + outOffset] = (curInputValue1 >>> 22) & mask; + out[19 + outOffset] = (curInputValue1 >>> 25) & mask; + out[20 + outOffset] = (curInputValue1 >>> 28) & mask; + out[21 + outOffset] = ((curInputValue1 >>> 31) | (curInputValue2 << 1)) & mask; + out[22 + outOffset] = (curInputValue2 >>> 2) & mask; + out[23 + outOffset] = (curInputValue2 >>> 5) & mask; + out[24 + outOffset] = (curInputValue2 >>> 8) & mask; + out[25 + outOffset] = (curInputValue2 >>> 11) & mask; + out[26 + outOffset] = (curInputValue2 >>> 14) & mask; + out[27 + outOffset] = (curInputValue2 >>> 17) & mask; + out[28 + outOffset] = (curInputValue2 >>> 20) & mask; + out[29 + outOffset] = (curInputValue2 >>> 23) & mask; + out[30 + outOffset] = (curInputValue2 >>> 26) & mask; + out[31 + outOffset] = curInputValue2 >>> 29; + outOffset += 32; + } + } + + static private void unpack4(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 15; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + int curInputValue2 = in.get(); + int curInputValue3 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 4) & mask; + out[2 + outOffset] = (curInputValue0 >>> 8) & mask; + out[3 + outOffset] = (curInputValue0 >>> 12) & mask; + out[4 + outOffset] = (curInputValue0 >>> 16) & mask; + out[5 + outOffset] = (curInputValue0 >>> 20) & mask; + out[6 + outOffset] = (curInputValue0 >>> 24) & mask; + out[7 + outOffset] = curInputValue0 >>> 28; + out[8 + outOffset] = curInputValue1 & mask; + out[9 + outOffset] = (curInputValue1 >>> 4) & mask; + out[10 + outOffset] = (curInputValue1 >>> 8) & mask; + out[11 + outOffset] = (curInputValue1 >>> 12) & mask; + out[12 + outOffset] = (curInputValue1 >>> 16) & mask; + out[13 + outOffset] = (curInputValue1 >>> 20) & mask; + out[14 + outOffset] = (curInputValue1 >>> 24) & mask; + out[15 + outOffset] = curInputValue1 >>> 28; + out[16 + outOffset] = curInputValue2 & mask; + out[17 + outOffset] = (curInputValue2 >>> 4) & mask; + out[18 + outOffset] = (curInputValue2 >>> 8) & mask; + out[19 + outOffset] = (curInputValue2 >>> 12) & mask; + out[20 + outOffset] = (curInputValue2 >>> 16) & mask; + out[21 + outOffset] = (curInputValue2 >>> 20) & mask; + out[22 + outOffset] = (curInputValue2 >>> 24) & mask; + out[23 + outOffset] = curInputValue2 >>> 28; + out[24 + outOffset] = curInputValue3 & mask; + out[25 + outOffset] = (curInputValue3 >>> 4) & mask; + out[26 + outOffset] = (curInputValue3 >>> 8) & mask; + out[27 + outOffset] = (curInputValue3 >>> 12) & mask; + out[28 + outOffset] = (curInputValue3 >>> 16) & mask; + out[29 + outOffset] = (curInputValue3 >>> 20) & mask; + out[30 + outOffset] = (curInputValue3 >>> 24) & mask; + out[31 + outOffset] = curInputValue3 >>> 28; + outOffset += 32; + } + } + + static private void unpack5(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 31; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + int curInputValue2 = in.get(); + int curInputValue3 = in.get(); + int curInputValue4 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 5) & mask; + out[2 + outOffset] = (curInputValue0 >>> 10) & mask; + out[3 + outOffset] = (curInputValue0 >>> 15) & mask; + out[4 + outOffset] = (curInputValue0 >>> 20) & mask; + out[5 + outOffset] = (curInputValue0 >>> 25) & mask; + out[6 + outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) & mask; + out[7 + outOffset] = (curInputValue1 >>> 3) & mask; + out[8 + outOffset] = (curInputValue1 >>> 8) & mask; + out[9 + outOffset] = (curInputValue1 >>> 13) & mask; + out[10 + outOffset] = (curInputValue1 >>> 18) & mask; + out[11 + outOffset] = (curInputValue1 >>> 23) & mask; + out[12 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; + out[13 + outOffset] = (curInputValue2 >>> 1) & mask; + out[14 + outOffset] = (curInputValue2 >>> 6) & mask; + out[15 + outOffset] = (curInputValue2 >>> 11) & mask; + out[16 + outOffset] = (curInputValue2 >>> 16) & mask; + out[17 + outOffset] = (curInputValue2 >>> 21) & mask; + out[18 + outOffset] = (curInputValue2 >>> 26) & mask; + out[19 + outOffset] = ((curInputValue2 >>> 31) | (curInputValue3 << 1)) & mask; + out[20 + outOffset] = (curInputValue3 >>> 4) & mask; + out[21 + outOffset] = (curInputValue3 >>> 9) & mask; + out[22 + outOffset] = (curInputValue3 >>> 14) & mask; + out[23 + outOffset] = (curInputValue3 >>> 19) & mask; + out[24 + outOffset] = (curInputValue3 >>> 24) & mask; + out[25 + outOffset] = ((curInputValue3 >>> 29) | (curInputValue4 << 3)) & mask; + out[26 + outOffset] = (curInputValue4 >>> 2) & mask; + out[27 + outOffset] = (curInputValue4 >>> 7) & mask; + out[28 + outOffset] = (curInputValue4 >>> 12) & mask; + out[29 + outOffset] = (curInputValue4 >>> 17) & mask; + out[30 + outOffset] = (curInputValue4 >>> 22) & mask; + out[31 + outOffset] = curInputValue4 >>> 27; + outOffset += 32; + } + } + + static private void unpack6(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 63; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + int curInputValue2 = in.get(); + int curInputValue3 = in.get(); + int curInputValue4 = in.get(); + int curInputValue5 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 6) & mask; + out[2 + outOffset] = (curInputValue0 >>> 12) & mask; + out[3 + outOffset] = (curInputValue0 >>> 18) & mask; + out[4 + outOffset] = (curInputValue0 >>> 24) & mask; + out[5 + outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) & mask; + out[6 + outOffset] = (curInputValue1 >>> 4) & mask; + out[7 + outOffset] = (curInputValue1 >>> 10) & mask; + out[8 + outOffset] = (curInputValue1 >>> 16) & mask; + out[9 + outOffset] = (curInputValue1 >>> 22) & mask; + out[10 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; + out[11 + outOffset] = (curInputValue2 >>> 2) & mask; + out[12 + outOffset] = (curInputValue2 >>> 8) & mask; + out[13 + outOffset] = (curInputValue2 >>> 14) & mask; + out[14 + outOffset] = (curInputValue2 >>> 20) & mask; + out[15 + outOffset] = curInputValue2 >>> 26; + out[16 + outOffset] = curInputValue3 & mask; + out[17 + outOffset] = (curInputValue3 >>> 6) & mask; + out[18 + outOffset] = (curInputValue3 >>> 12) & mask; + out[19 + outOffset] = (curInputValue3 >>> 18) & mask; + out[20 + outOffset] = (curInputValue3 >>> 24) & mask; + out[21 + outOffset] = ((curInputValue3 >>> 30) | (curInputValue4 << 2)) & mask; + out[22 + outOffset] = (curInputValue4 >>> 4) & mask; + out[23 + outOffset] = (curInputValue4 >>> 10) & mask; + out[24 + outOffset] = (curInputValue4 >>> 16) & mask; + out[25 + outOffset] = (curInputValue4 >>> 22) & mask; + out[26 + outOffset] = ((curInputValue4 >>> 28) | (curInputValue5 << 4)) & mask; + out[27 + outOffset] = (curInputValue5 >>> 2) & mask; + out[28 + outOffset] = (curInputValue5 >>> 8) & mask; + out[29 + outOffset] = (curInputValue5 >>> 14) & mask; + out[30 + outOffset] = (curInputValue5 >>> 20) & mask; + out[31 + outOffset] = curInputValue5 >>> 26; + outOffset += 32; + } + } + + static private void unpack7(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 127; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + int curInputValue2 = in.get(); + int curInputValue3 = in.get(); + int curInputValue4 = in.get(); + int curInputValue5 = in.get(); + int curInputValue6 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 7) & mask; + out[2 + outOffset] = (curInputValue0 >>> 14) & mask; + out[3 + outOffset] = (curInputValue0 >>> 21) & mask; + out[4 + outOffset] = ((curInputValue0 >>> 28) | (curInputValue1 << 4)) & mask; + out[5 + outOffset] = (curInputValue1 >>> 3) & mask; + out[6 + outOffset] = (curInputValue1 >>> 10) & mask; + out[7 + outOffset] = (curInputValue1 >>> 17) & mask; + out[8 + outOffset] = (curInputValue1 >>> 24) & mask; + out[9 + outOffset] = ((curInputValue1 >>> 31) | (curInputValue2 << 1)) & mask; + out[10 + outOffset] = (curInputValue2 >>> 6) & mask; + out[11 + outOffset] = (curInputValue2 >>> 13) & mask; + out[12 + outOffset] = (curInputValue2 >>> 20) & mask; + out[13 + outOffset] = ((curInputValue2 >>> 27) | (curInputValue3 << 5)) & mask; + out[14 + outOffset] = (curInputValue3 >>> 2) & mask; + out[15 + outOffset] = (curInputValue3 >>> 9) & mask; + out[16 + outOffset] = (curInputValue3 >>> 16) & mask; + out[17 + outOffset] = (curInputValue3 >>> 23) & mask; + out[18 + outOffset] = ((curInputValue3 >>> 30) | (curInputValue4 << 2)) & mask; + out[19 + outOffset] = (curInputValue4 >>> 5) & mask; + out[20 + outOffset] = (curInputValue4 >>> 12) & mask; + out[21 + outOffset] = (curInputValue4 >>> 19) & mask; + out[22 + outOffset] = ((curInputValue4 >>> 26) | (curInputValue5 << 6)) & mask; + out[23 + outOffset] = (curInputValue5 >>> 1) & mask; + out[24 + outOffset] = (curInputValue5 >>> 8) & mask; + out[25 + outOffset] = (curInputValue5 >>> 15) & mask; + out[26 + outOffset] = (curInputValue5 >>> 22) & mask; + out[27 + outOffset] = ((curInputValue5 >>> 29) | (curInputValue6 << 3)) & mask; + out[28 + outOffset] = (curInputValue6 >>> 4) & mask; + out[29 + outOffset] = (curInputValue6 >>> 11) & mask; + out[30 + outOffset] = (curInputValue6 >>> 18) & mask; + out[31 + outOffset] = curInputValue6 >>> 25; + outOffset += 32; + } + } + + static private void unpack8(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 255; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + int curInputValue2 = in.get(); + int curInputValue3 = in.get(); + int curInputValue4 = in.get(); + int curInputValue5 = in.get(); + int curInputValue6 = in.get(); + int curInputValue7 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 8) & mask; + out[2 + outOffset] = (curInputValue0 >>> 16) & mask; + out[3 + outOffset] = curInputValue0 >>> 24; + out[4 + outOffset] = curInputValue1 & mask; + out[5 + outOffset] = (curInputValue1 >>> 8) & mask; + out[6 + outOffset] = (curInputValue1 >>> 16) & mask; + out[7 + outOffset] = curInputValue1 >>> 24; + out[8 + outOffset] = curInputValue2 & mask; + out[9 + outOffset] = (curInputValue2 >>> 8) & mask; + out[10 + outOffset] = (curInputValue2 >>> 16) & mask; + out[11 + outOffset] = curInputValue2 >>> 24; + out[12 + outOffset] = curInputValue3 & mask; + out[13 + outOffset] = (curInputValue3 >>> 8) & mask; + out[14 + outOffset] = (curInputValue3 >>> 16) & mask; + out[15 + outOffset] = curInputValue3 >>> 24; + out[16 + outOffset] = curInputValue4 & mask; + out[17 + outOffset] = (curInputValue4 >>> 8) & mask; + out[18 + outOffset] = (curInputValue4 >>> 16) & mask; + out[19 + outOffset] = curInputValue4 >>> 24; + out[20 + outOffset] = curInputValue5 & mask; + out[21 + outOffset] = (curInputValue5 >>> 8) & mask; + out[22 + outOffset] = (curInputValue5 >>> 16) & mask; + out[23 + outOffset] = curInputValue5 >>> 24; + out[24 + outOffset] = curInputValue6 & mask; + out[25 + outOffset] = (curInputValue6 >>> 8) & mask; + out[26 + outOffset] = (curInputValue6 >>> 16) & mask; + out[27 + outOffset] = curInputValue6 >>> 24; + out[28 + outOffset] = curInputValue7 & mask; + out[29 + outOffset] = (curInputValue7 >>> 8) & mask; + out[30 + outOffset] = (curInputValue7 >>> 16) & mask; + out[31 + outOffset] = curInputValue7 >>> 24; + outOffset += 32; + } + } + + static private void unpack9(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 511; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + int curInputValue2 = in.get(); + int curInputValue3 = in.get(); + int curInputValue4 = in.get(); + int curInputValue5 = in.get(); + int curInputValue6 = in.get(); + int curInputValue7 = in.get(); + int curInputValue8 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 9) & mask; + out[2 + outOffset] = (curInputValue0 >>> 18) & mask; + out[3 + outOffset] = ((curInputValue0 >>> 27) | (curInputValue1 << 5)) & mask; + out[4 + outOffset] = (curInputValue1 >>> 4) & mask; + out[5 + outOffset] = (curInputValue1 >>> 13) & mask; + out[6 + outOffset] = (curInputValue1 >>> 22) & mask; + out[7 + outOffset] = ((curInputValue1 >>> 31) | (curInputValue2 << 1)) & mask; + out[8 + outOffset] = (curInputValue2 >>> 8) & mask; + out[9 + outOffset] = (curInputValue2 >>> 17) & mask; + out[10 + outOffset] = ((curInputValue2 >>> 26) | (curInputValue3 << 6)) & mask; + out[11 + outOffset] = (curInputValue3 >>> 3) & mask; + out[12 + outOffset] = (curInputValue3 >>> 12) & mask; + out[13 + outOffset] = (curInputValue3 >>> 21) & mask; + out[14 + outOffset] = ((curInputValue3 >>> 30) | (curInputValue4 << 2)) & mask; + out[15 + outOffset] = (curInputValue4 >>> 7) & mask; + out[16 + outOffset] = (curInputValue4 >>> 16) & mask; + out[17 + outOffset] = ((curInputValue4 >>> 25) | (curInputValue5 << 7)) & mask; + out[18 + outOffset] = (curInputValue5 >>> 2) & mask; + out[19 + outOffset] = (curInputValue5 >>> 11) & mask; + out[20 + outOffset] = (curInputValue5 >>> 20) & mask; + out[21 + outOffset] = ((curInputValue5 >>> 29) | (curInputValue6 << 3)) & mask; + out[22 + outOffset] = (curInputValue6 >>> 6) & mask; + out[23 + outOffset] = (curInputValue6 >>> 15) & mask; + out[24 + outOffset] = ((curInputValue6 >>> 24) | (curInputValue7 << 8)) & mask; + out[25 + outOffset] = (curInputValue7 >>> 1) & mask; + out[26 + outOffset] = (curInputValue7 >>> 10) & mask; + out[27 + outOffset] = (curInputValue7 >>> 19) & mask; + out[28 + outOffset] = ((curInputValue7 >>> 28) | (curInputValue8 << 4)) & mask; + out[29 + outOffset] = (curInputValue8 >>> 5) & mask; + out[30 + outOffset] = (curInputValue8 >>> 14) & mask; + out[31 + outOffset] = curInputValue8 >>> 23; + outOffset += 32; + } + } + + static private void unpack10(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 1023; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + int curInputValue2 = in.get(); + int curInputValue3 = in.get(); + int curInputValue4 = in.get(); + int curInputValue5 = in.get(); + int curInputValue6 = in.get(); + int curInputValue7 = in.get(); + int curInputValue8 = in.get(); + int curInputValue9 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 10) & mask; + out[2 + outOffset] = (curInputValue0 >>> 20) & mask; + out[3 + outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) & mask; + out[4 + outOffset] = (curInputValue1 >>> 8) & mask; + out[5 + outOffset] = (curInputValue1 >>> 18) & mask; + out[6 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; + out[7 + outOffset] = (curInputValue2 >>> 6) & mask; + out[8 + outOffset] = (curInputValue2 >>> 16) & mask; + out[9 + outOffset] = ((curInputValue2 >>> 26) | (curInputValue3 << 6)) & mask; + out[10 + outOffset] = (curInputValue3 >>> 4) & mask; + out[11 + outOffset] = (curInputValue3 >>> 14) & mask; + out[12 + outOffset] = ((curInputValue3 >>> 24) | (curInputValue4 << 8)) & mask; + out[13 + outOffset] = (curInputValue4 >>> 2) & mask; + out[14 + outOffset] = (curInputValue4 >>> 12) & mask; + out[15 + outOffset] = curInputValue4 >>> 22; + out[16 + outOffset] = curInputValue5 & mask; + out[17 + outOffset] = (curInputValue5 >>> 10) & mask; + out[18 + outOffset] = (curInputValue5 >>> 20) & mask; + out[19 + outOffset] = ((curInputValue5 >>> 30) | (curInputValue6 << 2)) & mask; + out[20 + outOffset] = (curInputValue6 >>> 8) & mask; + out[21 + outOffset] = (curInputValue6 >>> 18) & mask; + out[22 + outOffset] = ((curInputValue6 >>> 28) | (curInputValue7 << 4)) & mask; + out[23 + outOffset] = (curInputValue7 >>> 6) & mask; + out[24 + outOffset] = (curInputValue7 >>> 16) & mask; + out[25 + outOffset] = ((curInputValue7 >>> 26) | (curInputValue8 << 6)) & mask; + out[26 + outOffset] = (curInputValue8 >>> 4) & mask; + out[27 + outOffset] = (curInputValue8 >>> 14) & mask; + out[28 + outOffset] = ((curInputValue8 >>> 24) | (curInputValue9 << 8)) & mask; + out[29 + outOffset] = (curInputValue9 >>> 2) & mask; + out[30 + outOffset] = (curInputValue9 >>> 12) & mask; + out[31 + outOffset] = curInputValue9 >>> 22; + outOffset += 32; + } + } + + static private void unpack11(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 2047; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + int curInputValue2 = in.get(); + int curInputValue3 = in.get(); + int curInputValue4 = in.get(); + int curInputValue5 = in.get(); + int curInputValue6 = in.get(); + int curInputValue7 = in.get(); + int curInputValue8 = in.get(); + int curInputValue9 = in.get(); + int curInputValue10 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 11) & mask; + out[2 + outOffset] = ((curInputValue0 >>> 22) | (curInputValue1 << 10)) & mask; + out[3 + outOffset] = (curInputValue1 >>> 1) & mask; + out[4 + outOffset] = (curInputValue1 >>> 12) & mask; + out[5 + outOffset] = ((curInputValue1 >>> 23) | (curInputValue2 << 9)) & mask; + out[6 + outOffset] = (curInputValue2 >>> 2) & mask; + out[7 + outOffset] = (curInputValue2 >>> 13) & mask; + out[8 + outOffset] = ((curInputValue2 >>> 24) | (curInputValue3 << 8)) & mask; + out[9 + outOffset] = (curInputValue3 >>> 3) & mask; + out[10 + outOffset] = (curInputValue3 >>> 14) & mask; + out[11 + outOffset] = ((curInputValue3 >>> 25) | (curInputValue4 << 7)) & mask; + out[12 + outOffset] = (curInputValue4 >>> 4) & mask; + out[13 + outOffset] = (curInputValue4 >>> 15) & mask; + out[14 + outOffset] = ((curInputValue4 >>> 26) | (curInputValue5 << 6)) & mask; + out[15 + outOffset] = (curInputValue5 >>> 5) & mask; + out[16 + outOffset] = (curInputValue5 >>> 16) & mask; + out[17 + outOffset] = ((curInputValue5 >>> 27) | (curInputValue6 << 5)) & mask; + out[18 + outOffset] = (curInputValue6 >>> 6) & mask; + out[19 + outOffset] = (curInputValue6 >>> 17) & mask; + out[20 + outOffset] = ((curInputValue6 >>> 28) | (curInputValue7 << 4)) & mask; + out[21 + outOffset] = (curInputValue7 >>> 7) & mask; + out[22 + outOffset] = (curInputValue7 >>> 18) & mask; + out[23 + outOffset] = ((curInputValue7 >>> 29) | (curInputValue8 << 3)) & mask; + out[24 + outOffset] = (curInputValue8 >>> 8) & mask; + out[25 + outOffset] = (curInputValue8 >>> 19) & mask; + out[26 + outOffset] = ((curInputValue8 >>> 30) | (curInputValue9 << 2)) & mask; + out[27 + outOffset] = (curInputValue9 >>> 9) & mask; + out[28 + outOffset] = (curInputValue9 >>> 20) & mask; + out[29 + outOffset] = ((curInputValue9 >>> 31) | (curInputValue10 << 1)) & mask; + out[30 + outOffset] = (curInputValue10 >>> 10) & mask; + out[31 + outOffset] = curInputValue10 >>> 21; + outOffset += 32; + } + } + + static private void unpack12(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 4095; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + int curInputValue2 = in.get(); + int curInputValue3 = in.get(); + int curInputValue4 = in.get(); + int curInputValue5 = in.get(); + int curInputValue6 = in.get(); + int curInputValue7 = in.get(); + int curInputValue8 = in.get(); + int curInputValue9 = in.get(); + int curInputValue10 = in.get(); + int curInputValue11 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 12) & mask; + out[2 + outOffset] = ((curInputValue0 >>> 24) | (curInputValue1 << 8)) & mask; + out[3 + outOffset] = (curInputValue1 >>> 4) & mask; + out[4 + outOffset] = (curInputValue1 >>> 16) & mask; + out[5 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; + out[6 + outOffset] = (curInputValue2 >>> 8) & mask; + out[7 + outOffset] = curInputValue2 >>> 20; + out[8 + outOffset] = curInputValue3 & mask; + out[9 + outOffset] = (curInputValue3 >>> 12) & mask; + out[10 + outOffset] = ((curInputValue3 >>> 24) | (curInputValue4 << 8)) & mask; + out[11 + outOffset] = (curInputValue4 >>> 4) & mask; + out[12 + outOffset] = (curInputValue4 >>> 16) & mask; + out[13 + outOffset] = ((curInputValue4 >>> 28) | (curInputValue5 << 4)) & mask; + out[14 + outOffset] = (curInputValue5 >>> 8) & mask; + out[15 + outOffset] = curInputValue5 >>> 20; + out[16 + outOffset] = curInputValue6 & mask; + out[17 + outOffset] = (curInputValue6 >>> 12) & mask; + out[18 + outOffset] = ((curInputValue6 >>> 24) | (curInputValue7 << 8)) & mask; + out[19 + outOffset] = (curInputValue7 >>> 4) & mask; + out[20 + outOffset] = (curInputValue7 >>> 16) & mask; + out[21 + outOffset] = ((curInputValue7 >>> 28) | (curInputValue8 << 4)) & mask; + out[22 + outOffset] = (curInputValue8 >>> 8) & mask; + out[23 + outOffset] = curInputValue8 >>> 20; + out[24 + outOffset] = curInputValue9 & mask; + out[25 + outOffset] = (curInputValue9 >>> 12) & mask; + out[26 + outOffset] = ((curInputValue9 >>> 24) | (curInputValue10 << 8)) & mask; + out[27 + outOffset] = (curInputValue10 >>> 4) & mask; + out[28 + outOffset] = (curInputValue10 >>> 16) & mask; + out[29 + outOffset] = ((curInputValue10 >>> 28) | (curInputValue11 << 4)) & mask; + out[30 + outOffset] = (curInputValue11 >>> 8) & mask; + out[31 + outOffset] = curInputValue11 >>> 20; + outOffset += 32; + } + } + + static private void unpack13(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 8191; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + int curInputValue2 = in.get(); + int curInputValue3 = in.get(); + int curInputValue4 = in.get(); + int curInputValue5 = in.get(); + int curInputValue6 = in.get(); + int curInputValue7 = in.get(); + int curInputValue8 = in.get(); + int curInputValue9 = in.get(); + int curInputValue10 = in.get(); + int curInputValue11 = in.get(); + int curInputValue12 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 13) & mask; + out[2 + outOffset] = ((curInputValue0 >>> 26) | (curInputValue1 << 6)) & mask; + out[3 + outOffset] = (curInputValue1 >>> 7) & mask; + out[4 + outOffset] = ((curInputValue1 >>> 20) | (curInputValue2 << 12)) & mask; + out[5 + outOffset] = (curInputValue2 >>> 1) & mask; + out[6 + outOffset] = (curInputValue2 >>> 14) & mask; + out[7 + outOffset] = ((curInputValue2 >>> 27) | (curInputValue3 << 5)) & mask; + out[8 + outOffset] = (curInputValue3 >>> 8) & mask; + out[9 + outOffset] = ((curInputValue3 >>> 21) | (curInputValue4 << 11)) & mask; + out[10 + outOffset] = (curInputValue4 >>> 2) & mask; + out[11 + outOffset] = (curInputValue4 >>> 15) & mask; + out[12 + outOffset] = ((curInputValue4 >>> 28) | (curInputValue5 << 4)) & mask; + out[13 + outOffset] = (curInputValue5 >>> 9) & mask; + out[14 + outOffset] = ((curInputValue5 >>> 22) | (curInputValue6 << 10)) & mask; + out[15 + outOffset] = (curInputValue6 >>> 3) & mask; + out[16 + outOffset] = (curInputValue6 >>> 16) & mask; + out[17 + outOffset] = ((curInputValue6 >>> 29) | (curInputValue7 << 3)) & mask; + out[18 + outOffset] = (curInputValue7 >>> 10) & mask; + out[19 + outOffset] = ((curInputValue7 >>> 23) | (curInputValue8 << 9)) & mask; + out[20 + outOffset] = (curInputValue8 >>> 4) & mask; + out[21 + outOffset] = (curInputValue8 >>> 17) & mask; + out[22 + outOffset] = ((curInputValue8 >>> 30) | (curInputValue9 << 2)) & mask; + out[23 + outOffset] = (curInputValue9 >>> 11) & mask; + out[24 + outOffset] = ((curInputValue9 >>> 24) | (curInputValue10 << 8)) & mask; + out[25 + outOffset] = (curInputValue10 >>> 5) & mask; + out[26 + outOffset] = (curInputValue10 >>> 18) & mask; + out[27 + outOffset] = ((curInputValue10 >>> 31) | (curInputValue11 << 1)) & mask; + out[28 + outOffset] = (curInputValue11 >>> 12) & mask; + out[29 + outOffset] = ((curInputValue11 >>> 25) | (curInputValue12 << 7)) & mask; + out[30 + outOffset] = (curInputValue12 >>> 6) & mask; + out[31 + outOffset] = curInputValue12 >>> 19; + outOffset += 32; + } + } + + static private void unpack16(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 65535; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + int curInputValue2 = in.get(); + int curInputValue3 = in.get(); + int curInputValue4 = in.get(); + int curInputValue5 = in.get(); + int curInputValue6 = in.get(); + int curInputValue7 = in.get(); + int curInputValue8 = in.get(); + int curInputValue9 = in.get(); + int curInputValue10 = in.get(); + int curInputValue11 = in.get(); + int curInputValue12 = in.get(); + int curInputValue13 = in.get(); + int curInputValue14 = in.get(); + int curInputValue15 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = curInputValue0 >>> 16; + out[2 + outOffset] = curInputValue1 & mask; + out[3 + outOffset] = curInputValue1 >>> 16; + out[4 + outOffset] = curInputValue2 & mask; + out[5 + outOffset] = curInputValue2 >>> 16; + out[6 + outOffset] = curInputValue3 & mask; + out[7 + outOffset] = curInputValue3 >>> 16; + out[8 + outOffset] = curInputValue4 & mask; + out[9 + outOffset] = curInputValue4 >>> 16; + out[10 + outOffset] = curInputValue5 & mask; + out[11 + outOffset] = curInputValue5 >>> 16; + out[12 + outOffset] = curInputValue6 & mask; + out[13 + outOffset] = curInputValue6 >>> 16; + out[14 + outOffset] = curInputValue7 & mask; + out[15 + outOffset] = curInputValue7 >>> 16; + out[16 + outOffset] = curInputValue8 & mask; + out[17 + outOffset] = curInputValue8 >>> 16; + out[18 + outOffset] = curInputValue9 & mask; + out[19 + outOffset] = curInputValue9 >>> 16; + out[20 + outOffset] = curInputValue10 & mask; + out[21 + outOffset] = curInputValue10 >>> 16; + out[22 + outOffset] = curInputValue11 & mask; + out[23 + outOffset] = curInputValue11 >>> 16; + out[24 + outOffset] = curInputValue12 & mask; + out[25 + outOffset] = curInputValue12 >>> 16; + out[26 + outOffset] = curInputValue13 & mask; + out[27 + outOffset] = curInputValue13 >>> 16; + out[28 + outOffset] = curInputValue14 & mask; + out[29 + outOffset] = curInputValue14 >>> 16; + out[30 + outOffset] = curInputValue15 & mask; + out[31 + outOffset] = curInputValue15 >>> 16; + outOffset += 32; + } + } + + static private void unpack20(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 1048575; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + int curInputValue2 = in.get(); + int curInputValue3 = in.get(); + int curInputValue4 = in.get(); + int curInputValue5 = in.get(); + int curInputValue6 = in.get(); + int curInputValue7 = in.get(); + int curInputValue8 = in.get(); + int curInputValue9 = in.get(); + int curInputValue10 = in.get(); + int curInputValue11 = in.get(); + int curInputValue12 = in.get(); + int curInputValue13 = in.get(); + int curInputValue14 = in.get(); + int curInputValue15 = in.get(); + int curInputValue16 = in.get(); + int curInputValue17 = in.get(); + int curInputValue18 = in.get(); + int curInputValue19 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = ((curInputValue0 >>> 20) | (curInputValue1 << 12)) & mask; + out[2 + outOffset] = (curInputValue1 >>> 8) & mask; + out[3 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; + out[4 + outOffset] = ((curInputValue2 >>> 16) | (curInputValue3 << 16)) & mask; + out[5 + outOffset] = (curInputValue3 >>> 4) & mask; + out[6 + outOffset] = ((curInputValue3 >>> 24) | (curInputValue4 << 8)) & mask; + out[7 + outOffset] = curInputValue4 >>> 12; + out[8 + outOffset] = curInputValue5 & mask; + out[9 + outOffset] = ((curInputValue5 >>> 20) | (curInputValue6 << 12)) & mask; + out[10 + outOffset] = (curInputValue6 >>> 8) & mask; + out[11 + outOffset] = ((curInputValue6 >>> 28) | (curInputValue7 << 4)) & mask; + out[12 + outOffset] = ((curInputValue7 >>> 16) | (curInputValue8 << 16)) & mask; + out[13 + outOffset] = (curInputValue8 >>> 4) & mask; + out[14 + outOffset] = ((curInputValue8 >>> 24) | (curInputValue9 << 8)) & mask; + out[15 + outOffset] = curInputValue9 >>> 12; + out[16 + outOffset] = curInputValue10 & mask; + out[17 + outOffset] = ((curInputValue10 >>> 20) | (curInputValue11 << 12)) & mask; + out[18 + outOffset] = (curInputValue11 >>> 8) & mask; + out[19 + outOffset] = ((curInputValue11 >>> 28) | (curInputValue12 << 4)) & mask; + out[20 + outOffset] = ((curInputValue12 >>> 16) | (curInputValue13 << 16)) & mask; + out[21 + outOffset] = (curInputValue13 >>> 4) & mask; + out[22 + outOffset] = ((curInputValue13 >>> 24) | (curInputValue14 << 8)) & mask; + out[23 + outOffset] = curInputValue14 >>> 12; + out[24 + outOffset] = curInputValue15 & mask; + out[25 + outOffset] = ((curInputValue15 >>> 20) | (curInputValue16 << 12)) & mask; + out[26 + outOffset] = (curInputValue16 >>> 8) & mask; + out[27 + outOffset] = ((curInputValue16 >>> 28) | (curInputValue17 << 4)) & mask; + out[28 + outOffset] = ((curInputValue17 >>> 16) | (curInputValue18 << 16)) & mask; + out[29 + outOffset] = (curInputValue18 >>> 4) & mask; + out[30 + outOffset] = ((curInputValue18 >>> 24) | (curInputValue19 << 8)) & mask; + out[31 + outOffset] = curInputValue19 >>> 12; + outOffset += 32; + } + } + + static private void unpack28(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 268435455; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + int curInputValue2 = in.get(); + int curInputValue3 = in.get(); + int curInputValue4 = in.get(); + int curInputValue5 = in.get(); + int curInputValue6 = in.get(); + int curInputValue7 = in.get(); + int curInputValue8 = in.get(); + int curInputValue9 = in.get(); + int curInputValue10 = in.get(); + int curInputValue11 = in.get(); + int curInputValue12 = in.get(); + int curInputValue13 = in.get(); + int curInputValue14 = in.get(); + int curInputValue15 = in.get(); + int curInputValue16 = in.get(); + int curInputValue17 = in.get(); + int curInputValue18 = in.get(); + int curInputValue19 = in.get(); + int curInputValue20 = in.get(); + int curInputValue21 = in.get(); + int curInputValue22 = in.get(); + int curInputValue23 = in.get(); + int curInputValue24 = in.get(); + int curInputValue25 = in.get(); + int curInputValue26 = in.get(); + int curInputValue27 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = ((curInputValue0 >>> 28) | (curInputValue1 << 4)) & mask; + out[2 + outOffset] = ((curInputValue1 >>> 24) | (curInputValue2 << 8)) & mask; + out[3 + outOffset] = ((curInputValue2 >>> 20) | (curInputValue3 << 12)) & mask; + out[4 + outOffset] = ((curInputValue3 >>> 16) | (curInputValue4 << 16)) & mask; + out[5 + outOffset] = ((curInputValue4 >>> 12) | (curInputValue5 << 20)) & mask; + out[6 + outOffset] = ((curInputValue5 >>> 8) | (curInputValue6 << 24)) & mask; + out[7 + outOffset] = curInputValue6 >>> 4; + out[8 + outOffset] = curInputValue7 & mask; + out[9 + outOffset] = ((curInputValue7 >>> 28) | (curInputValue8 << 4)) & mask; + out[10 + outOffset] = ((curInputValue8 >>> 24) | (curInputValue9 << 8)) & mask; + out[11 + outOffset] = ((curInputValue9 >>> 20) | (curInputValue10 << 12)) & mask; + out[12 + outOffset] = ((curInputValue10 >>> 16) | (curInputValue11 << 16)) & mask; + out[13 + outOffset] = ((curInputValue11 >>> 12) | (curInputValue12 << 20)) & mask; + out[14 + outOffset] = ((curInputValue12 >>> 8) | (curInputValue13 << 24)) & mask; + out[15 + outOffset] = curInputValue13 >>> 4; + out[16 + outOffset] = curInputValue14 & mask; + out[17 + outOffset] = ((curInputValue14 >>> 28) | (curInputValue15 << 4)) & mask; + out[18 + outOffset] = ((curInputValue15 >>> 24) | (curInputValue16 << 8)) & mask; + out[19 + outOffset] = ((curInputValue16 >>> 20) | (curInputValue17 << 12)) & mask; + out[20 + outOffset] = ((curInputValue17 >>> 16) | (curInputValue18 << 16)) & mask; + out[21 + outOffset] = ((curInputValue18 >>> 12) | (curInputValue19 << 20)) & mask; + out[22 + outOffset] = ((curInputValue19 >>> 8) | (curInputValue20 << 24)) & mask; + out[23 + outOffset] = curInputValue20 >>> 4; + out[24 + outOffset] = curInputValue21 & mask; + out[25 + outOffset] = ((curInputValue21 >>> 28) | (curInputValue22 << 4)) & mask; + out[26 + outOffset] = ((curInputValue22 >>> 24) | (curInputValue23 << 8)) & mask; + out[27 + outOffset] = ((curInputValue23 >>> 20) | (curInputValue24 << 12)) & mask; + out[28 + outOffset] = ((curInputValue24 >>> 16) | (curInputValue25 << 16)) & mask; + out[29 + outOffset] = ((curInputValue25 >>> 12) | (curInputValue26 << 20)) & mask; + out[30 + outOffset] = ((curInputValue26 >>> 8) | (curInputValue27 << 24)) & mask; + out[31 + outOffset] = curInputValue27 >>> 4; + outOffset += 32; + } } - } - - static private void unpack0(int[] out, IntBuffer in) - { - } - - static private void unpack1(int[] out, IntBuffer in) - { - int outOffset = 0; - final int mask = 1; - for(int i=0; i<4; ++i){ - int curInputValue0 = in.get(); - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = (curInputValue0 >>> 1) & mask; - out[2+outOffset] = (curInputValue0 >>> 2) & mask; - out[3+outOffset] = (curInputValue0 >>> 3) & mask; - out[4+outOffset] = (curInputValue0 >>> 4) & mask; - out[5+outOffset] = (curInputValue0 >>> 5) & mask; - out[6+outOffset] = (curInputValue0 >>> 6) & mask; - out[7+outOffset] = (curInputValue0 >>> 7) & mask; - out[8+outOffset] = (curInputValue0 >>> 8) & mask; - out[9+outOffset] = (curInputValue0 >>> 9) & mask; - out[10+outOffset] = (curInputValue0 >>> 10) & mask; - out[11+outOffset] = (curInputValue0 >>> 11) & mask; - out[12+outOffset] = (curInputValue0 >>> 12) & mask; - out[13+outOffset] = (curInputValue0 >>> 13) & mask; - out[14+outOffset] = (curInputValue0 >>> 14) & mask; - out[15+outOffset] = (curInputValue0 >>> 15) & mask; - out[16+outOffset] = (curInputValue0 >>> 16) & mask; - out[17+outOffset] = (curInputValue0 >>> 17) & mask; - out[18+outOffset] = (curInputValue0 >>> 18) & mask; - out[19+outOffset] = (curInputValue0 >>> 19) & mask; - out[20+outOffset] = (curInputValue0 >>> 20) & mask; - out[21+outOffset] = (curInputValue0 >>> 21) & mask; - out[22+outOffset] = (curInputValue0 >>> 22) & mask; - out[23+outOffset] = (curInputValue0 >>> 23) & mask; - out[24+outOffset] = (curInputValue0 >>> 24) & mask; - out[25+outOffset] = (curInputValue0 >>> 25) & mask; - out[26+outOffset] = (curInputValue0 >>> 26) & mask; - out[27+outOffset] = (curInputValue0 >>> 27) & mask; - out[28+outOffset] = (curInputValue0 >>> 28) & mask; - out[29+outOffset] = (curInputValue0 >>> 29) & mask; - out[30+outOffset] = (curInputValue0 >>> 30) & mask; - out[31+outOffset] = curInputValue0 >>> 31; - outOffset += 32; - } - } - - static private void unpack2(int[] out, IntBuffer in) - { - int outOffset = 0; - final int mask = 3; - for(int i=0; i<4; ++i){ - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = (curInputValue0 >>> 2) & mask; - out[2+outOffset] = (curInputValue0 >>> 4) & mask; - out[3+outOffset] = (curInputValue0 >>> 6) & mask; - out[4+outOffset] = (curInputValue0 >>> 8) & mask; - out[5+outOffset] = (curInputValue0 >>> 10) & mask; - out[6+outOffset] = (curInputValue0 >>> 12) & mask; - out[7+outOffset] = (curInputValue0 >>> 14) & mask; - out[8+outOffset] = (curInputValue0 >>> 16) & mask; - out[9+outOffset] = (curInputValue0 >>> 18) & mask; - out[10+outOffset] = (curInputValue0 >>> 20) & mask; - out[11+outOffset] = (curInputValue0 >>> 22) & mask; - out[12+outOffset] = (curInputValue0 >>> 24) & mask; - out[13+outOffset] = (curInputValue0 >>> 26) & mask; - out[14+outOffset] = (curInputValue0 >>> 28) & mask; - out[15+outOffset] = curInputValue0 >>> 30; - out[16+outOffset] = curInputValue1 & mask; - out[17+outOffset] = (curInputValue1 >>> 2) & mask; - out[18+outOffset] = (curInputValue1 >>> 4) & mask; - out[19+outOffset] = (curInputValue1 >>> 6) & mask; - out[20+outOffset] = (curInputValue1 >>> 8) & mask; - out[21+outOffset] = (curInputValue1 >>> 10) & mask; - out[22+outOffset] = (curInputValue1 >>> 12) & mask; - out[23+outOffset] = (curInputValue1 >>> 14) & mask; - out[24+outOffset] = (curInputValue1 >>> 16) & mask; - out[25+outOffset] = (curInputValue1 >>> 18) & mask; - out[26+outOffset] = (curInputValue1 >>> 20) & mask; - out[27+outOffset] = (curInputValue1 >>> 22) & mask; - out[28+outOffset] = (curInputValue1 >>> 24) & mask; - out[29+outOffset] = (curInputValue1 >>> 26) & mask; - out[30+outOffset] = (curInputValue1 >>> 28) & mask; - out[31+outOffset] = curInputValue1 >>> 30; - outOffset += 32; - } - } - - static private void unpack3(int[] out, IntBuffer in) - { - int outOffset = 0; - final int mask = 7; - for(int i=0; i<4; ++i){ - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - int curInputValue2 = in.get(); - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = (curInputValue0 >>> 3) & mask; - out[2+outOffset] = (curInputValue0 >>> 6) & mask; - out[3+outOffset] = (curInputValue0 >>> 9) & mask; - out[4+outOffset] = (curInputValue0 >>> 12) & mask; - out[5+outOffset] = (curInputValue0 >>> 15) & mask; - out[6+outOffset] = (curInputValue0 >>> 18) & mask; - out[7+outOffset] = (curInputValue0 >>> 21) & mask; - out[8+outOffset] = (curInputValue0 >>> 24) & mask; - out[9+outOffset] = (curInputValue0 >>> 27) & mask; - out[10+outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) & mask; - out[11+outOffset] = (curInputValue1 >>> 1) & mask; - out[12+outOffset] = (curInputValue1 >>> 4) & mask; - out[13+outOffset] = (curInputValue1 >>> 7) & mask; - out[14+outOffset] = (curInputValue1 >>> 10) & mask; - out[15+outOffset] = (curInputValue1 >>> 13) & mask; - out[16+outOffset] = (curInputValue1 >>> 16) & mask; - out[17+outOffset] = (curInputValue1 >>> 19) & mask; - out[18+outOffset] = (curInputValue1 >>> 22) & mask; - out[19+outOffset] = (curInputValue1 >>> 25) & mask; - out[20+outOffset] = (curInputValue1 >>> 28) & mask; - out[21+outOffset] = ((curInputValue1 >>> 31) | (curInputValue2 << 1)) & mask; - out[22+outOffset] = (curInputValue2 >>> 2) & mask; - out[23+outOffset] = (curInputValue2 >>> 5) & mask; - out[24+outOffset] = (curInputValue2 >>> 8) & mask; - out[25+outOffset] = (curInputValue2 >>> 11) & mask; - out[26+outOffset] = (curInputValue2 >>> 14) & mask; - out[27+outOffset] = (curInputValue2 >>> 17) & mask; - out[28+outOffset] = (curInputValue2 >>> 20) & mask; - out[29+outOffset] = (curInputValue2 >>> 23) & mask; - out[30+outOffset] = (curInputValue2 >>> 26) & mask; - out[31+outOffset] = curInputValue2 >>> 29; - outOffset += 32; - } - } - - static private void unpack4(int[] out, IntBuffer in) - { - int outOffset = 0; - final int mask = 15; - for(int i=0; i<4; ++i){ - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - int curInputValue2 = in.get(); - int curInputValue3 = in.get(); - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = (curInputValue0 >>> 4) & mask; - out[2+outOffset] = (curInputValue0 >>> 8) & mask; - out[3+outOffset] = (curInputValue0 >>> 12) & mask; - out[4+outOffset] = (curInputValue0 >>> 16) & mask; - out[5+outOffset] = (curInputValue0 >>> 20) & mask; - out[6+outOffset] = (curInputValue0 >>> 24) & mask; - out[7+outOffset] = curInputValue0 >>> 28; - out[8+outOffset] = curInputValue1 & mask; - out[9+outOffset] = (curInputValue1 >>> 4) & mask; - out[10+outOffset] = (curInputValue1 >>> 8) & mask; - out[11+outOffset] = (curInputValue1 >>> 12) & mask; - out[12+outOffset] = (curInputValue1 >>> 16) & mask; - out[13+outOffset] = (curInputValue1 >>> 20) & mask; - out[14+outOffset] = (curInputValue1 >>> 24) & mask; - out[15+outOffset] = curInputValue1 >>> 28; - out[16+outOffset] = curInputValue2 & mask; - out[17+outOffset] = (curInputValue2 >>> 4) & mask; - out[18+outOffset] = (curInputValue2 >>> 8) & mask; - out[19+outOffset] = (curInputValue2 >>> 12) & mask; - out[20+outOffset] = (curInputValue2 >>> 16) & mask; - out[21+outOffset] = (curInputValue2 >>> 20) & mask; - out[22+outOffset] = (curInputValue2 >>> 24) & mask; - out[23+outOffset] = curInputValue2 >>> 28; - out[24+outOffset] = curInputValue3 & mask; - out[25+outOffset] = (curInputValue3 >>> 4) & mask; - out[26+outOffset] = (curInputValue3 >>> 8) & mask; - out[27+outOffset] = (curInputValue3 >>> 12) & mask; - out[28+outOffset] = (curInputValue3 >>> 16) & mask; - out[29+outOffset] = (curInputValue3 >>> 20) & mask; - out[30+outOffset] = (curInputValue3 >>> 24) & mask; - out[31+outOffset] = curInputValue3 >>> 28; - outOffset += 32; - } - } - - static private void unpack5(int[] out, IntBuffer in) - { - int outOffset = 0; - final int mask = 31; - for(int i=0; i<4; ++i){ - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - int curInputValue2 = in.get(); - int curInputValue3 = in.get(); - int curInputValue4 = in.get(); - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = (curInputValue0 >>> 5) & mask; - out[2+outOffset] = (curInputValue0 >>> 10) & mask; - out[3+outOffset] = (curInputValue0 >>> 15) & mask; - out[4+outOffset] = (curInputValue0 >>> 20) & mask; - out[5+outOffset] = (curInputValue0 >>> 25) & mask; - out[6+outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) & mask; - out[7+outOffset] = (curInputValue1 >>> 3) & mask; - out[8+outOffset] = (curInputValue1 >>> 8) & mask; - out[9+outOffset] = (curInputValue1 >>> 13) & mask; - out[10+outOffset] = (curInputValue1 >>> 18) & mask; - out[11+outOffset] = (curInputValue1 >>> 23) & mask; - out[12+outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; - out[13+outOffset] = (curInputValue2 >>> 1) & mask; - out[14+outOffset] = (curInputValue2 >>> 6) & mask; - out[15+outOffset] = (curInputValue2 >>> 11) & mask; - out[16+outOffset] = (curInputValue2 >>> 16) & mask; - out[17+outOffset] = (curInputValue2 >>> 21) & mask; - out[18+outOffset] = (curInputValue2 >>> 26) & mask; - out[19+outOffset] = ((curInputValue2 >>> 31) | (curInputValue3 << 1)) & mask; - out[20+outOffset] = (curInputValue3 >>> 4) & mask; - out[21+outOffset] = (curInputValue3 >>> 9) & mask; - out[22+outOffset] = (curInputValue3 >>> 14) & mask; - out[23+outOffset] = (curInputValue3 >>> 19) & mask; - out[24+outOffset] = (curInputValue3 >>> 24) & mask; - out[25+outOffset] = ((curInputValue3 >>> 29) | (curInputValue4 << 3)) & mask; - out[26+outOffset] = (curInputValue4 >>> 2) & mask; - out[27+outOffset] = (curInputValue4 >>> 7) & mask; - out[28+outOffset] = (curInputValue4 >>> 12) & mask; - out[29+outOffset] = (curInputValue4 >>> 17) & mask; - out[30+outOffset] = (curInputValue4 >>> 22) & mask; - out[31+outOffset] = curInputValue4 >>> 27; - outOffset += 32; - } - } - - static private void unpack6(int[] out, IntBuffer in) - { - int outOffset = 0; - final int mask = 63; - for(int i=0; i<4; ++i){ - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - int curInputValue2 = in.get(); - int curInputValue3 = in.get(); - int curInputValue4 = in.get(); - int curInputValue5 = in.get(); - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = (curInputValue0 >>> 6) & mask; - out[2+outOffset] = (curInputValue0 >>> 12) & mask; - out[3+outOffset] = (curInputValue0 >>> 18) & mask; - out[4+outOffset] = (curInputValue0 >>> 24) & mask; - out[5+outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) & mask; - out[6+outOffset] = (curInputValue1 >>> 4) & mask; - out[7+outOffset] = (curInputValue1 >>> 10) & mask; - out[8+outOffset] = (curInputValue1 >>> 16) & mask; - out[9+outOffset] = (curInputValue1 >>> 22) & mask; - out[10+outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; - out[11+outOffset] = (curInputValue2 >>> 2) & mask; - out[12+outOffset] = (curInputValue2 >>> 8) & mask; - out[13+outOffset] = (curInputValue2 >>> 14) & mask; - out[14+outOffset] = (curInputValue2 >>> 20) & mask; - out[15+outOffset] = curInputValue2 >>> 26; - out[16+outOffset] = curInputValue3 & mask; - out[17+outOffset] = (curInputValue3 >>> 6) & mask; - out[18+outOffset] = (curInputValue3 >>> 12) & mask; - out[19+outOffset] = (curInputValue3 >>> 18) & mask; - out[20+outOffset] = (curInputValue3 >>> 24) & mask; - out[21+outOffset] = ((curInputValue3 >>> 30) | (curInputValue4 << 2)) & mask; - out[22+outOffset] = (curInputValue4 >>> 4) & mask; - out[23+outOffset] = (curInputValue4 >>> 10) & mask; - out[24+outOffset] = (curInputValue4 >>> 16) & mask; - out[25+outOffset] = (curInputValue4 >>> 22) & mask; - out[26+outOffset] = ((curInputValue4 >>> 28) | (curInputValue5 << 4)) & mask; - out[27+outOffset] = (curInputValue5 >>> 2) & mask; - out[28+outOffset] = (curInputValue5 >>> 8) & mask; - out[29+outOffset] = (curInputValue5 >>> 14) & mask; - out[30+outOffset] = (curInputValue5 >>> 20) & mask; - out[31+outOffset] = curInputValue5 >>> 26; - outOffset += 32; - } - } - - static private void unpack7(int[] out, IntBuffer in) - { - int outOffset = 0; - final int mask = 127; - for(int i=0; i<4; ++i){ - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - int curInputValue2 = in.get(); - int curInputValue3 = in.get(); - int curInputValue4 = in.get(); - int curInputValue5 = in.get(); - int curInputValue6 = in.get(); - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = (curInputValue0 >>> 7) & mask; - out[2+outOffset] = (curInputValue0 >>> 14) & mask; - out[3+outOffset] = (curInputValue0 >>> 21) & mask; - out[4+outOffset] = ((curInputValue0 >>> 28) | (curInputValue1 << 4)) & mask; - out[5+outOffset] = (curInputValue1 >>> 3) & mask; - out[6+outOffset] = (curInputValue1 >>> 10) & mask; - out[7+outOffset] = (curInputValue1 >>> 17) & mask; - out[8+outOffset] = (curInputValue1 >>> 24) & mask; - out[9+outOffset] = ((curInputValue1 >>> 31) | (curInputValue2 << 1)) & mask; - out[10+outOffset] = (curInputValue2 >>> 6) & mask; - out[11+outOffset] = (curInputValue2 >>> 13) & mask; - out[12+outOffset] = (curInputValue2 >>> 20) & mask; - out[13+outOffset] = ((curInputValue2 >>> 27) | (curInputValue3 << 5)) & mask; - out[14+outOffset] = (curInputValue3 >>> 2) & mask; - out[15+outOffset] = (curInputValue3 >>> 9) & mask; - out[16+outOffset] = (curInputValue3 >>> 16) & mask; - out[17+outOffset] = (curInputValue3 >>> 23) & mask; - out[18+outOffset] = ((curInputValue3 >>> 30) | (curInputValue4 << 2)) & mask; - out[19+outOffset] = (curInputValue4 >>> 5) & mask; - out[20+outOffset] = (curInputValue4 >>> 12) & mask; - out[21+outOffset] = (curInputValue4 >>> 19) & mask; - out[22+outOffset] = ((curInputValue4 >>> 26) | (curInputValue5 << 6)) & mask; - out[23+outOffset] = (curInputValue5 >>> 1) & mask; - out[24+outOffset] = (curInputValue5 >>> 8) & mask; - out[25+outOffset] = (curInputValue5 >>> 15) & mask; - out[26+outOffset] = (curInputValue5 >>> 22) & mask; - out[27+outOffset] = ((curInputValue5 >>> 29) | (curInputValue6 << 3)) & mask; - out[28+outOffset] = (curInputValue6 >>> 4) & mask; - out[29+outOffset] = (curInputValue6 >>> 11) & mask; - out[30+outOffset] = (curInputValue6 >>> 18) & mask; - out[31+outOffset] = curInputValue6 >>> 25; - outOffset += 32; - } - } - - static private void unpack8(int[] out, IntBuffer in) - { - int outOffset = 0; - final int mask = 255; - for(int i=0; i<4; ++i){ - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - int curInputValue2 = in.get(); - int curInputValue3 = in.get(); - int curInputValue4 = in.get(); - int curInputValue5 = in.get(); - int curInputValue6 = in.get(); - int curInputValue7 = in.get(); - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = (curInputValue0 >>> 8) & mask; - out[2+outOffset] = (curInputValue0 >>> 16) & mask; - out[3+outOffset] = curInputValue0 >>> 24; - out[4+outOffset] = curInputValue1 & mask; - out[5+outOffset] = (curInputValue1 >>> 8) & mask; - out[6+outOffset] = (curInputValue1 >>> 16) & mask; - out[7+outOffset] = curInputValue1 >>> 24; - out[8+outOffset] = curInputValue2 & mask; - out[9+outOffset] = (curInputValue2 >>> 8) & mask; - out[10+outOffset] = (curInputValue2 >>> 16) & mask; - out[11+outOffset] = curInputValue2 >>> 24; - out[12+outOffset] = curInputValue3 & mask; - out[13+outOffset] = (curInputValue3 >>> 8) & mask; - out[14+outOffset] = (curInputValue3 >>> 16) & mask; - out[15+outOffset] = curInputValue3 >>> 24; - out[16+outOffset] = curInputValue4 & mask; - out[17+outOffset] = (curInputValue4 >>> 8) & mask; - out[18+outOffset] = (curInputValue4 >>> 16) & mask; - out[19+outOffset] = curInputValue4 >>> 24; - out[20+outOffset] = curInputValue5 & mask; - out[21+outOffset] = (curInputValue5 >>> 8) & mask; - out[22+outOffset] = (curInputValue5 >>> 16) & mask; - out[23+outOffset] = curInputValue5 >>> 24; - out[24+outOffset] = curInputValue6 & mask; - out[25+outOffset] = (curInputValue6 >>> 8) & mask; - out[26+outOffset] = (curInputValue6 >>> 16) & mask; - out[27+outOffset] = curInputValue6 >>> 24; - out[28+outOffset] = curInputValue7 & mask; - out[29+outOffset] = (curInputValue7 >>> 8) & mask; - out[30+outOffset] = (curInputValue7 >>> 16) & mask; - out[31+outOffset] = curInputValue7 >>> 24; - outOffset += 32; - } - } - - static private void unpack9(int[] out, IntBuffer in) - { - int outOffset = 0; - final int mask = 511; - for(int i=0; i<4; ++i){ - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - int curInputValue2 = in.get(); - int curInputValue3 = in.get(); - int curInputValue4 = in.get(); - int curInputValue5 = in.get(); - int curInputValue6 = in.get(); - int curInputValue7 = in.get(); - int curInputValue8 = in.get(); - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = (curInputValue0 >>> 9) & mask; - out[2+outOffset] = (curInputValue0 >>> 18) & mask; - out[3+outOffset] = ((curInputValue0 >>> 27) | (curInputValue1 << 5)) & mask; - out[4+outOffset] = (curInputValue1 >>> 4) & mask; - out[5+outOffset] = (curInputValue1 >>> 13) & mask; - out[6+outOffset] = (curInputValue1 >>> 22) & mask; - out[7+outOffset] = ((curInputValue1 >>> 31) | (curInputValue2 << 1)) & mask; - out[8+outOffset] = (curInputValue2 >>> 8) & mask; - out[9+outOffset] = (curInputValue2 >>> 17) & mask; - out[10+outOffset] = ((curInputValue2 >>> 26) | (curInputValue3 << 6)) & mask; - out[11+outOffset] = (curInputValue3 >>> 3) & mask; - out[12+outOffset] = (curInputValue3 >>> 12) & mask; - out[13+outOffset] = (curInputValue3 >>> 21) & mask; - out[14+outOffset] = ((curInputValue3 >>> 30) | (curInputValue4 << 2)) & mask; - out[15+outOffset] = (curInputValue4 >>> 7) & mask; - out[16+outOffset] = (curInputValue4 >>> 16) & mask; - out[17+outOffset] = ((curInputValue4 >>> 25) | (curInputValue5 << 7)) & mask; - out[18+outOffset] = (curInputValue5 >>> 2) & mask; - out[19+outOffset] = (curInputValue5 >>> 11) & mask; - out[20+outOffset] = (curInputValue5 >>> 20) & mask; - out[21+outOffset] = ((curInputValue5 >>> 29) | (curInputValue6 << 3)) & mask; - out[22+outOffset] = (curInputValue6 >>> 6) & mask; - out[23+outOffset] = (curInputValue6 >>> 15) & mask; - out[24+outOffset] = ((curInputValue6 >>> 24) | (curInputValue7 << 8)) & mask; - out[25+outOffset] = (curInputValue7 >>> 1) & mask; - out[26+outOffset] = (curInputValue7 >>> 10) & mask; - out[27+outOffset] = (curInputValue7 >>> 19) & mask; - out[28+outOffset] = ((curInputValue7 >>> 28) | (curInputValue8 << 4)) & mask; - out[29+outOffset] = (curInputValue8 >>> 5) & mask; - out[30+outOffset] = (curInputValue8 >>> 14) & mask; - out[31+outOffset] = curInputValue8 >>> 23; - outOffset += 32; - } - } - - static private void unpack10(int[] out, IntBuffer in) - { - int outOffset = 0; - final int mask = 1023; - for(int i=0; i<4; ++i){ - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - int curInputValue2 = in.get(); - int curInputValue3 = in.get(); - int curInputValue4 = in.get(); - int curInputValue5 = in.get(); - int curInputValue6 = in.get(); - int curInputValue7 = in.get(); - int curInputValue8 = in.get(); - int curInputValue9 = in.get(); - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = (curInputValue0 >>> 10) & mask; - out[2+outOffset] = (curInputValue0 >>> 20) & mask; - out[3+outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) & mask; - out[4+outOffset] = (curInputValue1 >>> 8) & mask; - out[5+outOffset] = (curInputValue1 >>> 18) & mask; - out[6+outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; - out[7+outOffset] = (curInputValue2 >>> 6) & mask; - out[8+outOffset] = (curInputValue2 >>> 16) & mask; - out[9+outOffset] = ((curInputValue2 >>> 26) | (curInputValue3 << 6)) & mask; - out[10+outOffset] = (curInputValue3 >>> 4) & mask; - out[11+outOffset] = (curInputValue3 >>> 14) & mask; - out[12+outOffset] = ((curInputValue3 >>> 24) | (curInputValue4 << 8)) & mask; - out[13+outOffset] = (curInputValue4 >>> 2) & mask; - out[14+outOffset] = (curInputValue4 >>> 12) & mask; - out[15+outOffset] = curInputValue4 >>> 22; - out[16+outOffset] = curInputValue5 & mask; - out[17+outOffset] = (curInputValue5 >>> 10) & mask; - out[18+outOffset] = (curInputValue5 >>> 20) & mask; - out[19+outOffset] = ((curInputValue5 >>> 30) | (curInputValue6 << 2)) & mask; - out[20+outOffset] = (curInputValue6 >>> 8) & mask; - out[21+outOffset] = (curInputValue6 >>> 18) & mask; - out[22+outOffset] = ((curInputValue6 >>> 28) | (curInputValue7 << 4)) & mask; - out[23+outOffset] = (curInputValue7 >>> 6) & mask; - out[24+outOffset] = (curInputValue7 >>> 16) & mask; - out[25+outOffset] = ((curInputValue7 >>> 26) | (curInputValue8 << 6)) & mask; - out[26+outOffset] = (curInputValue8 >>> 4) & mask; - out[27+outOffset] = (curInputValue8 >>> 14) & mask; - out[28+outOffset] = ((curInputValue8 >>> 24) | (curInputValue9 << 8)) & mask; - out[29+outOffset] = (curInputValue9 >>> 2) & mask; - out[30+outOffset] = (curInputValue9 >>> 12) & mask; - out[31+outOffset] = curInputValue9 >>> 22; - outOffset += 32; - } - } - - static private void unpack11(int[] out, IntBuffer in) - { - int outOffset = 0; - final int mask = 2047; - for(int i=0; i<4; ++i){ - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - int curInputValue2 = in.get(); - int curInputValue3 = in.get(); - int curInputValue4 = in.get(); - int curInputValue5 = in.get(); - int curInputValue6 = in.get(); - int curInputValue7 = in.get(); - int curInputValue8 = in.get(); - int curInputValue9 = in.get(); - int curInputValue10 = in.get(); - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = (curInputValue0 >>> 11) & mask; - out[2+outOffset] = ((curInputValue0 >>> 22) | (curInputValue1 << 10)) & mask; - out[3+outOffset] = (curInputValue1 >>> 1) & mask; - out[4+outOffset] = (curInputValue1 >>> 12) & mask; - out[5+outOffset] = ((curInputValue1 >>> 23) | (curInputValue2 << 9)) & mask; - out[6+outOffset] = (curInputValue2 >>> 2) & mask; - out[7+outOffset] = (curInputValue2 >>> 13) & mask; - out[8+outOffset] = ((curInputValue2 >>> 24) | (curInputValue3 << 8)) & mask; - out[9+outOffset] = (curInputValue3 >>> 3) & mask; - out[10+outOffset] = (curInputValue3 >>> 14) & mask; - out[11+outOffset] = ((curInputValue3 >>> 25) | (curInputValue4 << 7)) & mask; - out[12+outOffset] = (curInputValue4 >>> 4) & mask; - out[13+outOffset] = (curInputValue4 >>> 15) & mask; - out[14+outOffset] = ((curInputValue4 >>> 26) | (curInputValue5 << 6)) & mask; - out[15+outOffset] = (curInputValue5 >>> 5) & mask; - out[16+outOffset] = (curInputValue5 >>> 16) & mask; - out[17+outOffset] = ((curInputValue5 >>> 27) | (curInputValue6 << 5)) & mask; - out[18+outOffset] = (curInputValue6 >>> 6) & mask; - out[19+outOffset] = (curInputValue6 >>> 17) & mask; - out[20+outOffset] = ((curInputValue6 >>> 28) | (curInputValue7 << 4)) & mask; - out[21+outOffset] = (curInputValue7 >>> 7) & mask; - out[22+outOffset] = (curInputValue7 >>> 18) & mask; - out[23+outOffset] = ((curInputValue7 >>> 29) | (curInputValue8 << 3)) & mask; - out[24+outOffset] = (curInputValue8 >>> 8) & mask; - out[25+outOffset] = (curInputValue8 >>> 19) & mask; - out[26+outOffset] = ((curInputValue8 >>> 30) | (curInputValue9 << 2)) & mask; - out[27+outOffset] = (curInputValue9 >>> 9) & mask; - out[28+outOffset] = (curInputValue9 >>> 20) & mask; - out[29+outOffset] = ((curInputValue9 >>> 31) | (curInputValue10 << 1)) & mask; - out[30+outOffset] = (curInputValue10 >>> 10) & mask; - out[31+outOffset] = curInputValue10 >>> 21; - outOffset += 32; - } - } - - static private void unpack12(int[] out, IntBuffer in) - { - int outOffset = 0; - final int mask = 4095; - for(int i=0; i<4; ++i){ - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - int curInputValue2 = in.get(); - int curInputValue3 = in.get(); - int curInputValue4 = in.get(); - int curInputValue5 = in.get(); - int curInputValue6 = in.get(); - int curInputValue7 = in.get(); - int curInputValue8 = in.get(); - int curInputValue9 = in.get(); - int curInputValue10 = in.get(); - int curInputValue11 = in.get(); - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = (curInputValue0 >>> 12) & mask; - out[2+outOffset] = ((curInputValue0 >>> 24) | (curInputValue1 << 8)) & mask; - out[3+outOffset] = (curInputValue1 >>> 4) & mask; - out[4+outOffset] = (curInputValue1 >>> 16) & mask; - out[5+outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; - out[6+outOffset] = (curInputValue2 >>> 8) & mask; - out[7+outOffset] = curInputValue2 >>> 20; - out[8+outOffset] = curInputValue3 & mask; - out[9+outOffset] = (curInputValue3 >>> 12) & mask; - out[10+outOffset] = ((curInputValue3 >>> 24) | (curInputValue4 << 8)) & mask; - out[11+outOffset] = (curInputValue4 >>> 4) & mask; - out[12+outOffset] = (curInputValue4 >>> 16) & mask; - out[13+outOffset] = ((curInputValue4 >>> 28) | (curInputValue5 << 4)) & mask; - out[14+outOffset] = (curInputValue5 >>> 8) & mask; - out[15+outOffset] = curInputValue5 >>> 20; - out[16+outOffset] = curInputValue6 & mask; - out[17+outOffset] = (curInputValue6 >>> 12) & mask; - out[18+outOffset] = ((curInputValue6 >>> 24) | (curInputValue7 << 8)) & mask; - out[19+outOffset] = (curInputValue7 >>> 4) & mask; - out[20+outOffset] = (curInputValue7 >>> 16) & mask; - out[21+outOffset] = ((curInputValue7 >>> 28) | (curInputValue8 << 4)) & mask; - out[22+outOffset] = (curInputValue8 >>> 8) & mask; - out[23+outOffset] = curInputValue8 >>> 20; - out[24+outOffset] = curInputValue9 & mask; - out[25+outOffset] = (curInputValue9 >>> 12) & mask; - out[26+outOffset] = ((curInputValue9 >>> 24) | (curInputValue10 << 8)) & mask; - out[27+outOffset] = (curInputValue10 >>> 4) & mask; - out[28+outOffset] = (curInputValue10 >>> 16) & mask; - out[29+outOffset] = ((curInputValue10 >>> 28) | (curInputValue11 << 4)) & mask; - out[30+outOffset] = (curInputValue11 >>> 8) & mask; - out[31+outOffset] = curInputValue11 >>> 20; - outOffset += 32; - } - } - - static private void unpack13(int[] out, IntBuffer in) - { - int outOffset = 0; - final int mask = 8191; - for(int i=0; i<4; ++i){ - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - int curInputValue2 = in.get(); - int curInputValue3 = in.get(); - int curInputValue4 = in.get(); - int curInputValue5 = in.get(); - int curInputValue6 = in.get(); - int curInputValue7 = in.get(); - int curInputValue8 = in.get(); - int curInputValue9 = in.get(); - int curInputValue10 = in.get(); - int curInputValue11 = in.get(); - int curInputValue12 = in.get(); - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = (curInputValue0 >>> 13) & mask; - out[2+outOffset] = ((curInputValue0 >>> 26) | (curInputValue1 << 6)) & mask; - out[3+outOffset] = (curInputValue1 >>> 7) & mask; - out[4+outOffset] = ((curInputValue1 >>> 20) | (curInputValue2 << 12)) & mask; - out[5+outOffset] = (curInputValue2 >>> 1) & mask; - out[6+outOffset] = (curInputValue2 >>> 14) & mask; - out[7+outOffset] = ((curInputValue2 >>> 27) | (curInputValue3 << 5)) & mask; - out[8+outOffset] = (curInputValue3 >>> 8) & mask; - out[9+outOffset] = ((curInputValue3 >>> 21) | (curInputValue4 << 11)) & mask; - out[10+outOffset] = (curInputValue4 >>> 2) & mask; - out[11+outOffset] = (curInputValue4 >>> 15) & mask; - out[12+outOffset] = ((curInputValue4 >>> 28) | (curInputValue5 << 4)) & mask; - out[13+outOffset] = (curInputValue5 >>> 9) & mask; - out[14+outOffset] = ((curInputValue5 >>> 22) | (curInputValue6 << 10)) & mask; - out[15+outOffset] = (curInputValue6 >>> 3) & mask; - out[16+outOffset] = (curInputValue6 >>> 16) & mask; - out[17+outOffset] = ((curInputValue6 >>> 29) | (curInputValue7 << 3)) & mask; - out[18+outOffset] = (curInputValue7 >>> 10) & mask; - out[19+outOffset] = ((curInputValue7 >>> 23) | (curInputValue8 << 9)) & mask; - out[20+outOffset] = (curInputValue8 >>> 4) & mask; - out[21+outOffset] = (curInputValue8 >>> 17) & mask; - out[22+outOffset] = ((curInputValue8 >>> 30) | (curInputValue9 << 2)) & mask; - out[23+outOffset] = (curInputValue9 >>> 11) & mask; - out[24+outOffset] = ((curInputValue9 >>> 24) | (curInputValue10 << 8)) & mask; - out[25+outOffset] = (curInputValue10 >>> 5) & mask; - out[26+outOffset] = (curInputValue10 >>> 18) & mask; - out[27+outOffset] = ((curInputValue10 >>> 31) | (curInputValue11 << 1)) & mask; - out[28+outOffset] = (curInputValue11 >>> 12) & mask; - out[29+outOffset] = ((curInputValue11 >>> 25) | (curInputValue12 << 7)) & mask; - out[30+outOffset] = (curInputValue12 >>> 6) & mask; - out[31+outOffset] = curInputValue12 >>> 19; - outOffset += 32; - } - } - - static private void unpack16(int[] out, IntBuffer in) - { - int outOffset = 0; - final int mask = 65535; - for(int i=0; i<4; ++i){ - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - int curInputValue2 = in.get(); - int curInputValue3 = in.get(); - int curInputValue4 = in.get(); - int curInputValue5 = in.get(); - int curInputValue6 = in.get(); - int curInputValue7 = in.get(); - int curInputValue8 = in.get(); - int curInputValue9 = in.get(); - int curInputValue10 = in.get(); - int curInputValue11 = in.get(); - int curInputValue12 = in.get(); - int curInputValue13 = in.get(); - int curInputValue14 = in.get(); - int curInputValue15 = in.get(); - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = curInputValue0 >>> 16; - out[2+outOffset] = curInputValue1 & mask; - out[3+outOffset] = curInputValue1 >>> 16; - out[4+outOffset] = curInputValue2 & mask; - out[5+outOffset] = curInputValue2 >>> 16; - out[6+outOffset] = curInputValue3 & mask; - out[7+outOffset] = curInputValue3 >>> 16; - out[8+outOffset] = curInputValue4 & mask; - out[9+outOffset] = curInputValue4 >>> 16; - out[10+outOffset] = curInputValue5 & mask; - out[11+outOffset] = curInputValue5 >>> 16; - out[12+outOffset] = curInputValue6 & mask; - out[13+outOffset] = curInputValue6 >>> 16; - out[14+outOffset] = curInputValue7 & mask; - out[15+outOffset] = curInputValue7 >>> 16; - out[16+outOffset] = curInputValue8 & mask; - out[17+outOffset] = curInputValue8 >>> 16; - out[18+outOffset] = curInputValue9 & mask; - out[19+outOffset] = curInputValue9 >>> 16; - out[20+outOffset] = curInputValue10 & mask; - out[21+outOffset] = curInputValue10 >>> 16; - out[22+outOffset] = curInputValue11 & mask; - out[23+outOffset] = curInputValue11 >>> 16; - out[24+outOffset] = curInputValue12 & mask; - out[25+outOffset] = curInputValue12 >>> 16; - out[26+outOffset] = curInputValue13 & mask; - out[27+outOffset] = curInputValue13 >>> 16; - out[28+outOffset] = curInputValue14 & mask; - out[29+outOffset] = curInputValue14 >>> 16; - out[30+outOffset] = curInputValue15 & mask; - out[31+outOffset] = curInputValue15 >>> 16; - outOffset += 32; - } - } - - static private void unpack20(int[] out, IntBuffer in) - { - int outOffset = 0; - final int mask = 1048575; - for(int i=0; i<4; ++i){ - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - int curInputValue2 = in.get(); - int curInputValue3 = in.get(); - int curInputValue4 = in.get(); - int curInputValue5 = in.get(); - int curInputValue6 = in.get(); - int curInputValue7 = in.get(); - int curInputValue8 = in.get(); - int curInputValue9 = in.get(); - int curInputValue10 = in.get(); - int curInputValue11 = in.get(); - int curInputValue12 = in.get(); - int curInputValue13 = in.get(); - int curInputValue14 = in.get(); - int curInputValue15 = in.get(); - int curInputValue16 = in.get(); - int curInputValue17 = in.get(); - int curInputValue18 = in.get(); - int curInputValue19 = in.get(); - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = ((curInputValue0 >>> 20) | (curInputValue1 << 12)) & mask; - out[2+outOffset] = (curInputValue1 >>> 8) & mask; - out[3+outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; - out[4+outOffset] = ((curInputValue2 >>> 16) | (curInputValue3 << 16)) & mask; - out[5+outOffset] = (curInputValue3 >>> 4) & mask; - out[6+outOffset] = ((curInputValue3 >>> 24) | (curInputValue4 << 8)) & mask; - out[7+outOffset] = curInputValue4 >>> 12; - out[8+outOffset] = curInputValue5 & mask; - out[9+outOffset] = ((curInputValue5 >>> 20) | (curInputValue6 << 12)) & mask; - out[10+outOffset] = (curInputValue6 >>> 8) & mask; - out[11+outOffset] = ((curInputValue6 >>> 28) | (curInputValue7 << 4)) & mask; - out[12+outOffset] = ((curInputValue7 >>> 16) | (curInputValue8 << 16)) & mask; - out[13+outOffset] = (curInputValue8 >>> 4) & mask; - out[14+outOffset] = ((curInputValue8 >>> 24) | (curInputValue9 << 8)) & mask; - out[15+outOffset] = curInputValue9 >>> 12; - out[16+outOffset] = curInputValue10 & mask; - out[17+outOffset] = ((curInputValue10 >>> 20) | (curInputValue11 << 12)) & mask; - out[18+outOffset] = (curInputValue11 >>> 8) & mask; - out[19+outOffset] = ((curInputValue11 >>> 28) | (curInputValue12 << 4)) & mask; - out[20+outOffset] = ((curInputValue12 >>> 16) | (curInputValue13 << 16)) & mask; - out[21+outOffset] = (curInputValue13 >>> 4) & mask; - out[22+outOffset] = ((curInputValue13 >>> 24) | (curInputValue14 << 8)) & mask; - out[23+outOffset] = curInputValue14 >>> 12; - out[24+outOffset] = curInputValue15 & mask; - out[25+outOffset] = ((curInputValue15 >>> 20) | (curInputValue16 << 12)) & mask; - out[26+outOffset] = (curInputValue16 >>> 8) & mask; - out[27+outOffset] = ((curInputValue16 >>> 28) | (curInputValue17 << 4)) & mask; - out[28+outOffset] = ((curInputValue17 >>> 16) | (curInputValue18 << 16)) & mask; - out[29+outOffset] = (curInputValue18 >>> 4) & mask; - out[30+outOffset] = ((curInputValue18 >>> 24) | (curInputValue19 << 8)) & mask; - out[31+outOffset] = curInputValue19 >>> 12; - outOffset += 32; - } - } - - static private void unpack28(int[] out, IntBuffer in) - { - int outOffset = 0; - final int mask = 268435455; - for(int i=0; i<4; ++i){ - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - int curInputValue2 = in.get(); - int curInputValue3 = in.get(); - int curInputValue4 = in.get(); - int curInputValue5 = in.get(); - int curInputValue6 = in.get(); - int curInputValue7 = in.get(); - int curInputValue8 = in.get(); - int curInputValue9 = in.get(); - int curInputValue10 = in.get(); - int curInputValue11 = in.get(); - int curInputValue12 = in.get(); - int curInputValue13 = in.get(); - int curInputValue14 = in.get(); - int curInputValue15 = in.get(); - int curInputValue16 = in.get(); - int curInputValue17 = in.get(); - int curInputValue18 = in.get(); - int curInputValue19 = in.get(); - int curInputValue20 = in.get(); - int curInputValue21 = in.get(); - int curInputValue22 = in.get(); - int curInputValue23 = in.get(); - int curInputValue24 = in.get(); - int curInputValue25 = in.get(); - int curInputValue26 = in.get(); - int curInputValue27 = in.get(); - out[0+outOffset] = curInputValue0 & mask; - out[1+outOffset] = ((curInputValue0 >>> 28) | (curInputValue1 << 4)) & mask; - out[2+outOffset] = ((curInputValue1 >>> 24) | (curInputValue2 << 8)) & mask; - out[3+outOffset] = ((curInputValue2 >>> 20) | (curInputValue3 << 12)) & mask; - out[4+outOffset] = ((curInputValue3 >>> 16) | (curInputValue4 << 16)) & mask; - out[5+outOffset] = ((curInputValue4 >>> 12) | (curInputValue5 << 20)) & mask; - out[6+outOffset] = ((curInputValue5 >>> 8) | (curInputValue6 << 24)) & mask; - out[7+outOffset] = curInputValue6 >>> 4; - out[8+outOffset] = curInputValue7 & mask; - out[9+outOffset] = ((curInputValue7 >>> 28) | (curInputValue8 << 4)) & mask; - out[10+outOffset] = ((curInputValue8 >>> 24) | (curInputValue9 << 8)) & mask; - out[11+outOffset] = ((curInputValue9 >>> 20) | (curInputValue10 << 12)) & mask; - out[12+outOffset] = ((curInputValue10 >>> 16) | (curInputValue11 << 16)) & mask; - out[13+outOffset] = ((curInputValue11 >>> 12) | (curInputValue12 << 20)) & mask; - out[14+outOffset] = ((curInputValue12 >>> 8) | (curInputValue13 << 24)) & mask; - out[15+outOffset] = curInputValue13 >>> 4; - out[16+outOffset] = curInputValue14 & mask; - out[17+outOffset] = ((curInputValue14 >>> 28) | (curInputValue15 << 4)) & mask; - out[18+outOffset] = ((curInputValue15 >>> 24) | (curInputValue16 << 8)) & mask; - out[19+outOffset] = ((curInputValue16 >>> 20) | (curInputValue17 << 12)) & mask; - out[20+outOffset] = ((curInputValue17 >>> 16) | (curInputValue18 << 16)) & mask; - out[21+outOffset] = ((curInputValue18 >>> 12) | (curInputValue19 << 20)) & mask; - out[22+outOffset] = ((curInputValue19 >>> 8) | (curInputValue20 << 24)) & mask; - out[23+outOffset] = curInputValue20 >>> 4; - out[24+outOffset] = curInputValue21 & mask; - out[25+outOffset] = ((curInputValue21 >>> 28) | (curInputValue22 << 4)) & mask; - out[26+outOffset] = ((curInputValue22 >>> 24) | (curInputValue23 << 8)) & mask; - out[27+outOffset] = ((curInputValue23 >>> 20) | (curInputValue24 << 12)) & mask; - out[28+outOffset] = ((curInputValue24 >>> 16) | (curInputValue25 << 16)) & mask; - out[29+outOffset] = ((curInputValue25 >>> 12) | (curInputValue26 << 20)) & mask; - out[30+outOffset] = ((curInputValue26 >>> 8) | (curInputValue27 << 24)) & mask; - out[31+outOffset] = curInputValue27 >>> 4; - outOffset += 32; - } - } } diff --git a/src/main/java/com/kamikaze/pfordelta/Simple16.java b/src/main/java/com/kamikaze/pfordelta/Simple16.java index e986954..b73a68c 100644 --- a/src/main/java/com/kamikaze/pfordelta/Simple16.java +++ b/src/main/java/com/kamikaze/pfordelta/Simple16.java @@ -8,117 +8,111 @@ /** * Implementation of the Simple16 algorithm for sorted integer arrays. The basic ideas are based on papers from - * - * 1. http://www2008.org/papers/pdf/p387-zhangA.pdf - * + *

+ * 1. http://www2008.org/papers/pdf/p387-zhangA.pdf + *

* 2. http://www2009.org/proceedings/pdf/p401.pdf - * + *

* The maximum possible integer value Simple16 can encode is < 2^28 (this is dertermined by the Simple16 algorithm itself). * Therefore, in order to use Simple16, the application must write their own code to encode numbers in the range of [2^28, 2^32). * A simple way is just write those numbers as 32-bit integers (that is, no compression for very big numbers). */ -public class Simple16{ - - private static final int S16_NUMSIZE = 16; - private static final int S16_BITSSIZE = 28; - - //the possible number of compressed numbers hold in a single 32-bit integer - private static final int[] S16_NUM = {28, 21, 21, 21, 14, 9, 8, 7, 6, 6, 5, 5, 4, 3, 2, 1}; - - //the possible number of bits used to compress one number - private static final int[][] S16_BITS = { {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, - {2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0}, - {1,1,1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,0,0,0,0,0,0}, - {1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,0,0,0,0,0,0,0}, - {2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {4,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {3,4,4,4,4,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {5,5,5,5,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {4,4,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {6,6,6,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {5,5,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {7,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {10,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {14,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} }; - - /** - * Compress an integer array using Simple16 - * - * @param out the compressed output - * @param outOffset the offset of the output in the number of integers - * @param in the integer input array - * @param inOffset the offset of the input in the number of integers - * @param n the number of elements to be compressed - * @return the number of compressed integers - */ - public static final int s16Compress(int[] out, int outOffset, int[] in, int inOffset, int n, int blockSize) - { - int numIdx=0, j=0, num=0, bits=0; - try{ - for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) - { - out[outOffset] = numIdx<>> S16_BITSSIZE; + int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; + for (j = 0, bits = 0; j < num; j++) { + out[outOffset + j] = readBitsForS16(in, inOffset, bits, S16_BITS[numIdx][j]); + bits += S16_BITS[numIdx][j]; + } return num; - } - } - }catch(Exception e) - { - System.out.println("s16Compress: " + "numIdx:" + numIdx + ",j:" + j + ",num:" + num + ",bits: " + bits); - e.printStackTrace(); } - return -1; - } - - /** - * Decompress an integer array using Simple16 - * - * @param out the decompressed output - * @param outOffset the offset of the output in the number of integers - * @param in the compressed input array - * @param inOffset the offset of the input in the number of integers - * @param n the number of elements to be compressed - * @return the number of processed integers - */ - public static final int s16Decompress(int[] out, int outOffset, int[] in, int inOffset, int n) - { - int numIdx, j=0, bits=0; - numIdx = in[inOffset]>>>S16_BITSSIZE; - int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; - for(j=0, bits=0; j>> inWithIntOffset); - return val & (0xffffffff >>> (32 - bits)); - } - } + static private int readBitsForS16(int[] in, final int inIntOffset, final int inWithIntOffset, final int bits) { + final int val = (in[inIntOffset] >>> inWithIntOffset); + return val & (0xffffffff >>> (32 - bits)); + } +} diff --git a/src/main/java/com/kamikaze/pfordelta/Simple16WithHardCodes.java b/src/main/java/com/kamikaze/pfordelta/Simple16WithHardCodes.java index 01f5ebf..b9ca1e0 100644 --- a/src/main/java/com/kamikaze/pfordelta/Simple16WithHardCodes.java +++ b/src/main/java/com/kamikaze/pfordelta/Simple16WithHardCodes.java @@ -8,686 +8,634 @@ /** * Implementation of the Simple16 algorithm for sorted integer arrays. The basic ideas are based on papers from - * - * 1. http://www2008.org/papers/pdf/p387-zhangA.pdf - * + *

+ * 1. http://www2008.org/papers/pdf/p387-zhangA.pdf + *

* 2. http://www2009.org/proceedings/pdf/p401.pdf - * + *

* The maximum possible integer value Simple16 can encode is < 2^28 (this is dertermined by the Simple16 algorithm itself). * Therefore, in order to use Simple16, the application must write their own code to encode numbers in the range of [2^28, 2^32). * A simple way is just write those numbers as 32-bit integers (that is, no compression for very big numbers). - * - * Compared to Simple16, Simple16WithHardCodes will decompress each compressed integer using hardwired codes, + *

+ * Compared to Simple16, Simple16WithHardCodes will decompress each compressed integer using hardwired codes, * resulting in faster decompression speed. However, it will sacrifice with slightly larger index size. - * + *

* Author: Hao Yan, hyan2008@gmail.com */ -public class Simple16WithHardCodes{ - - private static final int S16_NUMSIZE = 16; - private static final int S16_BITSSIZE = 28; - - //the possible number of compressed numbers hold in a single 32-bit integer - private static final int[] S16_NUM = {28, 21, 21, 21, 14, 9, 8, 7, 6, 6, 5, 5, 4, 3, 2, 1}; - - //the possible number of bits used to compress one number - private static final int[][] S16_BITS = { {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, - {2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0}, - {1,1,1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,0,0,0,0,0,0}, - {1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,0,0,0,0,0,0,0}, - {2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {4,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {3,4,4,4,4,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {5,5,5,5,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {4,4,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {6,6,6,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {5,5,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {7,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {10,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {14,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, - {28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} }; - - /** - * Compress an integer array using Simple16 - * - * @param out the compressed output - * @param outOffset the offset of the output in the number of integers - * @param in the integer input array - * @param inOffset the offset of the input in the number of integers - * @param n the number of elements to be compressed - * @return the number of compressed integers - */ - public static final int s16Compress(int[] out, int outOffset, int[] in, int inOffset, int n, int blockSize, int oriBlockSize, int[] oriInputBlock) - { - int numIdx, j, num, bits; - for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) - { - out[outOffset] = numIdx< n) continue; - num = S16_NUM[numIdx]; - - for (j = 0, bits = 0; (j < num) && in[inOffset+j] < (1<>>S16_BITSSIZE; - int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; - for(j=0, bits=0; j>>S16_BITSSIZE; - final int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; - int s16Bits; - for(shift=0; j>> shift) & (0xffffffff >>> (32 - s16Bits)); - shift += s16Bits; - } - return num; - } - - public static final int s16DecompressWithIntBuffer(final int[] out, int outOffset, final int value, final int n) - { - int j=0, shift; - final int numIdx = value >>>S16_BITSSIZE; - - final int num = S16_NUM[numIdx]; - int s16Bits; - for(shift=0; j>> shift) & (0xffffffff >>> (32 - s16Bits)); - shift += s16Bits; - } - return num; - } - - - public static final int s16DecompressWithIntBufferWithHardCodes(final int[] out, int outOffset, final int value, final int n) - { - final int numIdx = value >>>S16_BITSSIZE; - return s16DecompressOneNumberWithHardCodes(out, outOffset, value, numIdx); - } - - public static final int s16DecompressWithIntBufferIntegrated(final int[] out, int outOffset, final int value, final int n, int[] expPos, int oribits) - { - int j=0, shift=0; - final int numIdx = value >>>S16_BITSSIZE; - - final int num = S16_NUM[numIdx]; - int s16Bits ; - for(; j>> shift) & (0xffffffff >>> (32 - s16Bits)))<>>S16_BITSSIZE; - return s16DecompressOneNumberWithHardCodesIntegrated(out, outOffset, value, numIdx, oribits, expPos); - } - - - - public static final int s16DecompressWithIntBufferIntegratedBackup(final int[] out, int outOffset, final int value, final int n, int[] expPos, int oribits) - { - int j=0, shift=0; - final int numIdx = value >>>S16_BITSSIZE; - final int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; - int s16Bits ; - for(; j>> shift) & (0xffffffff >>> (32 - s16Bits)))<>> 1) & 0x00000001; - out[outOffset+2] = (value >>> 2) & 0x00000001; - out[outOffset+3] = (value >>> 3) & 0x00000001; - out[outOffset+4] = (value >>> 4) & 0x00000001; - out[outOffset+5] = (value >>> 5) & 0x00000001; - out[outOffset+6] = (value >>> 6) & 0x00000001; - out[outOffset+7] = (value >>> 7) & 0x00000001; - out[outOffset+8] = (value >>> 8) & 0x00000001; - out[outOffset+9] = (value >>> 9) & 0x00000001; - out[outOffset+10] = (value >>> 10) & 0x00000001; - out[outOffset+11] = (value >>> 11) & 0x00000001; - out[outOffset+12] = (value >>> 12) & 0x00000001; - out[outOffset+13] = (value >>> 13) & 0x00000001; - out[outOffset+14] = (value >>> 14) & 0x00000001; - out[outOffset+15] = (value >>> 15) & 0x00000001; - out[outOffset+16] = (value >>> 16) & 0x00000001; - out[outOffset+17] = (value >>> 17) & 0x00000001; - out[outOffset+18] = (value >>> 18) & 0x00000001; - out[outOffset+19] = (value >>> 19) & 0x00000001; - out[outOffset+20] = (value >>> 20) & 0x00000001; - out[outOffset+21] = (value >>> 21) & 0x00000001; - out[outOffset+22] = (value >>> 22) & 0x00000001; - out[outOffset+23] = (value >>> 23) & 0x00000001; - out[outOffset+24] = (value >>> 24) & 0x00000001; - out[outOffset+25] = (value >>> 25) & 0x00000001; - out[outOffset+26] = (value >>> 26) & 0x00000001; - out[outOffset+27] = (value >>> 27) & 0x00000001; - return 28; - } - case 1: - { - out[outOffset] = value & 0x00000003; - out[outOffset+1] = (value >>> 2) & 0x00000003; - out[outOffset+2] = (value >>> 4) & 0x00000003; - out[outOffset+3] = (value >>> 6) & 0x00000003; - out[outOffset+4] = (value >>> 8) & 0x00000003; - out[outOffset+5] = (value >>> 10) & 0x00000003; - out[outOffset+6] = (value >>> 12) & 0x00000003; - out[outOffset+7] = (value >>> 14) & 0x00000001; - out[outOffset+8] = (value >>> 15) & 0x00000001; - out[outOffset+9] = (value >>> 16) & 0x00000001; - out[outOffset+10] = (value >>> 17) & 0x00000001; - out[outOffset+11] = (value >>> 18) & 0x00000001; - out[outOffset+12] = (value >>> 19) & 0x00000001; - out[outOffset+13] = (value >>> 20) & 0x00000001; - out[outOffset+14] = (value >>> 21) & 0x00000001; - out[outOffset+15] = (value >>> 22) & 0x00000001; - out[outOffset+16] = (value >>> 23) & 0x00000001; - out[outOffset+17] = (value >>> 24) & 0x00000001; - out[outOffset+18] = (value >>> 25) & 0x00000001; - out[outOffset+19] = (value >>> 26) & 0x00000001; - out[outOffset+20] = (value >>> 27) & 0x00000001; - return 21; - } - case 2: - { - out[outOffset] = value & 0x00000001; - out[outOffset+1] = (value >>> 1) & 0x00000001; - out[outOffset+2] = (value >>> 2) & 0x00000001; - out[outOffset+3] = (value >>> 3) & 0x00000001; - out[outOffset+4] = (value >>> 4) & 0x00000001; - out[outOffset+5] = (value >>> 5) & 0x00000001; - out[outOffset+6] = (value >>> 6) & 0x00000001; - out[outOffset+7] = (value >>> 7) & 0x00000003; - out[outOffset+8] = (value >>> 9) & 0x00000003; - out[outOffset+9] = (value >>> 11) & 0x00000003; - out[outOffset+10] = (value >>> 13) & 0x00000003; - out[outOffset+11] = (value >>> 15) & 0x00000003; - out[outOffset+12] = (value >>> 17) & 0x00000003; - out[outOffset+13] = (value >>> 19) & 0x00000003; - out[outOffset+14] = (value >>> 21) & 0x00000001; - out[outOffset+15] = (value >>> 22) & 0x00000001; - out[outOffset+16] = (value >>> 23) & 0x00000001; - out[outOffset+17] = (value >>> 24) & 0x00000001; - out[outOffset+18] = (value >>> 25) & 0x00000001; - out[outOffset+19] = (value >>> 26) & 0x00000001; - out[outOffset+20] = (value >>> 27) & 0x00000001; - return 21; - } - case 3: - { - out[outOffset] = value & 0x00000001; - out[outOffset+1] = (value >>> 1) & 0x00000001; - out[outOffset+2] = (value >>> 2) & 0x00000001; - out[outOffset+3] = (value >>> 3) & 0x00000001; - out[outOffset+4] = (value >>> 4) & 0x00000001; - out[outOffset+5] = (value >>> 5) & 0x00000001; - out[outOffset+6] = (value >>> 6) & 0x00000001; - out[outOffset+7] = (value >>> 7) & 0x00000001; - out[outOffset+8] = (value >>> 8) & 0x00000001; - out[outOffset+9] = (value >>> 9) & 0x00000001; - out[outOffset+10] = (value >>> 10) & 0x00000001; - out[outOffset+11] = (value >>> 11) & 0x00000001; - out[outOffset+12] = (value >>> 12) & 0x00000001; - out[outOffset+13] = (value >>> 13) & 0x00000001; - out[outOffset+14] = (value >>> 14) & 0x00000003; - out[outOffset+15] = (value >>> 16) & 0x00000003; - out[outOffset+16] = (value >>> 18) & 0x00000003; - out[outOffset+17] = (value >>> 20) & 0x00000003; - out[outOffset+18] = (value >>> 22) & 0x00000003; - out[outOffset+19] = (value >>> 24) & 0x00000003; - out[outOffset+20] = (value >>> 26) & 0x00000003; - return 21; - } - case 4: - { - out[outOffset] = value & 0x00000003; - out[outOffset+1] = (value >>> 2) & 0x00000003; - out[outOffset+2] = (value >>> 4) & 0x00000003; - out[outOffset+3] = (value >>> 6) & 0x00000003; - out[outOffset+4] = (value >>> 8) & 0x00000003; - out[outOffset+5] = (value >>> 10) & 0x00000003; - out[outOffset+6] = (value >>> 12) & 0x00000003; - out[outOffset+7] = (value >>> 14) & 0x00000003; - out[outOffset+8] = (value >>> 16) & 0x00000003; - out[outOffset+9] = (value >>> 18) & 0x00000003; - out[outOffset+10] = (value >>> 20) & 0x00000003; - out[outOffset+11] = (value >>> 22) & 0x00000003; - out[outOffset+12] = (value >>> 24) & 0x00000003; - out[outOffset+13] = (value >>> 26) & 0x00000003; - return 14; - } - case 5: - { - out[outOffset] = value & 0x0000000f; - out[outOffset+1] = (value >>> 4) & 0x00000007; - out[outOffset+2] = (value >>> 7) & 0x00000007; - out[outOffset+3] = (value >>> 10) & 0x00000007; - out[outOffset+4] = (value >>> 13) & 0x00000007; - out[outOffset+5] = (value >>> 16) & 0x00000007; - out[outOffset+6] = (value >>> 19) & 0x00000007; - out[outOffset+7] = (value >>> 22) & 0x00000007; - out[outOffset+8] = (value >>> 25) & 0x00000007; - return 9; - } - case 6: - { - out[outOffset] = value & 0x00000007; - out[outOffset+1] = (value >>> 3) & 0x0000000f; - out[outOffset+2] = (value >>> 7) & 0x0000000f; - out[outOffset+3] = (value >>> 11) & 0x0000000f; - out[outOffset+4] = (value >>> 15) & 0x0000000f; - out[outOffset+5] = (value >>> 19) & 0x00000007; - out[outOffset+6] = (value >>> 22) & 0x00000007; - out[outOffset+7] = (value >>> 25) & 0x00000007; - return 8; - } - case 7: - { - out[outOffset] = value & 0x0000000f; - out[outOffset+1] = (value >>> 4) & 0x0000000f; - out[outOffset+2] = (value >>> 8) & 0x0000000f; - out[outOffset+3] = (value >>> 12) & 0x0000000f; - out[outOffset+4] = (value >>> 16) & 0x0000000f; - out[outOffset+5] = (value >>> 20) & 0x0000000f; - out[outOffset+6] = (value >>> 24) & 0x0000000f; - return 7; - } - case 8: - { - out[outOffset] = value & 0x0000001f; - out[outOffset+1] = (value >>> 5) & 0x0000001f; - out[outOffset+2] = (value >>> 10) & 0x0000001f; - out[outOffset+3] = (value >>> 15) & 0x0000001f; - out[outOffset+4] = (value >>> 20) & 0x0000000f; - out[outOffset+5] = (value >>> 24) & 0x0000000f; - return 6; - } - case 9: - { - out[outOffset] = value & 0x0000000f; - out[outOffset+1] = (value >>> 4) & 0x0000000f; - out[outOffset+2] = (value >>> 8) & 0x0000001f; - out[outOffset+3] = (value >>> 13) & 0x0000001f; - out[outOffset+4] = (value >>> 18) & 0x0000001f; - out[outOffset+5] = (value >>> 23) & 0x0000001f; - return 6; - } - case 10: - { - out[outOffset] = value & 0x0000003f; - out[outOffset+1] = (value >>> 6) & 0x0000003f; - out[outOffset+2] = (value >>> 12) & 0x0000003f; - out[outOffset+3] = (value >>> 18) & 0x0000001f; - out[outOffset+4] = (value >>> 23) & 0x0000001f; - return 5; - } - case 11: - { - out[outOffset] = value & 0x0000001f; - out[outOffset+1] = (value >>> 5) & 0x0000001f; - out[outOffset+2] = (value >>> 10) & 0x0000003f; - out[outOffset+3] = (value >>> 16) & 0x0000003f; - out[outOffset+4] = (value >>> 22) & 0x0000003f; - return 5; - } - case 12: - { - out[outOffset] = value & 0x0000007f; - out[outOffset+1] = (value >>> 7) & 0x0000007f; - out[outOffset+2] = (value >>> 14) & 0x0000007f; - out[outOffset+3] = (value >>> 21) & 0x0000007f; - return 4; - } - case 13: - { - out[outOffset] = value & 0x000003ff; - out[outOffset+1] = (value >>> 10) & 0x000001ff; - out[outOffset+2] = (value >>> 19) & 0x000001ff; - return 3; - } - case 14: - { - out[outOffset] = value & 0x00003fff; - out[outOffset+1] = (value >>> 14) & 0x00003fff; - return 2; - } - case 15: - { - out[outOffset] = value & 0x0fffffff; - return 1; +public class Simple16WithHardCodes { + + private static final int S16_NUMSIZE = 16; + private static final int S16_BITSSIZE = 28; + + //the possible number of compressed numbers hold in a single 32-bit integer + private static final int[] S16_NUM = {28, 21, 21, 21, 14, 9, 8, 7, 6, 6, 5, 5, 4, 3, 2, 1}; + + //the possible number of bits used to compress one number + private static final int[][] S16_BITS = {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}, + {1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0}, + {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {4, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {3, 4, 4, 4, 4, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {5, 5, 5, 5, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {4, 4, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {6, 6, 6, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {5, 5, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {10, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; + + /** + * Compress an integer array using Simple16 + * + * @param out the compressed output + * @param outOffset the offset of the output in the number of integers + * @param in the integer input array + * @param inOffset the offset of the input in the number of integers + * @param n the number of elements to be compressed + * @return the number of compressed integers + */ + public static final int s16Compress(int[] out, int outOffset, int[] in, int inOffset, int n, int blockSize, int oriBlockSize, int[] oriInputBlock) { + int numIdx, j, num, bits; + for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { + out[outOffset] = numIdx << S16_BITSSIZE; + //num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; + + if (S16_NUM[numIdx] > n) continue; + num = S16_NUM[numIdx]; + + for (j = 0, bits = 0; (j < num) && in[inOffset + j] < (1 << S16_BITS[numIdx][j]); ) { + out[outOffset] |= (in[inOffset + j] << bits); + bits += S16_BITS[numIdx][j]; + j++; + } + + if (j == num) { + return num; + } } - default: - return -1; - } + + return -1; } - - public static int s16DecompressOneNumberWithHardCodesIntegrated(int[] out, int outOffset, int value, int numIdx, int oribits, int[] expPos){ - switch(numIdx){ - case 0: - { - out[expPos[outOffset]] |= ((value & 0x00000001)<>> 1) & 0x00000001)<>> 2) & 0x00000001)<>> 3) & 0x00000001)<>> 4) & 0x00000001)<>> 5) & 0x00000001)<>> 6) & 0x00000001)<>> 7) & 0x00000001)<>> 8) & 0x00000001)<>> 9) & 0x00000001)<>> 10) & 0x00000001)<>> 11) & 0x00000001)<>> 12) & 0x00000001)<>> 13) & 0x00000001)<>> 14) & 0x00000001)<>> 15) & 0x00000001)<>> 16) & 0x00000001)<>> 17) & 0x00000001)<>> 18) & 0x00000001)<>> 19) & 0x00000001)<>> 20) & 0x00000001)<>> 21) & 0x00000001)<>> 22) & 0x00000001)<>> 23) & 0x00000001)<>> 24) & 0x00000001)<>> 25) & 0x00000001)<>> 26) & 0x00000001)<>> 27) & 0x00000001)<>> 2) & 0x00000003)<>> 4) & 0x00000003)<>> 6) & 0x00000003)<>> 8) & 0x00000003)<>> 10) & 0x00000003)<>> 12) & 0x00000003)<>> 14) & 0x00000001)<>> 15) & 0x00000001)<>> 16) & 0x00000001)<>> 17) & 0x00000001)<>> 18) & 0x00000001)<>> 19) & 0x00000001)<>> 20) & 0x00000001)<>> 21) & 0x00000001)<>> 22) & 0x00000001)<>> 23) & 0x00000001)<>> 24) & 0x00000001)<>> 25) & 0x00000001)<>> 26) & 0x00000001)<>> 27) & 0x00000001)<>> 1) & 0x00000001)<>> 2) & 0x00000001)<>> 3) & 0x00000001)<>> 4) & 0x00000001)<>> 5) & 0x00000001)<>> 6) & 0x00000001)<>> 7) & 0x00000003)<>> 9) & 0x00000003)<>> 11) & 0x00000003)<>> 13) & 0x00000003)<>> 15) & 0x00000003)<>> 17) & 0x00000003)<>> 19) & 0x00000003)<>> 21) & 0x00000001)<>> 22) & 0x00000001)<>> 23) & 0x00000001)<>> 24) & 0x00000001)<>> 25) & 0x00000001)<>> 26) & 0x00000001)<>> 27) & 0x00000001)<>> 1) & 0x00000001)<>> 2) & 0x00000001)<>> 3) & 0x00000001)<>> 4) & 0x00000001)<>> 5) & 0x00000001)<>> 6) & 0x00000001)<>> 7) & 0x00000001)<>> 8) & 0x00000001)<>> 9) & 0x00000001)<>> 10) & 0x00000001)<>> 11) & 0x00000001)<>> 12) & 0x00000001)<>> 13) & 0x00000001)<>> 14) & 0x00000003)<>> 16) & 0x00000003)<>> 18) & 0x00000003)<>> 20) & 0x00000003)<>> 22) & 0x00000003)<>> 24) & 0x00000003)<>> 26) & 0x00000003)<>> 2) & 0x00000003)<>> 4) & 0x00000003)<>> 6) & 0x00000003)<>> 8) & 0x00000003)<>> 10) & 0x00000003)<>> 12) & 0x00000003)<>> 14) & 0x00000003)<>> 16) & 0x00000003)<>> 18) & 0x00000003)<>> 20) & 0x00000003)<>> 22) & 0x00000003)<>> 24) & 0x00000003)<>> 26) & 0x00000003)<>> 4) & 0x00000007)<>> 7) & 0x00000007)<>> 10) & 0x00000007)<>> 13) & 0x00000007)<>> 16) & 0x00000007)<>> 19) & 0x00000007)<>> 22) & 0x00000007)<>> 25) & 0x00000007)<>> 3) & 0x0000000f)<>> 7) & 0x0000000f)<>> 11) & 0x0000000f)<>> 15) & 0x0000000f)<>> 19) & 0x00000007)<>> 22) & 0x00000007)<>> 25) & 0x00000007)<>> 4) & 0x0000000f)<>> 8) & 0x0000000f)<>> 12) & 0x0000000f)<>> 16) & 0x0000000f)<>> 20) & 0x0000000f)<>> 24) & 0x0000000f)<>> 5) & 0x0000001f)<>> 10) & 0x0000001f)<>> 15) & 0x0000001f)<>> 20) & 0x0000000f)<>> 24) & 0x0000000f)<>> 4) & 0x0000000f)<>> 8) & 0x0000001f)<>> 13) & 0x0000001f)<>> 18) & 0x0000001f)<>> 23) & 0x0000001f)<>> S16_BITSSIZE; + int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; + for (j = 0, bits = 0; j < num; j++) { + out[outOffset + j] = readBitsForS16(in, inOffset, bits, S16_BITS[numIdx][j]); + bits += S16_BITS[numIdx][j]; } - case 10: - { - out[expPos[outOffset]] |= ((value & 0x0000003f)<>> 6) & 0x0000003f)<>> 12) & 0x0000003f)<>> 18) & 0x0000001f)<>> 23) & 0x0000001f)<>> S16_BITSSIZE; + final int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; + int s16Bits; + for (shift = 0; j < num; ++j) { + s16Bits = S16_BITS[numIdx][j]; + out[outOffset++] = (value >>> shift) & (0xffffffff >>> (32 - s16Bits)); + shift += s16Bits; } - case 11: - { - out[expPos[outOffset]] |= ((value & 0x0000001f)<>> 5) & 0x0000001f)<>> 10) & 0x0000003f)<>> 16) & 0x0000003f)<>> 22) & 0x0000003f)<>> S16_BITSSIZE; + + final int num = S16_NUM[numIdx]; + int s16Bits; + for (shift = 0; j < num; ++j) { + s16Bits = S16_BITS[numIdx][j]; + out[outOffset++] = (value >>> shift) & (0xffffffff >>> (32 - s16Bits)); + shift += s16Bits; } - case 12: - { - out[expPos[outOffset]] |= ((value & 0x0000007f)<>> 7) & 0x0000007f)<>> 14) & 0x0000007f)<>> 21) & 0x0000007f)<>> S16_BITSSIZE; + return s16DecompressOneNumberWithHardCodes(out, outOffset, value, numIdx); + } + + public static final int s16DecompressWithIntBufferIntegrated(final int[] out, int outOffset, final int value, final int n, int[] expPos, int oribits) { + int j = 0, shift = 0; + final int numIdx = value >>> S16_BITSSIZE; + + final int num = S16_NUM[numIdx]; + int s16Bits; + for (; j < num; ++j) { + s16Bits = S16_BITS[numIdx][j]; + out[expPos[outOffset + j]] |= (((value >>> shift) & (0xffffffff >>> (32 - s16Bits))) << oribits); + shift += s16Bits; } - case 13: - { - out[expPos[outOffset]] |= ((value & 0x000003ff)<>> 10) & 0x000001ff)<>> 19) & 0x000001ff)<>> S16_BITSSIZE; + return s16DecompressOneNumberWithHardCodesIntegrated(out, outOffset, value, numIdx, oribits, expPos); + } + + + public static final int s16DecompressWithIntBufferIntegratedBackup(final int[] out, int outOffset, final int value, final int n, int[] expPos, int oribits) { + int j = 0, shift = 0; + final int numIdx = value >>> S16_BITSSIZE; + final int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; + int s16Bits; + for (; j < num; ++j, ++outOffset) { + s16Bits = S16_BITS[numIdx][j]; + out[expPos[outOffset]] |= (((value >>> shift) & (0xffffffff >>> (32 - s16Bits))) << oribits); + shift += s16Bits; } - case 14: - { - out[expPos[outOffset]] |= ((value & 0x00003fff)<>> 14) & 0x00003fff)<>> 1) & 0x00000001; + out[outOffset + 2] = (value >>> 2) & 0x00000001; + out[outOffset + 3] = (value >>> 3) & 0x00000001; + out[outOffset + 4] = (value >>> 4) & 0x00000001; + out[outOffset + 5] = (value >>> 5) & 0x00000001; + out[outOffset + 6] = (value >>> 6) & 0x00000001; + out[outOffset + 7] = (value >>> 7) & 0x00000001; + out[outOffset + 8] = (value >>> 8) & 0x00000001; + out[outOffset + 9] = (value >>> 9) & 0x00000001; + out[outOffset + 10] = (value >>> 10) & 0x00000001; + out[outOffset + 11] = (value >>> 11) & 0x00000001; + out[outOffset + 12] = (value >>> 12) & 0x00000001; + out[outOffset + 13] = (value >>> 13) & 0x00000001; + out[outOffset + 14] = (value >>> 14) & 0x00000001; + out[outOffset + 15] = (value >>> 15) & 0x00000001; + out[outOffset + 16] = (value >>> 16) & 0x00000001; + out[outOffset + 17] = (value >>> 17) & 0x00000001; + out[outOffset + 18] = (value >>> 18) & 0x00000001; + out[outOffset + 19] = (value >>> 19) & 0x00000001; + out[outOffset + 20] = (value >>> 20) & 0x00000001; + out[outOffset + 21] = (value >>> 21) & 0x00000001; + out[outOffset + 22] = (value >>> 22) & 0x00000001; + out[outOffset + 23] = (value >>> 23) & 0x00000001; + out[outOffset + 24] = (value >>> 24) & 0x00000001; + out[outOffset + 25] = (value >>> 25) & 0x00000001; + out[outOffset + 26] = (value >>> 26) & 0x00000001; + out[outOffset + 27] = (value >>> 27) & 0x00000001; + return 28; + } + case 1: { + out[outOffset] = value & 0x00000003; + out[outOffset + 1] = (value >>> 2) & 0x00000003; + out[outOffset + 2] = (value >>> 4) & 0x00000003; + out[outOffset + 3] = (value >>> 6) & 0x00000003; + out[outOffset + 4] = (value >>> 8) & 0x00000003; + out[outOffset + 5] = (value >>> 10) & 0x00000003; + out[outOffset + 6] = (value >>> 12) & 0x00000003; + out[outOffset + 7] = (value >>> 14) & 0x00000001; + out[outOffset + 8] = (value >>> 15) & 0x00000001; + out[outOffset + 9] = (value >>> 16) & 0x00000001; + out[outOffset + 10] = (value >>> 17) & 0x00000001; + out[outOffset + 11] = (value >>> 18) & 0x00000001; + out[outOffset + 12] = (value >>> 19) & 0x00000001; + out[outOffset + 13] = (value >>> 20) & 0x00000001; + out[outOffset + 14] = (value >>> 21) & 0x00000001; + out[outOffset + 15] = (value >>> 22) & 0x00000001; + out[outOffset + 16] = (value >>> 23) & 0x00000001; + out[outOffset + 17] = (value >>> 24) & 0x00000001; + out[outOffset + 18] = (value >>> 25) & 0x00000001; + out[outOffset + 19] = (value >>> 26) & 0x00000001; + out[outOffset + 20] = (value >>> 27) & 0x00000001; + return 21; + } + case 2: { + out[outOffset] = value & 0x00000001; + out[outOffset + 1] = (value >>> 1) & 0x00000001; + out[outOffset + 2] = (value >>> 2) & 0x00000001; + out[outOffset + 3] = (value >>> 3) & 0x00000001; + out[outOffset + 4] = (value >>> 4) & 0x00000001; + out[outOffset + 5] = (value >>> 5) & 0x00000001; + out[outOffset + 6] = (value >>> 6) & 0x00000001; + out[outOffset + 7] = (value >>> 7) & 0x00000003; + out[outOffset + 8] = (value >>> 9) & 0x00000003; + out[outOffset + 9] = (value >>> 11) & 0x00000003; + out[outOffset + 10] = (value >>> 13) & 0x00000003; + out[outOffset + 11] = (value >>> 15) & 0x00000003; + out[outOffset + 12] = (value >>> 17) & 0x00000003; + out[outOffset + 13] = (value >>> 19) & 0x00000003; + out[outOffset + 14] = (value >>> 21) & 0x00000001; + out[outOffset + 15] = (value >>> 22) & 0x00000001; + out[outOffset + 16] = (value >>> 23) & 0x00000001; + out[outOffset + 17] = (value >>> 24) & 0x00000001; + out[outOffset + 18] = (value >>> 25) & 0x00000001; + out[outOffset + 19] = (value >>> 26) & 0x00000001; + out[outOffset + 20] = (value >>> 27) & 0x00000001; + return 21; + } + case 3: { + out[outOffset] = value & 0x00000001; + out[outOffset + 1] = (value >>> 1) & 0x00000001; + out[outOffset + 2] = (value >>> 2) & 0x00000001; + out[outOffset + 3] = (value >>> 3) & 0x00000001; + out[outOffset + 4] = (value >>> 4) & 0x00000001; + out[outOffset + 5] = (value >>> 5) & 0x00000001; + out[outOffset + 6] = (value >>> 6) & 0x00000001; + out[outOffset + 7] = (value >>> 7) & 0x00000001; + out[outOffset + 8] = (value >>> 8) & 0x00000001; + out[outOffset + 9] = (value >>> 9) & 0x00000001; + out[outOffset + 10] = (value >>> 10) & 0x00000001; + out[outOffset + 11] = (value >>> 11) & 0x00000001; + out[outOffset + 12] = (value >>> 12) & 0x00000001; + out[outOffset + 13] = (value >>> 13) & 0x00000001; + out[outOffset + 14] = (value >>> 14) & 0x00000003; + out[outOffset + 15] = (value >>> 16) & 0x00000003; + out[outOffset + 16] = (value >>> 18) & 0x00000003; + out[outOffset + 17] = (value >>> 20) & 0x00000003; + out[outOffset + 18] = (value >>> 22) & 0x00000003; + out[outOffset + 19] = (value >>> 24) & 0x00000003; + out[outOffset + 20] = (value >>> 26) & 0x00000003; + return 21; + } + case 4: { + out[outOffset] = value & 0x00000003; + out[outOffset + 1] = (value >>> 2) & 0x00000003; + out[outOffset + 2] = (value >>> 4) & 0x00000003; + out[outOffset + 3] = (value >>> 6) & 0x00000003; + out[outOffset + 4] = (value >>> 8) & 0x00000003; + out[outOffset + 5] = (value >>> 10) & 0x00000003; + out[outOffset + 6] = (value >>> 12) & 0x00000003; + out[outOffset + 7] = (value >>> 14) & 0x00000003; + out[outOffset + 8] = (value >>> 16) & 0x00000003; + out[outOffset + 9] = (value >>> 18) & 0x00000003; + out[outOffset + 10] = (value >>> 20) & 0x00000003; + out[outOffset + 11] = (value >>> 22) & 0x00000003; + out[outOffset + 12] = (value >>> 24) & 0x00000003; + out[outOffset + 13] = (value >>> 26) & 0x00000003; + return 14; + } + case 5: { + out[outOffset] = value & 0x0000000f; + out[outOffset + 1] = (value >>> 4) & 0x00000007; + out[outOffset + 2] = (value >>> 7) & 0x00000007; + out[outOffset + 3] = (value >>> 10) & 0x00000007; + out[outOffset + 4] = (value >>> 13) & 0x00000007; + out[outOffset + 5] = (value >>> 16) & 0x00000007; + out[outOffset + 6] = (value >>> 19) & 0x00000007; + out[outOffset + 7] = (value >>> 22) & 0x00000007; + out[outOffset + 8] = (value >>> 25) & 0x00000007; + return 9; + } + case 6: { + out[outOffset] = value & 0x00000007; + out[outOffset + 1] = (value >>> 3) & 0x0000000f; + out[outOffset + 2] = (value >>> 7) & 0x0000000f; + out[outOffset + 3] = (value >>> 11) & 0x0000000f; + out[outOffset + 4] = (value >>> 15) & 0x0000000f; + out[outOffset + 5] = (value >>> 19) & 0x00000007; + out[outOffset + 6] = (value >>> 22) & 0x00000007; + out[outOffset + 7] = (value >>> 25) & 0x00000007; + return 8; + } + case 7: { + out[outOffset] = value & 0x0000000f; + out[outOffset + 1] = (value >>> 4) & 0x0000000f; + out[outOffset + 2] = (value >>> 8) & 0x0000000f; + out[outOffset + 3] = (value >>> 12) & 0x0000000f; + out[outOffset + 4] = (value >>> 16) & 0x0000000f; + out[outOffset + 5] = (value >>> 20) & 0x0000000f; + out[outOffset + 6] = (value >>> 24) & 0x0000000f; + return 7; + } + case 8: { + out[outOffset] = value & 0x0000001f; + out[outOffset + 1] = (value >>> 5) & 0x0000001f; + out[outOffset + 2] = (value >>> 10) & 0x0000001f; + out[outOffset + 3] = (value >>> 15) & 0x0000001f; + out[outOffset + 4] = (value >>> 20) & 0x0000000f; + out[outOffset + 5] = (value >>> 24) & 0x0000000f; + return 6; + } + case 9: { + out[outOffset] = value & 0x0000000f; + out[outOffset + 1] = (value >>> 4) & 0x0000000f; + out[outOffset + 2] = (value >>> 8) & 0x0000001f; + out[outOffset + 3] = (value >>> 13) & 0x0000001f; + out[outOffset + 4] = (value >>> 18) & 0x0000001f; + out[outOffset + 5] = (value >>> 23) & 0x0000001f; + return 6; + } + case 10: { + out[outOffset] = value & 0x0000003f; + out[outOffset + 1] = (value >>> 6) & 0x0000003f; + out[outOffset + 2] = (value >>> 12) & 0x0000003f; + out[outOffset + 3] = (value >>> 18) & 0x0000001f; + out[outOffset + 4] = (value >>> 23) & 0x0000001f; + return 5; + } + case 11: { + out[outOffset] = value & 0x0000001f; + out[outOffset + 1] = (value >>> 5) & 0x0000001f; + out[outOffset + 2] = (value >>> 10) & 0x0000003f; + out[outOffset + 3] = (value >>> 16) & 0x0000003f; + out[outOffset + 4] = (value >>> 22) & 0x0000003f; + return 5; + } + case 12: { + out[outOffset] = value & 0x0000007f; + out[outOffset + 1] = (value >>> 7) & 0x0000007f; + out[outOffset + 2] = (value >>> 14) & 0x0000007f; + out[outOffset + 3] = (value >>> 21) & 0x0000007f; + return 4; + } + case 13: { + out[outOffset] = value & 0x000003ff; + out[outOffset + 1] = (value >>> 10) & 0x000001ff; + out[outOffset + 2] = (value >>> 19) & 0x000001ff; + return 3; + } + case 14: { + out[outOffset] = value & 0x00003fff; + out[outOffset + 1] = (value >>> 14) & 0x00003fff; + return 2; + } + case 15: { + out[outOffset] = value & 0x0fffffff; + return 1; + } + default: + return -1; } - case 15: - { - out[expPos[outOffset]] |= ((value & 0x0fffffff)<>> 1) & 0x00000001) << oribits); + out[expPos[outOffset + 2]] |= (((value >>> 2) & 0x00000001) << oribits); + out[expPos[outOffset + 3]] |= (((value >>> 3) & 0x00000001) << oribits); + out[expPos[outOffset + 4]] |= (((value >>> 4) & 0x00000001) << oribits); + out[expPos[outOffset + 5]] |= (((value >>> 5) & 0x00000001) << oribits); + out[expPos[outOffset + 6]] |= (((value >>> 6) & 0x00000001) << oribits); + out[expPos[outOffset + 7]] |= (((value >>> 7) & 0x00000001) << oribits); + out[expPos[outOffset + 8]] |= (((value >>> 8) & 0x00000001) << oribits); + out[expPos[outOffset + 9]] |= (((value >>> 9) & 0x00000001) << oribits); + out[expPos[outOffset + 10]] |= (((value >>> 10) & 0x00000001) << oribits); + out[expPos[outOffset + 11]] |= (((value >>> 11) & 0x00000001) << oribits); + out[expPos[outOffset + 12]] |= (((value >>> 12) & 0x00000001) << oribits); + out[expPos[outOffset + 13]] |= (((value >>> 13) & 0x00000001) << oribits); + out[expPos[outOffset + 14]] |= (((value >>> 14) & 0x00000001) << oribits); + out[expPos[outOffset + 15]] |= (((value >>> 15) & 0x00000001) << oribits); + out[expPos[outOffset + 16]] |= (((value >>> 16) & 0x00000001) << oribits); + out[expPos[outOffset + 17]] |= (((value >>> 17) & 0x00000001) << oribits); + out[expPos[outOffset + 18]] |= (((value >>> 18) & 0x00000001) << oribits); + out[expPos[outOffset + 19]] |= (((value >>> 19) & 0x00000001) << oribits); + out[expPos[outOffset + 20]] |= (((value >>> 20) & 0x00000001) << oribits); + out[expPos[outOffset + 21]] |= (((value >>> 21) & 0x00000001) << oribits); + out[expPos[outOffset + 22]] |= (((value >>> 22) & 0x00000001) << oribits); + out[expPos[outOffset + 23]] |= (((value >>> 23) & 0x00000001) << oribits); + out[expPos[outOffset + 24]] |= (((value >>> 24) & 0x00000001) << oribits); + out[expPos[outOffset + 25]] |= (((value >>> 25) & 0x00000001) << oribits); + out[expPos[outOffset + 26]] |= (((value >>> 26) & 0x00000001) << oribits); + out[expPos[outOffset + 27]] |= (((value >>> 27) & 0x00000001) << oribits); + return 28; + } + case 1: { + out[expPos[outOffset]] |= ((value & 0x00000003) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 2) & 0x00000003) << oribits); + out[expPos[outOffset + 2]] |= (((value >>> 4) & 0x00000003) << oribits); + out[expPos[outOffset + 3]] |= (((value >>> 6) & 0x00000003) << oribits); + out[expPos[outOffset + 4]] |= (((value >>> 8) & 0x00000003) << oribits); + out[expPos[outOffset + 5]] |= (((value >>> 10) & 0x00000003) << oribits); + out[expPos[outOffset + 6]] |= (((value >>> 12) & 0x00000003) << oribits); + out[expPos[outOffset + 7]] |= (((value >>> 14) & 0x00000001) << oribits); + out[expPos[outOffset + 8]] |= (((value >>> 15) & 0x00000001) << oribits); + out[expPos[outOffset + 9]] |= (((value >>> 16) & 0x00000001) << oribits); + out[expPos[outOffset + 10]] |= (((value >>> 17) & 0x00000001) << oribits); + out[expPos[outOffset + 11]] |= (((value >>> 18) & 0x00000001) << oribits); + out[expPos[outOffset + 12]] |= (((value >>> 19) & 0x00000001) << oribits); + out[expPos[outOffset + 13]] |= (((value >>> 20) & 0x00000001) << oribits); + out[expPos[outOffset + 14]] |= (((value >>> 21) & 0x00000001) << oribits); + out[expPos[outOffset + 15]] |= (((value >>> 22) & 0x00000001) << oribits); + out[expPos[outOffset + 16]] |= (((value >>> 23) & 0x00000001) << oribits); + out[expPos[outOffset + 17]] |= (((value >>> 24) & 0x00000001) << oribits); + out[expPos[outOffset + 18]] |= (((value >>> 25) & 0x00000001) << oribits); + out[expPos[outOffset + 19]] |= (((value >>> 26) & 0x00000001) << oribits); + out[expPos[outOffset + 20]] |= (((value >>> 27) & 0x00000001) << oribits); + return 21; + } + case 2: { + out[expPos[outOffset]] |= ((value & 0x00000001) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 1) & 0x00000001) << oribits); + out[expPos[outOffset + 2]] |= (((value >>> 2) & 0x00000001) << oribits); + out[expPos[outOffset + 3]] |= (((value >>> 3) & 0x00000001) << oribits); + out[expPos[outOffset + 4]] |= (((value >>> 4) & 0x00000001) << oribits); + out[expPos[outOffset + 5]] |= (((value >>> 5) & 0x00000001) << oribits); + out[expPos[outOffset + 6]] |= (((value >>> 6) & 0x00000001) << oribits); + out[expPos[outOffset + 7]] |= (((value >>> 7) & 0x00000003) << oribits); + out[expPos[outOffset + 8]] |= (((value >>> 9) & 0x00000003) << oribits); + out[expPos[outOffset + 9]] |= (((value >>> 11) & 0x00000003) << oribits); + out[expPos[outOffset + 10]] |= (((value >>> 13) & 0x00000003) << oribits); + out[expPos[outOffset + 11]] |= (((value >>> 15) & 0x00000003) << oribits); + out[expPos[outOffset + 12]] |= (((value >>> 17) & 0x00000003) << oribits); + out[expPos[outOffset + 13]] |= (((value >>> 19) & 0x00000003) << oribits); + out[expPos[outOffset + 14]] |= (((value >>> 21) & 0x00000001) << oribits); + out[expPos[outOffset + 15]] |= (((value >>> 22) & 0x00000001) << oribits); + out[expPos[outOffset + 16]] |= (((value >>> 23) & 0x00000001) << oribits); + out[expPos[outOffset + 17]] |= (((value >>> 24) & 0x00000001) << oribits); + out[expPos[outOffset + 18]] |= (((value >>> 25) & 0x00000001) << oribits); + out[expPos[outOffset + 19]] |= (((value >>> 26) & 0x00000001) << oribits); + out[expPos[outOffset + 20]] |= (((value >>> 27) & 0x00000001) << oribits); + return 21; + } + case 3: { + out[expPos[outOffset]] |= ((value & 0x00000001) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 1) & 0x00000001) << oribits); + out[expPos[outOffset + 2]] |= (((value >>> 2) & 0x00000001) << oribits); + out[expPos[outOffset + 3]] |= (((value >>> 3) & 0x00000001) << oribits); + out[expPos[outOffset + 4]] |= (((value >>> 4) & 0x00000001) << oribits); + out[expPos[outOffset + 5]] |= (((value >>> 5) & 0x00000001) << oribits); + out[expPos[outOffset + 6]] |= (((value >>> 6) & 0x00000001) << oribits); + out[expPos[outOffset + 7]] |= (((value >>> 7) & 0x00000001) << oribits); + out[expPos[outOffset + 8]] |= (((value >>> 8) & 0x00000001) << oribits); + out[expPos[outOffset + 9]] |= (((value >>> 9) & 0x00000001) << oribits); + out[expPos[outOffset + 10]] |= (((value >>> 10) & 0x00000001) << oribits); + out[expPos[outOffset + 11]] |= (((value >>> 11) & 0x00000001) << oribits); + out[expPos[outOffset + 12]] |= (((value >>> 12) & 0x00000001) << oribits); + out[expPos[outOffset + 13]] |= (((value >>> 13) & 0x00000001) << oribits); + out[expPos[outOffset + 14]] |= (((value >>> 14) & 0x00000003) << oribits); + out[expPos[outOffset + 15]] |= (((value >>> 16) & 0x00000003) << oribits); + out[expPos[outOffset + 16]] |= (((value >>> 18) & 0x00000003) << oribits); + out[expPos[outOffset + 17]] |= (((value >>> 20) & 0x00000003) << oribits); + out[expPos[outOffset + 18]] |= (((value >>> 22) & 0x00000003) << oribits); + out[expPos[outOffset + 19]] |= (((value >>> 24) & 0x00000003) << oribits); + out[expPos[outOffset + 20]] |= (((value >>> 26) & 0x00000003) << oribits); + return 21; + } + case 4: { + out[expPos[outOffset]] |= ((value & 0x00000003) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 2) & 0x00000003) << oribits); + out[expPos[outOffset + 2]] |= (((value >>> 4) & 0x00000003) << oribits); + out[expPos[outOffset + 3]] |= (((value >>> 6) & 0x00000003) << oribits); + out[expPos[outOffset + 4]] |= (((value >>> 8) & 0x00000003) << oribits); + out[expPos[outOffset + 5]] |= (((value >>> 10) & 0x00000003) << oribits); + out[expPos[outOffset + 6]] |= (((value >>> 12) & 0x00000003) << oribits); + out[expPos[outOffset + 7]] |= (((value >>> 14) & 0x00000003) << oribits); + out[expPos[outOffset + 8]] |= (((value >>> 16) & 0x00000003) << oribits); + out[expPos[outOffset + 9]] |= (((value >>> 18) & 0x00000003) << oribits); + out[expPos[outOffset + 10]] |= (((value >>> 20) & 0x00000003) << oribits); + out[expPos[outOffset + 11]] |= (((value >>> 22) & 0x00000003) << oribits); + out[expPos[outOffset + 12]] |= (((value >>> 24) & 0x00000003) << oribits); + out[expPos[outOffset + 13]] |= (((value >>> 26) & 0x00000003) << oribits); + return 14; + } + case 5: { + out[expPos[outOffset]] |= ((value & 0x0000000f) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 4) & 0x00000007) << oribits); + out[expPos[outOffset + 2]] |= (((value >>> 7) & 0x00000007) << oribits); + out[expPos[outOffset + 3]] |= (((value >>> 10) & 0x00000007) << oribits); + out[expPos[outOffset + 4]] |= (((value >>> 13) & 0x00000007) << oribits); + out[expPos[outOffset + 5]] |= (((value >>> 16) & 0x00000007) << oribits); + out[expPos[outOffset + 6]] |= (((value >>> 19) & 0x00000007) << oribits); + out[expPos[outOffset + 7]] |= (((value >>> 22) & 0x00000007) << oribits); + out[expPos[outOffset + 8]] |= (((value >>> 25) & 0x00000007) << oribits); + return 9; + } + case 6: { + out[expPos[outOffset]] |= ((value & 0x00000007) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 3) & 0x0000000f) << oribits); + out[expPos[outOffset + 2]] |= (((value >>> 7) & 0x0000000f) << oribits); + out[expPos[outOffset + 3]] |= (((value >>> 11) & 0x0000000f) << oribits); + out[expPos[outOffset + 4]] |= (((value >>> 15) & 0x0000000f) << oribits); + out[expPos[outOffset + 5]] |= (((value >>> 19) & 0x00000007) << oribits); + out[expPos[outOffset + 6]] |= (((value >>> 22) & 0x00000007) << oribits); + out[expPos[outOffset + 7]] |= (((value >>> 25) & 0x00000007) << oribits); + return 8; + } + case 7: { + out[expPos[outOffset]] |= ((value & 0x0000000f) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 4) & 0x0000000f) << oribits); + out[expPos[outOffset + 2]] |= (((value >>> 8) & 0x0000000f) << oribits); + out[expPos[outOffset + 3]] |= (((value >>> 12) & 0x0000000f) << oribits); + out[expPos[outOffset + 4]] |= (((value >>> 16) & 0x0000000f) << oribits); + out[expPos[outOffset + 5]] |= (((value >>> 20) & 0x0000000f) << oribits); + out[expPos[outOffset + 6]] |= (((value >>> 24) & 0x0000000f) << oribits); + return 7; + } + case 8: { + out[expPos[outOffset]] |= ((value & 0x0000001f) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 5) & 0x0000001f) << oribits); + out[expPos[outOffset + 2]] |= (((value >>> 10) & 0x0000001f) << oribits); + out[expPos[outOffset + 3]] |= (((value >>> 15) & 0x0000001f) << oribits); + out[expPos[outOffset + 4]] |= (((value >>> 20) & 0x0000000f) << oribits); + out[expPos[outOffset + 5]] |= (((value >>> 24) & 0x0000000f) << oribits); + return 6; + } + case 9: { + out[expPos[outOffset]] |= ((value & 0x0000000f) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 4) & 0x0000000f) << oribits); + out[expPos[outOffset + 2]] |= (((value >>> 8) & 0x0000001f) << oribits); + out[expPos[outOffset + 3]] |= (((value >>> 13) & 0x0000001f) << oribits); + out[expPos[outOffset + 4]] |= (((value >>> 18) & 0x0000001f) << oribits); + out[expPos[outOffset + 5]] |= (((value >>> 23) & 0x0000001f) << oribits); + return 6; + } + case 10: { + out[expPos[outOffset]] |= ((value & 0x0000003f) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 6) & 0x0000003f) << oribits); + out[expPos[outOffset + 2]] |= (((value >>> 12) & 0x0000003f) << oribits); + out[expPos[outOffset + 3]] |= (((value >>> 18) & 0x0000001f) << oribits); + out[expPos[outOffset + 4]] |= (((value >>> 23) & 0x0000001f) << oribits); + return 5; + } + case 11: { + out[expPos[outOffset]] |= ((value & 0x0000001f) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 5) & 0x0000001f) << oribits); + out[expPos[outOffset + 2]] |= (((value >>> 10) & 0x0000003f) << oribits); + out[expPos[outOffset + 3]] |= (((value >>> 16) & 0x0000003f) << oribits); + out[expPos[outOffset + 4]] |= (((value >>> 22) & 0x0000003f) << oribits); + return 5; + } + case 12: { + out[expPos[outOffset]] |= ((value & 0x0000007f) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 7) & 0x0000007f) << oribits); + out[expPos[outOffset + 2]] |= (((value >>> 14) & 0x0000007f) << oribits); + out[expPos[outOffset + 3]] |= (((value >>> 21) & 0x0000007f) << oribits); + return 4; + } + case 13: { + out[expPos[outOffset]] |= ((value & 0x000003ff) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 10) & 0x000001ff) << oribits); + out[expPos[outOffset + 2]] |= (((value >>> 19) & 0x000001ff) << oribits); + return 3; + } + case 14: { + out[expPos[outOffset]] |= ((value & 0x00003fff) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 14) & 0x00003fff) << oribits); + return 2; + } + case 15: { + out[expPos[outOffset]] |= ((value & 0x0fffffff) << oribits); + return 1; + } + default: + return -1; } - default: - return -1; - } } - /** + /** * Read a certain number of bits of a integer on the input array - * @param in the input array - * @param inIntOffset the start offset in ints in the input array + * + * @param in the input array + * @param inIntOffset the start offset in ints in the input array * @param inWithIntOffset the start offset within a int in the input array - * @param bits the number of bits to be read + * @param bits the number of bits to be read * @return the bits bits of the input */ - static private int readBitsForS16(int[] in, final int inIntOffset, final int inWithIntOffset, final int bits) { - final int val = (in[inIntOffset] >>> inWithIntOffset); - return val & (0xffffffff >>> (32 - bits)); - } + static private int readBitsForS16(int[] in, final int inIntOffset, final int inWithIntOffset, final int bits) { + final int val = (in[inIntOffset] >>> inWithIntOffset); + return val & (0xffffffff >>> (32 - bits)); + } - } +} diff --git a/src/main/java/me/lemire/integercompression/Benchmark.java b/src/main/java/me/lemire/integercompression/Benchmark.java index 8e22b68..348f144 100644 --- a/src/main/java/me/lemire/integercompression/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/Benchmark.java @@ -7,275 +7,274 @@ package me.lemire.integercompression; +import com.kamikaze.pfordelta.PForDelta; +import me.lemire.integercompression.synth.ClusteredDataGenerator; + import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; -import me.lemire.integercompression.synth.ClusteredDataGenerator; +public class Benchmark { -import com.kamikaze.pfordelta.PForDelta; + public static void main(String args[]) { + test(20, 18, 10); + } -public class Benchmark { + public static void testCodec(IntegerCODEC c, int[][] data, int Max, + int repeat, boolean verbose) { + DecimalFormat df = new DecimalFormat("0.00"); + DecimalFormat dfspeed = new DecimalFormat("0"); + if (verbose) + System.out.println("# " + c.toString()); + if (verbose) + System.out + .println("# bits per int, compress speed (mis), decompression speed (mis) "); + long bef, aft; + String line = ""; + int N = data.length; + int totalsize = 0; + int maxlength = 0; + for (int k = 0; k < N; ++k) { + totalsize += data[k].length; + if (data[k].length > maxlength) + maxlength = data[k].length; + } + int[] buffer = new int[maxlength + 1024]; + int[] dataout = new int[4 * maxlength + 1024]; + /* 4x + 1024 to account for the possibility of some negative compression */ + int size = 0; + int comptime = 0; + long decomptime = 0; + IntWrapper inpos = new IntWrapper(); + IntWrapper outpos = new IntWrapper(); + for (int r = 0; r < repeat; ++r) { + size = 0; + for (int k = 0; k < N; ++k) { + int[] backupdata = Arrays.copyOf(data[k], data[k].length); + // + bef = System.nanoTime() / 1000; + inpos.set(1); + outpos.set(0); + if (!(c instanceof IntegratedIntegerCODEC)) { + Delta.delta(backupdata); + } + c.compress(backupdata, inpos, backupdata.length - inpos.get(), + dataout, outpos); + aft = System.nanoTime() / 1000; + // + comptime += aft - bef; + final int thiscompsize = outpos.get() + 1; + size += thiscompsize; + // + bef = System.nanoTime() / 1000; + inpos.set(0); + outpos.set(1); + buffer[0] = backupdata[0]; + c.uncompress(dataout, inpos, thiscompsize - 1, buffer, outpos); + if (!(c instanceof IntegratedIntegerCODEC)) + Delta.fastinverseDelta(buffer); + aft = System.nanoTime() / 1000; + // + decomptime += aft - bef; + if (outpos.get() != data[k].length) + throw new RuntimeException("we have a bug (diff length) " + + c + " expected " + data[k].length + " got " + + outpos.get()); + for (int m = 0; m < outpos.get(); ++m) + if (buffer[m] != data[k][m]) { + throw new RuntimeException( + "we have a bug (actual difference), expected " + + data[k][m] + " found " + buffer[m] + + " at " + m); + } + + } + } - public static void main(String args[]) { - test(20, 18, 10); - } + line += "\t" + df.format(size * 32.0 / totalsize); + line += "\t" + dfspeed.format(totalsize * repeat / (comptime)); + line += "\t" + dfspeed.format(totalsize * repeat / (decomptime)); + if (verbose) + System.out.println(line); + } - public static void testCodec(IntegerCODEC c, int[][] data, int Max, - int repeat, boolean verbose) { - DecimalFormat df = new DecimalFormat("0.00"); - DecimalFormat dfspeed = new DecimalFormat("0"); - if (verbose) - System.out.println("# " + c.toString()); - if (verbose) - System.out - .println("# bits per int, compress speed (mis), decompression speed (mis) "); - long bef, aft; - String line = ""; - int N = data.length; - int totalsize = 0; - int maxlength = 0; - for (int k = 0; k < N; ++k) { - totalsize += data[k].length; - if (data[k].length > maxlength) - maxlength = data[k].length; - } - int[] buffer = new int[maxlength + 1024]; - int[] dataout = new int[4 * maxlength + 1024]; + public static void testKamikaze(int[][] data, int Max, + int repeat, boolean verbose) { + DecimalFormat df = new DecimalFormat("0.00"); + DecimalFormat dfspeed = new DecimalFormat("0"); + if (verbose) + System.out.println("# kamikaze PForDelta"); + if (verbose) + System.out + .println("# bits per int, compress speed (mis), decompression speed (mis) "); + long bef, aft; + String line = ""; + int N = data.length; + int totalsize = 0; + int maxlength = 0; + for (int k = 0; k < N; ++k) { + totalsize += data[k].length; + if (data[k].length > maxlength) + maxlength = data[k].length; + } + int[] buffer = new int[maxlength + 1024]; /* 4x + 1024 to account for the possibility of some negative compression */ - int size = 0; - int comptime = 0; - long decomptime = 0; - IntWrapper inpos = new IntWrapper(); - IntWrapper outpos = new IntWrapper(); - for (int r = 0; r < repeat; ++r) { - size = 0; - for (int k = 0; k < N; ++k) { - int[] backupdata = Arrays.copyOf(data[k], data[k].length); - // - bef = System.nanoTime() / 1000; - inpos.set(1); - outpos.set(0); - if (!(c instanceof IntegratedIntegerCODEC)) { - Delta.delta(backupdata); - } - c.compress(backupdata, inpos, backupdata.length - inpos.get(), - dataout, outpos); - aft = System.nanoTime() / 1000; - // - comptime += aft - bef; - final int thiscompsize = outpos.get() + 1; - size += thiscompsize; - // - bef = System.nanoTime() / 1000; - inpos.set(0); - outpos.set(1); - buffer[0] = backupdata[0]; - c.uncompress(dataout, inpos, thiscompsize - 1, buffer, outpos); - if (!(c instanceof IntegratedIntegerCODEC)) - Delta.fastinverseDelta(buffer); - aft = System.nanoTime() / 1000; - // - decomptime += aft - bef; - if (outpos.get() != data[k].length) - throw new RuntimeException("we have a bug (diff length) " - + c + " expected " + data[k].length + " got " - + outpos.get()); - for (int m = 0; m < outpos.get(); ++m) - if (buffer[m] != data[k][m]) { - throw new RuntimeException( - "we have a bug (actual difference), expected " - + data[k][m] + " found " + buffer[m] - + " at " + m); - } + int size = 0; + int comptime = 0; + long decomptime = 0; + for (int r = 0; r < repeat; ++r) { + size = 0; + for (int k = 0; k < N; ++k) { + int outpos = 0; + int[] backupdata = Arrays.copyOf(data[k], data[k].length); + // + bef = System.nanoTime() / 1000; + Delta.delta(backupdata); + ArrayList dataout = new ArrayList(data[k].length / 128); + for (int K = 0; K < data[k].length; K += 128) { + final int[] compressedbuf = PForDelta.compressOneBlockOpt(Arrays.copyOfRange(backupdata, K, K + 128), 128); + dataout.add(compressedbuf); + outpos += compressedbuf.length; + } + aft = System.nanoTime() / 1000; + // + comptime += aft - bef; + final int thiscompsize = outpos; + size += thiscompsize; + // + bef = System.nanoTime() / 1000; + //buffer[0] = backupdata[0]; + ArrayList datauncomp = new ArrayList(dataout.size()); + int deltaoffset = 0; - } - } + for (int[] compbuf : dataout) { + int[] tmpbuf = new int[128]; + PForDelta.decompressOneBlock(tmpbuf, compbuf, 128); + tmpbuf[0] += deltaoffset; + Delta.fastinverseDelta(tmpbuf); + deltaoffset = tmpbuf[127]; + datauncomp.add(tmpbuf); + } + aft = System.nanoTime() / 1000; + // + decomptime += aft - bef; + if (datauncomp.size() * 128 != data[k].length) + throw new RuntimeException("we have a bug (diff length) " + + " expected " + data[k].length + " got " + + datauncomp.size() * 128); + for (int m = 0; m < data[k].length; ++m) + if (datauncomp.get(m / 128)[m % 128] != data[k][m]) { + throw new RuntimeException( + "we have a bug (actual difference), expected " + + data[k][m] + " found " + buffer[m] + + " at " + m); + } - line += "\t" + df.format(size * 32.0 / totalsize); - line += "\t" + dfspeed.format(totalsize * repeat / (comptime)); - line += "\t" + dfspeed.format(totalsize * repeat / (decomptime)); - if (verbose) - System.out.println(line); - } + } + } - public static void testKamikaze(int[][] data, int Max, - int repeat, boolean verbose) { - DecimalFormat df = new DecimalFormat("0.00"); - DecimalFormat dfspeed = new DecimalFormat("0"); - if (verbose) - System.out.println("# kamikaze PForDelta"); - if (verbose) - System.out - .println("# bits per int, compress speed (mis), decompression speed (mis) "); - long bef, aft; - String line = ""; - int N = data.length; - int totalsize = 0; - int maxlength = 0; - for (int k = 0; k < N; ++k) { - totalsize += data[k].length; - if (data[k].length > maxlength) - maxlength = data[k].length; - } - int[] buffer = new int[maxlength + 1024]; - /* 4x + 1024 to account for the possibility of some negative compression */ - int size = 0; - int comptime = 0; - long decomptime = 0; - for (int r = 0; r < repeat; ++r) { - size = 0; - for (int k = 0; k < N; ++k) { - int outpos = 0; - int[] backupdata = Arrays.copyOf(data[k], data[k].length); - // - bef = System.nanoTime() / 1000; - Delta.delta(backupdata); - ArrayList dataout = new ArrayList(data[k].length/128); - for(int K = 0; K < data[k].length; K+=128) { - final int[] compressedbuf = PForDelta.compressOneBlockOpt(Arrays.copyOfRange(backupdata, K,K+128), 128); - dataout.add(compressedbuf); - outpos += compressedbuf.length; - } - aft = System.nanoTime() / 1000; - // - comptime += aft - bef; - final int thiscompsize = outpos; - size += thiscompsize; - // - bef = System.nanoTime() / 1000; - //buffer[0] = backupdata[0]; - ArrayList datauncomp = new ArrayList(dataout.size()); - int deltaoffset = 0; + line += "\t" + df.format(size * 32.0 / totalsize); + line += "\t" + dfspeed.format(totalsize * repeat / (comptime)); + line += "\t" + dfspeed.format(totalsize * repeat / (decomptime)); + if (verbose) + System.out.println(line); + } + + public static void test(int N, int nbr, int repeat) { + ClusteredDataGenerator cdg = new ClusteredDataGenerator(); + for (int sparsity = 1; sparsity < 31 - nbr; sparsity += 1) { + System.out.println("# sparsity " + sparsity); + int[][] data = new int[N][]; + int Max = (1 << (nbr + sparsity)); + System.out.println("# generating random data..."); + for (int k = 0; k < N; ++k) { + data[k] = cdg.generateClustered((1 << nbr), Max); + } + System.out.println("# generating random data... ok."); + testKamikaze(data, Max, repeat, false); + testKamikaze(data, Max, repeat, false); + testKamikaze(data, Max, repeat, true); + System.out.println(); - for(int[] compbuf : dataout ) { - int[] tmpbuf = new int[128]; - PForDelta.decompressOneBlock(tmpbuf, compbuf, 128); - tmpbuf[0] += deltaoffset; - Delta.fastinverseDelta(tmpbuf); - deltaoffset = tmpbuf[127]; - datauncomp.add(tmpbuf); - } - aft = System.nanoTime() / 1000; - // - decomptime += aft - bef; - if (datauncomp.size() * 128 != data[k].length) - throw new RuntimeException("we have a bug (diff length) " - + " expected " + data[k].length + " got " - + datauncomp.size() * 128); - for (int m = 0; m < data[k].length; ++m) - if (datauncomp.get(m/128)[m%128] != data[k][m]) { - throw new RuntimeException( - "we have a bug (actual difference), expected " - + data[k][m] + " found " + buffer[m] - + " at " + m); - } + testCodec(new IntegratedComposition(new IntegratedBinaryPacking(), + new IntegratedVariableByte()), data, Max, repeat, false); + testCodec(new IntegratedComposition(new IntegratedBinaryPacking(), + new IntegratedVariableByte()), data, Max, repeat, false); + testCodec(new IntegratedComposition(new IntegratedBinaryPacking(), + new IntegratedVariableByte()), data, Max, repeat, true); + System.out.println(); - } - } - line += "\t" + df.format(size * 32.0 / totalsize); - line += "\t" + dfspeed.format(totalsize * repeat / (comptime)); - line += "\t" + dfspeed.format(totalsize * repeat / (decomptime)); - if (verbose) - System.out.println(line); - } + testCodec(new JustCopy(), data, Max, repeat, false); + testCodec(new JustCopy(), data, Max, repeat, false); + testCodec(new JustCopy(), data, Max, repeat, true); + System.out.println(); - public static void test(int N, int nbr, int repeat) { - ClusteredDataGenerator cdg = new ClusteredDataGenerator(); - for (int sparsity = 1; sparsity < 31 - nbr; sparsity += 1) { - System.out.println("# sparsity " + sparsity); - int[][] data = new int[N][]; - int Max = (1 << (nbr + sparsity)); - System.out.println("# generating random data..."); - for (int k = 0; k < N; ++k) { - data[k] = cdg.generateClustered((1 << nbr), Max); - } - System.out.println("# generating random data... ok."); - testKamikaze( data, Max, repeat, false); - testKamikaze( data, Max, repeat, false); - testKamikaze( data, Max, repeat, true); - System.out.println(); - - testCodec(new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()), data, Max, repeat, false); - testCodec(new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()), data, Max, repeat, false); - testCodec(new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()), data, Max, repeat, true); - System.out.println(); + testCodec(new VariableByte(), data, Max, repeat, false); + testCodec(new VariableByte(), data, Max, repeat, false); + testCodec(new VariableByte(), data, Max, repeat, true); + System.out.println(); - - testCodec(new JustCopy(), data, Max, repeat, false); - testCodec(new JustCopy(), data, Max, repeat, false); - testCodec(new JustCopy(), data, Max, repeat, true); - System.out.println(); + testCodec(new IntegratedVariableByte(), data, Max, repeat, false); + testCodec(new IntegratedVariableByte(), data, Max, repeat, false); + testCodec(new IntegratedVariableByte(), data, Max, repeat, true); + System.out.println(); - testCodec(new VariableByte(), data, Max, repeat, false); - testCodec(new VariableByte(), data, Max, repeat, false); - testCodec(new VariableByte(), data, Max, repeat, true); - System.out.println(); - testCodec(new IntegratedVariableByte(), data, Max, repeat, false); - testCodec(new IntegratedVariableByte(), data, Max, repeat, false); - testCodec(new IntegratedVariableByte(), data, Max, repeat, true); - System.out.println(); + testCodec(new Composition(new BinaryPacking(), new VariableByte()), + data, Max, repeat, false); + testCodec(new Composition(new BinaryPacking(), new VariableByte()), + data, Max, repeat, false); + testCodec(new Composition(new BinaryPacking(), new VariableByte()), + data, Max, repeat, true); + System.out.println(); + testCodec(new Composition(new NewPFD(), new VariableByte()), data, + Max, repeat, false); + testCodec(new Composition(new NewPFD(), new VariableByte()), data, + Max, repeat, false); + testCodec(new Composition(new NewPFD(), new VariableByte()), data, + Max, repeat, true); + System.out.println(); - testCodec(new Composition(new BinaryPacking(), new VariableByte()), - data, Max, repeat, false); - testCodec(new Composition(new BinaryPacking(), new VariableByte()), - data, Max, repeat, false); - testCodec(new Composition(new BinaryPacking(), new VariableByte()), - data, Max, repeat, true); - System.out.println(); - testCodec(new Composition(new NewPFD(), new VariableByte()), data, - Max, repeat, false); - testCodec(new Composition(new NewPFD(), new VariableByte()), data, - Max, repeat, false); - testCodec(new Composition(new NewPFD(), new VariableByte()), data, - Max, repeat, true); - System.out.println(); - + testCodec(new Composition(new NewPFDS9(), new VariableByte()), data, + Max, repeat, false); + testCodec(new Composition(new NewPFDS9(), new VariableByte()), data, + Max, repeat, false); + testCodec(new Composition(new NewPFDS9(), new VariableByte()), data, + Max, repeat, true); + System.out.println(); - testCodec(new Composition(new NewPFDS9(), new VariableByte()), data, - Max, repeat, false); - testCodec(new Composition(new NewPFDS9(), new VariableByte()), data, - Max, repeat, false); - testCodec(new Composition(new NewPFDS9(), new VariableByte()), data, - Max, repeat, true); - System.out.println(); + testCodec(new Composition(new OptPFD(), new VariableByte()), data, + Max, repeat, false); + testCodec(new Composition(new OptPFD(), new VariableByte()), data, + Max, repeat, false); + testCodec(new Composition(new OptPFD(), new VariableByte()), data, + Max, repeat, true); + System.out.println(); - testCodec(new Composition(new OptPFD(), new VariableByte()), data, - Max, repeat, false); - testCodec(new Composition(new OptPFD(), new VariableByte()), data, - Max, repeat, false); - testCodec(new Composition(new OptPFD(), new VariableByte()), data, - Max, repeat, true); - System.out.println(); + testCodec(new Composition(new OptPFDS9(), new VariableByte()), data, + Max, repeat, false); + testCodec(new Composition(new OptPFDS9(), new VariableByte()), data, + Max, repeat, false); + testCodec(new Composition(new OptPFDS9(), new VariableByte()), data, + Max, repeat, true); + System.out.println(); - testCodec(new Composition(new OptPFDS9(), new VariableByte()), data, - Max, repeat, false); - testCodec(new Composition(new OptPFDS9(), new VariableByte()), data, - Max, repeat, false); - testCodec(new Composition(new OptPFDS9(), new VariableByte()), data, - Max, repeat, true); - System.out.println(); - - testCodec(new Composition(new FastPFOR(), new VariableByte()), - data, Max, repeat, false); - testCodec(new Composition(new FastPFOR(), new VariableByte()), - data, Max, repeat, false); - testCodec(new Composition(new FastPFOR(), new VariableByte()), - data, Max, repeat, true); - System.out.println(); + testCodec(new Composition(new FastPFOR(), new VariableByte()), + data, Max, repeat, false); + testCodec(new Composition(new FastPFOR(), new VariableByte()), + data, Max, repeat, false); + testCodec(new Composition(new FastPFOR(), new VariableByte()), + data, Max, repeat, true); + System.out.println(); - testCodec(new Simple9(), data, Max, repeat, false); - testCodec(new Simple9(), data, Max, repeat, false); - testCodec(new Simple9(), data, Max, repeat, true); - System.out.println(); - } - } + testCodec(new Simple9(), data, Max, repeat, false); + testCodec(new Simple9(), data, Max, repeat, false); + testCodec(new Simple9(), data, Max, repeat, true); + System.out.println(); + } + } } diff --git a/src/main/java/me/lemire/integercompression/BenchmarkBitPacking.java b/src/main/java/me/lemire/integercompression/BenchmarkBitPacking.java index 6a10cce..4659339 100644 --- a/src/main/java/me/lemire/integercompression/BenchmarkBitPacking.java +++ b/src/main/java/me/lemire/integercompression/BenchmarkBitPacking.java @@ -12,179 +12,182 @@ public class BenchmarkBitPacking { - public static void test(boolean verbose) { - DecimalFormat dfspeed = new DecimalFormat("0"); - final int N = 32; - final int times = 100000; - Random r = new Random(0); - int[] data = new int[N]; - int[] compressed = new int[N]; - int[] uncompressed = new int[N]; - for (int bit = 0; bit < 31; ++bit) { - long comp = 0; - long compwm = 0; - long decomp = 0; - for (int t = 0; t < times; ++t) { - for (int k = 0; k < N; ++k) { - data[k] = r.nextInt(1 << bit); + public static void test(boolean verbose) { + DecimalFormat dfspeed = new DecimalFormat("0"); + final int N = 32; + final int times = 100000; + Random r = new Random(0); + int[] data = new int[N]; + int[] compressed = new int[N]; + int[] uncompressed = new int[N]; + for (int bit = 0; bit < 31; ++bit) { + long comp = 0; + long compwm = 0; + long decomp = 0; + for (int t = 0; t < times; ++t) { + for (int k = 0; k < N; ++k) { + data[k] = r.nextInt(1 << bit); + } + long time1 = System.nanoTime(); + BitPacking.fastpack(data, 0, compressed, 0, bit); + long time2 = System.nanoTime(); + BitPacking.fastpackwithoutmask(data, 0, compressed, 0, bit); + long time3 = System.nanoTime(); + BitPacking.fastunpack(compressed, 0, uncompressed, 0, bit); + long time4 = System.nanoTime(); + comp += time2 - time1; + compwm += time3 - time2; + decomp += time4 - time3; + } + if (verbose) + System.out.println("bit = " + bit + " comp. speed = " + + dfspeed.format(N * times * 1000.0 / (comp)) + + " comp. speed wm = " + + dfspeed.format(N * times * 1000.0 / (compwm)) + + " decomp. speed = " + + dfspeed.format(N * times * 1000.0 / (decomp))); } - long time1 = System.nanoTime(); - BitPacking.fastpack(data, 0, compressed, 0, bit); - long time2 = System.nanoTime(); - BitPacking.fastpackwithoutmask(data, 0, compressed, 0, bit); - long time3 = System.nanoTime(); - BitPacking.fastunpack(compressed, 0, uncompressed, 0, bit); - long time4 = System.nanoTime(); - comp += time2 - time1; - compwm += time3 - time2; - decomp += time4 - time3; - } - if (verbose) - System.out.println("bit = " + bit + " comp. speed = " - + dfspeed.format(N * times * 1000.0 / (comp)) - + " comp. speed wm = " - + dfspeed.format(N * times * 1000.0 / (compwm)) - + " decomp. speed = " - + dfspeed.format(N * times * 1000.0 / (decomp))); } - } - public static void testWithDeltas(boolean verbose) { - DecimalFormat dfspeed = new DecimalFormat("0"); - final int N = 32; - final int times = 100000; - Random r = new Random(0); - int[] data = new int[N]; - int[] compressed = new int[N]; - int[] icompressed = new int[N]; - int[] uncompressed = new int[N]; - for (int bit = 1; bit < 31; ++bit) { - long comp = 0; - long decomp = 0; - long icomp = 0; - long idecomp = 0; - for (int t = 0; t < times; ++t) { - data[0] = r.nextInt(1 << bit); - for (int k = 1; k < N; ++k) { - data[k] = r.nextInt(1 << bit) + data[k-1]; - } - int[] tmpdata = Arrays.copyOf(data, data.length); - long time1 = System.nanoTime(); - Delta.delta(tmpdata); - BitPacking.fastpackwithoutmask(tmpdata, 0, compressed, 0, bit); - long time2 = System.nanoTime(); - BitPacking.fastunpack(compressed, 0, uncompressed, 0, bit); - Delta.fastinverseDelta(uncompressed); - long time3 = System.nanoTime(); - if(!Arrays.equals(data, uncompressed)) throw new RuntimeException("bug"); - comp += time2 - time1; - decomp += time3 - time2; - tmpdata = Arrays.copyOf(data, data.length); - time1 = System.nanoTime(); - IntegratedBitPacking.integratedpack(0, tmpdata, 0, icompressed, 0, bit); - time2 = System.nanoTime(); - IntegratedBitPacking.integratedunpack(0, icompressed, 0, uncompressed, 0, bit); - time3 = System.nanoTime(); - if(!Arrays.equals(icompressed, compressed)) throw new RuntimeException("ibug "+bit); - if(!Arrays.equals(data, uncompressed)) throw new RuntimeException("bug "+bit); - icomp += time2 - time1; - idecomp += time3 - time2; - } - if (verbose) - System.out.println("bit = " + bit + " comp. speed = " - + dfspeed.format(N * times * 1000.0 / (comp)) - + " decomp. speed = " - + dfspeed.format(N * times * 1000.0 / (decomp)) - + " icomp. speed = " - + dfspeed.format(N * times * 1000.0 / (icomp)) - + " idecomp. speed = " - + dfspeed.format(N * times * 1000.0 / (idecomp)) - ); - } - } - - public static void verify() { - System.out.println("Checking the code..."); - final int N = 32; - final int times = 1000; - Random r = new Random(); - int[] data = new int[N]; - int[] compressed = new int[N]; - int[] uncompressed = new int[N]; - for (int bit = 0; bit < 31; ++bit) { - for (int t = 0; t < times; ++t) { - for (int k = 0; k < N; ++k) { - data[k] = r.nextInt(1 << bit); - } - BitPacking.fastpack(data, 0, compressed, 0, bit); - BitPacking.fastunpack(compressed, 0, uncompressed, 0, bit); - if (!Arrays.equals(uncompressed, data)) { - throw new RuntimeException("bug " + bit); + public static void testWithDeltas(boolean verbose) { + DecimalFormat dfspeed = new DecimalFormat("0"); + final int N = 32; + final int times = 100000; + Random r = new Random(0); + int[] data = new int[N]; + int[] compressed = new int[N]; + int[] icompressed = new int[N]; + int[] uncompressed = new int[N]; + for (int bit = 1; bit < 31; ++bit) { + long comp = 0; + long decomp = 0; + long icomp = 0; + long idecomp = 0; + for (int t = 0; t < times; ++t) { + data[0] = r.nextInt(1 << bit); + for (int k = 1; k < N; ++k) { + data[k] = r.nextInt(1 << bit) + data[k - 1]; + } + int[] tmpdata = Arrays.copyOf(data, data.length); + long time1 = System.nanoTime(); + Delta.delta(tmpdata); + BitPacking.fastpackwithoutmask(tmpdata, 0, compressed, 0, bit); + long time2 = System.nanoTime(); + BitPacking.fastunpack(compressed, 0, uncompressed, 0, bit); + Delta.fastinverseDelta(uncompressed); + long time3 = System.nanoTime(); + if (!Arrays.equals(data, uncompressed)) throw new RuntimeException("bug"); + comp += time2 - time1; + decomp += time3 - time2; + tmpdata = Arrays.copyOf(data, data.length); + time1 = System.nanoTime(); + IntegratedBitPacking.integratedpack(0, tmpdata, 0, icompressed, 0, bit); + time2 = System.nanoTime(); + IntegratedBitPacking.integratedunpack(0, icompressed, 0, uncompressed, 0, bit); + time3 = System.nanoTime(); + if (!Arrays.equals(icompressed, compressed)) throw new RuntimeException("ibug " + bit); + if (!Arrays.equals(data, uncompressed)) throw new RuntimeException("bug " + bit); + icomp += time2 - time1; + idecomp += time3 - time2; + } + if (verbose) + System.out.println("bit = " + bit + " comp. speed = " + + dfspeed.format(N * times * 1000.0 / (comp)) + + " decomp. speed = " + + dfspeed.format(N * times * 1000.0 / (decomp)) + + " icomp. speed = " + + dfspeed.format(N * times * 1000.0 / (icomp)) + + " idecomp. speed = " + + dfspeed.format(N * times * 1000.0 / (idecomp)) + ); } - } } - System.out.println("Code appears to be correct."); - } - public static void verifyWithoutMask() { - System.out.println("Checking the code..."); - final int N = 32; - final int times = 1000; - Random r = new Random(); - int[] data = new int[N]; - int[] compressed = new int[N]; - int[] uncompressed = new int[N]; - for (int bit = 0; bit < 31; ++bit) { - for (int t = 0; t < times; ++t) { - for (int k = 0; k < N; ++k) { - data[k] = r.nextInt(1 << bit); - } - BitPacking.fastpackwithoutmask(data, 0, compressed, 0, bit); - BitPacking.fastunpack(compressed, 0, uncompressed, 0, bit); - if (!Arrays.equals(uncompressed, data)) { - throw new RuntimeException("bug " + bit); + + public static void verify() { + System.out.println("Checking the code..."); + final int N = 32; + final int times = 1000; + Random r = new Random(); + int[] data = new int[N]; + int[] compressed = new int[N]; + int[] uncompressed = new int[N]; + for (int bit = 0; bit < 31; ++bit) { + for (int t = 0; t < times; ++t) { + for (int k = 0; k < N; ++k) { + data[k] = r.nextInt(1 << bit); + } + BitPacking.fastpack(data, 0, compressed, 0, bit); + BitPacking.fastunpack(compressed, 0, uncompressed, 0, bit); + if (!Arrays.equals(uncompressed, data)) { + throw new RuntimeException("bug " + bit); + } + } } - } + System.out.println("Code appears to be correct."); } - System.out.println("Code appears to be correct."); - } - public static void verifyWithExceptions() { - System.out.println("Checking the code..."); - final int N = 32; - final int times = 1000; - Random r = new Random(); - int[] data = new int[N]; - int[] compressed = new int[N]; - int[] uncompressed = new int[N]; - for (int bit = 0; bit < 31; ++bit) { - for (int t = 0; t < times; ++t) { - for (int k = 0; k < N; ++k) { - data[k] = r.nextInt(); + + public static void verifyWithoutMask() { + System.out.println("Checking the code..."); + final int N = 32; + final int times = 1000; + Random r = new Random(); + int[] data = new int[N]; + int[] compressed = new int[N]; + int[] uncompressed = new int[N]; + for (int bit = 0; bit < 31; ++bit) { + for (int t = 0; t < times; ++t) { + for (int k = 0; k < N; ++k) { + data[k] = r.nextInt(1 << bit); + } + BitPacking.fastpackwithoutmask(data, 0, compressed, 0, bit); + BitPacking.fastunpack(compressed, 0, uncompressed, 0, bit); + if (!Arrays.equals(uncompressed, data)) { + throw new RuntimeException("bug " + bit); + } + } } - BitPacking.fastpack(data, 0, compressed, 0, bit); - BitPacking.fastunpack(compressed, 0, uncompressed, 0, bit); - for(int k = 0; k < N; ++k) { - if((data[k]& ((1<>> 24); - final int mbits2 = (in[tmpinpos] >>> 16) & 0xFF; - final int mbits3 = (in[tmpinpos] >>> 8) & 0xFF; - final int mbits4 = (in[tmpinpos]) & 0xFF; - ++tmpinpos; - BitPacking.fastunpack(in, tmpinpos, out, s, mbits1); - tmpinpos += mbits1; - BitPacking.fastunpack(in, tmpinpos, out, s + 32, mbits2); - tmpinpos += mbits2; - BitPacking.fastunpack(in, tmpinpos, out, s + 2 * 32, mbits3); - tmpinpos += mbits3; - BitPacking.fastunpack(in, tmpinpos, out, s + 3 * 32, mbits4); - tmpinpos += mbits4; + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + // Util.assertTrue(inpos.get()+inlength <= in.length); + final int outlength = in[inpos.get()]; + inpos.increment(); + int tmpinpos = inpos.get(); + for (int s = outpos.get(); s < outpos.get() + outlength; s += 32 * 4) { + final int mbits1 = (in[tmpinpos] >>> 24); + final int mbits2 = (in[tmpinpos] >>> 16) & 0xFF; + final int mbits3 = (in[tmpinpos] >>> 8) & 0xFF; + final int mbits4 = (in[tmpinpos]) & 0xFF; + ++tmpinpos; + BitPacking.fastunpack(in, tmpinpos, out, s, mbits1); + tmpinpos += mbits1; + BitPacking.fastunpack(in, tmpinpos, out, s + 32, mbits2); + tmpinpos += mbits2; + BitPacking.fastunpack(in, tmpinpos, out, s + 2 * 32, mbits3); + tmpinpos += mbits3; + BitPacking.fastunpack(in, tmpinpos, out, s + 3 * 32, mbits4); + tmpinpos += mbits4; + } + outpos.add(outlength); + inpos.set(tmpinpos); } - outpos.add(outlength); - inpos.set(tmpinpos); - } } diff --git a/src/main/java/me/lemire/integercompression/BitPacking.java b/src/main/java/me/lemire/integercompression/BitPacking.java index b4e234b..349ab32 100644 --- a/src/main/java/me/lemire/integercompression/BitPacking.java +++ b/src/main/java/me/lemire/integercompression/BitPacking.java @@ -10,7125 +10,6936 @@ import java.util.Arrays; public final class BitPacking { - - - - -public static void fastpackwithoutmask1(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 1 ) - | (( in[ 2 + inpos] ) << 2 ) - | (( in[ 3 + inpos] ) << 3 ) - | (( in[ 4 + inpos] ) << 4 ) - | (( in[ 5 + inpos] ) << 5 ) - | (( in[ 6 + inpos] ) << 6 ) - | (( in[ 7 + inpos] ) << 7 ) - | (( in[ 8 + inpos] ) << 8 ) - | (( in[ 9 + inpos] ) << 9 ) - | (( in[ 10 + inpos] ) << 10 ) - | (( in[ 11 + inpos] ) << 11 ) - | (( in[ 12 + inpos] ) << 12 ) - | (( in[ 13 + inpos] ) << 13 ) - | (( in[ 14 + inpos] ) << 14 ) - | (( in[ 15 + inpos] ) << 15 ) - | (( in[ 16 + inpos] ) << 16 ) - | (( in[ 17 + inpos] ) << 17 ) - | (( in[ 18 + inpos] ) << 18 ) - | (( in[ 19 + inpos] ) << 19 ) - | (( in[ 20 + inpos] ) << 20 ) - | (( in[ 21 + inpos] ) << 21 ) - | (( in[ 22 + inpos] ) << 22 ) - | (( in[ 23 + inpos] ) << 23 ) - | (( in[ 24 + inpos] ) << 24 ) - | (( in[ 25 + inpos] ) << 25 ) - | (( in[ 26 + inpos] ) << 26 ) - | (( in[ 27 + inpos] ) << 27 ) - | (( in[ 28 + inpos] ) << 28 ) - | (( in[ 29 + inpos] ) << 29 ) - | (( in[ 30 + inpos] ) << 30 ) - | (( in[ 31 + inpos] ) << 31 ) - ; -} - - - - -public static void fastpackwithoutmask2(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 2 ) - | (( in[ 2 + inpos] ) << 4 ) - | (( in[ 3 + inpos] ) << 6 ) - | (( in[ 4 + inpos] ) << 8 ) - | (( in[ 5 + inpos] ) << 10 ) - | (( in[ 6 + inpos] ) << 12 ) - | (( in[ 7 + inpos] ) << 14 ) - | (( in[ 8 + inpos] ) << 16 ) - | (( in[ 9 + inpos] ) << 18 ) - | (( in[ 10 + inpos] ) << 20 ) - | (( in[ 11 + inpos] ) << 22 ) - | (( in[ 12 + inpos] ) << 24 ) - | (( in[ 13 + inpos] ) << 26 ) - | (( in[ 14 + inpos] ) << 28 ) - | (( in[ 15 + inpos] ) << 30 ) - ; - out[ 1 + outpos] = in[ 16 + inpos] - | (( in[ 17 + inpos] ) << 2 ) - | (( in[ 18 + inpos] ) << 4 ) - | (( in[ 19 + inpos] ) << 6 ) - | (( in[ 20 + inpos] ) << 8 ) - | (( in[ 21 + inpos] ) << 10 ) - | (( in[ 22 + inpos] ) << 12 ) - | (( in[ 23 + inpos] ) << 14 ) - | (( in[ 24 + inpos] ) << 16 ) - | (( in[ 25 + inpos] ) << 18 ) - | (( in[ 26 + inpos] ) << 20 ) - | (( in[ 27 + inpos] ) << 22 ) - | (( in[ 28 + inpos] ) << 24 ) - | (( in[ 29 + inpos] ) << 26 ) - | (( in[ 30 + inpos] ) << 28 ) - | (( in[ 31 + inpos] ) << 30 ) - ; -} - - - - -public static void fastpackwithoutmask3(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 3 ) - | (( in[ 2 + inpos] ) << 6 ) - | (( in[ 3 + inpos] ) << 9 ) - | (( in[ 4 + inpos] ) << 12 ) - | (( in[ 5 + inpos] ) << 15 ) - | (( in[ 6 + inpos] ) << 18 ) - | (( in[ 7 + inpos] ) << 21 ) - | (( in[ 8 + inpos] ) << 24 ) - | (( in[ 9 + inpos] ) << 27 ) - | (( in[ 10 + inpos] ) << 30 ) - ; - out[ 1 + outpos] = (( in[ 10 + inpos] ) >>> ( 3 - 1 )) - | (( in[ 11 + inpos] ) << 1 ) - | (( in[ 12 + inpos] ) << 4 ) - | (( in[ 13 + inpos] ) << 7 ) - | (( in[ 14 + inpos] ) << 10 ) - | (( in[ 15 + inpos] ) << 13 ) - | (( in[ 16 + inpos] ) << 16 ) - | (( in[ 17 + inpos] ) << 19 ) - | (( in[ 18 + inpos] ) << 22 ) - | (( in[ 19 + inpos] ) << 25 ) - | (( in[ 20 + inpos] ) << 28 ) - | (( in[ 21 + inpos] ) << 31 ) - ; - out[ 2 + outpos] = (( in[ 21 + inpos] ) >>> ( 3 - 2 )) - | (( in[ 22 + inpos] ) << 2 ) - | (( in[ 23 + inpos] ) << 5 ) - | (( in[ 24 + inpos] ) << 8 ) - | (( in[ 25 + inpos] ) << 11 ) - | (( in[ 26 + inpos] ) << 14 ) - | (( in[ 27 + inpos] ) << 17 ) - | (( in[ 28 + inpos] ) << 20 ) - | (( in[ 29 + inpos] ) << 23 ) - | (( in[ 30 + inpos] ) << 26 ) - | (( in[ 31 + inpos] ) << 29 ) - ; -} - - - - -public static void fastpackwithoutmask4(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 4 ) - | (( in[ 2 + inpos] ) << 8 ) - | (( in[ 3 + inpos] ) << 12 ) - | (( in[ 4 + inpos] ) << 16 ) - | (( in[ 5 + inpos] ) << 20 ) - | (( in[ 6 + inpos] ) << 24 ) - | (( in[ 7 + inpos] ) << 28 ) - ; - out[ 1 + outpos] = in[ 8 + inpos] - | (( in[ 9 + inpos] ) << 4 ) - | (( in[ 10 + inpos] ) << 8 ) - | (( in[ 11 + inpos] ) << 12 ) - | (( in[ 12 + inpos] ) << 16 ) - | (( in[ 13 + inpos] ) << 20 ) - | (( in[ 14 + inpos] ) << 24 ) - | (( in[ 15 + inpos] ) << 28 ) - ; - out[ 2 + outpos] = in[ 16 + inpos] - | (( in[ 17 + inpos] ) << 4 ) - | (( in[ 18 + inpos] ) << 8 ) - | (( in[ 19 + inpos] ) << 12 ) - | (( in[ 20 + inpos] ) << 16 ) - | (( in[ 21 + inpos] ) << 20 ) - | (( in[ 22 + inpos] ) << 24 ) - | (( in[ 23 + inpos] ) << 28 ) - ; - out[ 3 + outpos] = in[ 24 + inpos] - | (( in[ 25 + inpos] ) << 4 ) - | (( in[ 26 + inpos] ) << 8 ) - | (( in[ 27 + inpos] ) << 12 ) - | (( in[ 28 + inpos] ) << 16 ) - | (( in[ 29 + inpos] ) << 20 ) - | (( in[ 30 + inpos] ) << 24 ) - | (( in[ 31 + inpos] ) << 28 ) - ; -} - - - - -public static void fastpackwithoutmask5(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 5 ) - | (( in[ 2 + inpos] ) << 10 ) - | (( in[ 3 + inpos] ) << 15 ) - | (( in[ 4 + inpos] ) << 20 ) - | (( in[ 5 + inpos] ) << 25 ) - | (( in[ 6 + inpos] ) << 30 ) - ; - out[ 1 + outpos] = (( in[ 6 + inpos] ) >>> ( 5 - 3 )) - | (( in[ 7 + inpos] ) << 3 ) - | (( in[ 8 + inpos] ) << 8 ) - | (( in[ 9 + inpos] ) << 13 ) - | (( in[ 10 + inpos] ) << 18 ) - | (( in[ 11 + inpos] ) << 23 ) - | (( in[ 12 + inpos] ) << 28 ) - ; - out[ 2 + outpos] = (( in[ 12 + inpos] ) >>> ( 5 - 1 )) - | (( in[ 13 + inpos] ) << 1 ) - | (( in[ 14 + inpos] ) << 6 ) - | (( in[ 15 + inpos] ) << 11 ) - | (( in[ 16 + inpos] ) << 16 ) - | (( in[ 17 + inpos] ) << 21 ) - | (( in[ 18 + inpos] ) << 26 ) - | (( in[ 19 + inpos] ) << 31 ) - ; - out[ 3 + outpos] = (( in[ 19 + inpos] ) >>> ( 5 - 4 )) - | (( in[ 20 + inpos] ) << 4 ) - | (( in[ 21 + inpos] ) << 9 ) - | (( in[ 22 + inpos] ) << 14 ) - | (( in[ 23 + inpos] ) << 19 ) - | (( in[ 24 + inpos] ) << 24 ) - | (( in[ 25 + inpos] ) << 29 ) - ; - out[ 4 + outpos] = (( in[ 25 + inpos] ) >>> ( 5 - 2 )) - | (( in[ 26 + inpos] ) << 2 ) - | (( in[ 27 + inpos] ) << 7 ) - | (( in[ 28 + inpos] ) << 12 ) - | (( in[ 29 + inpos] ) << 17 ) - | (( in[ 30 + inpos] ) << 22 ) - | (( in[ 31 + inpos] ) << 27 ) - ; -} - - - - -public static void fastpackwithoutmask6(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 6 ) - | (( in[ 2 + inpos] ) << 12 ) - | (( in[ 3 + inpos] ) << 18 ) - | (( in[ 4 + inpos] ) << 24 ) - | (( in[ 5 + inpos] ) << 30 ) - ; - out[ 1 + outpos] = (( in[ 5 + inpos] ) >>> ( 6 - 4 )) - | (( in[ 6 + inpos] ) << 4 ) - | (( in[ 7 + inpos] ) << 10 ) - | (( in[ 8 + inpos] ) << 16 ) - | (( in[ 9 + inpos] ) << 22 ) - | (( in[ 10 + inpos] ) << 28 ) - ; - out[ 2 + outpos] = (( in[ 10 + inpos] ) >>> ( 6 - 2 )) - | (( in[ 11 + inpos] ) << 2 ) - | (( in[ 12 + inpos] ) << 8 ) - | (( in[ 13 + inpos] ) << 14 ) - | (( in[ 14 + inpos] ) << 20 ) - | (( in[ 15 + inpos] ) << 26 ) - ; - out[ 3 + outpos] = in[ 16 + inpos] - | (( in[ 17 + inpos] ) << 6 ) - | (( in[ 18 + inpos] ) << 12 ) - | (( in[ 19 + inpos] ) << 18 ) - | (( in[ 20 + inpos] ) << 24 ) - | (( in[ 21 + inpos] ) << 30 ) - ; - out[ 4 + outpos] = (( in[ 21 + inpos] ) >>> ( 6 - 4 )) - | (( in[ 22 + inpos] ) << 4 ) - | (( in[ 23 + inpos] ) << 10 ) - | (( in[ 24 + inpos] ) << 16 ) - | (( in[ 25 + inpos] ) << 22 ) - | (( in[ 26 + inpos] ) << 28 ) - ; - out[ 5 + outpos] = (( in[ 26 + inpos] ) >>> ( 6 - 2 )) - | (( in[ 27 + inpos] ) << 2 ) - | (( in[ 28 + inpos] ) << 8 ) - | (( in[ 29 + inpos] ) << 14 ) - | (( in[ 30 + inpos] ) << 20 ) - | (( in[ 31 + inpos] ) << 26 ) - ; -} - - - - -public static void fastpackwithoutmask7(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 7 ) - | (( in[ 2 + inpos] ) << 14 ) - | (( in[ 3 + inpos] ) << 21 ) - | (( in[ 4 + inpos] ) << 28 ) - ; - out[ 1 + outpos] = (( in[ 4 + inpos] ) >>> ( 7 - 3 )) - | (( in[ 5 + inpos] ) << 3 ) - | (( in[ 6 + inpos] ) << 10 ) - | (( in[ 7 + inpos] ) << 17 ) - | (( in[ 8 + inpos] ) << 24 ) - | (( in[ 9 + inpos] ) << 31 ) - ; - out[ 2 + outpos] = (( in[ 9 + inpos] ) >>> ( 7 - 6 )) - | (( in[ 10 + inpos] ) << 6 ) - | (( in[ 11 + inpos] ) << 13 ) - | (( in[ 12 + inpos] ) << 20 ) - | (( in[ 13 + inpos] ) << 27 ) - ; - out[ 3 + outpos] = (( in[ 13 + inpos] ) >>> ( 7 - 2 )) - | (( in[ 14 + inpos] ) << 2 ) - | (( in[ 15 + inpos] ) << 9 ) - | (( in[ 16 + inpos] ) << 16 ) - | (( in[ 17 + inpos] ) << 23 ) - | (( in[ 18 + inpos] ) << 30 ) - ; - out[ 4 + outpos] = (( in[ 18 + inpos] ) >>> ( 7 - 5 )) - | (( in[ 19 + inpos] ) << 5 ) - | (( in[ 20 + inpos] ) << 12 ) - | (( in[ 21 + inpos] ) << 19 ) - | (( in[ 22 + inpos] ) << 26 ) - ; - out[ 5 + outpos] = (( in[ 22 + inpos] ) >>> ( 7 - 1 )) - | (( in[ 23 + inpos] ) << 1 ) - | (( in[ 24 + inpos] ) << 8 ) - | (( in[ 25 + inpos] ) << 15 ) - | (( in[ 26 + inpos] ) << 22 ) - | (( in[ 27 + inpos] ) << 29 ) - ; - out[ 6 + outpos] = (( in[ 27 + inpos] ) >>> ( 7 - 4 )) - | (( in[ 28 + inpos] ) << 4 ) - | (( in[ 29 + inpos] ) << 11 ) - | (( in[ 30 + inpos] ) << 18 ) - | (( in[ 31 + inpos] ) << 25 ) - ; -} - - - - -public static void fastpackwithoutmask8(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 8 ) - | (( in[ 2 + inpos] ) << 16 ) - | (( in[ 3 + inpos] ) << 24 ) - ; - out[ 1 + outpos] = in[ 4 + inpos] - | (( in[ 5 + inpos] ) << 8 ) - | (( in[ 6 + inpos] ) << 16 ) - | (( in[ 7 + inpos] ) << 24 ) - ; - out[ 2 + outpos] = in[ 8 + inpos] - | (( in[ 9 + inpos] ) << 8 ) - | (( in[ 10 + inpos] ) << 16 ) - | (( in[ 11 + inpos] ) << 24 ) - ; - out[ 3 + outpos] = in[ 12 + inpos] - | (( in[ 13 + inpos] ) << 8 ) - | (( in[ 14 + inpos] ) << 16 ) - | (( in[ 15 + inpos] ) << 24 ) - ; - out[ 4 + outpos] = in[ 16 + inpos] - | (( in[ 17 + inpos] ) << 8 ) - | (( in[ 18 + inpos] ) << 16 ) - | (( in[ 19 + inpos] ) << 24 ) - ; - out[ 5 + outpos] = in[ 20 + inpos] - | (( in[ 21 + inpos] ) << 8 ) - | (( in[ 22 + inpos] ) << 16 ) - | (( in[ 23 + inpos] ) << 24 ) - ; - out[ 6 + outpos] = in[ 24 + inpos] - | (( in[ 25 + inpos] ) << 8 ) - | (( in[ 26 + inpos] ) << 16 ) - | (( in[ 27 + inpos] ) << 24 ) - ; - out[ 7 + outpos] = in[ 28 + inpos] - | (( in[ 29 + inpos] ) << 8 ) - | (( in[ 30 + inpos] ) << 16 ) - | (( in[ 31 + inpos] ) << 24 ) - ; -} - - - - -public static void fastpackwithoutmask9(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 9 ) - | (( in[ 2 + inpos] ) << 18 ) - | (( in[ 3 + inpos] ) << 27 ) - ; - out[ 1 + outpos] = (( in[ 3 + inpos] ) >>> ( 9 - 4 )) - | (( in[ 4 + inpos] ) << 4 ) - | (( in[ 5 + inpos] ) << 13 ) - | (( in[ 6 + inpos] ) << 22 ) - | (( in[ 7 + inpos] ) << 31 ) - ; - out[ 2 + outpos] = (( in[ 7 + inpos] ) >>> ( 9 - 8 )) - | (( in[ 8 + inpos] ) << 8 ) - | (( in[ 9 + inpos] ) << 17 ) - | (( in[ 10 + inpos] ) << 26 ) - ; - out[ 3 + outpos] = (( in[ 10 + inpos] ) >>> ( 9 - 3 )) - | (( in[ 11 + inpos] ) << 3 ) - | (( in[ 12 + inpos] ) << 12 ) - | (( in[ 13 + inpos] ) << 21 ) - | (( in[ 14 + inpos] ) << 30 ) - ; - out[ 4 + outpos] = (( in[ 14 + inpos] ) >>> ( 9 - 7 )) - | (( in[ 15 + inpos] ) << 7 ) - | (( in[ 16 + inpos] ) << 16 ) - | (( in[ 17 + inpos] ) << 25 ) - ; - out[ 5 + outpos] = (( in[ 17 + inpos] ) >>> ( 9 - 2 )) - | (( in[ 18 + inpos] ) << 2 ) - | (( in[ 19 + inpos] ) << 11 ) - | (( in[ 20 + inpos] ) << 20 ) - | (( in[ 21 + inpos] ) << 29 ) - ; - out[ 6 + outpos] = (( in[ 21 + inpos] ) >>> ( 9 - 6 )) - | (( in[ 22 + inpos] ) << 6 ) - | (( in[ 23 + inpos] ) << 15 ) - | (( in[ 24 + inpos] ) << 24 ) - ; - out[ 7 + outpos] = (( in[ 24 + inpos] ) >>> ( 9 - 1 )) - | (( in[ 25 + inpos] ) << 1 ) - | (( in[ 26 + inpos] ) << 10 ) - | (( in[ 27 + inpos] ) << 19 ) - | (( in[ 28 + inpos] ) << 28 ) - ; - out[ 8 + outpos] = (( in[ 28 + inpos] ) >>> ( 9 - 5 )) - | (( in[ 29 + inpos] ) << 5 ) - | (( in[ 30 + inpos] ) << 14 ) - | (( in[ 31 + inpos] ) << 23 ) - ; -} - - - - -public static void fastpackwithoutmask10(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 10 ) - | (( in[ 2 + inpos] ) << 20 ) - | (( in[ 3 + inpos] ) << 30 ) - ; - out[ 1 + outpos] = (( in[ 3 + inpos] ) >>> ( 10 - 8 )) - | (( in[ 4 + inpos] ) << 8 ) - | (( in[ 5 + inpos] ) << 18 ) - | (( in[ 6 + inpos] ) << 28 ) - ; - out[ 2 + outpos] = (( in[ 6 + inpos] ) >>> ( 10 - 6 )) - | (( in[ 7 + inpos] ) << 6 ) - | (( in[ 8 + inpos] ) << 16 ) - | (( in[ 9 + inpos] ) << 26 ) - ; - out[ 3 + outpos] = (( in[ 9 + inpos] ) >>> ( 10 - 4 )) - | (( in[ 10 + inpos] ) << 4 ) - | (( in[ 11 + inpos] ) << 14 ) - | (( in[ 12 + inpos] ) << 24 ) - ; - out[ 4 + outpos] = (( in[ 12 + inpos] ) >>> ( 10 - 2 )) - | (( in[ 13 + inpos] ) << 2 ) - | (( in[ 14 + inpos] ) << 12 ) - | (( in[ 15 + inpos] ) << 22 ) - ; - out[ 5 + outpos] = in[ 16 + inpos] - | (( in[ 17 + inpos] ) << 10 ) - | (( in[ 18 + inpos] ) << 20 ) - | (( in[ 19 + inpos] ) << 30 ) - ; - out[ 6 + outpos] = (( in[ 19 + inpos] ) >>> ( 10 - 8 )) - | (( in[ 20 + inpos] ) << 8 ) - | (( in[ 21 + inpos] ) << 18 ) - | (( in[ 22 + inpos] ) << 28 ) - ; - out[ 7 + outpos] = (( in[ 22 + inpos] ) >>> ( 10 - 6 )) - | (( in[ 23 + inpos] ) << 6 ) - | (( in[ 24 + inpos] ) << 16 ) - | (( in[ 25 + inpos] ) << 26 ) - ; - out[ 8 + outpos] = (( in[ 25 + inpos] ) >>> ( 10 - 4 )) - | (( in[ 26 + inpos] ) << 4 ) - | (( in[ 27 + inpos] ) << 14 ) - | (( in[ 28 + inpos] ) << 24 ) - ; - out[ 9 + outpos] = (( in[ 28 + inpos] ) >>> ( 10 - 2 )) - | (( in[ 29 + inpos] ) << 2 ) - | (( in[ 30 + inpos] ) << 12 ) - | (( in[ 31 + inpos] ) << 22 ) - ; -} - - - - -public static void fastpackwithoutmask11(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 11 ) - | (( in[ 2 + inpos] ) << 22 ) - ; - out[ 1 + outpos] = (( in[ 2 + inpos] ) >>> ( 11 - 1 )) - | (( in[ 3 + inpos] ) << 1 ) - | (( in[ 4 + inpos] ) << 12 ) - | (( in[ 5 + inpos] ) << 23 ) - ; - out[ 2 + outpos] = (( in[ 5 + inpos] ) >>> ( 11 - 2 )) - | (( in[ 6 + inpos] ) << 2 ) - | (( in[ 7 + inpos] ) << 13 ) - | (( in[ 8 + inpos] ) << 24 ) - ; - out[ 3 + outpos] = (( in[ 8 + inpos] ) >>> ( 11 - 3 )) - | (( in[ 9 + inpos] ) << 3 ) - | (( in[ 10 + inpos] ) << 14 ) - | (( in[ 11 + inpos] ) << 25 ) - ; - out[ 4 + outpos] = (( in[ 11 + inpos] ) >>> ( 11 - 4 )) - | (( in[ 12 + inpos] ) << 4 ) - | (( in[ 13 + inpos] ) << 15 ) - | (( in[ 14 + inpos] ) << 26 ) - ; - out[ 5 + outpos] = (( in[ 14 + inpos] ) >>> ( 11 - 5 )) - | (( in[ 15 + inpos] ) << 5 ) - | (( in[ 16 + inpos] ) << 16 ) - | (( in[ 17 + inpos] ) << 27 ) - ; - out[ 6 + outpos] = (( in[ 17 + inpos] ) >>> ( 11 - 6 )) - | (( in[ 18 + inpos] ) << 6 ) - | (( in[ 19 + inpos] ) << 17 ) - | (( in[ 20 + inpos] ) << 28 ) - ; - out[ 7 + outpos] = (( in[ 20 + inpos] ) >>> ( 11 - 7 )) - | (( in[ 21 + inpos] ) << 7 ) - | (( in[ 22 + inpos] ) << 18 ) - | (( in[ 23 + inpos] ) << 29 ) - ; - out[ 8 + outpos] = (( in[ 23 + inpos] ) >>> ( 11 - 8 )) - | (( in[ 24 + inpos] ) << 8 ) - | (( in[ 25 + inpos] ) << 19 ) - | (( in[ 26 + inpos] ) << 30 ) - ; - out[ 9 + outpos] = (( in[ 26 + inpos] ) >>> ( 11 - 9 )) - | (( in[ 27 + inpos] ) << 9 ) - | (( in[ 28 + inpos] ) << 20 ) - | (( in[ 29 + inpos] ) << 31 ) - ; - out[ 10 + outpos] = (( in[ 29 + inpos] ) >>> ( 11 - 10 )) - | (( in[ 30 + inpos] ) << 10 ) - | (( in[ 31 + inpos] ) << 21 ) - ; -} - - - - -public static void fastpackwithoutmask12(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 12 ) - | (( in[ 2 + inpos] ) << 24 ) - ; - out[ 1 + outpos] = (( in[ 2 + inpos] ) >>> ( 12 - 4 )) - | (( in[ 3 + inpos] ) << 4 ) - | (( in[ 4 + inpos] ) << 16 ) - | (( in[ 5 + inpos] ) << 28 ) - ; - out[ 2 + outpos] = (( in[ 5 + inpos] ) >>> ( 12 - 8 )) - | (( in[ 6 + inpos] ) << 8 ) - | (( in[ 7 + inpos] ) << 20 ) - ; - out[ 3 + outpos] = in[ 8 + inpos] - | (( in[ 9 + inpos] ) << 12 ) - | (( in[ 10 + inpos] ) << 24 ) - ; - out[ 4 + outpos] = (( in[ 10 + inpos] ) >>> ( 12 - 4 )) - | (( in[ 11 + inpos] ) << 4 ) - | (( in[ 12 + inpos] ) << 16 ) - | (( in[ 13 + inpos] ) << 28 ) - ; - out[ 5 + outpos] = (( in[ 13 + inpos] ) >>> ( 12 - 8 )) - | (( in[ 14 + inpos] ) << 8 ) - | (( in[ 15 + inpos] ) << 20 ) - ; - out[ 6 + outpos] = in[ 16 + inpos] - | (( in[ 17 + inpos] ) << 12 ) - | (( in[ 18 + inpos] ) << 24 ) - ; - out[ 7 + outpos] = (( in[ 18 + inpos] ) >>> ( 12 - 4 )) - | (( in[ 19 + inpos] ) << 4 ) - | (( in[ 20 + inpos] ) << 16 ) - | (( in[ 21 + inpos] ) << 28 ) - ; - out[ 8 + outpos] = (( in[ 21 + inpos] ) >>> ( 12 - 8 )) - | (( in[ 22 + inpos] ) << 8 ) - | (( in[ 23 + inpos] ) << 20 ) - ; - out[ 9 + outpos] = in[ 24 + inpos] - | (( in[ 25 + inpos] ) << 12 ) - | (( in[ 26 + inpos] ) << 24 ) - ; - out[ 10 + outpos] = (( in[ 26 + inpos] ) >>> ( 12 - 4 )) - | (( in[ 27 + inpos] ) << 4 ) - | (( in[ 28 + inpos] ) << 16 ) - | (( in[ 29 + inpos] ) << 28 ) - ; - out[ 11 + outpos] = (( in[ 29 + inpos] ) >>> ( 12 - 8 )) - | (( in[ 30 + inpos] ) << 8 ) - | (( in[ 31 + inpos] ) << 20 ) - ; -} - - - - -public static void fastpackwithoutmask13(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 13 ) - | (( in[ 2 + inpos] ) << 26 ) - ; - out[ 1 + outpos] = (( in[ 2 + inpos] ) >>> ( 13 - 7 )) - | (( in[ 3 + inpos] ) << 7 ) - | (( in[ 4 + inpos] ) << 20 ) - ; - out[ 2 + outpos] = (( in[ 4 + inpos] ) >>> ( 13 - 1 )) - | (( in[ 5 + inpos] ) << 1 ) - | (( in[ 6 + inpos] ) << 14 ) - | (( in[ 7 + inpos] ) << 27 ) - ; - out[ 3 + outpos] = (( in[ 7 + inpos] ) >>> ( 13 - 8 )) - | (( in[ 8 + inpos] ) << 8 ) - | (( in[ 9 + inpos] ) << 21 ) - ; - out[ 4 + outpos] = (( in[ 9 + inpos] ) >>> ( 13 - 2 )) - | (( in[ 10 + inpos] ) << 2 ) - | (( in[ 11 + inpos] ) << 15 ) - | (( in[ 12 + inpos] ) << 28 ) - ; - out[ 5 + outpos] = (( in[ 12 + inpos] ) >>> ( 13 - 9 )) - | (( in[ 13 + inpos] ) << 9 ) - | (( in[ 14 + inpos] ) << 22 ) - ; - out[ 6 + outpos] = (( in[ 14 + inpos] ) >>> ( 13 - 3 )) - | (( in[ 15 + inpos] ) << 3 ) - | (( in[ 16 + inpos] ) << 16 ) - | (( in[ 17 + inpos] ) << 29 ) - ; - out[ 7 + outpos] = (( in[ 17 + inpos] ) >>> ( 13 - 10 )) - | (( in[ 18 + inpos] ) << 10 ) - | (( in[ 19 + inpos] ) << 23 ) - ; - out[ 8 + outpos] = (( in[ 19 + inpos] ) >>> ( 13 - 4 )) - | (( in[ 20 + inpos] ) << 4 ) - | (( in[ 21 + inpos] ) << 17 ) - | (( in[ 22 + inpos] ) << 30 ) - ; - out[ 9 + outpos] = (( in[ 22 + inpos] ) >>> ( 13 - 11 )) - | (( in[ 23 + inpos] ) << 11 ) - | (( in[ 24 + inpos] ) << 24 ) - ; - out[ 10 + outpos] = (( in[ 24 + inpos] ) >>> ( 13 - 5 )) - | (( in[ 25 + inpos] ) << 5 ) - | (( in[ 26 + inpos] ) << 18 ) - | (( in[ 27 + inpos] ) << 31 ) - ; - out[ 11 + outpos] = (( in[ 27 + inpos] ) >>> ( 13 - 12 )) - | (( in[ 28 + inpos] ) << 12 ) - | (( in[ 29 + inpos] ) << 25 ) - ; - out[ 12 + outpos] = (( in[ 29 + inpos] ) >>> ( 13 - 6 )) - | (( in[ 30 + inpos] ) << 6 ) - | (( in[ 31 + inpos] ) << 19 ) - ; -} - - - - -public static void fastpackwithoutmask14(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 14 ) - | (( in[ 2 + inpos] ) << 28 ) - ; - out[ 1 + outpos] = (( in[ 2 + inpos] ) >>> ( 14 - 10 )) - | (( in[ 3 + inpos] ) << 10 ) - | (( in[ 4 + inpos] ) << 24 ) - ; - out[ 2 + outpos] = (( in[ 4 + inpos] ) >>> ( 14 - 6 )) - | (( in[ 5 + inpos] ) << 6 ) - | (( in[ 6 + inpos] ) << 20 ) - ; - out[ 3 + outpos] = (( in[ 6 + inpos] ) >>> ( 14 - 2 )) - | (( in[ 7 + inpos] ) << 2 ) - | (( in[ 8 + inpos] ) << 16 ) - | (( in[ 9 + inpos] ) << 30 ) - ; - out[ 4 + outpos] = (( in[ 9 + inpos] ) >>> ( 14 - 12 )) - | (( in[ 10 + inpos] ) << 12 ) - | (( in[ 11 + inpos] ) << 26 ) - ; - out[ 5 + outpos] = (( in[ 11 + inpos] ) >>> ( 14 - 8 )) - | (( in[ 12 + inpos] ) << 8 ) - | (( in[ 13 + inpos] ) << 22 ) - ; - out[ 6 + outpos] = (( in[ 13 + inpos] ) >>> ( 14 - 4 )) - | (( in[ 14 + inpos] ) << 4 ) - | (( in[ 15 + inpos] ) << 18 ) - ; - out[ 7 + outpos] = in[ 16 + inpos] - | (( in[ 17 + inpos] ) << 14 ) - | (( in[ 18 + inpos] ) << 28 ) - ; - out[ 8 + outpos] = (( in[ 18 + inpos] ) >>> ( 14 - 10 )) - | (( in[ 19 + inpos] ) << 10 ) - | (( in[ 20 + inpos] ) << 24 ) - ; - out[ 9 + outpos] = (( in[ 20 + inpos] ) >>> ( 14 - 6 )) - | (( in[ 21 + inpos] ) << 6 ) - | (( in[ 22 + inpos] ) << 20 ) - ; - out[ 10 + outpos] = (( in[ 22 + inpos] ) >>> ( 14 - 2 )) - | (( in[ 23 + inpos] ) << 2 ) - | (( in[ 24 + inpos] ) << 16 ) - | (( in[ 25 + inpos] ) << 30 ) - ; - out[ 11 + outpos] = (( in[ 25 + inpos] ) >>> ( 14 - 12 )) - | (( in[ 26 + inpos] ) << 12 ) - | (( in[ 27 + inpos] ) << 26 ) - ; - out[ 12 + outpos] = (( in[ 27 + inpos] ) >>> ( 14 - 8 )) - | (( in[ 28 + inpos] ) << 8 ) - | (( in[ 29 + inpos] ) << 22 ) - ; - out[ 13 + outpos] = (( in[ 29 + inpos] ) >>> ( 14 - 4 )) - | (( in[ 30 + inpos] ) << 4 ) - | (( in[ 31 + inpos] ) << 18 ) - ; -} - - - - -public static void fastpackwithoutmask15(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 15 ) - | (( in[ 2 + inpos] ) << 30 ) - ; - out[ 1 + outpos] = (( in[ 2 + inpos] ) >>> ( 15 - 13 )) - | (( in[ 3 + inpos] ) << 13 ) - | (( in[ 4 + inpos] ) << 28 ) - ; - out[ 2 + outpos] = (( in[ 4 + inpos] ) >>> ( 15 - 11 )) - | (( in[ 5 + inpos] ) << 11 ) - | (( in[ 6 + inpos] ) << 26 ) - ; - out[ 3 + outpos] = (( in[ 6 + inpos] ) >>> ( 15 - 9 )) - | (( in[ 7 + inpos] ) << 9 ) - | (( in[ 8 + inpos] ) << 24 ) - ; - out[ 4 + outpos] = (( in[ 8 + inpos] ) >>> ( 15 - 7 )) - | (( in[ 9 + inpos] ) << 7 ) - | (( in[ 10 + inpos] ) << 22 ) - ; - out[ 5 + outpos] = (( in[ 10 + inpos] ) >>> ( 15 - 5 )) - | (( in[ 11 + inpos] ) << 5 ) - | (( in[ 12 + inpos] ) << 20 ) - ; - out[ 6 + outpos] = (( in[ 12 + inpos] ) >>> ( 15 - 3 )) - | (( in[ 13 + inpos] ) << 3 ) - | (( in[ 14 + inpos] ) << 18 ) - ; - out[ 7 + outpos] = (( in[ 14 + inpos] ) >>> ( 15 - 1 )) - | (( in[ 15 + inpos] ) << 1 ) - | (( in[ 16 + inpos] ) << 16 ) - | (( in[ 17 + inpos] ) << 31 ) - ; - out[ 8 + outpos] = (( in[ 17 + inpos] ) >>> ( 15 - 14 )) - | (( in[ 18 + inpos] ) << 14 ) - | (( in[ 19 + inpos] ) << 29 ) - ; - out[ 9 + outpos] = (( in[ 19 + inpos] ) >>> ( 15 - 12 )) - | (( in[ 20 + inpos] ) << 12 ) - | (( in[ 21 + inpos] ) << 27 ) - ; - out[ 10 + outpos] = (( in[ 21 + inpos] ) >>> ( 15 - 10 )) - | (( in[ 22 + inpos] ) << 10 ) - | (( in[ 23 + inpos] ) << 25 ) - ; - out[ 11 + outpos] = (( in[ 23 + inpos] ) >>> ( 15 - 8 )) - | (( in[ 24 + inpos] ) << 8 ) - | (( in[ 25 + inpos] ) << 23 ) - ; - out[ 12 + outpos] = (( in[ 25 + inpos] ) >>> ( 15 - 6 )) - | (( in[ 26 + inpos] ) << 6 ) - | (( in[ 27 + inpos] ) << 21 ) - ; - out[ 13 + outpos] = (( in[ 27 + inpos] ) >>> ( 15 - 4 )) - | (( in[ 28 + inpos] ) << 4 ) - | (( in[ 29 + inpos] ) << 19 ) - ; - out[ 14 + outpos] = (( in[ 29 + inpos] ) >>> ( 15 - 2 )) - | (( in[ 30 + inpos] ) << 2 ) - | (( in[ 31 + inpos] ) << 17 ) - ; -} - - - - -public static void fastpackwithoutmask16(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 16 ) - ; - out[ 1 + outpos] = in[ 2 + inpos] - | (( in[ 3 + inpos] ) << 16 ) - ; - out[ 2 + outpos] = in[ 4 + inpos] - | (( in[ 5 + inpos] ) << 16 ) - ; - out[ 3 + outpos] = in[ 6 + inpos] - | (( in[ 7 + inpos] ) << 16 ) - ; - out[ 4 + outpos] = in[ 8 + inpos] - | (( in[ 9 + inpos] ) << 16 ) - ; - out[ 5 + outpos] = in[ 10 + inpos] - | (( in[ 11 + inpos] ) << 16 ) - ; - out[ 6 + outpos] = in[ 12 + inpos] - | (( in[ 13 + inpos] ) << 16 ) - ; - out[ 7 + outpos] = in[ 14 + inpos] - | (( in[ 15 + inpos] ) << 16 ) - ; - out[ 8 + outpos] = in[ 16 + inpos] - | (( in[ 17 + inpos] ) << 16 ) - ; - out[ 9 + outpos] = in[ 18 + inpos] - | (( in[ 19 + inpos] ) << 16 ) - ; - out[ 10 + outpos] = in[ 20 + inpos] - | (( in[ 21 + inpos] ) << 16 ) - ; - out[ 11 + outpos] = in[ 22 + inpos] - | (( in[ 23 + inpos] ) << 16 ) - ; - out[ 12 + outpos] = in[ 24 + inpos] - | (( in[ 25 + inpos] ) << 16 ) - ; - out[ 13 + outpos] = in[ 26 + inpos] - | (( in[ 27 + inpos] ) << 16 ) - ; - out[ 14 + outpos] = in[ 28 + inpos] - | (( in[ 29 + inpos] ) << 16 ) - ; - out[ 15 + outpos] = in[ 30 + inpos] - | (( in[ 31 + inpos] ) << 16 ) - ; -} - - - - -public static void fastpackwithoutmask17(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 17 ) - ; - out[ 1 + outpos] = (( in[ 1 + inpos] ) >>> ( 17 - 2 )) - | (( in[ 2 + inpos] ) << 2 ) - | (( in[ 3 + inpos] ) << 19 ) - ; - out[ 2 + outpos] = (( in[ 3 + inpos] ) >>> ( 17 - 4 )) - | (( in[ 4 + inpos] ) << 4 ) - | (( in[ 5 + inpos] ) << 21 ) - ; - out[ 3 + outpos] = (( in[ 5 + inpos] ) >>> ( 17 - 6 )) - | (( in[ 6 + inpos] ) << 6 ) - | (( in[ 7 + inpos] ) << 23 ) - ; - out[ 4 + outpos] = (( in[ 7 + inpos] ) >>> ( 17 - 8 )) - | (( in[ 8 + inpos] ) << 8 ) - | (( in[ 9 + inpos] ) << 25 ) - ; - out[ 5 + outpos] = (( in[ 9 + inpos] ) >>> ( 17 - 10 )) - | (( in[ 10 + inpos] ) << 10 ) - | (( in[ 11 + inpos] ) << 27 ) - ; - out[ 6 + outpos] = (( in[ 11 + inpos] ) >>> ( 17 - 12 )) - | (( in[ 12 + inpos] ) << 12 ) - | (( in[ 13 + inpos] ) << 29 ) - ; - out[ 7 + outpos] = (( in[ 13 + inpos] ) >>> ( 17 - 14 )) - | (( in[ 14 + inpos] ) << 14 ) - | (( in[ 15 + inpos] ) << 31 ) - ; - out[ 8 + outpos] = (( in[ 15 + inpos] ) >>> ( 17 - 16 )) - | (( in[ 16 + inpos] ) << 16 ) - ; - out[ 9 + outpos] = (( in[ 16 + inpos] ) >>> ( 17 - 1 )) - | (( in[ 17 + inpos] ) << 1 ) - | (( in[ 18 + inpos] ) << 18 ) - ; - out[ 10 + outpos] = (( in[ 18 + inpos] ) >>> ( 17 - 3 )) - | (( in[ 19 + inpos] ) << 3 ) - | (( in[ 20 + inpos] ) << 20 ) - ; - out[ 11 + outpos] = (( in[ 20 + inpos] ) >>> ( 17 - 5 )) - | (( in[ 21 + inpos] ) << 5 ) - | (( in[ 22 + inpos] ) << 22 ) - ; - out[ 12 + outpos] = (( in[ 22 + inpos] ) >>> ( 17 - 7 )) - | (( in[ 23 + inpos] ) << 7 ) - | (( in[ 24 + inpos] ) << 24 ) - ; - out[ 13 + outpos] = (( in[ 24 + inpos] ) >>> ( 17 - 9 )) - | (( in[ 25 + inpos] ) << 9 ) - | (( in[ 26 + inpos] ) << 26 ) - ; - out[ 14 + outpos] = (( in[ 26 + inpos] ) >>> ( 17 - 11 )) - | (( in[ 27 + inpos] ) << 11 ) - | (( in[ 28 + inpos] ) << 28 ) - ; - out[ 15 + outpos] = (( in[ 28 + inpos] ) >>> ( 17 - 13 )) - | (( in[ 29 + inpos] ) << 13 ) - | (( in[ 30 + inpos] ) << 30 ) - ; - out[ 16 + outpos] = (( in[ 30 + inpos] ) >>> ( 17 - 15 )) - | (( in[ 31 + inpos] ) << 15 ) - ; -} - - - - -public static void fastpackwithoutmask18(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 18 ) - ; - out[ 1 + outpos] = (( in[ 1 + inpos] ) >>> ( 18 - 4 )) - | (( in[ 2 + inpos] ) << 4 ) - | (( in[ 3 + inpos] ) << 22 ) - ; - out[ 2 + outpos] = (( in[ 3 + inpos] ) >>> ( 18 - 8 )) - | (( in[ 4 + inpos] ) << 8 ) - | (( in[ 5 + inpos] ) << 26 ) - ; - out[ 3 + outpos] = (( in[ 5 + inpos] ) >>> ( 18 - 12 )) - | (( in[ 6 + inpos] ) << 12 ) - | (( in[ 7 + inpos] ) << 30 ) - ; - out[ 4 + outpos] = (( in[ 7 + inpos] ) >>> ( 18 - 16 )) - | (( in[ 8 + inpos] ) << 16 ) - ; - out[ 5 + outpos] = (( in[ 8 + inpos] ) >>> ( 18 - 2 )) - | (( in[ 9 + inpos] ) << 2 ) - | (( in[ 10 + inpos] ) << 20 ) - ; - out[ 6 + outpos] = (( in[ 10 + inpos] ) >>> ( 18 - 6 )) - | (( in[ 11 + inpos] ) << 6 ) - | (( in[ 12 + inpos] ) << 24 ) - ; - out[ 7 + outpos] = (( in[ 12 + inpos] ) >>> ( 18 - 10 )) - | (( in[ 13 + inpos] ) << 10 ) - | (( in[ 14 + inpos] ) << 28 ) - ; - out[ 8 + outpos] = (( in[ 14 + inpos] ) >>> ( 18 - 14 )) - | (( in[ 15 + inpos] ) << 14 ) - ; - out[ 9 + outpos] = in[ 16 + inpos] - | (( in[ 17 + inpos] ) << 18 ) - ; - out[ 10 + outpos] = (( in[ 17 + inpos] ) >>> ( 18 - 4 )) - | (( in[ 18 + inpos] ) << 4 ) - | (( in[ 19 + inpos] ) << 22 ) - ; - out[ 11 + outpos] = (( in[ 19 + inpos] ) >>> ( 18 - 8 )) - | (( in[ 20 + inpos] ) << 8 ) - | (( in[ 21 + inpos] ) << 26 ) - ; - out[ 12 + outpos] = (( in[ 21 + inpos] ) >>> ( 18 - 12 )) - | (( in[ 22 + inpos] ) << 12 ) - | (( in[ 23 + inpos] ) << 30 ) - ; - out[ 13 + outpos] = (( in[ 23 + inpos] ) >>> ( 18 - 16 )) - | (( in[ 24 + inpos] ) << 16 ) - ; - out[ 14 + outpos] = (( in[ 24 + inpos] ) >>> ( 18 - 2 )) - | (( in[ 25 + inpos] ) << 2 ) - | (( in[ 26 + inpos] ) << 20 ) - ; - out[ 15 + outpos] = (( in[ 26 + inpos] ) >>> ( 18 - 6 )) - | (( in[ 27 + inpos] ) << 6 ) - | (( in[ 28 + inpos] ) << 24 ) - ; - out[ 16 + outpos] = (( in[ 28 + inpos] ) >>> ( 18 - 10 )) - | (( in[ 29 + inpos] ) << 10 ) - | (( in[ 30 + inpos] ) << 28 ) - ; - out[ 17 + outpos] = (( in[ 30 + inpos] ) >>> ( 18 - 14 )) - | (( in[ 31 + inpos] ) << 14 ) - ; -} - - - - -public static void fastpackwithoutmask19(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 19 ) - ; - out[ 1 + outpos] = (( in[ 1 + inpos] ) >>> ( 19 - 6 )) - | (( in[ 2 + inpos] ) << 6 ) - | (( in[ 3 + inpos] ) << 25 ) - ; - out[ 2 + outpos] = (( in[ 3 + inpos] ) >>> ( 19 - 12 )) - | (( in[ 4 + inpos] ) << 12 ) - | (( in[ 5 + inpos] ) << 31 ) - ; - out[ 3 + outpos] = (( in[ 5 + inpos] ) >>> ( 19 - 18 )) - | (( in[ 6 + inpos] ) << 18 ) - ; - out[ 4 + outpos] = (( in[ 6 + inpos] ) >>> ( 19 - 5 )) - | (( in[ 7 + inpos] ) << 5 ) - | (( in[ 8 + inpos] ) << 24 ) - ; - out[ 5 + outpos] = (( in[ 8 + inpos] ) >>> ( 19 - 11 )) - | (( in[ 9 + inpos] ) << 11 ) - | (( in[ 10 + inpos] ) << 30 ) - ; - out[ 6 + outpos] = (( in[ 10 + inpos] ) >>> ( 19 - 17 )) - | (( in[ 11 + inpos] ) << 17 ) - ; - out[ 7 + outpos] = (( in[ 11 + inpos] ) >>> ( 19 - 4 )) - | (( in[ 12 + inpos] ) << 4 ) - | (( in[ 13 + inpos] ) << 23 ) - ; - out[ 8 + outpos] = (( in[ 13 + inpos] ) >>> ( 19 - 10 )) - | (( in[ 14 + inpos] ) << 10 ) - | (( in[ 15 + inpos] ) << 29 ) - ; - out[ 9 + outpos] = (( in[ 15 + inpos] ) >>> ( 19 - 16 )) - | (( in[ 16 + inpos] ) << 16 ) - ; - out[ 10 + outpos] = (( in[ 16 + inpos] ) >>> ( 19 - 3 )) - | (( in[ 17 + inpos] ) << 3 ) - | (( in[ 18 + inpos] ) << 22 ) - ; - out[ 11 + outpos] = (( in[ 18 + inpos] ) >>> ( 19 - 9 )) - | (( in[ 19 + inpos] ) << 9 ) - | (( in[ 20 + inpos] ) << 28 ) - ; - out[ 12 + outpos] = (( in[ 20 + inpos] ) >>> ( 19 - 15 )) - | (( in[ 21 + inpos] ) << 15 ) - ; - out[ 13 + outpos] = (( in[ 21 + inpos] ) >>> ( 19 - 2 )) - | (( in[ 22 + inpos] ) << 2 ) - | (( in[ 23 + inpos] ) << 21 ) - ; - out[ 14 + outpos] = (( in[ 23 + inpos] ) >>> ( 19 - 8 )) - | (( in[ 24 + inpos] ) << 8 ) - | (( in[ 25 + inpos] ) << 27 ) - ; - out[ 15 + outpos] = (( in[ 25 + inpos] ) >>> ( 19 - 14 )) - | (( in[ 26 + inpos] ) << 14 ) - ; - out[ 16 + outpos] = (( in[ 26 + inpos] ) >>> ( 19 - 1 )) - | (( in[ 27 + inpos] ) << 1 ) - | (( in[ 28 + inpos] ) << 20 ) - ; - out[ 17 + outpos] = (( in[ 28 + inpos] ) >>> ( 19 - 7 )) - | (( in[ 29 + inpos] ) << 7 ) - | (( in[ 30 + inpos] ) << 26 ) - ; - out[ 18 + outpos] = (( in[ 30 + inpos] ) >>> ( 19 - 13 )) - | (( in[ 31 + inpos] ) << 13 ) - ; -} - - - - -public static void fastpackwithoutmask20(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 20 ) - ; - out[ 1 + outpos] = (( in[ 1 + inpos] ) >>> ( 20 - 8 )) - | (( in[ 2 + inpos] ) << 8 ) - | (( in[ 3 + inpos] ) << 28 ) - ; - out[ 2 + outpos] = (( in[ 3 + inpos] ) >>> ( 20 - 16 )) - | (( in[ 4 + inpos] ) << 16 ) - ; - out[ 3 + outpos] = (( in[ 4 + inpos] ) >>> ( 20 - 4 )) - | (( in[ 5 + inpos] ) << 4 ) - | (( in[ 6 + inpos] ) << 24 ) - ; - out[ 4 + outpos] = (( in[ 6 + inpos] ) >>> ( 20 - 12 )) - | (( in[ 7 + inpos] ) << 12 ) - ; - out[ 5 + outpos] = in[ 8 + inpos] - | (( in[ 9 + inpos] ) << 20 ) - ; - out[ 6 + outpos] = (( in[ 9 + inpos] ) >>> ( 20 - 8 )) - | (( in[ 10 + inpos] ) << 8 ) - | (( in[ 11 + inpos] ) << 28 ) - ; - out[ 7 + outpos] = (( in[ 11 + inpos] ) >>> ( 20 - 16 )) - | (( in[ 12 + inpos] ) << 16 ) - ; - out[ 8 + outpos] = (( in[ 12 + inpos] ) >>> ( 20 - 4 )) - | (( in[ 13 + inpos] ) << 4 ) - | (( in[ 14 + inpos] ) << 24 ) - ; - out[ 9 + outpos] = (( in[ 14 + inpos] ) >>> ( 20 - 12 )) - | (( in[ 15 + inpos] ) << 12 ) - ; - out[ 10 + outpos] = in[ 16 + inpos] - | (( in[ 17 + inpos] ) << 20 ) - ; - out[ 11 + outpos] = (( in[ 17 + inpos] ) >>> ( 20 - 8 )) - | (( in[ 18 + inpos] ) << 8 ) - | (( in[ 19 + inpos] ) << 28 ) - ; - out[ 12 + outpos] = (( in[ 19 + inpos] ) >>> ( 20 - 16 )) - | (( in[ 20 + inpos] ) << 16 ) - ; - out[ 13 + outpos] = (( in[ 20 + inpos] ) >>> ( 20 - 4 )) - | (( in[ 21 + inpos] ) << 4 ) - | (( in[ 22 + inpos] ) << 24 ) - ; - out[ 14 + outpos] = (( in[ 22 + inpos] ) >>> ( 20 - 12 )) - | (( in[ 23 + inpos] ) << 12 ) - ; - out[ 15 + outpos] = in[ 24 + inpos] - | (( in[ 25 + inpos] ) << 20 ) - ; - out[ 16 + outpos] = (( in[ 25 + inpos] ) >>> ( 20 - 8 )) - | (( in[ 26 + inpos] ) << 8 ) - | (( in[ 27 + inpos] ) << 28 ) - ; - out[ 17 + outpos] = (( in[ 27 + inpos] ) >>> ( 20 - 16 )) - | (( in[ 28 + inpos] ) << 16 ) - ; - out[ 18 + outpos] = (( in[ 28 + inpos] ) >>> ( 20 - 4 )) - | (( in[ 29 + inpos] ) << 4 ) - | (( in[ 30 + inpos] ) << 24 ) - ; - out[ 19 + outpos] = (( in[ 30 + inpos] ) >>> ( 20 - 12 )) - | (( in[ 31 + inpos] ) << 12 ) - ; -} - - - - -public static void fastpackwithoutmask21(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 21 ) - ; - out[ 1 + outpos] = (( in[ 1 + inpos] ) >>> ( 21 - 10 )) - | (( in[ 2 + inpos] ) << 10 ) - | (( in[ 3 + inpos] ) << 31 ) - ; - out[ 2 + outpos] = (( in[ 3 + inpos] ) >>> ( 21 - 20 )) - | (( in[ 4 + inpos] ) << 20 ) - ; - out[ 3 + outpos] = (( in[ 4 + inpos] ) >>> ( 21 - 9 )) - | (( in[ 5 + inpos] ) << 9 ) - | (( in[ 6 + inpos] ) << 30 ) - ; - out[ 4 + outpos] = (( in[ 6 + inpos] ) >>> ( 21 - 19 )) - | (( in[ 7 + inpos] ) << 19 ) - ; - out[ 5 + outpos] = (( in[ 7 + inpos] ) >>> ( 21 - 8 )) - | (( in[ 8 + inpos] ) << 8 ) - | (( in[ 9 + inpos] ) << 29 ) - ; - out[ 6 + outpos] = (( in[ 9 + inpos] ) >>> ( 21 - 18 )) - | (( in[ 10 + inpos] ) << 18 ) - ; - out[ 7 + outpos] = (( in[ 10 + inpos] ) >>> ( 21 - 7 )) - | (( in[ 11 + inpos] ) << 7 ) - | (( in[ 12 + inpos] ) << 28 ) - ; - out[ 8 + outpos] = (( in[ 12 + inpos] ) >>> ( 21 - 17 )) - | (( in[ 13 + inpos] ) << 17 ) - ; - out[ 9 + outpos] = (( in[ 13 + inpos] ) >>> ( 21 - 6 )) - | (( in[ 14 + inpos] ) << 6 ) - | (( in[ 15 + inpos] ) << 27 ) - ; - out[ 10 + outpos] = (( in[ 15 + inpos] ) >>> ( 21 - 16 )) - | (( in[ 16 + inpos] ) << 16 ) - ; - out[ 11 + outpos] = (( in[ 16 + inpos] ) >>> ( 21 - 5 )) - | (( in[ 17 + inpos] ) << 5 ) - | (( in[ 18 + inpos] ) << 26 ) - ; - out[ 12 + outpos] = (( in[ 18 + inpos] ) >>> ( 21 - 15 )) - | (( in[ 19 + inpos] ) << 15 ) - ; - out[ 13 + outpos] = (( in[ 19 + inpos] ) >>> ( 21 - 4 )) - | (( in[ 20 + inpos] ) << 4 ) - | (( in[ 21 + inpos] ) << 25 ) - ; - out[ 14 + outpos] = (( in[ 21 + inpos] ) >>> ( 21 - 14 )) - | (( in[ 22 + inpos] ) << 14 ) - ; - out[ 15 + outpos] = (( in[ 22 + inpos] ) >>> ( 21 - 3 )) - | (( in[ 23 + inpos] ) << 3 ) - | (( in[ 24 + inpos] ) << 24 ) - ; - out[ 16 + outpos] = (( in[ 24 + inpos] ) >>> ( 21 - 13 )) - | (( in[ 25 + inpos] ) << 13 ) - ; - out[ 17 + outpos] = (( in[ 25 + inpos] ) >>> ( 21 - 2 )) - | (( in[ 26 + inpos] ) << 2 ) - | (( in[ 27 + inpos] ) << 23 ) - ; - out[ 18 + outpos] = (( in[ 27 + inpos] ) >>> ( 21 - 12 )) - | (( in[ 28 + inpos] ) << 12 ) - ; - out[ 19 + outpos] = (( in[ 28 + inpos] ) >>> ( 21 - 1 )) - | (( in[ 29 + inpos] ) << 1 ) - | (( in[ 30 + inpos] ) << 22 ) - ; - out[ 20 + outpos] = (( in[ 30 + inpos] ) >>> ( 21 - 11 )) - | (( in[ 31 + inpos] ) << 11 ) - ; -} - - - - -public static void fastpackwithoutmask22(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 22 ) - ; - out[ 1 + outpos] = (( in[ 1 + inpos] ) >>> ( 22 - 12 )) - | (( in[ 2 + inpos] ) << 12 ) - ; - out[ 2 + outpos] = (( in[ 2 + inpos] ) >>> ( 22 - 2 )) - | (( in[ 3 + inpos] ) << 2 ) - | (( in[ 4 + inpos] ) << 24 ) - ; - out[ 3 + outpos] = (( in[ 4 + inpos] ) >>> ( 22 - 14 )) - | (( in[ 5 + inpos] ) << 14 ) - ; - out[ 4 + outpos] = (( in[ 5 + inpos] ) >>> ( 22 - 4 )) - | (( in[ 6 + inpos] ) << 4 ) - | (( in[ 7 + inpos] ) << 26 ) - ; - out[ 5 + outpos] = (( in[ 7 + inpos] ) >>> ( 22 - 16 )) - | (( in[ 8 + inpos] ) << 16 ) - ; - out[ 6 + outpos] = (( in[ 8 + inpos] ) >>> ( 22 - 6 )) - | (( in[ 9 + inpos] ) << 6 ) - | (( in[ 10 + inpos] ) << 28 ) - ; - out[ 7 + outpos] = (( in[ 10 + inpos] ) >>> ( 22 - 18 )) - | (( in[ 11 + inpos] ) << 18 ) - ; - out[ 8 + outpos] = (( in[ 11 + inpos] ) >>> ( 22 - 8 )) - | (( in[ 12 + inpos] ) << 8 ) - | (( in[ 13 + inpos] ) << 30 ) - ; - out[ 9 + outpos] = (( in[ 13 + inpos] ) >>> ( 22 - 20 )) - | (( in[ 14 + inpos] ) << 20 ) - ; - out[ 10 + outpos] = (( in[ 14 + inpos] ) >>> ( 22 - 10 )) - | (( in[ 15 + inpos] ) << 10 ) - ; - out[ 11 + outpos] = in[ 16 + inpos] - | (( in[ 17 + inpos] ) << 22 ) - ; - out[ 12 + outpos] = (( in[ 17 + inpos] ) >>> ( 22 - 12 )) - | (( in[ 18 + inpos] ) << 12 ) - ; - out[ 13 + outpos] = (( in[ 18 + inpos] ) >>> ( 22 - 2 )) - | (( in[ 19 + inpos] ) << 2 ) - | (( in[ 20 + inpos] ) << 24 ) - ; - out[ 14 + outpos] = (( in[ 20 + inpos] ) >>> ( 22 - 14 )) - | (( in[ 21 + inpos] ) << 14 ) - ; - out[ 15 + outpos] = (( in[ 21 + inpos] ) >>> ( 22 - 4 )) - | (( in[ 22 + inpos] ) << 4 ) - | (( in[ 23 + inpos] ) << 26 ) - ; - out[ 16 + outpos] = (( in[ 23 + inpos] ) >>> ( 22 - 16 )) - | (( in[ 24 + inpos] ) << 16 ) - ; - out[ 17 + outpos] = (( in[ 24 + inpos] ) >>> ( 22 - 6 )) - | (( in[ 25 + inpos] ) << 6 ) - | (( in[ 26 + inpos] ) << 28 ) - ; - out[ 18 + outpos] = (( in[ 26 + inpos] ) >>> ( 22 - 18 )) - | (( in[ 27 + inpos] ) << 18 ) - ; - out[ 19 + outpos] = (( in[ 27 + inpos] ) >>> ( 22 - 8 )) - | (( in[ 28 + inpos] ) << 8 ) - | (( in[ 29 + inpos] ) << 30 ) - ; - out[ 20 + outpos] = (( in[ 29 + inpos] ) >>> ( 22 - 20 )) - | (( in[ 30 + inpos] ) << 20 ) - ; - out[ 21 + outpos] = (( in[ 30 + inpos] ) >>> ( 22 - 10 )) - | (( in[ 31 + inpos] ) << 10 ) - ; -} - - - - -public static void fastpackwithoutmask23(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 23 ) - ; - out[ 1 + outpos] = (( in[ 1 + inpos] ) >>> ( 23 - 14 )) - | (( in[ 2 + inpos] ) << 14 ) - ; - out[ 2 + outpos] = (( in[ 2 + inpos] ) >>> ( 23 - 5 )) - | (( in[ 3 + inpos] ) << 5 ) - | (( in[ 4 + inpos] ) << 28 ) - ; - out[ 3 + outpos] = (( in[ 4 + inpos] ) >>> ( 23 - 19 )) - | (( in[ 5 + inpos] ) << 19 ) - ; - out[ 4 + outpos] = (( in[ 5 + inpos] ) >>> ( 23 - 10 )) - | (( in[ 6 + inpos] ) << 10 ) - ; - out[ 5 + outpos] = (( in[ 6 + inpos] ) >>> ( 23 - 1 )) - | (( in[ 7 + inpos] ) << 1 ) - | (( in[ 8 + inpos] ) << 24 ) - ; - out[ 6 + outpos] = (( in[ 8 + inpos] ) >>> ( 23 - 15 )) - | (( in[ 9 + inpos] ) << 15 ) - ; - out[ 7 + outpos] = (( in[ 9 + inpos] ) >>> ( 23 - 6 )) - | (( in[ 10 + inpos] ) << 6 ) - | (( in[ 11 + inpos] ) << 29 ) - ; - out[ 8 + outpos] = (( in[ 11 + inpos] ) >>> ( 23 - 20 )) - | (( in[ 12 + inpos] ) << 20 ) - ; - out[ 9 + outpos] = (( in[ 12 + inpos] ) >>> ( 23 - 11 )) - | (( in[ 13 + inpos] ) << 11 ) - ; - out[ 10 + outpos] = (( in[ 13 + inpos] ) >>> ( 23 - 2 )) - | (( in[ 14 + inpos] ) << 2 ) - | (( in[ 15 + inpos] ) << 25 ) - ; - out[ 11 + outpos] = (( in[ 15 + inpos] ) >>> ( 23 - 16 )) - | (( in[ 16 + inpos] ) << 16 ) - ; - out[ 12 + outpos] = (( in[ 16 + inpos] ) >>> ( 23 - 7 )) - | (( in[ 17 + inpos] ) << 7 ) - | (( in[ 18 + inpos] ) << 30 ) - ; - out[ 13 + outpos] = (( in[ 18 + inpos] ) >>> ( 23 - 21 )) - | (( in[ 19 + inpos] ) << 21 ) - ; - out[ 14 + outpos] = (( in[ 19 + inpos] ) >>> ( 23 - 12 )) - | (( in[ 20 + inpos] ) << 12 ) - ; - out[ 15 + outpos] = (( in[ 20 + inpos] ) >>> ( 23 - 3 )) - | (( in[ 21 + inpos] ) << 3 ) - | (( in[ 22 + inpos] ) << 26 ) - ; - out[ 16 + outpos] = (( in[ 22 + inpos] ) >>> ( 23 - 17 )) - | (( in[ 23 + inpos] ) << 17 ) - ; - out[ 17 + outpos] = (( in[ 23 + inpos] ) >>> ( 23 - 8 )) - | (( in[ 24 + inpos] ) << 8 ) - | (( in[ 25 + inpos] ) << 31 ) - ; - out[ 18 + outpos] = (( in[ 25 + inpos] ) >>> ( 23 - 22 )) - | (( in[ 26 + inpos] ) << 22 ) - ; - out[ 19 + outpos] = (( in[ 26 + inpos] ) >>> ( 23 - 13 )) - | (( in[ 27 + inpos] ) << 13 ) - ; - out[ 20 + outpos] = (( in[ 27 + inpos] ) >>> ( 23 - 4 )) - | (( in[ 28 + inpos] ) << 4 ) - | (( in[ 29 + inpos] ) << 27 ) - ; - out[ 21 + outpos] = (( in[ 29 + inpos] ) >>> ( 23 - 18 )) - | (( in[ 30 + inpos] ) << 18 ) - ; - out[ 22 + outpos] = (( in[ 30 + inpos] ) >>> ( 23 - 9 )) - | (( in[ 31 + inpos] ) << 9 ) - ; -} - - - - -public static void fastpackwithoutmask24(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 24 ) - ; - out[ 1 + outpos] = (( in[ 1 + inpos] ) >>> ( 24 - 16 )) - | (( in[ 2 + inpos] ) << 16 ) - ; - out[ 2 + outpos] = (( in[ 2 + inpos] ) >>> ( 24 - 8 )) - | (( in[ 3 + inpos] ) << 8 ) - ; - out[ 3 + outpos] = in[ 4 + inpos] - | (( in[ 5 + inpos] ) << 24 ) - ; - out[ 4 + outpos] = (( in[ 5 + inpos] ) >>> ( 24 - 16 )) - | (( in[ 6 + inpos] ) << 16 ) - ; - out[ 5 + outpos] = (( in[ 6 + inpos] ) >>> ( 24 - 8 )) - | (( in[ 7 + inpos] ) << 8 ) - ; - out[ 6 + outpos] = in[ 8 + inpos] - | (( in[ 9 + inpos] ) << 24 ) - ; - out[ 7 + outpos] = (( in[ 9 + inpos] ) >>> ( 24 - 16 )) - | (( in[ 10 + inpos] ) << 16 ) - ; - out[ 8 + outpos] = (( in[ 10 + inpos] ) >>> ( 24 - 8 )) - | (( in[ 11 + inpos] ) << 8 ) - ; - out[ 9 + outpos] = in[ 12 + inpos] - | (( in[ 13 + inpos] ) << 24 ) - ; - out[ 10 + outpos] = (( in[ 13 + inpos] ) >>> ( 24 - 16 )) - | (( in[ 14 + inpos] ) << 16 ) - ; - out[ 11 + outpos] = (( in[ 14 + inpos] ) >>> ( 24 - 8 )) - | (( in[ 15 + inpos] ) << 8 ) - ; - out[ 12 + outpos] = in[ 16 + inpos] - | (( in[ 17 + inpos] ) << 24 ) - ; - out[ 13 + outpos] = (( in[ 17 + inpos] ) >>> ( 24 - 16 )) - | (( in[ 18 + inpos] ) << 16 ) - ; - out[ 14 + outpos] = (( in[ 18 + inpos] ) >>> ( 24 - 8 )) - | (( in[ 19 + inpos] ) << 8 ) - ; - out[ 15 + outpos] = in[ 20 + inpos] - | (( in[ 21 + inpos] ) << 24 ) - ; - out[ 16 + outpos] = (( in[ 21 + inpos] ) >>> ( 24 - 16 )) - | (( in[ 22 + inpos] ) << 16 ) - ; - out[ 17 + outpos] = (( in[ 22 + inpos] ) >>> ( 24 - 8 )) - | (( in[ 23 + inpos] ) << 8 ) - ; - out[ 18 + outpos] = in[ 24 + inpos] - | (( in[ 25 + inpos] ) << 24 ) - ; - out[ 19 + outpos] = (( in[ 25 + inpos] ) >>> ( 24 - 16 )) - | (( in[ 26 + inpos] ) << 16 ) - ; - out[ 20 + outpos] = (( in[ 26 + inpos] ) >>> ( 24 - 8 )) - | (( in[ 27 + inpos] ) << 8 ) - ; - out[ 21 + outpos] = in[ 28 + inpos] - | (( in[ 29 + inpos] ) << 24 ) - ; - out[ 22 + outpos] = (( in[ 29 + inpos] ) >>> ( 24 - 16 )) - | (( in[ 30 + inpos] ) << 16 ) - ; - out[ 23 + outpos] = (( in[ 30 + inpos] ) >>> ( 24 - 8 )) - | (( in[ 31 + inpos] ) << 8 ) - ; -} - - - - -public static void fastpackwithoutmask25(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 25 ) - ; - out[ 1 + outpos] = (( in[ 1 + inpos] ) >>> ( 25 - 18 )) - | (( in[ 2 + inpos] ) << 18 ) - ; - out[ 2 + outpos] = (( in[ 2 + inpos] ) >>> ( 25 - 11 )) - | (( in[ 3 + inpos] ) << 11 ) - ; - out[ 3 + outpos] = (( in[ 3 + inpos] ) >>> ( 25 - 4 )) - | (( in[ 4 + inpos] ) << 4 ) - | (( in[ 5 + inpos] ) << 29 ) - ; - out[ 4 + outpos] = (( in[ 5 + inpos] ) >>> ( 25 - 22 )) - | (( in[ 6 + inpos] ) << 22 ) - ; - out[ 5 + outpos] = (( in[ 6 + inpos] ) >>> ( 25 - 15 )) - | (( in[ 7 + inpos] ) << 15 ) - ; - out[ 6 + outpos] = (( in[ 7 + inpos] ) >>> ( 25 - 8 )) - | (( in[ 8 + inpos] ) << 8 ) - ; - out[ 7 + outpos] = (( in[ 8 + inpos] ) >>> ( 25 - 1 )) - | (( in[ 9 + inpos] ) << 1 ) - | (( in[ 10 + inpos] ) << 26 ) - ; - out[ 8 + outpos] = (( in[ 10 + inpos] ) >>> ( 25 - 19 )) - | (( in[ 11 + inpos] ) << 19 ) - ; - out[ 9 + outpos] = (( in[ 11 + inpos] ) >>> ( 25 - 12 )) - | (( in[ 12 + inpos] ) << 12 ) - ; - out[ 10 + outpos] = (( in[ 12 + inpos] ) >>> ( 25 - 5 )) - | (( in[ 13 + inpos] ) << 5 ) - | (( in[ 14 + inpos] ) << 30 ) - ; - out[ 11 + outpos] = (( in[ 14 + inpos] ) >>> ( 25 - 23 )) - | (( in[ 15 + inpos] ) << 23 ) - ; - out[ 12 + outpos] = (( in[ 15 + inpos] ) >>> ( 25 - 16 )) - | (( in[ 16 + inpos] ) << 16 ) - ; - out[ 13 + outpos] = (( in[ 16 + inpos] ) >>> ( 25 - 9 )) - | (( in[ 17 + inpos] ) << 9 ) - ; - out[ 14 + outpos] = (( in[ 17 + inpos] ) >>> ( 25 - 2 )) - | (( in[ 18 + inpos] ) << 2 ) - | (( in[ 19 + inpos] ) << 27 ) - ; - out[ 15 + outpos] = (( in[ 19 + inpos] ) >>> ( 25 - 20 )) - | (( in[ 20 + inpos] ) << 20 ) - ; - out[ 16 + outpos] = (( in[ 20 + inpos] ) >>> ( 25 - 13 )) - | (( in[ 21 + inpos] ) << 13 ) - ; - out[ 17 + outpos] = (( in[ 21 + inpos] ) >>> ( 25 - 6 )) - | (( in[ 22 + inpos] ) << 6 ) - | (( in[ 23 + inpos] ) << 31 ) - ; - out[ 18 + outpos] = (( in[ 23 + inpos] ) >>> ( 25 - 24 )) - | (( in[ 24 + inpos] ) << 24 ) - ; - out[ 19 + outpos] = (( in[ 24 + inpos] ) >>> ( 25 - 17 )) - | (( in[ 25 + inpos] ) << 17 ) - ; - out[ 20 + outpos] = (( in[ 25 + inpos] ) >>> ( 25 - 10 )) - | (( in[ 26 + inpos] ) << 10 ) - ; - out[ 21 + outpos] = (( in[ 26 + inpos] ) >>> ( 25 - 3 )) - | (( in[ 27 + inpos] ) << 3 ) - | (( in[ 28 + inpos] ) << 28 ) - ; - out[ 22 + outpos] = (( in[ 28 + inpos] ) >>> ( 25 - 21 )) - | (( in[ 29 + inpos] ) << 21 ) - ; - out[ 23 + outpos] = (( in[ 29 + inpos] ) >>> ( 25 - 14 )) - | (( in[ 30 + inpos] ) << 14 ) - ; - out[ 24 + outpos] = (( in[ 30 + inpos] ) >>> ( 25 - 7 )) - | (( in[ 31 + inpos] ) << 7 ) - ; -} - - -public static void fastpackwithoutmask26(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 26 ) - ; - out[ 1 + outpos] = (( in[ 1 + inpos] ) >>> ( 26 - 20 )) - | (( in[ 2 + inpos] ) << 20 ) - ; - out[ 2 + outpos] = (( in[ 2 + inpos] ) >>> ( 26 - 14 )) - | (( in[ 3 + inpos] ) << 14 ) - ; - out[ 3 + outpos] = (( in[ 3 + inpos] ) >>> ( 26 - 8 )) - | (( in[ 4 + inpos] ) << 8 ) - ; - out[ 4 + outpos] = (( in[ 4 + inpos] ) >>> ( 26 - 2 )) - | (( in[ 5 + inpos] ) << 2 ) - | (( in[ 6 + inpos] ) << 28 ) - ; - out[ 5 + outpos] = (( in[ 6 + inpos] ) >>> ( 26 - 22 )) - | (( in[ 7 + inpos] ) << 22 ) - ; - out[ 6 + outpos] = (( in[ 7 + inpos] ) >>> ( 26 - 16 )) - | (( in[ 8 + inpos] ) << 16 ) - ; - out[ 7 + outpos] = (( in[ 8 + inpos] ) >>> ( 26 - 10 )) - | (( in[ 9 + inpos] ) << 10 ) - ; - out[ 8 + outpos] = (( in[ 9 + inpos] ) >>> ( 26 - 4 )) - | (( in[ 10 + inpos] ) << 4 ) - | (( in[ 11 + inpos] ) << 30 ) - ; - out[ 9 + outpos] = (( in[ 11 + inpos] ) >>> ( 26 - 24 )) - | (( in[ 12 + inpos] ) << 24 ) - ; - out[ 10 + outpos] = (( in[ 12 + inpos] ) >>> ( 26 - 18 )) - | (( in[ 13 + inpos] ) << 18 ) - ; - out[ 11 + outpos] = (( in[ 13 + inpos] ) >>> ( 26 - 12 )) - | (( in[ 14 + inpos] ) << 12 ) - ; - out[ 12 + outpos] = (( in[ 14 + inpos] ) >>> ( 26 - 6 )) - | (( in[ 15 + inpos] ) << 6 ) - ; - out[ 13 + outpos] = in[ 16 + inpos] - | (( in[ 17 + inpos] ) << 26 ) - ; - out[ 14 + outpos] = (( in[ 17 + inpos] ) >>> ( 26 - 20 )) - | (( in[ 18 + inpos] ) << 20 ) - ; - out[ 15 + outpos] = (( in[ 18 + inpos] ) >>> ( 26 - 14 )) - | (( in[ 19 + inpos] ) << 14 ) - ; - out[ 16 + outpos] = (( in[ 19 + inpos] ) >>> ( 26 - 8 )) - | (( in[ 20 + inpos] ) << 8 ) - ; - out[ 17 + outpos] = (( in[ 20 + inpos] ) >>> ( 26 - 2 )) - | (( in[ 21 + inpos] ) << 2 ) - | (( in[ 22 + inpos] ) << 28 ) - ; - out[ 18 + outpos] = (( in[ 22 + inpos] ) >>> ( 26 - 22 )) - | (( in[ 23 + inpos] ) << 22 ) - ; - out[ 19 + outpos] = (( in[ 23 + inpos] ) >>> ( 26 - 16 )) - | (( in[ 24 + inpos] ) << 16 ) - ; - out[ 20 + outpos] = (( in[ 24 + inpos] ) >>> ( 26 - 10 )) - | (( in[ 25 + inpos] ) << 10 ) - ; - out[ 21 + outpos] = (( in[ 25 + inpos] ) >>> ( 26 - 4 )) - | (( in[ 26 + inpos] ) << 4 ) - | (( in[ 27 + inpos] ) << 30 ) - ; - out[ 22 + outpos] = (( in[ 27 + inpos] ) >>> ( 26 - 24 )) - | (( in[ 28 + inpos] ) << 24 ) - ; - out[ 23 + outpos] = (( in[ 28 + inpos] ) >>> ( 26 - 18 )) - | (( in[ 29 + inpos] ) << 18 ) - ; - out[ 24 + outpos] = (( in[ 29 + inpos] ) >>> ( 26 - 12 )) - | (( in[ 30 + inpos] ) << 12 ) - ; - out[ 25 + outpos] = (( in[ 30 + inpos] ) >>> ( 26 - 6 )) - | (( in[ 31 + inpos] ) << 6 ) - ; -} - - - - -public static void fastpackwithoutmask27(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 27 ) - ; - out[ 1 + outpos] = (( in[ 1 + inpos] ) >>> ( 27 - 22 )) - | (( in[ 2 + inpos] ) << 22 ) - ; - out[ 2 + outpos] = (( in[ 2 + inpos] ) >>> ( 27 - 17 )) - | (( in[ 3 + inpos] ) << 17 ) - ; - out[ 3 + outpos] = (( in[ 3 + inpos] ) >>> ( 27 - 12 )) - | (( in[ 4 + inpos] ) << 12 ) - ; - out[ 4 + outpos] = (( in[ 4 + inpos] ) >>> ( 27 - 7 )) - | (( in[ 5 + inpos] ) << 7 ) - ; - out[ 5 + outpos] = (( in[ 5 + inpos] ) >>> ( 27 - 2 )) - | (( in[ 6 + inpos] ) << 2 ) - | (( in[ 7 + inpos] ) << 29 ) - ; - out[ 6 + outpos] = (( in[ 7 + inpos] ) >>> ( 27 - 24 )) - | (( in[ 8 + inpos] ) << 24 ) - ; - out[ 7 + outpos] = (( in[ 8 + inpos] ) >>> ( 27 - 19 )) - | (( in[ 9 + inpos] ) << 19 ) - ; - out[ 8 + outpos] = (( in[ 9 + inpos] ) >>> ( 27 - 14 )) - | (( in[ 10 + inpos] ) << 14 ) - ; - out[ 9 + outpos] = (( in[ 10 + inpos] ) >>> ( 27 - 9 )) - | (( in[ 11 + inpos] ) << 9 ) - ; - out[ 10 + outpos] = (( in[ 11 + inpos] ) >>> ( 27 - 4 )) - | (( in[ 12 + inpos] ) << 4 ) - | (( in[ 13 + inpos] ) << 31 ) - ; - out[ 11 + outpos] = (( in[ 13 + inpos] ) >>> ( 27 - 26 )) - | (( in[ 14 + inpos] ) << 26 ) - ; - out[ 12 + outpos] = (( in[ 14 + inpos] ) >>> ( 27 - 21 )) - | (( in[ 15 + inpos] ) << 21 ) - ; - out[ 13 + outpos] = (( in[ 15 + inpos] ) >>> ( 27 - 16 )) - | (( in[ 16 + inpos] ) << 16 ) - ; - out[ 14 + outpos] = (( in[ 16 + inpos] ) >>> ( 27 - 11 )) - | (( in[ 17 + inpos] ) << 11 ) - ; - out[ 15 + outpos] = (( in[ 17 + inpos] ) >>> ( 27 - 6 )) - | (( in[ 18 + inpos] ) << 6 ) - ; - out[ 16 + outpos] = (( in[ 18 + inpos] ) >>> ( 27 - 1 )) - | (( in[ 19 + inpos] ) << 1 ) - | (( in[ 20 + inpos] ) << 28 ) - ; - out[ 17 + outpos] = (( in[ 20 + inpos] ) >>> ( 27 - 23 )) - | (( in[ 21 + inpos] ) << 23 ) - ; - out[ 18 + outpos] = (( in[ 21 + inpos] ) >>> ( 27 - 18 )) - | (( in[ 22 + inpos] ) << 18 ) - ; - out[ 19 + outpos] = (( in[ 22 + inpos] ) >>> ( 27 - 13 )) - | (( in[ 23 + inpos] ) << 13 ) - ; - out[ 20 + outpos] = (( in[ 23 + inpos] ) >>> ( 27 - 8 )) - | (( in[ 24 + inpos] ) << 8 ) - ; - out[ 21 + outpos] = (( in[ 24 + inpos] ) >>> ( 27 - 3 )) - | (( in[ 25 + inpos] ) << 3 ) - | (( in[ 26 + inpos] ) << 30 ) - ; - out[ 22 + outpos] = (( in[ 26 + inpos] ) >>> ( 27 - 25 )) - | (( in[ 27 + inpos] ) << 25 ) - ; - out[ 23 + outpos] = (( in[ 27 + inpos] ) >>> ( 27 - 20 )) - | (( in[ 28 + inpos] ) << 20 ) - ; - out[ 24 + outpos] = (( in[ 28 + inpos] ) >>> ( 27 - 15 )) - | (( in[ 29 + inpos] ) << 15 ) - ; - out[ 25 + outpos] = (( in[ 29 + inpos] ) >>> ( 27 - 10 )) - | (( in[ 30 + inpos] ) << 10 ) - ; - out[ 26 + outpos] = (( in[ 30 + inpos] ) >>> ( 27 - 5 )) - | (( in[ 31 + inpos] ) << 5 ) - ; -} - - - - -public static void fastpackwithoutmask28(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 28 ) - ; - out[ 1 + outpos] = (( in[ 1 + inpos] ) >>> ( 28 - 24 )) - | (( in[ 2 + inpos] ) << 24 ) - ; - out[ 2 + outpos] = (( in[ 2 + inpos] ) >>> ( 28 - 20 )) - | (( in[ 3 + inpos] ) << 20 ) - ; - out[ 3 + outpos] = (( in[ 3 + inpos] ) >>> ( 28 - 16 )) - | (( in[ 4 + inpos] ) << 16 ) - ; - out[ 4 + outpos] = (( in[ 4 + inpos] ) >>> ( 28 - 12 )) - | (( in[ 5 + inpos] ) << 12 ) - ; - out[ 5 + outpos] = (( in[ 5 + inpos] ) >>> ( 28 - 8 )) - | (( in[ 6 + inpos] ) << 8 ) - ; - out[ 6 + outpos] = (( in[ 6 + inpos] ) >>> ( 28 - 4 )) - | (( in[ 7 + inpos] ) << 4 ) - ; - out[ 7 + outpos] = in[ 8 + inpos] - | (( in[ 9 + inpos] ) << 28 ) - ; - out[ 8 + outpos] = (( in[ 9 + inpos] ) >>> ( 28 - 24 )) - | (( in[ 10 + inpos] ) << 24 ) - ; - out[ 9 + outpos] = (( in[ 10 + inpos] ) >>> ( 28 - 20 )) - | (( in[ 11 + inpos] ) << 20 ) - ; - out[ 10 + outpos] = (( in[ 11 + inpos] ) >>> ( 28 - 16 )) - | (( in[ 12 + inpos] ) << 16 ) - ; - out[ 11 + outpos] = (( in[ 12 + inpos] ) >>> ( 28 - 12 )) - | (( in[ 13 + inpos] ) << 12 ) - ; - out[ 12 + outpos] = (( in[ 13 + inpos] ) >>> ( 28 - 8 )) - | (( in[ 14 + inpos] ) << 8 ) - ; - out[ 13 + outpos] = (( in[ 14 + inpos] ) >>> ( 28 - 4 )) - | (( in[ 15 + inpos] ) << 4 ) - ; - out[ 14 + outpos] = in[ 16 + inpos] - | (( in[ 17 + inpos] ) << 28 ) - ; - out[ 15 + outpos] = (( in[ 17 + inpos] ) >>> ( 28 - 24 )) - | (( in[ 18 + inpos] ) << 24 ) - ; - out[ 16 + outpos] = (( in[ 18 + inpos] ) >>> ( 28 - 20 )) - | (( in[ 19 + inpos] ) << 20 ) - ; - out[ 17 + outpos] = (( in[ 19 + inpos] ) >>> ( 28 - 16 )) - | (( in[ 20 + inpos] ) << 16 ) - ; - out[ 18 + outpos] = (( in[ 20 + inpos] ) >>> ( 28 - 12 )) - | (( in[ 21 + inpos] ) << 12 ) - ; - out[ 19 + outpos] = (( in[ 21 + inpos] ) >>> ( 28 - 8 )) - | (( in[ 22 + inpos] ) << 8 ) - ; - out[ 20 + outpos] = (( in[ 22 + inpos] ) >>> ( 28 - 4 )) - | (( in[ 23 + inpos] ) << 4 ) - ; - out[ 21 + outpos] = in[ 24 + inpos] - | (( in[ 25 + inpos] ) << 28 ) - ; - out[ 22 + outpos] = (( in[ 25 + inpos] ) >>> ( 28 - 24 )) - | (( in[ 26 + inpos] ) << 24 ) - ; - out[ 23 + outpos] = (( in[ 26 + inpos] ) >>> ( 28 - 20 )) - | (( in[ 27 + inpos] ) << 20 ) - ; - out[ 24 + outpos] = (( in[ 27 + inpos] ) >>> ( 28 - 16 )) - | (( in[ 28 + inpos] ) << 16 ) - ; - out[ 25 + outpos] = (( in[ 28 + inpos] ) >>> ( 28 - 12 )) - | (( in[ 29 + inpos] ) << 12 ) - ; - out[ 26 + outpos] = (( in[ 29 + inpos] ) >>> ( 28 - 8 )) - | (( in[ 30 + inpos] ) << 8 ) - ; - out[ 27 + outpos] = (( in[ 30 + inpos] ) >>> ( 28 - 4 )) - | (( in[ 31 + inpos] ) << 4 ) - ; -} - - - - -public static void fastpackwithoutmask29(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 29 ) - ; - out[ 1 + outpos] = (( in[ 1 + inpos] ) >>> ( 29 - 26 )) - | (( in[ 2 + inpos] ) << 26 ) - ; - out[ 2 + outpos] = (( in[ 2 + inpos] ) >>> ( 29 - 23 )) - | (( in[ 3 + inpos] ) << 23 ) - ; - out[ 3 + outpos] = (( in[ 3 + inpos] ) >>> ( 29 - 20 )) - | (( in[ 4 + inpos] ) << 20 ) - ; - out[ 4 + outpos] = (( in[ 4 + inpos] ) >>> ( 29 - 17 )) - | (( in[ 5 + inpos] ) << 17 ) - ; - out[ 5 + outpos] = (( in[ 5 + inpos] ) >>> ( 29 - 14 )) - | (( in[ 6 + inpos] ) << 14 ) - ; - out[ 6 + outpos] = (( in[ 6 + inpos] ) >>> ( 29 - 11 )) - | (( in[ 7 + inpos] ) << 11 ) - ; - out[ 7 + outpos] = (( in[ 7 + inpos] ) >>> ( 29 - 8 )) - | (( in[ 8 + inpos] ) << 8 ) - ; - out[ 8 + outpos] = (( in[ 8 + inpos] ) >>> ( 29 - 5 )) - | (( in[ 9 + inpos] ) << 5 ) - ; - out[ 9 + outpos] = (( in[ 9 + inpos] ) >>> ( 29 - 2 )) - | (( in[ 10 + inpos] ) << 2 ) - | (( in[ 11 + inpos] ) << 31 ) - ; - out[ 10 + outpos] = (( in[ 11 + inpos] ) >>> ( 29 - 28 )) - | (( in[ 12 + inpos] ) << 28 ) - ; - out[ 11 + outpos] = (( in[ 12 + inpos] ) >>> ( 29 - 25 )) - | (( in[ 13 + inpos] ) << 25 ) - ; - out[ 12 + outpos] = (( in[ 13 + inpos] ) >>> ( 29 - 22 )) - | (( in[ 14 + inpos] ) << 22 ) - ; - out[ 13 + outpos] = (( in[ 14 + inpos] ) >>> ( 29 - 19 )) - | (( in[ 15 + inpos] ) << 19 ) - ; - out[ 14 + outpos] = (( in[ 15 + inpos] ) >>> ( 29 - 16 )) - | (( in[ 16 + inpos] ) << 16 ) - ; - out[ 15 + outpos] = (( in[ 16 + inpos] ) >>> ( 29 - 13 )) - | (( in[ 17 + inpos] ) << 13 ) - ; - out[ 16 + outpos] = (( in[ 17 + inpos] ) >>> ( 29 - 10 )) - | (( in[ 18 + inpos] ) << 10 ) - ; - out[ 17 + outpos] = (( in[ 18 + inpos] ) >>> ( 29 - 7 )) - | (( in[ 19 + inpos] ) << 7 ) - ; - out[ 18 + outpos] = (( in[ 19 + inpos] ) >>> ( 29 - 4 )) - | (( in[ 20 + inpos] ) << 4 ) - ; - out[ 19 + outpos] = (( in[ 20 + inpos] ) >>> ( 29 - 1 )) - | (( in[ 21 + inpos] ) << 1 ) - | (( in[ 22 + inpos] ) << 30 ) - ; - out[ 20 + outpos] = (( in[ 22 + inpos] ) >>> ( 29 - 27 )) - | (( in[ 23 + inpos] ) << 27 ) - ; - out[ 21 + outpos] = (( in[ 23 + inpos] ) >>> ( 29 - 24 )) - | (( in[ 24 + inpos] ) << 24 ) - ; - out[ 22 + outpos] = (( in[ 24 + inpos] ) >>> ( 29 - 21 )) - | (( in[ 25 + inpos] ) << 21 ) - ; - out[ 23 + outpos] = (( in[ 25 + inpos] ) >>> ( 29 - 18 )) - | (( in[ 26 + inpos] ) << 18 ) - ; - out[ 24 + outpos] = (( in[ 26 + inpos] ) >>> ( 29 - 15 )) - | (( in[ 27 + inpos] ) << 15 ) - ; - out[ 25 + outpos] = (( in[ 27 + inpos] ) >>> ( 29 - 12 )) - | (( in[ 28 + inpos] ) << 12 ) - ; - out[ 26 + outpos] = (( in[ 28 + inpos] ) >>> ( 29 - 9 )) - | (( in[ 29 + inpos] ) << 9 ) - ; - out[ 27 + outpos] = (( in[ 29 + inpos] ) >>> ( 29 - 6 )) - | (( in[ 30 + inpos] ) << 6 ) - ; - out[ 28 + outpos] = (( in[ 30 + inpos] ) >>> ( 29 - 3 )) - | (( in[ 31 + inpos] ) << 3 ) - ; -} - - - - -public static void fastpackwithoutmask30(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 30 ) - ; - out[ 1 + outpos] = (( in[ 1 + inpos] ) >>> ( 30 - 28 )) - | (( in[ 2 + inpos] ) << 28 ) - ; - out[ 2 + outpos] = (( in[ 2 + inpos] ) >>> ( 30 - 26 )) - | (( in[ 3 + inpos] ) << 26 ) - ; - out[ 3 + outpos] = (( in[ 3 + inpos] ) >>> ( 30 - 24 )) - | (( in[ 4 + inpos] ) << 24 ) - ; - out[ 4 + outpos] = (( in[ 4 + inpos] ) >>> ( 30 - 22 )) - | (( in[ 5 + inpos] ) << 22 ) - ; - out[ 5 + outpos] = (( in[ 5 + inpos] ) >>> ( 30 - 20 )) - | (( in[ 6 + inpos] ) << 20 ) - ; - out[ 6 + outpos] = (( in[ 6 + inpos] ) >>> ( 30 - 18 )) - | (( in[ 7 + inpos] ) << 18 ) - ; - out[ 7 + outpos] = (( in[ 7 + inpos] ) >>> ( 30 - 16 )) - | (( in[ 8 + inpos] ) << 16 ) - ; - out[ 8 + outpos] = (( in[ 8 + inpos] ) >>> ( 30 - 14 )) - | (( in[ 9 + inpos] ) << 14 ) - ; - out[ 9 + outpos] = (( in[ 9 + inpos] ) >>> ( 30 - 12 )) - | (( in[ 10 + inpos] ) << 12 ) - ; - out[ 10 + outpos] = (( in[ 10 + inpos] ) >>> ( 30 - 10 )) - | (( in[ 11 + inpos] ) << 10 ) - ; - out[ 11 + outpos] = (( in[ 11 + inpos] ) >>> ( 30 - 8 )) - | (( in[ 12 + inpos] ) << 8 ) - ; - out[ 12 + outpos] = (( in[ 12 + inpos] ) >>> ( 30 - 6 )) - | (( in[ 13 + inpos] ) << 6 ) - ; - out[ 13 + outpos] = (( in[ 13 + inpos] ) >>> ( 30 - 4 )) - | (( in[ 14 + inpos] ) << 4 ) - ; - out[ 14 + outpos] = (( in[ 14 + inpos] ) >>> ( 30 - 2 )) - | (( in[ 15 + inpos] ) << 2 ) - ; - out[ 15 + outpos] = in[ 16 + inpos] - | (( in[ 17 + inpos] ) << 30 ) - ; - out[ 16 + outpos] = (( in[ 17 + inpos] ) >>> ( 30 - 28 )) - | (( in[ 18 + inpos] ) << 28 ) - ; - out[ 17 + outpos] = (( in[ 18 + inpos] ) >>> ( 30 - 26 )) - | (( in[ 19 + inpos] ) << 26 ) - ; - out[ 18 + outpos] = (( in[ 19 + inpos] ) >>> ( 30 - 24 )) - | (( in[ 20 + inpos] ) << 24 ) - ; - out[ 19 + outpos] = (( in[ 20 + inpos] ) >>> ( 30 - 22 )) - | (( in[ 21 + inpos] ) << 22 ) - ; - out[ 20 + outpos] = (( in[ 21 + inpos] ) >>> ( 30 - 20 )) - | (( in[ 22 + inpos] ) << 20 ) - ; - out[ 21 + outpos] = (( in[ 22 + inpos] ) >>> ( 30 - 18 )) - | (( in[ 23 + inpos] ) << 18 ) - ; - out[ 22 + outpos] = (( in[ 23 + inpos] ) >>> ( 30 - 16 )) - | (( in[ 24 + inpos] ) << 16 ) - ; - out[ 23 + outpos] = (( in[ 24 + inpos] ) >>> ( 30 - 14 )) - | (( in[ 25 + inpos] ) << 14 ) - ; - out[ 24 + outpos] = (( in[ 25 + inpos] ) >>> ( 30 - 12 )) - | (( in[ 26 + inpos] ) << 12 ) - ; - out[ 25 + outpos] = (( in[ 26 + inpos] ) >>> ( 30 - 10 )) - | (( in[ 27 + inpos] ) << 10 ) - ; - out[ 26 + outpos] = (( in[ 27 + inpos] ) >>> ( 30 - 8 )) - | (( in[ 28 + inpos] ) << 8 ) - ; - out[ 27 + outpos] = (( in[ 28 + inpos] ) >>> ( 30 - 6 )) - | (( in[ 29 + inpos] ) << 6 ) - ; - out[ 28 + outpos] = (( in[ 29 + inpos] ) >>> ( 30 - 4 )) - | (( in[ 30 + inpos] ) << 4 ) - ; - out[ 29 + outpos] = (( in[ 30 + inpos] ) >>> ( 30 - 2 )) - | (( in[ 31 + inpos] ) << 2 ) - ; -} - - - - -public static void fastpackwithoutmask31(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = in[ 0 + inpos] - | (( in[ 1 + inpos] ) << 31 ) - ; - out[ 1 + outpos] = (( in[ 1 + inpos] ) >>> ( 31 - 30 )) - | (( in[ 2 + inpos] ) << 30 ) - ; - out[ 2 + outpos] = (( in[ 2 + inpos] ) >>> ( 31 - 29 )) - | (( in[ 3 + inpos] ) << 29 ) - ; - out[ 3 + outpos] = (( in[ 3 + inpos] ) >>> ( 31 - 28 )) - | (( in[ 4 + inpos] ) << 28 ) - ; - out[ 4 + outpos] = (( in[ 4 + inpos] ) >>> ( 31 - 27 )) - | (( in[ 5 + inpos] ) << 27 ) - ; - out[ 5 + outpos] = (( in[ 5 + inpos] ) >>> ( 31 - 26 )) - | (( in[ 6 + inpos] ) << 26 ) - ; - out[ 6 + outpos] = (( in[ 6 + inpos] ) >>> ( 31 - 25 )) - | (( in[ 7 + inpos] ) << 25 ) - ; - out[ 7 + outpos] = (( in[ 7 + inpos] ) >>> ( 31 - 24 )) - | (( in[ 8 + inpos] ) << 24 ) - ; - out[ 8 + outpos] = (( in[ 8 + inpos] ) >>> ( 31 - 23 )) - | (( in[ 9 + inpos] ) << 23 ) - ; - out[ 9 + outpos] = (( in[ 9 + inpos] ) >>> ( 31 - 22 )) - | (( in[ 10 + inpos] ) << 22 ) - ; - out[ 10 + outpos] = (( in[ 10 + inpos] ) >>> ( 31 - 21 )) - | (( in[ 11 + inpos] ) << 21 ) - ; - out[ 11 + outpos] = (( in[ 11 + inpos] ) >>> ( 31 - 20 )) - | (( in[ 12 + inpos] ) << 20 ) - ; - out[ 12 + outpos] = (( in[ 12 + inpos] ) >>> ( 31 - 19 )) - | (( in[ 13 + inpos] ) << 19 ) - ; - out[ 13 + outpos] = (( in[ 13 + inpos] ) >>> ( 31 - 18 )) - | (( in[ 14 + inpos] ) << 18 ) - ; - out[ 14 + outpos] = (( in[ 14 + inpos] ) >>> ( 31 - 17 )) - | (( in[ 15 + inpos] ) << 17 ) - ; - out[ 15 + outpos] = (( in[ 15 + inpos] ) >>> ( 31 - 16 )) - | (( in[ 16 + inpos] ) << 16 ) - ; - out[ 16 + outpos] = (( in[ 16 + inpos] ) >>> ( 31 - 15 )) - | (( in[ 17 + inpos] ) << 15 ) - ; - out[ 17 + outpos] = (( in[ 17 + inpos] ) >>> ( 31 - 14 )) - | (( in[ 18 + inpos] ) << 14 ) - ; - out[ 18 + outpos] = (( in[ 18 + inpos] ) >>> ( 31 - 13 )) - | (( in[ 19 + inpos] ) << 13 ) - ; - out[ 19 + outpos] = (( in[ 19 + inpos] ) >>> ( 31 - 12 )) - | (( in[ 20 + inpos] ) << 12 ) - ; - out[ 20 + outpos] = (( in[ 20 + inpos] ) >>> ( 31 - 11 )) - | (( in[ 21 + inpos] ) << 11 ) - ; - out[ 21 + outpos] = (( in[ 21 + inpos] ) >>> ( 31 - 10 )) - | (( in[ 22 + inpos] ) << 10 ) - ; - out[ 22 + outpos] = (( in[ 22 + inpos] ) >>> ( 31 - 9 )) - | (( in[ 23 + inpos] ) << 9 ) - ; - out[ 23 + outpos] = (( in[ 23 + inpos] ) >>> ( 31 - 8 )) - | (( in[ 24 + inpos] ) << 8 ) - ; - out[ 24 + outpos] = (( in[ 24 + inpos] ) >>> ( 31 - 7 )) - | (( in[ 25 + inpos] ) << 7 ) - ; - out[ 25 + outpos] = (( in[ 25 + inpos] ) >>> ( 31 - 6 )) - | (( in[ 26 + inpos] ) << 6 ) - ; - out[ 26 + outpos] = (( in[ 26 + inpos] ) >>> ( 31 - 5 )) - | (( in[ 27 + inpos] ) << 5 ) - ; - out[ 27 + outpos] = (( in[ 27 + inpos] ) >>> ( 31 - 4 )) - | (( in[ 28 + inpos] ) << 4 ) - ; - out[ 28 + outpos] = (( in[ 28 + inpos] ) >>> ( 31 - 3 )) - | (( in[ 29 + inpos] ) << 3 ) - ; - out[ 29 + outpos] = (( in[ 29 + inpos] ) >>> ( 31 - 2 )) - | (( in[ 30 + inpos] ) << 2 ) - ; - out[ 30 + outpos] = (( in[ 30 + inpos] ) >>> ( 31 - 1 )) - | (( in[ 31 + inpos] ) << 1 ) - ; -} - - - - -public static void fastpack1(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 1 ) - | (( in[ 1 + inpos] & 1 ) << 1 ) - | (( in[ 2 + inpos] & 1 ) << 2 ) - | (( in[ 3 + inpos] & 1 ) << 3 ) - | (( in[ 4 + inpos] & 1 ) << 4 ) - | (( in[ 5 + inpos] & 1 ) << 5 ) - | (( in[ 6 + inpos] & 1 ) << 6 ) - | (( in[ 7 + inpos] & 1 ) << 7 ) - | (( in[ 8 + inpos] & 1 ) << 8 ) - | (( in[ 9 + inpos] & 1 ) << 9 ) - | (( in[ 10 + inpos] & 1 ) << 10 ) - | (( in[ 11 + inpos] & 1 ) << 11 ) - | (( in[ 12 + inpos] & 1 ) << 12 ) - | (( in[ 13 + inpos] & 1 ) << 13 ) - | (( in[ 14 + inpos] & 1 ) << 14 ) - | (( in[ 15 + inpos] & 1 ) << 15 ) - | (( in[ 16 + inpos] & 1 ) << 16 ) - | (( in[ 17 + inpos] & 1 ) << 17 ) - | (( in[ 18 + inpos] & 1 ) << 18 ) - | (( in[ 19 + inpos] & 1 ) << 19 ) - | (( in[ 20 + inpos] & 1 ) << 20 ) - | (( in[ 21 + inpos] & 1 ) << 21 ) - | (( in[ 22 + inpos] & 1 ) << 22 ) - | (( in[ 23 + inpos] & 1 ) << 23 ) - | (( in[ 24 + inpos] & 1 ) << 24 ) - | (( in[ 25 + inpos] & 1 ) << 25 ) - | (( in[ 26 + inpos] & 1 ) << 26 ) - | (( in[ 27 + inpos] & 1 ) << 27 ) - | (( in[ 28 + inpos] & 1 ) << 28 ) - | (( in[ 29 + inpos] & 1 ) << 29 ) - | (( in[ 30 + inpos] & 1 ) << 30 ) - | (( in[ 31 + inpos] ) << 31 ) - ; -} - - - - -public static void fastpack2(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 3 ) - | (( in[ 1 + inpos] & 3 ) << 2 ) - | (( in[ 2 + inpos] & 3 ) << 4 ) - | (( in[ 3 + inpos] & 3 ) << 6 ) - | (( in[ 4 + inpos] & 3 ) << 8 ) - | (( in[ 5 + inpos] & 3 ) << 10 ) - | (( in[ 6 + inpos] & 3 ) << 12 ) - | (( in[ 7 + inpos] & 3 ) << 14 ) - | (( in[ 8 + inpos] & 3 ) << 16 ) - | (( in[ 9 + inpos] & 3 ) << 18 ) - | (( in[ 10 + inpos] & 3 ) << 20 ) - | (( in[ 11 + inpos] & 3 ) << 22 ) - | (( in[ 12 + inpos] & 3 ) << 24 ) - | (( in[ 13 + inpos] & 3 ) << 26 ) - | (( in[ 14 + inpos] & 3 ) << 28 ) - | (( in[ 15 + inpos] ) << 30 ) - ; - out[ 1 + outpos ] = (in[ 16 + inpos] & 3 ) - | (( in[ 17 + inpos] & 3 ) << 2 ) - | (( in[ 18 + inpos] & 3 ) << 4 ) - | (( in[ 19 + inpos] & 3 ) << 6 ) - | (( in[ 20 + inpos] & 3 ) << 8 ) - | (( in[ 21 + inpos] & 3 ) << 10 ) - | (( in[ 22 + inpos] & 3 ) << 12 ) - | (( in[ 23 + inpos] & 3 ) << 14 ) - | (( in[ 24 + inpos] & 3 ) << 16 ) - | (( in[ 25 + inpos] & 3 ) << 18 ) - | (( in[ 26 + inpos] & 3 ) << 20 ) - | (( in[ 27 + inpos] & 3 ) << 22 ) - | (( in[ 28 + inpos] & 3 ) << 24 ) - | (( in[ 29 + inpos] & 3 ) << 26 ) - | (( in[ 30 + inpos] & 3 ) << 28 ) - | (( in[ 31 + inpos] ) << 30 ) - ; -} - - - - -public static void fastpack3(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 7 ) - | (( in[ 1 + inpos] & 7 ) << 3 ) - | (( in[ 2 + inpos] & 7 ) << 6 ) - | (( in[ 3 + inpos] & 7 ) << 9 ) - | (( in[ 4 + inpos] & 7 ) << 12 ) - | (( in[ 5 + inpos] & 7 ) << 15 ) - | (( in[ 6 + inpos] & 7 ) << 18 ) - | (( in[ 7 + inpos] & 7 ) << 21 ) - | (( in[ 8 + inpos] & 7 ) << 24 ) - | (( in[ 9 + inpos] & 7 ) << 27 ) - | (( in[ 10 + inpos] ) << 30 ) - ; - out[ 1 + outpos ] = (( in[ 10 + inpos] & 7 ) >>> ( 3 - 1 )) - | (( in[ 11 + inpos] & 7 ) << 1 ) - | (( in[ 12 + inpos] & 7 ) << 4 ) - | (( in[ 13 + inpos] & 7 ) << 7 ) - | (( in[ 14 + inpos] & 7 ) << 10 ) - | (( in[ 15 + inpos] & 7 ) << 13 ) - | (( in[ 16 + inpos] & 7 ) << 16 ) - | (( in[ 17 + inpos] & 7 ) << 19 ) - | (( in[ 18 + inpos] & 7 ) << 22 ) - | (( in[ 19 + inpos] & 7 ) << 25 ) - | (( in[ 20 + inpos] & 7 ) << 28 ) - | (( in[ 21 + inpos] ) << 31 ) - ; - out[ 2 + outpos ] = (( in[ 21 + inpos] & 7 ) >>> ( 3 - 2 )) - | (( in[ 22 + inpos] & 7 ) << 2 ) - | (( in[ 23 + inpos] & 7 ) << 5 ) - | (( in[ 24 + inpos] & 7 ) << 8 ) - | (( in[ 25 + inpos] & 7 ) << 11 ) - | (( in[ 26 + inpos] & 7 ) << 14 ) - | (( in[ 27 + inpos] & 7 ) << 17 ) - | (( in[ 28 + inpos] & 7 ) << 20 ) - | (( in[ 29 + inpos] & 7 ) << 23 ) - | (( in[ 30 + inpos] & 7 ) << 26 ) - | (( in[ 31 + inpos] ) << 29 ) - ; -} - - - - -public static void fastpack4(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 15 ) - | (( in[ 1 + inpos] & 15 ) << 4 ) - | (( in[ 2 + inpos] & 15 ) << 8 ) - | (( in[ 3 + inpos] & 15 ) << 12 ) - | (( in[ 4 + inpos] & 15 ) << 16 ) - | (( in[ 5 + inpos] & 15 ) << 20 ) - | (( in[ 6 + inpos] & 15 ) << 24 ) - | (( in[ 7 + inpos] ) << 28 ) - ; - out[ 1 + outpos ] = (in[ 8 + inpos] & 15 ) - | (( in[ 9 + inpos] & 15 ) << 4 ) - | (( in[ 10 + inpos] & 15 ) << 8 ) - | (( in[ 11 + inpos] & 15 ) << 12 ) - | (( in[ 12 + inpos] & 15 ) << 16 ) - | (( in[ 13 + inpos] & 15 ) << 20 ) - | (( in[ 14 + inpos] & 15 ) << 24 ) - | (( in[ 15 + inpos] ) << 28 ) - ; - out[ 2 + outpos ] = (in[ 16 + inpos] & 15 ) - | (( in[ 17 + inpos] & 15 ) << 4 ) - | (( in[ 18 + inpos] & 15 ) << 8 ) - | (( in[ 19 + inpos] & 15 ) << 12 ) - | (( in[ 20 + inpos] & 15 ) << 16 ) - | (( in[ 21 + inpos] & 15 ) << 20 ) - | (( in[ 22 + inpos] & 15 ) << 24 ) - | (( in[ 23 + inpos] ) << 28 ) - ; - out[ 3 + outpos ] = (in[ 24 + inpos] & 15 ) - | (( in[ 25 + inpos] & 15 ) << 4 ) - | (( in[ 26 + inpos] & 15 ) << 8 ) - | (( in[ 27 + inpos] & 15 ) << 12 ) - | (( in[ 28 + inpos] & 15 ) << 16 ) - | (( in[ 29 + inpos] & 15 ) << 20 ) - | (( in[ 30 + inpos] & 15 ) << 24 ) - | (( in[ 31 + inpos] ) << 28 ) - ; -} - - - - -public static void fastpack5(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 31 ) - | (( in[ 1 + inpos] & 31 ) << 5 ) - | (( in[ 2 + inpos] & 31 ) << 10 ) - | (( in[ 3 + inpos] & 31 ) << 15 ) - | (( in[ 4 + inpos] & 31 ) << 20 ) - | (( in[ 5 + inpos] & 31 ) << 25 ) - | (( in[ 6 + inpos] ) << 30 ) - ; - out[ 1 + outpos ] = (( in[ 6 + inpos] & 31 ) >>> ( 5 - 3 )) - | (( in[ 7 + inpos] & 31 ) << 3 ) - | (( in[ 8 + inpos] & 31 ) << 8 ) - | (( in[ 9 + inpos] & 31 ) << 13 ) - | (( in[ 10 + inpos] & 31 ) << 18 ) - | (( in[ 11 + inpos] & 31 ) << 23 ) - | (( in[ 12 + inpos] ) << 28 ) - ; - out[ 2 + outpos ] = (( in[ 12 + inpos] & 31 ) >>> ( 5 - 1 )) - | (( in[ 13 + inpos] & 31 ) << 1 ) - | (( in[ 14 + inpos] & 31 ) << 6 ) - | (( in[ 15 + inpos] & 31 ) << 11 ) - | (( in[ 16 + inpos] & 31 ) << 16 ) - | (( in[ 17 + inpos] & 31 ) << 21 ) - | (( in[ 18 + inpos] & 31 ) << 26 ) - | (( in[ 19 + inpos] ) << 31 ) - ; - out[ 3 + outpos ] = (( in[ 19 + inpos] & 31 ) >>> ( 5 - 4 )) - | (( in[ 20 + inpos] & 31 ) << 4 ) - | (( in[ 21 + inpos] & 31 ) << 9 ) - | (( in[ 22 + inpos] & 31 ) << 14 ) - | (( in[ 23 + inpos] & 31 ) << 19 ) - | (( in[ 24 + inpos] & 31 ) << 24 ) - | (( in[ 25 + inpos] ) << 29 ) - ; - out[ 4 + outpos ] = (( in[ 25 + inpos] & 31 ) >>> ( 5 - 2 )) - | (( in[ 26 + inpos] & 31 ) << 2 ) - | (( in[ 27 + inpos] & 31 ) << 7 ) - | (( in[ 28 + inpos] & 31 ) << 12 ) - | (( in[ 29 + inpos] & 31 ) << 17 ) - | (( in[ 30 + inpos] & 31 ) << 22 ) - | (( in[ 31 + inpos] ) << 27 ) - ; -} - - - - -public static void fastpack6(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 63 ) - | (( in[ 1 + inpos] & 63 ) << 6 ) - | (( in[ 2 + inpos] & 63 ) << 12 ) - | (( in[ 3 + inpos] & 63 ) << 18 ) - | (( in[ 4 + inpos] & 63 ) << 24 ) - | (( in[ 5 + inpos] ) << 30 ) - ; - out[ 1 + outpos ] = (( in[ 5 + inpos] & 63 ) >>> ( 6 - 4 )) - | (( in[ 6 + inpos] & 63 ) << 4 ) - | (( in[ 7 + inpos] & 63 ) << 10 ) - | (( in[ 8 + inpos] & 63 ) << 16 ) - | (( in[ 9 + inpos] & 63 ) << 22 ) - | (( in[ 10 + inpos] ) << 28 ) - ; - out[ 2 + outpos ] = (( in[ 10 + inpos] & 63 ) >>> ( 6 - 2 )) - | (( in[ 11 + inpos] & 63 ) << 2 ) - | (( in[ 12 + inpos] & 63 ) << 8 ) - | (( in[ 13 + inpos] & 63 ) << 14 ) - | (( in[ 14 + inpos] & 63 ) << 20 ) - | (( in[ 15 + inpos] ) << 26 ) - ; - out[ 3 + outpos ] = (in[ 16 + inpos] & 63 ) - | (( in[ 17 + inpos] & 63 ) << 6 ) - | (( in[ 18 + inpos] & 63 ) << 12 ) - | (( in[ 19 + inpos] & 63 ) << 18 ) - | (( in[ 20 + inpos] & 63 ) << 24 ) - | (( in[ 21 + inpos] ) << 30 ) - ; - out[ 4 + outpos ] = (( in[ 21 + inpos] & 63 ) >>> ( 6 - 4 )) - | (( in[ 22 + inpos] & 63 ) << 4 ) - | (( in[ 23 + inpos] & 63 ) << 10 ) - | (( in[ 24 + inpos] & 63 ) << 16 ) - | (( in[ 25 + inpos] & 63 ) << 22 ) - | (( in[ 26 + inpos] ) << 28 ) - ; - out[ 5 + outpos ] = (( in[ 26 + inpos] & 63 ) >>> ( 6 - 2 )) - | (( in[ 27 + inpos] & 63 ) << 2 ) - | (( in[ 28 + inpos] & 63 ) << 8 ) - | (( in[ 29 + inpos] & 63 ) << 14 ) - | (( in[ 30 + inpos] & 63 ) << 20 ) - | (( in[ 31 + inpos] ) << 26 ) - ; -} - - - - -public static void fastpack7(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 127 ) - | (( in[ 1 + inpos] & 127 ) << 7 ) - | (( in[ 2 + inpos] & 127 ) << 14 ) - | (( in[ 3 + inpos] & 127 ) << 21 ) - | (( in[ 4 + inpos] ) << 28 ) - ; - out[ 1 + outpos ] = (( in[ 4 + inpos] & 127 ) >>> ( 7 - 3 )) - | (( in[ 5 + inpos] & 127 ) << 3 ) - | (( in[ 6 + inpos] & 127 ) << 10 ) - | (( in[ 7 + inpos] & 127 ) << 17 ) - | (( in[ 8 + inpos] & 127 ) << 24 ) - | (( in[ 9 + inpos] ) << 31 ) - ; - out[ 2 + outpos ] = (( in[ 9 + inpos] & 127 ) >>> ( 7 - 6 )) - | (( in[ 10 + inpos] & 127 ) << 6 ) - | (( in[ 11 + inpos] & 127 ) << 13 ) - | (( in[ 12 + inpos] & 127 ) << 20 ) - | (( in[ 13 + inpos] ) << 27 ) - ; - out[ 3 + outpos ] = (( in[ 13 + inpos] & 127 ) >>> ( 7 - 2 )) - | (( in[ 14 + inpos] & 127 ) << 2 ) - | (( in[ 15 + inpos] & 127 ) << 9 ) - | (( in[ 16 + inpos] & 127 ) << 16 ) - | (( in[ 17 + inpos] & 127 ) << 23 ) - | (( in[ 18 + inpos] ) << 30 ) - ; - out[ 4 + outpos ] = (( in[ 18 + inpos] & 127 ) >>> ( 7 - 5 )) - | (( in[ 19 + inpos] & 127 ) << 5 ) - | (( in[ 20 + inpos] & 127 ) << 12 ) - | (( in[ 21 + inpos] & 127 ) << 19 ) - | (( in[ 22 + inpos] ) << 26 ) - ; - out[ 5 + outpos ] = (( in[ 22 + inpos] & 127 ) >>> ( 7 - 1 )) - | (( in[ 23 + inpos] & 127 ) << 1 ) - | (( in[ 24 + inpos] & 127 ) << 8 ) - | (( in[ 25 + inpos] & 127 ) << 15 ) - | (( in[ 26 + inpos] & 127 ) << 22 ) - | (( in[ 27 + inpos] ) << 29 ) - ; - out[ 6 + outpos ] = (( in[ 27 + inpos] & 127 ) >>> ( 7 - 4 )) - | (( in[ 28 + inpos] & 127 ) << 4 ) - | (( in[ 29 + inpos] & 127 ) << 11 ) - | (( in[ 30 + inpos] & 127 ) << 18 ) - | (( in[ 31 + inpos] ) << 25 ) - ; -} - - - - -public static void fastpack8(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 255 ) - | (( in[ 1 + inpos] & 255 ) << 8 ) - | (( in[ 2 + inpos] & 255 ) << 16 ) - | (( in[ 3 + inpos] ) << 24 ) - ; - out[ 1 + outpos ] = (in[ 4 + inpos] & 255 ) - | (( in[ 5 + inpos] & 255 ) << 8 ) - | (( in[ 6 + inpos] & 255 ) << 16 ) - | (( in[ 7 + inpos] ) << 24 ) - ; - out[ 2 + outpos ] = (in[ 8 + inpos] & 255 ) - | (( in[ 9 + inpos] & 255 ) << 8 ) - | (( in[ 10 + inpos] & 255 ) << 16 ) - | (( in[ 11 + inpos] ) << 24 ) - ; - out[ 3 + outpos ] = (in[ 12 + inpos] & 255 ) - | (( in[ 13 + inpos] & 255 ) << 8 ) - | (( in[ 14 + inpos] & 255 ) << 16 ) - | (( in[ 15 + inpos] ) << 24 ) - ; - out[ 4 + outpos ] = (in[ 16 + inpos] & 255 ) - | (( in[ 17 + inpos] & 255 ) << 8 ) - | (( in[ 18 + inpos] & 255 ) << 16 ) - | (( in[ 19 + inpos] ) << 24 ) - ; - out[ 5 + outpos ] = (in[ 20 + inpos] & 255 ) - | (( in[ 21 + inpos] & 255 ) << 8 ) - | (( in[ 22 + inpos] & 255 ) << 16 ) - | (( in[ 23 + inpos] ) << 24 ) - ; - out[ 6 + outpos ] = (in[ 24 + inpos] & 255 ) - | (( in[ 25 + inpos] & 255 ) << 8 ) - | (( in[ 26 + inpos] & 255 ) << 16 ) - | (( in[ 27 + inpos] ) << 24 ) - ; - out[ 7 + outpos ] = (in[ 28 + inpos] & 255 ) - | (( in[ 29 + inpos] & 255 ) << 8 ) - | (( in[ 30 + inpos] & 255 ) << 16 ) - | (( in[ 31 + inpos] ) << 24 ) - ; -} - - - - -public static void fastpack9(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 511 ) - | (( in[ 1 + inpos] & 511 ) << 9 ) - | (( in[ 2 + inpos] & 511 ) << 18 ) - | (( in[ 3 + inpos] ) << 27 ) - ; - out[ 1 + outpos ] = (( in[ 3 + inpos] & 511 ) >>> ( 9 - 4 )) - | (( in[ 4 + inpos] & 511 ) << 4 ) - | (( in[ 5 + inpos] & 511 ) << 13 ) - | (( in[ 6 + inpos] & 511 ) << 22 ) - | (( in[ 7 + inpos] ) << 31 ) - ; - out[ 2 + outpos ] = (( in[ 7 + inpos] & 511 ) >>> ( 9 - 8 )) - | (( in[ 8 + inpos] & 511 ) << 8 ) - | (( in[ 9 + inpos] & 511 ) << 17 ) - | (( in[ 10 + inpos] ) << 26 ) - ; - out[ 3 + outpos ] = (( in[ 10 + inpos] & 511 ) >>> ( 9 - 3 )) - | (( in[ 11 + inpos] & 511 ) << 3 ) - | (( in[ 12 + inpos] & 511 ) << 12 ) - | (( in[ 13 + inpos] & 511 ) << 21 ) - | (( in[ 14 + inpos] ) << 30 ) - ; - out[ 4 + outpos ] = (( in[ 14 + inpos] & 511 ) >>> ( 9 - 7 )) - | (( in[ 15 + inpos] & 511 ) << 7 ) - | (( in[ 16 + inpos] & 511 ) << 16 ) - | (( in[ 17 + inpos] ) << 25 ) - ; - out[ 5 + outpos ] = (( in[ 17 + inpos] & 511 ) >>> ( 9 - 2 )) - | (( in[ 18 + inpos] & 511 ) << 2 ) - | (( in[ 19 + inpos] & 511 ) << 11 ) - | (( in[ 20 + inpos] & 511 ) << 20 ) - | (( in[ 21 + inpos] ) << 29 ) - ; - out[ 6 + outpos ] = (( in[ 21 + inpos] & 511 ) >>> ( 9 - 6 )) - | (( in[ 22 + inpos] & 511 ) << 6 ) - | (( in[ 23 + inpos] & 511 ) << 15 ) - | (( in[ 24 + inpos] ) << 24 ) - ; - out[ 7 + outpos ] = (( in[ 24 + inpos] & 511 ) >>> ( 9 - 1 )) - | (( in[ 25 + inpos] & 511 ) << 1 ) - | (( in[ 26 + inpos] & 511 ) << 10 ) - | (( in[ 27 + inpos] & 511 ) << 19 ) - | (( in[ 28 + inpos] ) << 28 ) - ; - out[ 8 + outpos ] = (( in[ 28 + inpos] & 511 ) >>> ( 9 - 5 )) - | (( in[ 29 + inpos] & 511 ) << 5 ) - | (( in[ 30 + inpos] & 511 ) << 14 ) - | (( in[ 31 + inpos] ) << 23 ) - ; -} - - - - -public static void fastpack10(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 1023 ) - | (( in[ 1 + inpos] & 1023 ) << 10 ) - | (( in[ 2 + inpos] & 1023 ) << 20 ) - | (( in[ 3 + inpos] ) << 30 ) - ; - out[ 1 + outpos ] = (( in[ 3 + inpos] & 1023 ) >>> ( 10 - 8 )) - | (( in[ 4 + inpos] & 1023 ) << 8 ) - | (( in[ 5 + inpos] & 1023 ) << 18 ) - | (( in[ 6 + inpos] ) << 28 ) - ; - out[ 2 + outpos ] = (( in[ 6 + inpos] & 1023 ) >>> ( 10 - 6 )) - | (( in[ 7 + inpos] & 1023 ) << 6 ) - | (( in[ 8 + inpos] & 1023 ) << 16 ) - | (( in[ 9 + inpos] ) << 26 ) - ; - out[ 3 + outpos ] = (( in[ 9 + inpos] & 1023 ) >>> ( 10 - 4 )) - | (( in[ 10 + inpos] & 1023 ) << 4 ) - | (( in[ 11 + inpos] & 1023 ) << 14 ) - | (( in[ 12 + inpos] ) << 24 ) - ; - out[ 4 + outpos ] = (( in[ 12 + inpos] & 1023 ) >>> ( 10 - 2 )) - | (( in[ 13 + inpos] & 1023 ) << 2 ) - | (( in[ 14 + inpos] & 1023 ) << 12 ) - | (( in[ 15 + inpos] ) << 22 ) - ; - out[ 5 + outpos ] = (in[ 16 + inpos] & 1023 ) - | (( in[ 17 + inpos] & 1023 ) << 10 ) - | (( in[ 18 + inpos] & 1023 ) << 20 ) - | (( in[ 19 + inpos] ) << 30 ) - ; - out[ 6 + outpos ] = (( in[ 19 + inpos] & 1023 ) >>> ( 10 - 8 )) - | (( in[ 20 + inpos] & 1023 ) << 8 ) - | (( in[ 21 + inpos] & 1023 ) << 18 ) - | (( in[ 22 + inpos] ) << 28 ) - ; - out[ 7 + outpos ] = (( in[ 22 + inpos] & 1023 ) >>> ( 10 - 6 )) - | (( in[ 23 + inpos] & 1023 ) << 6 ) - | (( in[ 24 + inpos] & 1023 ) << 16 ) - | (( in[ 25 + inpos] ) << 26 ) - ; - out[ 8 + outpos ] = (( in[ 25 + inpos] & 1023 ) >>> ( 10 - 4 )) - | (( in[ 26 + inpos] & 1023 ) << 4 ) - | (( in[ 27 + inpos] & 1023 ) << 14 ) - | (( in[ 28 + inpos] ) << 24 ) - ; - out[ 9 + outpos ] = (( in[ 28 + inpos] & 1023 ) >>> ( 10 - 2 )) - | (( in[ 29 + inpos] & 1023 ) << 2 ) - | (( in[ 30 + inpos] & 1023 ) << 12 ) - | (( in[ 31 + inpos] ) << 22 ) - ; -} - - - - -public static void fastpack11(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 2047 ) - | (( in[ 1 + inpos] & 2047 ) << 11 ) - | (( in[ 2 + inpos] ) << 22 ) - ; - out[ 1 + outpos ] = (( in[ 2 + inpos] & 2047 ) >>> ( 11 - 1 )) - | (( in[ 3 + inpos] & 2047 ) << 1 ) - | (( in[ 4 + inpos] & 2047 ) << 12 ) - | (( in[ 5 + inpos] ) << 23 ) - ; - out[ 2 + outpos ] = (( in[ 5 + inpos] & 2047 ) >>> ( 11 - 2 )) - | (( in[ 6 + inpos] & 2047 ) << 2 ) - | (( in[ 7 + inpos] & 2047 ) << 13 ) - | (( in[ 8 + inpos] ) << 24 ) - ; - out[ 3 + outpos ] = (( in[ 8 + inpos] & 2047 ) >>> ( 11 - 3 )) - | (( in[ 9 + inpos] & 2047 ) << 3 ) - | (( in[ 10 + inpos] & 2047 ) << 14 ) - | (( in[ 11 + inpos] ) << 25 ) - ; - out[ 4 + outpos ] = (( in[ 11 + inpos] & 2047 ) >>> ( 11 - 4 )) - | (( in[ 12 + inpos] & 2047 ) << 4 ) - | (( in[ 13 + inpos] & 2047 ) << 15 ) - | (( in[ 14 + inpos] ) << 26 ) - ; - out[ 5 + outpos ] = (( in[ 14 + inpos] & 2047 ) >>> ( 11 - 5 )) - | (( in[ 15 + inpos] & 2047 ) << 5 ) - | (( in[ 16 + inpos] & 2047 ) << 16 ) - | (( in[ 17 + inpos] ) << 27 ) - ; - out[ 6 + outpos ] = (( in[ 17 + inpos] & 2047 ) >>> ( 11 - 6 )) - | (( in[ 18 + inpos] & 2047 ) << 6 ) - | (( in[ 19 + inpos] & 2047 ) << 17 ) - | (( in[ 20 + inpos] ) << 28 ) - ; - out[ 7 + outpos ] = (( in[ 20 + inpos] & 2047 ) >>> ( 11 - 7 )) - | (( in[ 21 + inpos] & 2047 ) << 7 ) - | (( in[ 22 + inpos] & 2047 ) << 18 ) - | (( in[ 23 + inpos] ) << 29 ) - ; - out[ 8 + outpos ] = (( in[ 23 + inpos] & 2047 ) >>> ( 11 - 8 )) - | (( in[ 24 + inpos] & 2047 ) << 8 ) - | (( in[ 25 + inpos] & 2047 ) << 19 ) - | (( in[ 26 + inpos] ) << 30 ) - ; - out[ 9 + outpos ] = (( in[ 26 + inpos] & 2047 ) >>> ( 11 - 9 )) - | (( in[ 27 + inpos] & 2047 ) << 9 ) - | (( in[ 28 + inpos] & 2047 ) << 20 ) - | (( in[ 29 + inpos] ) << 31 ) - ; - out[ 10 + outpos ] = (( in[ 29 + inpos] & 2047 ) >>> ( 11 - 10 )) - | (( in[ 30 + inpos] & 2047 ) << 10 ) - | (( in[ 31 + inpos] ) << 21 ) - ; -} - - - - -public static void fastpack12(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 4095 ) - | (( in[ 1 + inpos] & 4095 ) << 12 ) - | (( in[ 2 + inpos] ) << 24 ) - ; - out[ 1 + outpos ] = (( in[ 2 + inpos] & 4095 ) >>> ( 12 - 4 )) - | (( in[ 3 + inpos] & 4095 ) << 4 ) - | (( in[ 4 + inpos] & 4095 ) << 16 ) - | (( in[ 5 + inpos] ) << 28 ) - ; - out[ 2 + outpos ] = (( in[ 5 + inpos] & 4095 ) >>> ( 12 - 8 )) - | (( in[ 6 + inpos] & 4095 ) << 8 ) - | (( in[ 7 + inpos] ) << 20 ) - ; - out[ 3 + outpos ] = (in[ 8 + inpos] & 4095 ) - | (( in[ 9 + inpos] & 4095 ) << 12 ) - | (( in[ 10 + inpos] ) << 24 ) - ; - out[ 4 + outpos ] = (( in[ 10 + inpos] & 4095 ) >>> ( 12 - 4 )) - | (( in[ 11 + inpos] & 4095 ) << 4 ) - | (( in[ 12 + inpos] & 4095 ) << 16 ) - | (( in[ 13 + inpos] ) << 28 ) - ; - out[ 5 + outpos ] = (( in[ 13 + inpos] & 4095 ) >>> ( 12 - 8 )) - | (( in[ 14 + inpos] & 4095 ) << 8 ) - | (( in[ 15 + inpos] ) << 20 ) - ; - out[ 6 + outpos ] = (in[ 16 + inpos] & 4095 ) - | (( in[ 17 + inpos] & 4095 ) << 12 ) - | (( in[ 18 + inpos] ) << 24 ) - ; - out[ 7 + outpos ] = (( in[ 18 + inpos] & 4095 ) >>> ( 12 - 4 )) - | (( in[ 19 + inpos] & 4095 ) << 4 ) - | (( in[ 20 + inpos] & 4095 ) << 16 ) - | (( in[ 21 + inpos] ) << 28 ) - ; - out[ 8 + outpos ] = (( in[ 21 + inpos] & 4095 ) >>> ( 12 - 8 )) - | (( in[ 22 + inpos] & 4095 ) << 8 ) - | (( in[ 23 + inpos] ) << 20 ) - ; - out[ 9 + outpos ] = (in[ 24 + inpos] & 4095 ) - | (( in[ 25 + inpos] & 4095 ) << 12 ) - | (( in[ 26 + inpos] ) << 24 ) - ; - out[ 10 + outpos ] = (( in[ 26 + inpos] & 4095 ) >>> ( 12 - 4 )) - | (( in[ 27 + inpos] & 4095 ) << 4 ) - | (( in[ 28 + inpos] & 4095 ) << 16 ) - | (( in[ 29 + inpos] ) << 28 ) - ; - out[ 11 + outpos ] = (( in[ 29 + inpos] & 4095 ) >>> ( 12 - 8 )) - | (( in[ 30 + inpos] & 4095 ) << 8 ) - | (( in[ 31 + inpos] ) << 20 ) - ; -} - - - - -public static void fastpack13(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 8191 ) - | (( in[ 1 + inpos] & 8191 ) << 13 ) - | (( in[ 2 + inpos] ) << 26 ) - ; - out[ 1 + outpos ] = (( in[ 2 + inpos] & 8191 ) >>> ( 13 - 7 )) - | (( in[ 3 + inpos] & 8191 ) << 7 ) - | (( in[ 4 + inpos] ) << 20 ) - ; - out[ 2 + outpos ] = (( in[ 4 + inpos] & 8191 ) >>> ( 13 - 1 )) - | (( in[ 5 + inpos] & 8191 ) << 1 ) - | (( in[ 6 + inpos] & 8191 ) << 14 ) - | (( in[ 7 + inpos] ) << 27 ) - ; - out[ 3 + outpos ] = (( in[ 7 + inpos] & 8191 ) >>> ( 13 - 8 )) - | (( in[ 8 + inpos] & 8191 ) << 8 ) - | (( in[ 9 + inpos] ) << 21 ) - ; - out[ 4 + outpos ] = (( in[ 9 + inpos] & 8191 ) >>> ( 13 - 2 )) - | (( in[ 10 + inpos] & 8191 ) << 2 ) - | (( in[ 11 + inpos] & 8191 ) << 15 ) - | (( in[ 12 + inpos] ) << 28 ) - ; - out[ 5 + outpos ] = (( in[ 12 + inpos] & 8191 ) >>> ( 13 - 9 )) - | (( in[ 13 + inpos] & 8191 ) << 9 ) - | (( in[ 14 + inpos] ) << 22 ) - ; - out[ 6 + outpos ] = (( in[ 14 + inpos] & 8191 ) >>> ( 13 - 3 )) - | (( in[ 15 + inpos] & 8191 ) << 3 ) - | (( in[ 16 + inpos] & 8191 ) << 16 ) - | (( in[ 17 + inpos] ) << 29 ) - ; - out[ 7 + outpos ] = (( in[ 17 + inpos] & 8191 ) >>> ( 13 - 10 )) - | (( in[ 18 + inpos] & 8191 ) << 10 ) - | (( in[ 19 + inpos] ) << 23 ) - ; - out[ 8 + outpos ] = (( in[ 19 + inpos] & 8191 ) >>> ( 13 - 4 )) - | (( in[ 20 + inpos] & 8191 ) << 4 ) - | (( in[ 21 + inpos] & 8191 ) << 17 ) - | (( in[ 22 + inpos] ) << 30 ) - ; - out[ 9 + outpos ] = (( in[ 22 + inpos] & 8191 ) >>> ( 13 - 11 )) - | (( in[ 23 + inpos] & 8191 ) << 11 ) - | (( in[ 24 + inpos] ) << 24 ) - ; - out[ 10 + outpos ] = (( in[ 24 + inpos] & 8191 ) >>> ( 13 - 5 )) - | (( in[ 25 + inpos] & 8191 ) << 5 ) - | (( in[ 26 + inpos] & 8191 ) << 18 ) - | (( in[ 27 + inpos] ) << 31 ) - ; - out[ 11 + outpos ] = (( in[ 27 + inpos] & 8191 ) >>> ( 13 - 12 )) - | (( in[ 28 + inpos] & 8191 ) << 12 ) - | (( in[ 29 + inpos] ) << 25 ) - ; - out[ 12 + outpos ] = (( in[ 29 + inpos] & 8191 ) >>> ( 13 - 6 )) - | (( in[ 30 + inpos] & 8191 ) << 6 ) - | (( in[ 31 + inpos] ) << 19 ) - ; -} - - - - -public static void fastpack14(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 16383 ) - | (( in[ 1 + inpos] & 16383 ) << 14 ) - | (( in[ 2 + inpos] ) << 28 ) - ; - out[ 1 + outpos ] = (( in[ 2 + inpos] & 16383 ) >>> ( 14 - 10 )) - | (( in[ 3 + inpos] & 16383 ) << 10 ) - | (( in[ 4 + inpos] ) << 24 ) - ; - out[ 2 + outpos ] = (( in[ 4 + inpos] & 16383 ) >>> ( 14 - 6 )) - | (( in[ 5 + inpos] & 16383 ) << 6 ) - | (( in[ 6 + inpos] ) << 20 ) - ; - out[ 3 + outpos ] = (( in[ 6 + inpos] & 16383 ) >>> ( 14 - 2 )) - | (( in[ 7 + inpos] & 16383 ) << 2 ) - | (( in[ 8 + inpos] & 16383 ) << 16 ) - | (( in[ 9 + inpos] ) << 30 ) - ; - out[ 4 + outpos ] = (( in[ 9 + inpos] & 16383 ) >>> ( 14 - 12 )) - | (( in[ 10 + inpos] & 16383 ) << 12 ) - | (( in[ 11 + inpos] ) << 26 ) - ; - out[ 5 + outpos ] = (( in[ 11 + inpos] & 16383 ) >>> ( 14 - 8 )) - | (( in[ 12 + inpos] & 16383 ) << 8 ) - | (( in[ 13 + inpos] ) << 22 ) - ; - out[ 6 + outpos ] = (( in[ 13 + inpos] & 16383 ) >>> ( 14 - 4 )) - | (( in[ 14 + inpos] & 16383 ) << 4 ) - | (( in[ 15 + inpos] ) << 18 ) - ; - out[ 7 + outpos ] = (in[ 16 + inpos] & 16383 ) - | (( in[ 17 + inpos] & 16383 ) << 14 ) - | (( in[ 18 + inpos] ) << 28 ) - ; - out[ 8 + outpos ] = (( in[ 18 + inpos] & 16383 ) >>> ( 14 - 10 )) - | (( in[ 19 + inpos] & 16383 ) << 10 ) - | (( in[ 20 + inpos] ) << 24 ) - ; - out[ 9 + outpos ] = (( in[ 20 + inpos] & 16383 ) >>> ( 14 - 6 )) - | (( in[ 21 + inpos] & 16383 ) << 6 ) - | (( in[ 22 + inpos] ) << 20 ) - ; - out[ 10 + outpos ] = (( in[ 22 + inpos] & 16383 ) >>> ( 14 - 2 )) - | (( in[ 23 + inpos] & 16383 ) << 2 ) - | (( in[ 24 + inpos] & 16383 ) << 16 ) - | (( in[ 25 + inpos] ) << 30 ) - ; - out[ 11 + outpos ] = (( in[ 25 + inpos] & 16383 ) >>> ( 14 - 12 )) - | (( in[ 26 + inpos] & 16383 ) << 12 ) - | (( in[ 27 + inpos] ) << 26 ) - ; - out[ 12 + outpos ] = (( in[ 27 + inpos] & 16383 ) >>> ( 14 - 8 )) - | (( in[ 28 + inpos] & 16383 ) << 8 ) - | (( in[ 29 + inpos] ) << 22 ) - ; - out[ 13 + outpos ] = (( in[ 29 + inpos] & 16383 ) >>> ( 14 - 4 )) - | (( in[ 30 + inpos] & 16383 ) << 4 ) - | (( in[ 31 + inpos] ) << 18 ) - ; -} - - - - -public static void fastpack15(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 32767 ) - | (( in[ 1 + inpos] & 32767 ) << 15 ) - | (( in[ 2 + inpos] ) << 30 ) - ; - out[ 1 + outpos ] = (( in[ 2 + inpos] & 32767 ) >>> ( 15 - 13 )) - | (( in[ 3 + inpos] & 32767 ) << 13 ) - | (( in[ 4 + inpos] ) << 28 ) - ; - out[ 2 + outpos ] = (( in[ 4 + inpos] & 32767 ) >>> ( 15 - 11 )) - | (( in[ 5 + inpos] & 32767 ) << 11 ) - | (( in[ 6 + inpos] ) << 26 ) - ; - out[ 3 + outpos ] = (( in[ 6 + inpos] & 32767 ) >>> ( 15 - 9 )) - | (( in[ 7 + inpos] & 32767 ) << 9 ) - | (( in[ 8 + inpos] ) << 24 ) - ; - out[ 4 + outpos ] = (( in[ 8 + inpos] & 32767 ) >>> ( 15 - 7 )) - | (( in[ 9 + inpos] & 32767 ) << 7 ) - | (( in[ 10 + inpos] ) << 22 ) - ; - out[ 5 + outpos ] = (( in[ 10 + inpos] & 32767 ) >>> ( 15 - 5 )) - | (( in[ 11 + inpos] & 32767 ) << 5 ) - | (( in[ 12 + inpos] ) << 20 ) - ; - out[ 6 + outpos ] = (( in[ 12 + inpos] & 32767 ) >>> ( 15 - 3 )) - | (( in[ 13 + inpos] & 32767 ) << 3 ) - | (( in[ 14 + inpos] ) << 18 ) - ; - out[ 7 + outpos ] = (( in[ 14 + inpos] & 32767 ) >>> ( 15 - 1 )) - | (( in[ 15 + inpos] & 32767 ) << 1 ) - | (( in[ 16 + inpos] & 32767 ) << 16 ) - | (( in[ 17 + inpos] ) << 31 ) - ; - out[ 8 + outpos ] = (( in[ 17 + inpos] & 32767 ) >>> ( 15 - 14 )) - | (( in[ 18 + inpos] & 32767 ) << 14 ) - | (( in[ 19 + inpos] ) << 29 ) - ; - out[ 9 + outpos ] = (( in[ 19 + inpos] & 32767 ) >>> ( 15 - 12 )) - | (( in[ 20 + inpos] & 32767 ) << 12 ) - | (( in[ 21 + inpos] ) << 27 ) - ; - out[ 10 + outpos ] = (( in[ 21 + inpos] & 32767 ) >>> ( 15 - 10 )) - | (( in[ 22 + inpos] & 32767 ) << 10 ) - | (( in[ 23 + inpos] ) << 25 ) - ; - out[ 11 + outpos ] = (( in[ 23 + inpos] & 32767 ) >>> ( 15 - 8 )) - | (( in[ 24 + inpos] & 32767 ) << 8 ) - | (( in[ 25 + inpos] ) << 23 ) - ; - out[ 12 + outpos ] = (( in[ 25 + inpos] & 32767 ) >>> ( 15 - 6 )) - | (( in[ 26 + inpos] & 32767 ) << 6 ) - | (( in[ 27 + inpos] ) << 21 ) - ; - out[ 13 + outpos ] = (( in[ 27 + inpos] & 32767 ) >>> ( 15 - 4 )) - | (( in[ 28 + inpos] & 32767 ) << 4 ) - | (( in[ 29 + inpos] ) << 19 ) - ; - out[ 14 + outpos ] = (( in[ 29 + inpos] & 32767 ) >>> ( 15 - 2 )) - | (( in[ 30 + inpos] & 32767 ) << 2 ) - | (( in[ 31 + inpos] ) << 17 ) - ; -} - - - - -public static void fastpack16(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 65535 ) - | (( in[ 1 + inpos] ) << 16 ) - ; - out[ 1 + outpos ] = (in[ 2 + inpos] & 65535 ) - | (( in[ 3 + inpos] ) << 16 ) - ; - out[ 2 + outpos ] = (in[ 4 + inpos] & 65535 ) - | (( in[ 5 + inpos] ) << 16 ) - ; - out[ 3 + outpos ] = (in[ 6 + inpos] & 65535 ) - | (( in[ 7 + inpos] ) << 16 ) - ; - out[ 4 + outpos ] = (in[ 8 + inpos] & 65535 ) - | (( in[ 9 + inpos] ) << 16 ) - ; - out[ 5 + outpos ] = (in[ 10 + inpos] & 65535 ) - | (( in[ 11 + inpos] ) << 16 ) - ; - out[ 6 + outpos ] = (in[ 12 + inpos] & 65535 ) - | (( in[ 13 + inpos] ) << 16 ) - ; - out[ 7 + outpos ] = (in[ 14 + inpos] & 65535 ) - | (( in[ 15 + inpos] ) << 16 ) - ; - out[ 8 + outpos ] = (in[ 16 + inpos] & 65535 ) - | (( in[ 17 + inpos] ) << 16 ) - ; - out[ 9 + outpos ] = (in[ 18 + inpos] & 65535 ) - | (( in[ 19 + inpos] ) << 16 ) - ; - out[ 10 + outpos ] = (in[ 20 + inpos] & 65535 ) - | (( in[ 21 + inpos] ) << 16 ) - ; - out[ 11 + outpos ] = (in[ 22 + inpos] & 65535 ) - | (( in[ 23 + inpos] ) << 16 ) - ; - out[ 12 + outpos ] = (in[ 24 + inpos] & 65535 ) - | (( in[ 25 + inpos] ) << 16 ) - ; - out[ 13 + outpos ] = (in[ 26 + inpos] & 65535 ) - | (( in[ 27 + inpos] ) << 16 ) - ; - out[ 14 + outpos ] = (in[ 28 + inpos] & 65535 ) - | (( in[ 29 + inpos] ) << 16 ) - ; - out[ 15 + outpos ] = (in[ 30 + inpos] & 65535 ) - | (( in[ 31 + inpos] ) << 16 ) - ; -} - - - - -public static void fastpack17(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 131071 ) - | (( in[ 1 + inpos] ) << 17 ) - ; - out[ 1 + outpos ] = (( in[ 1 + inpos] & 131071 ) >>> ( 17 - 2 )) - | (( in[ 2 + inpos] & 131071 ) << 2 ) - | (( in[ 3 + inpos] ) << 19 ) - ; - out[ 2 + outpos ] = (( in[ 3 + inpos] & 131071 ) >>> ( 17 - 4 )) - | (( in[ 4 + inpos] & 131071 ) << 4 ) - | (( in[ 5 + inpos] ) << 21 ) - ; - out[ 3 + outpos ] = (( in[ 5 + inpos] & 131071 ) >>> ( 17 - 6 )) - | (( in[ 6 + inpos] & 131071 ) << 6 ) - | (( in[ 7 + inpos] ) << 23 ) - ; - out[ 4 + outpos ] = (( in[ 7 + inpos] & 131071 ) >>> ( 17 - 8 )) - | (( in[ 8 + inpos] & 131071 ) << 8 ) - | (( in[ 9 + inpos] ) << 25 ) - ; - out[ 5 + outpos ] = (( in[ 9 + inpos] & 131071 ) >>> ( 17 - 10 )) - | (( in[ 10 + inpos] & 131071 ) << 10 ) - | (( in[ 11 + inpos] ) << 27 ) - ; - out[ 6 + outpos ] = (( in[ 11 + inpos] & 131071 ) >>> ( 17 - 12 )) - | (( in[ 12 + inpos] & 131071 ) << 12 ) - | (( in[ 13 + inpos] ) << 29 ) - ; - out[ 7 + outpos ] = (( in[ 13 + inpos] & 131071 ) >>> ( 17 - 14 )) - | (( in[ 14 + inpos] & 131071 ) << 14 ) - | (( in[ 15 + inpos] ) << 31 ) - ; - out[ 8 + outpos ] = (( in[ 15 + inpos] & 131071 ) >>> ( 17 - 16 )) - | (( in[ 16 + inpos] ) << 16 ) - ; - out[ 9 + outpos ] = (( in[ 16 + inpos] & 131071 ) >>> ( 17 - 1 )) - | (( in[ 17 + inpos] & 131071 ) << 1 ) - | (( in[ 18 + inpos] ) << 18 ) - ; - out[ 10 + outpos ] = (( in[ 18 + inpos] & 131071 ) >>> ( 17 - 3 )) - | (( in[ 19 + inpos] & 131071 ) << 3 ) - | (( in[ 20 + inpos] ) << 20 ) - ; - out[ 11 + outpos ] = (( in[ 20 + inpos] & 131071 ) >>> ( 17 - 5 )) - | (( in[ 21 + inpos] & 131071 ) << 5 ) - | (( in[ 22 + inpos] ) << 22 ) - ; - out[ 12 + outpos ] = (( in[ 22 + inpos] & 131071 ) >>> ( 17 - 7 )) - | (( in[ 23 + inpos] & 131071 ) << 7 ) - | (( in[ 24 + inpos] ) << 24 ) - ; - out[ 13 + outpos ] = (( in[ 24 + inpos] & 131071 ) >>> ( 17 - 9 )) - | (( in[ 25 + inpos] & 131071 ) << 9 ) - | (( in[ 26 + inpos] ) << 26 ) - ; - out[ 14 + outpos ] = (( in[ 26 + inpos] & 131071 ) >>> ( 17 - 11 )) - | (( in[ 27 + inpos] & 131071 ) << 11 ) - | (( in[ 28 + inpos] ) << 28 ) - ; - out[ 15 + outpos ] = (( in[ 28 + inpos] & 131071 ) >>> ( 17 - 13 )) - | (( in[ 29 + inpos] & 131071 ) << 13 ) - | (( in[ 30 + inpos] ) << 30 ) - ; - out[ 16 + outpos ] = (( in[ 30 + inpos] & 131071 ) >>> ( 17 - 15 )) - | (( in[ 31 + inpos] ) << 15 ) - ; -} - - - - -public static void fastpack18(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 262143 ) - | (( in[ 1 + inpos] ) << 18 ) - ; - out[ 1 + outpos ] = (( in[ 1 + inpos] & 262143 ) >>> ( 18 - 4 )) - | (( in[ 2 + inpos] & 262143 ) << 4 ) - | (( in[ 3 + inpos] ) << 22 ) - ; - out[ 2 + outpos ] = (( in[ 3 + inpos] & 262143 ) >>> ( 18 - 8 )) - | (( in[ 4 + inpos] & 262143 ) << 8 ) - | (( in[ 5 + inpos] ) << 26 ) - ; - out[ 3 + outpos ] = (( in[ 5 + inpos] & 262143 ) >>> ( 18 - 12 )) - | (( in[ 6 + inpos] & 262143 ) << 12 ) - | (( in[ 7 + inpos] ) << 30 ) - ; - out[ 4 + outpos ] = (( in[ 7 + inpos] & 262143 ) >>> ( 18 - 16 )) - | (( in[ 8 + inpos] ) << 16 ) - ; - out[ 5 + outpos ] = (( in[ 8 + inpos] & 262143 ) >>> ( 18 - 2 )) - | (( in[ 9 + inpos] & 262143 ) << 2 ) - | (( in[ 10 + inpos] ) << 20 ) - ; - out[ 6 + outpos ] = (( in[ 10 + inpos] & 262143 ) >>> ( 18 - 6 )) - | (( in[ 11 + inpos] & 262143 ) << 6 ) - | (( in[ 12 + inpos] ) << 24 ) - ; - out[ 7 + outpos ] = (( in[ 12 + inpos] & 262143 ) >>> ( 18 - 10 )) - | (( in[ 13 + inpos] & 262143 ) << 10 ) - | (( in[ 14 + inpos] ) << 28 ) - ; - out[ 8 + outpos ] = (( in[ 14 + inpos] & 262143 ) >>> ( 18 - 14 )) - | (( in[ 15 + inpos] ) << 14 ) - ; - out[ 9 + outpos ] = (in[ 16 + inpos] & 262143 ) - | (( in[ 17 + inpos] ) << 18 ) - ; - out[ 10 + outpos ] = (( in[ 17 + inpos] & 262143 ) >>> ( 18 - 4 )) - | (( in[ 18 + inpos] & 262143 ) << 4 ) - | (( in[ 19 + inpos] ) << 22 ) - ; - out[ 11 + outpos ] = (( in[ 19 + inpos] & 262143 ) >>> ( 18 - 8 )) - | (( in[ 20 + inpos] & 262143 ) << 8 ) - | (( in[ 21 + inpos] ) << 26 ) - ; - out[ 12 + outpos ] = (( in[ 21 + inpos] & 262143 ) >>> ( 18 - 12 )) - | (( in[ 22 + inpos] & 262143 ) << 12 ) - | (( in[ 23 + inpos] ) << 30 ) - ; - out[ 13 + outpos ] = (( in[ 23 + inpos] & 262143 ) >>> ( 18 - 16 )) - | (( in[ 24 + inpos] ) << 16 ) - ; - out[ 14 + outpos ] = (( in[ 24 + inpos] & 262143 ) >>> ( 18 - 2 )) - | (( in[ 25 + inpos] & 262143 ) << 2 ) - | (( in[ 26 + inpos] ) << 20 ) - ; - out[ 15 + outpos ] = (( in[ 26 + inpos] & 262143 ) >>> ( 18 - 6 )) - | (( in[ 27 + inpos] & 262143 ) << 6 ) - | (( in[ 28 + inpos] ) << 24 ) - ; - out[ 16 + outpos ] = (( in[ 28 + inpos] & 262143 ) >>> ( 18 - 10 )) - | (( in[ 29 + inpos] & 262143 ) << 10 ) - | (( in[ 30 + inpos] ) << 28 ) - ; - out[ 17 + outpos ] = (( in[ 30 + inpos] & 262143 ) >>> ( 18 - 14 )) - | (( in[ 31 + inpos] ) << 14 ) - ; -} - - - - -public static void fastpack19(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 524287 ) - | (( in[ 1 + inpos] ) << 19 ) - ; - out[ 1 + outpos ] = (( in[ 1 + inpos] & 524287 ) >>> ( 19 - 6 )) - | (( in[ 2 + inpos] & 524287 ) << 6 ) - | (( in[ 3 + inpos] ) << 25 ) - ; - out[ 2 + outpos ] = (( in[ 3 + inpos] & 524287 ) >>> ( 19 - 12 )) - | (( in[ 4 + inpos] & 524287 ) << 12 ) - | (( in[ 5 + inpos] ) << 31 ) - ; - out[ 3 + outpos ] = (( in[ 5 + inpos] & 524287 ) >>> ( 19 - 18 )) - | (( in[ 6 + inpos] ) << 18 ) - ; - out[ 4 + outpos ] = (( in[ 6 + inpos] & 524287 ) >>> ( 19 - 5 )) - | (( in[ 7 + inpos] & 524287 ) << 5 ) - | (( in[ 8 + inpos] ) << 24 ) - ; - out[ 5 + outpos ] = (( in[ 8 + inpos] & 524287 ) >>> ( 19 - 11 )) - | (( in[ 9 + inpos] & 524287 ) << 11 ) - | (( in[ 10 + inpos] ) << 30 ) - ; - out[ 6 + outpos ] = (( in[ 10 + inpos] & 524287 ) >>> ( 19 - 17 )) - | (( in[ 11 + inpos] ) << 17 ) - ; - out[ 7 + outpos ] = (( in[ 11 + inpos] & 524287 ) >>> ( 19 - 4 )) - | (( in[ 12 + inpos] & 524287 ) << 4 ) - | (( in[ 13 + inpos] ) << 23 ) - ; - out[ 8 + outpos ] = (( in[ 13 + inpos] & 524287 ) >>> ( 19 - 10 )) - | (( in[ 14 + inpos] & 524287 ) << 10 ) - | (( in[ 15 + inpos] ) << 29 ) - ; - out[ 9 + outpos ] = (( in[ 15 + inpos] & 524287 ) >>> ( 19 - 16 )) - | (( in[ 16 + inpos] ) << 16 ) - ; - out[ 10 + outpos ] = (( in[ 16 + inpos] & 524287 ) >>> ( 19 - 3 )) - | (( in[ 17 + inpos] & 524287 ) << 3 ) - | (( in[ 18 + inpos] ) << 22 ) - ; - out[ 11 + outpos ] = (( in[ 18 + inpos] & 524287 ) >>> ( 19 - 9 )) - | (( in[ 19 + inpos] & 524287 ) << 9 ) - | (( in[ 20 + inpos] ) << 28 ) - ; - out[ 12 + outpos ] = (( in[ 20 + inpos] & 524287 ) >>> ( 19 - 15 )) - | (( in[ 21 + inpos] ) << 15 ) - ; - out[ 13 + outpos ] = (( in[ 21 + inpos] & 524287 ) >>> ( 19 - 2 )) - | (( in[ 22 + inpos] & 524287 ) << 2 ) - | (( in[ 23 + inpos] ) << 21 ) - ; - out[ 14 + outpos ] = (( in[ 23 + inpos] & 524287 ) >>> ( 19 - 8 )) - | (( in[ 24 + inpos] & 524287 ) << 8 ) - | (( in[ 25 + inpos] ) << 27 ) - ; - out[ 15 + outpos ] = (( in[ 25 + inpos] & 524287 ) >>> ( 19 - 14 )) - | (( in[ 26 + inpos] ) << 14 ) - ; - out[ 16 + outpos ] = (( in[ 26 + inpos] & 524287 ) >>> ( 19 - 1 )) - | (( in[ 27 + inpos] & 524287 ) << 1 ) - | (( in[ 28 + inpos] ) << 20 ) - ; - out[ 17 + outpos ] = (( in[ 28 + inpos] & 524287 ) >>> ( 19 - 7 )) - | (( in[ 29 + inpos] & 524287 ) << 7 ) - | (( in[ 30 + inpos] ) << 26 ) - ; - out[ 18 + outpos ] = (( in[ 30 + inpos] & 524287 ) >>> ( 19 - 13 )) - | (( in[ 31 + inpos] ) << 13 ) - ; -} - - - - -public static void fastpack20(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 1048575 ) - | (( in[ 1 + inpos] ) << 20 ) - ; - out[ 1 + outpos ] = (( in[ 1 + inpos] & 1048575 ) >>> ( 20 - 8 )) - | (( in[ 2 + inpos] & 1048575 ) << 8 ) - | (( in[ 3 + inpos] ) << 28 ) - ; - out[ 2 + outpos ] = (( in[ 3 + inpos] & 1048575 ) >>> ( 20 - 16 )) - | (( in[ 4 + inpos] ) << 16 ) - ; - out[ 3 + outpos ] = (( in[ 4 + inpos] & 1048575 ) >>> ( 20 - 4 )) - | (( in[ 5 + inpos] & 1048575 ) << 4 ) - | (( in[ 6 + inpos] ) << 24 ) - ; - out[ 4 + outpos ] = (( in[ 6 + inpos] & 1048575 ) >>> ( 20 - 12 )) - | (( in[ 7 + inpos] ) << 12 ) - ; - out[ 5 + outpos ] = (in[ 8 + inpos] & 1048575 ) - | (( in[ 9 + inpos] ) << 20 ) - ; - out[ 6 + outpos ] = (( in[ 9 + inpos] & 1048575 ) >>> ( 20 - 8 )) - | (( in[ 10 + inpos] & 1048575 ) << 8 ) - | (( in[ 11 + inpos] ) << 28 ) - ; - out[ 7 + outpos ] = (( in[ 11 + inpos] & 1048575 ) >>> ( 20 - 16 )) - | (( in[ 12 + inpos] ) << 16 ) - ; - out[ 8 + outpos ] = (( in[ 12 + inpos] & 1048575 ) >>> ( 20 - 4 )) - | (( in[ 13 + inpos] & 1048575 ) << 4 ) - | (( in[ 14 + inpos] ) << 24 ) - ; - out[ 9 + outpos ] = (( in[ 14 + inpos] & 1048575 ) >>> ( 20 - 12 )) - | (( in[ 15 + inpos] ) << 12 ) - ; - out[ 10 + outpos ] = (in[ 16 + inpos] & 1048575 ) - | (( in[ 17 + inpos] ) << 20 ) - ; - out[ 11 + outpos ] = (( in[ 17 + inpos] & 1048575 ) >>> ( 20 - 8 )) - | (( in[ 18 + inpos] & 1048575 ) << 8 ) - | (( in[ 19 + inpos] ) << 28 ) - ; - out[ 12 + outpos ] = (( in[ 19 + inpos] & 1048575 ) >>> ( 20 - 16 )) - | (( in[ 20 + inpos] ) << 16 ) - ; - out[ 13 + outpos ] = (( in[ 20 + inpos] & 1048575 ) >>> ( 20 - 4 )) - | (( in[ 21 + inpos] & 1048575 ) << 4 ) - | (( in[ 22 + inpos] ) << 24 ) - ; - out[ 14 + outpos ] = (( in[ 22 + inpos] & 1048575 ) >>> ( 20 - 12 )) - | (( in[ 23 + inpos] ) << 12 ) - ; - out[ 15 + outpos ] = (in[ 24 + inpos] & 1048575 ) - | (( in[ 25 + inpos] ) << 20 ) - ; - out[ 16 + outpos ] = (( in[ 25 + inpos] & 1048575 ) >>> ( 20 - 8 )) - | (( in[ 26 + inpos] & 1048575 ) << 8 ) - | (( in[ 27 + inpos] ) << 28 ) - ; - out[ 17 + outpos ] = (( in[ 27 + inpos] & 1048575 ) >>> ( 20 - 16 )) - | (( in[ 28 + inpos] ) << 16 ) - ; - out[ 18 + outpos ] = (( in[ 28 + inpos] & 1048575 ) >>> ( 20 - 4 )) - | (( in[ 29 + inpos] & 1048575 ) << 4 ) - | (( in[ 30 + inpos] ) << 24 ) - ; - out[ 19 + outpos ] = (( in[ 30 + inpos] & 1048575 ) >>> ( 20 - 12 )) - | (( in[ 31 + inpos] ) << 12 ) - ; -} - - - - -public static void fastpack21(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 2097151 ) - | (( in[ 1 + inpos] ) << 21 ) - ; - out[ 1 + outpos ] = (( in[ 1 + inpos] & 2097151 ) >>> ( 21 - 10 )) - | (( in[ 2 + inpos] & 2097151 ) << 10 ) - | (( in[ 3 + inpos] ) << 31 ) - ; - out[ 2 + outpos ] = (( in[ 3 + inpos] & 2097151 ) >>> ( 21 - 20 )) - | (( in[ 4 + inpos] ) << 20 ) - ; - out[ 3 + outpos ] = (( in[ 4 + inpos] & 2097151 ) >>> ( 21 - 9 )) - | (( in[ 5 + inpos] & 2097151 ) << 9 ) - | (( in[ 6 + inpos] ) << 30 ) - ; - out[ 4 + outpos ] = (( in[ 6 + inpos] & 2097151 ) >>> ( 21 - 19 )) - | (( in[ 7 + inpos] ) << 19 ) - ; - out[ 5 + outpos ] = (( in[ 7 + inpos] & 2097151 ) >>> ( 21 - 8 )) - | (( in[ 8 + inpos] & 2097151 ) << 8 ) - | (( in[ 9 + inpos] ) << 29 ) - ; - out[ 6 + outpos ] = (( in[ 9 + inpos] & 2097151 ) >>> ( 21 - 18 )) - | (( in[ 10 + inpos] ) << 18 ) - ; - out[ 7 + outpos ] = (( in[ 10 + inpos] & 2097151 ) >>> ( 21 - 7 )) - | (( in[ 11 + inpos] & 2097151 ) << 7 ) - | (( in[ 12 + inpos] ) << 28 ) - ; - out[ 8 + outpos ] = (( in[ 12 + inpos] & 2097151 ) >>> ( 21 - 17 )) - | (( in[ 13 + inpos] ) << 17 ) - ; - out[ 9 + outpos ] = (( in[ 13 + inpos] & 2097151 ) >>> ( 21 - 6 )) - | (( in[ 14 + inpos] & 2097151 ) << 6 ) - | (( in[ 15 + inpos] ) << 27 ) - ; - out[ 10 + outpos ] = (( in[ 15 + inpos] & 2097151 ) >>> ( 21 - 16 )) - | (( in[ 16 + inpos] ) << 16 ) - ; - out[ 11 + outpos ] = (( in[ 16 + inpos] & 2097151 ) >>> ( 21 - 5 )) - | (( in[ 17 + inpos] & 2097151 ) << 5 ) - | (( in[ 18 + inpos] ) << 26 ) - ; - out[ 12 + outpos ] = (( in[ 18 + inpos] & 2097151 ) >>> ( 21 - 15 )) - | (( in[ 19 + inpos] ) << 15 ) - ; - out[ 13 + outpos ] = (( in[ 19 + inpos] & 2097151 ) >>> ( 21 - 4 )) - | (( in[ 20 + inpos] & 2097151 ) << 4 ) - | (( in[ 21 + inpos] ) << 25 ) - ; - out[ 14 + outpos ] = (( in[ 21 + inpos] & 2097151 ) >>> ( 21 - 14 )) - | (( in[ 22 + inpos] ) << 14 ) - ; - out[ 15 + outpos ] = (( in[ 22 + inpos] & 2097151 ) >>> ( 21 - 3 )) - | (( in[ 23 + inpos] & 2097151 ) << 3 ) - | (( in[ 24 + inpos] ) << 24 ) - ; - out[ 16 + outpos ] = (( in[ 24 + inpos] & 2097151 ) >>> ( 21 - 13 )) - | (( in[ 25 + inpos] ) << 13 ) - ; - out[ 17 + outpos ] = (( in[ 25 + inpos] & 2097151 ) >>> ( 21 - 2 )) - | (( in[ 26 + inpos] & 2097151 ) << 2 ) - | (( in[ 27 + inpos] ) << 23 ) - ; - out[ 18 + outpos ] = (( in[ 27 + inpos] & 2097151 ) >>> ( 21 - 12 )) - | (( in[ 28 + inpos] ) << 12 ) - ; - out[ 19 + outpos ] = (( in[ 28 + inpos] & 2097151 ) >>> ( 21 - 1 )) - | (( in[ 29 + inpos] & 2097151 ) << 1 ) - | (( in[ 30 + inpos] ) << 22 ) - ; - out[ 20 + outpos ] = (( in[ 30 + inpos] & 2097151 ) >>> ( 21 - 11 )) - | (( in[ 31 + inpos] ) << 11 ) - ; -} - - - - -public static void fastpack22(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 4194303 ) - | (( in[ 1 + inpos] ) << 22 ) - ; - out[ 1 + outpos ] = (( in[ 1 + inpos] & 4194303 ) >>> ( 22 - 12 )) - | (( in[ 2 + inpos] ) << 12 ) - ; - out[ 2 + outpos ] = (( in[ 2 + inpos] & 4194303 ) >>> ( 22 - 2 )) - | (( in[ 3 + inpos] & 4194303 ) << 2 ) - | (( in[ 4 + inpos] ) << 24 ) - ; - out[ 3 + outpos ] = (( in[ 4 + inpos] & 4194303 ) >>> ( 22 - 14 )) - | (( in[ 5 + inpos] ) << 14 ) - ; - out[ 4 + outpos ] = (( in[ 5 + inpos] & 4194303 ) >>> ( 22 - 4 )) - | (( in[ 6 + inpos] & 4194303 ) << 4 ) - | (( in[ 7 + inpos] ) << 26 ) - ; - out[ 5 + outpos ] = (( in[ 7 + inpos] & 4194303 ) >>> ( 22 - 16 )) - | (( in[ 8 + inpos] ) << 16 ) - ; - out[ 6 + outpos ] = (( in[ 8 + inpos] & 4194303 ) >>> ( 22 - 6 )) - | (( in[ 9 + inpos] & 4194303 ) << 6 ) - | (( in[ 10 + inpos] ) << 28 ) - ; - out[ 7 + outpos ] = (( in[ 10 + inpos] & 4194303 ) >>> ( 22 - 18 )) - | (( in[ 11 + inpos] ) << 18 ) - ; - out[ 8 + outpos ] = (( in[ 11 + inpos] & 4194303 ) >>> ( 22 - 8 )) - | (( in[ 12 + inpos] & 4194303 ) << 8 ) - | (( in[ 13 + inpos] ) << 30 ) - ; - out[ 9 + outpos ] = (( in[ 13 + inpos] & 4194303 ) >>> ( 22 - 20 )) - | (( in[ 14 + inpos] ) << 20 ) - ; - out[ 10 + outpos ] = (( in[ 14 + inpos] & 4194303 ) >>> ( 22 - 10 )) - | (( in[ 15 + inpos] ) << 10 ) - ; - out[ 11 + outpos ] = (in[ 16 + inpos] & 4194303 ) - | (( in[ 17 + inpos] ) << 22 ) - ; - out[ 12 + outpos ] = (( in[ 17 + inpos] & 4194303 ) >>> ( 22 - 12 )) - | (( in[ 18 + inpos] ) << 12 ) - ; - out[ 13 + outpos ] = (( in[ 18 + inpos] & 4194303 ) >>> ( 22 - 2 )) - | (( in[ 19 + inpos] & 4194303 ) << 2 ) - | (( in[ 20 + inpos] ) << 24 ) - ; - out[ 14 + outpos ] = (( in[ 20 + inpos] & 4194303 ) >>> ( 22 - 14 )) - | (( in[ 21 + inpos] ) << 14 ) - ; - out[ 15 + outpos ] = (( in[ 21 + inpos] & 4194303 ) >>> ( 22 - 4 )) - | (( in[ 22 + inpos] & 4194303 ) << 4 ) - | (( in[ 23 + inpos] ) << 26 ) - ; - out[ 16 + outpos ] = (( in[ 23 + inpos] & 4194303 ) >>> ( 22 - 16 )) - | (( in[ 24 + inpos] ) << 16 ) - ; - out[ 17 + outpos ] = (( in[ 24 + inpos] & 4194303 ) >>> ( 22 - 6 )) - | (( in[ 25 + inpos] & 4194303 ) << 6 ) - | (( in[ 26 + inpos] ) << 28 ) - ; - out[ 18 + outpos ] = (( in[ 26 + inpos] & 4194303 ) >>> ( 22 - 18 )) - | (( in[ 27 + inpos] ) << 18 ) - ; - out[ 19 + outpos ] = (( in[ 27 + inpos] & 4194303 ) >>> ( 22 - 8 )) - | (( in[ 28 + inpos] & 4194303 ) << 8 ) - | (( in[ 29 + inpos] ) << 30 ) - ; - out[ 20 + outpos ] = (( in[ 29 + inpos] & 4194303 ) >>> ( 22 - 20 )) - | (( in[ 30 + inpos] ) << 20 ) - ; - out[ 21 + outpos ] = (( in[ 30 + inpos] & 4194303 ) >>> ( 22 - 10 )) - | (( in[ 31 + inpos] ) << 10 ) - ; -} - - - - -public static void fastpack23(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 8388607 ) - | (( in[ 1 + inpos] ) << 23 ) - ; - out[ 1 + outpos ] = (( in[ 1 + inpos] & 8388607 ) >>> ( 23 - 14 )) - | (( in[ 2 + inpos] ) << 14 ) - ; - out[ 2 + outpos ] = (( in[ 2 + inpos] & 8388607 ) >>> ( 23 - 5 )) - | (( in[ 3 + inpos] & 8388607 ) << 5 ) - | (( in[ 4 + inpos] ) << 28 ) - ; - out[ 3 + outpos ] = (( in[ 4 + inpos] & 8388607 ) >>> ( 23 - 19 )) - | (( in[ 5 + inpos] ) << 19 ) - ; - out[ 4 + outpos ] = (( in[ 5 + inpos] & 8388607 ) >>> ( 23 - 10 )) - | (( in[ 6 + inpos] ) << 10 ) - ; - out[ 5 + outpos ] = (( in[ 6 + inpos] & 8388607 ) >>> ( 23 - 1 )) - | (( in[ 7 + inpos] & 8388607 ) << 1 ) - | (( in[ 8 + inpos] ) << 24 ) - ; - out[ 6 + outpos ] = (( in[ 8 + inpos] & 8388607 ) >>> ( 23 - 15 )) - | (( in[ 9 + inpos] ) << 15 ) - ; - out[ 7 + outpos ] = (( in[ 9 + inpos] & 8388607 ) >>> ( 23 - 6 )) - | (( in[ 10 + inpos] & 8388607 ) << 6 ) - | (( in[ 11 + inpos] ) << 29 ) - ; - out[ 8 + outpos ] = (( in[ 11 + inpos] & 8388607 ) >>> ( 23 - 20 )) - | (( in[ 12 + inpos] ) << 20 ) - ; - out[ 9 + outpos ] = (( in[ 12 + inpos] & 8388607 ) >>> ( 23 - 11 )) - | (( in[ 13 + inpos] ) << 11 ) - ; - out[ 10 + outpos ] = (( in[ 13 + inpos] & 8388607 ) >>> ( 23 - 2 )) - | (( in[ 14 + inpos] & 8388607 ) << 2 ) - | (( in[ 15 + inpos] ) << 25 ) - ; - out[ 11 + outpos ] = (( in[ 15 + inpos] & 8388607 ) >>> ( 23 - 16 )) - | (( in[ 16 + inpos] ) << 16 ) - ; - out[ 12 + outpos ] = (( in[ 16 + inpos] & 8388607 ) >>> ( 23 - 7 )) - | (( in[ 17 + inpos] & 8388607 ) << 7 ) - | (( in[ 18 + inpos] ) << 30 ) - ; - out[ 13 + outpos ] = (( in[ 18 + inpos] & 8388607 ) >>> ( 23 - 21 )) - | (( in[ 19 + inpos] ) << 21 ) - ; - out[ 14 + outpos ] = (( in[ 19 + inpos] & 8388607 ) >>> ( 23 - 12 )) - | (( in[ 20 + inpos] ) << 12 ) - ; - out[ 15 + outpos ] = (( in[ 20 + inpos] & 8388607 ) >>> ( 23 - 3 )) - | (( in[ 21 + inpos] & 8388607 ) << 3 ) - | (( in[ 22 + inpos] ) << 26 ) - ; - out[ 16 + outpos ] = (( in[ 22 + inpos] & 8388607 ) >>> ( 23 - 17 )) - | (( in[ 23 + inpos] ) << 17 ) - ; - out[ 17 + outpos ] = (( in[ 23 + inpos] & 8388607 ) >>> ( 23 - 8 )) - | (( in[ 24 + inpos] & 8388607 ) << 8 ) - | (( in[ 25 + inpos] ) << 31 ) - ; - out[ 18 + outpos ] = (( in[ 25 + inpos] & 8388607 ) >>> ( 23 - 22 )) - | (( in[ 26 + inpos] ) << 22 ) - ; - out[ 19 + outpos ] = (( in[ 26 + inpos] & 8388607 ) >>> ( 23 - 13 )) - | (( in[ 27 + inpos] ) << 13 ) - ; - out[ 20 + outpos ] = (( in[ 27 + inpos] & 8388607 ) >>> ( 23 - 4 )) - | (( in[ 28 + inpos] & 8388607 ) << 4 ) - | (( in[ 29 + inpos] ) << 27 ) - ; - out[ 21 + outpos ] = (( in[ 29 + inpos] & 8388607 ) >>> ( 23 - 18 )) - | (( in[ 30 + inpos] ) << 18 ) - ; - out[ 22 + outpos ] = (( in[ 30 + inpos] & 8388607 ) >>> ( 23 - 9 )) - | (( in[ 31 + inpos] ) << 9 ) - ; -} - - - - -public static void fastpack24(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 16777215 ) - | (( in[ 1 + inpos] ) << 24 ) - ; - out[ 1 + outpos ] = (( in[ 1 + inpos] & 16777215 ) >>> ( 24 - 16 )) - | (( in[ 2 + inpos] ) << 16 ) - ; - out[ 2 + outpos ] = (( in[ 2 + inpos] & 16777215 ) >>> ( 24 - 8 )) - | (( in[ 3 + inpos] ) << 8 ) - ; - out[ 3 + outpos ] = (in[ 4 + inpos] & 16777215 ) - | (( in[ 5 + inpos] ) << 24 ) - ; - out[ 4 + outpos ] = (( in[ 5 + inpos] & 16777215 ) >>> ( 24 - 16 )) - | (( in[ 6 + inpos] ) << 16 ) - ; - out[ 5 + outpos ] = (( in[ 6 + inpos] & 16777215 ) >>> ( 24 - 8 )) - | (( in[ 7 + inpos] ) << 8 ) - ; - out[ 6 + outpos ] = (in[ 8 + inpos] & 16777215 ) - | (( in[ 9 + inpos] ) << 24 ) - ; - out[ 7 + outpos ] = (( in[ 9 + inpos] & 16777215 ) >>> ( 24 - 16 )) - | (( in[ 10 + inpos] ) << 16 ) - ; - out[ 8 + outpos ] = (( in[ 10 + inpos] & 16777215 ) >>> ( 24 - 8 )) - | (( in[ 11 + inpos] ) << 8 ) - ; - out[ 9 + outpos ] = (in[ 12 + inpos] & 16777215 ) - | (( in[ 13 + inpos] ) << 24 ) - ; - out[ 10 + outpos ] = (( in[ 13 + inpos] & 16777215 ) >>> ( 24 - 16 )) - | (( in[ 14 + inpos] ) << 16 ) - ; - out[ 11 + outpos ] = (( in[ 14 + inpos] & 16777215 ) >>> ( 24 - 8 )) - | (( in[ 15 + inpos] ) << 8 ) - ; - out[ 12 + outpos ] = (in[ 16 + inpos] & 16777215 ) - | (( in[ 17 + inpos] ) << 24 ) - ; - out[ 13 + outpos ] = (( in[ 17 + inpos] & 16777215 ) >>> ( 24 - 16 )) - | (( in[ 18 + inpos] ) << 16 ) - ; - out[ 14 + outpos ] = (( in[ 18 + inpos] & 16777215 ) >>> ( 24 - 8 )) - | (( in[ 19 + inpos] ) << 8 ) - ; - out[ 15 + outpos ] = (in[ 20 + inpos] & 16777215 ) - | (( in[ 21 + inpos] ) << 24 ) - ; - out[ 16 + outpos ] = (( in[ 21 + inpos] & 16777215 ) >>> ( 24 - 16 )) - | (( in[ 22 + inpos] ) << 16 ) - ; - out[ 17 + outpos ] = (( in[ 22 + inpos] & 16777215 ) >>> ( 24 - 8 )) - | (( in[ 23 + inpos] ) << 8 ) - ; - out[ 18 + outpos ] = (in[ 24 + inpos] & 16777215 ) - | (( in[ 25 + inpos] ) << 24 ) - ; - out[ 19 + outpos ] = (( in[ 25 + inpos] & 16777215 ) >>> ( 24 - 16 )) - | (( in[ 26 + inpos] ) << 16 ) - ; - out[ 20 + outpos ] = (( in[ 26 + inpos] & 16777215 ) >>> ( 24 - 8 )) - | (( in[ 27 + inpos] ) << 8 ) - ; - out[ 21 + outpos ] = (in[ 28 + inpos] & 16777215 ) - | (( in[ 29 + inpos] ) << 24 ) - ; - out[ 22 + outpos ] = (( in[ 29 + inpos] & 16777215 ) >>> ( 24 - 16 )) - | (( in[ 30 + inpos] ) << 16 ) - ; - out[ 23 + outpos ] = (( in[ 30 + inpos] & 16777215 ) >>> ( 24 - 8 )) - | (( in[ 31 + inpos] ) << 8 ) - ; -} - - - - -public static void fastpack25(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 33554431 ) - | (( in[ 1 + inpos] ) << 25 ) - ; - out[ 1 + outpos ] = (( in[ 1 + inpos] & 33554431 ) >>> ( 25 - 18 )) - | (( in[ 2 + inpos] ) << 18 ) - ; - out[ 2 + outpos ] = (( in[ 2 + inpos] & 33554431 ) >>> ( 25 - 11 )) - | (( in[ 3 + inpos] ) << 11 ) - ; - out[ 3 + outpos ] = (( in[ 3 + inpos] & 33554431 ) >>> ( 25 - 4 )) - | (( in[ 4 + inpos] & 33554431 ) << 4 ) - | (( in[ 5 + inpos] ) << 29 ) - ; - out[ 4 + outpos ] = (( in[ 5 + inpos] & 33554431 ) >>> ( 25 - 22 )) - | (( in[ 6 + inpos] ) << 22 ) - ; - out[ 5 + outpos ] = (( in[ 6 + inpos] & 33554431 ) >>> ( 25 - 15 )) - | (( in[ 7 + inpos] ) << 15 ) - ; - out[ 6 + outpos ] = (( in[ 7 + inpos] & 33554431 ) >>> ( 25 - 8 )) - | (( in[ 8 + inpos] ) << 8 ) - ; - out[ 7 + outpos ] = (( in[ 8 + inpos] & 33554431 ) >>> ( 25 - 1 )) - | (( in[ 9 + inpos] & 33554431 ) << 1 ) - | (( in[ 10 + inpos] ) << 26 ) - ; - out[ 8 + outpos ] = (( in[ 10 + inpos] & 33554431 ) >>> ( 25 - 19 )) - | (( in[ 11 + inpos] ) << 19 ) - ; - out[ 9 + outpos ] = (( in[ 11 + inpos] & 33554431 ) >>> ( 25 - 12 )) - | (( in[ 12 + inpos] ) << 12 ) - ; - out[ 10 + outpos ] = (( in[ 12 + inpos] & 33554431 ) >>> ( 25 - 5 )) - | (( in[ 13 + inpos] & 33554431 ) << 5 ) - | (( in[ 14 + inpos] ) << 30 ) - ; - out[ 11 + outpos ] = (( in[ 14 + inpos] & 33554431 ) >>> ( 25 - 23 )) - | (( in[ 15 + inpos] ) << 23 ) - ; - out[ 12 + outpos ] = (( in[ 15 + inpos] & 33554431 ) >>> ( 25 - 16 )) - | (( in[ 16 + inpos] ) << 16 ) - ; - out[ 13 + outpos ] = (( in[ 16 + inpos] & 33554431 ) >>> ( 25 - 9 )) - | (( in[ 17 + inpos] ) << 9 ) - ; - out[ 14 + outpos ] = (( in[ 17 + inpos] & 33554431 ) >>> ( 25 - 2 )) - | (( in[ 18 + inpos] & 33554431 ) << 2 ) - | (( in[ 19 + inpos] ) << 27 ) - ; - out[ 15 + outpos ] = (( in[ 19 + inpos] & 33554431 ) >>> ( 25 - 20 )) - | (( in[ 20 + inpos] ) << 20 ) - ; - out[ 16 + outpos ] = (( in[ 20 + inpos] & 33554431 ) >>> ( 25 - 13 )) - | (( in[ 21 + inpos] ) << 13 ) - ; - out[ 17 + outpos ] = (( in[ 21 + inpos] & 33554431 ) >>> ( 25 - 6 )) - | (( in[ 22 + inpos] & 33554431 ) << 6 ) - | (( in[ 23 + inpos] ) << 31 ) - ; - out[ 18 + outpos ] = (( in[ 23 + inpos] & 33554431 ) >>> ( 25 - 24 )) - | (( in[ 24 + inpos] ) << 24 ) - ; - out[ 19 + outpos ] = (( in[ 24 + inpos] & 33554431 ) >>> ( 25 - 17 )) - | (( in[ 25 + inpos] ) << 17 ) - ; - out[ 20 + outpos ] = (( in[ 25 + inpos] & 33554431 ) >>> ( 25 - 10 )) - | (( in[ 26 + inpos] ) << 10 ) - ; - out[ 21 + outpos ] = (( in[ 26 + inpos] & 33554431 ) >>> ( 25 - 3 )) - | (( in[ 27 + inpos] & 33554431 ) << 3 ) - | (( in[ 28 + inpos] ) << 28 ) - ; - out[ 22 + outpos ] = (( in[ 28 + inpos] & 33554431 ) >>> ( 25 - 21 )) - | (( in[ 29 + inpos] ) << 21 ) - ; - out[ 23 + outpos ] = (( in[ 29 + inpos] & 33554431 ) >>> ( 25 - 14 )) - | (( in[ 30 + inpos] ) << 14 ) - ; - out[ 24 + outpos ] = (( in[ 30 + inpos] & 33554431 ) >>> ( 25 - 7 )) - | (( in[ 31 + inpos] ) << 7 ) - ; -} - - - - -public static void fastpack26(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 67108863 ) - | (( in[ 1 + inpos] ) << 26 ) - ; - out[ 1 + outpos ] = (( in[ 1 + inpos] & 67108863 ) >>> ( 26 - 20 )) - | (( in[ 2 + inpos] ) << 20 ) - ; - out[ 2 + outpos ] = (( in[ 2 + inpos] & 67108863 ) >>> ( 26 - 14 )) - | (( in[ 3 + inpos] ) << 14 ) - ; - out[ 3 + outpos ] = (( in[ 3 + inpos] & 67108863 ) >>> ( 26 - 8 )) - | (( in[ 4 + inpos] ) << 8 ) - ; - out[ 4 + outpos ] = (( in[ 4 + inpos] & 67108863 ) >>> ( 26 - 2 )) - | (( in[ 5 + inpos] & 67108863 ) << 2 ) - | (( in[ 6 + inpos] ) << 28 ) - ; - out[ 5 + outpos ] = (( in[ 6 + inpos] & 67108863 ) >>> ( 26 - 22 )) - | (( in[ 7 + inpos] ) << 22 ) - ; - out[ 6 + outpos ] = (( in[ 7 + inpos] & 67108863 ) >>> ( 26 - 16 )) - | (( in[ 8 + inpos] ) << 16 ) - ; - out[ 7 + outpos ] = (( in[ 8 + inpos] & 67108863 ) >>> ( 26 - 10 )) - | (( in[ 9 + inpos] ) << 10 ) - ; - out[ 8 + outpos ] = (( in[ 9 + inpos] & 67108863 ) >>> ( 26 - 4 )) - | (( in[ 10 + inpos] & 67108863 ) << 4 ) - | (( in[ 11 + inpos] ) << 30 ) - ; - out[ 9 + outpos ] = (( in[ 11 + inpos] & 67108863 ) >>> ( 26 - 24 )) - | (( in[ 12 + inpos] ) << 24 ) - ; - out[ 10 + outpos ] = (( in[ 12 + inpos] & 67108863 ) >>> ( 26 - 18 )) - | (( in[ 13 + inpos] ) << 18 ) - ; - out[ 11 + outpos ] = (( in[ 13 + inpos] & 67108863 ) >>> ( 26 - 12 )) - | (( in[ 14 + inpos] ) << 12 ) - ; - out[ 12 + outpos ] = (( in[ 14 + inpos] & 67108863 ) >>> ( 26 - 6 )) - | (( in[ 15 + inpos] ) << 6 ) - ; - out[ 13 + outpos ] = (in[ 16 + inpos] & 67108863 ) - | (( in[ 17 + inpos] ) << 26 ) - ; - out[ 14 + outpos ] = (( in[ 17 + inpos] & 67108863 ) >>> ( 26 - 20 )) - | (( in[ 18 + inpos] ) << 20 ) - ; - out[ 15 + outpos ] = (( in[ 18 + inpos] & 67108863 ) >>> ( 26 - 14 )) - | (( in[ 19 + inpos] ) << 14 ) - ; - out[ 16 + outpos ] = (( in[ 19 + inpos] & 67108863 ) >>> ( 26 - 8 )) - | (( in[ 20 + inpos] ) << 8 ) - ; - out[ 17 + outpos ] = (( in[ 20 + inpos] & 67108863 ) >>> ( 26 - 2 )) - | (( in[ 21 + inpos] & 67108863 ) << 2 ) - | (( in[ 22 + inpos] ) << 28 ) - ; - out[ 18 + outpos ] = (( in[ 22 + inpos] & 67108863 ) >>> ( 26 - 22 )) - | (( in[ 23 + inpos] ) << 22 ) - ; - out[ 19 + outpos ] = (( in[ 23 + inpos] & 67108863 ) >>> ( 26 - 16 )) - | (( in[ 24 + inpos] ) << 16 ) - ; - out[ 20 + outpos ] = (( in[ 24 + inpos] & 67108863 ) >>> ( 26 - 10 )) - | (( in[ 25 + inpos] ) << 10 ) - ; - out[ 21 + outpos ] = (( in[ 25 + inpos] & 67108863 ) >>> ( 26 - 4 )) - | (( in[ 26 + inpos] & 67108863 ) << 4 ) - | (( in[ 27 + inpos] ) << 30 ) - ; - out[ 22 + outpos ] = (( in[ 27 + inpos] & 67108863 ) >>> ( 26 - 24 )) - | (( in[ 28 + inpos] ) << 24 ) - ; - out[ 23 + outpos ] = (( in[ 28 + inpos] & 67108863 ) >>> ( 26 - 18 )) - | (( in[ 29 + inpos] ) << 18 ) - ; - out[ 24 + outpos ] = (( in[ 29 + inpos] & 67108863 ) >>> ( 26 - 12 )) - | (( in[ 30 + inpos] ) << 12 ) - ; - out[ 25 + outpos ] = (( in[ 30 + inpos] & 67108863 ) >>> ( 26 - 6 )) - | (( in[ 31 + inpos] ) << 6 ) - ; -} - - - - -public static void fastpack27(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 134217727 ) - | (( in[ 1 + inpos] ) << 27 ) - ; - out[ 1 + outpos ] = (( in[ 1 + inpos] & 134217727 ) >>> ( 27 - 22 )) - | (( in[ 2 + inpos] ) << 22 ) - ; - out[ 2 + outpos ] = (( in[ 2 + inpos] & 134217727 ) >>> ( 27 - 17 )) - | (( in[ 3 + inpos] ) << 17 ) - ; - out[ 3 + outpos ] = (( in[ 3 + inpos] & 134217727 ) >>> ( 27 - 12 )) - | (( in[ 4 + inpos] ) << 12 ) - ; - out[ 4 + outpos ] = (( in[ 4 + inpos] & 134217727 ) >>> ( 27 - 7 )) - | (( in[ 5 + inpos] ) << 7 ) - ; - out[ 5 + outpos ] = (( in[ 5 + inpos] & 134217727 ) >>> ( 27 - 2 )) - | (( in[ 6 + inpos] & 134217727 ) << 2 ) - | (( in[ 7 + inpos] ) << 29 ) - ; - out[ 6 + outpos ] = (( in[ 7 + inpos] & 134217727 ) >>> ( 27 - 24 )) - | (( in[ 8 + inpos] ) << 24 ) - ; - out[ 7 + outpos ] = (( in[ 8 + inpos] & 134217727 ) >>> ( 27 - 19 )) - | (( in[ 9 + inpos] ) << 19 ) - ; - out[ 8 + outpos ] = (( in[ 9 + inpos] & 134217727 ) >>> ( 27 - 14 )) - | (( in[ 10 + inpos] ) << 14 ) - ; - out[ 9 + outpos ] = (( in[ 10 + inpos] & 134217727 ) >>> ( 27 - 9 )) - | (( in[ 11 + inpos] ) << 9 ) - ; - out[ 10 + outpos ] = (( in[ 11 + inpos] & 134217727 ) >>> ( 27 - 4 )) - | (( in[ 12 + inpos] & 134217727 ) << 4 ) - | (( in[ 13 + inpos] ) << 31 ) - ; - out[ 11 + outpos ] = (( in[ 13 + inpos] & 134217727 ) >>> ( 27 - 26 )) - | (( in[ 14 + inpos] ) << 26 ) - ; - out[ 12 + outpos ] = (( in[ 14 + inpos] & 134217727 ) >>> ( 27 - 21 )) - | (( in[ 15 + inpos] ) << 21 ) - ; - out[ 13 + outpos ] = (( in[ 15 + inpos] & 134217727 ) >>> ( 27 - 16 )) - | (( in[ 16 + inpos] ) << 16 ) - ; - out[ 14 + outpos ] = (( in[ 16 + inpos] & 134217727 ) >>> ( 27 - 11 )) - | (( in[ 17 + inpos] ) << 11 ) - ; - out[ 15 + outpos ] = (( in[ 17 + inpos] & 134217727 ) >>> ( 27 - 6 )) - | (( in[ 18 + inpos] ) << 6 ) - ; - out[ 16 + outpos ] = (( in[ 18 + inpos] & 134217727 ) >>> ( 27 - 1 )) - | (( in[ 19 + inpos] & 134217727 ) << 1 ) - | (( in[ 20 + inpos] ) << 28 ) - ; - out[ 17 + outpos ] = (( in[ 20 + inpos] & 134217727 ) >>> ( 27 - 23 )) - | (( in[ 21 + inpos] ) << 23 ) - ; - out[ 18 + outpos ] = (( in[ 21 + inpos] & 134217727 ) >>> ( 27 - 18 )) - | (( in[ 22 + inpos] ) << 18 ) - ; - out[ 19 + outpos ] = (( in[ 22 + inpos] & 134217727 ) >>> ( 27 - 13 )) - | (( in[ 23 + inpos] ) << 13 ) - ; - out[ 20 + outpos ] = (( in[ 23 + inpos] & 134217727 ) >>> ( 27 - 8 )) - | (( in[ 24 + inpos] ) << 8 ) - ; - out[ 21 + outpos ] = (( in[ 24 + inpos] & 134217727 ) >>> ( 27 - 3 )) - | (( in[ 25 + inpos] & 134217727 ) << 3 ) - | (( in[ 26 + inpos] ) << 30 ) - ; - out[ 22 + outpos ] = (( in[ 26 + inpos] & 134217727 ) >>> ( 27 - 25 )) - | (( in[ 27 + inpos] ) << 25 ) - ; - out[ 23 + outpos ] = (( in[ 27 + inpos] & 134217727 ) >>> ( 27 - 20 )) - | (( in[ 28 + inpos] ) << 20 ) - ; - out[ 24 + outpos ] = (( in[ 28 + inpos] & 134217727 ) >>> ( 27 - 15 )) - | (( in[ 29 + inpos] ) << 15 ) - ; - out[ 25 + outpos ] = (( in[ 29 + inpos] & 134217727 ) >>> ( 27 - 10 )) - | (( in[ 30 + inpos] ) << 10 ) - ; - out[ 26 + outpos ] = (( in[ 30 + inpos] & 134217727 ) >>> ( 27 - 5 )) - | (( in[ 31 + inpos] ) << 5 ) - ; -} - - - - -public static void fastpack28(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 268435455 ) - | (( in[ 1 + inpos] ) << 28 ) - ; - out[ 1 + outpos ] = (( in[ 1 + inpos] & 268435455 ) >>> ( 28 - 24 )) - | (( in[ 2 + inpos] ) << 24 ) - ; - out[ 2 + outpos ] = (( in[ 2 + inpos] & 268435455 ) >>> ( 28 - 20 )) - | (( in[ 3 + inpos] ) << 20 ) - ; - out[ 3 + outpos ] = (( in[ 3 + inpos] & 268435455 ) >>> ( 28 - 16 )) - | (( in[ 4 + inpos] ) << 16 ) - ; - out[ 4 + outpos ] = (( in[ 4 + inpos] & 268435455 ) >>> ( 28 - 12 )) - | (( in[ 5 + inpos] ) << 12 ) - ; - out[ 5 + outpos ] = (( in[ 5 + inpos] & 268435455 ) >>> ( 28 - 8 )) - | (( in[ 6 + inpos] ) << 8 ) - ; - out[ 6 + outpos ] = (( in[ 6 + inpos] & 268435455 ) >>> ( 28 - 4 )) - | (( in[ 7 + inpos] ) << 4 ) - ; - out[ 7 + outpos ] = (in[ 8 + inpos] & 268435455 ) - | (( in[ 9 + inpos] ) << 28 ) - ; - out[ 8 + outpos ] = (( in[ 9 + inpos] & 268435455 ) >>> ( 28 - 24 )) - | (( in[ 10 + inpos] ) << 24 ) - ; - out[ 9 + outpos ] = (( in[ 10 + inpos] & 268435455 ) >>> ( 28 - 20 )) - | (( in[ 11 + inpos] ) << 20 ) - ; - out[ 10 + outpos ] = (( in[ 11 + inpos] & 268435455 ) >>> ( 28 - 16 )) - | (( in[ 12 + inpos] ) << 16 ) - ; - out[ 11 + outpos ] = (( in[ 12 + inpos] & 268435455 ) >>> ( 28 - 12 )) - | (( in[ 13 + inpos] ) << 12 ) - ; - out[ 12 + outpos ] = (( in[ 13 + inpos] & 268435455 ) >>> ( 28 - 8 )) - | (( in[ 14 + inpos] ) << 8 ) - ; - out[ 13 + outpos ] = (( in[ 14 + inpos] & 268435455 ) >>> ( 28 - 4 )) - | (( in[ 15 + inpos] ) << 4 ) - ; - out[ 14 + outpos ] = (in[ 16 + inpos] & 268435455 ) - | (( in[ 17 + inpos] ) << 28 ) - ; - out[ 15 + outpos ] = (( in[ 17 + inpos] & 268435455 ) >>> ( 28 - 24 )) - | (( in[ 18 + inpos] ) << 24 ) - ; - out[ 16 + outpos ] = (( in[ 18 + inpos] & 268435455 ) >>> ( 28 - 20 )) - | (( in[ 19 + inpos] ) << 20 ) - ; - out[ 17 + outpos ] = (( in[ 19 + inpos] & 268435455 ) >>> ( 28 - 16 )) - | (( in[ 20 + inpos] ) << 16 ) - ; - out[ 18 + outpos ] = (( in[ 20 + inpos] & 268435455 ) >>> ( 28 - 12 )) - | (( in[ 21 + inpos] ) << 12 ) - ; - out[ 19 + outpos ] = (( in[ 21 + inpos] & 268435455 ) >>> ( 28 - 8 )) - | (( in[ 22 + inpos] ) << 8 ) - ; - out[ 20 + outpos ] = (( in[ 22 + inpos] & 268435455 ) >>> ( 28 - 4 )) - | (( in[ 23 + inpos] ) << 4 ) - ; - out[ 21 + outpos ] = (in[ 24 + inpos] & 268435455 ) - | (( in[ 25 + inpos] ) << 28 ) - ; - out[ 22 + outpos ] = (( in[ 25 + inpos] & 268435455 ) >>> ( 28 - 24 )) - | (( in[ 26 + inpos] ) << 24 ) - ; - out[ 23 + outpos ] = (( in[ 26 + inpos] & 268435455 ) >>> ( 28 - 20 )) - | (( in[ 27 + inpos] ) << 20 ) - ; - out[ 24 + outpos ] = (( in[ 27 + inpos] & 268435455 ) >>> ( 28 - 16 )) - | (( in[ 28 + inpos] ) << 16 ) - ; - out[ 25 + outpos ] = (( in[ 28 + inpos] & 268435455 ) >>> ( 28 - 12 )) - | (( in[ 29 + inpos] ) << 12 ) - ; - out[ 26 + outpos ] = (( in[ 29 + inpos] & 268435455 ) >>> ( 28 - 8 )) - | (( in[ 30 + inpos] ) << 8 ) - ; - out[ 27 + outpos ] = (( in[ 30 + inpos] & 268435455 ) >>> ( 28 - 4 )) - | (( in[ 31 + inpos] ) << 4 ) - ; -} - - - - -public static void fastpack29(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 536870911 ) - | (( in[ 1 + inpos] ) << 29 ) - ; - out[ 1 + outpos ] = (( in[ 1 + inpos] & 536870911 ) >>> ( 29 - 26 )) - | (( in[ 2 + inpos] ) << 26 ) - ; - out[ 2 + outpos ] = (( in[ 2 + inpos] & 536870911 ) >>> ( 29 - 23 )) - | (( in[ 3 + inpos] ) << 23 ) - ; - out[ 3 + outpos ] = (( in[ 3 + inpos] & 536870911 ) >>> ( 29 - 20 )) - | (( in[ 4 + inpos] ) << 20 ) - ; - out[ 4 + outpos ] = (( in[ 4 + inpos] & 536870911 ) >>> ( 29 - 17 )) - | (( in[ 5 + inpos] ) << 17 ) - ; - out[ 5 + outpos ] = (( in[ 5 + inpos] & 536870911 ) >>> ( 29 - 14 )) - | (( in[ 6 + inpos] ) << 14 ) - ; - out[ 6 + outpos ] = (( in[ 6 + inpos] & 536870911 ) >>> ( 29 - 11 )) - | (( in[ 7 + inpos] ) << 11 ) - ; - out[ 7 + outpos ] = (( in[ 7 + inpos] & 536870911 ) >>> ( 29 - 8 )) - | (( in[ 8 + inpos] ) << 8 ) - ; - out[ 8 + outpos ] = (( in[ 8 + inpos] & 536870911 ) >>> ( 29 - 5 )) - | (( in[ 9 + inpos] ) << 5 ) - ; - out[ 9 + outpos ] = (( in[ 9 + inpos] & 536870911 ) >>> ( 29 - 2 )) - | (( in[ 10 + inpos] & 536870911 ) << 2 ) - | (( in[ 11 + inpos] ) << 31 ) - ; - out[ 10 + outpos ] = (( in[ 11 + inpos] & 536870911 ) >>> ( 29 - 28 )) - | (( in[ 12 + inpos] ) << 28 ) - ; - out[ 11 + outpos ] = (( in[ 12 + inpos] & 536870911 ) >>> ( 29 - 25 )) - | (( in[ 13 + inpos] ) << 25 ) - ; - out[ 12 + outpos ] = (( in[ 13 + inpos] & 536870911 ) >>> ( 29 - 22 )) - | (( in[ 14 + inpos] ) << 22 ) - ; - out[ 13 + outpos ] = (( in[ 14 + inpos] & 536870911 ) >>> ( 29 - 19 )) - | (( in[ 15 + inpos] ) << 19 ) - ; - out[ 14 + outpos ] = (( in[ 15 + inpos] & 536870911 ) >>> ( 29 - 16 )) - | (( in[ 16 + inpos] ) << 16 ) - ; - out[ 15 + outpos ] = (( in[ 16 + inpos] & 536870911 ) >>> ( 29 - 13 )) - | (( in[ 17 + inpos] ) << 13 ) - ; - out[ 16 + outpos ] = (( in[ 17 + inpos] & 536870911 ) >>> ( 29 - 10 )) - | (( in[ 18 + inpos] ) << 10 ) - ; - out[ 17 + outpos ] = (( in[ 18 + inpos] & 536870911 ) >>> ( 29 - 7 )) - | (( in[ 19 + inpos] ) << 7 ) - ; - out[ 18 + outpos ] = (( in[ 19 + inpos] & 536870911 ) >>> ( 29 - 4 )) - | (( in[ 20 + inpos] ) << 4 ) - ; - out[ 19 + outpos ] = (( in[ 20 + inpos] & 536870911 ) >>> ( 29 - 1 )) - | (( in[ 21 + inpos] & 536870911 ) << 1 ) - | (( in[ 22 + inpos] ) << 30 ) - ; - out[ 20 + outpos ] = (( in[ 22 + inpos] & 536870911 ) >>> ( 29 - 27 )) - | (( in[ 23 + inpos] ) << 27 ) - ; - out[ 21 + outpos ] = (( in[ 23 + inpos] & 536870911 ) >>> ( 29 - 24 )) - | (( in[ 24 + inpos] ) << 24 ) - ; - out[ 22 + outpos ] = (( in[ 24 + inpos] & 536870911 ) >>> ( 29 - 21 )) - | (( in[ 25 + inpos] ) << 21 ) - ; - out[ 23 + outpos ] = (( in[ 25 + inpos] & 536870911 ) >>> ( 29 - 18 )) - | (( in[ 26 + inpos] ) << 18 ) - ; - out[ 24 + outpos ] = (( in[ 26 + inpos] & 536870911 ) >>> ( 29 - 15 )) - | (( in[ 27 + inpos] ) << 15 ) - ; - out[ 25 + outpos ] = (( in[ 27 + inpos] & 536870911 ) >>> ( 29 - 12 )) - | (( in[ 28 + inpos] ) << 12 ) - ; - out[ 26 + outpos ] = (( in[ 28 + inpos] & 536870911 ) >>> ( 29 - 9 )) - | (( in[ 29 + inpos] ) << 9 ) - ; - out[ 27 + outpos ] = (( in[ 29 + inpos] & 536870911 ) >>> ( 29 - 6 )) - | (( in[ 30 + inpos] ) << 6 ) - ; - out[ 28 + outpos ] = (( in[ 30 + inpos] & 536870911 ) >>> ( 29 - 3 )) - | (( in[ 31 + inpos] ) << 3 ) - ; -} - - - - -public static void fastpack30(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 1073741823 ) - | (( in[ 1 + inpos] ) << 30 ) - ; - out[ 1 + outpos ] = (( in[ 1 + inpos] & 1073741823 ) >>> ( 30 - 28 )) - | (( in[ 2 + inpos] ) << 28 ) - ; - out[ 2 + outpos ] = (( in[ 2 + inpos] & 1073741823 ) >>> ( 30 - 26 )) - | (( in[ 3 + inpos] ) << 26 ) - ; - out[ 3 + outpos ] = (( in[ 3 + inpos] & 1073741823 ) >>> ( 30 - 24 )) - | (( in[ 4 + inpos] ) << 24 ) - ; - out[ 4 + outpos ] = (( in[ 4 + inpos] & 1073741823 ) >>> ( 30 - 22 )) - | (( in[ 5 + inpos] ) << 22 ) - ; - out[ 5 + outpos ] = (( in[ 5 + inpos] & 1073741823 ) >>> ( 30 - 20 )) - | (( in[ 6 + inpos] ) << 20 ) - ; - out[ 6 + outpos ] = (( in[ 6 + inpos] & 1073741823 ) >>> ( 30 - 18 )) - | (( in[ 7 + inpos] ) << 18 ) - ; - out[ 7 + outpos ] = (( in[ 7 + inpos] & 1073741823 ) >>> ( 30 - 16 )) - | (( in[ 8 + inpos] ) << 16 ) - ; - out[ 8 + outpos ] = (( in[ 8 + inpos] & 1073741823 ) >>> ( 30 - 14 )) - | (( in[ 9 + inpos] ) << 14 ) - ; - out[ 9 + outpos ] = (( in[ 9 + inpos] & 1073741823 ) >>> ( 30 - 12 )) - | (( in[ 10 + inpos] ) << 12 ) - ; - out[ 10 + outpos ] = (( in[ 10 + inpos] & 1073741823 ) >>> ( 30 - 10 )) - | (( in[ 11 + inpos] ) << 10 ) - ; - out[ 11 + outpos ] = (( in[ 11 + inpos] & 1073741823 ) >>> ( 30 - 8 )) - | (( in[ 12 + inpos] ) << 8 ) - ; - out[ 12 + outpos ] = (( in[ 12 + inpos] & 1073741823 ) >>> ( 30 - 6 )) - | (( in[ 13 + inpos] ) << 6 ) - ; - out[ 13 + outpos ] = (( in[ 13 + inpos] & 1073741823 ) >>> ( 30 - 4 )) - | (( in[ 14 + inpos] ) << 4 ) - ; - out[ 14 + outpos ] = (( in[ 14 + inpos] & 1073741823 ) >>> ( 30 - 2 )) - | (( in[ 15 + inpos] ) << 2 ) - ; - out[ 15 + outpos ] = (in[ 16 + inpos] & 1073741823 ) - | (( in[ 17 + inpos] ) << 30 ) - ; - out[ 16 + outpos ] = (( in[ 17 + inpos] & 1073741823 ) >>> ( 30 - 28 )) - | (( in[ 18 + inpos] ) << 28 ) - ; - out[ 17 + outpos ] = (( in[ 18 + inpos] & 1073741823 ) >>> ( 30 - 26 )) - | (( in[ 19 + inpos] ) << 26 ) - ; - out[ 18 + outpos ] = (( in[ 19 + inpos] & 1073741823 ) >>> ( 30 - 24 )) - | (( in[ 20 + inpos] ) << 24 ) - ; - out[ 19 + outpos ] = (( in[ 20 + inpos] & 1073741823 ) >>> ( 30 - 22 )) - | (( in[ 21 + inpos] ) << 22 ) - ; - out[ 20 + outpos ] = (( in[ 21 + inpos] & 1073741823 ) >>> ( 30 - 20 )) - | (( in[ 22 + inpos] ) << 20 ) - ; - out[ 21 + outpos ] = (( in[ 22 + inpos] & 1073741823 ) >>> ( 30 - 18 )) - | (( in[ 23 + inpos] ) << 18 ) - ; - out[ 22 + outpos ] = (( in[ 23 + inpos] & 1073741823 ) >>> ( 30 - 16 )) - | (( in[ 24 + inpos] ) << 16 ) - ; - out[ 23 + outpos ] = (( in[ 24 + inpos] & 1073741823 ) >>> ( 30 - 14 )) - | (( in[ 25 + inpos] ) << 14 ) - ; - out[ 24 + outpos ] = (( in[ 25 + inpos] & 1073741823 ) >>> ( 30 - 12 )) - | (( in[ 26 + inpos] ) << 12 ) - ; - out[ 25 + outpos ] = (( in[ 26 + inpos] & 1073741823 ) >>> ( 30 - 10 )) - | (( in[ 27 + inpos] ) << 10 ) - ; - out[ 26 + outpos ] = (( in[ 27 + inpos] & 1073741823 ) >>> ( 30 - 8 )) - | (( in[ 28 + inpos] ) << 8 ) - ; - out[ 27 + outpos ] = (( in[ 28 + inpos] & 1073741823 ) >>> ( 30 - 6 )) - | (( in[ 29 + inpos] ) << 6 ) - ; - out[ 28 + outpos ] = (( in[ 29 + inpos] & 1073741823 ) >>> ( 30 - 4 )) - | (( in[ 30 + inpos] ) << 4 ) - ; - out[ 29 + outpos ] = (( in[ 30 + inpos] & 1073741823 ) >>> ( 30 - 2 )) - | (( in[ 31 + inpos] ) << 2 ) - ; -} - - - - -public static void fastpack31(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos ] = (in[ 0 + inpos] & 2147483647 ) - | (( in[ 1 + inpos] ) << 31 ) - ; - out[ 1 + outpos ] = (( in[ 1 + inpos] & 2147483647 ) >>> ( 31 - 30 )) - | (( in[ 2 + inpos] ) << 30 ) - ; - out[ 2 + outpos ] = (( in[ 2 + inpos] & 2147483647 ) >>> ( 31 - 29 )) - | (( in[ 3 + inpos] ) << 29 ) - ; - out[ 3 + outpos ] = (( in[ 3 + inpos] & 2147483647 ) >>> ( 31 - 28 )) - | (( in[ 4 + inpos] ) << 28 ) - ; - out[ 4 + outpos ] = (( in[ 4 + inpos] & 2147483647 ) >>> ( 31 - 27 )) - | (( in[ 5 + inpos] ) << 27 ) - ; - out[ 5 + outpos ] = (( in[ 5 + inpos] & 2147483647 ) >>> ( 31 - 26 )) - | (( in[ 6 + inpos] ) << 26 ) - ; - out[ 6 + outpos ] = (( in[ 6 + inpos] & 2147483647 ) >>> ( 31 - 25 )) - | (( in[ 7 + inpos] ) << 25 ) - ; - out[ 7 + outpos ] = (( in[ 7 + inpos] & 2147483647 ) >>> ( 31 - 24 )) - | (( in[ 8 + inpos] ) << 24 ) - ; - out[ 8 + outpos ] = (( in[ 8 + inpos] & 2147483647 ) >>> ( 31 - 23 )) - | (( in[ 9 + inpos] ) << 23 ) - ; - out[ 9 + outpos ] = (( in[ 9 + inpos] & 2147483647 ) >>> ( 31 - 22 )) - | (( in[ 10 + inpos] ) << 22 ) - ; - out[ 10 + outpos ] = (( in[ 10 + inpos] & 2147483647 ) >>> ( 31 - 21 )) - | (( in[ 11 + inpos] ) << 21 ) - ; - out[ 11 + outpos ] = (( in[ 11 + inpos] & 2147483647 ) >>> ( 31 - 20 )) - | (( in[ 12 + inpos] ) << 20 ) - ; - out[ 12 + outpos ] = (( in[ 12 + inpos] & 2147483647 ) >>> ( 31 - 19 )) - | (( in[ 13 + inpos] ) << 19 ) - ; - out[ 13 + outpos ] = (( in[ 13 + inpos] & 2147483647 ) >>> ( 31 - 18 )) - | (( in[ 14 + inpos] ) << 18 ) - ; - out[ 14 + outpos ] = (( in[ 14 + inpos] & 2147483647 ) >>> ( 31 - 17 )) - | (( in[ 15 + inpos] ) << 17 ) - ; - out[ 15 + outpos ] = (( in[ 15 + inpos] & 2147483647 ) >>> ( 31 - 16 )) - | (( in[ 16 + inpos] ) << 16 ) - ; - out[ 16 + outpos ] = (( in[ 16 + inpos] & 2147483647 ) >>> ( 31 - 15 )) - | (( in[ 17 + inpos] ) << 15 ) - ; - out[ 17 + outpos ] = (( in[ 17 + inpos] & 2147483647 ) >>> ( 31 - 14 )) - | (( in[ 18 + inpos] ) << 14 ) - ; - out[ 18 + outpos ] = (( in[ 18 + inpos] & 2147483647 ) >>> ( 31 - 13 )) - | (( in[ 19 + inpos] ) << 13 ) - ; - out[ 19 + outpos ] = (( in[ 19 + inpos] & 2147483647 ) >>> ( 31 - 12 )) - | (( in[ 20 + inpos] ) << 12 ) - ; - out[ 20 + outpos ] = (( in[ 20 + inpos] & 2147483647 ) >>> ( 31 - 11 )) - | (( in[ 21 + inpos] ) << 11 ) - ; - out[ 21 + outpos ] = (( in[ 21 + inpos] & 2147483647 ) >>> ( 31 - 10 )) - | (( in[ 22 + inpos] ) << 10 ) - ; - out[ 22 + outpos ] = (( in[ 22 + inpos] & 2147483647 ) >>> ( 31 - 9 )) - | (( in[ 23 + inpos] ) << 9 ) - ; - out[ 23 + outpos ] = (( in[ 23 + inpos] & 2147483647 ) >>> ( 31 - 8 )) - | (( in[ 24 + inpos] ) << 8 ) - ; - out[ 24 + outpos ] = (( in[ 24 + inpos] & 2147483647 ) >>> ( 31 - 7 )) - | (( in[ 25 + inpos] ) << 7 ) - ; - out[ 25 + outpos ] = (( in[ 25 + inpos] & 2147483647 ) >>> ( 31 - 6 )) - | (( in[ 26 + inpos] ) << 6 ) - ; - out[ 26 + outpos ] = (( in[ 26 + inpos] & 2147483647 ) >>> ( 31 - 5 )) - | (( in[ 27 + inpos] ) << 5 ) - ; - out[ 27 + outpos ] = (( in[ 27 + inpos] & 2147483647 ) >>> ( 31 - 4 )) - | (( in[ 28 + inpos] ) << 4 ) - ; - out[ 28 + outpos ] = (( in[ 28 + inpos] & 2147483647 ) >>> ( 31 - 3 )) - | (( in[ 29 + inpos] ) << 3 ) - ; - out[ 29 + outpos ] = (( in[ 29 + inpos] & 2147483647 ) >>> ( 31 - 2 )) - | (( in[ 30 + inpos] ) << 2 ) - ; - out[ 30 + outpos ] = (( in[ 30 + inpos] & 2147483647 ) >>> ( 31 - 1 )) - | (( in[ 31 + inpos] ) << 1 ) - ; -} - - - - -public static void fastunpack1(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 1 ) - ; - out[ 1 + outpos] = (( in[ 0 + inpos] >>> 1 ) & 1 ) - ; - out[ 2 + outpos] = (( in[ 0 + inpos] >>> 2 ) & 1 ) - ; - out[ 3 + outpos] = (( in[ 0 + inpos] >>> 3 ) & 1 ) - ; - out[ 4 + outpos] = (( in[ 0 + inpos] >>> 4 ) & 1 ) - ; - out[ 5 + outpos] = (( in[ 0 + inpos] >>> 5 ) & 1 ) - ; - out[ 6 + outpos] = (( in[ 0 + inpos] >>> 6 ) & 1 ) - ; - out[ 7 + outpos] = (( in[ 0 + inpos] >>> 7 ) & 1 ) - ; - out[ 8 + outpos] = (( in[ 0 + inpos] >>> 8 ) & 1 ) - ; - out[ 9 + outpos] = (( in[ 0 + inpos] >>> 9 ) & 1 ) - ; - out[ 10 + outpos] = (( in[ 0 + inpos] >>> 10 ) & 1 ) - ; - out[ 11 + outpos] = (( in[ 0 + inpos] >>> 11 ) & 1 ) - ; - out[ 12 + outpos] = (( in[ 0 + inpos] >>> 12 ) & 1 ) - ; - out[ 13 + outpos] = (( in[ 0 + inpos] >>> 13 ) & 1 ) - ; - out[ 14 + outpos] = (( in[ 0 + inpos] >>> 14 ) & 1 ) - ; - out[ 15 + outpos] = (( in[ 0 + inpos] >>> 15 ) & 1 ) - ; - out[ 16 + outpos] = (( in[ 0 + inpos] >>> 16 ) & 1 ) - ; - out[ 17 + outpos] = (( in[ 0 + inpos] >>> 17 ) & 1 ) - ; - out[ 18 + outpos] = (( in[ 0 + inpos] >>> 18 ) & 1 ) - ; - out[ 19 + outpos] = (( in[ 0 + inpos] >>> 19 ) & 1 ) - ; - out[ 20 + outpos] = (( in[ 0 + inpos] >>> 20 ) & 1 ) - ; - out[ 21 + outpos] = (( in[ 0 + inpos] >>> 21 ) & 1 ) - ; - out[ 22 + outpos] = (( in[ 0 + inpos] >>> 22 ) & 1 ) - ; - out[ 23 + outpos] = (( in[ 0 + inpos] >>> 23 ) & 1 ) - ; - out[ 24 + outpos] = (( in[ 0 + inpos] >>> 24 ) & 1 ) - ; - out[ 25 + outpos] = (( in[ 0 + inpos] >>> 25 ) & 1 ) - ; - out[ 26 + outpos] = (( in[ 0 + inpos] >>> 26 ) & 1 ) - ; - out[ 27 + outpos] = (( in[ 0 + inpos] >>> 27 ) & 1 ) - ; - out[ 28 + outpos] = (( in[ 0 + inpos] >>> 28 ) & 1 ) - ; - out[ 29 + outpos] = (( in[ 0 + inpos] >>> 29 ) & 1 ) - ; - out[ 30 + outpos] = (( in[ 0 + inpos] >>> 30 ) & 1 ) - ; - out[ 31 + outpos] = ( in[ 0 + inpos] >>> 31 ) - ; -} - - - - -public static void fastunpack2(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 3 ) - ; - out[ 1 + outpos] = (( in[ 0 + inpos] >>> 2 ) & 3 ) - ; - out[ 2 + outpos] = (( in[ 0 + inpos] >>> 4 ) & 3 ) - ; - out[ 3 + outpos] = (( in[ 0 + inpos] >>> 6 ) & 3 ) - ; - out[ 4 + outpos] = (( in[ 0 + inpos] >>> 8 ) & 3 ) - ; - out[ 5 + outpos] = (( in[ 0 + inpos] >>> 10 ) & 3 ) - ; - out[ 6 + outpos] = (( in[ 0 + inpos] >>> 12 ) & 3 ) - ; - out[ 7 + outpos] = (( in[ 0 + inpos] >>> 14 ) & 3 ) - ; - out[ 8 + outpos] = (( in[ 0 + inpos] >>> 16 ) & 3 ) - ; - out[ 9 + outpos] = (( in[ 0 + inpos] >>> 18 ) & 3 ) - ; - out[ 10 + outpos] = (( in[ 0 + inpos] >>> 20 ) & 3 ) - ; - out[ 11 + outpos] = (( in[ 0 + inpos] >>> 22 ) & 3 ) - ; - out[ 12 + outpos] = (( in[ 0 + inpos] >>> 24 ) & 3 ) - ; - out[ 13 + outpos] = (( in[ 0 + inpos] >>> 26 ) & 3 ) - ; - out[ 14 + outpos] = (( in[ 0 + inpos] >>> 28 ) & 3 ) - ; - out[ 15 + outpos] = ( in[ 0 + inpos] >>> 30 ) - ; - out[ 16 + outpos] = (( in[ 1 + inpos] >>> 0 ) & 3 ) - ; - out[ 17 + outpos] = (( in[ 1 + inpos] >>> 2 ) & 3 ) - ; - out[ 18 + outpos] = (( in[ 1 + inpos] >>> 4 ) & 3 ) - ; - out[ 19 + outpos] = (( in[ 1 + inpos] >>> 6 ) & 3 ) - ; - out[ 20 + outpos] = (( in[ 1 + inpos] >>> 8 ) & 3 ) - ; - out[ 21 + outpos] = (( in[ 1 + inpos] >>> 10 ) & 3 ) - ; - out[ 22 + outpos] = (( in[ 1 + inpos] >>> 12 ) & 3 ) - ; - out[ 23 + outpos] = (( in[ 1 + inpos] >>> 14 ) & 3 ) - ; - out[ 24 + outpos] = (( in[ 1 + inpos] >>> 16 ) & 3 ) - ; - out[ 25 + outpos] = (( in[ 1 + inpos] >>> 18 ) & 3 ) - ; - out[ 26 + outpos] = (( in[ 1 + inpos] >>> 20 ) & 3 ) - ; - out[ 27 + outpos] = (( in[ 1 + inpos] >>> 22 ) & 3 ) - ; - out[ 28 + outpos] = (( in[ 1 + inpos] >>> 24 ) & 3 ) - ; - out[ 29 + outpos] = (( in[ 1 + inpos] >>> 26 ) & 3 ) - ; - out[ 30 + outpos] = (( in[ 1 + inpos] >>> 28 ) & 3 ) - ; - out[ 31 + outpos] = ( in[ 1 + inpos] >>> 30 ) - ; -} - - - - -public static void fastunpack3(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 7 ) - ; - out[ 1 + outpos] = (( in[ 0 + inpos] >>> 3 ) & 7 ) - ; - out[ 2 + outpos] = (( in[ 0 + inpos] >>> 6 ) & 7 ) - ; - out[ 3 + outpos] = (( in[ 0 + inpos] >>> 9 ) & 7 ) - ; - out[ 4 + outpos] = (( in[ 0 + inpos] >>> 12 ) & 7 ) - ; - out[ 5 + outpos] = (( in[ 0 + inpos] >>> 15 ) & 7 ) - ; - out[ 6 + outpos] = (( in[ 0 + inpos] >>> 18 ) & 7 ) - ; - out[ 7 + outpos] = (( in[ 0 + inpos] >>> 21 ) & 7 ) - ; - out[ 8 + outpos] = (( in[ 0 + inpos] >>> 24 ) & 7 ) - ; - out[ 9 + outpos] = (( in[ 0 + inpos] >>> 27 ) & 7 ) - ; - out[ 10 + outpos] = ( in[ 0 + inpos] >>> 30 ) - | ((in[ 1 + inpos] & 1 )<<( 3 - 1 )) - ; - out[ 11 + outpos] = (( in[ 1 + inpos] >>> 1 ) & 7 ) - ; - out[ 12 + outpos] = (( in[ 1 + inpos] >>> 4 ) & 7 ) - ; - out[ 13 + outpos] = (( in[ 1 + inpos] >>> 7 ) & 7 ) - ; - out[ 14 + outpos] = (( in[ 1 + inpos] >>> 10 ) & 7 ) - ; - out[ 15 + outpos] = (( in[ 1 + inpos] >>> 13 ) & 7 ) - ; - out[ 16 + outpos] = (( in[ 1 + inpos] >>> 16 ) & 7 ) - ; - out[ 17 + outpos] = (( in[ 1 + inpos] >>> 19 ) & 7 ) - ; - out[ 18 + outpos] = (( in[ 1 + inpos] >>> 22 ) & 7 ) - ; - out[ 19 + outpos] = (( in[ 1 + inpos] >>> 25 ) & 7 ) - ; - out[ 20 + outpos] = (( in[ 1 + inpos] >>> 28 ) & 7 ) - ; - out[ 21 + outpos] = ( in[ 1 + inpos] >>> 31 ) - | ((in[ 2 + inpos] & 3 )<<( 3 - 2 )) - ; - out[ 22 + outpos] = (( in[ 2 + inpos] >>> 2 ) & 7 ) - ; - out[ 23 + outpos] = (( in[ 2 + inpos] >>> 5 ) & 7 ) - ; - out[ 24 + outpos] = (( in[ 2 + inpos] >>> 8 ) & 7 ) - ; - out[ 25 + outpos] = (( in[ 2 + inpos] >>> 11 ) & 7 ) - ; - out[ 26 + outpos] = (( in[ 2 + inpos] >>> 14 ) & 7 ) - ; - out[ 27 + outpos] = (( in[ 2 + inpos] >>> 17 ) & 7 ) - ; - out[ 28 + outpos] = (( in[ 2 + inpos] >>> 20 ) & 7 ) - ; - out[ 29 + outpos] = (( in[ 2 + inpos] >>> 23 ) & 7 ) - ; - out[ 30 + outpos] = (( in[ 2 + inpos] >>> 26 ) & 7 ) - ; - out[ 31 + outpos] = ( in[ 2 + inpos] >>> 29 ) - ; -} - - - - -public static void fastunpack4(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 15 ) - ; - out[ 1 + outpos] = (( in[ 0 + inpos] >>> 4 ) & 15 ) - ; - out[ 2 + outpos] = (( in[ 0 + inpos] >>> 8 ) & 15 ) - ; - out[ 3 + outpos] = (( in[ 0 + inpos] >>> 12 ) & 15 ) - ; - out[ 4 + outpos] = (( in[ 0 + inpos] >>> 16 ) & 15 ) - ; - out[ 5 + outpos] = (( in[ 0 + inpos] >>> 20 ) & 15 ) - ; - out[ 6 + outpos] = (( in[ 0 + inpos] >>> 24 ) & 15 ) - ; - out[ 7 + outpos] = ( in[ 0 + inpos] >>> 28 ) - ; - out[ 8 + outpos] = (( in[ 1 + inpos] >>> 0 ) & 15 ) - ; - out[ 9 + outpos] = (( in[ 1 + inpos] >>> 4 ) & 15 ) - ; - out[ 10 + outpos] = (( in[ 1 + inpos] >>> 8 ) & 15 ) - ; - out[ 11 + outpos] = (( in[ 1 + inpos] >>> 12 ) & 15 ) - ; - out[ 12 + outpos] = (( in[ 1 + inpos] >>> 16 ) & 15 ) - ; - out[ 13 + outpos] = (( in[ 1 + inpos] >>> 20 ) & 15 ) - ; - out[ 14 + outpos] = (( in[ 1 + inpos] >>> 24 ) & 15 ) - ; - out[ 15 + outpos] = ( in[ 1 + inpos] >>> 28 ) - ; - out[ 16 + outpos] = (( in[ 2 + inpos] >>> 0 ) & 15 ) - ; - out[ 17 + outpos] = (( in[ 2 + inpos] >>> 4 ) & 15 ) - ; - out[ 18 + outpos] = (( in[ 2 + inpos] >>> 8 ) & 15 ) - ; - out[ 19 + outpos] = (( in[ 2 + inpos] >>> 12 ) & 15 ) - ; - out[ 20 + outpos] = (( in[ 2 + inpos] >>> 16 ) & 15 ) - ; - out[ 21 + outpos] = (( in[ 2 + inpos] >>> 20 ) & 15 ) - ; - out[ 22 + outpos] = (( in[ 2 + inpos] >>> 24 ) & 15 ) - ; - out[ 23 + outpos] = ( in[ 2 + inpos] >>> 28 ) - ; - out[ 24 + outpos] = (( in[ 3 + inpos] >>> 0 ) & 15 ) - ; - out[ 25 + outpos] = (( in[ 3 + inpos] >>> 4 ) & 15 ) - ; - out[ 26 + outpos] = (( in[ 3 + inpos] >>> 8 ) & 15 ) - ; - out[ 27 + outpos] = (( in[ 3 + inpos] >>> 12 ) & 15 ) - ; - out[ 28 + outpos] = (( in[ 3 + inpos] >>> 16 ) & 15 ) - ; - out[ 29 + outpos] = (( in[ 3 + inpos] >>> 20 ) & 15 ) - ; - out[ 30 + outpos] = (( in[ 3 + inpos] >>> 24 ) & 15 ) - ; - out[ 31 + outpos] = ( in[ 3 + inpos] >>> 28 ) - ; -} - - - - -public static void fastunpack5(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 31 ) - ; - out[ 1 + outpos] = (( in[ 0 + inpos] >>> 5 ) & 31 ) - ; - out[ 2 + outpos] = (( in[ 0 + inpos] >>> 10 ) & 31 ) - ; - out[ 3 + outpos] = (( in[ 0 + inpos] >>> 15 ) & 31 ) - ; - out[ 4 + outpos] = (( in[ 0 + inpos] >>> 20 ) & 31 ) - ; - out[ 5 + outpos] = (( in[ 0 + inpos] >>> 25 ) & 31 ) - ; - out[ 6 + outpos] = ( in[ 0 + inpos] >>> 30 ) - | ((in[ 1 + inpos] & 7 )<<( 5 - 3 )) - ; - out[ 7 + outpos] = (( in[ 1 + inpos] >>> 3 ) & 31 ) - ; - out[ 8 + outpos] = (( in[ 1 + inpos] >>> 8 ) & 31 ) - ; - out[ 9 + outpos] = (( in[ 1 + inpos] >>> 13 ) & 31 ) - ; - out[ 10 + outpos] = (( in[ 1 + inpos] >>> 18 ) & 31 ) - ; - out[ 11 + outpos] = (( in[ 1 + inpos] >>> 23 ) & 31 ) - ; - out[ 12 + outpos] = ( in[ 1 + inpos] >>> 28 ) - | ((in[ 2 + inpos] & 1 )<<( 5 - 1 )) - ; - out[ 13 + outpos] = (( in[ 2 + inpos] >>> 1 ) & 31 ) - ; - out[ 14 + outpos] = (( in[ 2 + inpos] >>> 6 ) & 31 ) - ; - out[ 15 + outpos] = (( in[ 2 + inpos] >>> 11 ) & 31 ) - ; - out[ 16 + outpos] = (( in[ 2 + inpos] >>> 16 ) & 31 ) - ; - out[ 17 + outpos] = (( in[ 2 + inpos] >>> 21 ) & 31 ) - ; - out[ 18 + outpos] = (( in[ 2 + inpos] >>> 26 ) & 31 ) - ; - out[ 19 + outpos] = ( in[ 2 + inpos] >>> 31 ) - | ((in[ 3 + inpos] & 15 )<<( 5 - 4 )) - ; - out[ 20 + outpos] = (( in[ 3 + inpos] >>> 4 ) & 31 ) - ; - out[ 21 + outpos] = (( in[ 3 + inpos] >>> 9 ) & 31 ) - ; - out[ 22 + outpos] = (( in[ 3 + inpos] >>> 14 ) & 31 ) - ; - out[ 23 + outpos] = (( in[ 3 + inpos] >>> 19 ) & 31 ) - ; - out[ 24 + outpos] = (( in[ 3 + inpos] >>> 24 ) & 31 ) - ; - out[ 25 + outpos] = ( in[ 3 + inpos] >>> 29 ) - | ((in[ 4 + inpos] & 3 )<<( 5 - 2 )) - ; - out[ 26 + outpos] = (( in[ 4 + inpos] >>> 2 ) & 31 ) - ; - out[ 27 + outpos] = (( in[ 4 + inpos] >>> 7 ) & 31 ) - ; - out[ 28 + outpos] = (( in[ 4 + inpos] >>> 12 ) & 31 ) - ; - out[ 29 + outpos] = (( in[ 4 + inpos] >>> 17 ) & 31 ) - ; - out[ 30 + outpos] = (( in[ 4 + inpos] >>> 22 ) & 31 ) - ; - out[ 31 + outpos] = ( in[ 4 + inpos] >>> 27 ) - ; -} - - - - -public static void fastunpack6(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 63 ) - ; - out[ 1 + outpos] = (( in[ 0 + inpos] >>> 6 ) & 63 ) - ; - out[ 2 + outpos] = (( in[ 0 + inpos] >>> 12 ) & 63 ) - ; - out[ 3 + outpos] = (( in[ 0 + inpos] >>> 18 ) & 63 ) - ; - out[ 4 + outpos] = (( in[ 0 + inpos] >>> 24 ) & 63 ) - ; - out[ 5 + outpos] = ( in[ 0 + inpos] >>> 30 ) - | ((in[ 1 + inpos] & 15 )<<( 6 - 4 )) - ; - out[ 6 + outpos] = (( in[ 1 + inpos] >>> 4 ) & 63 ) - ; - out[ 7 + outpos] = (( in[ 1 + inpos] >>> 10 ) & 63 ) - ; - out[ 8 + outpos] = (( in[ 1 + inpos] >>> 16 ) & 63 ) - ; - out[ 9 + outpos] = (( in[ 1 + inpos] >>> 22 ) & 63 ) - ; - out[ 10 + outpos] = ( in[ 1 + inpos] >>> 28 ) - | ((in[ 2 + inpos] & 3 )<<( 6 - 2 )) - ; - out[ 11 + outpos] = (( in[ 2 + inpos] >>> 2 ) & 63 ) - ; - out[ 12 + outpos] = (( in[ 2 + inpos] >>> 8 ) & 63 ) - ; - out[ 13 + outpos] = (( in[ 2 + inpos] >>> 14 ) & 63 ) - ; - out[ 14 + outpos] = (( in[ 2 + inpos] >>> 20 ) & 63 ) - ; - out[ 15 + outpos] = ( in[ 2 + inpos] >>> 26 ) - ; - out[ 16 + outpos] = (( in[ 3 + inpos] >>> 0 ) & 63 ) - ; - out[ 17 + outpos] = (( in[ 3 + inpos] >>> 6 ) & 63 ) - ; - out[ 18 + outpos] = (( in[ 3 + inpos] >>> 12 ) & 63 ) - ; - out[ 19 + outpos] = (( in[ 3 + inpos] >>> 18 ) & 63 ) - ; - out[ 20 + outpos] = (( in[ 3 + inpos] >>> 24 ) & 63 ) - ; - out[ 21 + outpos] = ( in[ 3 + inpos] >>> 30 ) - | ((in[ 4 + inpos] & 15 )<<( 6 - 4 )) - ; - out[ 22 + outpos] = (( in[ 4 + inpos] >>> 4 ) & 63 ) - ; - out[ 23 + outpos] = (( in[ 4 + inpos] >>> 10 ) & 63 ) - ; - out[ 24 + outpos] = (( in[ 4 + inpos] >>> 16 ) & 63 ) - ; - out[ 25 + outpos] = (( in[ 4 + inpos] >>> 22 ) & 63 ) - ; - out[ 26 + outpos] = ( in[ 4 + inpos] >>> 28 ) - | ((in[ 5 + inpos] & 3 )<<( 6 - 2 )) - ; - out[ 27 + outpos] = (( in[ 5 + inpos] >>> 2 ) & 63 ) - ; - out[ 28 + outpos] = (( in[ 5 + inpos] >>> 8 ) & 63 ) - ; - out[ 29 + outpos] = (( in[ 5 + inpos] >>> 14 ) & 63 ) - ; - out[ 30 + outpos] = (( in[ 5 + inpos] >>> 20 ) & 63 ) - ; - out[ 31 + outpos] = ( in[ 5 + inpos] >>> 26 ) - ; -} - - - - -public static void fastunpack7(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 127 ) - ; - out[ 1 + outpos] = (( in[ 0 + inpos] >>> 7 ) & 127 ) - ; - out[ 2 + outpos] = (( in[ 0 + inpos] >>> 14 ) & 127 ) - ; - out[ 3 + outpos] = (( in[ 0 + inpos] >>> 21 ) & 127 ) - ; - out[ 4 + outpos] = ( in[ 0 + inpos] >>> 28 ) - | ((in[ 1 + inpos] & 7 )<<( 7 - 3 )) - ; - out[ 5 + outpos] = (( in[ 1 + inpos] >>> 3 ) & 127 ) - ; - out[ 6 + outpos] = (( in[ 1 + inpos] >>> 10 ) & 127 ) - ; - out[ 7 + outpos] = (( in[ 1 + inpos] >>> 17 ) & 127 ) - ; - out[ 8 + outpos] = (( in[ 1 + inpos] >>> 24 ) & 127 ) - ; - out[ 9 + outpos] = ( in[ 1 + inpos] >>> 31 ) - | ((in[ 2 + inpos] & 63 )<<( 7 - 6 )) - ; - out[ 10 + outpos] = (( in[ 2 + inpos] >>> 6 ) & 127 ) - ; - out[ 11 + outpos] = (( in[ 2 + inpos] >>> 13 ) & 127 ) - ; - out[ 12 + outpos] = (( in[ 2 + inpos] >>> 20 ) & 127 ) - ; - out[ 13 + outpos] = ( in[ 2 + inpos] >>> 27 ) - | ((in[ 3 + inpos] & 3 )<<( 7 - 2 )) - ; - out[ 14 + outpos] = (( in[ 3 + inpos] >>> 2 ) & 127 ) - ; - out[ 15 + outpos] = (( in[ 3 + inpos] >>> 9 ) & 127 ) - ; - out[ 16 + outpos] = (( in[ 3 + inpos] >>> 16 ) & 127 ) - ; - out[ 17 + outpos] = (( in[ 3 + inpos] >>> 23 ) & 127 ) - ; - out[ 18 + outpos] = ( in[ 3 + inpos] >>> 30 ) - | ((in[ 4 + inpos] & 31 )<<( 7 - 5 )) - ; - out[ 19 + outpos] = (( in[ 4 + inpos] >>> 5 ) & 127 ) - ; - out[ 20 + outpos] = (( in[ 4 + inpos] >>> 12 ) & 127 ) - ; - out[ 21 + outpos] = (( in[ 4 + inpos] >>> 19 ) & 127 ) - ; - out[ 22 + outpos] = ( in[ 4 + inpos] >>> 26 ) - | ((in[ 5 + inpos] & 1 )<<( 7 - 1 )) - ; - out[ 23 + outpos] = (( in[ 5 + inpos] >>> 1 ) & 127 ) - ; - out[ 24 + outpos] = (( in[ 5 + inpos] >>> 8 ) & 127 ) - ; - out[ 25 + outpos] = (( in[ 5 + inpos] >>> 15 ) & 127 ) - ; - out[ 26 + outpos] = (( in[ 5 + inpos] >>> 22 ) & 127 ) - ; - out[ 27 + outpos] = ( in[ 5 + inpos] >>> 29 ) - | ((in[ 6 + inpos] & 15 )<<( 7 - 4 )) - ; - out[ 28 + outpos] = (( in[ 6 + inpos] >>> 4 ) & 127 ) - ; - out[ 29 + outpos] = (( in[ 6 + inpos] >>> 11 ) & 127 ) - ; - out[ 30 + outpos] = (( in[ 6 + inpos] >>> 18 ) & 127 ) - ; - out[ 31 + outpos] = ( in[ 6 + inpos] >>> 25 ) - ; -} - - - - -public static void fastunpack8(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 255 ) - ; - out[ 1 + outpos] = (( in[ 0 + inpos] >>> 8 ) & 255 ) - ; - out[ 2 + outpos] = (( in[ 0 + inpos] >>> 16 ) & 255 ) - ; - out[ 3 + outpos] = ( in[ 0 + inpos] >>> 24 ) - ; - out[ 4 + outpos] = (( in[ 1 + inpos] >>> 0 ) & 255 ) - ; - out[ 5 + outpos] = (( in[ 1 + inpos] >>> 8 ) & 255 ) - ; - out[ 6 + outpos] = (( in[ 1 + inpos] >>> 16 ) & 255 ) - ; - out[ 7 + outpos] = ( in[ 1 + inpos] >>> 24 ) - ; - out[ 8 + outpos] = (( in[ 2 + inpos] >>> 0 ) & 255 ) - ; - out[ 9 + outpos] = (( in[ 2 + inpos] >>> 8 ) & 255 ) - ; - out[ 10 + outpos] = (( in[ 2 + inpos] >>> 16 ) & 255 ) - ; - out[ 11 + outpos] = ( in[ 2 + inpos] >>> 24 ) - ; - out[ 12 + outpos] = (( in[ 3 + inpos] >>> 0 ) & 255 ) - ; - out[ 13 + outpos] = (( in[ 3 + inpos] >>> 8 ) & 255 ) - ; - out[ 14 + outpos] = (( in[ 3 + inpos] >>> 16 ) & 255 ) - ; - out[ 15 + outpos] = ( in[ 3 + inpos] >>> 24 ) - ; - out[ 16 + outpos] = (( in[ 4 + inpos] >>> 0 ) & 255 ) - ; - out[ 17 + outpos] = (( in[ 4 + inpos] >>> 8 ) & 255 ) - ; - out[ 18 + outpos] = (( in[ 4 + inpos] >>> 16 ) & 255 ) - ; - out[ 19 + outpos] = ( in[ 4 + inpos] >>> 24 ) - ; - out[ 20 + outpos] = (( in[ 5 + inpos] >>> 0 ) & 255 ) - ; - out[ 21 + outpos] = (( in[ 5 + inpos] >>> 8 ) & 255 ) - ; - out[ 22 + outpos] = (( in[ 5 + inpos] >>> 16 ) & 255 ) - ; - out[ 23 + outpos] = ( in[ 5 + inpos] >>> 24 ) - ; - out[ 24 + outpos] = (( in[ 6 + inpos] >>> 0 ) & 255 ) - ; - out[ 25 + outpos] = (( in[ 6 + inpos] >>> 8 ) & 255 ) - ; - out[ 26 + outpos] = (( in[ 6 + inpos] >>> 16 ) & 255 ) - ; - out[ 27 + outpos] = ( in[ 6 + inpos] >>> 24 ) - ; - out[ 28 + outpos] = (( in[ 7 + inpos] >>> 0 ) & 255 ) - ; - out[ 29 + outpos] = (( in[ 7 + inpos] >>> 8 ) & 255 ) - ; - out[ 30 + outpos] = (( in[ 7 + inpos] >>> 16 ) & 255 ) - ; - out[ 31 + outpos] = ( in[ 7 + inpos] >>> 24 ) - ; -} - - - - -public static void fastunpack9(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 511 ) - ; - out[ 1 + outpos] = (( in[ 0 + inpos] >>> 9 ) & 511 ) - ; - out[ 2 + outpos] = (( in[ 0 + inpos] >>> 18 ) & 511 ) - ; - out[ 3 + outpos] = ( in[ 0 + inpos] >>> 27 ) - | ((in[ 1 + inpos] & 15 )<<( 9 - 4 )) - ; - out[ 4 + outpos] = (( in[ 1 + inpos] >>> 4 ) & 511 ) - ; - out[ 5 + outpos] = (( in[ 1 + inpos] >>> 13 ) & 511 ) - ; - out[ 6 + outpos] = (( in[ 1 + inpos] >>> 22 ) & 511 ) - ; - out[ 7 + outpos] = ( in[ 1 + inpos] >>> 31 ) - | ((in[ 2 + inpos] & 255 )<<( 9 - 8 )) - ; - out[ 8 + outpos] = (( in[ 2 + inpos] >>> 8 ) & 511 ) - ; - out[ 9 + outpos] = (( in[ 2 + inpos] >>> 17 ) & 511 ) - ; - out[ 10 + outpos] = ( in[ 2 + inpos] >>> 26 ) - | ((in[ 3 + inpos] & 7 )<<( 9 - 3 )) - ; - out[ 11 + outpos] = (( in[ 3 + inpos] >>> 3 ) & 511 ) - ; - out[ 12 + outpos] = (( in[ 3 + inpos] >>> 12 ) & 511 ) - ; - out[ 13 + outpos] = (( in[ 3 + inpos] >>> 21 ) & 511 ) - ; - out[ 14 + outpos] = ( in[ 3 + inpos] >>> 30 ) - | ((in[ 4 + inpos] & 127 )<<( 9 - 7 )) - ; - out[ 15 + outpos] = (( in[ 4 + inpos] >>> 7 ) & 511 ) - ; - out[ 16 + outpos] = (( in[ 4 + inpos] >>> 16 ) & 511 ) - ; - out[ 17 + outpos] = ( in[ 4 + inpos] >>> 25 ) - | ((in[ 5 + inpos] & 3 )<<( 9 - 2 )) - ; - out[ 18 + outpos] = (( in[ 5 + inpos] >>> 2 ) & 511 ) - ; - out[ 19 + outpos] = (( in[ 5 + inpos] >>> 11 ) & 511 ) - ; - out[ 20 + outpos] = (( in[ 5 + inpos] >>> 20 ) & 511 ) - ; - out[ 21 + outpos] = ( in[ 5 + inpos] >>> 29 ) - | ((in[ 6 + inpos] & 63 )<<( 9 - 6 )) - ; - out[ 22 + outpos] = (( in[ 6 + inpos] >>> 6 ) & 511 ) - ; - out[ 23 + outpos] = (( in[ 6 + inpos] >>> 15 ) & 511 ) - ; - out[ 24 + outpos] = ( in[ 6 + inpos] >>> 24 ) - | ((in[ 7 + inpos] & 1 )<<( 9 - 1 )) - ; - out[ 25 + outpos] = (( in[ 7 + inpos] >>> 1 ) & 511 ) - ; - out[ 26 + outpos] = (( in[ 7 + inpos] >>> 10 ) & 511 ) - ; - out[ 27 + outpos] = (( in[ 7 + inpos] >>> 19 ) & 511 ) - ; - out[ 28 + outpos] = ( in[ 7 + inpos] >>> 28 ) - | ((in[ 8 + inpos] & 31 )<<( 9 - 5 )) - ; - out[ 29 + outpos] = (( in[ 8 + inpos] >>> 5 ) & 511 ) - ; - out[ 30 + outpos] = (( in[ 8 + inpos] >>> 14 ) & 511 ) - ; - out[ 31 + outpos] = ( in[ 8 + inpos] >>> 23 ) - ; -} - - - - -public static void fastunpack10(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 1023 ) - ; - out[ 1 + outpos] = (( in[ 0 + inpos] >>> 10 ) & 1023 ) - ; - out[ 2 + outpos] = (( in[ 0 + inpos] >>> 20 ) & 1023 ) - ; - out[ 3 + outpos] = ( in[ 0 + inpos] >>> 30 ) - | ((in[ 1 + inpos] & 255 )<<( 10 - 8 )) - ; - out[ 4 + outpos] = (( in[ 1 + inpos] >>> 8 ) & 1023 ) - ; - out[ 5 + outpos] = (( in[ 1 + inpos] >>> 18 ) & 1023 ) - ; - out[ 6 + outpos] = ( in[ 1 + inpos] >>> 28 ) - | ((in[ 2 + inpos] & 63 )<<( 10 - 6 )) - ; - out[ 7 + outpos] = (( in[ 2 + inpos] >>> 6 ) & 1023 ) - ; - out[ 8 + outpos] = (( in[ 2 + inpos] >>> 16 ) & 1023 ) - ; - out[ 9 + outpos] = ( in[ 2 + inpos] >>> 26 ) - | ((in[ 3 + inpos] & 15 )<<( 10 - 4 )) - ; - out[ 10 + outpos] = (( in[ 3 + inpos] >>> 4 ) & 1023 ) - ; - out[ 11 + outpos] = (( in[ 3 + inpos] >>> 14 ) & 1023 ) - ; - out[ 12 + outpos] = ( in[ 3 + inpos] >>> 24 ) - | ((in[ 4 + inpos] & 3 )<<( 10 - 2 )) - ; - out[ 13 + outpos] = (( in[ 4 + inpos] >>> 2 ) & 1023 ) - ; - out[ 14 + outpos] = (( in[ 4 + inpos] >>> 12 ) & 1023 ) - ; - out[ 15 + outpos] = ( in[ 4 + inpos] >>> 22 ) - ; - out[ 16 + outpos] = (( in[ 5 + inpos] >>> 0 ) & 1023 ) - ; - out[ 17 + outpos] = (( in[ 5 + inpos] >>> 10 ) & 1023 ) - ; - out[ 18 + outpos] = (( in[ 5 + inpos] >>> 20 ) & 1023 ) - ; - out[ 19 + outpos] = ( in[ 5 + inpos] >>> 30 ) - | ((in[ 6 + inpos] & 255 )<<( 10 - 8 )) - ; - out[ 20 + outpos] = (( in[ 6 + inpos] >>> 8 ) & 1023 ) - ; - out[ 21 + outpos] = (( in[ 6 + inpos] >>> 18 ) & 1023 ) - ; - out[ 22 + outpos] = ( in[ 6 + inpos] >>> 28 ) - | ((in[ 7 + inpos] & 63 )<<( 10 - 6 )) - ; - out[ 23 + outpos] = (( in[ 7 + inpos] >>> 6 ) & 1023 ) - ; - out[ 24 + outpos] = (( in[ 7 + inpos] >>> 16 ) & 1023 ) - ; - out[ 25 + outpos] = ( in[ 7 + inpos] >>> 26 ) - | ((in[ 8 + inpos] & 15 )<<( 10 - 4 )) - ; - out[ 26 + outpos] = (( in[ 8 + inpos] >>> 4 ) & 1023 ) - ; - out[ 27 + outpos] = (( in[ 8 + inpos] >>> 14 ) & 1023 ) - ; - out[ 28 + outpos] = ( in[ 8 + inpos] >>> 24 ) - | ((in[ 9 + inpos] & 3 )<<( 10 - 2 )) - ; - out[ 29 + outpos] = (( in[ 9 + inpos] >>> 2 ) & 1023 ) - ; - out[ 30 + outpos] = (( in[ 9 + inpos] >>> 12 ) & 1023 ) - ; - out[ 31 + outpos] = ( in[ 9 + inpos] >>> 22 ) - ; -} - - - - -public static void fastunpack11(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 2047 ) - ; - out[ 1 + outpos] = (( in[ 0 + inpos] >>> 11 ) & 2047 ) - ; - out[ 2 + outpos] = ( in[ 0 + inpos] >>> 22 ) - | ((in[ 1 + inpos] & 1 )<<( 11 - 1 )) - ; - out[ 3 + outpos] = (( in[ 1 + inpos] >>> 1 ) & 2047 ) - ; - out[ 4 + outpos] = (( in[ 1 + inpos] >>> 12 ) & 2047 ) - ; - out[ 5 + outpos] = ( in[ 1 + inpos] >>> 23 ) - | ((in[ 2 + inpos] & 3 )<<( 11 - 2 )) - ; - out[ 6 + outpos] = (( in[ 2 + inpos] >>> 2 ) & 2047 ) - ; - out[ 7 + outpos] = (( in[ 2 + inpos] >>> 13 ) & 2047 ) - ; - out[ 8 + outpos] = ( in[ 2 + inpos] >>> 24 ) - | ((in[ 3 + inpos] & 7 )<<( 11 - 3 )) - ; - out[ 9 + outpos] = (( in[ 3 + inpos] >>> 3 ) & 2047 ) - ; - out[ 10 + outpos] = (( in[ 3 + inpos] >>> 14 ) & 2047 ) - ; - out[ 11 + outpos] = ( in[ 3 + inpos] >>> 25 ) - | ((in[ 4 + inpos] & 15 )<<( 11 - 4 )) - ; - out[ 12 + outpos] = (( in[ 4 + inpos] >>> 4 ) & 2047 ) - ; - out[ 13 + outpos] = (( in[ 4 + inpos] >>> 15 ) & 2047 ) - ; - out[ 14 + outpos] = ( in[ 4 + inpos] >>> 26 ) - | ((in[ 5 + inpos] & 31 )<<( 11 - 5 )) - ; - out[ 15 + outpos] = (( in[ 5 + inpos] >>> 5 ) & 2047 ) - ; - out[ 16 + outpos] = (( in[ 5 + inpos] >>> 16 ) & 2047 ) - ; - out[ 17 + outpos] = ( in[ 5 + inpos] >>> 27 ) - | ((in[ 6 + inpos] & 63 )<<( 11 - 6 )) - ; - out[ 18 + outpos] = (( in[ 6 + inpos] >>> 6 ) & 2047 ) - ; - out[ 19 + outpos] = (( in[ 6 + inpos] >>> 17 ) & 2047 ) - ; - out[ 20 + outpos] = ( in[ 6 + inpos] >>> 28 ) - | ((in[ 7 + inpos] & 127 )<<( 11 - 7 )) - ; - out[ 21 + outpos] = (( in[ 7 + inpos] >>> 7 ) & 2047 ) - ; - out[ 22 + outpos] = (( in[ 7 + inpos] >>> 18 ) & 2047 ) - ; - out[ 23 + outpos] = ( in[ 7 + inpos] >>> 29 ) - | ((in[ 8 + inpos] & 255 )<<( 11 - 8 )) - ; - out[ 24 + outpos] = (( in[ 8 + inpos] >>> 8 ) & 2047 ) - ; - out[ 25 + outpos] = (( in[ 8 + inpos] >>> 19 ) & 2047 ) - ; - out[ 26 + outpos] = ( in[ 8 + inpos] >>> 30 ) - | ((in[ 9 + inpos] & 511 )<<( 11 - 9 )) - ; - out[ 27 + outpos] = (( in[ 9 + inpos] >>> 9 ) & 2047 ) - ; - out[ 28 + outpos] = (( in[ 9 + inpos] >>> 20 ) & 2047 ) - ; - out[ 29 + outpos] = ( in[ 9 + inpos] >>> 31 ) - | ((in[ 10 + inpos] & 1023 )<<( 11 - 10 )) - ; - out[ 30 + outpos] = (( in[ 10 + inpos] >>> 10 ) & 2047 ) - ; - out[ 31 + outpos] = ( in[ 10 + inpos] >>> 21 ) - ; -} - - - - -public static void fastunpack12(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 4095 ) - ; - out[ 1 + outpos] = (( in[ 0 + inpos] >>> 12 ) & 4095 ) - ; - out[ 2 + outpos] = ( in[ 0 + inpos] >>> 24 ) - | ((in[ 1 + inpos] & 15 )<<( 12 - 4 )) - ; - out[ 3 + outpos] = (( in[ 1 + inpos] >>> 4 ) & 4095 ) - ; - out[ 4 + outpos] = (( in[ 1 + inpos] >>> 16 ) & 4095 ) - ; - out[ 5 + outpos] = ( in[ 1 + inpos] >>> 28 ) - | ((in[ 2 + inpos] & 255 )<<( 12 - 8 )) - ; - out[ 6 + outpos] = (( in[ 2 + inpos] >>> 8 ) & 4095 ) - ; - out[ 7 + outpos] = ( in[ 2 + inpos] >>> 20 ) - ; - out[ 8 + outpos] = (( in[ 3 + inpos] >>> 0 ) & 4095 ) - ; - out[ 9 + outpos] = (( in[ 3 + inpos] >>> 12 ) & 4095 ) - ; - out[ 10 + outpos] = ( in[ 3 + inpos] >>> 24 ) - | ((in[ 4 + inpos] & 15 )<<( 12 - 4 )) - ; - out[ 11 + outpos] = (( in[ 4 + inpos] >>> 4 ) & 4095 ) - ; - out[ 12 + outpos] = (( in[ 4 + inpos] >>> 16 ) & 4095 ) - ; - out[ 13 + outpos] = ( in[ 4 + inpos] >>> 28 ) - | ((in[ 5 + inpos] & 255 )<<( 12 - 8 )) - ; - out[ 14 + outpos] = (( in[ 5 + inpos] >>> 8 ) & 4095 ) - ; - out[ 15 + outpos] = ( in[ 5 + inpos] >>> 20 ) - ; - out[ 16 + outpos] = (( in[ 6 + inpos] >>> 0 ) & 4095 ) - ; - out[ 17 + outpos] = (( in[ 6 + inpos] >>> 12 ) & 4095 ) - ; - out[ 18 + outpos] = ( in[ 6 + inpos] >>> 24 ) - | ((in[ 7 + inpos] & 15 )<<( 12 - 4 )) - ; - out[ 19 + outpos] = (( in[ 7 + inpos] >>> 4 ) & 4095 ) - ; - out[ 20 + outpos] = (( in[ 7 + inpos] >>> 16 ) & 4095 ) - ; - out[ 21 + outpos] = ( in[ 7 + inpos] >>> 28 ) - | ((in[ 8 + inpos] & 255 )<<( 12 - 8 )) - ; - out[ 22 + outpos] = (( in[ 8 + inpos] >>> 8 ) & 4095 ) - ; - out[ 23 + outpos] = ( in[ 8 + inpos] >>> 20 ) - ; - out[ 24 + outpos] = (( in[ 9 + inpos] >>> 0 ) & 4095 ) - ; - out[ 25 + outpos] = (( in[ 9 + inpos] >>> 12 ) & 4095 ) - ; - out[ 26 + outpos] = ( in[ 9 + inpos] >>> 24 ) - | ((in[ 10 + inpos] & 15 )<<( 12 - 4 )) - ; - out[ 27 + outpos] = (( in[ 10 + inpos] >>> 4 ) & 4095 ) - ; - out[ 28 + outpos] = (( in[ 10 + inpos] >>> 16 ) & 4095 ) - ; - out[ 29 + outpos] = ( in[ 10 + inpos] >>> 28 ) - | ((in[ 11 + inpos] & 255 )<<( 12 - 8 )) - ; - out[ 30 + outpos] = (( in[ 11 + inpos] >>> 8 ) & 4095 ) - ; - out[ 31 + outpos] = ( in[ 11 + inpos] >>> 20 ) - ; -} - - - - -public static void fastunpack13(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 8191 ) - ; - out[ 1 + outpos] = (( in[ 0 + inpos] >>> 13 ) & 8191 ) - ; - out[ 2 + outpos] = ( in[ 0 + inpos] >>> 26 ) - | ((in[ 1 + inpos] & 127 )<<( 13 - 7 )) - ; - out[ 3 + outpos] = (( in[ 1 + inpos] >>> 7 ) & 8191 ) - ; - out[ 4 + outpos] = ( in[ 1 + inpos] >>> 20 ) - | ((in[ 2 + inpos] & 1 )<<( 13 - 1 )) - ; - out[ 5 + outpos] = (( in[ 2 + inpos] >>> 1 ) & 8191 ) - ; - out[ 6 + outpos] = (( in[ 2 + inpos] >>> 14 ) & 8191 ) - ; - out[ 7 + outpos] = ( in[ 2 + inpos] >>> 27 ) - | ((in[ 3 + inpos] & 255 )<<( 13 - 8 )) - ; - out[ 8 + outpos] = (( in[ 3 + inpos] >>> 8 ) & 8191 ) - ; - out[ 9 + outpos] = ( in[ 3 + inpos] >>> 21 ) - | ((in[ 4 + inpos] & 3 )<<( 13 - 2 )) - ; - out[ 10 + outpos] = (( in[ 4 + inpos] >>> 2 ) & 8191 ) - ; - out[ 11 + outpos] = (( in[ 4 + inpos] >>> 15 ) & 8191 ) - ; - out[ 12 + outpos] = ( in[ 4 + inpos] >>> 28 ) - | ((in[ 5 + inpos] & 511 )<<( 13 - 9 )) - ; - out[ 13 + outpos] = (( in[ 5 + inpos] >>> 9 ) & 8191 ) - ; - out[ 14 + outpos] = ( in[ 5 + inpos] >>> 22 ) - | ((in[ 6 + inpos] & 7 )<<( 13 - 3 )) - ; - out[ 15 + outpos] = (( in[ 6 + inpos] >>> 3 ) & 8191 ) - ; - out[ 16 + outpos] = (( in[ 6 + inpos] >>> 16 ) & 8191 ) - ; - out[ 17 + outpos] = ( in[ 6 + inpos] >>> 29 ) - | ((in[ 7 + inpos] & 1023 )<<( 13 - 10 )) - ; - out[ 18 + outpos] = (( in[ 7 + inpos] >>> 10 ) & 8191 ) - ; - out[ 19 + outpos] = ( in[ 7 + inpos] >>> 23 ) - | ((in[ 8 + inpos] & 15 )<<( 13 - 4 )) - ; - out[ 20 + outpos] = (( in[ 8 + inpos] >>> 4 ) & 8191 ) - ; - out[ 21 + outpos] = (( in[ 8 + inpos] >>> 17 ) & 8191 ) - ; - out[ 22 + outpos] = ( in[ 8 + inpos] >>> 30 ) - | ((in[ 9 + inpos] & 2047 )<<( 13 - 11 )) - ; - out[ 23 + outpos] = (( in[ 9 + inpos] >>> 11 ) & 8191 ) - ; - out[ 24 + outpos] = ( in[ 9 + inpos] >>> 24 ) - | ((in[ 10 + inpos] & 31 )<<( 13 - 5 )) - ; - out[ 25 + outpos] = (( in[ 10 + inpos] >>> 5 ) & 8191 ) - ; - out[ 26 + outpos] = (( in[ 10 + inpos] >>> 18 ) & 8191 ) - ; - out[ 27 + outpos] = ( in[ 10 + inpos] >>> 31 ) - | ((in[ 11 + inpos] & 4095 )<<( 13 - 12 )) - ; - out[ 28 + outpos] = (( in[ 11 + inpos] >>> 12 ) & 8191 ) - ; - out[ 29 + outpos] = ( in[ 11 + inpos] >>> 25 ) - | ((in[ 12 + inpos] & 63 )<<( 13 - 6 )) - ; - out[ 30 + outpos] = (( in[ 12 + inpos] >>> 6 ) & 8191 ) - ; - out[ 31 + outpos] = ( in[ 12 + inpos] >>> 19 ) - ; -} - - - - -public static void fastunpack14(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 16383 ) - ; - out[ 1 + outpos] = (( in[ 0 + inpos] >>> 14 ) & 16383 ) - ; - out[ 2 + outpos] = ( in[ 0 + inpos] >>> 28 ) - | ((in[ 1 + inpos] & 1023 )<<( 14 - 10 )) - ; - out[ 3 + outpos] = (( in[ 1 + inpos] >>> 10 ) & 16383 ) - ; - out[ 4 + outpos] = ( in[ 1 + inpos] >>> 24 ) - | ((in[ 2 + inpos] & 63 )<<( 14 - 6 )) - ; - out[ 5 + outpos] = (( in[ 2 + inpos] >>> 6 ) & 16383 ) - ; - out[ 6 + outpos] = ( in[ 2 + inpos] >>> 20 ) - | ((in[ 3 + inpos] & 3 )<<( 14 - 2 )) - ; - out[ 7 + outpos] = (( in[ 3 + inpos] >>> 2 ) & 16383 ) - ; - out[ 8 + outpos] = (( in[ 3 + inpos] >>> 16 ) & 16383 ) - ; - out[ 9 + outpos] = ( in[ 3 + inpos] >>> 30 ) - | ((in[ 4 + inpos] & 4095 )<<( 14 - 12 )) - ; - out[ 10 + outpos] = (( in[ 4 + inpos] >>> 12 ) & 16383 ) - ; - out[ 11 + outpos] = ( in[ 4 + inpos] >>> 26 ) - | ((in[ 5 + inpos] & 255 )<<( 14 - 8 )) - ; - out[ 12 + outpos] = (( in[ 5 + inpos] >>> 8 ) & 16383 ) - ; - out[ 13 + outpos] = ( in[ 5 + inpos] >>> 22 ) - | ((in[ 6 + inpos] & 15 )<<( 14 - 4 )) - ; - out[ 14 + outpos] = (( in[ 6 + inpos] >>> 4 ) & 16383 ) - ; - out[ 15 + outpos] = ( in[ 6 + inpos] >>> 18 ) - ; - out[ 16 + outpos] = (( in[ 7 + inpos] >>> 0 ) & 16383 ) - ; - out[ 17 + outpos] = (( in[ 7 + inpos] >>> 14 ) & 16383 ) - ; - out[ 18 + outpos] = ( in[ 7 + inpos] >>> 28 ) - | ((in[ 8 + inpos] & 1023 )<<( 14 - 10 )) - ; - out[ 19 + outpos] = (( in[ 8 + inpos] >>> 10 ) & 16383 ) - ; - out[ 20 + outpos] = ( in[ 8 + inpos] >>> 24 ) - | ((in[ 9 + inpos] & 63 )<<( 14 - 6 )) - ; - out[ 21 + outpos] = (( in[ 9 + inpos] >>> 6 ) & 16383 ) - ; - out[ 22 + outpos] = ( in[ 9 + inpos] >>> 20 ) - | ((in[ 10 + inpos] & 3 )<<( 14 - 2 )) - ; - out[ 23 + outpos] = (( in[ 10 + inpos] >>> 2 ) & 16383 ) - ; - out[ 24 + outpos] = (( in[ 10 + inpos] >>> 16 ) & 16383 ) - ; - out[ 25 + outpos] = ( in[ 10 + inpos] >>> 30 ) - | ((in[ 11 + inpos] & 4095 )<<( 14 - 12 )) - ; - out[ 26 + outpos] = (( in[ 11 + inpos] >>> 12 ) & 16383 ) - ; - out[ 27 + outpos] = ( in[ 11 + inpos] >>> 26 ) - | ((in[ 12 + inpos] & 255 )<<( 14 - 8 )) - ; - out[ 28 + outpos] = (( in[ 12 + inpos] >>> 8 ) & 16383 ) - ; - out[ 29 + outpos] = ( in[ 12 + inpos] >>> 22 ) - | ((in[ 13 + inpos] & 15 )<<( 14 - 4 )) - ; - out[ 30 + outpos] = (( in[ 13 + inpos] >>> 4 ) & 16383 ) - ; - out[ 31 + outpos] = ( in[ 13 + inpos] >>> 18 ) - ; -} - - - - -public static void fastunpack15(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 32767 ) - ; - out[ 1 + outpos] = (( in[ 0 + inpos] >>> 15 ) & 32767 ) - ; - out[ 2 + outpos] = ( in[ 0 + inpos] >>> 30 ) - | ((in[ 1 + inpos] & 8191 )<<( 15 - 13 )) - ; - out[ 3 + outpos] = (( in[ 1 + inpos] >>> 13 ) & 32767 ) - ; - out[ 4 + outpos] = ( in[ 1 + inpos] >>> 28 ) - | ((in[ 2 + inpos] & 2047 )<<( 15 - 11 )) - ; - out[ 5 + outpos] = (( in[ 2 + inpos] >>> 11 ) & 32767 ) - ; - out[ 6 + outpos] = ( in[ 2 + inpos] >>> 26 ) - | ((in[ 3 + inpos] & 511 )<<( 15 - 9 )) - ; - out[ 7 + outpos] = (( in[ 3 + inpos] >>> 9 ) & 32767 ) - ; - out[ 8 + outpos] = ( in[ 3 + inpos] >>> 24 ) - | ((in[ 4 + inpos] & 127 )<<( 15 - 7 )) - ; - out[ 9 + outpos] = (( in[ 4 + inpos] >>> 7 ) & 32767 ) - ; - out[ 10 + outpos] = ( in[ 4 + inpos] >>> 22 ) - | ((in[ 5 + inpos] & 31 )<<( 15 - 5 )) - ; - out[ 11 + outpos] = (( in[ 5 + inpos] >>> 5 ) & 32767 ) - ; - out[ 12 + outpos] = ( in[ 5 + inpos] >>> 20 ) - | ((in[ 6 + inpos] & 7 )<<( 15 - 3 )) - ; - out[ 13 + outpos] = (( in[ 6 + inpos] >>> 3 ) & 32767 ) - ; - out[ 14 + outpos] = ( in[ 6 + inpos] >>> 18 ) - | ((in[ 7 + inpos] & 1 )<<( 15 - 1 )) - ; - out[ 15 + outpos] = (( in[ 7 + inpos] >>> 1 ) & 32767 ) - ; - out[ 16 + outpos] = (( in[ 7 + inpos] >>> 16 ) & 32767 ) - ; - out[ 17 + outpos] = ( in[ 7 + inpos] >>> 31 ) - | ((in[ 8 + inpos] & 16383 )<<( 15 - 14 )) - ; - out[ 18 + outpos] = (( in[ 8 + inpos] >>> 14 ) & 32767 ) - ; - out[ 19 + outpos] = ( in[ 8 + inpos] >>> 29 ) - | ((in[ 9 + inpos] & 4095 )<<( 15 - 12 )) - ; - out[ 20 + outpos] = (( in[ 9 + inpos] >>> 12 ) & 32767 ) - ; - out[ 21 + outpos] = ( in[ 9 + inpos] >>> 27 ) - | ((in[ 10 + inpos] & 1023 )<<( 15 - 10 )) - ; - out[ 22 + outpos] = (( in[ 10 + inpos] >>> 10 ) & 32767 ) - ; - out[ 23 + outpos] = ( in[ 10 + inpos] >>> 25 ) - | ((in[ 11 + inpos] & 255 )<<( 15 - 8 )) - ; - out[ 24 + outpos] = (( in[ 11 + inpos] >>> 8 ) & 32767 ) - ; - out[ 25 + outpos] = ( in[ 11 + inpos] >>> 23 ) - | ((in[ 12 + inpos] & 63 )<<( 15 - 6 )) - ; - out[ 26 + outpos] = (( in[ 12 + inpos] >>> 6 ) & 32767 ) - ; - out[ 27 + outpos] = ( in[ 12 + inpos] >>> 21 ) - | ((in[ 13 + inpos] & 15 )<<( 15 - 4 )) - ; - out[ 28 + outpos] = (( in[ 13 + inpos] >>> 4 ) & 32767 ) - ; - out[ 29 + outpos] = ( in[ 13 + inpos] >>> 19 ) - | ((in[ 14 + inpos] & 3 )<<( 15 - 2 )) - ; - out[ 30 + outpos] = (( in[ 14 + inpos] >>> 2 ) & 32767 ) - ; - out[ 31 + outpos] = ( in[ 14 + inpos] >>> 17 ) - ; -} - - - - -public static void fastunpack16(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 65535 ) - ; - out[ 1 + outpos] = ( in[ 0 + inpos] >>> 16 ) - ; - out[ 2 + outpos] = (( in[ 1 + inpos] >>> 0 ) & 65535 ) - ; - out[ 3 + outpos] = ( in[ 1 + inpos] >>> 16 ) - ; - out[ 4 + outpos] = (( in[ 2 + inpos] >>> 0 ) & 65535 ) - ; - out[ 5 + outpos] = ( in[ 2 + inpos] >>> 16 ) - ; - out[ 6 + outpos] = (( in[ 3 + inpos] >>> 0 ) & 65535 ) - ; - out[ 7 + outpos] = ( in[ 3 + inpos] >>> 16 ) - ; - out[ 8 + outpos] = (( in[ 4 + inpos] >>> 0 ) & 65535 ) - ; - out[ 9 + outpos] = ( in[ 4 + inpos] >>> 16 ) - ; - out[ 10 + outpos] = (( in[ 5 + inpos] >>> 0 ) & 65535 ) - ; - out[ 11 + outpos] = ( in[ 5 + inpos] >>> 16 ) - ; - out[ 12 + outpos] = (( in[ 6 + inpos] >>> 0 ) & 65535 ) - ; - out[ 13 + outpos] = ( in[ 6 + inpos] >>> 16 ) - ; - out[ 14 + outpos] = (( in[ 7 + inpos] >>> 0 ) & 65535 ) - ; - out[ 15 + outpos] = ( in[ 7 + inpos] >>> 16 ) - ; - out[ 16 + outpos] = (( in[ 8 + inpos] >>> 0 ) & 65535 ) - ; - out[ 17 + outpos] = ( in[ 8 + inpos] >>> 16 ) - ; - out[ 18 + outpos] = (( in[ 9 + inpos] >>> 0 ) & 65535 ) - ; - out[ 19 + outpos] = ( in[ 9 + inpos] >>> 16 ) - ; - out[ 20 + outpos] = (( in[ 10 + inpos] >>> 0 ) & 65535 ) - ; - out[ 21 + outpos] = ( in[ 10 + inpos] >>> 16 ) - ; - out[ 22 + outpos] = (( in[ 11 + inpos] >>> 0 ) & 65535 ) - ; - out[ 23 + outpos] = ( in[ 11 + inpos] >>> 16 ) - ; - out[ 24 + outpos] = (( in[ 12 + inpos] >>> 0 ) & 65535 ) - ; - out[ 25 + outpos] = ( in[ 12 + inpos] >>> 16 ) - ; - out[ 26 + outpos] = (( in[ 13 + inpos] >>> 0 ) & 65535 ) - ; - out[ 27 + outpos] = ( in[ 13 + inpos] >>> 16 ) - ; - out[ 28 + outpos] = (( in[ 14 + inpos] >>> 0 ) & 65535 ) - ; - out[ 29 + outpos] = ( in[ 14 + inpos] >>> 16 ) - ; - out[ 30 + outpos] = (( in[ 15 + inpos] >>> 0 ) & 65535 ) - ; - out[ 31 + outpos] = ( in[ 15 + inpos] >>> 16 ) - ; -} - - - - -public static void fastunpack17(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 131071 ) - ; - out[ 1 + outpos] = ( in[ 0 + inpos] >>> 17 ) - | ((in[ 1 + inpos] & 3 )<<( 17 - 2 )) - ; - out[ 2 + outpos] = (( in[ 1 + inpos] >>> 2 ) & 131071 ) - ; - out[ 3 + outpos] = ( in[ 1 + inpos] >>> 19 ) - | ((in[ 2 + inpos] & 15 )<<( 17 - 4 )) - ; - out[ 4 + outpos] = (( in[ 2 + inpos] >>> 4 ) & 131071 ) - ; - out[ 5 + outpos] = ( in[ 2 + inpos] >>> 21 ) - | ((in[ 3 + inpos] & 63 )<<( 17 - 6 )) - ; - out[ 6 + outpos] = (( in[ 3 + inpos] >>> 6 ) & 131071 ) - ; - out[ 7 + outpos] = ( in[ 3 + inpos] >>> 23 ) - | ((in[ 4 + inpos] & 255 )<<( 17 - 8 )) - ; - out[ 8 + outpos] = (( in[ 4 + inpos] >>> 8 ) & 131071 ) - ; - out[ 9 + outpos] = ( in[ 4 + inpos] >>> 25 ) - | ((in[ 5 + inpos] & 1023 )<<( 17 - 10 )) - ; - out[ 10 + outpos] = (( in[ 5 + inpos] >>> 10 ) & 131071 ) - ; - out[ 11 + outpos] = ( in[ 5 + inpos] >>> 27 ) - | ((in[ 6 + inpos] & 4095 )<<( 17 - 12 )) - ; - out[ 12 + outpos] = (( in[ 6 + inpos] >>> 12 ) & 131071 ) - ; - out[ 13 + outpos] = ( in[ 6 + inpos] >>> 29 ) - | ((in[ 7 + inpos] & 16383 )<<( 17 - 14 )) - ; - out[ 14 + outpos] = (( in[ 7 + inpos] >>> 14 ) & 131071 ) - ; - out[ 15 + outpos] = ( in[ 7 + inpos] >>> 31 ) - | ((in[ 8 + inpos] & 65535 )<<( 17 - 16 )) - ; - out[ 16 + outpos] = ( in[ 8 + inpos] >>> 16 ) - | ((in[ 9 + inpos] & 1 )<<( 17 - 1 )) - ; - out[ 17 + outpos] = (( in[ 9 + inpos] >>> 1 ) & 131071 ) - ; - out[ 18 + outpos] = ( in[ 9 + inpos] >>> 18 ) - | ((in[ 10 + inpos] & 7 )<<( 17 - 3 )) - ; - out[ 19 + outpos] = (( in[ 10 + inpos] >>> 3 ) & 131071 ) - ; - out[ 20 + outpos] = ( in[ 10 + inpos] >>> 20 ) - | ((in[ 11 + inpos] & 31 )<<( 17 - 5 )) - ; - out[ 21 + outpos] = (( in[ 11 + inpos] >>> 5 ) & 131071 ) - ; - out[ 22 + outpos] = ( in[ 11 + inpos] >>> 22 ) - | ((in[ 12 + inpos] & 127 )<<( 17 - 7 )) - ; - out[ 23 + outpos] = (( in[ 12 + inpos] >>> 7 ) & 131071 ) - ; - out[ 24 + outpos] = ( in[ 12 + inpos] >>> 24 ) - | ((in[ 13 + inpos] & 511 )<<( 17 - 9 )) - ; - out[ 25 + outpos] = (( in[ 13 + inpos] >>> 9 ) & 131071 ) - ; - out[ 26 + outpos] = ( in[ 13 + inpos] >>> 26 ) - | ((in[ 14 + inpos] & 2047 )<<( 17 - 11 )) - ; - out[ 27 + outpos] = (( in[ 14 + inpos] >>> 11 ) & 131071 ) - ; - out[ 28 + outpos] = ( in[ 14 + inpos] >>> 28 ) - | ((in[ 15 + inpos] & 8191 )<<( 17 - 13 )) - ; - out[ 29 + outpos] = (( in[ 15 + inpos] >>> 13 ) & 131071 ) - ; - out[ 30 + outpos] = ( in[ 15 + inpos] >>> 30 ) - | ((in[ 16 + inpos] & 32767 )<<( 17 - 15 )) - ; - out[ 31 + outpos] = ( in[ 16 + inpos] >>> 15 ) - ; -} - - - - -public static void fastunpack18(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 262143 ) - ; - out[ 1 + outpos] = ( in[ 0 + inpos] >>> 18 ) - | ((in[ 1 + inpos] & 15 )<<( 18 - 4 )) - ; - out[ 2 + outpos] = (( in[ 1 + inpos] >>> 4 ) & 262143 ) - ; - out[ 3 + outpos] = ( in[ 1 + inpos] >>> 22 ) - | ((in[ 2 + inpos] & 255 )<<( 18 - 8 )) - ; - out[ 4 + outpos] = (( in[ 2 + inpos] >>> 8 ) & 262143 ) - ; - out[ 5 + outpos] = ( in[ 2 + inpos] >>> 26 ) - | ((in[ 3 + inpos] & 4095 )<<( 18 - 12 )) - ; - out[ 6 + outpos] = (( in[ 3 + inpos] >>> 12 ) & 262143 ) - ; - out[ 7 + outpos] = ( in[ 3 + inpos] >>> 30 ) - | ((in[ 4 + inpos] & 65535 )<<( 18 - 16 )) - ; - out[ 8 + outpos] = ( in[ 4 + inpos] >>> 16 ) - | ((in[ 5 + inpos] & 3 )<<( 18 - 2 )) - ; - out[ 9 + outpos] = (( in[ 5 + inpos] >>> 2 ) & 262143 ) - ; - out[ 10 + outpos] = ( in[ 5 + inpos] >>> 20 ) - | ((in[ 6 + inpos] & 63 )<<( 18 - 6 )) - ; - out[ 11 + outpos] = (( in[ 6 + inpos] >>> 6 ) & 262143 ) - ; - out[ 12 + outpos] = ( in[ 6 + inpos] >>> 24 ) - | ((in[ 7 + inpos] & 1023 )<<( 18 - 10 )) - ; - out[ 13 + outpos] = (( in[ 7 + inpos] >>> 10 ) & 262143 ) - ; - out[ 14 + outpos] = ( in[ 7 + inpos] >>> 28 ) - | ((in[ 8 + inpos] & 16383 )<<( 18 - 14 )) - ; - out[ 15 + outpos] = ( in[ 8 + inpos] >>> 14 ) - ; - out[ 16 + outpos] = (( in[ 9 + inpos] >>> 0 ) & 262143 ) - ; - out[ 17 + outpos] = ( in[ 9 + inpos] >>> 18 ) - | ((in[ 10 + inpos] & 15 )<<( 18 - 4 )) - ; - out[ 18 + outpos] = (( in[ 10 + inpos] >>> 4 ) & 262143 ) - ; - out[ 19 + outpos] = ( in[ 10 + inpos] >>> 22 ) - | ((in[ 11 + inpos] & 255 )<<( 18 - 8 )) - ; - out[ 20 + outpos] = (( in[ 11 + inpos] >>> 8 ) & 262143 ) - ; - out[ 21 + outpos] = ( in[ 11 + inpos] >>> 26 ) - | ((in[ 12 + inpos] & 4095 )<<( 18 - 12 )) - ; - out[ 22 + outpos] = (( in[ 12 + inpos] >>> 12 ) & 262143 ) - ; - out[ 23 + outpos] = ( in[ 12 + inpos] >>> 30 ) - | ((in[ 13 + inpos] & 65535 )<<( 18 - 16 )) - ; - out[ 24 + outpos] = ( in[ 13 + inpos] >>> 16 ) - | ((in[ 14 + inpos] & 3 )<<( 18 - 2 )) - ; - out[ 25 + outpos] = (( in[ 14 + inpos] >>> 2 ) & 262143 ) - ; - out[ 26 + outpos] = ( in[ 14 + inpos] >>> 20 ) - | ((in[ 15 + inpos] & 63 )<<( 18 - 6 )) - ; - out[ 27 + outpos] = (( in[ 15 + inpos] >>> 6 ) & 262143 ) - ; - out[ 28 + outpos] = ( in[ 15 + inpos] >>> 24 ) - | ((in[ 16 + inpos] & 1023 )<<( 18 - 10 )) - ; - out[ 29 + outpos] = (( in[ 16 + inpos] >>> 10 ) & 262143 ) - ; - out[ 30 + outpos] = ( in[ 16 + inpos] >>> 28 ) - | ((in[ 17 + inpos] & 16383 )<<( 18 - 14 )) - ; - out[ 31 + outpos] = ( in[ 17 + inpos] >>> 14 ) - ; -} - - - - -public static void fastunpack19(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 524287 ) - ; - out[ 1 + outpos] = ( in[ 0 + inpos] >>> 19 ) - | ((in[ 1 + inpos] & 63 )<<( 19 - 6 )) - ; - out[ 2 + outpos] = (( in[ 1 + inpos] >>> 6 ) & 524287 ) - ; - out[ 3 + outpos] = ( in[ 1 + inpos] >>> 25 ) - | ((in[ 2 + inpos] & 4095 )<<( 19 - 12 )) - ; - out[ 4 + outpos] = (( in[ 2 + inpos] >>> 12 ) & 524287 ) - ; - out[ 5 + outpos] = ( in[ 2 + inpos] >>> 31 ) - | ((in[ 3 + inpos] & 262143 )<<( 19 - 18 )) - ; - out[ 6 + outpos] = ( in[ 3 + inpos] >>> 18 ) - | ((in[ 4 + inpos] & 31 )<<( 19 - 5 )) - ; - out[ 7 + outpos] = (( in[ 4 + inpos] >>> 5 ) & 524287 ) - ; - out[ 8 + outpos] = ( in[ 4 + inpos] >>> 24 ) - | ((in[ 5 + inpos] & 2047 )<<( 19 - 11 )) - ; - out[ 9 + outpos] = (( in[ 5 + inpos] >>> 11 ) & 524287 ) - ; - out[ 10 + outpos] = ( in[ 5 + inpos] >>> 30 ) - | ((in[ 6 + inpos] & 131071 )<<( 19 - 17 )) - ; - out[ 11 + outpos] = ( in[ 6 + inpos] >>> 17 ) - | ((in[ 7 + inpos] & 15 )<<( 19 - 4 )) - ; - out[ 12 + outpos] = (( in[ 7 + inpos] >>> 4 ) & 524287 ) - ; - out[ 13 + outpos] = ( in[ 7 + inpos] >>> 23 ) - | ((in[ 8 + inpos] & 1023 )<<( 19 - 10 )) - ; - out[ 14 + outpos] = (( in[ 8 + inpos] >>> 10 ) & 524287 ) - ; - out[ 15 + outpos] = ( in[ 8 + inpos] >>> 29 ) - | ((in[ 9 + inpos] & 65535 )<<( 19 - 16 )) - ; - out[ 16 + outpos] = ( in[ 9 + inpos] >>> 16 ) - | ((in[ 10 + inpos] & 7 )<<( 19 - 3 )) - ; - out[ 17 + outpos] = (( in[ 10 + inpos] >>> 3 ) & 524287 ) - ; - out[ 18 + outpos] = ( in[ 10 + inpos] >>> 22 ) - | ((in[ 11 + inpos] & 511 )<<( 19 - 9 )) - ; - out[ 19 + outpos] = (( in[ 11 + inpos] >>> 9 ) & 524287 ) - ; - out[ 20 + outpos] = ( in[ 11 + inpos] >>> 28 ) - | ((in[ 12 + inpos] & 32767 )<<( 19 - 15 )) - ; - out[ 21 + outpos] = ( in[ 12 + inpos] >>> 15 ) - | ((in[ 13 + inpos] & 3 )<<( 19 - 2 )) - ; - out[ 22 + outpos] = (( in[ 13 + inpos] >>> 2 ) & 524287 ) - ; - out[ 23 + outpos] = ( in[ 13 + inpos] >>> 21 ) - | ((in[ 14 + inpos] & 255 )<<( 19 - 8 )) - ; - out[ 24 + outpos] = (( in[ 14 + inpos] >>> 8 ) & 524287 ) - ; - out[ 25 + outpos] = ( in[ 14 + inpos] >>> 27 ) - | ((in[ 15 + inpos] & 16383 )<<( 19 - 14 )) - ; - out[ 26 + outpos] = ( in[ 15 + inpos] >>> 14 ) - | ((in[ 16 + inpos] & 1 )<<( 19 - 1 )) - ; - out[ 27 + outpos] = (( in[ 16 + inpos] >>> 1 ) & 524287 ) - ; - out[ 28 + outpos] = ( in[ 16 + inpos] >>> 20 ) - | ((in[ 17 + inpos] & 127 )<<( 19 - 7 )) - ; - out[ 29 + outpos] = (( in[ 17 + inpos] >>> 7 ) & 524287 ) - ; - out[ 30 + outpos] = ( in[ 17 + inpos] >>> 26 ) - | ((in[ 18 + inpos] & 8191 )<<( 19 - 13 )) - ; - out[ 31 + outpos] = ( in[ 18 + inpos] >>> 13 ) - ; -} - - - - -public static void fastunpack20(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 1048575 ) - ; - out[ 1 + outpos] = ( in[ 0 + inpos] >>> 20 ) - | ((in[ 1 + inpos] & 255 )<<( 20 - 8 )) - ; - out[ 2 + outpos] = (( in[ 1 + inpos] >>> 8 ) & 1048575 ) - ; - out[ 3 + outpos] = ( in[ 1 + inpos] >>> 28 ) - | ((in[ 2 + inpos] & 65535 )<<( 20 - 16 )) - ; - out[ 4 + outpos] = ( in[ 2 + inpos] >>> 16 ) - | ((in[ 3 + inpos] & 15 )<<( 20 - 4 )) - ; - out[ 5 + outpos] = (( in[ 3 + inpos] >>> 4 ) & 1048575 ) - ; - out[ 6 + outpos] = ( in[ 3 + inpos] >>> 24 ) - | ((in[ 4 + inpos] & 4095 )<<( 20 - 12 )) - ; - out[ 7 + outpos] = ( in[ 4 + inpos] >>> 12 ) - ; - out[ 8 + outpos] = (( in[ 5 + inpos] >>> 0 ) & 1048575 ) - ; - out[ 9 + outpos] = ( in[ 5 + inpos] >>> 20 ) - | ((in[ 6 + inpos] & 255 )<<( 20 - 8 )) - ; - out[ 10 + outpos] = (( in[ 6 + inpos] >>> 8 ) & 1048575 ) - ; - out[ 11 + outpos] = ( in[ 6 + inpos] >>> 28 ) - | ((in[ 7 + inpos] & 65535 )<<( 20 - 16 )) - ; - out[ 12 + outpos] = ( in[ 7 + inpos] >>> 16 ) - | ((in[ 8 + inpos] & 15 )<<( 20 - 4 )) - ; - out[ 13 + outpos] = (( in[ 8 + inpos] >>> 4 ) & 1048575 ) - ; - out[ 14 + outpos] = ( in[ 8 + inpos] >>> 24 ) - | ((in[ 9 + inpos] & 4095 )<<( 20 - 12 )) - ; - out[ 15 + outpos] = ( in[ 9 + inpos] >>> 12 ) - ; - out[ 16 + outpos] = (( in[ 10 + inpos] >>> 0 ) & 1048575 ) - ; - out[ 17 + outpos] = ( in[ 10 + inpos] >>> 20 ) - | ((in[ 11 + inpos] & 255 )<<( 20 - 8 )) - ; - out[ 18 + outpos] = (( in[ 11 + inpos] >>> 8 ) & 1048575 ) - ; - out[ 19 + outpos] = ( in[ 11 + inpos] >>> 28 ) - | ((in[ 12 + inpos] & 65535 )<<( 20 - 16 )) - ; - out[ 20 + outpos] = ( in[ 12 + inpos] >>> 16 ) - | ((in[ 13 + inpos] & 15 )<<( 20 - 4 )) - ; - out[ 21 + outpos] = (( in[ 13 + inpos] >>> 4 ) & 1048575 ) - ; - out[ 22 + outpos] = ( in[ 13 + inpos] >>> 24 ) - | ((in[ 14 + inpos] & 4095 )<<( 20 - 12 )) - ; - out[ 23 + outpos] = ( in[ 14 + inpos] >>> 12 ) - ; - out[ 24 + outpos] = (( in[ 15 + inpos] >>> 0 ) & 1048575 ) - ; - out[ 25 + outpos] = ( in[ 15 + inpos] >>> 20 ) - | ((in[ 16 + inpos] & 255 )<<( 20 - 8 )) - ; - out[ 26 + outpos] = (( in[ 16 + inpos] >>> 8 ) & 1048575 ) - ; - out[ 27 + outpos] = ( in[ 16 + inpos] >>> 28 ) - | ((in[ 17 + inpos] & 65535 )<<( 20 - 16 )) - ; - out[ 28 + outpos] = ( in[ 17 + inpos] >>> 16 ) - | ((in[ 18 + inpos] & 15 )<<( 20 - 4 )) - ; - out[ 29 + outpos] = (( in[ 18 + inpos] >>> 4 ) & 1048575 ) - ; - out[ 30 + outpos] = ( in[ 18 + inpos] >>> 24 ) - | ((in[ 19 + inpos] & 4095 )<<( 20 - 12 )) - ; - out[ 31 + outpos] = ( in[ 19 + inpos] >>> 12 ) - ; -} - - - - -public static void fastunpack21(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 2097151 ) - ; - out[ 1 + outpos] = ( in[ 0 + inpos] >>> 21 ) - | ((in[ 1 + inpos] & 1023 )<<( 21 - 10 )) - ; - out[ 2 + outpos] = (( in[ 1 + inpos] >>> 10 ) & 2097151 ) - ; - out[ 3 + outpos] = ( in[ 1 + inpos] >>> 31 ) - | ((in[ 2 + inpos] & 1048575 )<<( 21 - 20 )) - ; - out[ 4 + outpos] = ( in[ 2 + inpos] >>> 20 ) - | ((in[ 3 + inpos] & 511 )<<( 21 - 9 )) - ; - out[ 5 + outpos] = (( in[ 3 + inpos] >>> 9 ) & 2097151 ) - ; - out[ 6 + outpos] = ( in[ 3 + inpos] >>> 30 ) - | ((in[ 4 + inpos] & 524287 )<<( 21 - 19 )) - ; - out[ 7 + outpos] = ( in[ 4 + inpos] >>> 19 ) - | ((in[ 5 + inpos] & 255 )<<( 21 - 8 )) - ; - out[ 8 + outpos] = (( in[ 5 + inpos] >>> 8 ) & 2097151 ) - ; - out[ 9 + outpos] = ( in[ 5 + inpos] >>> 29 ) - | ((in[ 6 + inpos] & 262143 )<<( 21 - 18 )) - ; - out[ 10 + outpos] = ( in[ 6 + inpos] >>> 18 ) - | ((in[ 7 + inpos] & 127 )<<( 21 - 7 )) - ; - out[ 11 + outpos] = (( in[ 7 + inpos] >>> 7 ) & 2097151 ) - ; - out[ 12 + outpos] = ( in[ 7 + inpos] >>> 28 ) - | ((in[ 8 + inpos] & 131071 )<<( 21 - 17 )) - ; - out[ 13 + outpos] = ( in[ 8 + inpos] >>> 17 ) - | ((in[ 9 + inpos] & 63 )<<( 21 - 6 )) - ; - out[ 14 + outpos] = (( in[ 9 + inpos] >>> 6 ) & 2097151 ) - ; - out[ 15 + outpos] = ( in[ 9 + inpos] >>> 27 ) - | ((in[ 10 + inpos] & 65535 )<<( 21 - 16 )) - ; - out[ 16 + outpos] = ( in[ 10 + inpos] >>> 16 ) - | ((in[ 11 + inpos] & 31 )<<( 21 - 5 )) - ; - out[ 17 + outpos] = (( in[ 11 + inpos] >>> 5 ) & 2097151 ) - ; - out[ 18 + outpos] = ( in[ 11 + inpos] >>> 26 ) - | ((in[ 12 + inpos] & 32767 )<<( 21 - 15 )) - ; - out[ 19 + outpos] = ( in[ 12 + inpos] >>> 15 ) - | ((in[ 13 + inpos] & 15 )<<( 21 - 4 )) - ; - out[ 20 + outpos] = (( in[ 13 + inpos] >>> 4 ) & 2097151 ) - ; - out[ 21 + outpos] = ( in[ 13 + inpos] >>> 25 ) - | ((in[ 14 + inpos] & 16383 )<<( 21 - 14 )) - ; - out[ 22 + outpos] = ( in[ 14 + inpos] >>> 14 ) - | ((in[ 15 + inpos] & 7 )<<( 21 - 3 )) - ; - out[ 23 + outpos] = (( in[ 15 + inpos] >>> 3 ) & 2097151 ) - ; - out[ 24 + outpos] = ( in[ 15 + inpos] >>> 24 ) - | ((in[ 16 + inpos] & 8191 )<<( 21 - 13 )) - ; - out[ 25 + outpos] = ( in[ 16 + inpos] >>> 13 ) - | ((in[ 17 + inpos] & 3 )<<( 21 - 2 )) - ; - out[ 26 + outpos] = (( in[ 17 + inpos] >>> 2 ) & 2097151 ) - ; - out[ 27 + outpos] = ( in[ 17 + inpos] >>> 23 ) - | ((in[ 18 + inpos] & 4095 )<<( 21 - 12 )) - ; - out[ 28 + outpos] = ( in[ 18 + inpos] >>> 12 ) - | ((in[ 19 + inpos] & 1 )<<( 21 - 1 )) - ; - out[ 29 + outpos] = (( in[ 19 + inpos] >>> 1 ) & 2097151 ) - ; - out[ 30 + outpos] = ( in[ 19 + inpos] >>> 22 ) - | ((in[ 20 + inpos] & 2047 )<<( 21 - 11 )) - ; - out[ 31 + outpos] = ( in[ 20 + inpos] >>> 11 ) - ; -} - - - - -public static void fastunpack22(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 4194303 ) - ; - out[ 1 + outpos] = ( in[ 0 + inpos] >>> 22 ) - | ((in[ 1 + inpos] & 4095 )<<( 22 - 12 )) - ; - out[ 2 + outpos] = ( in[ 1 + inpos] >>> 12 ) - | ((in[ 2 + inpos] & 3 )<<( 22 - 2 )) - ; - out[ 3 + outpos] = (( in[ 2 + inpos] >>> 2 ) & 4194303 ) - ; - out[ 4 + outpos] = ( in[ 2 + inpos] >>> 24 ) - | ((in[ 3 + inpos] & 16383 )<<( 22 - 14 )) - ; - out[ 5 + outpos] = ( in[ 3 + inpos] >>> 14 ) - | ((in[ 4 + inpos] & 15 )<<( 22 - 4 )) - ; - out[ 6 + outpos] = (( in[ 4 + inpos] >>> 4 ) & 4194303 ) - ; - out[ 7 + outpos] = ( in[ 4 + inpos] >>> 26 ) - | ((in[ 5 + inpos] & 65535 )<<( 22 - 16 )) - ; - out[ 8 + outpos] = ( in[ 5 + inpos] >>> 16 ) - | ((in[ 6 + inpos] & 63 )<<( 22 - 6 )) - ; - out[ 9 + outpos] = (( in[ 6 + inpos] >>> 6 ) & 4194303 ) - ; - out[ 10 + outpos] = ( in[ 6 + inpos] >>> 28 ) - | ((in[ 7 + inpos] & 262143 )<<( 22 - 18 )) - ; - out[ 11 + outpos] = ( in[ 7 + inpos] >>> 18 ) - | ((in[ 8 + inpos] & 255 )<<( 22 - 8 )) - ; - out[ 12 + outpos] = (( in[ 8 + inpos] >>> 8 ) & 4194303 ) - ; - out[ 13 + outpos] = ( in[ 8 + inpos] >>> 30 ) - | ((in[ 9 + inpos] & 1048575 )<<( 22 - 20 )) - ; - out[ 14 + outpos] = ( in[ 9 + inpos] >>> 20 ) - | ((in[ 10 + inpos] & 1023 )<<( 22 - 10 )) - ; - out[ 15 + outpos] = ( in[ 10 + inpos] >>> 10 ) - ; - out[ 16 + outpos] = (( in[ 11 + inpos] >>> 0 ) & 4194303 ) - ; - out[ 17 + outpos] = ( in[ 11 + inpos] >>> 22 ) - | ((in[ 12 + inpos] & 4095 )<<( 22 - 12 )) - ; - out[ 18 + outpos] = ( in[ 12 + inpos] >>> 12 ) - | ((in[ 13 + inpos] & 3 )<<( 22 - 2 )) - ; - out[ 19 + outpos] = (( in[ 13 + inpos] >>> 2 ) & 4194303 ) - ; - out[ 20 + outpos] = ( in[ 13 + inpos] >>> 24 ) - | ((in[ 14 + inpos] & 16383 )<<( 22 - 14 )) - ; - out[ 21 + outpos] = ( in[ 14 + inpos] >>> 14 ) - | ((in[ 15 + inpos] & 15 )<<( 22 - 4 )) - ; - out[ 22 + outpos] = (( in[ 15 + inpos] >>> 4 ) & 4194303 ) - ; - out[ 23 + outpos] = ( in[ 15 + inpos] >>> 26 ) - | ((in[ 16 + inpos] & 65535 )<<( 22 - 16 )) - ; - out[ 24 + outpos] = ( in[ 16 + inpos] >>> 16 ) - | ((in[ 17 + inpos] & 63 )<<( 22 - 6 )) - ; - out[ 25 + outpos] = (( in[ 17 + inpos] >>> 6 ) & 4194303 ) - ; - out[ 26 + outpos] = ( in[ 17 + inpos] >>> 28 ) - | ((in[ 18 + inpos] & 262143 )<<( 22 - 18 )) - ; - out[ 27 + outpos] = ( in[ 18 + inpos] >>> 18 ) - | ((in[ 19 + inpos] & 255 )<<( 22 - 8 )) - ; - out[ 28 + outpos] = (( in[ 19 + inpos] >>> 8 ) & 4194303 ) - ; - out[ 29 + outpos] = ( in[ 19 + inpos] >>> 30 ) - | ((in[ 20 + inpos] & 1048575 )<<( 22 - 20 )) - ; - out[ 30 + outpos] = ( in[ 20 + inpos] >>> 20 ) - | ((in[ 21 + inpos] & 1023 )<<( 22 - 10 )) - ; - out[ 31 + outpos] = ( in[ 21 + inpos] >>> 10 ) - ; -} - - - - -public static void fastunpack23(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 8388607 ) - ; - out[ 1 + outpos] = ( in[ 0 + inpos] >>> 23 ) - | ((in[ 1 + inpos] & 16383 )<<( 23 - 14 )) - ; - out[ 2 + outpos] = ( in[ 1 + inpos] >>> 14 ) - | ((in[ 2 + inpos] & 31 )<<( 23 - 5 )) - ; - out[ 3 + outpos] = (( in[ 2 + inpos] >>> 5 ) & 8388607 ) - ; - out[ 4 + outpos] = ( in[ 2 + inpos] >>> 28 ) - | ((in[ 3 + inpos] & 524287 )<<( 23 - 19 )) - ; - out[ 5 + outpos] = ( in[ 3 + inpos] >>> 19 ) - | ((in[ 4 + inpos] & 1023 )<<( 23 - 10 )) - ; - out[ 6 + outpos] = ( in[ 4 + inpos] >>> 10 ) - | ((in[ 5 + inpos] & 1 )<<( 23 - 1 )) - ; - out[ 7 + outpos] = (( in[ 5 + inpos] >>> 1 ) & 8388607 ) - ; - out[ 8 + outpos] = ( in[ 5 + inpos] >>> 24 ) - | ((in[ 6 + inpos] & 32767 )<<( 23 - 15 )) - ; - out[ 9 + outpos] = ( in[ 6 + inpos] >>> 15 ) - | ((in[ 7 + inpos] & 63 )<<( 23 - 6 )) - ; - out[ 10 + outpos] = (( in[ 7 + inpos] >>> 6 ) & 8388607 ) - ; - out[ 11 + outpos] = ( in[ 7 + inpos] >>> 29 ) - | ((in[ 8 + inpos] & 1048575 )<<( 23 - 20 )) - ; - out[ 12 + outpos] = ( in[ 8 + inpos] >>> 20 ) - | ((in[ 9 + inpos] & 2047 )<<( 23 - 11 )) - ; - out[ 13 + outpos] = ( in[ 9 + inpos] >>> 11 ) - | ((in[ 10 + inpos] & 3 )<<( 23 - 2 )) - ; - out[ 14 + outpos] = (( in[ 10 + inpos] >>> 2 ) & 8388607 ) - ; - out[ 15 + outpos] = ( in[ 10 + inpos] >>> 25 ) - | ((in[ 11 + inpos] & 65535 )<<( 23 - 16 )) - ; - out[ 16 + outpos] = ( in[ 11 + inpos] >>> 16 ) - | ((in[ 12 + inpos] & 127 )<<( 23 - 7 )) - ; - out[ 17 + outpos] = (( in[ 12 + inpos] >>> 7 ) & 8388607 ) - ; - out[ 18 + outpos] = ( in[ 12 + inpos] >>> 30 ) - | ((in[ 13 + inpos] & 2097151 )<<( 23 - 21 )) - ; - out[ 19 + outpos] = ( in[ 13 + inpos] >>> 21 ) - | ((in[ 14 + inpos] & 4095 )<<( 23 - 12 )) - ; - out[ 20 + outpos] = ( in[ 14 + inpos] >>> 12 ) - | ((in[ 15 + inpos] & 7 )<<( 23 - 3 )) - ; - out[ 21 + outpos] = (( in[ 15 + inpos] >>> 3 ) & 8388607 ) - ; - out[ 22 + outpos] = ( in[ 15 + inpos] >>> 26 ) - | ((in[ 16 + inpos] & 131071 )<<( 23 - 17 )) - ; - out[ 23 + outpos] = ( in[ 16 + inpos] >>> 17 ) - | ((in[ 17 + inpos] & 255 )<<( 23 - 8 )) - ; - out[ 24 + outpos] = (( in[ 17 + inpos] >>> 8 ) & 8388607 ) - ; - out[ 25 + outpos] = ( in[ 17 + inpos] >>> 31 ) - | ((in[ 18 + inpos] & 4194303 )<<( 23 - 22 )) - ; - out[ 26 + outpos] = ( in[ 18 + inpos] >>> 22 ) - | ((in[ 19 + inpos] & 8191 )<<( 23 - 13 )) - ; - out[ 27 + outpos] = ( in[ 19 + inpos] >>> 13 ) - | ((in[ 20 + inpos] & 15 )<<( 23 - 4 )) - ; - out[ 28 + outpos] = (( in[ 20 + inpos] >>> 4 ) & 8388607 ) - ; - out[ 29 + outpos] = ( in[ 20 + inpos] >>> 27 ) - | ((in[ 21 + inpos] & 262143 )<<( 23 - 18 )) - ; - out[ 30 + outpos] = ( in[ 21 + inpos] >>> 18 ) - | ((in[ 22 + inpos] & 511 )<<( 23 - 9 )) - ; - out[ 31 + outpos] = ( in[ 22 + inpos] >>> 9 ) - ; -} - - - - -public static void fastunpack24(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 16777215 ) - ; - out[ 1 + outpos] = ( in[ 0 + inpos] >>> 24 ) - | ((in[ 1 + inpos] & 65535 )<<( 24 - 16 )) - ; - out[ 2 + outpos] = ( in[ 1 + inpos] >>> 16 ) - | ((in[ 2 + inpos] & 255 )<<( 24 - 8 )) - ; - out[ 3 + outpos] = ( in[ 2 + inpos] >>> 8 ) - ; - out[ 4 + outpos] = (( in[ 3 + inpos] >>> 0 ) & 16777215 ) - ; - out[ 5 + outpos] = ( in[ 3 + inpos] >>> 24 ) - | ((in[ 4 + inpos] & 65535 )<<( 24 - 16 )) - ; - out[ 6 + outpos] = ( in[ 4 + inpos] >>> 16 ) - | ((in[ 5 + inpos] & 255 )<<( 24 - 8 )) - ; - out[ 7 + outpos] = ( in[ 5 + inpos] >>> 8 ) - ; - out[ 8 + outpos] = (( in[ 6 + inpos] >>> 0 ) & 16777215 ) - ; - out[ 9 + outpos] = ( in[ 6 + inpos] >>> 24 ) - | ((in[ 7 + inpos] & 65535 )<<( 24 - 16 )) - ; - out[ 10 + outpos] = ( in[ 7 + inpos] >>> 16 ) - | ((in[ 8 + inpos] & 255 )<<( 24 - 8 )) - ; - out[ 11 + outpos] = ( in[ 8 + inpos] >>> 8 ) - ; - out[ 12 + outpos] = (( in[ 9 + inpos] >>> 0 ) & 16777215 ) - ; - out[ 13 + outpos] = ( in[ 9 + inpos] >>> 24 ) - | ((in[ 10 + inpos] & 65535 )<<( 24 - 16 )) - ; - out[ 14 + outpos] = ( in[ 10 + inpos] >>> 16 ) - | ((in[ 11 + inpos] & 255 )<<( 24 - 8 )) - ; - out[ 15 + outpos] = ( in[ 11 + inpos] >>> 8 ) - ; - out[ 16 + outpos] = (( in[ 12 + inpos] >>> 0 ) & 16777215 ) - ; - out[ 17 + outpos] = ( in[ 12 + inpos] >>> 24 ) - | ((in[ 13 + inpos] & 65535 )<<( 24 - 16 )) - ; - out[ 18 + outpos] = ( in[ 13 + inpos] >>> 16 ) - | ((in[ 14 + inpos] & 255 )<<( 24 - 8 )) - ; - out[ 19 + outpos] = ( in[ 14 + inpos] >>> 8 ) - ; - out[ 20 + outpos] = (( in[ 15 + inpos] >>> 0 ) & 16777215 ) - ; - out[ 21 + outpos] = ( in[ 15 + inpos] >>> 24 ) - | ((in[ 16 + inpos] & 65535 )<<( 24 - 16 )) - ; - out[ 22 + outpos] = ( in[ 16 + inpos] >>> 16 ) - | ((in[ 17 + inpos] & 255 )<<( 24 - 8 )) - ; - out[ 23 + outpos] = ( in[ 17 + inpos] >>> 8 ) - ; - out[ 24 + outpos] = (( in[ 18 + inpos] >>> 0 ) & 16777215 ) - ; - out[ 25 + outpos] = ( in[ 18 + inpos] >>> 24 ) - | ((in[ 19 + inpos] & 65535 )<<( 24 - 16 )) - ; - out[ 26 + outpos] = ( in[ 19 + inpos] >>> 16 ) - | ((in[ 20 + inpos] & 255 )<<( 24 - 8 )) - ; - out[ 27 + outpos] = ( in[ 20 + inpos] >>> 8 ) - ; - out[ 28 + outpos] = (( in[ 21 + inpos] >>> 0 ) & 16777215 ) - ; - out[ 29 + outpos] = ( in[ 21 + inpos] >>> 24 ) - | ((in[ 22 + inpos] & 65535 )<<( 24 - 16 )) - ; - out[ 30 + outpos] = ( in[ 22 + inpos] >>> 16 ) - | ((in[ 23 + inpos] & 255 )<<( 24 - 8 )) - ; - out[ 31 + outpos] = ( in[ 23 + inpos] >>> 8 ) - ; -} - - - - -public static void fastunpack25(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 33554431 ) - ; - out[ 1 + outpos] = ( in[ 0 + inpos] >>> 25 ) - | ((in[ 1 + inpos] & 262143 )<<( 25 - 18 )) - ; - out[ 2 + outpos] = ( in[ 1 + inpos] >>> 18 ) - | ((in[ 2 + inpos] & 2047 )<<( 25 - 11 )) - ; - out[ 3 + outpos] = ( in[ 2 + inpos] >>> 11 ) - | ((in[ 3 + inpos] & 15 )<<( 25 - 4 )) - ; - out[ 4 + outpos] = (( in[ 3 + inpos] >>> 4 ) & 33554431 ) - ; - out[ 5 + outpos] = ( in[ 3 + inpos] >>> 29 ) - | ((in[ 4 + inpos] & 4194303 )<<( 25 - 22 )) - ; - out[ 6 + outpos] = ( in[ 4 + inpos] >>> 22 ) - | ((in[ 5 + inpos] & 32767 )<<( 25 - 15 )) - ; - out[ 7 + outpos] = ( in[ 5 + inpos] >>> 15 ) - | ((in[ 6 + inpos] & 255 )<<( 25 - 8 )) - ; - out[ 8 + outpos] = ( in[ 6 + inpos] >>> 8 ) - | ((in[ 7 + inpos] & 1 )<<( 25 - 1 )) - ; - out[ 9 + outpos] = (( in[ 7 + inpos] >>> 1 ) & 33554431 ) - ; - out[ 10 + outpos] = ( in[ 7 + inpos] >>> 26 ) - | ((in[ 8 + inpos] & 524287 )<<( 25 - 19 )) - ; - out[ 11 + outpos] = ( in[ 8 + inpos] >>> 19 ) - | ((in[ 9 + inpos] & 4095 )<<( 25 - 12 )) - ; - out[ 12 + outpos] = ( in[ 9 + inpos] >>> 12 ) - | ((in[ 10 + inpos] & 31 )<<( 25 - 5 )) - ; - out[ 13 + outpos] = (( in[ 10 + inpos] >>> 5 ) & 33554431 ) - ; - out[ 14 + outpos] = ( in[ 10 + inpos] >>> 30 ) - | ((in[ 11 + inpos] & 8388607 )<<( 25 - 23 )) - ; - out[ 15 + outpos] = ( in[ 11 + inpos] >>> 23 ) - | ((in[ 12 + inpos] & 65535 )<<( 25 - 16 )) - ; - out[ 16 + outpos] = ( in[ 12 + inpos] >>> 16 ) - | ((in[ 13 + inpos] & 511 )<<( 25 - 9 )) - ; - out[ 17 + outpos] = ( in[ 13 + inpos] >>> 9 ) - | ((in[ 14 + inpos] & 3 )<<( 25 - 2 )) - ; - out[ 18 + outpos] = (( in[ 14 + inpos] >>> 2 ) & 33554431 ) - ; - out[ 19 + outpos] = ( in[ 14 + inpos] >>> 27 ) - | ((in[ 15 + inpos] & 1048575 )<<( 25 - 20 )) - ; - out[ 20 + outpos] = ( in[ 15 + inpos] >>> 20 ) - | ((in[ 16 + inpos] & 8191 )<<( 25 - 13 )) - ; - out[ 21 + outpos] = ( in[ 16 + inpos] >>> 13 ) - | ((in[ 17 + inpos] & 63 )<<( 25 - 6 )) - ; - out[ 22 + outpos] = (( in[ 17 + inpos] >>> 6 ) & 33554431 ) - ; - out[ 23 + outpos] = ( in[ 17 + inpos] >>> 31 ) - | ((in[ 18 + inpos] & 16777215 )<<( 25 - 24 )) - ; - out[ 24 + outpos] = ( in[ 18 + inpos] >>> 24 ) - | ((in[ 19 + inpos] & 131071 )<<( 25 - 17 )) - ; - out[ 25 + outpos] = ( in[ 19 + inpos] >>> 17 ) - | ((in[ 20 + inpos] & 1023 )<<( 25 - 10 )) - ; - out[ 26 + outpos] = ( in[ 20 + inpos] >>> 10 ) - | ((in[ 21 + inpos] & 7 )<<( 25 - 3 )) - ; - out[ 27 + outpos] = (( in[ 21 + inpos] >>> 3 ) & 33554431 ) - ; - out[ 28 + outpos] = ( in[ 21 + inpos] >>> 28 ) - | ((in[ 22 + inpos] & 2097151 )<<( 25 - 21 )) - ; - out[ 29 + outpos] = ( in[ 22 + inpos] >>> 21 ) - | ((in[ 23 + inpos] & 16383 )<<( 25 - 14 )) - ; - out[ 30 + outpos] = ( in[ 23 + inpos] >>> 14 ) - | ((in[ 24 + inpos] & 127 )<<( 25 - 7 )) - ; - out[ 31 + outpos] = ( in[ 24 + inpos] >>> 7 ) - ; -} - - - - -public static void fastunpack26(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 67108863 ) - ; - out[ 1 + outpos] = ( in[ 0 + inpos] >>> 26 ) - | ((in[ 1 + inpos] & 1048575 )<<( 26 - 20 )) - ; - out[ 2 + outpos] = ( in[ 1 + inpos] >>> 20 ) - | ((in[ 2 + inpos] & 16383 )<<( 26 - 14 )) - ; - out[ 3 + outpos] = ( in[ 2 + inpos] >>> 14 ) - | ((in[ 3 + inpos] & 255 )<<( 26 - 8 )) - ; - out[ 4 + outpos] = ( in[ 3 + inpos] >>> 8 ) - | ((in[ 4 + inpos] & 3 )<<( 26 - 2 )) - ; - out[ 5 + outpos] = (( in[ 4 + inpos] >>> 2 ) & 67108863 ) - ; - out[ 6 + outpos] = ( in[ 4 + inpos] >>> 28 ) - | ((in[ 5 + inpos] & 4194303 )<<( 26 - 22 )) - ; - out[ 7 + outpos] = ( in[ 5 + inpos] >>> 22 ) - | ((in[ 6 + inpos] & 65535 )<<( 26 - 16 )) - ; - out[ 8 + outpos] = ( in[ 6 + inpos] >>> 16 ) - | ((in[ 7 + inpos] & 1023 )<<( 26 - 10 )) - ; - out[ 9 + outpos] = ( in[ 7 + inpos] >>> 10 ) - | ((in[ 8 + inpos] & 15 )<<( 26 - 4 )) - ; - out[ 10 + outpos] = (( in[ 8 + inpos] >>> 4 ) & 67108863 ) - ; - out[ 11 + outpos] = ( in[ 8 + inpos] >>> 30 ) - | ((in[ 9 + inpos] & 16777215 )<<( 26 - 24 )) - ; - out[ 12 + outpos] = ( in[ 9 + inpos] >>> 24 ) - | ((in[ 10 + inpos] & 262143 )<<( 26 - 18 )) - ; - out[ 13 + outpos] = ( in[ 10 + inpos] >>> 18 ) - | ((in[ 11 + inpos] & 4095 )<<( 26 - 12 )) - ; - out[ 14 + outpos] = ( in[ 11 + inpos] >>> 12 ) - | ((in[ 12 + inpos] & 63 )<<( 26 - 6 )) - ; - out[ 15 + outpos] = ( in[ 12 + inpos] >>> 6 ) - ; - out[ 16 + outpos] = (( in[ 13 + inpos] >>> 0 ) & 67108863 ) - ; - out[ 17 + outpos] = ( in[ 13 + inpos] >>> 26 ) - | ((in[ 14 + inpos] & 1048575 )<<( 26 - 20 )) - ; - out[ 18 + outpos] = ( in[ 14 + inpos] >>> 20 ) - | ((in[ 15 + inpos] & 16383 )<<( 26 - 14 )) - ; - out[ 19 + outpos] = ( in[ 15 + inpos] >>> 14 ) - | ((in[ 16 + inpos] & 255 )<<( 26 - 8 )) - ; - out[ 20 + outpos] = ( in[ 16 + inpos] >>> 8 ) - | ((in[ 17 + inpos] & 3 )<<( 26 - 2 )) - ; - out[ 21 + outpos] = (( in[ 17 + inpos] >>> 2 ) & 67108863 ) - ; - out[ 22 + outpos] = ( in[ 17 + inpos] >>> 28 ) - | ((in[ 18 + inpos] & 4194303 )<<( 26 - 22 )) - ; - out[ 23 + outpos] = ( in[ 18 + inpos] >>> 22 ) - | ((in[ 19 + inpos] & 65535 )<<( 26 - 16 )) - ; - out[ 24 + outpos] = ( in[ 19 + inpos] >>> 16 ) - | ((in[ 20 + inpos] & 1023 )<<( 26 - 10 )) - ; - out[ 25 + outpos] = ( in[ 20 + inpos] >>> 10 ) - | ((in[ 21 + inpos] & 15 )<<( 26 - 4 )) - ; - out[ 26 + outpos] = (( in[ 21 + inpos] >>> 4 ) & 67108863 ) - ; - out[ 27 + outpos] = ( in[ 21 + inpos] >>> 30 ) - | ((in[ 22 + inpos] & 16777215 )<<( 26 - 24 )) - ; - out[ 28 + outpos] = ( in[ 22 + inpos] >>> 24 ) - | ((in[ 23 + inpos] & 262143 )<<( 26 - 18 )) - ; - out[ 29 + outpos] = ( in[ 23 + inpos] >>> 18 ) - | ((in[ 24 + inpos] & 4095 )<<( 26 - 12 )) - ; - out[ 30 + outpos] = ( in[ 24 + inpos] >>> 12 ) - | ((in[ 25 + inpos] & 63 )<<( 26 - 6 )) - ; - out[ 31 + outpos] = ( in[ 25 + inpos] >>> 6 ) - ; -} - - - - -public static void fastunpack27(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 134217727 ) - ; - out[ 1 + outpos] = ( in[ 0 + inpos] >>> 27 ) - | ((in[ 1 + inpos] & 4194303 )<<( 27 - 22 )) - ; - out[ 2 + outpos] = ( in[ 1 + inpos] >>> 22 ) - | ((in[ 2 + inpos] & 131071 )<<( 27 - 17 )) - ; - out[ 3 + outpos] = ( in[ 2 + inpos] >>> 17 ) - | ((in[ 3 + inpos] & 4095 )<<( 27 - 12 )) - ; - out[ 4 + outpos] = ( in[ 3 + inpos] >>> 12 ) - | ((in[ 4 + inpos] & 127 )<<( 27 - 7 )) - ; - out[ 5 + outpos] = ( in[ 4 + inpos] >>> 7 ) - | ((in[ 5 + inpos] & 3 )<<( 27 - 2 )) - ; - out[ 6 + outpos] = (( in[ 5 + inpos] >>> 2 ) & 134217727 ) - ; - out[ 7 + outpos] = ( in[ 5 + inpos] >>> 29 ) - | ((in[ 6 + inpos] & 16777215 )<<( 27 - 24 )) - ; - out[ 8 + outpos] = ( in[ 6 + inpos] >>> 24 ) - | ((in[ 7 + inpos] & 524287 )<<( 27 - 19 )) - ; - out[ 9 + outpos] = ( in[ 7 + inpos] >>> 19 ) - | ((in[ 8 + inpos] & 16383 )<<( 27 - 14 )) - ; - out[ 10 + outpos] = ( in[ 8 + inpos] >>> 14 ) - | ((in[ 9 + inpos] & 511 )<<( 27 - 9 )) - ; - out[ 11 + outpos] = ( in[ 9 + inpos] >>> 9 ) - | ((in[ 10 + inpos] & 15 )<<( 27 - 4 )) - ; - out[ 12 + outpos] = (( in[ 10 + inpos] >>> 4 ) & 134217727 ) - ; - out[ 13 + outpos] = ( in[ 10 + inpos] >>> 31 ) - | ((in[ 11 + inpos] & 67108863 )<<( 27 - 26 )) - ; - out[ 14 + outpos] = ( in[ 11 + inpos] >>> 26 ) - | ((in[ 12 + inpos] & 2097151 )<<( 27 - 21 )) - ; - out[ 15 + outpos] = ( in[ 12 + inpos] >>> 21 ) - | ((in[ 13 + inpos] & 65535 )<<( 27 - 16 )) - ; - out[ 16 + outpos] = ( in[ 13 + inpos] >>> 16 ) - | ((in[ 14 + inpos] & 2047 )<<( 27 - 11 )) - ; - out[ 17 + outpos] = ( in[ 14 + inpos] >>> 11 ) - | ((in[ 15 + inpos] & 63 )<<( 27 - 6 )) - ; - out[ 18 + outpos] = ( in[ 15 + inpos] >>> 6 ) - | ((in[ 16 + inpos] & 1 )<<( 27 - 1 )) - ; - out[ 19 + outpos] = (( in[ 16 + inpos] >>> 1 ) & 134217727 ) - ; - out[ 20 + outpos] = ( in[ 16 + inpos] >>> 28 ) - | ((in[ 17 + inpos] & 8388607 )<<( 27 - 23 )) - ; - out[ 21 + outpos] = ( in[ 17 + inpos] >>> 23 ) - | ((in[ 18 + inpos] & 262143 )<<( 27 - 18 )) - ; - out[ 22 + outpos] = ( in[ 18 + inpos] >>> 18 ) - | ((in[ 19 + inpos] & 8191 )<<( 27 - 13 )) - ; - out[ 23 + outpos] = ( in[ 19 + inpos] >>> 13 ) - | ((in[ 20 + inpos] & 255 )<<( 27 - 8 )) - ; - out[ 24 + outpos] = ( in[ 20 + inpos] >>> 8 ) - | ((in[ 21 + inpos] & 7 )<<( 27 - 3 )) - ; - out[ 25 + outpos] = (( in[ 21 + inpos] >>> 3 ) & 134217727 ) - ; - out[ 26 + outpos] = ( in[ 21 + inpos] >>> 30 ) - | ((in[ 22 + inpos] & 33554431 )<<( 27 - 25 )) - ; - out[ 27 + outpos] = ( in[ 22 + inpos] >>> 25 ) - | ((in[ 23 + inpos] & 1048575 )<<( 27 - 20 )) - ; - out[ 28 + outpos] = ( in[ 23 + inpos] >>> 20 ) - | ((in[ 24 + inpos] & 32767 )<<( 27 - 15 )) - ; - out[ 29 + outpos] = ( in[ 24 + inpos] >>> 15 ) - | ((in[ 25 + inpos] & 1023 )<<( 27 - 10 )) - ; - out[ 30 + outpos] = ( in[ 25 + inpos] >>> 10 ) - | ((in[ 26 + inpos] & 31 )<<( 27 - 5 )) - ; - out[ 31 + outpos] = ( in[ 26 + inpos] >>> 5 ) - ; -} - - - - -public static void fastunpack28(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 268435455 ) - ; - out[ 1 + outpos] = ( in[ 0 + inpos] >>> 28 ) - | ((in[ 1 + inpos] & 16777215 )<<( 28 - 24 )) - ; - out[ 2 + outpos] = ( in[ 1 + inpos] >>> 24 ) - | ((in[ 2 + inpos] & 1048575 )<<( 28 - 20 )) - ; - out[ 3 + outpos] = ( in[ 2 + inpos] >>> 20 ) - | ((in[ 3 + inpos] & 65535 )<<( 28 - 16 )) - ; - out[ 4 + outpos] = ( in[ 3 + inpos] >>> 16 ) - | ((in[ 4 + inpos] & 4095 )<<( 28 - 12 )) - ; - out[ 5 + outpos] = ( in[ 4 + inpos] >>> 12 ) - | ((in[ 5 + inpos] & 255 )<<( 28 - 8 )) - ; - out[ 6 + outpos] = ( in[ 5 + inpos] >>> 8 ) - | ((in[ 6 + inpos] & 15 )<<( 28 - 4 )) - ; - out[ 7 + outpos] = ( in[ 6 + inpos] >>> 4 ) - ; - out[ 8 + outpos] = (( in[ 7 + inpos] >>> 0 ) & 268435455 ) - ; - out[ 9 + outpos] = ( in[ 7 + inpos] >>> 28 ) - | ((in[ 8 + inpos] & 16777215 )<<( 28 - 24 )) - ; - out[ 10 + outpos] = ( in[ 8 + inpos] >>> 24 ) - | ((in[ 9 + inpos] & 1048575 )<<( 28 - 20 )) - ; - out[ 11 + outpos] = ( in[ 9 + inpos] >>> 20 ) - | ((in[ 10 + inpos] & 65535 )<<( 28 - 16 )) - ; - out[ 12 + outpos] = ( in[ 10 + inpos] >>> 16 ) - | ((in[ 11 + inpos] & 4095 )<<( 28 - 12 )) - ; - out[ 13 + outpos] = ( in[ 11 + inpos] >>> 12 ) - | ((in[ 12 + inpos] & 255 )<<( 28 - 8 )) - ; - out[ 14 + outpos] = ( in[ 12 + inpos] >>> 8 ) - | ((in[ 13 + inpos] & 15 )<<( 28 - 4 )) - ; - out[ 15 + outpos] = ( in[ 13 + inpos] >>> 4 ) - ; - out[ 16 + outpos] = (( in[ 14 + inpos] >>> 0 ) & 268435455 ) - ; - out[ 17 + outpos] = ( in[ 14 + inpos] >>> 28 ) - | ((in[ 15 + inpos] & 16777215 )<<( 28 - 24 )) - ; - out[ 18 + outpos] = ( in[ 15 + inpos] >>> 24 ) - | ((in[ 16 + inpos] & 1048575 )<<( 28 - 20 )) - ; - out[ 19 + outpos] = ( in[ 16 + inpos] >>> 20 ) - | ((in[ 17 + inpos] & 65535 )<<( 28 - 16 )) - ; - out[ 20 + outpos] = ( in[ 17 + inpos] >>> 16 ) - | ((in[ 18 + inpos] & 4095 )<<( 28 - 12 )) - ; - out[ 21 + outpos] = ( in[ 18 + inpos] >>> 12 ) - | ((in[ 19 + inpos] & 255 )<<( 28 - 8 )) - ; - out[ 22 + outpos] = ( in[ 19 + inpos] >>> 8 ) - | ((in[ 20 + inpos] & 15 )<<( 28 - 4 )) - ; - out[ 23 + outpos] = ( in[ 20 + inpos] >>> 4 ) - ; - out[ 24 + outpos] = (( in[ 21 + inpos] >>> 0 ) & 268435455 ) - ; - out[ 25 + outpos] = ( in[ 21 + inpos] >>> 28 ) - | ((in[ 22 + inpos] & 16777215 )<<( 28 - 24 )) - ; - out[ 26 + outpos] = ( in[ 22 + inpos] >>> 24 ) - | ((in[ 23 + inpos] & 1048575 )<<( 28 - 20 )) - ; - out[ 27 + outpos] = ( in[ 23 + inpos] >>> 20 ) - | ((in[ 24 + inpos] & 65535 )<<( 28 - 16 )) - ; - out[ 28 + outpos] = ( in[ 24 + inpos] >>> 16 ) - | ((in[ 25 + inpos] & 4095 )<<( 28 - 12 )) - ; - out[ 29 + outpos] = ( in[ 25 + inpos] >>> 12 ) - | ((in[ 26 + inpos] & 255 )<<( 28 - 8 )) - ; - out[ 30 + outpos] = ( in[ 26 + inpos] >>> 8 ) - | ((in[ 27 + inpos] & 15 )<<( 28 - 4 )) - ; - out[ 31 + outpos] = ( in[ 27 + inpos] >>> 4 ) - ; -} - - - - -public static void fastunpack29(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 536870911 ) - ; - out[ 1 + outpos] = ( in[ 0 + inpos] >>> 29 ) - | ((in[ 1 + inpos] & 67108863 )<<( 29 - 26 )) - ; - out[ 2 + outpos] = ( in[ 1 + inpos] >>> 26 ) - | ((in[ 2 + inpos] & 8388607 )<<( 29 - 23 )) - ; - out[ 3 + outpos] = ( in[ 2 + inpos] >>> 23 ) - | ((in[ 3 + inpos] & 1048575 )<<( 29 - 20 )) - ; - out[ 4 + outpos] = ( in[ 3 + inpos] >>> 20 ) - | ((in[ 4 + inpos] & 131071 )<<( 29 - 17 )) - ; - out[ 5 + outpos] = ( in[ 4 + inpos] >>> 17 ) - | ((in[ 5 + inpos] & 16383 )<<( 29 - 14 )) - ; - out[ 6 + outpos] = ( in[ 5 + inpos] >>> 14 ) - | ((in[ 6 + inpos] & 2047 )<<( 29 - 11 )) - ; - out[ 7 + outpos] = ( in[ 6 + inpos] >>> 11 ) - | ((in[ 7 + inpos] & 255 )<<( 29 - 8 )) - ; - out[ 8 + outpos] = ( in[ 7 + inpos] >>> 8 ) - | ((in[ 8 + inpos] & 31 )<<( 29 - 5 )) - ; - out[ 9 + outpos] = ( in[ 8 + inpos] >>> 5 ) - | ((in[ 9 + inpos] & 3 )<<( 29 - 2 )) - ; - out[ 10 + outpos] = (( in[ 9 + inpos] >>> 2 ) & 536870911 ) - ; - out[ 11 + outpos] = ( in[ 9 + inpos] >>> 31 ) - | ((in[ 10 + inpos] & 268435455 )<<( 29 - 28 )) - ; - out[ 12 + outpos] = ( in[ 10 + inpos] >>> 28 ) - | ((in[ 11 + inpos] & 33554431 )<<( 29 - 25 )) - ; - out[ 13 + outpos] = ( in[ 11 + inpos] >>> 25 ) - | ((in[ 12 + inpos] & 4194303 )<<( 29 - 22 )) - ; - out[ 14 + outpos] = ( in[ 12 + inpos] >>> 22 ) - | ((in[ 13 + inpos] & 524287 )<<( 29 - 19 )) - ; - out[ 15 + outpos] = ( in[ 13 + inpos] >>> 19 ) - | ((in[ 14 + inpos] & 65535 )<<( 29 - 16 )) - ; - out[ 16 + outpos] = ( in[ 14 + inpos] >>> 16 ) - | ((in[ 15 + inpos] & 8191 )<<( 29 - 13 )) - ; - out[ 17 + outpos] = ( in[ 15 + inpos] >>> 13 ) - | ((in[ 16 + inpos] & 1023 )<<( 29 - 10 )) - ; - out[ 18 + outpos] = ( in[ 16 + inpos] >>> 10 ) - | ((in[ 17 + inpos] & 127 )<<( 29 - 7 )) - ; - out[ 19 + outpos] = ( in[ 17 + inpos] >>> 7 ) - | ((in[ 18 + inpos] & 15 )<<( 29 - 4 )) - ; - out[ 20 + outpos] = ( in[ 18 + inpos] >>> 4 ) - | ((in[ 19 + inpos] & 1 )<<( 29 - 1 )) - ; - out[ 21 + outpos] = (( in[ 19 + inpos] >>> 1 ) & 536870911 ) - ; - out[ 22 + outpos] = ( in[ 19 + inpos] >>> 30 ) - | ((in[ 20 + inpos] & 134217727 )<<( 29 - 27 )) - ; - out[ 23 + outpos] = ( in[ 20 + inpos] >>> 27 ) - | ((in[ 21 + inpos] & 16777215 )<<( 29 - 24 )) - ; - out[ 24 + outpos] = ( in[ 21 + inpos] >>> 24 ) - | ((in[ 22 + inpos] & 2097151 )<<( 29 - 21 )) - ; - out[ 25 + outpos] = ( in[ 22 + inpos] >>> 21 ) - | ((in[ 23 + inpos] & 262143 )<<( 29 - 18 )) - ; - out[ 26 + outpos] = ( in[ 23 + inpos] >>> 18 ) - | ((in[ 24 + inpos] & 32767 )<<( 29 - 15 )) - ; - out[ 27 + outpos] = ( in[ 24 + inpos] >>> 15 ) - | ((in[ 25 + inpos] & 4095 )<<( 29 - 12 )) - ; - out[ 28 + outpos] = ( in[ 25 + inpos] >>> 12 ) - | ((in[ 26 + inpos] & 511 )<<( 29 - 9 )) - ; - out[ 29 + outpos] = ( in[ 26 + inpos] >>> 9 ) - | ((in[ 27 + inpos] & 63 )<<( 29 - 6 )) - ; - out[ 30 + outpos] = ( in[ 27 + inpos] >>> 6 ) - | ((in[ 28 + inpos] & 7 )<<( 29 - 3 )) - ; - out[ 31 + outpos] = ( in[ 28 + inpos] >>> 3 ) - ; -} - - - - -public static void fastunpack30(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 1073741823 ) - ; - out[ 1 + outpos] = ( in[ 0 + inpos] >>> 30 ) - | ((in[ 1 + inpos] & 268435455 )<<( 30 - 28 )) - ; - out[ 2 + outpos] = ( in[ 1 + inpos] >>> 28 ) - | ((in[ 2 + inpos] & 67108863 )<<( 30 - 26 )) - ; - out[ 3 + outpos] = ( in[ 2 + inpos] >>> 26 ) - | ((in[ 3 + inpos] & 16777215 )<<( 30 - 24 )) - ; - out[ 4 + outpos] = ( in[ 3 + inpos] >>> 24 ) - | ((in[ 4 + inpos] & 4194303 )<<( 30 - 22 )) - ; - out[ 5 + outpos] = ( in[ 4 + inpos] >>> 22 ) - | ((in[ 5 + inpos] & 1048575 )<<( 30 - 20 )) - ; - out[ 6 + outpos] = ( in[ 5 + inpos] >>> 20 ) - | ((in[ 6 + inpos] & 262143 )<<( 30 - 18 )) - ; - out[ 7 + outpos] = ( in[ 6 + inpos] >>> 18 ) - | ((in[ 7 + inpos] & 65535 )<<( 30 - 16 )) - ; - out[ 8 + outpos] = ( in[ 7 + inpos] >>> 16 ) - | ((in[ 8 + inpos] & 16383 )<<( 30 - 14 )) - ; - out[ 9 + outpos] = ( in[ 8 + inpos] >>> 14 ) - | ((in[ 9 + inpos] & 4095 )<<( 30 - 12 )) - ; - out[ 10 + outpos] = ( in[ 9 + inpos] >>> 12 ) - | ((in[ 10 + inpos] & 1023 )<<( 30 - 10 )) - ; - out[ 11 + outpos] = ( in[ 10 + inpos] >>> 10 ) - | ((in[ 11 + inpos] & 255 )<<( 30 - 8 )) - ; - out[ 12 + outpos] = ( in[ 11 + inpos] >>> 8 ) - | ((in[ 12 + inpos] & 63 )<<( 30 - 6 )) - ; - out[ 13 + outpos] = ( in[ 12 + inpos] >>> 6 ) - | ((in[ 13 + inpos] & 15 )<<( 30 - 4 )) - ; - out[ 14 + outpos] = ( in[ 13 + inpos] >>> 4 ) - | ((in[ 14 + inpos] & 3 )<<( 30 - 2 )) - ; - out[ 15 + outpos] = ( in[ 14 + inpos] >>> 2 ) - ; - out[ 16 + outpos] = (( in[ 15 + inpos] >>> 0 ) & 1073741823 ) - ; - out[ 17 + outpos] = ( in[ 15 + inpos] >>> 30 ) - | ((in[ 16 + inpos] & 268435455 )<<( 30 - 28 )) - ; - out[ 18 + outpos] = ( in[ 16 + inpos] >>> 28 ) - | ((in[ 17 + inpos] & 67108863 )<<( 30 - 26 )) - ; - out[ 19 + outpos] = ( in[ 17 + inpos] >>> 26 ) - | ((in[ 18 + inpos] & 16777215 )<<( 30 - 24 )) - ; - out[ 20 + outpos] = ( in[ 18 + inpos] >>> 24 ) - | ((in[ 19 + inpos] & 4194303 )<<( 30 - 22 )) - ; - out[ 21 + outpos] = ( in[ 19 + inpos] >>> 22 ) - | ((in[ 20 + inpos] & 1048575 )<<( 30 - 20 )) - ; - out[ 22 + outpos] = ( in[ 20 + inpos] >>> 20 ) - | ((in[ 21 + inpos] & 262143 )<<( 30 - 18 )) - ; - out[ 23 + outpos] = ( in[ 21 + inpos] >>> 18 ) - | ((in[ 22 + inpos] & 65535 )<<( 30 - 16 )) - ; - out[ 24 + outpos] = ( in[ 22 + inpos] >>> 16 ) - | ((in[ 23 + inpos] & 16383 )<<( 30 - 14 )) - ; - out[ 25 + outpos] = ( in[ 23 + inpos] >>> 14 ) - | ((in[ 24 + inpos] & 4095 )<<( 30 - 12 )) - ; - out[ 26 + outpos] = ( in[ 24 + inpos] >>> 12 ) - | ((in[ 25 + inpos] & 1023 )<<( 30 - 10 )) - ; - out[ 27 + outpos] = ( in[ 25 + inpos] >>> 10 ) - | ((in[ 26 + inpos] & 255 )<<( 30 - 8 )) - ; - out[ 28 + outpos] = ( in[ 26 + inpos] >>> 8 ) - | ((in[ 27 + inpos] & 63 )<<( 30 - 6 )) - ; - out[ 29 + outpos] = ( in[ 27 + inpos] >>> 6 ) - | ((in[ 28 + inpos] & 15 )<<( 30 - 4 )) - ; - out[ 30 + outpos] = ( in[ 28 + inpos] >>> 4 ) - | ((in[ 29 + inpos] & 3 )<<( 30 - 2 )) - ; - out[ 31 + outpos] = ( in[ 29 + inpos] >>> 2 ) - ; -} - - - - -public static void fastunpack31(final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (( in[ 0 + inpos] >>> 0 ) & 2147483647 ) - ; - out[ 1 + outpos] = ( in[ 0 + inpos] >>> 31 ) - | ((in[ 1 + inpos] & 1073741823 )<<( 31 - 30 )) - ; - out[ 2 + outpos] = ( in[ 1 + inpos] >>> 30 ) - | ((in[ 2 + inpos] & 536870911 )<<( 31 - 29 )) - ; - out[ 3 + outpos] = ( in[ 2 + inpos] >>> 29 ) - | ((in[ 3 + inpos] & 268435455 )<<( 31 - 28 )) - ; - out[ 4 + outpos] = ( in[ 3 + inpos] >>> 28 ) - | ((in[ 4 + inpos] & 134217727 )<<( 31 - 27 )) - ; - out[ 5 + outpos] = ( in[ 4 + inpos] >>> 27 ) - | ((in[ 5 + inpos] & 67108863 )<<( 31 - 26 )) - ; - out[ 6 + outpos] = ( in[ 5 + inpos] >>> 26 ) - | ((in[ 6 + inpos] & 33554431 )<<( 31 - 25 )) - ; - out[ 7 + outpos] = ( in[ 6 + inpos] >>> 25 ) - | ((in[ 7 + inpos] & 16777215 )<<( 31 - 24 )) - ; - out[ 8 + outpos] = ( in[ 7 + inpos] >>> 24 ) - | ((in[ 8 + inpos] & 8388607 )<<( 31 - 23 )) - ; - out[ 9 + outpos] = ( in[ 8 + inpos] >>> 23 ) - | ((in[ 9 + inpos] & 4194303 )<<( 31 - 22 )) - ; - out[ 10 + outpos] = ( in[ 9 + inpos] >>> 22 ) - | ((in[ 10 + inpos] & 2097151 )<<( 31 - 21 )) - ; - out[ 11 + outpos] = ( in[ 10 + inpos] >>> 21 ) - | ((in[ 11 + inpos] & 1048575 )<<( 31 - 20 )) - ; - out[ 12 + outpos] = ( in[ 11 + inpos] >>> 20 ) - | ((in[ 12 + inpos] & 524287 )<<( 31 - 19 )) - ; - out[ 13 + outpos] = ( in[ 12 + inpos] >>> 19 ) - | ((in[ 13 + inpos] & 262143 )<<( 31 - 18 )) - ; - out[ 14 + outpos] = ( in[ 13 + inpos] >>> 18 ) - | ((in[ 14 + inpos] & 131071 )<<( 31 - 17 )) - ; - out[ 15 + outpos] = ( in[ 14 + inpos] >>> 17 ) - | ((in[ 15 + inpos] & 65535 )<<( 31 - 16 )) - ; - out[ 16 + outpos] = ( in[ 15 + inpos] >>> 16 ) - | ((in[ 16 + inpos] & 32767 )<<( 31 - 15 )) - ; - out[ 17 + outpos] = ( in[ 16 + inpos] >>> 15 ) - | ((in[ 17 + inpos] & 16383 )<<( 31 - 14 )) - ; - out[ 18 + outpos] = ( in[ 17 + inpos] >>> 14 ) - | ((in[ 18 + inpos] & 8191 )<<( 31 - 13 )) - ; - out[ 19 + outpos] = ( in[ 18 + inpos] >>> 13 ) - | ((in[ 19 + inpos] & 4095 )<<( 31 - 12 )) - ; - out[ 20 + outpos] = ( in[ 19 + inpos] >>> 12 ) - | ((in[ 20 + inpos] & 2047 )<<( 31 - 11 )) - ; - out[ 21 + outpos] = ( in[ 20 + inpos] >>> 11 ) - | ((in[ 21 + inpos] & 1023 )<<( 31 - 10 )) - ; - out[ 22 + outpos] = ( in[ 21 + inpos] >>> 10 ) - | ((in[ 22 + inpos] & 511 )<<( 31 - 9 )) - ; - out[ 23 + outpos] = ( in[ 22 + inpos] >>> 9 ) - | ((in[ 23 + inpos] & 255 )<<( 31 - 8 )) - ; - out[ 24 + outpos] = ( in[ 23 + inpos] >>> 8 ) - | ((in[ 24 + inpos] & 127 )<<( 31 - 7 )) - ; - out[ 25 + outpos] = ( in[ 24 + inpos] >>> 7 ) - | ((in[ 25 + inpos] & 63 )<<( 31 - 6 )) - ; - out[ 26 + outpos] = ( in[ 25 + inpos] >>> 6 ) - | ((in[ 26 + inpos] & 31 )<<( 31 - 5 )) - ; - out[ 27 + outpos] = ( in[ 26 + inpos] >>> 5 ) - | ((in[ 27 + inpos] & 15 )<<( 31 - 4 )) - ; - out[ 28 + outpos] = ( in[ 27 + inpos] >>> 4 ) - | ((in[ 28 + inpos] & 7 )<<( 31 - 3 )) - ; - out[ 29 + outpos] = ( in[ 28 + inpos] >>> 3 ) - | ((in[ 29 + inpos] & 3 )<<( 31 - 2 )) - ; - out[ 30 + outpos] = ( in[ 29 + inpos] >>> 2 ) - | ((in[ 30 + inpos] & 1 )<<( 31 - 1 )) - ; - out[ 31 + outpos] = ( in[ 30 + inpos] >>> 1 ) - ; -} - - - - -public static void fastunpack32(final int [] in, int inpos, final int [] out, int outpos) { - System.arraycopy(in, inpos, out, outpos, 32); -} - - -public static void fastpack32(final int [] in, int inpos, final int [] out, int outpos) { - System.arraycopy(in, inpos, out, outpos, 32); -} - - -public static void fastpackwithoutmask32(final int [] in, int inpos, final int [] out, int outpos) { - System.arraycopy(in, inpos, out, outpos, 32); -} - - -public static void fastunpack0(final int [] in, int inpos, final int [] out, int outpos) { - Arrays.fill(out,outpos,outpos+32,0); -} - - -public static void fastpack0(final int [] in, int inpos, final int [] out, int outpos) { - // nothing -} - - -public static void fastpackwithoutmask0(final int [] in, int inpos, final int [] out, int outpos) { - // nothing -} - - - -public static void fastunpack(final int [] in, int inpos, final int [] out, int outpos, final int bit) { - switch(bit) { - case 0: - fastunpack0(in,inpos,out,outpos); - break; - case 1: - fastunpack1(in,inpos,out,outpos); - break; - case 2: - fastunpack2(in,inpos,out,outpos); - break; - case 3: - fastunpack3(in,inpos,out,outpos); - break; - case 4: - fastunpack4(in,inpos,out,outpos); - break; - case 5: - fastunpack5(in,inpos,out,outpos); - break; - case 6: - fastunpack6(in,inpos,out,outpos); - break; - case 7: - fastunpack7(in,inpos,out,outpos); - break; - case 8: - fastunpack8(in,inpos,out,outpos); - break; - case 9: - fastunpack9(in,inpos,out,outpos); - break; - case 10: - fastunpack10(in,inpos,out,outpos); - break; - case 11: - fastunpack11(in,inpos,out,outpos); - break; - case 12: - fastunpack12(in,inpos,out,outpos); - break; - case 13: - fastunpack13(in,inpos,out,outpos); - break; - case 14: - fastunpack14(in,inpos,out,outpos); - break; - case 15: - fastunpack15(in,inpos,out,outpos); - break; - case 16: - fastunpack16(in,inpos,out,outpos); - break; - case 17: - fastunpack17(in,inpos,out,outpos); - break; - case 18: - fastunpack18(in,inpos,out,outpos); - break; - case 19: - fastunpack19(in,inpos,out,outpos); - break; - case 20: - fastunpack20(in,inpos,out,outpos); - break; - case 21: - fastunpack21(in,inpos,out,outpos); - break; - case 22: - fastunpack22(in,inpos,out,outpos); - break; - case 23: - fastunpack23(in,inpos,out,outpos); - break; - case 24: - fastunpack24(in,inpos,out,outpos); - break; - case 25: - fastunpack25(in,inpos,out,outpos); - break; - case 26: - fastunpack26(in,inpos,out,outpos); - break; - case 27: - fastunpack27(in,inpos,out,outpos); - break; - case 28: - fastunpack28(in,inpos,out,outpos); - break; - case 29: - fastunpack29(in,inpos,out,outpos); - break; - case 30: - fastunpack30(in,inpos,out,outpos); - break; - case 31: - fastunpack31(in,inpos,out,outpos); - break; - case 32: - fastunpack32(in,inpos,out,outpos); - break; - default: - throw new IllegalArgumentException("Unsupported bit width."); - } -} - - -public static void fastpack(final int [] in, int inpos, final int [] out, int outpos, final int bit) { - switch(bit) { - case 0: - fastpack0(in,inpos,out,outpos); - break; - case 1: - fastpack1(in,inpos,out,outpos); - break; - case 2: - fastpack2(in,inpos,out,outpos); - break; - case 3: - fastpack3(in,inpos,out,outpos); - break; - case 4: - fastpack4(in,inpos,out,outpos); - break; - case 5: - fastpack5(in,inpos,out,outpos); - break; - case 6: - fastpack6(in,inpos,out,outpos); - break; - case 7: - fastpack7(in,inpos,out,outpos); - break; - case 8: - fastpack8(in,inpos,out,outpos); - break; - case 9: - fastpack9(in,inpos,out,outpos); - break; - case 10: - fastpack10(in,inpos,out,outpos); - break; - case 11: - fastpack11(in,inpos,out,outpos); - break; - case 12: - fastpack12(in,inpos,out,outpos); - break; - case 13: - fastpack13(in,inpos,out,outpos); - break; - case 14: - fastpack14(in,inpos,out,outpos); - break; - case 15: - fastpack15(in,inpos,out,outpos); - break; - case 16: - fastpack16(in,inpos,out,outpos); - break; - case 17: - fastpack17(in,inpos,out,outpos); - break; - case 18: - fastpack18(in,inpos,out,outpos); - break; - case 19: - fastpack19(in,inpos,out,outpos); - break; - case 20: - fastpack20(in,inpos,out,outpos); - break; - case 21: - fastpack21(in,inpos,out,outpos); - break; - case 22: - fastpack22(in,inpos,out,outpos); - break; - case 23: - fastpack23(in,inpos,out,outpos); - break; - case 24: - fastpack24(in,inpos,out,outpos); - break; - case 25: - fastpack25(in,inpos,out,outpos); - break; - case 26: - fastpack26(in,inpos,out,outpos); - break; - case 27: - fastpack27(in,inpos,out,outpos); - break; - case 28: - fastpack28(in,inpos,out,outpos); - break; - case 29: - fastpack29(in,inpos,out,outpos); - break; - case 30: - fastpack30(in,inpos,out,outpos); - break; - case 31: - fastpack31(in,inpos,out,outpos); - break; - case 32: - fastpack32(in,inpos,out,outpos); - break; - default: - throw new IllegalArgumentException("Unsupported bit width."); - } -} - - -public static void fastpackwithoutmask(final int [] in, int inpos, final int [] out, int outpos, final int bit) { - switch(bit) { - case 0: - fastpackwithoutmask0(in,inpos,out,outpos); - break; - case 1: - fastpackwithoutmask1(in,inpos,out,outpos); - break; - case 2: - fastpackwithoutmask2(in,inpos,out,outpos); - break; - case 3: - fastpackwithoutmask3(in,inpos,out,outpos); - break; - case 4: - fastpackwithoutmask4(in,inpos,out,outpos); - break; - case 5: - fastpackwithoutmask5(in,inpos,out,outpos); - break; - case 6: - fastpackwithoutmask6(in,inpos,out,outpos); - break; - case 7: - fastpackwithoutmask7(in,inpos,out,outpos); - break; - case 8: - fastpackwithoutmask8(in,inpos,out,outpos); - break; - case 9: - fastpackwithoutmask9(in,inpos,out,outpos); - break; - case 10: - fastpackwithoutmask10(in,inpos,out,outpos); - break; - case 11: - fastpackwithoutmask11(in,inpos,out,outpos); - break; - case 12: - fastpackwithoutmask12(in,inpos,out,outpos); - break; - case 13: - fastpackwithoutmask13(in,inpos,out,outpos); - break; - case 14: - fastpackwithoutmask14(in,inpos,out,outpos); - break; - case 15: - fastpackwithoutmask15(in,inpos,out,outpos); - break; - case 16: - fastpackwithoutmask16(in,inpos,out,outpos); - break; - case 17: - fastpackwithoutmask17(in,inpos,out,outpos); - break; - case 18: - fastpackwithoutmask18(in,inpos,out,outpos); - break; - case 19: - fastpackwithoutmask19(in,inpos,out,outpos); - break; - case 20: - fastpackwithoutmask20(in,inpos,out,outpos); - break; - case 21: - fastpackwithoutmask21(in,inpos,out,outpos); - break; - case 22: - fastpackwithoutmask22(in,inpos,out,outpos); - break; - case 23: - fastpackwithoutmask23(in,inpos,out,outpos); - break; - case 24: - fastpackwithoutmask24(in,inpos,out,outpos); - break; - case 25: - fastpackwithoutmask25(in,inpos,out,outpos); - break; - case 26: - fastpackwithoutmask26(in,inpos,out,outpos); - break; - case 27: - fastpackwithoutmask27(in,inpos,out,outpos); - break; - case 28: - fastpackwithoutmask28(in,inpos,out,outpos); - break; - case 29: - fastpackwithoutmask29(in,inpos,out,outpos); - break; - case 30: - fastpackwithoutmask30(in,inpos,out,outpos); - break; - case 31: - fastpackwithoutmask31(in,inpos,out,outpos); - break; - case 32: - fastpackwithoutmask32(in,inpos,out,outpos); - break; - default: - throw new IllegalArgumentException("Unsupported bit width."); - } -} + public static void fastpackwithoutmask1(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 1) + | ((in[2 + inpos]) << 2) + | ((in[3 + inpos]) << 3) + | ((in[4 + inpos]) << 4) + | ((in[5 + inpos]) << 5) + | ((in[6 + inpos]) << 6) + | ((in[7 + inpos]) << 7) + | ((in[8 + inpos]) << 8) + | ((in[9 + inpos]) << 9) + | ((in[10 + inpos]) << 10) + | ((in[11 + inpos]) << 11) + | ((in[12 + inpos]) << 12) + | ((in[13 + inpos]) << 13) + | ((in[14 + inpos]) << 14) + | ((in[15 + inpos]) << 15) + | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 17) + | ((in[18 + inpos]) << 18) + | ((in[19 + inpos]) << 19) + | ((in[20 + inpos]) << 20) + | ((in[21 + inpos]) << 21) + | ((in[22 + inpos]) << 22) + | ((in[23 + inpos]) << 23) + | ((in[24 + inpos]) << 24) + | ((in[25 + inpos]) << 25) + | ((in[26 + inpos]) << 26) + | ((in[27 + inpos]) << 27) + | ((in[28 + inpos]) << 28) + | ((in[29 + inpos]) << 29) + | ((in[30 + inpos]) << 30) + | ((in[31 + inpos]) << 31) + ; + } + + + public static void fastpackwithoutmask2(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 2) + | ((in[2 + inpos]) << 4) + | ((in[3 + inpos]) << 6) + | ((in[4 + inpos]) << 8) + | ((in[5 + inpos]) << 10) + | ((in[6 + inpos]) << 12) + | ((in[7 + inpos]) << 14) + | ((in[8 + inpos]) << 16) + | ((in[9 + inpos]) << 18) + | ((in[10 + inpos]) << 20) + | ((in[11 + inpos]) << 22) + | ((in[12 + inpos]) << 24) + | ((in[13 + inpos]) << 26) + | ((in[14 + inpos]) << 28) + | ((in[15 + inpos]) << 30) + ; + out[1 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 2) + | ((in[18 + inpos]) << 4) + | ((in[19 + inpos]) << 6) + | ((in[20 + inpos]) << 8) + | ((in[21 + inpos]) << 10) + | ((in[22 + inpos]) << 12) + | ((in[23 + inpos]) << 14) + | ((in[24 + inpos]) << 16) + | ((in[25 + inpos]) << 18) + | ((in[26 + inpos]) << 20) + | ((in[27 + inpos]) << 22) + | ((in[28 + inpos]) << 24) + | ((in[29 + inpos]) << 26) + | ((in[30 + inpos]) << 28) + | ((in[31 + inpos]) << 30) + ; + } + + + public static void fastpackwithoutmask3(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 3) + | ((in[2 + inpos]) << 6) + | ((in[3 + inpos]) << 9) + | ((in[4 + inpos]) << 12) + | ((in[5 + inpos]) << 15) + | ((in[6 + inpos]) << 18) + | ((in[7 + inpos]) << 21) + | ((in[8 + inpos]) << 24) + | ((in[9 + inpos]) << 27) + | ((in[10 + inpos]) << 30) + ; + out[1 + outpos] = ((in[10 + inpos]) >>> (3 - 1)) + | ((in[11 + inpos]) << 1) + | ((in[12 + inpos]) << 4) + | ((in[13 + inpos]) << 7) + | ((in[14 + inpos]) << 10) + | ((in[15 + inpos]) << 13) + | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 19) + | ((in[18 + inpos]) << 22) + | ((in[19 + inpos]) << 25) + | ((in[20 + inpos]) << 28) + | ((in[21 + inpos]) << 31) + ; + out[2 + outpos] = ((in[21 + inpos]) >>> (3 - 2)) + | ((in[22 + inpos]) << 2) + | ((in[23 + inpos]) << 5) + | ((in[24 + inpos]) << 8) + | ((in[25 + inpos]) << 11) + | ((in[26 + inpos]) << 14) + | ((in[27 + inpos]) << 17) + | ((in[28 + inpos]) << 20) + | ((in[29 + inpos]) << 23) + | ((in[30 + inpos]) << 26) + | ((in[31 + inpos]) << 29) + ; + } + + + public static void fastpackwithoutmask4(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 4) + | ((in[2 + inpos]) << 8) + | ((in[3 + inpos]) << 12) + | ((in[4 + inpos]) << 16) + | ((in[5 + inpos]) << 20) + | ((in[6 + inpos]) << 24) + | ((in[7 + inpos]) << 28) + ; + out[1 + outpos] = in[8 + inpos] + | ((in[9 + inpos]) << 4) + | ((in[10 + inpos]) << 8) + | ((in[11 + inpos]) << 12) + | ((in[12 + inpos]) << 16) + | ((in[13 + inpos]) << 20) + | ((in[14 + inpos]) << 24) + | ((in[15 + inpos]) << 28) + ; + out[2 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 4) + | ((in[18 + inpos]) << 8) + | ((in[19 + inpos]) << 12) + | ((in[20 + inpos]) << 16) + | ((in[21 + inpos]) << 20) + | ((in[22 + inpos]) << 24) + | ((in[23 + inpos]) << 28) + ; + out[3 + outpos] = in[24 + inpos] + | ((in[25 + inpos]) << 4) + | ((in[26 + inpos]) << 8) + | ((in[27 + inpos]) << 12) + | ((in[28 + inpos]) << 16) + | ((in[29 + inpos]) << 20) + | ((in[30 + inpos]) << 24) + | ((in[31 + inpos]) << 28) + ; + } + + + public static void fastpackwithoutmask5(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 5) + | ((in[2 + inpos]) << 10) + | ((in[3 + inpos]) << 15) + | ((in[4 + inpos]) << 20) + | ((in[5 + inpos]) << 25) + | ((in[6 + inpos]) << 30) + ; + out[1 + outpos] = ((in[6 + inpos]) >>> (5 - 3)) + | ((in[7 + inpos]) << 3) + | ((in[8 + inpos]) << 8) + | ((in[9 + inpos]) << 13) + | ((in[10 + inpos]) << 18) + | ((in[11 + inpos]) << 23) + | ((in[12 + inpos]) << 28) + ; + out[2 + outpos] = ((in[12 + inpos]) >>> (5 - 1)) + | ((in[13 + inpos]) << 1) + | ((in[14 + inpos]) << 6) + | ((in[15 + inpos]) << 11) + | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 21) + | ((in[18 + inpos]) << 26) + | ((in[19 + inpos]) << 31) + ; + out[3 + outpos] = ((in[19 + inpos]) >>> (5 - 4)) + | ((in[20 + inpos]) << 4) + | ((in[21 + inpos]) << 9) + | ((in[22 + inpos]) << 14) + | ((in[23 + inpos]) << 19) + | ((in[24 + inpos]) << 24) + | ((in[25 + inpos]) << 29) + ; + out[4 + outpos] = ((in[25 + inpos]) >>> (5 - 2)) + | ((in[26 + inpos]) << 2) + | ((in[27 + inpos]) << 7) + | ((in[28 + inpos]) << 12) + | ((in[29 + inpos]) << 17) + | ((in[30 + inpos]) << 22) + | ((in[31 + inpos]) << 27) + ; + } + + + public static void fastpackwithoutmask6(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 6) + | ((in[2 + inpos]) << 12) + | ((in[3 + inpos]) << 18) + | ((in[4 + inpos]) << 24) + | ((in[5 + inpos]) << 30) + ; + out[1 + outpos] = ((in[5 + inpos]) >>> (6 - 4)) + | ((in[6 + inpos]) << 4) + | ((in[7 + inpos]) << 10) + | ((in[8 + inpos]) << 16) + | ((in[9 + inpos]) << 22) + | ((in[10 + inpos]) << 28) + ; + out[2 + outpos] = ((in[10 + inpos]) >>> (6 - 2)) + | ((in[11 + inpos]) << 2) + | ((in[12 + inpos]) << 8) + | ((in[13 + inpos]) << 14) + | ((in[14 + inpos]) << 20) + | ((in[15 + inpos]) << 26) + ; + out[3 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 6) + | ((in[18 + inpos]) << 12) + | ((in[19 + inpos]) << 18) + | ((in[20 + inpos]) << 24) + | ((in[21 + inpos]) << 30) + ; + out[4 + outpos] = ((in[21 + inpos]) >>> (6 - 4)) + | ((in[22 + inpos]) << 4) + | ((in[23 + inpos]) << 10) + | ((in[24 + inpos]) << 16) + | ((in[25 + inpos]) << 22) + | ((in[26 + inpos]) << 28) + ; + out[5 + outpos] = ((in[26 + inpos]) >>> (6 - 2)) + | ((in[27 + inpos]) << 2) + | ((in[28 + inpos]) << 8) + | ((in[29 + inpos]) << 14) + | ((in[30 + inpos]) << 20) + | ((in[31 + inpos]) << 26) + ; + } + + + public static void fastpackwithoutmask7(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 7) + | ((in[2 + inpos]) << 14) + | ((in[3 + inpos]) << 21) + | ((in[4 + inpos]) << 28) + ; + out[1 + outpos] = ((in[4 + inpos]) >>> (7 - 3)) + | ((in[5 + inpos]) << 3) + | ((in[6 + inpos]) << 10) + | ((in[7 + inpos]) << 17) + | ((in[8 + inpos]) << 24) + | ((in[9 + inpos]) << 31) + ; + out[2 + outpos] = ((in[9 + inpos]) >>> (7 - 6)) + | ((in[10 + inpos]) << 6) + | ((in[11 + inpos]) << 13) + | ((in[12 + inpos]) << 20) + | ((in[13 + inpos]) << 27) + ; + out[3 + outpos] = ((in[13 + inpos]) >>> (7 - 2)) + | ((in[14 + inpos]) << 2) + | ((in[15 + inpos]) << 9) + | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 23) + | ((in[18 + inpos]) << 30) + ; + out[4 + outpos] = ((in[18 + inpos]) >>> (7 - 5)) + | ((in[19 + inpos]) << 5) + | ((in[20 + inpos]) << 12) + | ((in[21 + inpos]) << 19) + | ((in[22 + inpos]) << 26) + ; + out[5 + outpos] = ((in[22 + inpos]) >>> (7 - 1)) + | ((in[23 + inpos]) << 1) + | ((in[24 + inpos]) << 8) + | ((in[25 + inpos]) << 15) + | ((in[26 + inpos]) << 22) + | ((in[27 + inpos]) << 29) + ; + out[6 + outpos] = ((in[27 + inpos]) >>> (7 - 4)) + | ((in[28 + inpos]) << 4) + | ((in[29 + inpos]) << 11) + | ((in[30 + inpos]) << 18) + | ((in[31 + inpos]) << 25) + ; + } + + + public static void fastpackwithoutmask8(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 8) + | ((in[2 + inpos]) << 16) + | ((in[3 + inpos]) << 24) + ; + out[1 + outpos] = in[4 + inpos] + | ((in[5 + inpos]) << 8) + | ((in[6 + inpos]) << 16) + | ((in[7 + inpos]) << 24) + ; + out[2 + outpos] = in[8 + inpos] + | ((in[9 + inpos]) << 8) + | ((in[10 + inpos]) << 16) + | ((in[11 + inpos]) << 24) + ; + out[3 + outpos] = in[12 + inpos] + | ((in[13 + inpos]) << 8) + | ((in[14 + inpos]) << 16) + | ((in[15 + inpos]) << 24) + ; + out[4 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 8) + | ((in[18 + inpos]) << 16) + | ((in[19 + inpos]) << 24) + ; + out[5 + outpos] = in[20 + inpos] + | ((in[21 + inpos]) << 8) + | ((in[22 + inpos]) << 16) + | ((in[23 + inpos]) << 24) + ; + out[6 + outpos] = in[24 + inpos] + | ((in[25 + inpos]) << 8) + | ((in[26 + inpos]) << 16) + | ((in[27 + inpos]) << 24) + ; + out[7 + outpos] = in[28 + inpos] + | ((in[29 + inpos]) << 8) + | ((in[30 + inpos]) << 16) + | ((in[31 + inpos]) << 24) + ; + } + + + public static void fastpackwithoutmask9(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 9) + | ((in[2 + inpos]) << 18) + | ((in[3 + inpos]) << 27) + ; + out[1 + outpos] = ((in[3 + inpos]) >>> (9 - 4)) + | ((in[4 + inpos]) << 4) + | ((in[5 + inpos]) << 13) + | ((in[6 + inpos]) << 22) + | ((in[7 + inpos]) << 31) + ; + out[2 + outpos] = ((in[7 + inpos]) >>> (9 - 8)) + | ((in[8 + inpos]) << 8) + | ((in[9 + inpos]) << 17) + | ((in[10 + inpos]) << 26) + ; + out[3 + outpos] = ((in[10 + inpos]) >>> (9 - 3)) + | ((in[11 + inpos]) << 3) + | ((in[12 + inpos]) << 12) + | ((in[13 + inpos]) << 21) + | ((in[14 + inpos]) << 30) + ; + out[4 + outpos] = ((in[14 + inpos]) >>> (9 - 7)) + | ((in[15 + inpos]) << 7) + | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 25) + ; + out[5 + outpos] = ((in[17 + inpos]) >>> (9 - 2)) + | ((in[18 + inpos]) << 2) + | ((in[19 + inpos]) << 11) + | ((in[20 + inpos]) << 20) + | ((in[21 + inpos]) << 29) + ; + out[6 + outpos] = ((in[21 + inpos]) >>> (9 - 6)) + | ((in[22 + inpos]) << 6) + | ((in[23 + inpos]) << 15) + | ((in[24 + inpos]) << 24) + ; + out[7 + outpos] = ((in[24 + inpos]) >>> (9 - 1)) + | ((in[25 + inpos]) << 1) + | ((in[26 + inpos]) << 10) + | ((in[27 + inpos]) << 19) + | ((in[28 + inpos]) << 28) + ; + out[8 + outpos] = ((in[28 + inpos]) >>> (9 - 5)) + | ((in[29 + inpos]) << 5) + | ((in[30 + inpos]) << 14) + | ((in[31 + inpos]) << 23) + ; + } + + + public static void fastpackwithoutmask10(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 10) + | ((in[2 + inpos]) << 20) + | ((in[3 + inpos]) << 30) + ; + out[1 + outpos] = ((in[3 + inpos]) >>> (10 - 8)) + | ((in[4 + inpos]) << 8) + | ((in[5 + inpos]) << 18) + | ((in[6 + inpos]) << 28) + ; + out[2 + outpos] = ((in[6 + inpos]) >>> (10 - 6)) + | ((in[7 + inpos]) << 6) + | ((in[8 + inpos]) << 16) + | ((in[9 + inpos]) << 26) + ; + out[3 + outpos] = ((in[9 + inpos]) >>> (10 - 4)) + | ((in[10 + inpos]) << 4) + | ((in[11 + inpos]) << 14) + | ((in[12 + inpos]) << 24) + ; + out[4 + outpos] = ((in[12 + inpos]) >>> (10 - 2)) + | ((in[13 + inpos]) << 2) + | ((in[14 + inpos]) << 12) + | ((in[15 + inpos]) << 22) + ; + out[5 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 10) + | ((in[18 + inpos]) << 20) + | ((in[19 + inpos]) << 30) + ; + out[6 + outpos] = ((in[19 + inpos]) >>> (10 - 8)) + | ((in[20 + inpos]) << 8) + | ((in[21 + inpos]) << 18) + | ((in[22 + inpos]) << 28) + ; + out[7 + outpos] = ((in[22 + inpos]) >>> (10 - 6)) + | ((in[23 + inpos]) << 6) + | ((in[24 + inpos]) << 16) + | ((in[25 + inpos]) << 26) + ; + out[8 + outpos] = ((in[25 + inpos]) >>> (10 - 4)) + | ((in[26 + inpos]) << 4) + | ((in[27 + inpos]) << 14) + | ((in[28 + inpos]) << 24) + ; + out[9 + outpos] = ((in[28 + inpos]) >>> (10 - 2)) + | ((in[29 + inpos]) << 2) + | ((in[30 + inpos]) << 12) + | ((in[31 + inpos]) << 22) + ; + } + + + public static void fastpackwithoutmask11(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 11) + | ((in[2 + inpos]) << 22) + ; + out[1 + outpos] = ((in[2 + inpos]) >>> (11 - 1)) + | ((in[3 + inpos]) << 1) + | ((in[4 + inpos]) << 12) + | ((in[5 + inpos]) << 23) + ; + out[2 + outpos] = ((in[5 + inpos]) >>> (11 - 2)) + | ((in[6 + inpos]) << 2) + | ((in[7 + inpos]) << 13) + | ((in[8 + inpos]) << 24) + ; + out[3 + outpos] = ((in[8 + inpos]) >>> (11 - 3)) + | ((in[9 + inpos]) << 3) + | ((in[10 + inpos]) << 14) + | ((in[11 + inpos]) << 25) + ; + out[4 + outpos] = ((in[11 + inpos]) >>> (11 - 4)) + | ((in[12 + inpos]) << 4) + | ((in[13 + inpos]) << 15) + | ((in[14 + inpos]) << 26) + ; + out[5 + outpos] = ((in[14 + inpos]) >>> (11 - 5)) + | ((in[15 + inpos]) << 5) + | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 27) + ; + out[6 + outpos] = ((in[17 + inpos]) >>> (11 - 6)) + | ((in[18 + inpos]) << 6) + | ((in[19 + inpos]) << 17) + | ((in[20 + inpos]) << 28) + ; + out[7 + outpos] = ((in[20 + inpos]) >>> (11 - 7)) + | ((in[21 + inpos]) << 7) + | ((in[22 + inpos]) << 18) + | ((in[23 + inpos]) << 29) + ; + out[8 + outpos] = ((in[23 + inpos]) >>> (11 - 8)) + | ((in[24 + inpos]) << 8) + | ((in[25 + inpos]) << 19) + | ((in[26 + inpos]) << 30) + ; + out[9 + outpos] = ((in[26 + inpos]) >>> (11 - 9)) + | ((in[27 + inpos]) << 9) + | ((in[28 + inpos]) << 20) + | ((in[29 + inpos]) << 31) + ; + out[10 + outpos] = ((in[29 + inpos]) >>> (11 - 10)) + | ((in[30 + inpos]) << 10) + | ((in[31 + inpos]) << 21) + ; + } + + + public static void fastpackwithoutmask12(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 12) + | ((in[2 + inpos]) << 24) + ; + out[1 + outpos] = ((in[2 + inpos]) >>> (12 - 4)) + | ((in[3 + inpos]) << 4) + | ((in[4 + inpos]) << 16) + | ((in[5 + inpos]) << 28) + ; + out[2 + outpos] = ((in[5 + inpos]) >>> (12 - 8)) + | ((in[6 + inpos]) << 8) + | ((in[7 + inpos]) << 20) + ; + out[3 + outpos] = in[8 + inpos] + | ((in[9 + inpos]) << 12) + | ((in[10 + inpos]) << 24) + ; + out[4 + outpos] = ((in[10 + inpos]) >>> (12 - 4)) + | ((in[11 + inpos]) << 4) + | ((in[12 + inpos]) << 16) + | ((in[13 + inpos]) << 28) + ; + out[5 + outpos] = ((in[13 + inpos]) >>> (12 - 8)) + | ((in[14 + inpos]) << 8) + | ((in[15 + inpos]) << 20) + ; + out[6 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 12) + | ((in[18 + inpos]) << 24) + ; + out[7 + outpos] = ((in[18 + inpos]) >>> (12 - 4)) + | ((in[19 + inpos]) << 4) + | ((in[20 + inpos]) << 16) + | ((in[21 + inpos]) << 28) + ; + out[8 + outpos] = ((in[21 + inpos]) >>> (12 - 8)) + | ((in[22 + inpos]) << 8) + | ((in[23 + inpos]) << 20) + ; + out[9 + outpos] = in[24 + inpos] + | ((in[25 + inpos]) << 12) + | ((in[26 + inpos]) << 24) + ; + out[10 + outpos] = ((in[26 + inpos]) >>> (12 - 4)) + | ((in[27 + inpos]) << 4) + | ((in[28 + inpos]) << 16) + | ((in[29 + inpos]) << 28) + ; + out[11 + outpos] = ((in[29 + inpos]) >>> (12 - 8)) + | ((in[30 + inpos]) << 8) + | ((in[31 + inpos]) << 20) + ; + } + + + public static void fastpackwithoutmask13(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 13) + | ((in[2 + inpos]) << 26) + ; + out[1 + outpos] = ((in[2 + inpos]) >>> (13 - 7)) + | ((in[3 + inpos]) << 7) + | ((in[4 + inpos]) << 20) + ; + out[2 + outpos] = ((in[4 + inpos]) >>> (13 - 1)) + | ((in[5 + inpos]) << 1) + | ((in[6 + inpos]) << 14) + | ((in[7 + inpos]) << 27) + ; + out[3 + outpos] = ((in[7 + inpos]) >>> (13 - 8)) + | ((in[8 + inpos]) << 8) + | ((in[9 + inpos]) << 21) + ; + out[4 + outpos] = ((in[9 + inpos]) >>> (13 - 2)) + | ((in[10 + inpos]) << 2) + | ((in[11 + inpos]) << 15) + | ((in[12 + inpos]) << 28) + ; + out[5 + outpos] = ((in[12 + inpos]) >>> (13 - 9)) + | ((in[13 + inpos]) << 9) + | ((in[14 + inpos]) << 22) + ; + out[6 + outpos] = ((in[14 + inpos]) >>> (13 - 3)) + | ((in[15 + inpos]) << 3) + | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 29) + ; + out[7 + outpos] = ((in[17 + inpos]) >>> (13 - 10)) + | ((in[18 + inpos]) << 10) + | ((in[19 + inpos]) << 23) + ; + out[8 + outpos] = ((in[19 + inpos]) >>> (13 - 4)) + | ((in[20 + inpos]) << 4) + | ((in[21 + inpos]) << 17) + | ((in[22 + inpos]) << 30) + ; + out[9 + outpos] = ((in[22 + inpos]) >>> (13 - 11)) + | ((in[23 + inpos]) << 11) + | ((in[24 + inpos]) << 24) + ; + out[10 + outpos] = ((in[24 + inpos]) >>> (13 - 5)) + | ((in[25 + inpos]) << 5) + | ((in[26 + inpos]) << 18) + | ((in[27 + inpos]) << 31) + ; + out[11 + outpos] = ((in[27 + inpos]) >>> (13 - 12)) + | ((in[28 + inpos]) << 12) + | ((in[29 + inpos]) << 25) + ; + out[12 + outpos] = ((in[29 + inpos]) >>> (13 - 6)) + | ((in[30 + inpos]) << 6) + | ((in[31 + inpos]) << 19) + ; + } + + + public static void fastpackwithoutmask14(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 14) + | ((in[2 + inpos]) << 28) + ; + out[1 + outpos] = ((in[2 + inpos]) >>> (14 - 10)) + | ((in[3 + inpos]) << 10) + | ((in[4 + inpos]) << 24) + ; + out[2 + outpos] = ((in[4 + inpos]) >>> (14 - 6)) + | ((in[5 + inpos]) << 6) + | ((in[6 + inpos]) << 20) + ; + out[3 + outpos] = ((in[6 + inpos]) >>> (14 - 2)) + | ((in[7 + inpos]) << 2) + | ((in[8 + inpos]) << 16) + | ((in[9 + inpos]) << 30) + ; + out[4 + outpos] = ((in[9 + inpos]) >>> (14 - 12)) + | ((in[10 + inpos]) << 12) + | ((in[11 + inpos]) << 26) + ; + out[5 + outpos] = ((in[11 + inpos]) >>> (14 - 8)) + | ((in[12 + inpos]) << 8) + | ((in[13 + inpos]) << 22) + ; + out[6 + outpos] = ((in[13 + inpos]) >>> (14 - 4)) + | ((in[14 + inpos]) << 4) + | ((in[15 + inpos]) << 18) + ; + out[7 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 14) + | ((in[18 + inpos]) << 28) + ; + out[8 + outpos] = ((in[18 + inpos]) >>> (14 - 10)) + | ((in[19 + inpos]) << 10) + | ((in[20 + inpos]) << 24) + ; + out[9 + outpos] = ((in[20 + inpos]) >>> (14 - 6)) + | ((in[21 + inpos]) << 6) + | ((in[22 + inpos]) << 20) + ; + out[10 + outpos] = ((in[22 + inpos]) >>> (14 - 2)) + | ((in[23 + inpos]) << 2) + | ((in[24 + inpos]) << 16) + | ((in[25 + inpos]) << 30) + ; + out[11 + outpos] = ((in[25 + inpos]) >>> (14 - 12)) + | ((in[26 + inpos]) << 12) + | ((in[27 + inpos]) << 26) + ; + out[12 + outpos] = ((in[27 + inpos]) >>> (14 - 8)) + | ((in[28 + inpos]) << 8) + | ((in[29 + inpos]) << 22) + ; + out[13 + outpos] = ((in[29 + inpos]) >>> (14 - 4)) + | ((in[30 + inpos]) << 4) + | ((in[31 + inpos]) << 18) + ; + } + + + public static void fastpackwithoutmask15(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 15) + | ((in[2 + inpos]) << 30) + ; + out[1 + outpos] = ((in[2 + inpos]) >>> (15 - 13)) + | ((in[3 + inpos]) << 13) + | ((in[4 + inpos]) << 28) + ; + out[2 + outpos] = ((in[4 + inpos]) >>> (15 - 11)) + | ((in[5 + inpos]) << 11) + | ((in[6 + inpos]) << 26) + ; + out[3 + outpos] = ((in[6 + inpos]) >>> (15 - 9)) + | ((in[7 + inpos]) << 9) + | ((in[8 + inpos]) << 24) + ; + out[4 + outpos] = ((in[8 + inpos]) >>> (15 - 7)) + | ((in[9 + inpos]) << 7) + | ((in[10 + inpos]) << 22) + ; + out[5 + outpos] = ((in[10 + inpos]) >>> (15 - 5)) + | ((in[11 + inpos]) << 5) + | ((in[12 + inpos]) << 20) + ; + out[6 + outpos] = ((in[12 + inpos]) >>> (15 - 3)) + | ((in[13 + inpos]) << 3) + | ((in[14 + inpos]) << 18) + ; + out[7 + outpos] = ((in[14 + inpos]) >>> (15 - 1)) + | ((in[15 + inpos]) << 1) + | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 31) + ; + out[8 + outpos] = ((in[17 + inpos]) >>> (15 - 14)) + | ((in[18 + inpos]) << 14) + | ((in[19 + inpos]) << 29) + ; + out[9 + outpos] = ((in[19 + inpos]) >>> (15 - 12)) + | ((in[20 + inpos]) << 12) + | ((in[21 + inpos]) << 27) + ; + out[10 + outpos] = ((in[21 + inpos]) >>> (15 - 10)) + | ((in[22 + inpos]) << 10) + | ((in[23 + inpos]) << 25) + ; + out[11 + outpos] = ((in[23 + inpos]) >>> (15 - 8)) + | ((in[24 + inpos]) << 8) + | ((in[25 + inpos]) << 23) + ; + out[12 + outpos] = ((in[25 + inpos]) >>> (15 - 6)) + | ((in[26 + inpos]) << 6) + | ((in[27 + inpos]) << 21) + ; + out[13 + outpos] = ((in[27 + inpos]) >>> (15 - 4)) + | ((in[28 + inpos]) << 4) + | ((in[29 + inpos]) << 19) + ; + out[14 + outpos] = ((in[29 + inpos]) >>> (15 - 2)) + | ((in[30 + inpos]) << 2) + | ((in[31 + inpos]) << 17) + ; + } + + + public static void fastpackwithoutmask16(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 16) + ; + out[1 + outpos] = in[2 + inpos] + | ((in[3 + inpos]) << 16) + ; + out[2 + outpos] = in[4 + inpos] + | ((in[5 + inpos]) << 16) + ; + out[3 + outpos] = in[6 + inpos] + | ((in[7 + inpos]) << 16) + ; + out[4 + outpos] = in[8 + inpos] + | ((in[9 + inpos]) << 16) + ; + out[5 + outpos] = in[10 + inpos] + | ((in[11 + inpos]) << 16) + ; + out[6 + outpos] = in[12 + inpos] + | ((in[13 + inpos]) << 16) + ; + out[7 + outpos] = in[14 + inpos] + | ((in[15 + inpos]) << 16) + ; + out[8 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 16) + ; + out[9 + outpos] = in[18 + inpos] + | ((in[19 + inpos]) << 16) + ; + out[10 + outpos] = in[20 + inpos] + | ((in[21 + inpos]) << 16) + ; + out[11 + outpos] = in[22 + inpos] + | ((in[23 + inpos]) << 16) + ; + out[12 + outpos] = in[24 + inpos] + | ((in[25 + inpos]) << 16) + ; + out[13 + outpos] = in[26 + inpos] + | ((in[27 + inpos]) << 16) + ; + out[14 + outpos] = in[28 + inpos] + | ((in[29 + inpos]) << 16) + ; + out[15 + outpos] = in[30 + inpos] + | ((in[31 + inpos]) << 16) + ; + } + + + public static void fastpackwithoutmask17(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 17) + ; + out[1 + outpos] = ((in[1 + inpos]) >>> (17 - 2)) + | ((in[2 + inpos]) << 2) + | ((in[3 + inpos]) << 19) + ; + out[2 + outpos] = ((in[3 + inpos]) >>> (17 - 4)) + | ((in[4 + inpos]) << 4) + | ((in[5 + inpos]) << 21) + ; + out[3 + outpos] = ((in[5 + inpos]) >>> (17 - 6)) + | ((in[6 + inpos]) << 6) + | ((in[7 + inpos]) << 23) + ; + out[4 + outpos] = ((in[7 + inpos]) >>> (17 - 8)) + | ((in[8 + inpos]) << 8) + | ((in[9 + inpos]) << 25) + ; + out[5 + outpos] = ((in[9 + inpos]) >>> (17 - 10)) + | ((in[10 + inpos]) << 10) + | ((in[11 + inpos]) << 27) + ; + out[6 + outpos] = ((in[11 + inpos]) >>> (17 - 12)) + | ((in[12 + inpos]) << 12) + | ((in[13 + inpos]) << 29) + ; + out[7 + outpos] = ((in[13 + inpos]) >>> (17 - 14)) + | ((in[14 + inpos]) << 14) + | ((in[15 + inpos]) << 31) + ; + out[8 + outpos] = ((in[15 + inpos]) >>> (17 - 16)) + | ((in[16 + inpos]) << 16) + ; + out[9 + outpos] = ((in[16 + inpos]) >>> (17 - 1)) + | ((in[17 + inpos]) << 1) + | ((in[18 + inpos]) << 18) + ; + out[10 + outpos] = ((in[18 + inpos]) >>> (17 - 3)) + | ((in[19 + inpos]) << 3) + | ((in[20 + inpos]) << 20) + ; + out[11 + outpos] = ((in[20 + inpos]) >>> (17 - 5)) + | ((in[21 + inpos]) << 5) + | ((in[22 + inpos]) << 22) + ; + out[12 + outpos] = ((in[22 + inpos]) >>> (17 - 7)) + | ((in[23 + inpos]) << 7) + | ((in[24 + inpos]) << 24) + ; + out[13 + outpos] = ((in[24 + inpos]) >>> (17 - 9)) + | ((in[25 + inpos]) << 9) + | ((in[26 + inpos]) << 26) + ; + out[14 + outpos] = ((in[26 + inpos]) >>> (17 - 11)) + | ((in[27 + inpos]) << 11) + | ((in[28 + inpos]) << 28) + ; + out[15 + outpos] = ((in[28 + inpos]) >>> (17 - 13)) + | ((in[29 + inpos]) << 13) + | ((in[30 + inpos]) << 30) + ; + out[16 + outpos] = ((in[30 + inpos]) >>> (17 - 15)) + | ((in[31 + inpos]) << 15) + ; + } + + + public static void fastpackwithoutmask18(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 18) + ; + out[1 + outpos] = ((in[1 + inpos]) >>> (18 - 4)) + | ((in[2 + inpos]) << 4) + | ((in[3 + inpos]) << 22) + ; + out[2 + outpos] = ((in[3 + inpos]) >>> (18 - 8)) + | ((in[4 + inpos]) << 8) + | ((in[5 + inpos]) << 26) + ; + out[3 + outpos] = ((in[5 + inpos]) >>> (18 - 12)) + | ((in[6 + inpos]) << 12) + | ((in[7 + inpos]) << 30) + ; + out[4 + outpos] = ((in[7 + inpos]) >>> (18 - 16)) + | ((in[8 + inpos]) << 16) + ; + out[5 + outpos] = ((in[8 + inpos]) >>> (18 - 2)) + | ((in[9 + inpos]) << 2) + | ((in[10 + inpos]) << 20) + ; + out[6 + outpos] = ((in[10 + inpos]) >>> (18 - 6)) + | ((in[11 + inpos]) << 6) + | ((in[12 + inpos]) << 24) + ; + out[7 + outpos] = ((in[12 + inpos]) >>> (18 - 10)) + | ((in[13 + inpos]) << 10) + | ((in[14 + inpos]) << 28) + ; + out[8 + outpos] = ((in[14 + inpos]) >>> (18 - 14)) + | ((in[15 + inpos]) << 14) + ; + out[9 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 18) + ; + out[10 + outpos] = ((in[17 + inpos]) >>> (18 - 4)) + | ((in[18 + inpos]) << 4) + | ((in[19 + inpos]) << 22) + ; + out[11 + outpos] = ((in[19 + inpos]) >>> (18 - 8)) + | ((in[20 + inpos]) << 8) + | ((in[21 + inpos]) << 26) + ; + out[12 + outpos] = ((in[21 + inpos]) >>> (18 - 12)) + | ((in[22 + inpos]) << 12) + | ((in[23 + inpos]) << 30) + ; + out[13 + outpos] = ((in[23 + inpos]) >>> (18 - 16)) + | ((in[24 + inpos]) << 16) + ; + out[14 + outpos] = ((in[24 + inpos]) >>> (18 - 2)) + | ((in[25 + inpos]) << 2) + | ((in[26 + inpos]) << 20) + ; + out[15 + outpos] = ((in[26 + inpos]) >>> (18 - 6)) + | ((in[27 + inpos]) << 6) + | ((in[28 + inpos]) << 24) + ; + out[16 + outpos] = ((in[28 + inpos]) >>> (18 - 10)) + | ((in[29 + inpos]) << 10) + | ((in[30 + inpos]) << 28) + ; + out[17 + outpos] = ((in[30 + inpos]) >>> (18 - 14)) + | ((in[31 + inpos]) << 14) + ; + } + + + public static void fastpackwithoutmask19(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 19) + ; + out[1 + outpos] = ((in[1 + inpos]) >>> (19 - 6)) + | ((in[2 + inpos]) << 6) + | ((in[3 + inpos]) << 25) + ; + out[2 + outpos] = ((in[3 + inpos]) >>> (19 - 12)) + | ((in[4 + inpos]) << 12) + | ((in[5 + inpos]) << 31) + ; + out[3 + outpos] = ((in[5 + inpos]) >>> (19 - 18)) + | ((in[6 + inpos]) << 18) + ; + out[4 + outpos] = ((in[6 + inpos]) >>> (19 - 5)) + | ((in[7 + inpos]) << 5) + | ((in[8 + inpos]) << 24) + ; + out[5 + outpos] = ((in[8 + inpos]) >>> (19 - 11)) + | ((in[9 + inpos]) << 11) + | ((in[10 + inpos]) << 30) + ; + out[6 + outpos] = ((in[10 + inpos]) >>> (19 - 17)) + | ((in[11 + inpos]) << 17) + ; + out[7 + outpos] = ((in[11 + inpos]) >>> (19 - 4)) + | ((in[12 + inpos]) << 4) + | ((in[13 + inpos]) << 23) + ; + out[8 + outpos] = ((in[13 + inpos]) >>> (19 - 10)) + | ((in[14 + inpos]) << 10) + | ((in[15 + inpos]) << 29) + ; + out[9 + outpos] = ((in[15 + inpos]) >>> (19 - 16)) + | ((in[16 + inpos]) << 16) + ; + out[10 + outpos] = ((in[16 + inpos]) >>> (19 - 3)) + | ((in[17 + inpos]) << 3) + | ((in[18 + inpos]) << 22) + ; + out[11 + outpos] = ((in[18 + inpos]) >>> (19 - 9)) + | ((in[19 + inpos]) << 9) + | ((in[20 + inpos]) << 28) + ; + out[12 + outpos] = ((in[20 + inpos]) >>> (19 - 15)) + | ((in[21 + inpos]) << 15) + ; + out[13 + outpos] = ((in[21 + inpos]) >>> (19 - 2)) + | ((in[22 + inpos]) << 2) + | ((in[23 + inpos]) << 21) + ; + out[14 + outpos] = ((in[23 + inpos]) >>> (19 - 8)) + | ((in[24 + inpos]) << 8) + | ((in[25 + inpos]) << 27) + ; + out[15 + outpos] = ((in[25 + inpos]) >>> (19 - 14)) + | ((in[26 + inpos]) << 14) + ; + out[16 + outpos] = ((in[26 + inpos]) >>> (19 - 1)) + | ((in[27 + inpos]) << 1) + | ((in[28 + inpos]) << 20) + ; + out[17 + outpos] = ((in[28 + inpos]) >>> (19 - 7)) + | ((in[29 + inpos]) << 7) + | ((in[30 + inpos]) << 26) + ; + out[18 + outpos] = ((in[30 + inpos]) >>> (19 - 13)) + | ((in[31 + inpos]) << 13) + ; + } + + + public static void fastpackwithoutmask20(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 20) + ; + out[1 + outpos] = ((in[1 + inpos]) >>> (20 - 8)) + | ((in[2 + inpos]) << 8) + | ((in[3 + inpos]) << 28) + ; + out[2 + outpos] = ((in[3 + inpos]) >>> (20 - 16)) + | ((in[4 + inpos]) << 16) + ; + out[3 + outpos] = ((in[4 + inpos]) >>> (20 - 4)) + | ((in[5 + inpos]) << 4) + | ((in[6 + inpos]) << 24) + ; + out[4 + outpos] = ((in[6 + inpos]) >>> (20 - 12)) + | ((in[7 + inpos]) << 12) + ; + out[5 + outpos] = in[8 + inpos] + | ((in[9 + inpos]) << 20) + ; + out[6 + outpos] = ((in[9 + inpos]) >>> (20 - 8)) + | ((in[10 + inpos]) << 8) + | ((in[11 + inpos]) << 28) + ; + out[7 + outpos] = ((in[11 + inpos]) >>> (20 - 16)) + | ((in[12 + inpos]) << 16) + ; + out[8 + outpos] = ((in[12 + inpos]) >>> (20 - 4)) + | ((in[13 + inpos]) << 4) + | ((in[14 + inpos]) << 24) + ; + out[9 + outpos] = ((in[14 + inpos]) >>> (20 - 12)) + | ((in[15 + inpos]) << 12) + ; + out[10 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 20) + ; + out[11 + outpos] = ((in[17 + inpos]) >>> (20 - 8)) + | ((in[18 + inpos]) << 8) + | ((in[19 + inpos]) << 28) + ; + out[12 + outpos] = ((in[19 + inpos]) >>> (20 - 16)) + | ((in[20 + inpos]) << 16) + ; + out[13 + outpos] = ((in[20 + inpos]) >>> (20 - 4)) + | ((in[21 + inpos]) << 4) + | ((in[22 + inpos]) << 24) + ; + out[14 + outpos] = ((in[22 + inpos]) >>> (20 - 12)) + | ((in[23 + inpos]) << 12) + ; + out[15 + outpos] = in[24 + inpos] + | ((in[25 + inpos]) << 20) + ; + out[16 + outpos] = ((in[25 + inpos]) >>> (20 - 8)) + | ((in[26 + inpos]) << 8) + | ((in[27 + inpos]) << 28) + ; + out[17 + outpos] = ((in[27 + inpos]) >>> (20 - 16)) + | ((in[28 + inpos]) << 16) + ; + out[18 + outpos] = ((in[28 + inpos]) >>> (20 - 4)) + | ((in[29 + inpos]) << 4) + | ((in[30 + inpos]) << 24) + ; + out[19 + outpos] = ((in[30 + inpos]) >>> (20 - 12)) + | ((in[31 + inpos]) << 12) + ; + } + + + public static void fastpackwithoutmask21(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 21) + ; + out[1 + outpos] = ((in[1 + inpos]) >>> (21 - 10)) + | ((in[2 + inpos]) << 10) + | ((in[3 + inpos]) << 31) + ; + out[2 + outpos] = ((in[3 + inpos]) >>> (21 - 20)) + | ((in[4 + inpos]) << 20) + ; + out[3 + outpos] = ((in[4 + inpos]) >>> (21 - 9)) + | ((in[5 + inpos]) << 9) + | ((in[6 + inpos]) << 30) + ; + out[4 + outpos] = ((in[6 + inpos]) >>> (21 - 19)) + | ((in[7 + inpos]) << 19) + ; + out[5 + outpos] = ((in[7 + inpos]) >>> (21 - 8)) + | ((in[8 + inpos]) << 8) + | ((in[9 + inpos]) << 29) + ; + out[6 + outpos] = ((in[9 + inpos]) >>> (21 - 18)) + | ((in[10 + inpos]) << 18) + ; + out[7 + outpos] = ((in[10 + inpos]) >>> (21 - 7)) + | ((in[11 + inpos]) << 7) + | ((in[12 + inpos]) << 28) + ; + out[8 + outpos] = ((in[12 + inpos]) >>> (21 - 17)) + | ((in[13 + inpos]) << 17) + ; + out[9 + outpos] = ((in[13 + inpos]) >>> (21 - 6)) + | ((in[14 + inpos]) << 6) + | ((in[15 + inpos]) << 27) + ; + out[10 + outpos] = ((in[15 + inpos]) >>> (21 - 16)) + | ((in[16 + inpos]) << 16) + ; + out[11 + outpos] = ((in[16 + inpos]) >>> (21 - 5)) + | ((in[17 + inpos]) << 5) + | ((in[18 + inpos]) << 26) + ; + out[12 + outpos] = ((in[18 + inpos]) >>> (21 - 15)) + | ((in[19 + inpos]) << 15) + ; + out[13 + outpos] = ((in[19 + inpos]) >>> (21 - 4)) + | ((in[20 + inpos]) << 4) + | ((in[21 + inpos]) << 25) + ; + out[14 + outpos] = ((in[21 + inpos]) >>> (21 - 14)) + | ((in[22 + inpos]) << 14) + ; + out[15 + outpos] = ((in[22 + inpos]) >>> (21 - 3)) + | ((in[23 + inpos]) << 3) + | ((in[24 + inpos]) << 24) + ; + out[16 + outpos] = ((in[24 + inpos]) >>> (21 - 13)) + | ((in[25 + inpos]) << 13) + ; + out[17 + outpos] = ((in[25 + inpos]) >>> (21 - 2)) + | ((in[26 + inpos]) << 2) + | ((in[27 + inpos]) << 23) + ; + out[18 + outpos] = ((in[27 + inpos]) >>> (21 - 12)) + | ((in[28 + inpos]) << 12) + ; + out[19 + outpos] = ((in[28 + inpos]) >>> (21 - 1)) + | ((in[29 + inpos]) << 1) + | ((in[30 + inpos]) << 22) + ; + out[20 + outpos] = ((in[30 + inpos]) >>> (21 - 11)) + | ((in[31 + inpos]) << 11) + ; + } + + + public static void fastpackwithoutmask22(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 22) + ; + out[1 + outpos] = ((in[1 + inpos]) >>> (22 - 12)) + | ((in[2 + inpos]) << 12) + ; + out[2 + outpos] = ((in[2 + inpos]) >>> (22 - 2)) + | ((in[3 + inpos]) << 2) + | ((in[4 + inpos]) << 24) + ; + out[3 + outpos] = ((in[4 + inpos]) >>> (22 - 14)) + | ((in[5 + inpos]) << 14) + ; + out[4 + outpos] = ((in[5 + inpos]) >>> (22 - 4)) + | ((in[6 + inpos]) << 4) + | ((in[7 + inpos]) << 26) + ; + out[5 + outpos] = ((in[7 + inpos]) >>> (22 - 16)) + | ((in[8 + inpos]) << 16) + ; + out[6 + outpos] = ((in[8 + inpos]) >>> (22 - 6)) + | ((in[9 + inpos]) << 6) + | ((in[10 + inpos]) << 28) + ; + out[7 + outpos] = ((in[10 + inpos]) >>> (22 - 18)) + | ((in[11 + inpos]) << 18) + ; + out[8 + outpos] = ((in[11 + inpos]) >>> (22 - 8)) + | ((in[12 + inpos]) << 8) + | ((in[13 + inpos]) << 30) + ; + out[9 + outpos] = ((in[13 + inpos]) >>> (22 - 20)) + | ((in[14 + inpos]) << 20) + ; + out[10 + outpos] = ((in[14 + inpos]) >>> (22 - 10)) + | ((in[15 + inpos]) << 10) + ; + out[11 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 22) + ; + out[12 + outpos] = ((in[17 + inpos]) >>> (22 - 12)) + | ((in[18 + inpos]) << 12) + ; + out[13 + outpos] = ((in[18 + inpos]) >>> (22 - 2)) + | ((in[19 + inpos]) << 2) + | ((in[20 + inpos]) << 24) + ; + out[14 + outpos] = ((in[20 + inpos]) >>> (22 - 14)) + | ((in[21 + inpos]) << 14) + ; + out[15 + outpos] = ((in[21 + inpos]) >>> (22 - 4)) + | ((in[22 + inpos]) << 4) + | ((in[23 + inpos]) << 26) + ; + out[16 + outpos] = ((in[23 + inpos]) >>> (22 - 16)) + | ((in[24 + inpos]) << 16) + ; + out[17 + outpos] = ((in[24 + inpos]) >>> (22 - 6)) + | ((in[25 + inpos]) << 6) + | ((in[26 + inpos]) << 28) + ; + out[18 + outpos] = ((in[26 + inpos]) >>> (22 - 18)) + | ((in[27 + inpos]) << 18) + ; + out[19 + outpos] = ((in[27 + inpos]) >>> (22 - 8)) + | ((in[28 + inpos]) << 8) + | ((in[29 + inpos]) << 30) + ; + out[20 + outpos] = ((in[29 + inpos]) >>> (22 - 20)) + | ((in[30 + inpos]) << 20) + ; + out[21 + outpos] = ((in[30 + inpos]) >>> (22 - 10)) + | ((in[31 + inpos]) << 10) + ; + } + + + public static void fastpackwithoutmask23(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 23) + ; + out[1 + outpos] = ((in[1 + inpos]) >>> (23 - 14)) + | ((in[2 + inpos]) << 14) + ; + out[2 + outpos] = ((in[2 + inpos]) >>> (23 - 5)) + | ((in[3 + inpos]) << 5) + | ((in[4 + inpos]) << 28) + ; + out[3 + outpos] = ((in[4 + inpos]) >>> (23 - 19)) + | ((in[5 + inpos]) << 19) + ; + out[4 + outpos] = ((in[5 + inpos]) >>> (23 - 10)) + | ((in[6 + inpos]) << 10) + ; + out[5 + outpos] = ((in[6 + inpos]) >>> (23 - 1)) + | ((in[7 + inpos]) << 1) + | ((in[8 + inpos]) << 24) + ; + out[6 + outpos] = ((in[8 + inpos]) >>> (23 - 15)) + | ((in[9 + inpos]) << 15) + ; + out[7 + outpos] = ((in[9 + inpos]) >>> (23 - 6)) + | ((in[10 + inpos]) << 6) + | ((in[11 + inpos]) << 29) + ; + out[8 + outpos] = ((in[11 + inpos]) >>> (23 - 20)) + | ((in[12 + inpos]) << 20) + ; + out[9 + outpos] = ((in[12 + inpos]) >>> (23 - 11)) + | ((in[13 + inpos]) << 11) + ; + out[10 + outpos] = ((in[13 + inpos]) >>> (23 - 2)) + | ((in[14 + inpos]) << 2) + | ((in[15 + inpos]) << 25) + ; + out[11 + outpos] = ((in[15 + inpos]) >>> (23 - 16)) + | ((in[16 + inpos]) << 16) + ; + out[12 + outpos] = ((in[16 + inpos]) >>> (23 - 7)) + | ((in[17 + inpos]) << 7) + | ((in[18 + inpos]) << 30) + ; + out[13 + outpos] = ((in[18 + inpos]) >>> (23 - 21)) + | ((in[19 + inpos]) << 21) + ; + out[14 + outpos] = ((in[19 + inpos]) >>> (23 - 12)) + | ((in[20 + inpos]) << 12) + ; + out[15 + outpos] = ((in[20 + inpos]) >>> (23 - 3)) + | ((in[21 + inpos]) << 3) + | ((in[22 + inpos]) << 26) + ; + out[16 + outpos] = ((in[22 + inpos]) >>> (23 - 17)) + | ((in[23 + inpos]) << 17) + ; + out[17 + outpos] = ((in[23 + inpos]) >>> (23 - 8)) + | ((in[24 + inpos]) << 8) + | ((in[25 + inpos]) << 31) + ; + out[18 + outpos] = ((in[25 + inpos]) >>> (23 - 22)) + | ((in[26 + inpos]) << 22) + ; + out[19 + outpos] = ((in[26 + inpos]) >>> (23 - 13)) + | ((in[27 + inpos]) << 13) + ; + out[20 + outpos] = ((in[27 + inpos]) >>> (23 - 4)) + | ((in[28 + inpos]) << 4) + | ((in[29 + inpos]) << 27) + ; + out[21 + outpos] = ((in[29 + inpos]) >>> (23 - 18)) + | ((in[30 + inpos]) << 18) + ; + out[22 + outpos] = ((in[30 + inpos]) >>> (23 - 9)) + | ((in[31 + inpos]) << 9) + ; + } + + + public static void fastpackwithoutmask24(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 24) + ; + out[1 + outpos] = ((in[1 + inpos]) >>> (24 - 16)) + | ((in[2 + inpos]) << 16) + ; + out[2 + outpos] = ((in[2 + inpos]) >>> (24 - 8)) + | ((in[3 + inpos]) << 8) + ; + out[3 + outpos] = in[4 + inpos] + | ((in[5 + inpos]) << 24) + ; + out[4 + outpos] = ((in[5 + inpos]) >>> (24 - 16)) + | ((in[6 + inpos]) << 16) + ; + out[5 + outpos] = ((in[6 + inpos]) >>> (24 - 8)) + | ((in[7 + inpos]) << 8) + ; + out[6 + outpos] = in[8 + inpos] + | ((in[9 + inpos]) << 24) + ; + out[7 + outpos] = ((in[9 + inpos]) >>> (24 - 16)) + | ((in[10 + inpos]) << 16) + ; + out[8 + outpos] = ((in[10 + inpos]) >>> (24 - 8)) + | ((in[11 + inpos]) << 8) + ; + out[9 + outpos] = in[12 + inpos] + | ((in[13 + inpos]) << 24) + ; + out[10 + outpos] = ((in[13 + inpos]) >>> (24 - 16)) + | ((in[14 + inpos]) << 16) + ; + out[11 + outpos] = ((in[14 + inpos]) >>> (24 - 8)) + | ((in[15 + inpos]) << 8) + ; + out[12 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 24) + ; + out[13 + outpos] = ((in[17 + inpos]) >>> (24 - 16)) + | ((in[18 + inpos]) << 16) + ; + out[14 + outpos] = ((in[18 + inpos]) >>> (24 - 8)) + | ((in[19 + inpos]) << 8) + ; + out[15 + outpos] = in[20 + inpos] + | ((in[21 + inpos]) << 24) + ; + out[16 + outpos] = ((in[21 + inpos]) >>> (24 - 16)) + | ((in[22 + inpos]) << 16) + ; + out[17 + outpos] = ((in[22 + inpos]) >>> (24 - 8)) + | ((in[23 + inpos]) << 8) + ; + out[18 + outpos] = in[24 + inpos] + | ((in[25 + inpos]) << 24) + ; + out[19 + outpos] = ((in[25 + inpos]) >>> (24 - 16)) + | ((in[26 + inpos]) << 16) + ; + out[20 + outpos] = ((in[26 + inpos]) >>> (24 - 8)) + | ((in[27 + inpos]) << 8) + ; + out[21 + outpos] = in[28 + inpos] + | ((in[29 + inpos]) << 24) + ; + out[22 + outpos] = ((in[29 + inpos]) >>> (24 - 16)) + | ((in[30 + inpos]) << 16) + ; + out[23 + outpos] = ((in[30 + inpos]) >>> (24 - 8)) + | ((in[31 + inpos]) << 8) + ; + } + + + public static void fastpackwithoutmask25(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 25) + ; + out[1 + outpos] = ((in[1 + inpos]) >>> (25 - 18)) + | ((in[2 + inpos]) << 18) + ; + out[2 + outpos] = ((in[2 + inpos]) >>> (25 - 11)) + | ((in[3 + inpos]) << 11) + ; + out[3 + outpos] = ((in[3 + inpos]) >>> (25 - 4)) + | ((in[4 + inpos]) << 4) + | ((in[5 + inpos]) << 29) + ; + out[4 + outpos] = ((in[5 + inpos]) >>> (25 - 22)) + | ((in[6 + inpos]) << 22) + ; + out[5 + outpos] = ((in[6 + inpos]) >>> (25 - 15)) + | ((in[7 + inpos]) << 15) + ; + out[6 + outpos] = ((in[7 + inpos]) >>> (25 - 8)) + | ((in[8 + inpos]) << 8) + ; + out[7 + outpos] = ((in[8 + inpos]) >>> (25 - 1)) + | ((in[9 + inpos]) << 1) + | ((in[10 + inpos]) << 26) + ; + out[8 + outpos] = ((in[10 + inpos]) >>> (25 - 19)) + | ((in[11 + inpos]) << 19) + ; + out[9 + outpos] = ((in[11 + inpos]) >>> (25 - 12)) + | ((in[12 + inpos]) << 12) + ; + out[10 + outpos] = ((in[12 + inpos]) >>> (25 - 5)) + | ((in[13 + inpos]) << 5) + | ((in[14 + inpos]) << 30) + ; + out[11 + outpos] = ((in[14 + inpos]) >>> (25 - 23)) + | ((in[15 + inpos]) << 23) + ; + out[12 + outpos] = ((in[15 + inpos]) >>> (25 - 16)) + | ((in[16 + inpos]) << 16) + ; + out[13 + outpos] = ((in[16 + inpos]) >>> (25 - 9)) + | ((in[17 + inpos]) << 9) + ; + out[14 + outpos] = ((in[17 + inpos]) >>> (25 - 2)) + | ((in[18 + inpos]) << 2) + | ((in[19 + inpos]) << 27) + ; + out[15 + outpos] = ((in[19 + inpos]) >>> (25 - 20)) + | ((in[20 + inpos]) << 20) + ; + out[16 + outpos] = ((in[20 + inpos]) >>> (25 - 13)) + | ((in[21 + inpos]) << 13) + ; + out[17 + outpos] = ((in[21 + inpos]) >>> (25 - 6)) + | ((in[22 + inpos]) << 6) + | ((in[23 + inpos]) << 31) + ; + out[18 + outpos] = ((in[23 + inpos]) >>> (25 - 24)) + | ((in[24 + inpos]) << 24) + ; + out[19 + outpos] = ((in[24 + inpos]) >>> (25 - 17)) + | ((in[25 + inpos]) << 17) + ; + out[20 + outpos] = ((in[25 + inpos]) >>> (25 - 10)) + | ((in[26 + inpos]) << 10) + ; + out[21 + outpos] = ((in[26 + inpos]) >>> (25 - 3)) + | ((in[27 + inpos]) << 3) + | ((in[28 + inpos]) << 28) + ; + out[22 + outpos] = ((in[28 + inpos]) >>> (25 - 21)) + | ((in[29 + inpos]) << 21) + ; + out[23 + outpos] = ((in[29 + inpos]) >>> (25 - 14)) + | ((in[30 + inpos]) << 14) + ; + out[24 + outpos] = ((in[30 + inpos]) >>> (25 - 7)) + | ((in[31 + inpos]) << 7) + ; + } + + + public static void fastpackwithoutmask26(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 26) + ; + out[1 + outpos] = ((in[1 + inpos]) >>> (26 - 20)) + | ((in[2 + inpos]) << 20) + ; + out[2 + outpos] = ((in[2 + inpos]) >>> (26 - 14)) + | ((in[3 + inpos]) << 14) + ; + out[3 + outpos] = ((in[3 + inpos]) >>> (26 - 8)) + | ((in[4 + inpos]) << 8) + ; + out[4 + outpos] = ((in[4 + inpos]) >>> (26 - 2)) + | ((in[5 + inpos]) << 2) + | ((in[6 + inpos]) << 28) + ; + out[5 + outpos] = ((in[6 + inpos]) >>> (26 - 22)) + | ((in[7 + inpos]) << 22) + ; + out[6 + outpos] = ((in[7 + inpos]) >>> (26 - 16)) + | ((in[8 + inpos]) << 16) + ; + out[7 + outpos] = ((in[8 + inpos]) >>> (26 - 10)) + | ((in[9 + inpos]) << 10) + ; + out[8 + outpos] = ((in[9 + inpos]) >>> (26 - 4)) + | ((in[10 + inpos]) << 4) + | ((in[11 + inpos]) << 30) + ; + out[9 + outpos] = ((in[11 + inpos]) >>> (26 - 24)) + | ((in[12 + inpos]) << 24) + ; + out[10 + outpos] = ((in[12 + inpos]) >>> (26 - 18)) + | ((in[13 + inpos]) << 18) + ; + out[11 + outpos] = ((in[13 + inpos]) >>> (26 - 12)) + | ((in[14 + inpos]) << 12) + ; + out[12 + outpos] = ((in[14 + inpos]) >>> (26 - 6)) + | ((in[15 + inpos]) << 6) + ; + out[13 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 26) + ; + out[14 + outpos] = ((in[17 + inpos]) >>> (26 - 20)) + | ((in[18 + inpos]) << 20) + ; + out[15 + outpos] = ((in[18 + inpos]) >>> (26 - 14)) + | ((in[19 + inpos]) << 14) + ; + out[16 + outpos] = ((in[19 + inpos]) >>> (26 - 8)) + | ((in[20 + inpos]) << 8) + ; + out[17 + outpos] = ((in[20 + inpos]) >>> (26 - 2)) + | ((in[21 + inpos]) << 2) + | ((in[22 + inpos]) << 28) + ; + out[18 + outpos] = ((in[22 + inpos]) >>> (26 - 22)) + | ((in[23 + inpos]) << 22) + ; + out[19 + outpos] = ((in[23 + inpos]) >>> (26 - 16)) + | ((in[24 + inpos]) << 16) + ; + out[20 + outpos] = ((in[24 + inpos]) >>> (26 - 10)) + | ((in[25 + inpos]) << 10) + ; + out[21 + outpos] = ((in[25 + inpos]) >>> (26 - 4)) + | ((in[26 + inpos]) << 4) + | ((in[27 + inpos]) << 30) + ; + out[22 + outpos] = ((in[27 + inpos]) >>> (26 - 24)) + | ((in[28 + inpos]) << 24) + ; + out[23 + outpos] = ((in[28 + inpos]) >>> (26 - 18)) + | ((in[29 + inpos]) << 18) + ; + out[24 + outpos] = ((in[29 + inpos]) >>> (26 - 12)) + | ((in[30 + inpos]) << 12) + ; + out[25 + outpos] = ((in[30 + inpos]) >>> (26 - 6)) + | ((in[31 + inpos]) << 6) + ; + } + + + public static void fastpackwithoutmask27(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 27) + ; + out[1 + outpos] = ((in[1 + inpos]) >>> (27 - 22)) + | ((in[2 + inpos]) << 22) + ; + out[2 + outpos] = ((in[2 + inpos]) >>> (27 - 17)) + | ((in[3 + inpos]) << 17) + ; + out[3 + outpos] = ((in[3 + inpos]) >>> (27 - 12)) + | ((in[4 + inpos]) << 12) + ; + out[4 + outpos] = ((in[4 + inpos]) >>> (27 - 7)) + | ((in[5 + inpos]) << 7) + ; + out[5 + outpos] = ((in[5 + inpos]) >>> (27 - 2)) + | ((in[6 + inpos]) << 2) + | ((in[7 + inpos]) << 29) + ; + out[6 + outpos] = ((in[7 + inpos]) >>> (27 - 24)) + | ((in[8 + inpos]) << 24) + ; + out[7 + outpos] = ((in[8 + inpos]) >>> (27 - 19)) + | ((in[9 + inpos]) << 19) + ; + out[8 + outpos] = ((in[9 + inpos]) >>> (27 - 14)) + | ((in[10 + inpos]) << 14) + ; + out[9 + outpos] = ((in[10 + inpos]) >>> (27 - 9)) + | ((in[11 + inpos]) << 9) + ; + out[10 + outpos] = ((in[11 + inpos]) >>> (27 - 4)) + | ((in[12 + inpos]) << 4) + | ((in[13 + inpos]) << 31) + ; + out[11 + outpos] = ((in[13 + inpos]) >>> (27 - 26)) + | ((in[14 + inpos]) << 26) + ; + out[12 + outpos] = ((in[14 + inpos]) >>> (27 - 21)) + | ((in[15 + inpos]) << 21) + ; + out[13 + outpos] = ((in[15 + inpos]) >>> (27 - 16)) + | ((in[16 + inpos]) << 16) + ; + out[14 + outpos] = ((in[16 + inpos]) >>> (27 - 11)) + | ((in[17 + inpos]) << 11) + ; + out[15 + outpos] = ((in[17 + inpos]) >>> (27 - 6)) + | ((in[18 + inpos]) << 6) + ; + out[16 + outpos] = ((in[18 + inpos]) >>> (27 - 1)) + | ((in[19 + inpos]) << 1) + | ((in[20 + inpos]) << 28) + ; + out[17 + outpos] = ((in[20 + inpos]) >>> (27 - 23)) + | ((in[21 + inpos]) << 23) + ; + out[18 + outpos] = ((in[21 + inpos]) >>> (27 - 18)) + | ((in[22 + inpos]) << 18) + ; + out[19 + outpos] = ((in[22 + inpos]) >>> (27 - 13)) + | ((in[23 + inpos]) << 13) + ; + out[20 + outpos] = ((in[23 + inpos]) >>> (27 - 8)) + | ((in[24 + inpos]) << 8) + ; + out[21 + outpos] = ((in[24 + inpos]) >>> (27 - 3)) + | ((in[25 + inpos]) << 3) + | ((in[26 + inpos]) << 30) + ; + out[22 + outpos] = ((in[26 + inpos]) >>> (27 - 25)) + | ((in[27 + inpos]) << 25) + ; + out[23 + outpos] = ((in[27 + inpos]) >>> (27 - 20)) + | ((in[28 + inpos]) << 20) + ; + out[24 + outpos] = ((in[28 + inpos]) >>> (27 - 15)) + | ((in[29 + inpos]) << 15) + ; + out[25 + outpos] = ((in[29 + inpos]) >>> (27 - 10)) + | ((in[30 + inpos]) << 10) + ; + out[26 + outpos] = ((in[30 + inpos]) >>> (27 - 5)) + | ((in[31 + inpos]) << 5) + ; + } + + + public static void fastpackwithoutmask28(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 28) + ; + out[1 + outpos] = ((in[1 + inpos]) >>> (28 - 24)) + | ((in[2 + inpos]) << 24) + ; + out[2 + outpos] = ((in[2 + inpos]) >>> (28 - 20)) + | ((in[3 + inpos]) << 20) + ; + out[3 + outpos] = ((in[3 + inpos]) >>> (28 - 16)) + | ((in[4 + inpos]) << 16) + ; + out[4 + outpos] = ((in[4 + inpos]) >>> (28 - 12)) + | ((in[5 + inpos]) << 12) + ; + out[5 + outpos] = ((in[5 + inpos]) >>> (28 - 8)) + | ((in[6 + inpos]) << 8) + ; + out[6 + outpos] = ((in[6 + inpos]) >>> (28 - 4)) + | ((in[7 + inpos]) << 4) + ; + out[7 + outpos] = in[8 + inpos] + | ((in[9 + inpos]) << 28) + ; + out[8 + outpos] = ((in[9 + inpos]) >>> (28 - 24)) + | ((in[10 + inpos]) << 24) + ; + out[9 + outpos] = ((in[10 + inpos]) >>> (28 - 20)) + | ((in[11 + inpos]) << 20) + ; + out[10 + outpos] = ((in[11 + inpos]) >>> (28 - 16)) + | ((in[12 + inpos]) << 16) + ; + out[11 + outpos] = ((in[12 + inpos]) >>> (28 - 12)) + | ((in[13 + inpos]) << 12) + ; + out[12 + outpos] = ((in[13 + inpos]) >>> (28 - 8)) + | ((in[14 + inpos]) << 8) + ; + out[13 + outpos] = ((in[14 + inpos]) >>> (28 - 4)) + | ((in[15 + inpos]) << 4) + ; + out[14 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 28) + ; + out[15 + outpos] = ((in[17 + inpos]) >>> (28 - 24)) + | ((in[18 + inpos]) << 24) + ; + out[16 + outpos] = ((in[18 + inpos]) >>> (28 - 20)) + | ((in[19 + inpos]) << 20) + ; + out[17 + outpos] = ((in[19 + inpos]) >>> (28 - 16)) + | ((in[20 + inpos]) << 16) + ; + out[18 + outpos] = ((in[20 + inpos]) >>> (28 - 12)) + | ((in[21 + inpos]) << 12) + ; + out[19 + outpos] = ((in[21 + inpos]) >>> (28 - 8)) + | ((in[22 + inpos]) << 8) + ; + out[20 + outpos] = ((in[22 + inpos]) >>> (28 - 4)) + | ((in[23 + inpos]) << 4) + ; + out[21 + outpos] = in[24 + inpos] + | ((in[25 + inpos]) << 28) + ; + out[22 + outpos] = ((in[25 + inpos]) >>> (28 - 24)) + | ((in[26 + inpos]) << 24) + ; + out[23 + outpos] = ((in[26 + inpos]) >>> (28 - 20)) + | ((in[27 + inpos]) << 20) + ; + out[24 + outpos] = ((in[27 + inpos]) >>> (28 - 16)) + | ((in[28 + inpos]) << 16) + ; + out[25 + outpos] = ((in[28 + inpos]) >>> (28 - 12)) + | ((in[29 + inpos]) << 12) + ; + out[26 + outpos] = ((in[29 + inpos]) >>> (28 - 8)) + | ((in[30 + inpos]) << 8) + ; + out[27 + outpos] = ((in[30 + inpos]) >>> (28 - 4)) + | ((in[31 + inpos]) << 4) + ; + } + + + public static void fastpackwithoutmask29(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 29) + ; + out[1 + outpos] = ((in[1 + inpos]) >>> (29 - 26)) + | ((in[2 + inpos]) << 26) + ; + out[2 + outpos] = ((in[2 + inpos]) >>> (29 - 23)) + | ((in[3 + inpos]) << 23) + ; + out[3 + outpos] = ((in[3 + inpos]) >>> (29 - 20)) + | ((in[4 + inpos]) << 20) + ; + out[4 + outpos] = ((in[4 + inpos]) >>> (29 - 17)) + | ((in[5 + inpos]) << 17) + ; + out[5 + outpos] = ((in[5 + inpos]) >>> (29 - 14)) + | ((in[6 + inpos]) << 14) + ; + out[6 + outpos] = ((in[6 + inpos]) >>> (29 - 11)) + | ((in[7 + inpos]) << 11) + ; + out[7 + outpos] = ((in[7 + inpos]) >>> (29 - 8)) + | ((in[8 + inpos]) << 8) + ; + out[8 + outpos] = ((in[8 + inpos]) >>> (29 - 5)) + | ((in[9 + inpos]) << 5) + ; + out[9 + outpos] = ((in[9 + inpos]) >>> (29 - 2)) + | ((in[10 + inpos]) << 2) + | ((in[11 + inpos]) << 31) + ; + out[10 + outpos] = ((in[11 + inpos]) >>> (29 - 28)) + | ((in[12 + inpos]) << 28) + ; + out[11 + outpos] = ((in[12 + inpos]) >>> (29 - 25)) + | ((in[13 + inpos]) << 25) + ; + out[12 + outpos] = ((in[13 + inpos]) >>> (29 - 22)) + | ((in[14 + inpos]) << 22) + ; + out[13 + outpos] = ((in[14 + inpos]) >>> (29 - 19)) + | ((in[15 + inpos]) << 19) + ; + out[14 + outpos] = ((in[15 + inpos]) >>> (29 - 16)) + | ((in[16 + inpos]) << 16) + ; + out[15 + outpos] = ((in[16 + inpos]) >>> (29 - 13)) + | ((in[17 + inpos]) << 13) + ; + out[16 + outpos] = ((in[17 + inpos]) >>> (29 - 10)) + | ((in[18 + inpos]) << 10) + ; + out[17 + outpos] = ((in[18 + inpos]) >>> (29 - 7)) + | ((in[19 + inpos]) << 7) + ; + out[18 + outpos] = ((in[19 + inpos]) >>> (29 - 4)) + | ((in[20 + inpos]) << 4) + ; + out[19 + outpos] = ((in[20 + inpos]) >>> (29 - 1)) + | ((in[21 + inpos]) << 1) + | ((in[22 + inpos]) << 30) + ; + out[20 + outpos] = ((in[22 + inpos]) >>> (29 - 27)) + | ((in[23 + inpos]) << 27) + ; + out[21 + outpos] = ((in[23 + inpos]) >>> (29 - 24)) + | ((in[24 + inpos]) << 24) + ; + out[22 + outpos] = ((in[24 + inpos]) >>> (29 - 21)) + | ((in[25 + inpos]) << 21) + ; + out[23 + outpos] = ((in[25 + inpos]) >>> (29 - 18)) + | ((in[26 + inpos]) << 18) + ; + out[24 + outpos] = ((in[26 + inpos]) >>> (29 - 15)) + | ((in[27 + inpos]) << 15) + ; + out[25 + outpos] = ((in[27 + inpos]) >>> (29 - 12)) + | ((in[28 + inpos]) << 12) + ; + out[26 + outpos] = ((in[28 + inpos]) >>> (29 - 9)) + | ((in[29 + inpos]) << 9) + ; + out[27 + outpos] = ((in[29 + inpos]) >>> (29 - 6)) + | ((in[30 + inpos]) << 6) + ; + out[28 + outpos] = ((in[30 + inpos]) >>> (29 - 3)) + | ((in[31 + inpos]) << 3) + ; + } + + + public static void fastpackwithoutmask30(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 30) + ; + out[1 + outpos] = ((in[1 + inpos]) >>> (30 - 28)) + | ((in[2 + inpos]) << 28) + ; + out[2 + outpos] = ((in[2 + inpos]) >>> (30 - 26)) + | ((in[3 + inpos]) << 26) + ; + out[3 + outpos] = ((in[3 + inpos]) >>> (30 - 24)) + | ((in[4 + inpos]) << 24) + ; + out[4 + outpos] = ((in[4 + inpos]) >>> (30 - 22)) + | ((in[5 + inpos]) << 22) + ; + out[5 + outpos] = ((in[5 + inpos]) >>> (30 - 20)) + | ((in[6 + inpos]) << 20) + ; + out[6 + outpos] = ((in[6 + inpos]) >>> (30 - 18)) + | ((in[7 + inpos]) << 18) + ; + out[7 + outpos] = ((in[7 + inpos]) >>> (30 - 16)) + | ((in[8 + inpos]) << 16) + ; + out[8 + outpos] = ((in[8 + inpos]) >>> (30 - 14)) + | ((in[9 + inpos]) << 14) + ; + out[9 + outpos] = ((in[9 + inpos]) >>> (30 - 12)) + | ((in[10 + inpos]) << 12) + ; + out[10 + outpos] = ((in[10 + inpos]) >>> (30 - 10)) + | ((in[11 + inpos]) << 10) + ; + out[11 + outpos] = ((in[11 + inpos]) >>> (30 - 8)) + | ((in[12 + inpos]) << 8) + ; + out[12 + outpos] = ((in[12 + inpos]) >>> (30 - 6)) + | ((in[13 + inpos]) << 6) + ; + out[13 + outpos] = ((in[13 + inpos]) >>> (30 - 4)) + | ((in[14 + inpos]) << 4) + ; + out[14 + outpos] = ((in[14 + inpos]) >>> (30 - 2)) + | ((in[15 + inpos]) << 2) + ; + out[15 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 30) + ; + out[16 + outpos] = ((in[17 + inpos]) >>> (30 - 28)) + | ((in[18 + inpos]) << 28) + ; + out[17 + outpos] = ((in[18 + inpos]) >>> (30 - 26)) + | ((in[19 + inpos]) << 26) + ; + out[18 + outpos] = ((in[19 + inpos]) >>> (30 - 24)) + | ((in[20 + inpos]) << 24) + ; + out[19 + outpos] = ((in[20 + inpos]) >>> (30 - 22)) + | ((in[21 + inpos]) << 22) + ; + out[20 + outpos] = ((in[21 + inpos]) >>> (30 - 20)) + | ((in[22 + inpos]) << 20) + ; + out[21 + outpos] = ((in[22 + inpos]) >>> (30 - 18)) + | ((in[23 + inpos]) << 18) + ; + out[22 + outpos] = ((in[23 + inpos]) >>> (30 - 16)) + | ((in[24 + inpos]) << 16) + ; + out[23 + outpos] = ((in[24 + inpos]) >>> (30 - 14)) + | ((in[25 + inpos]) << 14) + ; + out[24 + outpos] = ((in[25 + inpos]) >>> (30 - 12)) + | ((in[26 + inpos]) << 12) + ; + out[25 + outpos] = ((in[26 + inpos]) >>> (30 - 10)) + | ((in[27 + inpos]) << 10) + ; + out[26 + outpos] = ((in[27 + inpos]) >>> (30 - 8)) + | ((in[28 + inpos]) << 8) + ; + out[27 + outpos] = ((in[28 + inpos]) >>> (30 - 6)) + | ((in[29 + inpos]) << 6) + ; + out[28 + outpos] = ((in[29 + inpos]) >>> (30 - 4)) + | ((in[30 + inpos]) << 4) + ; + out[29 + outpos] = ((in[30 + inpos]) >>> (30 - 2)) + | ((in[31 + inpos]) << 2) + ; + } + + + public static void fastpackwithoutmask31(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] + | ((in[1 + inpos]) << 31) + ; + out[1 + outpos] = ((in[1 + inpos]) >>> (31 - 30)) + | ((in[2 + inpos]) << 30) + ; + out[2 + outpos] = ((in[2 + inpos]) >>> (31 - 29)) + | ((in[3 + inpos]) << 29) + ; + out[3 + outpos] = ((in[3 + inpos]) >>> (31 - 28)) + | ((in[4 + inpos]) << 28) + ; + out[4 + outpos] = ((in[4 + inpos]) >>> (31 - 27)) + | ((in[5 + inpos]) << 27) + ; + out[5 + outpos] = ((in[5 + inpos]) >>> (31 - 26)) + | ((in[6 + inpos]) << 26) + ; + out[6 + outpos] = ((in[6 + inpos]) >>> (31 - 25)) + | ((in[7 + inpos]) << 25) + ; + out[7 + outpos] = ((in[7 + inpos]) >>> (31 - 24)) + | ((in[8 + inpos]) << 24) + ; + out[8 + outpos] = ((in[8 + inpos]) >>> (31 - 23)) + | ((in[9 + inpos]) << 23) + ; + out[9 + outpos] = ((in[9 + inpos]) >>> (31 - 22)) + | ((in[10 + inpos]) << 22) + ; + out[10 + outpos] = ((in[10 + inpos]) >>> (31 - 21)) + | ((in[11 + inpos]) << 21) + ; + out[11 + outpos] = ((in[11 + inpos]) >>> (31 - 20)) + | ((in[12 + inpos]) << 20) + ; + out[12 + outpos] = ((in[12 + inpos]) >>> (31 - 19)) + | ((in[13 + inpos]) << 19) + ; + out[13 + outpos] = ((in[13 + inpos]) >>> (31 - 18)) + | ((in[14 + inpos]) << 18) + ; + out[14 + outpos] = ((in[14 + inpos]) >>> (31 - 17)) + | ((in[15 + inpos]) << 17) + ; + out[15 + outpos] = ((in[15 + inpos]) >>> (31 - 16)) + | ((in[16 + inpos]) << 16) + ; + out[16 + outpos] = ((in[16 + inpos]) >>> (31 - 15)) + | ((in[17 + inpos]) << 15) + ; + out[17 + outpos] = ((in[17 + inpos]) >>> (31 - 14)) + | ((in[18 + inpos]) << 14) + ; + out[18 + outpos] = ((in[18 + inpos]) >>> (31 - 13)) + | ((in[19 + inpos]) << 13) + ; + out[19 + outpos] = ((in[19 + inpos]) >>> (31 - 12)) + | ((in[20 + inpos]) << 12) + ; + out[20 + outpos] = ((in[20 + inpos]) >>> (31 - 11)) + | ((in[21 + inpos]) << 11) + ; + out[21 + outpos] = ((in[21 + inpos]) >>> (31 - 10)) + | ((in[22 + inpos]) << 10) + ; + out[22 + outpos] = ((in[22 + inpos]) >>> (31 - 9)) + | ((in[23 + inpos]) << 9) + ; + out[23 + outpos] = ((in[23 + inpos]) >>> (31 - 8)) + | ((in[24 + inpos]) << 8) + ; + out[24 + outpos] = ((in[24 + inpos]) >>> (31 - 7)) + | ((in[25 + inpos]) << 7) + ; + out[25 + outpos] = ((in[25 + inpos]) >>> (31 - 6)) + | ((in[26 + inpos]) << 6) + ; + out[26 + outpos] = ((in[26 + inpos]) >>> (31 - 5)) + | ((in[27 + inpos]) << 5) + ; + out[27 + outpos] = ((in[27 + inpos]) >>> (31 - 4)) + | ((in[28 + inpos]) << 4) + ; + out[28 + outpos] = ((in[28 + inpos]) >>> (31 - 3)) + | ((in[29 + inpos]) << 3) + ; + out[29 + outpos] = ((in[29 + inpos]) >>> (31 - 2)) + | ((in[30 + inpos]) << 2) + ; + out[30 + outpos] = ((in[30 + inpos]) >>> (31 - 1)) + | ((in[31 + inpos]) << 1) + ; + } + + + public static void fastpack1(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 1) + | ((in[1 + inpos] & 1) << 1) + | ((in[2 + inpos] & 1) << 2) + | ((in[3 + inpos] & 1) << 3) + | ((in[4 + inpos] & 1) << 4) + | ((in[5 + inpos] & 1) << 5) + | ((in[6 + inpos] & 1) << 6) + | ((in[7 + inpos] & 1) << 7) + | ((in[8 + inpos] & 1) << 8) + | ((in[9 + inpos] & 1) << 9) + | ((in[10 + inpos] & 1) << 10) + | ((in[11 + inpos] & 1) << 11) + | ((in[12 + inpos] & 1) << 12) + | ((in[13 + inpos] & 1) << 13) + | ((in[14 + inpos] & 1) << 14) + | ((in[15 + inpos] & 1) << 15) + | ((in[16 + inpos] & 1) << 16) + | ((in[17 + inpos] & 1) << 17) + | ((in[18 + inpos] & 1) << 18) + | ((in[19 + inpos] & 1) << 19) + | ((in[20 + inpos] & 1) << 20) + | ((in[21 + inpos] & 1) << 21) + | ((in[22 + inpos] & 1) << 22) + | ((in[23 + inpos] & 1) << 23) + | ((in[24 + inpos] & 1) << 24) + | ((in[25 + inpos] & 1) << 25) + | ((in[26 + inpos] & 1) << 26) + | ((in[27 + inpos] & 1) << 27) + | ((in[28 + inpos] & 1) << 28) + | ((in[29 + inpos] & 1) << 29) + | ((in[30 + inpos] & 1) << 30) + | ((in[31 + inpos]) << 31) + ; + } + + + public static void fastpack2(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 3) + | ((in[1 + inpos] & 3) << 2) + | ((in[2 + inpos] & 3) << 4) + | ((in[3 + inpos] & 3) << 6) + | ((in[4 + inpos] & 3) << 8) + | ((in[5 + inpos] & 3) << 10) + | ((in[6 + inpos] & 3) << 12) + | ((in[7 + inpos] & 3) << 14) + | ((in[8 + inpos] & 3) << 16) + | ((in[9 + inpos] & 3) << 18) + | ((in[10 + inpos] & 3) << 20) + | ((in[11 + inpos] & 3) << 22) + | ((in[12 + inpos] & 3) << 24) + | ((in[13 + inpos] & 3) << 26) + | ((in[14 + inpos] & 3) << 28) + | ((in[15 + inpos]) << 30) + ; + out[1 + outpos] = (in[16 + inpos] & 3) + | ((in[17 + inpos] & 3) << 2) + | ((in[18 + inpos] & 3) << 4) + | ((in[19 + inpos] & 3) << 6) + | ((in[20 + inpos] & 3) << 8) + | ((in[21 + inpos] & 3) << 10) + | ((in[22 + inpos] & 3) << 12) + | ((in[23 + inpos] & 3) << 14) + | ((in[24 + inpos] & 3) << 16) + | ((in[25 + inpos] & 3) << 18) + | ((in[26 + inpos] & 3) << 20) + | ((in[27 + inpos] & 3) << 22) + | ((in[28 + inpos] & 3) << 24) + | ((in[29 + inpos] & 3) << 26) + | ((in[30 + inpos] & 3) << 28) + | ((in[31 + inpos]) << 30) + ; + } + + + public static void fastpack3(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 7) + | ((in[1 + inpos] & 7) << 3) + | ((in[2 + inpos] & 7) << 6) + | ((in[3 + inpos] & 7) << 9) + | ((in[4 + inpos] & 7) << 12) + | ((in[5 + inpos] & 7) << 15) + | ((in[6 + inpos] & 7) << 18) + | ((in[7 + inpos] & 7) << 21) + | ((in[8 + inpos] & 7) << 24) + | ((in[9 + inpos] & 7) << 27) + | ((in[10 + inpos]) << 30) + ; + out[1 + outpos] = ((in[10 + inpos] & 7) >>> (3 - 1)) + | ((in[11 + inpos] & 7) << 1) + | ((in[12 + inpos] & 7) << 4) + | ((in[13 + inpos] & 7) << 7) + | ((in[14 + inpos] & 7) << 10) + | ((in[15 + inpos] & 7) << 13) + | ((in[16 + inpos] & 7) << 16) + | ((in[17 + inpos] & 7) << 19) + | ((in[18 + inpos] & 7) << 22) + | ((in[19 + inpos] & 7) << 25) + | ((in[20 + inpos] & 7) << 28) + | ((in[21 + inpos]) << 31) + ; + out[2 + outpos] = ((in[21 + inpos] & 7) >>> (3 - 2)) + | ((in[22 + inpos] & 7) << 2) + | ((in[23 + inpos] & 7) << 5) + | ((in[24 + inpos] & 7) << 8) + | ((in[25 + inpos] & 7) << 11) + | ((in[26 + inpos] & 7) << 14) + | ((in[27 + inpos] & 7) << 17) + | ((in[28 + inpos] & 7) << 20) + | ((in[29 + inpos] & 7) << 23) + | ((in[30 + inpos] & 7) << 26) + | ((in[31 + inpos]) << 29) + ; + } + + + public static void fastpack4(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 15) + | ((in[1 + inpos] & 15) << 4) + | ((in[2 + inpos] & 15) << 8) + | ((in[3 + inpos] & 15) << 12) + | ((in[4 + inpos] & 15) << 16) + | ((in[5 + inpos] & 15) << 20) + | ((in[6 + inpos] & 15) << 24) + | ((in[7 + inpos]) << 28) + ; + out[1 + outpos] = (in[8 + inpos] & 15) + | ((in[9 + inpos] & 15) << 4) + | ((in[10 + inpos] & 15) << 8) + | ((in[11 + inpos] & 15) << 12) + | ((in[12 + inpos] & 15) << 16) + | ((in[13 + inpos] & 15) << 20) + | ((in[14 + inpos] & 15) << 24) + | ((in[15 + inpos]) << 28) + ; + out[2 + outpos] = (in[16 + inpos] & 15) + | ((in[17 + inpos] & 15) << 4) + | ((in[18 + inpos] & 15) << 8) + | ((in[19 + inpos] & 15) << 12) + | ((in[20 + inpos] & 15) << 16) + | ((in[21 + inpos] & 15) << 20) + | ((in[22 + inpos] & 15) << 24) + | ((in[23 + inpos]) << 28) + ; + out[3 + outpos] = (in[24 + inpos] & 15) + | ((in[25 + inpos] & 15) << 4) + | ((in[26 + inpos] & 15) << 8) + | ((in[27 + inpos] & 15) << 12) + | ((in[28 + inpos] & 15) << 16) + | ((in[29 + inpos] & 15) << 20) + | ((in[30 + inpos] & 15) << 24) + | ((in[31 + inpos]) << 28) + ; + } + + + public static void fastpack5(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 31) + | ((in[1 + inpos] & 31) << 5) + | ((in[2 + inpos] & 31) << 10) + | ((in[3 + inpos] & 31) << 15) + | ((in[4 + inpos] & 31) << 20) + | ((in[5 + inpos] & 31) << 25) + | ((in[6 + inpos]) << 30) + ; + out[1 + outpos] = ((in[6 + inpos] & 31) >>> (5 - 3)) + | ((in[7 + inpos] & 31) << 3) + | ((in[8 + inpos] & 31) << 8) + | ((in[9 + inpos] & 31) << 13) + | ((in[10 + inpos] & 31) << 18) + | ((in[11 + inpos] & 31) << 23) + | ((in[12 + inpos]) << 28) + ; + out[2 + outpos] = ((in[12 + inpos] & 31) >>> (5 - 1)) + | ((in[13 + inpos] & 31) << 1) + | ((in[14 + inpos] & 31) << 6) + | ((in[15 + inpos] & 31) << 11) + | ((in[16 + inpos] & 31) << 16) + | ((in[17 + inpos] & 31) << 21) + | ((in[18 + inpos] & 31) << 26) + | ((in[19 + inpos]) << 31) + ; + out[3 + outpos] = ((in[19 + inpos] & 31) >>> (5 - 4)) + | ((in[20 + inpos] & 31) << 4) + | ((in[21 + inpos] & 31) << 9) + | ((in[22 + inpos] & 31) << 14) + | ((in[23 + inpos] & 31) << 19) + | ((in[24 + inpos] & 31) << 24) + | ((in[25 + inpos]) << 29) + ; + out[4 + outpos] = ((in[25 + inpos] & 31) >>> (5 - 2)) + | ((in[26 + inpos] & 31) << 2) + | ((in[27 + inpos] & 31) << 7) + | ((in[28 + inpos] & 31) << 12) + | ((in[29 + inpos] & 31) << 17) + | ((in[30 + inpos] & 31) << 22) + | ((in[31 + inpos]) << 27) + ; + } + + + public static void fastpack6(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 63) + | ((in[1 + inpos] & 63) << 6) + | ((in[2 + inpos] & 63) << 12) + | ((in[3 + inpos] & 63) << 18) + | ((in[4 + inpos] & 63) << 24) + | ((in[5 + inpos]) << 30) + ; + out[1 + outpos] = ((in[5 + inpos] & 63) >>> (6 - 4)) + | ((in[6 + inpos] & 63) << 4) + | ((in[7 + inpos] & 63) << 10) + | ((in[8 + inpos] & 63) << 16) + | ((in[9 + inpos] & 63) << 22) + | ((in[10 + inpos]) << 28) + ; + out[2 + outpos] = ((in[10 + inpos] & 63) >>> (6 - 2)) + | ((in[11 + inpos] & 63) << 2) + | ((in[12 + inpos] & 63) << 8) + | ((in[13 + inpos] & 63) << 14) + | ((in[14 + inpos] & 63) << 20) + | ((in[15 + inpos]) << 26) + ; + out[3 + outpos] = (in[16 + inpos] & 63) + | ((in[17 + inpos] & 63) << 6) + | ((in[18 + inpos] & 63) << 12) + | ((in[19 + inpos] & 63) << 18) + | ((in[20 + inpos] & 63) << 24) + | ((in[21 + inpos]) << 30) + ; + out[4 + outpos] = ((in[21 + inpos] & 63) >>> (6 - 4)) + | ((in[22 + inpos] & 63) << 4) + | ((in[23 + inpos] & 63) << 10) + | ((in[24 + inpos] & 63) << 16) + | ((in[25 + inpos] & 63) << 22) + | ((in[26 + inpos]) << 28) + ; + out[5 + outpos] = ((in[26 + inpos] & 63) >>> (6 - 2)) + | ((in[27 + inpos] & 63) << 2) + | ((in[28 + inpos] & 63) << 8) + | ((in[29 + inpos] & 63) << 14) + | ((in[30 + inpos] & 63) << 20) + | ((in[31 + inpos]) << 26) + ; + } + + + public static void fastpack7(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 127) + | ((in[1 + inpos] & 127) << 7) + | ((in[2 + inpos] & 127) << 14) + | ((in[3 + inpos] & 127) << 21) + | ((in[4 + inpos]) << 28) + ; + out[1 + outpos] = ((in[4 + inpos] & 127) >>> (7 - 3)) + | ((in[5 + inpos] & 127) << 3) + | ((in[6 + inpos] & 127) << 10) + | ((in[7 + inpos] & 127) << 17) + | ((in[8 + inpos] & 127) << 24) + | ((in[9 + inpos]) << 31) + ; + out[2 + outpos] = ((in[9 + inpos] & 127) >>> (7 - 6)) + | ((in[10 + inpos] & 127) << 6) + | ((in[11 + inpos] & 127) << 13) + | ((in[12 + inpos] & 127) << 20) + | ((in[13 + inpos]) << 27) + ; + out[3 + outpos] = ((in[13 + inpos] & 127) >>> (7 - 2)) + | ((in[14 + inpos] & 127) << 2) + | ((in[15 + inpos] & 127) << 9) + | ((in[16 + inpos] & 127) << 16) + | ((in[17 + inpos] & 127) << 23) + | ((in[18 + inpos]) << 30) + ; + out[4 + outpos] = ((in[18 + inpos] & 127) >>> (7 - 5)) + | ((in[19 + inpos] & 127) << 5) + | ((in[20 + inpos] & 127) << 12) + | ((in[21 + inpos] & 127) << 19) + | ((in[22 + inpos]) << 26) + ; + out[5 + outpos] = ((in[22 + inpos] & 127) >>> (7 - 1)) + | ((in[23 + inpos] & 127) << 1) + | ((in[24 + inpos] & 127) << 8) + | ((in[25 + inpos] & 127) << 15) + | ((in[26 + inpos] & 127) << 22) + | ((in[27 + inpos]) << 29) + ; + out[6 + outpos] = ((in[27 + inpos] & 127) >>> (7 - 4)) + | ((in[28 + inpos] & 127) << 4) + | ((in[29 + inpos] & 127) << 11) + | ((in[30 + inpos] & 127) << 18) + | ((in[31 + inpos]) << 25) + ; + } + + + public static void fastpack8(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 255) + | ((in[1 + inpos] & 255) << 8) + | ((in[2 + inpos] & 255) << 16) + | ((in[3 + inpos]) << 24) + ; + out[1 + outpos] = (in[4 + inpos] & 255) + | ((in[5 + inpos] & 255) << 8) + | ((in[6 + inpos] & 255) << 16) + | ((in[7 + inpos]) << 24) + ; + out[2 + outpos] = (in[8 + inpos] & 255) + | ((in[9 + inpos] & 255) << 8) + | ((in[10 + inpos] & 255) << 16) + | ((in[11 + inpos]) << 24) + ; + out[3 + outpos] = (in[12 + inpos] & 255) + | ((in[13 + inpos] & 255) << 8) + | ((in[14 + inpos] & 255) << 16) + | ((in[15 + inpos]) << 24) + ; + out[4 + outpos] = (in[16 + inpos] & 255) + | ((in[17 + inpos] & 255) << 8) + | ((in[18 + inpos] & 255) << 16) + | ((in[19 + inpos]) << 24) + ; + out[5 + outpos] = (in[20 + inpos] & 255) + | ((in[21 + inpos] & 255) << 8) + | ((in[22 + inpos] & 255) << 16) + | ((in[23 + inpos]) << 24) + ; + out[6 + outpos] = (in[24 + inpos] & 255) + | ((in[25 + inpos] & 255) << 8) + | ((in[26 + inpos] & 255) << 16) + | ((in[27 + inpos]) << 24) + ; + out[7 + outpos] = (in[28 + inpos] & 255) + | ((in[29 + inpos] & 255) << 8) + | ((in[30 + inpos] & 255) << 16) + | ((in[31 + inpos]) << 24) + ; + } + + + public static void fastpack9(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 511) + | ((in[1 + inpos] & 511) << 9) + | ((in[2 + inpos] & 511) << 18) + | ((in[3 + inpos]) << 27) + ; + out[1 + outpos] = ((in[3 + inpos] & 511) >>> (9 - 4)) + | ((in[4 + inpos] & 511) << 4) + | ((in[5 + inpos] & 511) << 13) + | ((in[6 + inpos] & 511) << 22) + | ((in[7 + inpos]) << 31) + ; + out[2 + outpos] = ((in[7 + inpos] & 511) >>> (9 - 8)) + | ((in[8 + inpos] & 511) << 8) + | ((in[9 + inpos] & 511) << 17) + | ((in[10 + inpos]) << 26) + ; + out[3 + outpos] = ((in[10 + inpos] & 511) >>> (9 - 3)) + | ((in[11 + inpos] & 511) << 3) + | ((in[12 + inpos] & 511) << 12) + | ((in[13 + inpos] & 511) << 21) + | ((in[14 + inpos]) << 30) + ; + out[4 + outpos] = ((in[14 + inpos] & 511) >>> (9 - 7)) + | ((in[15 + inpos] & 511) << 7) + | ((in[16 + inpos] & 511) << 16) + | ((in[17 + inpos]) << 25) + ; + out[5 + outpos] = ((in[17 + inpos] & 511) >>> (9 - 2)) + | ((in[18 + inpos] & 511) << 2) + | ((in[19 + inpos] & 511) << 11) + | ((in[20 + inpos] & 511) << 20) + | ((in[21 + inpos]) << 29) + ; + out[6 + outpos] = ((in[21 + inpos] & 511) >>> (9 - 6)) + | ((in[22 + inpos] & 511) << 6) + | ((in[23 + inpos] & 511) << 15) + | ((in[24 + inpos]) << 24) + ; + out[7 + outpos] = ((in[24 + inpos] & 511) >>> (9 - 1)) + | ((in[25 + inpos] & 511) << 1) + | ((in[26 + inpos] & 511) << 10) + | ((in[27 + inpos] & 511) << 19) + | ((in[28 + inpos]) << 28) + ; + out[8 + outpos] = ((in[28 + inpos] & 511) >>> (9 - 5)) + | ((in[29 + inpos] & 511) << 5) + | ((in[30 + inpos] & 511) << 14) + | ((in[31 + inpos]) << 23) + ; + } + + + public static void fastpack10(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 1023) + | ((in[1 + inpos] & 1023) << 10) + | ((in[2 + inpos] & 1023) << 20) + | ((in[3 + inpos]) << 30) + ; + out[1 + outpos] = ((in[3 + inpos] & 1023) >>> (10 - 8)) + | ((in[4 + inpos] & 1023) << 8) + | ((in[5 + inpos] & 1023) << 18) + | ((in[6 + inpos]) << 28) + ; + out[2 + outpos] = ((in[6 + inpos] & 1023) >>> (10 - 6)) + | ((in[7 + inpos] & 1023) << 6) + | ((in[8 + inpos] & 1023) << 16) + | ((in[9 + inpos]) << 26) + ; + out[3 + outpos] = ((in[9 + inpos] & 1023) >>> (10 - 4)) + | ((in[10 + inpos] & 1023) << 4) + | ((in[11 + inpos] & 1023) << 14) + | ((in[12 + inpos]) << 24) + ; + out[4 + outpos] = ((in[12 + inpos] & 1023) >>> (10 - 2)) + | ((in[13 + inpos] & 1023) << 2) + | ((in[14 + inpos] & 1023) << 12) + | ((in[15 + inpos]) << 22) + ; + out[5 + outpos] = (in[16 + inpos] & 1023) + | ((in[17 + inpos] & 1023) << 10) + | ((in[18 + inpos] & 1023) << 20) + | ((in[19 + inpos]) << 30) + ; + out[6 + outpos] = ((in[19 + inpos] & 1023) >>> (10 - 8)) + | ((in[20 + inpos] & 1023) << 8) + | ((in[21 + inpos] & 1023) << 18) + | ((in[22 + inpos]) << 28) + ; + out[7 + outpos] = ((in[22 + inpos] & 1023) >>> (10 - 6)) + | ((in[23 + inpos] & 1023) << 6) + | ((in[24 + inpos] & 1023) << 16) + | ((in[25 + inpos]) << 26) + ; + out[8 + outpos] = ((in[25 + inpos] & 1023) >>> (10 - 4)) + | ((in[26 + inpos] & 1023) << 4) + | ((in[27 + inpos] & 1023) << 14) + | ((in[28 + inpos]) << 24) + ; + out[9 + outpos] = ((in[28 + inpos] & 1023) >>> (10 - 2)) + | ((in[29 + inpos] & 1023) << 2) + | ((in[30 + inpos] & 1023) << 12) + | ((in[31 + inpos]) << 22) + ; + } + + + public static void fastpack11(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 2047) + | ((in[1 + inpos] & 2047) << 11) + | ((in[2 + inpos]) << 22) + ; + out[1 + outpos] = ((in[2 + inpos] & 2047) >>> (11 - 1)) + | ((in[3 + inpos] & 2047) << 1) + | ((in[4 + inpos] & 2047) << 12) + | ((in[5 + inpos]) << 23) + ; + out[2 + outpos] = ((in[5 + inpos] & 2047) >>> (11 - 2)) + | ((in[6 + inpos] & 2047) << 2) + | ((in[7 + inpos] & 2047) << 13) + | ((in[8 + inpos]) << 24) + ; + out[3 + outpos] = ((in[8 + inpos] & 2047) >>> (11 - 3)) + | ((in[9 + inpos] & 2047) << 3) + | ((in[10 + inpos] & 2047) << 14) + | ((in[11 + inpos]) << 25) + ; + out[4 + outpos] = ((in[11 + inpos] & 2047) >>> (11 - 4)) + | ((in[12 + inpos] & 2047) << 4) + | ((in[13 + inpos] & 2047) << 15) + | ((in[14 + inpos]) << 26) + ; + out[5 + outpos] = ((in[14 + inpos] & 2047) >>> (11 - 5)) + | ((in[15 + inpos] & 2047) << 5) + | ((in[16 + inpos] & 2047) << 16) + | ((in[17 + inpos]) << 27) + ; + out[6 + outpos] = ((in[17 + inpos] & 2047) >>> (11 - 6)) + | ((in[18 + inpos] & 2047) << 6) + | ((in[19 + inpos] & 2047) << 17) + | ((in[20 + inpos]) << 28) + ; + out[7 + outpos] = ((in[20 + inpos] & 2047) >>> (11 - 7)) + | ((in[21 + inpos] & 2047) << 7) + | ((in[22 + inpos] & 2047) << 18) + | ((in[23 + inpos]) << 29) + ; + out[8 + outpos] = ((in[23 + inpos] & 2047) >>> (11 - 8)) + | ((in[24 + inpos] & 2047) << 8) + | ((in[25 + inpos] & 2047) << 19) + | ((in[26 + inpos]) << 30) + ; + out[9 + outpos] = ((in[26 + inpos] & 2047) >>> (11 - 9)) + | ((in[27 + inpos] & 2047) << 9) + | ((in[28 + inpos] & 2047) << 20) + | ((in[29 + inpos]) << 31) + ; + out[10 + outpos] = ((in[29 + inpos] & 2047) >>> (11 - 10)) + | ((in[30 + inpos] & 2047) << 10) + | ((in[31 + inpos]) << 21) + ; + } + + + public static void fastpack12(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 4095) + | ((in[1 + inpos] & 4095) << 12) + | ((in[2 + inpos]) << 24) + ; + out[1 + outpos] = ((in[2 + inpos] & 4095) >>> (12 - 4)) + | ((in[3 + inpos] & 4095) << 4) + | ((in[4 + inpos] & 4095) << 16) + | ((in[5 + inpos]) << 28) + ; + out[2 + outpos] = ((in[5 + inpos] & 4095) >>> (12 - 8)) + | ((in[6 + inpos] & 4095) << 8) + | ((in[7 + inpos]) << 20) + ; + out[3 + outpos] = (in[8 + inpos] & 4095) + | ((in[9 + inpos] & 4095) << 12) + | ((in[10 + inpos]) << 24) + ; + out[4 + outpos] = ((in[10 + inpos] & 4095) >>> (12 - 4)) + | ((in[11 + inpos] & 4095) << 4) + | ((in[12 + inpos] & 4095) << 16) + | ((in[13 + inpos]) << 28) + ; + out[5 + outpos] = ((in[13 + inpos] & 4095) >>> (12 - 8)) + | ((in[14 + inpos] & 4095) << 8) + | ((in[15 + inpos]) << 20) + ; + out[6 + outpos] = (in[16 + inpos] & 4095) + | ((in[17 + inpos] & 4095) << 12) + | ((in[18 + inpos]) << 24) + ; + out[7 + outpos] = ((in[18 + inpos] & 4095) >>> (12 - 4)) + | ((in[19 + inpos] & 4095) << 4) + | ((in[20 + inpos] & 4095) << 16) + | ((in[21 + inpos]) << 28) + ; + out[8 + outpos] = ((in[21 + inpos] & 4095) >>> (12 - 8)) + | ((in[22 + inpos] & 4095) << 8) + | ((in[23 + inpos]) << 20) + ; + out[9 + outpos] = (in[24 + inpos] & 4095) + | ((in[25 + inpos] & 4095) << 12) + | ((in[26 + inpos]) << 24) + ; + out[10 + outpos] = ((in[26 + inpos] & 4095) >>> (12 - 4)) + | ((in[27 + inpos] & 4095) << 4) + | ((in[28 + inpos] & 4095) << 16) + | ((in[29 + inpos]) << 28) + ; + out[11 + outpos] = ((in[29 + inpos] & 4095) >>> (12 - 8)) + | ((in[30 + inpos] & 4095) << 8) + | ((in[31 + inpos]) << 20) + ; + } + + + public static void fastpack13(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 8191) + | ((in[1 + inpos] & 8191) << 13) + | ((in[2 + inpos]) << 26) + ; + out[1 + outpos] = ((in[2 + inpos] & 8191) >>> (13 - 7)) + | ((in[3 + inpos] & 8191) << 7) + | ((in[4 + inpos]) << 20) + ; + out[2 + outpos] = ((in[4 + inpos] & 8191) >>> (13 - 1)) + | ((in[5 + inpos] & 8191) << 1) + | ((in[6 + inpos] & 8191) << 14) + | ((in[7 + inpos]) << 27) + ; + out[3 + outpos] = ((in[7 + inpos] & 8191) >>> (13 - 8)) + | ((in[8 + inpos] & 8191) << 8) + | ((in[9 + inpos]) << 21) + ; + out[4 + outpos] = ((in[9 + inpos] & 8191) >>> (13 - 2)) + | ((in[10 + inpos] & 8191) << 2) + | ((in[11 + inpos] & 8191) << 15) + | ((in[12 + inpos]) << 28) + ; + out[5 + outpos] = ((in[12 + inpos] & 8191) >>> (13 - 9)) + | ((in[13 + inpos] & 8191) << 9) + | ((in[14 + inpos]) << 22) + ; + out[6 + outpos] = ((in[14 + inpos] & 8191) >>> (13 - 3)) + | ((in[15 + inpos] & 8191) << 3) + | ((in[16 + inpos] & 8191) << 16) + | ((in[17 + inpos]) << 29) + ; + out[7 + outpos] = ((in[17 + inpos] & 8191) >>> (13 - 10)) + | ((in[18 + inpos] & 8191) << 10) + | ((in[19 + inpos]) << 23) + ; + out[8 + outpos] = ((in[19 + inpos] & 8191) >>> (13 - 4)) + | ((in[20 + inpos] & 8191) << 4) + | ((in[21 + inpos] & 8191) << 17) + | ((in[22 + inpos]) << 30) + ; + out[9 + outpos] = ((in[22 + inpos] & 8191) >>> (13 - 11)) + | ((in[23 + inpos] & 8191) << 11) + | ((in[24 + inpos]) << 24) + ; + out[10 + outpos] = ((in[24 + inpos] & 8191) >>> (13 - 5)) + | ((in[25 + inpos] & 8191) << 5) + | ((in[26 + inpos] & 8191) << 18) + | ((in[27 + inpos]) << 31) + ; + out[11 + outpos] = ((in[27 + inpos] & 8191) >>> (13 - 12)) + | ((in[28 + inpos] & 8191) << 12) + | ((in[29 + inpos]) << 25) + ; + out[12 + outpos] = ((in[29 + inpos] & 8191) >>> (13 - 6)) + | ((in[30 + inpos] & 8191) << 6) + | ((in[31 + inpos]) << 19) + ; + } + + + public static void fastpack14(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 16383) + | ((in[1 + inpos] & 16383) << 14) + | ((in[2 + inpos]) << 28) + ; + out[1 + outpos] = ((in[2 + inpos] & 16383) >>> (14 - 10)) + | ((in[3 + inpos] & 16383) << 10) + | ((in[4 + inpos]) << 24) + ; + out[2 + outpos] = ((in[4 + inpos] & 16383) >>> (14 - 6)) + | ((in[5 + inpos] & 16383) << 6) + | ((in[6 + inpos]) << 20) + ; + out[3 + outpos] = ((in[6 + inpos] & 16383) >>> (14 - 2)) + | ((in[7 + inpos] & 16383) << 2) + | ((in[8 + inpos] & 16383) << 16) + | ((in[9 + inpos]) << 30) + ; + out[4 + outpos] = ((in[9 + inpos] & 16383) >>> (14 - 12)) + | ((in[10 + inpos] & 16383) << 12) + | ((in[11 + inpos]) << 26) + ; + out[5 + outpos] = ((in[11 + inpos] & 16383) >>> (14 - 8)) + | ((in[12 + inpos] & 16383) << 8) + | ((in[13 + inpos]) << 22) + ; + out[6 + outpos] = ((in[13 + inpos] & 16383) >>> (14 - 4)) + | ((in[14 + inpos] & 16383) << 4) + | ((in[15 + inpos]) << 18) + ; + out[7 + outpos] = (in[16 + inpos] & 16383) + | ((in[17 + inpos] & 16383) << 14) + | ((in[18 + inpos]) << 28) + ; + out[8 + outpos] = ((in[18 + inpos] & 16383) >>> (14 - 10)) + | ((in[19 + inpos] & 16383) << 10) + | ((in[20 + inpos]) << 24) + ; + out[9 + outpos] = ((in[20 + inpos] & 16383) >>> (14 - 6)) + | ((in[21 + inpos] & 16383) << 6) + | ((in[22 + inpos]) << 20) + ; + out[10 + outpos] = ((in[22 + inpos] & 16383) >>> (14 - 2)) + | ((in[23 + inpos] & 16383) << 2) + | ((in[24 + inpos] & 16383) << 16) + | ((in[25 + inpos]) << 30) + ; + out[11 + outpos] = ((in[25 + inpos] & 16383) >>> (14 - 12)) + | ((in[26 + inpos] & 16383) << 12) + | ((in[27 + inpos]) << 26) + ; + out[12 + outpos] = ((in[27 + inpos] & 16383) >>> (14 - 8)) + | ((in[28 + inpos] & 16383) << 8) + | ((in[29 + inpos]) << 22) + ; + out[13 + outpos] = ((in[29 + inpos] & 16383) >>> (14 - 4)) + | ((in[30 + inpos] & 16383) << 4) + | ((in[31 + inpos]) << 18) + ; + } + + + public static void fastpack15(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 32767) + | ((in[1 + inpos] & 32767) << 15) + | ((in[2 + inpos]) << 30) + ; + out[1 + outpos] = ((in[2 + inpos] & 32767) >>> (15 - 13)) + | ((in[3 + inpos] & 32767) << 13) + | ((in[4 + inpos]) << 28) + ; + out[2 + outpos] = ((in[4 + inpos] & 32767) >>> (15 - 11)) + | ((in[5 + inpos] & 32767) << 11) + | ((in[6 + inpos]) << 26) + ; + out[3 + outpos] = ((in[6 + inpos] & 32767) >>> (15 - 9)) + | ((in[7 + inpos] & 32767) << 9) + | ((in[8 + inpos]) << 24) + ; + out[4 + outpos] = ((in[8 + inpos] & 32767) >>> (15 - 7)) + | ((in[9 + inpos] & 32767) << 7) + | ((in[10 + inpos]) << 22) + ; + out[5 + outpos] = ((in[10 + inpos] & 32767) >>> (15 - 5)) + | ((in[11 + inpos] & 32767) << 5) + | ((in[12 + inpos]) << 20) + ; + out[6 + outpos] = ((in[12 + inpos] & 32767) >>> (15 - 3)) + | ((in[13 + inpos] & 32767) << 3) + | ((in[14 + inpos]) << 18) + ; + out[7 + outpos] = ((in[14 + inpos] & 32767) >>> (15 - 1)) + | ((in[15 + inpos] & 32767) << 1) + | ((in[16 + inpos] & 32767) << 16) + | ((in[17 + inpos]) << 31) + ; + out[8 + outpos] = ((in[17 + inpos] & 32767) >>> (15 - 14)) + | ((in[18 + inpos] & 32767) << 14) + | ((in[19 + inpos]) << 29) + ; + out[9 + outpos] = ((in[19 + inpos] & 32767) >>> (15 - 12)) + | ((in[20 + inpos] & 32767) << 12) + | ((in[21 + inpos]) << 27) + ; + out[10 + outpos] = ((in[21 + inpos] & 32767) >>> (15 - 10)) + | ((in[22 + inpos] & 32767) << 10) + | ((in[23 + inpos]) << 25) + ; + out[11 + outpos] = ((in[23 + inpos] & 32767) >>> (15 - 8)) + | ((in[24 + inpos] & 32767) << 8) + | ((in[25 + inpos]) << 23) + ; + out[12 + outpos] = ((in[25 + inpos] & 32767) >>> (15 - 6)) + | ((in[26 + inpos] & 32767) << 6) + | ((in[27 + inpos]) << 21) + ; + out[13 + outpos] = ((in[27 + inpos] & 32767) >>> (15 - 4)) + | ((in[28 + inpos] & 32767) << 4) + | ((in[29 + inpos]) << 19) + ; + out[14 + outpos] = ((in[29 + inpos] & 32767) >>> (15 - 2)) + | ((in[30 + inpos] & 32767) << 2) + | ((in[31 + inpos]) << 17) + ; + } + + + public static void fastpack16(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 65535) + | ((in[1 + inpos]) << 16) + ; + out[1 + outpos] = (in[2 + inpos] & 65535) + | ((in[3 + inpos]) << 16) + ; + out[2 + outpos] = (in[4 + inpos] & 65535) + | ((in[5 + inpos]) << 16) + ; + out[3 + outpos] = (in[6 + inpos] & 65535) + | ((in[7 + inpos]) << 16) + ; + out[4 + outpos] = (in[8 + inpos] & 65535) + | ((in[9 + inpos]) << 16) + ; + out[5 + outpos] = (in[10 + inpos] & 65535) + | ((in[11 + inpos]) << 16) + ; + out[6 + outpos] = (in[12 + inpos] & 65535) + | ((in[13 + inpos]) << 16) + ; + out[7 + outpos] = (in[14 + inpos] & 65535) + | ((in[15 + inpos]) << 16) + ; + out[8 + outpos] = (in[16 + inpos] & 65535) + | ((in[17 + inpos]) << 16) + ; + out[9 + outpos] = (in[18 + inpos] & 65535) + | ((in[19 + inpos]) << 16) + ; + out[10 + outpos] = (in[20 + inpos] & 65535) + | ((in[21 + inpos]) << 16) + ; + out[11 + outpos] = (in[22 + inpos] & 65535) + | ((in[23 + inpos]) << 16) + ; + out[12 + outpos] = (in[24 + inpos] & 65535) + | ((in[25 + inpos]) << 16) + ; + out[13 + outpos] = (in[26 + inpos] & 65535) + | ((in[27 + inpos]) << 16) + ; + out[14 + outpos] = (in[28 + inpos] & 65535) + | ((in[29 + inpos]) << 16) + ; + out[15 + outpos] = (in[30 + inpos] & 65535) + | ((in[31 + inpos]) << 16) + ; + } + + + public static void fastpack17(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 131071) + | ((in[1 + inpos]) << 17) + ; + out[1 + outpos] = ((in[1 + inpos] & 131071) >>> (17 - 2)) + | ((in[2 + inpos] & 131071) << 2) + | ((in[3 + inpos]) << 19) + ; + out[2 + outpos] = ((in[3 + inpos] & 131071) >>> (17 - 4)) + | ((in[4 + inpos] & 131071) << 4) + | ((in[5 + inpos]) << 21) + ; + out[3 + outpos] = ((in[5 + inpos] & 131071) >>> (17 - 6)) + | ((in[6 + inpos] & 131071) << 6) + | ((in[7 + inpos]) << 23) + ; + out[4 + outpos] = ((in[7 + inpos] & 131071) >>> (17 - 8)) + | ((in[8 + inpos] & 131071) << 8) + | ((in[9 + inpos]) << 25) + ; + out[5 + outpos] = ((in[9 + inpos] & 131071) >>> (17 - 10)) + | ((in[10 + inpos] & 131071) << 10) + | ((in[11 + inpos]) << 27) + ; + out[6 + outpos] = ((in[11 + inpos] & 131071) >>> (17 - 12)) + | ((in[12 + inpos] & 131071) << 12) + | ((in[13 + inpos]) << 29) + ; + out[7 + outpos] = ((in[13 + inpos] & 131071) >>> (17 - 14)) + | ((in[14 + inpos] & 131071) << 14) + | ((in[15 + inpos]) << 31) + ; + out[8 + outpos] = ((in[15 + inpos] & 131071) >>> (17 - 16)) + | ((in[16 + inpos]) << 16) + ; + out[9 + outpos] = ((in[16 + inpos] & 131071) >>> (17 - 1)) + | ((in[17 + inpos] & 131071) << 1) + | ((in[18 + inpos]) << 18) + ; + out[10 + outpos] = ((in[18 + inpos] & 131071) >>> (17 - 3)) + | ((in[19 + inpos] & 131071) << 3) + | ((in[20 + inpos]) << 20) + ; + out[11 + outpos] = ((in[20 + inpos] & 131071) >>> (17 - 5)) + | ((in[21 + inpos] & 131071) << 5) + | ((in[22 + inpos]) << 22) + ; + out[12 + outpos] = ((in[22 + inpos] & 131071) >>> (17 - 7)) + | ((in[23 + inpos] & 131071) << 7) + | ((in[24 + inpos]) << 24) + ; + out[13 + outpos] = ((in[24 + inpos] & 131071) >>> (17 - 9)) + | ((in[25 + inpos] & 131071) << 9) + | ((in[26 + inpos]) << 26) + ; + out[14 + outpos] = ((in[26 + inpos] & 131071) >>> (17 - 11)) + | ((in[27 + inpos] & 131071) << 11) + | ((in[28 + inpos]) << 28) + ; + out[15 + outpos] = ((in[28 + inpos] & 131071) >>> (17 - 13)) + | ((in[29 + inpos] & 131071) << 13) + | ((in[30 + inpos]) << 30) + ; + out[16 + outpos] = ((in[30 + inpos] & 131071) >>> (17 - 15)) + | ((in[31 + inpos]) << 15) + ; + } + + + public static void fastpack18(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 262143) + | ((in[1 + inpos]) << 18) + ; + out[1 + outpos] = ((in[1 + inpos] & 262143) >>> (18 - 4)) + | ((in[2 + inpos] & 262143) << 4) + | ((in[3 + inpos]) << 22) + ; + out[2 + outpos] = ((in[3 + inpos] & 262143) >>> (18 - 8)) + | ((in[4 + inpos] & 262143) << 8) + | ((in[5 + inpos]) << 26) + ; + out[3 + outpos] = ((in[5 + inpos] & 262143) >>> (18 - 12)) + | ((in[6 + inpos] & 262143) << 12) + | ((in[7 + inpos]) << 30) + ; + out[4 + outpos] = ((in[7 + inpos] & 262143) >>> (18 - 16)) + | ((in[8 + inpos]) << 16) + ; + out[5 + outpos] = ((in[8 + inpos] & 262143) >>> (18 - 2)) + | ((in[9 + inpos] & 262143) << 2) + | ((in[10 + inpos]) << 20) + ; + out[6 + outpos] = ((in[10 + inpos] & 262143) >>> (18 - 6)) + | ((in[11 + inpos] & 262143) << 6) + | ((in[12 + inpos]) << 24) + ; + out[7 + outpos] = ((in[12 + inpos] & 262143) >>> (18 - 10)) + | ((in[13 + inpos] & 262143) << 10) + | ((in[14 + inpos]) << 28) + ; + out[8 + outpos] = ((in[14 + inpos] & 262143) >>> (18 - 14)) + | ((in[15 + inpos]) << 14) + ; + out[9 + outpos] = (in[16 + inpos] & 262143) + | ((in[17 + inpos]) << 18) + ; + out[10 + outpos] = ((in[17 + inpos] & 262143) >>> (18 - 4)) + | ((in[18 + inpos] & 262143) << 4) + | ((in[19 + inpos]) << 22) + ; + out[11 + outpos] = ((in[19 + inpos] & 262143) >>> (18 - 8)) + | ((in[20 + inpos] & 262143) << 8) + | ((in[21 + inpos]) << 26) + ; + out[12 + outpos] = ((in[21 + inpos] & 262143) >>> (18 - 12)) + | ((in[22 + inpos] & 262143) << 12) + | ((in[23 + inpos]) << 30) + ; + out[13 + outpos] = ((in[23 + inpos] & 262143) >>> (18 - 16)) + | ((in[24 + inpos]) << 16) + ; + out[14 + outpos] = ((in[24 + inpos] & 262143) >>> (18 - 2)) + | ((in[25 + inpos] & 262143) << 2) + | ((in[26 + inpos]) << 20) + ; + out[15 + outpos] = ((in[26 + inpos] & 262143) >>> (18 - 6)) + | ((in[27 + inpos] & 262143) << 6) + | ((in[28 + inpos]) << 24) + ; + out[16 + outpos] = ((in[28 + inpos] & 262143) >>> (18 - 10)) + | ((in[29 + inpos] & 262143) << 10) + | ((in[30 + inpos]) << 28) + ; + out[17 + outpos] = ((in[30 + inpos] & 262143) >>> (18 - 14)) + | ((in[31 + inpos]) << 14) + ; + } + + + public static void fastpack19(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 524287) + | ((in[1 + inpos]) << 19) + ; + out[1 + outpos] = ((in[1 + inpos] & 524287) >>> (19 - 6)) + | ((in[2 + inpos] & 524287) << 6) + | ((in[3 + inpos]) << 25) + ; + out[2 + outpos] = ((in[3 + inpos] & 524287) >>> (19 - 12)) + | ((in[4 + inpos] & 524287) << 12) + | ((in[5 + inpos]) << 31) + ; + out[3 + outpos] = ((in[5 + inpos] & 524287) >>> (19 - 18)) + | ((in[6 + inpos]) << 18) + ; + out[4 + outpos] = ((in[6 + inpos] & 524287) >>> (19 - 5)) + | ((in[7 + inpos] & 524287) << 5) + | ((in[8 + inpos]) << 24) + ; + out[5 + outpos] = ((in[8 + inpos] & 524287) >>> (19 - 11)) + | ((in[9 + inpos] & 524287) << 11) + | ((in[10 + inpos]) << 30) + ; + out[6 + outpos] = ((in[10 + inpos] & 524287) >>> (19 - 17)) + | ((in[11 + inpos]) << 17) + ; + out[7 + outpos] = ((in[11 + inpos] & 524287) >>> (19 - 4)) + | ((in[12 + inpos] & 524287) << 4) + | ((in[13 + inpos]) << 23) + ; + out[8 + outpos] = ((in[13 + inpos] & 524287) >>> (19 - 10)) + | ((in[14 + inpos] & 524287) << 10) + | ((in[15 + inpos]) << 29) + ; + out[9 + outpos] = ((in[15 + inpos] & 524287) >>> (19 - 16)) + | ((in[16 + inpos]) << 16) + ; + out[10 + outpos] = ((in[16 + inpos] & 524287) >>> (19 - 3)) + | ((in[17 + inpos] & 524287) << 3) + | ((in[18 + inpos]) << 22) + ; + out[11 + outpos] = ((in[18 + inpos] & 524287) >>> (19 - 9)) + | ((in[19 + inpos] & 524287) << 9) + | ((in[20 + inpos]) << 28) + ; + out[12 + outpos] = ((in[20 + inpos] & 524287) >>> (19 - 15)) + | ((in[21 + inpos]) << 15) + ; + out[13 + outpos] = ((in[21 + inpos] & 524287) >>> (19 - 2)) + | ((in[22 + inpos] & 524287) << 2) + | ((in[23 + inpos]) << 21) + ; + out[14 + outpos] = ((in[23 + inpos] & 524287) >>> (19 - 8)) + | ((in[24 + inpos] & 524287) << 8) + | ((in[25 + inpos]) << 27) + ; + out[15 + outpos] = ((in[25 + inpos] & 524287) >>> (19 - 14)) + | ((in[26 + inpos]) << 14) + ; + out[16 + outpos] = ((in[26 + inpos] & 524287) >>> (19 - 1)) + | ((in[27 + inpos] & 524287) << 1) + | ((in[28 + inpos]) << 20) + ; + out[17 + outpos] = ((in[28 + inpos] & 524287) >>> (19 - 7)) + | ((in[29 + inpos] & 524287) << 7) + | ((in[30 + inpos]) << 26) + ; + out[18 + outpos] = ((in[30 + inpos] & 524287) >>> (19 - 13)) + | ((in[31 + inpos]) << 13) + ; + } + + + public static void fastpack20(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 1048575) + | ((in[1 + inpos]) << 20) + ; + out[1 + outpos] = ((in[1 + inpos] & 1048575) >>> (20 - 8)) + | ((in[2 + inpos] & 1048575) << 8) + | ((in[3 + inpos]) << 28) + ; + out[2 + outpos] = ((in[3 + inpos] & 1048575) >>> (20 - 16)) + | ((in[4 + inpos]) << 16) + ; + out[3 + outpos] = ((in[4 + inpos] & 1048575) >>> (20 - 4)) + | ((in[5 + inpos] & 1048575) << 4) + | ((in[6 + inpos]) << 24) + ; + out[4 + outpos] = ((in[6 + inpos] & 1048575) >>> (20 - 12)) + | ((in[7 + inpos]) << 12) + ; + out[5 + outpos] = (in[8 + inpos] & 1048575) + | ((in[9 + inpos]) << 20) + ; + out[6 + outpos] = ((in[9 + inpos] & 1048575) >>> (20 - 8)) + | ((in[10 + inpos] & 1048575) << 8) + | ((in[11 + inpos]) << 28) + ; + out[7 + outpos] = ((in[11 + inpos] & 1048575) >>> (20 - 16)) + | ((in[12 + inpos]) << 16) + ; + out[8 + outpos] = ((in[12 + inpos] & 1048575) >>> (20 - 4)) + | ((in[13 + inpos] & 1048575) << 4) + | ((in[14 + inpos]) << 24) + ; + out[9 + outpos] = ((in[14 + inpos] & 1048575) >>> (20 - 12)) + | ((in[15 + inpos]) << 12) + ; + out[10 + outpos] = (in[16 + inpos] & 1048575) + | ((in[17 + inpos]) << 20) + ; + out[11 + outpos] = ((in[17 + inpos] & 1048575) >>> (20 - 8)) + | ((in[18 + inpos] & 1048575) << 8) + | ((in[19 + inpos]) << 28) + ; + out[12 + outpos] = ((in[19 + inpos] & 1048575) >>> (20 - 16)) + | ((in[20 + inpos]) << 16) + ; + out[13 + outpos] = ((in[20 + inpos] & 1048575) >>> (20 - 4)) + | ((in[21 + inpos] & 1048575) << 4) + | ((in[22 + inpos]) << 24) + ; + out[14 + outpos] = ((in[22 + inpos] & 1048575) >>> (20 - 12)) + | ((in[23 + inpos]) << 12) + ; + out[15 + outpos] = (in[24 + inpos] & 1048575) + | ((in[25 + inpos]) << 20) + ; + out[16 + outpos] = ((in[25 + inpos] & 1048575) >>> (20 - 8)) + | ((in[26 + inpos] & 1048575) << 8) + | ((in[27 + inpos]) << 28) + ; + out[17 + outpos] = ((in[27 + inpos] & 1048575) >>> (20 - 16)) + | ((in[28 + inpos]) << 16) + ; + out[18 + outpos] = ((in[28 + inpos] & 1048575) >>> (20 - 4)) + | ((in[29 + inpos] & 1048575) << 4) + | ((in[30 + inpos]) << 24) + ; + out[19 + outpos] = ((in[30 + inpos] & 1048575) >>> (20 - 12)) + | ((in[31 + inpos]) << 12) + ; + } + + + public static void fastpack21(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 2097151) + | ((in[1 + inpos]) << 21) + ; + out[1 + outpos] = ((in[1 + inpos] & 2097151) >>> (21 - 10)) + | ((in[2 + inpos] & 2097151) << 10) + | ((in[3 + inpos]) << 31) + ; + out[2 + outpos] = ((in[3 + inpos] & 2097151) >>> (21 - 20)) + | ((in[4 + inpos]) << 20) + ; + out[3 + outpos] = ((in[4 + inpos] & 2097151) >>> (21 - 9)) + | ((in[5 + inpos] & 2097151) << 9) + | ((in[6 + inpos]) << 30) + ; + out[4 + outpos] = ((in[6 + inpos] & 2097151) >>> (21 - 19)) + | ((in[7 + inpos]) << 19) + ; + out[5 + outpos] = ((in[7 + inpos] & 2097151) >>> (21 - 8)) + | ((in[8 + inpos] & 2097151) << 8) + | ((in[9 + inpos]) << 29) + ; + out[6 + outpos] = ((in[9 + inpos] & 2097151) >>> (21 - 18)) + | ((in[10 + inpos]) << 18) + ; + out[7 + outpos] = ((in[10 + inpos] & 2097151) >>> (21 - 7)) + | ((in[11 + inpos] & 2097151) << 7) + | ((in[12 + inpos]) << 28) + ; + out[8 + outpos] = ((in[12 + inpos] & 2097151) >>> (21 - 17)) + | ((in[13 + inpos]) << 17) + ; + out[9 + outpos] = ((in[13 + inpos] & 2097151) >>> (21 - 6)) + | ((in[14 + inpos] & 2097151) << 6) + | ((in[15 + inpos]) << 27) + ; + out[10 + outpos] = ((in[15 + inpos] & 2097151) >>> (21 - 16)) + | ((in[16 + inpos]) << 16) + ; + out[11 + outpos] = ((in[16 + inpos] & 2097151) >>> (21 - 5)) + | ((in[17 + inpos] & 2097151) << 5) + | ((in[18 + inpos]) << 26) + ; + out[12 + outpos] = ((in[18 + inpos] & 2097151) >>> (21 - 15)) + | ((in[19 + inpos]) << 15) + ; + out[13 + outpos] = ((in[19 + inpos] & 2097151) >>> (21 - 4)) + | ((in[20 + inpos] & 2097151) << 4) + | ((in[21 + inpos]) << 25) + ; + out[14 + outpos] = ((in[21 + inpos] & 2097151) >>> (21 - 14)) + | ((in[22 + inpos]) << 14) + ; + out[15 + outpos] = ((in[22 + inpos] & 2097151) >>> (21 - 3)) + | ((in[23 + inpos] & 2097151) << 3) + | ((in[24 + inpos]) << 24) + ; + out[16 + outpos] = ((in[24 + inpos] & 2097151) >>> (21 - 13)) + | ((in[25 + inpos]) << 13) + ; + out[17 + outpos] = ((in[25 + inpos] & 2097151) >>> (21 - 2)) + | ((in[26 + inpos] & 2097151) << 2) + | ((in[27 + inpos]) << 23) + ; + out[18 + outpos] = ((in[27 + inpos] & 2097151) >>> (21 - 12)) + | ((in[28 + inpos]) << 12) + ; + out[19 + outpos] = ((in[28 + inpos] & 2097151) >>> (21 - 1)) + | ((in[29 + inpos] & 2097151) << 1) + | ((in[30 + inpos]) << 22) + ; + out[20 + outpos] = ((in[30 + inpos] & 2097151) >>> (21 - 11)) + | ((in[31 + inpos]) << 11) + ; + } + + + public static void fastpack22(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 4194303) + | ((in[1 + inpos]) << 22) + ; + out[1 + outpos] = ((in[1 + inpos] & 4194303) >>> (22 - 12)) + | ((in[2 + inpos]) << 12) + ; + out[2 + outpos] = ((in[2 + inpos] & 4194303) >>> (22 - 2)) + | ((in[3 + inpos] & 4194303) << 2) + | ((in[4 + inpos]) << 24) + ; + out[3 + outpos] = ((in[4 + inpos] & 4194303) >>> (22 - 14)) + | ((in[5 + inpos]) << 14) + ; + out[4 + outpos] = ((in[5 + inpos] & 4194303) >>> (22 - 4)) + | ((in[6 + inpos] & 4194303) << 4) + | ((in[7 + inpos]) << 26) + ; + out[5 + outpos] = ((in[7 + inpos] & 4194303) >>> (22 - 16)) + | ((in[8 + inpos]) << 16) + ; + out[6 + outpos] = ((in[8 + inpos] & 4194303) >>> (22 - 6)) + | ((in[9 + inpos] & 4194303) << 6) + | ((in[10 + inpos]) << 28) + ; + out[7 + outpos] = ((in[10 + inpos] & 4194303) >>> (22 - 18)) + | ((in[11 + inpos]) << 18) + ; + out[8 + outpos] = ((in[11 + inpos] & 4194303) >>> (22 - 8)) + | ((in[12 + inpos] & 4194303) << 8) + | ((in[13 + inpos]) << 30) + ; + out[9 + outpos] = ((in[13 + inpos] & 4194303) >>> (22 - 20)) + | ((in[14 + inpos]) << 20) + ; + out[10 + outpos] = ((in[14 + inpos] & 4194303) >>> (22 - 10)) + | ((in[15 + inpos]) << 10) + ; + out[11 + outpos] = (in[16 + inpos] & 4194303) + | ((in[17 + inpos]) << 22) + ; + out[12 + outpos] = ((in[17 + inpos] & 4194303) >>> (22 - 12)) + | ((in[18 + inpos]) << 12) + ; + out[13 + outpos] = ((in[18 + inpos] & 4194303) >>> (22 - 2)) + | ((in[19 + inpos] & 4194303) << 2) + | ((in[20 + inpos]) << 24) + ; + out[14 + outpos] = ((in[20 + inpos] & 4194303) >>> (22 - 14)) + | ((in[21 + inpos]) << 14) + ; + out[15 + outpos] = ((in[21 + inpos] & 4194303) >>> (22 - 4)) + | ((in[22 + inpos] & 4194303) << 4) + | ((in[23 + inpos]) << 26) + ; + out[16 + outpos] = ((in[23 + inpos] & 4194303) >>> (22 - 16)) + | ((in[24 + inpos]) << 16) + ; + out[17 + outpos] = ((in[24 + inpos] & 4194303) >>> (22 - 6)) + | ((in[25 + inpos] & 4194303) << 6) + | ((in[26 + inpos]) << 28) + ; + out[18 + outpos] = ((in[26 + inpos] & 4194303) >>> (22 - 18)) + | ((in[27 + inpos]) << 18) + ; + out[19 + outpos] = ((in[27 + inpos] & 4194303) >>> (22 - 8)) + | ((in[28 + inpos] & 4194303) << 8) + | ((in[29 + inpos]) << 30) + ; + out[20 + outpos] = ((in[29 + inpos] & 4194303) >>> (22 - 20)) + | ((in[30 + inpos]) << 20) + ; + out[21 + outpos] = ((in[30 + inpos] & 4194303) >>> (22 - 10)) + | ((in[31 + inpos]) << 10) + ; + } + + + public static void fastpack23(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 8388607) + | ((in[1 + inpos]) << 23) + ; + out[1 + outpos] = ((in[1 + inpos] & 8388607) >>> (23 - 14)) + | ((in[2 + inpos]) << 14) + ; + out[2 + outpos] = ((in[2 + inpos] & 8388607) >>> (23 - 5)) + | ((in[3 + inpos] & 8388607) << 5) + | ((in[4 + inpos]) << 28) + ; + out[3 + outpos] = ((in[4 + inpos] & 8388607) >>> (23 - 19)) + | ((in[5 + inpos]) << 19) + ; + out[4 + outpos] = ((in[5 + inpos] & 8388607) >>> (23 - 10)) + | ((in[6 + inpos]) << 10) + ; + out[5 + outpos] = ((in[6 + inpos] & 8388607) >>> (23 - 1)) + | ((in[7 + inpos] & 8388607) << 1) + | ((in[8 + inpos]) << 24) + ; + out[6 + outpos] = ((in[8 + inpos] & 8388607) >>> (23 - 15)) + | ((in[9 + inpos]) << 15) + ; + out[7 + outpos] = ((in[9 + inpos] & 8388607) >>> (23 - 6)) + | ((in[10 + inpos] & 8388607) << 6) + | ((in[11 + inpos]) << 29) + ; + out[8 + outpos] = ((in[11 + inpos] & 8388607) >>> (23 - 20)) + | ((in[12 + inpos]) << 20) + ; + out[9 + outpos] = ((in[12 + inpos] & 8388607) >>> (23 - 11)) + | ((in[13 + inpos]) << 11) + ; + out[10 + outpos] = ((in[13 + inpos] & 8388607) >>> (23 - 2)) + | ((in[14 + inpos] & 8388607) << 2) + | ((in[15 + inpos]) << 25) + ; + out[11 + outpos] = ((in[15 + inpos] & 8388607) >>> (23 - 16)) + | ((in[16 + inpos]) << 16) + ; + out[12 + outpos] = ((in[16 + inpos] & 8388607) >>> (23 - 7)) + | ((in[17 + inpos] & 8388607) << 7) + | ((in[18 + inpos]) << 30) + ; + out[13 + outpos] = ((in[18 + inpos] & 8388607) >>> (23 - 21)) + | ((in[19 + inpos]) << 21) + ; + out[14 + outpos] = ((in[19 + inpos] & 8388607) >>> (23 - 12)) + | ((in[20 + inpos]) << 12) + ; + out[15 + outpos] = ((in[20 + inpos] & 8388607) >>> (23 - 3)) + | ((in[21 + inpos] & 8388607) << 3) + | ((in[22 + inpos]) << 26) + ; + out[16 + outpos] = ((in[22 + inpos] & 8388607) >>> (23 - 17)) + | ((in[23 + inpos]) << 17) + ; + out[17 + outpos] = ((in[23 + inpos] & 8388607) >>> (23 - 8)) + | ((in[24 + inpos] & 8388607) << 8) + | ((in[25 + inpos]) << 31) + ; + out[18 + outpos] = ((in[25 + inpos] & 8388607) >>> (23 - 22)) + | ((in[26 + inpos]) << 22) + ; + out[19 + outpos] = ((in[26 + inpos] & 8388607) >>> (23 - 13)) + | ((in[27 + inpos]) << 13) + ; + out[20 + outpos] = ((in[27 + inpos] & 8388607) >>> (23 - 4)) + | ((in[28 + inpos] & 8388607) << 4) + | ((in[29 + inpos]) << 27) + ; + out[21 + outpos] = ((in[29 + inpos] & 8388607) >>> (23 - 18)) + | ((in[30 + inpos]) << 18) + ; + out[22 + outpos] = ((in[30 + inpos] & 8388607) >>> (23 - 9)) + | ((in[31 + inpos]) << 9) + ; + } + + + public static void fastpack24(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 16777215) + | ((in[1 + inpos]) << 24) + ; + out[1 + outpos] = ((in[1 + inpos] & 16777215) >>> (24 - 16)) + | ((in[2 + inpos]) << 16) + ; + out[2 + outpos] = ((in[2 + inpos] & 16777215) >>> (24 - 8)) + | ((in[3 + inpos]) << 8) + ; + out[3 + outpos] = (in[4 + inpos] & 16777215) + | ((in[5 + inpos]) << 24) + ; + out[4 + outpos] = ((in[5 + inpos] & 16777215) >>> (24 - 16)) + | ((in[6 + inpos]) << 16) + ; + out[5 + outpos] = ((in[6 + inpos] & 16777215) >>> (24 - 8)) + | ((in[7 + inpos]) << 8) + ; + out[6 + outpos] = (in[8 + inpos] & 16777215) + | ((in[9 + inpos]) << 24) + ; + out[7 + outpos] = ((in[9 + inpos] & 16777215) >>> (24 - 16)) + | ((in[10 + inpos]) << 16) + ; + out[8 + outpos] = ((in[10 + inpos] & 16777215) >>> (24 - 8)) + | ((in[11 + inpos]) << 8) + ; + out[9 + outpos] = (in[12 + inpos] & 16777215) + | ((in[13 + inpos]) << 24) + ; + out[10 + outpos] = ((in[13 + inpos] & 16777215) >>> (24 - 16)) + | ((in[14 + inpos]) << 16) + ; + out[11 + outpos] = ((in[14 + inpos] & 16777215) >>> (24 - 8)) + | ((in[15 + inpos]) << 8) + ; + out[12 + outpos] = (in[16 + inpos] & 16777215) + | ((in[17 + inpos]) << 24) + ; + out[13 + outpos] = ((in[17 + inpos] & 16777215) >>> (24 - 16)) + | ((in[18 + inpos]) << 16) + ; + out[14 + outpos] = ((in[18 + inpos] & 16777215) >>> (24 - 8)) + | ((in[19 + inpos]) << 8) + ; + out[15 + outpos] = (in[20 + inpos] & 16777215) + | ((in[21 + inpos]) << 24) + ; + out[16 + outpos] = ((in[21 + inpos] & 16777215) >>> (24 - 16)) + | ((in[22 + inpos]) << 16) + ; + out[17 + outpos] = ((in[22 + inpos] & 16777215) >>> (24 - 8)) + | ((in[23 + inpos]) << 8) + ; + out[18 + outpos] = (in[24 + inpos] & 16777215) + | ((in[25 + inpos]) << 24) + ; + out[19 + outpos] = ((in[25 + inpos] & 16777215) >>> (24 - 16)) + | ((in[26 + inpos]) << 16) + ; + out[20 + outpos] = ((in[26 + inpos] & 16777215) >>> (24 - 8)) + | ((in[27 + inpos]) << 8) + ; + out[21 + outpos] = (in[28 + inpos] & 16777215) + | ((in[29 + inpos]) << 24) + ; + out[22 + outpos] = ((in[29 + inpos] & 16777215) >>> (24 - 16)) + | ((in[30 + inpos]) << 16) + ; + out[23 + outpos] = ((in[30 + inpos] & 16777215) >>> (24 - 8)) + | ((in[31 + inpos]) << 8) + ; + } + + + public static void fastpack25(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 33554431) + | ((in[1 + inpos]) << 25) + ; + out[1 + outpos] = ((in[1 + inpos] & 33554431) >>> (25 - 18)) + | ((in[2 + inpos]) << 18) + ; + out[2 + outpos] = ((in[2 + inpos] & 33554431) >>> (25 - 11)) + | ((in[3 + inpos]) << 11) + ; + out[3 + outpos] = ((in[3 + inpos] & 33554431) >>> (25 - 4)) + | ((in[4 + inpos] & 33554431) << 4) + | ((in[5 + inpos]) << 29) + ; + out[4 + outpos] = ((in[5 + inpos] & 33554431) >>> (25 - 22)) + | ((in[6 + inpos]) << 22) + ; + out[5 + outpos] = ((in[6 + inpos] & 33554431) >>> (25 - 15)) + | ((in[7 + inpos]) << 15) + ; + out[6 + outpos] = ((in[7 + inpos] & 33554431) >>> (25 - 8)) + | ((in[8 + inpos]) << 8) + ; + out[7 + outpos] = ((in[8 + inpos] & 33554431) >>> (25 - 1)) + | ((in[9 + inpos] & 33554431) << 1) + | ((in[10 + inpos]) << 26) + ; + out[8 + outpos] = ((in[10 + inpos] & 33554431) >>> (25 - 19)) + | ((in[11 + inpos]) << 19) + ; + out[9 + outpos] = ((in[11 + inpos] & 33554431) >>> (25 - 12)) + | ((in[12 + inpos]) << 12) + ; + out[10 + outpos] = ((in[12 + inpos] & 33554431) >>> (25 - 5)) + | ((in[13 + inpos] & 33554431) << 5) + | ((in[14 + inpos]) << 30) + ; + out[11 + outpos] = ((in[14 + inpos] & 33554431) >>> (25 - 23)) + | ((in[15 + inpos]) << 23) + ; + out[12 + outpos] = ((in[15 + inpos] & 33554431) >>> (25 - 16)) + | ((in[16 + inpos]) << 16) + ; + out[13 + outpos] = ((in[16 + inpos] & 33554431) >>> (25 - 9)) + | ((in[17 + inpos]) << 9) + ; + out[14 + outpos] = ((in[17 + inpos] & 33554431) >>> (25 - 2)) + | ((in[18 + inpos] & 33554431) << 2) + | ((in[19 + inpos]) << 27) + ; + out[15 + outpos] = ((in[19 + inpos] & 33554431) >>> (25 - 20)) + | ((in[20 + inpos]) << 20) + ; + out[16 + outpos] = ((in[20 + inpos] & 33554431) >>> (25 - 13)) + | ((in[21 + inpos]) << 13) + ; + out[17 + outpos] = ((in[21 + inpos] & 33554431) >>> (25 - 6)) + | ((in[22 + inpos] & 33554431) << 6) + | ((in[23 + inpos]) << 31) + ; + out[18 + outpos] = ((in[23 + inpos] & 33554431) >>> (25 - 24)) + | ((in[24 + inpos]) << 24) + ; + out[19 + outpos] = ((in[24 + inpos] & 33554431) >>> (25 - 17)) + | ((in[25 + inpos]) << 17) + ; + out[20 + outpos] = ((in[25 + inpos] & 33554431) >>> (25 - 10)) + | ((in[26 + inpos]) << 10) + ; + out[21 + outpos] = ((in[26 + inpos] & 33554431) >>> (25 - 3)) + | ((in[27 + inpos] & 33554431) << 3) + | ((in[28 + inpos]) << 28) + ; + out[22 + outpos] = ((in[28 + inpos] & 33554431) >>> (25 - 21)) + | ((in[29 + inpos]) << 21) + ; + out[23 + outpos] = ((in[29 + inpos] & 33554431) >>> (25 - 14)) + | ((in[30 + inpos]) << 14) + ; + out[24 + outpos] = ((in[30 + inpos] & 33554431) >>> (25 - 7)) + | ((in[31 + inpos]) << 7) + ; + } + + + public static void fastpack26(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 67108863) + | ((in[1 + inpos]) << 26) + ; + out[1 + outpos] = ((in[1 + inpos] & 67108863) >>> (26 - 20)) + | ((in[2 + inpos]) << 20) + ; + out[2 + outpos] = ((in[2 + inpos] & 67108863) >>> (26 - 14)) + | ((in[3 + inpos]) << 14) + ; + out[3 + outpos] = ((in[3 + inpos] & 67108863) >>> (26 - 8)) + | ((in[4 + inpos]) << 8) + ; + out[4 + outpos] = ((in[4 + inpos] & 67108863) >>> (26 - 2)) + | ((in[5 + inpos] & 67108863) << 2) + | ((in[6 + inpos]) << 28) + ; + out[5 + outpos] = ((in[6 + inpos] & 67108863) >>> (26 - 22)) + | ((in[7 + inpos]) << 22) + ; + out[6 + outpos] = ((in[7 + inpos] & 67108863) >>> (26 - 16)) + | ((in[8 + inpos]) << 16) + ; + out[7 + outpos] = ((in[8 + inpos] & 67108863) >>> (26 - 10)) + | ((in[9 + inpos]) << 10) + ; + out[8 + outpos] = ((in[9 + inpos] & 67108863) >>> (26 - 4)) + | ((in[10 + inpos] & 67108863) << 4) + | ((in[11 + inpos]) << 30) + ; + out[9 + outpos] = ((in[11 + inpos] & 67108863) >>> (26 - 24)) + | ((in[12 + inpos]) << 24) + ; + out[10 + outpos] = ((in[12 + inpos] & 67108863) >>> (26 - 18)) + | ((in[13 + inpos]) << 18) + ; + out[11 + outpos] = ((in[13 + inpos] & 67108863) >>> (26 - 12)) + | ((in[14 + inpos]) << 12) + ; + out[12 + outpos] = ((in[14 + inpos] & 67108863) >>> (26 - 6)) + | ((in[15 + inpos]) << 6) + ; + out[13 + outpos] = (in[16 + inpos] & 67108863) + | ((in[17 + inpos]) << 26) + ; + out[14 + outpos] = ((in[17 + inpos] & 67108863) >>> (26 - 20)) + | ((in[18 + inpos]) << 20) + ; + out[15 + outpos] = ((in[18 + inpos] & 67108863) >>> (26 - 14)) + | ((in[19 + inpos]) << 14) + ; + out[16 + outpos] = ((in[19 + inpos] & 67108863) >>> (26 - 8)) + | ((in[20 + inpos]) << 8) + ; + out[17 + outpos] = ((in[20 + inpos] & 67108863) >>> (26 - 2)) + | ((in[21 + inpos] & 67108863) << 2) + | ((in[22 + inpos]) << 28) + ; + out[18 + outpos] = ((in[22 + inpos] & 67108863) >>> (26 - 22)) + | ((in[23 + inpos]) << 22) + ; + out[19 + outpos] = ((in[23 + inpos] & 67108863) >>> (26 - 16)) + | ((in[24 + inpos]) << 16) + ; + out[20 + outpos] = ((in[24 + inpos] & 67108863) >>> (26 - 10)) + | ((in[25 + inpos]) << 10) + ; + out[21 + outpos] = ((in[25 + inpos] & 67108863) >>> (26 - 4)) + | ((in[26 + inpos] & 67108863) << 4) + | ((in[27 + inpos]) << 30) + ; + out[22 + outpos] = ((in[27 + inpos] & 67108863) >>> (26 - 24)) + | ((in[28 + inpos]) << 24) + ; + out[23 + outpos] = ((in[28 + inpos] & 67108863) >>> (26 - 18)) + | ((in[29 + inpos]) << 18) + ; + out[24 + outpos] = ((in[29 + inpos] & 67108863) >>> (26 - 12)) + | ((in[30 + inpos]) << 12) + ; + out[25 + outpos] = ((in[30 + inpos] & 67108863) >>> (26 - 6)) + | ((in[31 + inpos]) << 6) + ; + } + + + public static void fastpack27(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 134217727) + | ((in[1 + inpos]) << 27) + ; + out[1 + outpos] = ((in[1 + inpos] & 134217727) >>> (27 - 22)) + | ((in[2 + inpos]) << 22) + ; + out[2 + outpos] = ((in[2 + inpos] & 134217727) >>> (27 - 17)) + | ((in[3 + inpos]) << 17) + ; + out[3 + outpos] = ((in[3 + inpos] & 134217727) >>> (27 - 12)) + | ((in[4 + inpos]) << 12) + ; + out[4 + outpos] = ((in[4 + inpos] & 134217727) >>> (27 - 7)) + | ((in[5 + inpos]) << 7) + ; + out[5 + outpos] = ((in[5 + inpos] & 134217727) >>> (27 - 2)) + | ((in[6 + inpos] & 134217727) << 2) + | ((in[7 + inpos]) << 29) + ; + out[6 + outpos] = ((in[7 + inpos] & 134217727) >>> (27 - 24)) + | ((in[8 + inpos]) << 24) + ; + out[7 + outpos] = ((in[8 + inpos] & 134217727) >>> (27 - 19)) + | ((in[9 + inpos]) << 19) + ; + out[8 + outpos] = ((in[9 + inpos] & 134217727) >>> (27 - 14)) + | ((in[10 + inpos]) << 14) + ; + out[9 + outpos] = ((in[10 + inpos] & 134217727) >>> (27 - 9)) + | ((in[11 + inpos]) << 9) + ; + out[10 + outpos] = ((in[11 + inpos] & 134217727) >>> (27 - 4)) + | ((in[12 + inpos] & 134217727) << 4) + | ((in[13 + inpos]) << 31) + ; + out[11 + outpos] = ((in[13 + inpos] & 134217727) >>> (27 - 26)) + | ((in[14 + inpos]) << 26) + ; + out[12 + outpos] = ((in[14 + inpos] & 134217727) >>> (27 - 21)) + | ((in[15 + inpos]) << 21) + ; + out[13 + outpos] = ((in[15 + inpos] & 134217727) >>> (27 - 16)) + | ((in[16 + inpos]) << 16) + ; + out[14 + outpos] = ((in[16 + inpos] & 134217727) >>> (27 - 11)) + | ((in[17 + inpos]) << 11) + ; + out[15 + outpos] = ((in[17 + inpos] & 134217727) >>> (27 - 6)) + | ((in[18 + inpos]) << 6) + ; + out[16 + outpos] = ((in[18 + inpos] & 134217727) >>> (27 - 1)) + | ((in[19 + inpos] & 134217727) << 1) + | ((in[20 + inpos]) << 28) + ; + out[17 + outpos] = ((in[20 + inpos] & 134217727) >>> (27 - 23)) + | ((in[21 + inpos]) << 23) + ; + out[18 + outpos] = ((in[21 + inpos] & 134217727) >>> (27 - 18)) + | ((in[22 + inpos]) << 18) + ; + out[19 + outpos] = ((in[22 + inpos] & 134217727) >>> (27 - 13)) + | ((in[23 + inpos]) << 13) + ; + out[20 + outpos] = ((in[23 + inpos] & 134217727) >>> (27 - 8)) + | ((in[24 + inpos]) << 8) + ; + out[21 + outpos] = ((in[24 + inpos] & 134217727) >>> (27 - 3)) + | ((in[25 + inpos] & 134217727) << 3) + | ((in[26 + inpos]) << 30) + ; + out[22 + outpos] = ((in[26 + inpos] & 134217727) >>> (27 - 25)) + | ((in[27 + inpos]) << 25) + ; + out[23 + outpos] = ((in[27 + inpos] & 134217727) >>> (27 - 20)) + | ((in[28 + inpos]) << 20) + ; + out[24 + outpos] = ((in[28 + inpos] & 134217727) >>> (27 - 15)) + | ((in[29 + inpos]) << 15) + ; + out[25 + outpos] = ((in[29 + inpos] & 134217727) >>> (27 - 10)) + | ((in[30 + inpos]) << 10) + ; + out[26 + outpos] = ((in[30 + inpos] & 134217727) >>> (27 - 5)) + | ((in[31 + inpos]) << 5) + ; + } + + + public static void fastpack28(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 268435455) + | ((in[1 + inpos]) << 28) + ; + out[1 + outpos] = ((in[1 + inpos] & 268435455) >>> (28 - 24)) + | ((in[2 + inpos]) << 24) + ; + out[2 + outpos] = ((in[2 + inpos] & 268435455) >>> (28 - 20)) + | ((in[3 + inpos]) << 20) + ; + out[3 + outpos] = ((in[3 + inpos] & 268435455) >>> (28 - 16)) + | ((in[4 + inpos]) << 16) + ; + out[4 + outpos] = ((in[4 + inpos] & 268435455) >>> (28 - 12)) + | ((in[5 + inpos]) << 12) + ; + out[5 + outpos] = ((in[5 + inpos] & 268435455) >>> (28 - 8)) + | ((in[6 + inpos]) << 8) + ; + out[6 + outpos] = ((in[6 + inpos] & 268435455) >>> (28 - 4)) + | ((in[7 + inpos]) << 4) + ; + out[7 + outpos] = (in[8 + inpos] & 268435455) + | ((in[9 + inpos]) << 28) + ; + out[8 + outpos] = ((in[9 + inpos] & 268435455) >>> (28 - 24)) + | ((in[10 + inpos]) << 24) + ; + out[9 + outpos] = ((in[10 + inpos] & 268435455) >>> (28 - 20)) + | ((in[11 + inpos]) << 20) + ; + out[10 + outpos] = ((in[11 + inpos] & 268435455) >>> (28 - 16)) + | ((in[12 + inpos]) << 16) + ; + out[11 + outpos] = ((in[12 + inpos] & 268435455) >>> (28 - 12)) + | ((in[13 + inpos]) << 12) + ; + out[12 + outpos] = ((in[13 + inpos] & 268435455) >>> (28 - 8)) + | ((in[14 + inpos]) << 8) + ; + out[13 + outpos] = ((in[14 + inpos] & 268435455) >>> (28 - 4)) + | ((in[15 + inpos]) << 4) + ; + out[14 + outpos] = (in[16 + inpos] & 268435455) + | ((in[17 + inpos]) << 28) + ; + out[15 + outpos] = ((in[17 + inpos] & 268435455) >>> (28 - 24)) + | ((in[18 + inpos]) << 24) + ; + out[16 + outpos] = ((in[18 + inpos] & 268435455) >>> (28 - 20)) + | ((in[19 + inpos]) << 20) + ; + out[17 + outpos] = ((in[19 + inpos] & 268435455) >>> (28 - 16)) + | ((in[20 + inpos]) << 16) + ; + out[18 + outpos] = ((in[20 + inpos] & 268435455) >>> (28 - 12)) + | ((in[21 + inpos]) << 12) + ; + out[19 + outpos] = ((in[21 + inpos] & 268435455) >>> (28 - 8)) + | ((in[22 + inpos]) << 8) + ; + out[20 + outpos] = ((in[22 + inpos] & 268435455) >>> (28 - 4)) + | ((in[23 + inpos]) << 4) + ; + out[21 + outpos] = (in[24 + inpos] & 268435455) + | ((in[25 + inpos]) << 28) + ; + out[22 + outpos] = ((in[25 + inpos] & 268435455) >>> (28 - 24)) + | ((in[26 + inpos]) << 24) + ; + out[23 + outpos] = ((in[26 + inpos] & 268435455) >>> (28 - 20)) + | ((in[27 + inpos]) << 20) + ; + out[24 + outpos] = ((in[27 + inpos] & 268435455) >>> (28 - 16)) + | ((in[28 + inpos]) << 16) + ; + out[25 + outpos] = ((in[28 + inpos] & 268435455) >>> (28 - 12)) + | ((in[29 + inpos]) << 12) + ; + out[26 + outpos] = ((in[29 + inpos] & 268435455) >>> (28 - 8)) + | ((in[30 + inpos]) << 8) + ; + out[27 + outpos] = ((in[30 + inpos] & 268435455) >>> (28 - 4)) + | ((in[31 + inpos]) << 4) + ; + } + + + public static void fastpack29(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 536870911) + | ((in[1 + inpos]) << 29) + ; + out[1 + outpos] = ((in[1 + inpos] & 536870911) >>> (29 - 26)) + | ((in[2 + inpos]) << 26) + ; + out[2 + outpos] = ((in[2 + inpos] & 536870911) >>> (29 - 23)) + | ((in[3 + inpos]) << 23) + ; + out[3 + outpos] = ((in[3 + inpos] & 536870911) >>> (29 - 20)) + | ((in[4 + inpos]) << 20) + ; + out[4 + outpos] = ((in[4 + inpos] & 536870911) >>> (29 - 17)) + | ((in[5 + inpos]) << 17) + ; + out[5 + outpos] = ((in[5 + inpos] & 536870911) >>> (29 - 14)) + | ((in[6 + inpos]) << 14) + ; + out[6 + outpos] = ((in[6 + inpos] & 536870911) >>> (29 - 11)) + | ((in[7 + inpos]) << 11) + ; + out[7 + outpos] = ((in[7 + inpos] & 536870911) >>> (29 - 8)) + | ((in[8 + inpos]) << 8) + ; + out[8 + outpos] = ((in[8 + inpos] & 536870911) >>> (29 - 5)) + | ((in[9 + inpos]) << 5) + ; + out[9 + outpos] = ((in[9 + inpos] & 536870911) >>> (29 - 2)) + | ((in[10 + inpos] & 536870911) << 2) + | ((in[11 + inpos]) << 31) + ; + out[10 + outpos] = ((in[11 + inpos] & 536870911) >>> (29 - 28)) + | ((in[12 + inpos]) << 28) + ; + out[11 + outpos] = ((in[12 + inpos] & 536870911) >>> (29 - 25)) + | ((in[13 + inpos]) << 25) + ; + out[12 + outpos] = ((in[13 + inpos] & 536870911) >>> (29 - 22)) + | ((in[14 + inpos]) << 22) + ; + out[13 + outpos] = ((in[14 + inpos] & 536870911) >>> (29 - 19)) + | ((in[15 + inpos]) << 19) + ; + out[14 + outpos] = ((in[15 + inpos] & 536870911) >>> (29 - 16)) + | ((in[16 + inpos]) << 16) + ; + out[15 + outpos] = ((in[16 + inpos] & 536870911) >>> (29 - 13)) + | ((in[17 + inpos]) << 13) + ; + out[16 + outpos] = ((in[17 + inpos] & 536870911) >>> (29 - 10)) + | ((in[18 + inpos]) << 10) + ; + out[17 + outpos] = ((in[18 + inpos] & 536870911) >>> (29 - 7)) + | ((in[19 + inpos]) << 7) + ; + out[18 + outpos] = ((in[19 + inpos] & 536870911) >>> (29 - 4)) + | ((in[20 + inpos]) << 4) + ; + out[19 + outpos] = ((in[20 + inpos] & 536870911) >>> (29 - 1)) + | ((in[21 + inpos] & 536870911) << 1) + | ((in[22 + inpos]) << 30) + ; + out[20 + outpos] = ((in[22 + inpos] & 536870911) >>> (29 - 27)) + | ((in[23 + inpos]) << 27) + ; + out[21 + outpos] = ((in[23 + inpos] & 536870911) >>> (29 - 24)) + | ((in[24 + inpos]) << 24) + ; + out[22 + outpos] = ((in[24 + inpos] & 536870911) >>> (29 - 21)) + | ((in[25 + inpos]) << 21) + ; + out[23 + outpos] = ((in[25 + inpos] & 536870911) >>> (29 - 18)) + | ((in[26 + inpos]) << 18) + ; + out[24 + outpos] = ((in[26 + inpos] & 536870911) >>> (29 - 15)) + | ((in[27 + inpos]) << 15) + ; + out[25 + outpos] = ((in[27 + inpos] & 536870911) >>> (29 - 12)) + | ((in[28 + inpos]) << 12) + ; + out[26 + outpos] = ((in[28 + inpos] & 536870911) >>> (29 - 9)) + | ((in[29 + inpos]) << 9) + ; + out[27 + outpos] = ((in[29 + inpos] & 536870911) >>> (29 - 6)) + | ((in[30 + inpos]) << 6) + ; + out[28 + outpos] = ((in[30 + inpos] & 536870911) >>> (29 - 3)) + | ((in[31 + inpos]) << 3) + ; + } + + + public static void fastpack30(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 1073741823) + | ((in[1 + inpos]) << 30) + ; + out[1 + outpos] = ((in[1 + inpos] & 1073741823) >>> (30 - 28)) + | ((in[2 + inpos]) << 28) + ; + out[2 + outpos] = ((in[2 + inpos] & 1073741823) >>> (30 - 26)) + | ((in[3 + inpos]) << 26) + ; + out[3 + outpos] = ((in[3 + inpos] & 1073741823) >>> (30 - 24)) + | ((in[4 + inpos]) << 24) + ; + out[4 + outpos] = ((in[4 + inpos] & 1073741823) >>> (30 - 22)) + | ((in[5 + inpos]) << 22) + ; + out[5 + outpos] = ((in[5 + inpos] & 1073741823) >>> (30 - 20)) + | ((in[6 + inpos]) << 20) + ; + out[6 + outpos] = ((in[6 + inpos] & 1073741823) >>> (30 - 18)) + | ((in[7 + inpos]) << 18) + ; + out[7 + outpos] = ((in[7 + inpos] & 1073741823) >>> (30 - 16)) + | ((in[8 + inpos]) << 16) + ; + out[8 + outpos] = ((in[8 + inpos] & 1073741823) >>> (30 - 14)) + | ((in[9 + inpos]) << 14) + ; + out[9 + outpos] = ((in[9 + inpos] & 1073741823) >>> (30 - 12)) + | ((in[10 + inpos]) << 12) + ; + out[10 + outpos] = ((in[10 + inpos] & 1073741823) >>> (30 - 10)) + | ((in[11 + inpos]) << 10) + ; + out[11 + outpos] = ((in[11 + inpos] & 1073741823) >>> (30 - 8)) + | ((in[12 + inpos]) << 8) + ; + out[12 + outpos] = ((in[12 + inpos] & 1073741823) >>> (30 - 6)) + | ((in[13 + inpos]) << 6) + ; + out[13 + outpos] = ((in[13 + inpos] & 1073741823) >>> (30 - 4)) + | ((in[14 + inpos]) << 4) + ; + out[14 + outpos] = ((in[14 + inpos] & 1073741823) >>> (30 - 2)) + | ((in[15 + inpos]) << 2) + ; + out[15 + outpos] = (in[16 + inpos] & 1073741823) + | ((in[17 + inpos]) << 30) + ; + out[16 + outpos] = ((in[17 + inpos] & 1073741823) >>> (30 - 28)) + | ((in[18 + inpos]) << 28) + ; + out[17 + outpos] = ((in[18 + inpos] & 1073741823) >>> (30 - 26)) + | ((in[19 + inpos]) << 26) + ; + out[18 + outpos] = ((in[19 + inpos] & 1073741823) >>> (30 - 24)) + | ((in[20 + inpos]) << 24) + ; + out[19 + outpos] = ((in[20 + inpos] & 1073741823) >>> (30 - 22)) + | ((in[21 + inpos]) << 22) + ; + out[20 + outpos] = ((in[21 + inpos] & 1073741823) >>> (30 - 20)) + | ((in[22 + inpos]) << 20) + ; + out[21 + outpos] = ((in[22 + inpos] & 1073741823) >>> (30 - 18)) + | ((in[23 + inpos]) << 18) + ; + out[22 + outpos] = ((in[23 + inpos] & 1073741823) >>> (30 - 16)) + | ((in[24 + inpos]) << 16) + ; + out[23 + outpos] = ((in[24 + inpos] & 1073741823) >>> (30 - 14)) + | ((in[25 + inpos]) << 14) + ; + out[24 + outpos] = ((in[25 + inpos] & 1073741823) >>> (30 - 12)) + | ((in[26 + inpos]) << 12) + ; + out[25 + outpos] = ((in[26 + inpos] & 1073741823) >>> (30 - 10)) + | ((in[27 + inpos]) << 10) + ; + out[26 + outpos] = ((in[27 + inpos] & 1073741823) >>> (30 - 8)) + | ((in[28 + inpos]) << 8) + ; + out[27 + outpos] = ((in[28 + inpos] & 1073741823) >>> (30 - 6)) + | ((in[29 + inpos]) << 6) + ; + out[28 + outpos] = ((in[29 + inpos] & 1073741823) >>> (30 - 4)) + | ((in[30 + inpos]) << 4) + ; + out[29 + outpos] = ((in[30 + inpos] & 1073741823) >>> (30 - 2)) + | ((in[31 + inpos]) << 2) + ; + } + + + public static void fastpack31(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 2147483647) + | ((in[1 + inpos]) << 31) + ; + out[1 + outpos] = ((in[1 + inpos] & 2147483647) >>> (31 - 30)) + | ((in[2 + inpos]) << 30) + ; + out[2 + outpos] = ((in[2 + inpos] & 2147483647) >>> (31 - 29)) + | ((in[3 + inpos]) << 29) + ; + out[3 + outpos] = ((in[3 + inpos] & 2147483647) >>> (31 - 28)) + | ((in[4 + inpos]) << 28) + ; + out[4 + outpos] = ((in[4 + inpos] & 2147483647) >>> (31 - 27)) + | ((in[5 + inpos]) << 27) + ; + out[5 + outpos] = ((in[5 + inpos] & 2147483647) >>> (31 - 26)) + | ((in[6 + inpos]) << 26) + ; + out[6 + outpos] = ((in[6 + inpos] & 2147483647) >>> (31 - 25)) + | ((in[7 + inpos]) << 25) + ; + out[7 + outpos] = ((in[7 + inpos] & 2147483647) >>> (31 - 24)) + | ((in[8 + inpos]) << 24) + ; + out[8 + outpos] = ((in[8 + inpos] & 2147483647) >>> (31 - 23)) + | ((in[9 + inpos]) << 23) + ; + out[9 + outpos] = ((in[9 + inpos] & 2147483647) >>> (31 - 22)) + | ((in[10 + inpos]) << 22) + ; + out[10 + outpos] = ((in[10 + inpos] & 2147483647) >>> (31 - 21)) + | ((in[11 + inpos]) << 21) + ; + out[11 + outpos] = ((in[11 + inpos] & 2147483647) >>> (31 - 20)) + | ((in[12 + inpos]) << 20) + ; + out[12 + outpos] = ((in[12 + inpos] & 2147483647) >>> (31 - 19)) + | ((in[13 + inpos]) << 19) + ; + out[13 + outpos] = ((in[13 + inpos] & 2147483647) >>> (31 - 18)) + | ((in[14 + inpos]) << 18) + ; + out[14 + outpos] = ((in[14 + inpos] & 2147483647) >>> (31 - 17)) + | ((in[15 + inpos]) << 17) + ; + out[15 + outpos] = ((in[15 + inpos] & 2147483647) >>> (31 - 16)) + | ((in[16 + inpos]) << 16) + ; + out[16 + outpos] = ((in[16 + inpos] & 2147483647) >>> (31 - 15)) + | ((in[17 + inpos]) << 15) + ; + out[17 + outpos] = ((in[17 + inpos] & 2147483647) >>> (31 - 14)) + | ((in[18 + inpos]) << 14) + ; + out[18 + outpos] = ((in[18 + inpos] & 2147483647) >>> (31 - 13)) + | ((in[19 + inpos]) << 13) + ; + out[19 + outpos] = ((in[19 + inpos] & 2147483647) >>> (31 - 12)) + | ((in[20 + inpos]) << 12) + ; + out[20 + outpos] = ((in[20 + inpos] & 2147483647) >>> (31 - 11)) + | ((in[21 + inpos]) << 11) + ; + out[21 + outpos] = ((in[21 + inpos] & 2147483647) >>> (31 - 10)) + | ((in[22 + inpos]) << 10) + ; + out[22 + outpos] = ((in[22 + inpos] & 2147483647) >>> (31 - 9)) + | ((in[23 + inpos]) << 9) + ; + out[23 + outpos] = ((in[23 + inpos] & 2147483647) >>> (31 - 8)) + | ((in[24 + inpos]) << 8) + ; + out[24 + outpos] = ((in[24 + inpos] & 2147483647) >>> (31 - 7)) + | ((in[25 + inpos]) << 7) + ; + out[25 + outpos] = ((in[25 + inpos] & 2147483647) >>> (31 - 6)) + | ((in[26 + inpos]) << 6) + ; + out[26 + outpos] = ((in[26 + inpos] & 2147483647) >>> (31 - 5)) + | ((in[27 + inpos]) << 5) + ; + out[27 + outpos] = ((in[27 + inpos] & 2147483647) >>> (31 - 4)) + | ((in[28 + inpos]) << 4) + ; + out[28 + outpos] = ((in[28 + inpos] & 2147483647) >>> (31 - 3)) + | ((in[29 + inpos]) << 3) + ; + out[29 + outpos] = ((in[29 + inpos] & 2147483647) >>> (31 - 2)) + | ((in[30 + inpos]) << 2) + ; + out[30 + outpos] = ((in[30 + inpos] & 2147483647) >>> (31 - 1)) + | ((in[31 + inpos]) << 1) + ; + } + + + public static void fastunpack1(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 1) + ; + out[1 + outpos] = ((in[0 + inpos] >>> 1) & 1) + ; + out[2 + outpos] = ((in[0 + inpos] >>> 2) & 1) + ; + out[3 + outpos] = ((in[0 + inpos] >>> 3) & 1) + ; + out[4 + outpos] = ((in[0 + inpos] >>> 4) & 1) + ; + out[5 + outpos] = ((in[0 + inpos] >>> 5) & 1) + ; + out[6 + outpos] = ((in[0 + inpos] >>> 6) & 1) + ; + out[7 + outpos] = ((in[0 + inpos] >>> 7) & 1) + ; + out[8 + outpos] = ((in[0 + inpos] >>> 8) & 1) + ; + out[9 + outpos] = ((in[0 + inpos] >>> 9) & 1) + ; + out[10 + outpos] = ((in[0 + inpos] >>> 10) & 1) + ; + out[11 + outpos] = ((in[0 + inpos] >>> 11) & 1) + ; + out[12 + outpos] = ((in[0 + inpos] >>> 12) & 1) + ; + out[13 + outpos] = ((in[0 + inpos] >>> 13) & 1) + ; + out[14 + outpos] = ((in[0 + inpos] >>> 14) & 1) + ; + out[15 + outpos] = ((in[0 + inpos] >>> 15) & 1) + ; + out[16 + outpos] = ((in[0 + inpos] >>> 16) & 1) + ; + out[17 + outpos] = ((in[0 + inpos] >>> 17) & 1) + ; + out[18 + outpos] = ((in[0 + inpos] >>> 18) & 1) + ; + out[19 + outpos] = ((in[0 + inpos] >>> 19) & 1) + ; + out[20 + outpos] = ((in[0 + inpos] >>> 20) & 1) + ; + out[21 + outpos] = ((in[0 + inpos] >>> 21) & 1) + ; + out[22 + outpos] = ((in[0 + inpos] >>> 22) & 1) + ; + out[23 + outpos] = ((in[0 + inpos] >>> 23) & 1) + ; + out[24 + outpos] = ((in[0 + inpos] >>> 24) & 1) + ; + out[25 + outpos] = ((in[0 + inpos] >>> 25) & 1) + ; + out[26 + outpos] = ((in[0 + inpos] >>> 26) & 1) + ; + out[27 + outpos] = ((in[0 + inpos] >>> 27) & 1) + ; + out[28 + outpos] = ((in[0 + inpos] >>> 28) & 1) + ; + out[29 + outpos] = ((in[0 + inpos] >>> 29) & 1) + ; + out[30 + outpos] = ((in[0 + inpos] >>> 30) & 1) + ; + out[31 + outpos] = (in[0 + inpos] >>> 31) + ; + } + + + public static void fastunpack2(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 3) + ; + out[1 + outpos] = ((in[0 + inpos] >>> 2) & 3) + ; + out[2 + outpos] = ((in[0 + inpos] >>> 4) & 3) + ; + out[3 + outpos] = ((in[0 + inpos] >>> 6) & 3) + ; + out[4 + outpos] = ((in[0 + inpos] >>> 8) & 3) + ; + out[5 + outpos] = ((in[0 + inpos] >>> 10) & 3) + ; + out[6 + outpos] = ((in[0 + inpos] >>> 12) & 3) + ; + out[7 + outpos] = ((in[0 + inpos] >>> 14) & 3) + ; + out[8 + outpos] = ((in[0 + inpos] >>> 16) & 3) + ; + out[9 + outpos] = ((in[0 + inpos] >>> 18) & 3) + ; + out[10 + outpos] = ((in[0 + inpos] >>> 20) & 3) + ; + out[11 + outpos] = ((in[0 + inpos] >>> 22) & 3) + ; + out[12 + outpos] = ((in[0 + inpos] >>> 24) & 3) + ; + out[13 + outpos] = ((in[0 + inpos] >>> 26) & 3) + ; + out[14 + outpos] = ((in[0 + inpos] >>> 28) & 3) + ; + out[15 + outpos] = (in[0 + inpos] >>> 30) + ; + out[16 + outpos] = ((in[1 + inpos] >>> 0) & 3) + ; + out[17 + outpos] = ((in[1 + inpos] >>> 2) & 3) + ; + out[18 + outpos] = ((in[1 + inpos] >>> 4) & 3) + ; + out[19 + outpos] = ((in[1 + inpos] >>> 6) & 3) + ; + out[20 + outpos] = ((in[1 + inpos] >>> 8) & 3) + ; + out[21 + outpos] = ((in[1 + inpos] >>> 10) & 3) + ; + out[22 + outpos] = ((in[1 + inpos] >>> 12) & 3) + ; + out[23 + outpos] = ((in[1 + inpos] >>> 14) & 3) + ; + out[24 + outpos] = ((in[1 + inpos] >>> 16) & 3) + ; + out[25 + outpos] = ((in[1 + inpos] >>> 18) & 3) + ; + out[26 + outpos] = ((in[1 + inpos] >>> 20) & 3) + ; + out[27 + outpos] = ((in[1 + inpos] >>> 22) & 3) + ; + out[28 + outpos] = ((in[1 + inpos] >>> 24) & 3) + ; + out[29 + outpos] = ((in[1 + inpos] >>> 26) & 3) + ; + out[30 + outpos] = ((in[1 + inpos] >>> 28) & 3) + ; + out[31 + outpos] = (in[1 + inpos] >>> 30) + ; + } + + + public static void fastunpack3(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 7) + ; + out[1 + outpos] = ((in[0 + inpos] >>> 3) & 7) + ; + out[2 + outpos] = ((in[0 + inpos] >>> 6) & 7) + ; + out[3 + outpos] = ((in[0 + inpos] >>> 9) & 7) + ; + out[4 + outpos] = ((in[0 + inpos] >>> 12) & 7) + ; + out[5 + outpos] = ((in[0 + inpos] >>> 15) & 7) + ; + out[6 + outpos] = ((in[0 + inpos] >>> 18) & 7) + ; + out[7 + outpos] = ((in[0 + inpos] >>> 21) & 7) + ; + out[8 + outpos] = ((in[0 + inpos] >>> 24) & 7) + ; + out[9 + outpos] = ((in[0 + inpos] >>> 27) & 7) + ; + out[10 + outpos] = (in[0 + inpos] >>> 30) + | ((in[1 + inpos] & 1) << (3 - 1)) + ; + out[11 + outpos] = ((in[1 + inpos] >>> 1) & 7) + ; + out[12 + outpos] = ((in[1 + inpos] >>> 4) & 7) + ; + out[13 + outpos] = ((in[1 + inpos] >>> 7) & 7) + ; + out[14 + outpos] = ((in[1 + inpos] >>> 10) & 7) + ; + out[15 + outpos] = ((in[1 + inpos] >>> 13) & 7) + ; + out[16 + outpos] = ((in[1 + inpos] >>> 16) & 7) + ; + out[17 + outpos] = ((in[1 + inpos] >>> 19) & 7) + ; + out[18 + outpos] = ((in[1 + inpos] >>> 22) & 7) + ; + out[19 + outpos] = ((in[1 + inpos] >>> 25) & 7) + ; + out[20 + outpos] = ((in[1 + inpos] >>> 28) & 7) + ; + out[21 + outpos] = (in[1 + inpos] >>> 31) + | ((in[2 + inpos] & 3) << (3 - 2)) + ; + out[22 + outpos] = ((in[2 + inpos] >>> 2) & 7) + ; + out[23 + outpos] = ((in[2 + inpos] >>> 5) & 7) + ; + out[24 + outpos] = ((in[2 + inpos] >>> 8) & 7) + ; + out[25 + outpos] = ((in[2 + inpos] >>> 11) & 7) + ; + out[26 + outpos] = ((in[2 + inpos] >>> 14) & 7) + ; + out[27 + outpos] = ((in[2 + inpos] >>> 17) & 7) + ; + out[28 + outpos] = ((in[2 + inpos] >>> 20) & 7) + ; + out[29 + outpos] = ((in[2 + inpos] >>> 23) & 7) + ; + out[30 + outpos] = ((in[2 + inpos] >>> 26) & 7) + ; + out[31 + outpos] = (in[2 + inpos] >>> 29) + ; + } + + + public static void fastunpack4(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 15) + ; + out[1 + outpos] = ((in[0 + inpos] >>> 4) & 15) + ; + out[2 + outpos] = ((in[0 + inpos] >>> 8) & 15) + ; + out[3 + outpos] = ((in[0 + inpos] >>> 12) & 15) + ; + out[4 + outpos] = ((in[0 + inpos] >>> 16) & 15) + ; + out[5 + outpos] = ((in[0 + inpos] >>> 20) & 15) + ; + out[6 + outpos] = ((in[0 + inpos] >>> 24) & 15) + ; + out[7 + outpos] = (in[0 + inpos] >>> 28) + ; + out[8 + outpos] = ((in[1 + inpos] >>> 0) & 15) + ; + out[9 + outpos] = ((in[1 + inpos] >>> 4) & 15) + ; + out[10 + outpos] = ((in[1 + inpos] >>> 8) & 15) + ; + out[11 + outpos] = ((in[1 + inpos] >>> 12) & 15) + ; + out[12 + outpos] = ((in[1 + inpos] >>> 16) & 15) + ; + out[13 + outpos] = ((in[1 + inpos] >>> 20) & 15) + ; + out[14 + outpos] = ((in[1 + inpos] >>> 24) & 15) + ; + out[15 + outpos] = (in[1 + inpos] >>> 28) + ; + out[16 + outpos] = ((in[2 + inpos] >>> 0) & 15) + ; + out[17 + outpos] = ((in[2 + inpos] >>> 4) & 15) + ; + out[18 + outpos] = ((in[2 + inpos] >>> 8) & 15) + ; + out[19 + outpos] = ((in[2 + inpos] >>> 12) & 15) + ; + out[20 + outpos] = ((in[2 + inpos] >>> 16) & 15) + ; + out[21 + outpos] = ((in[2 + inpos] >>> 20) & 15) + ; + out[22 + outpos] = ((in[2 + inpos] >>> 24) & 15) + ; + out[23 + outpos] = (in[2 + inpos] >>> 28) + ; + out[24 + outpos] = ((in[3 + inpos] >>> 0) & 15) + ; + out[25 + outpos] = ((in[3 + inpos] >>> 4) & 15) + ; + out[26 + outpos] = ((in[3 + inpos] >>> 8) & 15) + ; + out[27 + outpos] = ((in[3 + inpos] >>> 12) & 15) + ; + out[28 + outpos] = ((in[3 + inpos] >>> 16) & 15) + ; + out[29 + outpos] = ((in[3 + inpos] >>> 20) & 15) + ; + out[30 + outpos] = ((in[3 + inpos] >>> 24) & 15) + ; + out[31 + outpos] = (in[3 + inpos] >>> 28) + ; + } + + + public static void fastunpack5(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 31) + ; + out[1 + outpos] = ((in[0 + inpos] >>> 5) & 31) + ; + out[2 + outpos] = ((in[0 + inpos] >>> 10) & 31) + ; + out[3 + outpos] = ((in[0 + inpos] >>> 15) & 31) + ; + out[4 + outpos] = ((in[0 + inpos] >>> 20) & 31) + ; + out[5 + outpos] = ((in[0 + inpos] >>> 25) & 31) + ; + out[6 + outpos] = (in[0 + inpos] >>> 30) + | ((in[1 + inpos] & 7) << (5 - 3)) + ; + out[7 + outpos] = ((in[1 + inpos] >>> 3) & 31) + ; + out[8 + outpos] = ((in[1 + inpos] >>> 8) & 31) + ; + out[9 + outpos] = ((in[1 + inpos] >>> 13) & 31) + ; + out[10 + outpos] = ((in[1 + inpos] >>> 18) & 31) + ; + out[11 + outpos] = ((in[1 + inpos] >>> 23) & 31) + ; + out[12 + outpos] = (in[1 + inpos] >>> 28) + | ((in[2 + inpos] & 1) << (5 - 1)) + ; + out[13 + outpos] = ((in[2 + inpos] >>> 1) & 31) + ; + out[14 + outpos] = ((in[2 + inpos] >>> 6) & 31) + ; + out[15 + outpos] = ((in[2 + inpos] >>> 11) & 31) + ; + out[16 + outpos] = ((in[2 + inpos] >>> 16) & 31) + ; + out[17 + outpos] = ((in[2 + inpos] >>> 21) & 31) + ; + out[18 + outpos] = ((in[2 + inpos] >>> 26) & 31) + ; + out[19 + outpos] = (in[2 + inpos] >>> 31) + | ((in[3 + inpos] & 15) << (5 - 4)) + ; + out[20 + outpos] = ((in[3 + inpos] >>> 4) & 31) + ; + out[21 + outpos] = ((in[3 + inpos] >>> 9) & 31) + ; + out[22 + outpos] = ((in[3 + inpos] >>> 14) & 31) + ; + out[23 + outpos] = ((in[3 + inpos] >>> 19) & 31) + ; + out[24 + outpos] = ((in[3 + inpos] >>> 24) & 31) + ; + out[25 + outpos] = (in[3 + inpos] >>> 29) + | ((in[4 + inpos] & 3) << (5 - 2)) + ; + out[26 + outpos] = ((in[4 + inpos] >>> 2) & 31) + ; + out[27 + outpos] = ((in[4 + inpos] >>> 7) & 31) + ; + out[28 + outpos] = ((in[4 + inpos] >>> 12) & 31) + ; + out[29 + outpos] = ((in[4 + inpos] >>> 17) & 31) + ; + out[30 + outpos] = ((in[4 + inpos] >>> 22) & 31) + ; + out[31 + outpos] = (in[4 + inpos] >>> 27) + ; + } + + + public static void fastunpack6(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 63) + ; + out[1 + outpos] = ((in[0 + inpos] >>> 6) & 63) + ; + out[2 + outpos] = ((in[0 + inpos] >>> 12) & 63) + ; + out[3 + outpos] = ((in[0 + inpos] >>> 18) & 63) + ; + out[4 + outpos] = ((in[0 + inpos] >>> 24) & 63) + ; + out[5 + outpos] = (in[0 + inpos] >>> 30) + | ((in[1 + inpos] & 15) << (6 - 4)) + ; + out[6 + outpos] = ((in[1 + inpos] >>> 4) & 63) + ; + out[7 + outpos] = ((in[1 + inpos] >>> 10) & 63) + ; + out[8 + outpos] = ((in[1 + inpos] >>> 16) & 63) + ; + out[9 + outpos] = ((in[1 + inpos] >>> 22) & 63) + ; + out[10 + outpos] = (in[1 + inpos] >>> 28) + | ((in[2 + inpos] & 3) << (6 - 2)) + ; + out[11 + outpos] = ((in[2 + inpos] >>> 2) & 63) + ; + out[12 + outpos] = ((in[2 + inpos] >>> 8) & 63) + ; + out[13 + outpos] = ((in[2 + inpos] >>> 14) & 63) + ; + out[14 + outpos] = ((in[2 + inpos] >>> 20) & 63) + ; + out[15 + outpos] = (in[2 + inpos] >>> 26) + ; + out[16 + outpos] = ((in[3 + inpos] >>> 0) & 63) + ; + out[17 + outpos] = ((in[3 + inpos] >>> 6) & 63) + ; + out[18 + outpos] = ((in[3 + inpos] >>> 12) & 63) + ; + out[19 + outpos] = ((in[3 + inpos] >>> 18) & 63) + ; + out[20 + outpos] = ((in[3 + inpos] >>> 24) & 63) + ; + out[21 + outpos] = (in[3 + inpos] >>> 30) + | ((in[4 + inpos] & 15) << (6 - 4)) + ; + out[22 + outpos] = ((in[4 + inpos] >>> 4) & 63) + ; + out[23 + outpos] = ((in[4 + inpos] >>> 10) & 63) + ; + out[24 + outpos] = ((in[4 + inpos] >>> 16) & 63) + ; + out[25 + outpos] = ((in[4 + inpos] >>> 22) & 63) + ; + out[26 + outpos] = (in[4 + inpos] >>> 28) + | ((in[5 + inpos] & 3) << (6 - 2)) + ; + out[27 + outpos] = ((in[5 + inpos] >>> 2) & 63) + ; + out[28 + outpos] = ((in[5 + inpos] >>> 8) & 63) + ; + out[29 + outpos] = ((in[5 + inpos] >>> 14) & 63) + ; + out[30 + outpos] = ((in[5 + inpos] >>> 20) & 63) + ; + out[31 + outpos] = (in[5 + inpos] >>> 26) + ; + } + + + public static void fastunpack7(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 127) + ; + out[1 + outpos] = ((in[0 + inpos] >>> 7) & 127) + ; + out[2 + outpos] = ((in[0 + inpos] >>> 14) & 127) + ; + out[3 + outpos] = ((in[0 + inpos] >>> 21) & 127) + ; + out[4 + outpos] = (in[0 + inpos] >>> 28) + | ((in[1 + inpos] & 7) << (7 - 3)) + ; + out[5 + outpos] = ((in[1 + inpos] >>> 3) & 127) + ; + out[6 + outpos] = ((in[1 + inpos] >>> 10) & 127) + ; + out[7 + outpos] = ((in[1 + inpos] >>> 17) & 127) + ; + out[8 + outpos] = ((in[1 + inpos] >>> 24) & 127) + ; + out[9 + outpos] = (in[1 + inpos] >>> 31) + | ((in[2 + inpos] & 63) << (7 - 6)) + ; + out[10 + outpos] = ((in[2 + inpos] >>> 6) & 127) + ; + out[11 + outpos] = ((in[2 + inpos] >>> 13) & 127) + ; + out[12 + outpos] = ((in[2 + inpos] >>> 20) & 127) + ; + out[13 + outpos] = (in[2 + inpos] >>> 27) + | ((in[3 + inpos] & 3) << (7 - 2)) + ; + out[14 + outpos] = ((in[3 + inpos] >>> 2) & 127) + ; + out[15 + outpos] = ((in[3 + inpos] >>> 9) & 127) + ; + out[16 + outpos] = ((in[3 + inpos] >>> 16) & 127) + ; + out[17 + outpos] = ((in[3 + inpos] >>> 23) & 127) + ; + out[18 + outpos] = (in[3 + inpos] >>> 30) + | ((in[4 + inpos] & 31) << (7 - 5)) + ; + out[19 + outpos] = ((in[4 + inpos] >>> 5) & 127) + ; + out[20 + outpos] = ((in[4 + inpos] >>> 12) & 127) + ; + out[21 + outpos] = ((in[4 + inpos] >>> 19) & 127) + ; + out[22 + outpos] = (in[4 + inpos] >>> 26) + | ((in[5 + inpos] & 1) << (7 - 1)) + ; + out[23 + outpos] = ((in[5 + inpos] >>> 1) & 127) + ; + out[24 + outpos] = ((in[5 + inpos] >>> 8) & 127) + ; + out[25 + outpos] = ((in[5 + inpos] >>> 15) & 127) + ; + out[26 + outpos] = ((in[5 + inpos] >>> 22) & 127) + ; + out[27 + outpos] = (in[5 + inpos] >>> 29) + | ((in[6 + inpos] & 15) << (7 - 4)) + ; + out[28 + outpos] = ((in[6 + inpos] >>> 4) & 127) + ; + out[29 + outpos] = ((in[6 + inpos] >>> 11) & 127) + ; + out[30 + outpos] = ((in[6 + inpos] >>> 18) & 127) + ; + out[31 + outpos] = (in[6 + inpos] >>> 25) + ; + } + + + public static void fastunpack8(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 255) + ; + out[1 + outpos] = ((in[0 + inpos] >>> 8) & 255) + ; + out[2 + outpos] = ((in[0 + inpos] >>> 16) & 255) + ; + out[3 + outpos] = (in[0 + inpos] >>> 24) + ; + out[4 + outpos] = ((in[1 + inpos] >>> 0) & 255) + ; + out[5 + outpos] = ((in[1 + inpos] >>> 8) & 255) + ; + out[6 + outpos] = ((in[1 + inpos] >>> 16) & 255) + ; + out[7 + outpos] = (in[1 + inpos] >>> 24) + ; + out[8 + outpos] = ((in[2 + inpos] >>> 0) & 255) + ; + out[9 + outpos] = ((in[2 + inpos] >>> 8) & 255) + ; + out[10 + outpos] = ((in[2 + inpos] >>> 16) & 255) + ; + out[11 + outpos] = (in[2 + inpos] >>> 24) + ; + out[12 + outpos] = ((in[3 + inpos] >>> 0) & 255) + ; + out[13 + outpos] = ((in[3 + inpos] >>> 8) & 255) + ; + out[14 + outpos] = ((in[3 + inpos] >>> 16) & 255) + ; + out[15 + outpos] = (in[3 + inpos] >>> 24) + ; + out[16 + outpos] = ((in[4 + inpos] >>> 0) & 255) + ; + out[17 + outpos] = ((in[4 + inpos] >>> 8) & 255) + ; + out[18 + outpos] = ((in[4 + inpos] >>> 16) & 255) + ; + out[19 + outpos] = (in[4 + inpos] >>> 24) + ; + out[20 + outpos] = ((in[5 + inpos] >>> 0) & 255) + ; + out[21 + outpos] = ((in[5 + inpos] >>> 8) & 255) + ; + out[22 + outpos] = ((in[5 + inpos] >>> 16) & 255) + ; + out[23 + outpos] = (in[5 + inpos] >>> 24) + ; + out[24 + outpos] = ((in[6 + inpos] >>> 0) & 255) + ; + out[25 + outpos] = ((in[6 + inpos] >>> 8) & 255) + ; + out[26 + outpos] = ((in[6 + inpos] >>> 16) & 255) + ; + out[27 + outpos] = (in[6 + inpos] >>> 24) + ; + out[28 + outpos] = ((in[7 + inpos] >>> 0) & 255) + ; + out[29 + outpos] = ((in[7 + inpos] >>> 8) & 255) + ; + out[30 + outpos] = ((in[7 + inpos] >>> 16) & 255) + ; + out[31 + outpos] = (in[7 + inpos] >>> 24) + ; + } + + + public static void fastunpack9(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 511) + ; + out[1 + outpos] = ((in[0 + inpos] >>> 9) & 511) + ; + out[2 + outpos] = ((in[0 + inpos] >>> 18) & 511) + ; + out[3 + outpos] = (in[0 + inpos] >>> 27) + | ((in[1 + inpos] & 15) << (9 - 4)) + ; + out[4 + outpos] = ((in[1 + inpos] >>> 4) & 511) + ; + out[5 + outpos] = ((in[1 + inpos] >>> 13) & 511) + ; + out[6 + outpos] = ((in[1 + inpos] >>> 22) & 511) + ; + out[7 + outpos] = (in[1 + inpos] >>> 31) + | ((in[2 + inpos] & 255) << (9 - 8)) + ; + out[8 + outpos] = ((in[2 + inpos] >>> 8) & 511) + ; + out[9 + outpos] = ((in[2 + inpos] >>> 17) & 511) + ; + out[10 + outpos] = (in[2 + inpos] >>> 26) + | ((in[3 + inpos] & 7) << (9 - 3)) + ; + out[11 + outpos] = ((in[3 + inpos] >>> 3) & 511) + ; + out[12 + outpos] = ((in[3 + inpos] >>> 12) & 511) + ; + out[13 + outpos] = ((in[3 + inpos] >>> 21) & 511) + ; + out[14 + outpos] = (in[3 + inpos] >>> 30) + | ((in[4 + inpos] & 127) << (9 - 7)) + ; + out[15 + outpos] = ((in[4 + inpos] >>> 7) & 511) + ; + out[16 + outpos] = ((in[4 + inpos] >>> 16) & 511) + ; + out[17 + outpos] = (in[4 + inpos] >>> 25) + | ((in[5 + inpos] & 3) << (9 - 2)) + ; + out[18 + outpos] = ((in[5 + inpos] >>> 2) & 511) + ; + out[19 + outpos] = ((in[5 + inpos] >>> 11) & 511) + ; + out[20 + outpos] = ((in[5 + inpos] >>> 20) & 511) + ; + out[21 + outpos] = (in[5 + inpos] >>> 29) + | ((in[6 + inpos] & 63) << (9 - 6)) + ; + out[22 + outpos] = ((in[6 + inpos] >>> 6) & 511) + ; + out[23 + outpos] = ((in[6 + inpos] >>> 15) & 511) + ; + out[24 + outpos] = (in[6 + inpos] >>> 24) + | ((in[7 + inpos] & 1) << (9 - 1)) + ; + out[25 + outpos] = ((in[7 + inpos] >>> 1) & 511) + ; + out[26 + outpos] = ((in[7 + inpos] >>> 10) & 511) + ; + out[27 + outpos] = ((in[7 + inpos] >>> 19) & 511) + ; + out[28 + outpos] = (in[7 + inpos] >>> 28) + | ((in[8 + inpos] & 31) << (9 - 5)) + ; + out[29 + outpos] = ((in[8 + inpos] >>> 5) & 511) + ; + out[30 + outpos] = ((in[8 + inpos] >>> 14) & 511) + ; + out[31 + outpos] = (in[8 + inpos] >>> 23) + ; + } + + + public static void fastunpack10(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 1023) + ; + out[1 + outpos] = ((in[0 + inpos] >>> 10) & 1023) + ; + out[2 + outpos] = ((in[0 + inpos] >>> 20) & 1023) + ; + out[3 + outpos] = (in[0 + inpos] >>> 30) + | ((in[1 + inpos] & 255) << (10 - 8)) + ; + out[4 + outpos] = ((in[1 + inpos] >>> 8) & 1023) + ; + out[5 + outpos] = ((in[1 + inpos] >>> 18) & 1023) + ; + out[6 + outpos] = (in[1 + inpos] >>> 28) + | ((in[2 + inpos] & 63) << (10 - 6)) + ; + out[7 + outpos] = ((in[2 + inpos] >>> 6) & 1023) + ; + out[8 + outpos] = ((in[2 + inpos] >>> 16) & 1023) + ; + out[9 + outpos] = (in[2 + inpos] >>> 26) + | ((in[3 + inpos] & 15) << (10 - 4)) + ; + out[10 + outpos] = ((in[3 + inpos] >>> 4) & 1023) + ; + out[11 + outpos] = ((in[3 + inpos] >>> 14) & 1023) + ; + out[12 + outpos] = (in[3 + inpos] >>> 24) + | ((in[4 + inpos] & 3) << (10 - 2)) + ; + out[13 + outpos] = ((in[4 + inpos] >>> 2) & 1023) + ; + out[14 + outpos] = ((in[4 + inpos] >>> 12) & 1023) + ; + out[15 + outpos] = (in[4 + inpos] >>> 22) + ; + out[16 + outpos] = ((in[5 + inpos] >>> 0) & 1023) + ; + out[17 + outpos] = ((in[5 + inpos] >>> 10) & 1023) + ; + out[18 + outpos] = ((in[5 + inpos] >>> 20) & 1023) + ; + out[19 + outpos] = (in[5 + inpos] >>> 30) + | ((in[6 + inpos] & 255) << (10 - 8)) + ; + out[20 + outpos] = ((in[6 + inpos] >>> 8) & 1023) + ; + out[21 + outpos] = ((in[6 + inpos] >>> 18) & 1023) + ; + out[22 + outpos] = (in[6 + inpos] >>> 28) + | ((in[7 + inpos] & 63) << (10 - 6)) + ; + out[23 + outpos] = ((in[7 + inpos] >>> 6) & 1023) + ; + out[24 + outpos] = ((in[7 + inpos] >>> 16) & 1023) + ; + out[25 + outpos] = (in[7 + inpos] >>> 26) + | ((in[8 + inpos] & 15) << (10 - 4)) + ; + out[26 + outpos] = ((in[8 + inpos] >>> 4) & 1023) + ; + out[27 + outpos] = ((in[8 + inpos] >>> 14) & 1023) + ; + out[28 + outpos] = (in[8 + inpos] >>> 24) + | ((in[9 + inpos] & 3) << (10 - 2)) + ; + out[29 + outpos] = ((in[9 + inpos] >>> 2) & 1023) + ; + out[30 + outpos] = ((in[9 + inpos] >>> 12) & 1023) + ; + out[31 + outpos] = (in[9 + inpos] >>> 22) + ; + } + + + public static void fastunpack11(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 2047) + ; + out[1 + outpos] = ((in[0 + inpos] >>> 11) & 2047) + ; + out[2 + outpos] = (in[0 + inpos] >>> 22) + | ((in[1 + inpos] & 1) << (11 - 1)) + ; + out[3 + outpos] = ((in[1 + inpos] >>> 1) & 2047) + ; + out[4 + outpos] = ((in[1 + inpos] >>> 12) & 2047) + ; + out[5 + outpos] = (in[1 + inpos] >>> 23) + | ((in[2 + inpos] & 3) << (11 - 2)) + ; + out[6 + outpos] = ((in[2 + inpos] >>> 2) & 2047) + ; + out[7 + outpos] = ((in[2 + inpos] >>> 13) & 2047) + ; + out[8 + outpos] = (in[2 + inpos] >>> 24) + | ((in[3 + inpos] & 7) << (11 - 3)) + ; + out[9 + outpos] = ((in[3 + inpos] >>> 3) & 2047) + ; + out[10 + outpos] = ((in[3 + inpos] >>> 14) & 2047) + ; + out[11 + outpos] = (in[3 + inpos] >>> 25) + | ((in[4 + inpos] & 15) << (11 - 4)) + ; + out[12 + outpos] = ((in[4 + inpos] >>> 4) & 2047) + ; + out[13 + outpos] = ((in[4 + inpos] >>> 15) & 2047) + ; + out[14 + outpos] = (in[4 + inpos] >>> 26) + | ((in[5 + inpos] & 31) << (11 - 5)) + ; + out[15 + outpos] = ((in[5 + inpos] >>> 5) & 2047) + ; + out[16 + outpos] = ((in[5 + inpos] >>> 16) & 2047) + ; + out[17 + outpos] = (in[5 + inpos] >>> 27) + | ((in[6 + inpos] & 63) << (11 - 6)) + ; + out[18 + outpos] = ((in[6 + inpos] >>> 6) & 2047) + ; + out[19 + outpos] = ((in[6 + inpos] >>> 17) & 2047) + ; + out[20 + outpos] = (in[6 + inpos] >>> 28) + | ((in[7 + inpos] & 127) << (11 - 7)) + ; + out[21 + outpos] = ((in[7 + inpos] >>> 7) & 2047) + ; + out[22 + outpos] = ((in[7 + inpos] >>> 18) & 2047) + ; + out[23 + outpos] = (in[7 + inpos] >>> 29) + | ((in[8 + inpos] & 255) << (11 - 8)) + ; + out[24 + outpos] = ((in[8 + inpos] >>> 8) & 2047) + ; + out[25 + outpos] = ((in[8 + inpos] >>> 19) & 2047) + ; + out[26 + outpos] = (in[8 + inpos] >>> 30) + | ((in[9 + inpos] & 511) << (11 - 9)) + ; + out[27 + outpos] = ((in[9 + inpos] >>> 9) & 2047) + ; + out[28 + outpos] = ((in[9 + inpos] >>> 20) & 2047) + ; + out[29 + outpos] = (in[9 + inpos] >>> 31) + | ((in[10 + inpos] & 1023) << (11 - 10)) + ; + out[30 + outpos] = ((in[10 + inpos] >>> 10) & 2047) + ; + out[31 + outpos] = (in[10 + inpos] >>> 21) + ; + } + + + public static void fastunpack12(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 4095) + ; + out[1 + outpos] = ((in[0 + inpos] >>> 12) & 4095) + ; + out[2 + outpos] = (in[0 + inpos] >>> 24) + | ((in[1 + inpos] & 15) << (12 - 4)) + ; + out[3 + outpos] = ((in[1 + inpos] >>> 4) & 4095) + ; + out[4 + outpos] = ((in[1 + inpos] >>> 16) & 4095) + ; + out[5 + outpos] = (in[1 + inpos] >>> 28) + | ((in[2 + inpos] & 255) << (12 - 8)) + ; + out[6 + outpos] = ((in[2 + inpos] >>> 8) & 4095) + ; + out[7 + outpos] = (in[2 + inpos] >>> 20) + ; + out[8 + outpos] = ((in[3 + inpos] >>> 0) & 4095) + ; + out[9 + outpos] = ((in[3 + inpos] >>> 12) & 4095) + ; + out[10 + outpos] = (in[3 + inpos] >>> 24) + | ((in[4 + inpos] & 15) << (12 - 4)) + ; + out[11 + outpos] = ((in[4 + inpos] >>> 4) & 4095) + ; + out[12 + outpos] = ((in[4 + inpos] >>> 16) & 4095) + ; + out[13 + outpos] = (in[4 + inpos] >>> 28) + | ((in[5 + inpos] & 255) << (12 - 8)) + ; + out[14 + outpos] = ((in[5 + inpos] >>> 8) & 4095) + ; + out[15 + outpos] = (in[5 + inpos] >>> 20) + ; + out[16 + outpos] = ((in[6 + inpos] >>> 0) & 4095) + ; + out[17 + outpos] = ((in[6 + inpos] >>> 12) & 4095) + ; + out[18 + outpos] = (in[6 + inpos] >>> 24) + | ((in[7 + inpos] & 15) << (12 - 4)) + ; + out[19 + outpos] = ((in[7 + inpos] >>> 4) & 4095) + ; + out[20 + outpos] = ((in[7 + inpos] >>> 16) & 4095) + ; + out[21 + outpos] = (in[7 + inpos] >>> 28) + | ((in[8 + inpos] & 255) << (12 - 8)) + ; + out[22 + outpos] = ((in[8 + inpos] >>> 8) & 4095) + ; + out[23 + outpos] = (in[8 + inpos] >>> 20) + ; + out[24 + outpos] = ((in[9 + inpos] >>> 0) & 4095) + ; + out[25 + outpos] = ((in[9 + inpos] >>> 12) & 4095) + ; + out[26 + outpos] = (in[9 + inpos] >>> 24) + | ((in[10 + inpos] & 15) << (12 - 4)) + ; + out[27 + outpos] = ((in[10 + inpos] >>> 4) & 4095) + ; + out[28 + outpos] = ((in[10 + inpos] >>> 16) & 4095) + ; + out[29 + outpos] = (in[10 + inpos] >>> 28) + | ((in[11 + inpos] & 255) << (12 - 8)) + ; + out[30 + outpos] = ((in[11 + inpos] >>> 8) & 4095) + ; + out[31 + outpos] = (in[11 + inpos] >>> 20) + ; + } + + + public static void fastunpack13(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 8191) + ; + out[1 + outpos] = ((in[0 + inpos] >>> 13) & 8191) + ; + out[2 + outpos] = (in[0 + inpos] >>> 26) + | ((in[1 + inpos] & 127) << (13 - 7)) + ; + out[3 + outpos] = ((in[1 + inpos] >>> 7) & 8191) + ; + out[4 + outpos] = (in[1 + inpos] >>> 20) + | ((in[2 + inpos] & 1) << (13 - 1)) + ; + out[5 + outpos] = ((in[2 + inpos] >>> 1) & 8191) + ; + out[6 + outpos] = ((in[2 + inpos] >>> 14) & 8191) + ; + out[7 + outpos] = (in[2 + inpos] >>> 27) + | ((in[3 + inpos] & 255) << (13 - 8)) + ; + out[8 + outpos] = ((in[3 + inpos] >>> 8) & 8191) + ; + out[9 + outpos] = (in[3 + inpos] >>> 21) + | ((in[4 + inpos] & 3) << (13 - 2)) + ; + out[10 + outpos] = ((in[4 + inpos] >>> 2) & 8191) + ; + out[11 + outpos] = ((in[4 + inpos] >>> 15) & 8191) + ; + out[12 + outpos] = (in[4 + inpos] >>> 28) + | ((in[5 + inpos] & 511) << (13 - 9)) + ; + out[13 + outpos] = ((in[5 + inpos] >>> 9) & 8191) + ; + out[14 + outpos] = (in[5 + inpos] >>> 22) + | ((in[6 + inpos] & 7) << (13 - 3)) + ; + out[15 + outpos] = ((in[6 + inpos] >>> 3) & 8191) + ; + out[16 + outpos] = ((in[6 + inpos] >>> 16) & 8191) + ; + out[17 + outpos] = (in[6 + inpos] >>> 29) + | ((in[7 + inpos] & 1023) << (13 - 10)) + ; + out[18 + outpos] = ((in[7 + inpos] >>> 10) & 8191) + ; + out[19 + outpos] = (in[7 + inpos] >>> 23) + | ((in[8 + inpos] & 15) << (13 - 4)) + ; + out[20 + outpos] = ((in[8 + inpos] >>> 4) & 8191) + ; + out[21 + outpos] = ((in[8 + inpos] >>> 17) & 8191) + ; + out[22 + outpos] = (in[8 + inpos] >>> 30) + | ((in[9 + inpos] & 2047) << (13 - 11)) + ; + out[23 + outpos] = ((in[9 + inpos] >>> 11) & 8191) + ; + out[24 + outpos] = (in[9 + inpos] >>> 24) + | ((in[10 + inpos] & 31) << (13 - 5)) + ; + out[25 + outpos] = ((in[10 + inpos] >>> 5) & 8191) + ; + out[26 + outpos] = ((in[10 + inpos] >>> 18) & 8191) + ; + out[27 + outpos] = (in[10 + inpos] >>> 31) + | ((in[11 + inpos] & 4095) << (13 - 12)) + ; + out[28 + outpos] = ((in[11 + inpos] >>> 12) & 8191) + ; + out[29 + outpos] = (in[11 + inpos] >>> 25) + | ((in[12 + inpos] & 63) << (13 - 6)) + ; + out[30 + outpos] = ((in[12 + inpos] >>> 6) & 8191) + ; + out[31 + outpos] = (in[12 + inpos] >>> 19) + ; + } + + + public static void fastunpack14(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 16383) + ; + out[1 + outpos] = ((in[0 + inpos] >>> 14) & 16383) + ; + out[2 + outpos] = (in[0 + inpos] >>> 28) + | ((in[1 + inpos] & 1023) << (14 - 10)) + ; + out[3 + outpos] = ((in[1 + inpos] >>> 10) & 16383) + ; + out[4 + outpos] = (in[1 + inpos] >>> 24) + | ((in[2 + inpos] & 63) << (14 - 6)) + ; + out[5 + outpos] = ((in[2 + inpos] >>> 6) & 16383) + ; + out[6 + outpos] = (in[2 + inpos] >>> 20) + | ((in[3 + inpos] & 3) << (14 - 2)) + ; + out[7 + outpos] = ((in[3 + inpos] >>> 2) & 16383) + ; + out[8 + outpos] = ((in[3 + inpos] >>> 16) & 16383) + ; + out[9 + outpos] = (in[3 + inpos] >>> 30) + | ((in[4 + inpos] & 4095) << (14 - 12)) + ; + out[10 + outpos] = ((in[4 + inpos] >>> 12) & 16383) + ; + out[11 + outpos] = (in[4 + inpos] >>> 26) + | ((in[5 + inpos] & 255) << (14 - 8)) + ; + out[12 + outpos] = ((in[5 + inpos] >>> 8) & 16383) + ; + out[13 + outpos] = (in[5 + inpos] >>> 22) + | ((in[6 + inpos] & 15) << (14 - 4)) + ; + out[14 + outpos] = ((in[6 + inpos] >>> 4) & 16383) + ; + out[15 + outpos] = (in[6 + inpos] >>> 18) + ; + out[16 + outpos] = ((in[7 + inpos] >>> 0) & 16383) + ; + out[17 + outpos] = ((in[7 + inpos] >>> 14) & 16383) + ; + out[18 + outpos] = (in[7 + inpos] >>> 28) + | ((in[8 + inpos] & 1023) << (14 - 10)) + ; + out[19 + outpos] = ((in[8 + inpos] >>> 10) & 16383) + ; + out[20 + outpos] = (in[8 + inpos] >>> 24) + | ((in[9 + inpos] & 63) << (14 - 6)) + ; + out[21 + outpos] = ((in[9 + inpos] >>> 6) & 16383) + ; + out[22 + outpos] = (in[9 + inpos] >>> 20) + | ((in[10 + inpos] & 3) << (14 - 2)) + ; + out[23 + outpos] = ((in[10 + inpos] >>> 2) & 16383) + ; + out[24 + outpos] = ((in[10 + inpos] >>> 16) & 16383) + ; + out[25 + outpos] = (in[10 + inpos] >>> 30) + | ((in[11 + inpos] & 4095) << (14 - 12)) + ; + out[26 + outpos] = ((in[11 + inpos] >>> 12) & 16383) + ; + out[27 + outpos] = (in[11 + inpos] >>> 26) + | ((in[12 + inpos] & 255) << (14 - 8)) + ; + out[28 + outpos] = ((in[12 + inpos] >>> 8) & 16383) + ; + out[29 + outpos] = (in[12 + inpos] >>> 22) + | ((in[13 + inpos] & 15) << (14 - 4)) + ; + out[30 + outpos] = ((in[13 + inpos] >>> 4) & 16383) + ; + out[31 + outpos] = (in[13 + inpos] >>> 18) + ; + } + + + public static void fastunpack15(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 32767) + ; + out[1 + outpos] = ((in[0 + inpos] >>> 15) & 32767) + ; + out[2 + outpos] = (in[0 + inpos] >>> 30) + | ((in[1 + inpos] & 8191) << (15 - 13)) + ; + out[3 + outpos] = ((in[1 + inpos] >>> 13) & 32767) + ; + out[4 + outpos] = (in[1 + inpos] >>> 28) + | ((in[2 + inpos] & 2047) << (15 - 11)) + ; + out[5 + outpos] = ((in[2 + inpos] >>> 11) & 32767) + ; + out[6 + outpos] = (in[2 + inpos] >>> 26) + | ((in[3 + inpos] & 511) << (15 - 9)) + ; + out[7 + outpos] = ((in[3 + inpos] >>> 9) & 32767) + ; + out[8 + outpos] = (in[3 + inpos] >>> 24) + | ((in[4 + inpos] & 127) << (15 - 7)) + ; + out[9 + outpos] = ((in[4 + inpos] >>> 7) & 32767) + ; + out[10 + outpos] = (in[4 + inpos] >>> 22) + | ((in[5 + inpos] & 31) << (15 - 5)) + ; + out[11 + outpos] = ((in[5 + inpos] >>> 5) & 32767) + ; + out[12 + outpos] = (in[5 + inpos] >>> 20) + | ((in[6 + inpos] & 7) << (15 - 3)) + ; + out[13 + outpos] = ((in[6 + inpos] >>> 3) & 32767) + ; + out[14 + outpos] = (in[6 + inpos] >>> 18) + | ((in[7 + inpos] & 1) << (15 - 1)) + ; + out[15 + outpos] = ((in[7 + inpos] >>> 1) & 32767) + ; + out[16 + outpos] = ((in[7 + inpos] >>> 16) & 32767) + ; + out[17 + outpos] = (in[7 + inpos] >>> 31) + | ((in[8 + inpos] & 16383) << (15 - 14)) + ; + out[18 + outpos] = ((in[8 + inpos] >>> 14) & 32767) + ; + out[19 + outpos] = (in[8 + inpos] >>> 29) + | ((in[9 + inpos] & 4095) << (15 - 12)) + ; + out[20 + outpos] = ((in[9 + inpos] >>> 12) & 32767) + ; + out[21 + outpos] = (in[9 + inpos] >>> 27) + | ((in[10 + inpos] & 1023) << (15 - 10)) + ; + out[22 + outpos] = ((in[10 + inpos] >>> 10) & 32767) + ; + out[23 + outpos] = (in[10 + inpos] >>> 25) + | ((in[11 + inpos] & 255) << (15 - 8)) + ; + out[24 + outpos] = ((in[11 + inpos] >>> 8) & 32767) + ; + out[25 + outpos] = (in[11 + inpos] >>> 23) + | ((in[12 + inpos] & 63) << (15 - 6)) + ; + out[26 + outpos] = ((in[12 + inpos] >>> 6) & 32767) + ; + out[27 + outpos] = (in[12 + inpos] >>> 21) + | ((in[13 + inpos] & 15) << (15 - 4)) + ; + out[28 + outpos] = ((in[13 + inpos] >>> 4) & 32767) + ; + out[29 + outpos] = (in[13 + inpos] >>> 19) + | ((in[14 + inpos] & 3) << (15 - 2)) + ; + out[30 + outpos] = ((in[14 + inpos] >>> 2) & 32767) + ; + out[31 + outpos] = (in[14 + inpos] >>> 17) + ; + } + + + public static void fastunpack16(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 65535) + ; + out[1 + outpos] = (in[0 + inpos] >>> 16) + ; + out[2 + outpos] = ((in[1 + inpos] >>> 0) & 65535) + ; + out[3 + outpos] = (in[1 + inpos] >>> 16) + ; + out[4 + outpos] = ((in[2 + inpos] >>> 0) & 65535) + ; + out[5 + outpos] = (in[2 + inpos] >>> 16) + ; + out[6 + outpos] = ((in[3 + inpos] >>> 0) & 65535) + ; + out[7 + outpos] = (in[3 + inpos] >>> 16) + ; + out[8 + outpos] = ((in[4 + inpos] >>> 0) & 65535) + ; + out[9 + outpos] = (in[4 + inpos] >>> 16) + ; + out[10 + outpos] = ((in[5 + inpos] >>> 0) & 65535) + ; + out[11 + outpos] = (in[5 + inpos] >>> 16) + ; + out[12 + outpos] = ((in[6 + inpos] >>> 0) & 65535) + ; + out[13 + outpos] = (in[6 + inpos] >>> 16) + ; + out[14 + outpos] = ((in[7 + inpos] >>> 0) & 65535) + ; + out[15 + outpos] = (in[7 + inpos] >>> 16) + ; + out[16 + outpos] = ((in[8 + inpos] >>> 0) & 65535) + ; + out[17 + outpos] = (in[8 + inpos] >>> 16) + ; + out[18 + outpos] = ((in[9 + inpos] >>> 0) & 65535) + ; + out[19 + outpos] = (in[9 + inpos] >>> 16) + ; + out[20 + outpos] = ((in[10 + inpos] >>> 0) & 65535) + ; + out[21 + outpos] = (in[10 + inpos] >>> 16) + ; + out[22 + outpos] = ((in[11 + inpos] >>> 0) & 65535) + ; + out[23 + outpos] = (in[11 + inpos] >>> 16) + ; + out[24 + outpos] = ((in[12 + inpos] >>> 0) & 65535) + ; + out[25 + outpos] = (in[12 + inpos] >>> 16) + ; + out[26 + outpos] = ((in[13 + inpos] >>> 0) & 65535) + ; + out[27 + outpos] = (in[13 + inpos] >>> 16) + ; + out[28 + outpos] = ((in[14 + inpos] >>> 0) & 65535) + ; + out[29 + outpos] = (in[14 + inpos] >>> 16) + ; + out[30 + outpos] = ((in[15 + inpos] >>> 0) & 65535) + ; + out[31 + outpos] = (in[15 + inpos] >>> 16) + ; + } + + + public static void fastunpack17(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 131071) + ; + out[1 + outpos] = (in[0 + inpos] >>> 17) + | ((in[1 + inpos] & 3) << (17 - 2)) + ; + out[2 + outpos] = ((in[1 + inpos] >>> 2) & 131071) + ; + out[3 + outpos] = (in[1 + inpos] >>> 19) + | ((in[2 + inpos] & 15) << (17 - 4)) + ; + out[4 + outpos] = ((in[2 + inpos] >>> 4) & 131071) + ; + out[5 + outpos] = (in[2 + inpos] >>> 21) + | ((in[3 + inpos] & 63) << (17 - 6)) + ; + out[6 + outpos] = ((in[3 + inpos] >>> 6) & 131071) + ; + out[7 + outpos] = (in[3 + inpos] >>> 23) + | ((in[4 + inpos] & 255) << (17 - 8)) + ; + out[8 + outpos] = ((in[4 + inpos] >>> 8) & 131071) + ; + out[9 + outpos] = (in[4 + inpos] >>> 25) + | ((in[5 + inpos] & 1023) << (17 - 10)) + ; + out[10 + outpos] = ((in[5 + inpos] >>> 10) & 131071) + ; + out[11 + outpos] = (in[5 + inpos] >>> 27) + | ((in[6 + inpos] & 4095) << (17 - 12)) + ; + out[12 + outpos] = ((in[6 + inpos] >>> 12) & 131071) + ; + out[13 + outpos] = (in[6 + inpos] >>> 29) + | ((in[7 + inpos] & 16383) << (17 - 14)) + ; + out[14 + outpos] = ((in[7 + inpos] >>> 14) & 131071) + ; + out[15 + outpos] = (in[7 + inpos] >>> 31) + | ((in[8 + inpos] & 65535) << (17 - 16)) + ; + out[16 + outpos] = (in[8 + inpos] >>> 16) + | ((in[9 + inpos] & 1) << (17 - 1)) + ; + out[17 + outpos] = ((in[9 + inpos] >>> 1) & 131071) + ; + out[18 + outpos] = (in[9 + inpos] >>> 18) + | ((in[10 + inpos] & 7) << (17 - 3)) + ; + out[19 + outpos] = ((in[10 + inpos] >>> 3) & 131071) + ; + out[20 + outpos] = (in[10 + inpos] >>> 20) + | ((in[11 + inpos] & 31) << (17 - 5)) + ; + out[21 + outpos] = ((in[11 + inpos] >>> 5) & 131071) + ; + out[22 + outpos] = (in[11 + inpos] >>> 22) + | ((in[12 + inpos] & 127) << (17 - 7)) + ; + out[23 + outpos] = ((in[12 + inpos] >>> 7) & 131071) + ; + out[24 + outpos] = (in[12 + inpos] >>> 24) + | ((in[13 + inpos] & 511) << (17 - 9)) + ; + out[25 + outpos] = ((in[13 + inpos] >>> 9) & 131071) + ; + out[26 + outpos] = (in[13 + inpos] >>> 26) + | ((in[14 + inpos] & 2047) << (17 - 11)) + ; + out[27 + outpos] = ((in[14 + inpos] >>> 11) & 131071) + ; + out[28 + outpos] = (in[14 + inpos] >>> 28) + | ((in[15 + inpos] & 8191) << (17 - 13)) + ; + out[29 + outpos] = ((in[15 + inpos] >>> 13) & 131071) + ; + out[30 + outpos] = (in[15 + inpos] >>> 30) + | ((in[16 + inpos] & 32767) << (17 - 15)) + ; + out[31 + outpos] = (in[16 + inpos] >>> 15) + ; + } + + + public static void fastunpack18(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 262143) + ; + out[1 + outpos] = (in[0 + inpos] >>> 18) + | ((in[1 + inpos] & 15) << (18 - 4)) + ; + out[2 + outpos] = ((in[1 + inpos] >>> 4) & 262143) + ; + out[3 + outpos] = (in[1 + inpos] >>> 22) + | ((in[2 + inpos] & 255) << (18 - 8)) + ; + out[4 + outpos] = ((in[2 + inpos] >>> 8) & 262143) + ; + out[5 + outpos] = (in[2 + inpos] >>> 26) + | ((in[3 + inpos] & 4095) << (18 - 12)) + ; + out[6 + outpos] = ((in[3 + inpos] >>> 12) & 262143) + ; + out[7 + outpos] = (in[3 + inpos] >>> 30) + | ((in[4 + inpos] & 65535) << (18 - 16)) + ; + out[8 + outpos] = (in[4 + inpos] >>> 16) + | ((in[5 + inpos] & 3) << (18 - 2)) + ; + out[9 + outpos] = ((in[5 + inpos] >>> 2) & 262143) + ; + out[10 + outpos] = (in[5 + inpos] >>> 20) + | ((in[6 + inpos] & 63) << (18 - 6)) + ; + out[11 + outpos] = ((in[6 + inpos] >>> 6) & 262143) + ; + out[12 + outpos] = (in[6 + inpos] >>> 24) + | ((in[7 + inpos] & 1023) << (18 - 10)) + ; + out[13 + outpos] = ((in[7 + inpos] >>> 10) & 262143) + ; + out[14 + outpos] = (in[7 + inpos] >>> 28) + | ((in[8 + inpos] & 16383) << (18 - 14)) + ; + out[15 + outpos] = (in[8 + inpos] >>> 14) + ; + out[16 + outpos] = ((in[9 + inpos] >>> 0) & 262143) + ; + out[17 + outpos] = (in[9 + inpos] >>> 18) + | ((in[10 + inpos] & 15) << (18 - 4)) + ; + out[18 + outpos] = ((in[10 + inpos] >>> 4) & 262143) + ; + out[19 + outpos] = (in[10 + inpos] >>> 22) + | ((in[11 + inpos] & 255) << (18 - 8)) + ; + out[20 + outpos] = ((in[11 + inpos] >>> 8) & 262143) + ; + out[21 + outpos] = (in[11 + inpos] >>> 26) + | ((in[12 + inpos] & 4095) << (18 - 12)) + ; + out[22 + outpos] = ((in[12 + inpos] >>> 12) & 262143) + ; + out[23 + outpos] = (in[12 + inpos] >>> 30) + | ((in[13 + inpos] & 65535) << (18 - 16)) + ; + out[24 + outpos] = (in[13 + inpos] >>> 16) + | ((in[14 + inpos] & 3) << (18 - 2)) + ; + out[25 + outpos] = ((in[14 + inpos] >>> 2) & 262143) + ; + out[26 + outpos] = (in[14 + inpos] >>> 20) + | ((in[15 + inpos] & 63) << (18 - 6)) + ; + out[27 + outpos] = ((in[15 + inpos] >>> 6) & 262143) + ; + out[28 + outpos] = (in[15 + inpos] >>> 24) + | ((in[16 + inpos] & 1023) << (18 - 10)) + ; + out[29 + outpos] = ((in[16 + inpos] >>> 10) & 262143) + ; + out[30 + outpos] = (in[16 + inpos] >>> 28) + | ((in[17 + inpos] & 16383) << (18 - 14)) + ; + out[31 + outpos] = (in[17 + inpos] >>> 14) + ; + } + + + public static void fastunpack19(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 524287) + ; + out[1 + outpos] = (in[0 + inpos] >>> 19) + | ((in[1 + inpos] & 63) << (19 - 6)) + ; + out[2 + outpos] = ((in[1 + inpos] >>> 6) & 524287) + ; + out[3 + outpos] = (in[1 + inpos] >>> 25) + | ((in[2 + inpos] & 4095) << (19 - 12)) + ; + out[4 + outpos] = ((in[2 + inpos] >>> 12) & 524287) + ; + out[5 + outpos] = (in[2 + inpos] >>> 31) + | ((in[3 + inpos] & 262143) << (19 - 18)) + ; + out[6 + outpos] = (in[3 + inpos] >>> 18) + | ((in[4 + inpos] & 31) << (19 - 5)) + ; + out[7 + outpos] = ((in[4 + inpos] >>> 5) & 524287) + ; + out[8 + outpos] = (in[4 + inpos] >>> 24) + | ((in[5 + inpos] & 2047) << (19 - 11)) + ; + out[9 + outpos] = ((in[5 + inpos] >>> 11) & 524287) + ; + out[10 + outpos] = (in[5 + inpos] >>> 30) + | ((in[6 + inpos] & 131071) << (19 - 17)) + ; + out[11 + outpos] = (in[6 + inpos] >>> 17) + | ((in[7 + inpos] & 15) << (19 - 4)) + ; + out[12 + outpos] = ((in[7 + inpos] >>> 4) & 524287) + ; + out[13 + outpos] = (in[7 + inpos] >>> 23) + | ((in[8 + inpos] & 1023) << (19 - 10)) + ; + out[14 + outpos] = ((in[8 + inpos] >>> 10) & 524287) + ; + out[15 + outpos] = (in[8 + inpos] >>> 29) + | ((in[9 + inpos] & 65535) << (19 - 16)) + ; + out[16 + outpos] = (in[9 + inpos] >>> 16) + | ((in[10 + inpos] & 7) << (19 - 3)) + ; + out[17 + outpos] = ((in[10 + inpos] >>> 3) & 524287) + ; + out[18 + outpos] = (in[10 + inpos] >>> 22) + | ((in[11 + inpos] & 511) << (19 - 9)) + ; + out[19 + outpos] = ((in[11 + inpos] >>> 9) & 524287) + ; + out[20 + outpos] = (in[11 + inpos] >>> 28) + | ((in[12 + inpos] & 32767) << (19 - 15)) + ; + out[21 + outpos] = (in[12 + inpos] >>> 15) + | ((in[13 + inpos] & 3) << (19 - 2)) + ; + out[22 + outpos] = ((in[13 + inpos] >>> 2) & 524287) + ; + out[23 + outpos] = (in[13 + inpos] >>> 21) + | ((in[14 + inpos] & 255) << (19 - 8)) + ; + out[24 + outpos] = ((in[14 + inpos] >>> 8) & 524287) + ; + out[25 + outpos] = (in[14 + inpos] >>> 27) + | ((in[15 + inpos] & 16383) << (19 - 14)) + ; + out[26 + outpos] = (in[15 + inpos] >>> 14) + | ((in[16 + inpos] & 1) << (19 - 1)) + ; + out[27 + outpos] = ((in[16 + inpos] >>> 1) & 524287) + ; + out[28 + outpos] = (in[16 + inpos] >>> 20) + | ((in[17 + inpos] & 127) << (19 - 7)) + ; + out[29 + outpos] = ((in[17 + inpos] >>> 7) & 524287) + ; + out[30 + outpos] = (in[17 + inpos] >>> 26) + | ((in[18 + inpos] & 8191) << (19 - 13)) + ; + out[31 + outpos] = (in[18 + inpos] >>> 13) + ; + } + + + public static void fastunpack20(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 1048575) + ; + out[1 + outpos] = (in[0 + inpos] >>> 20) + | ((in[1 + inpos] & 255) << (20 - 8)) + ; + out[2 + outpos] = ((in[1 + inpos] >>> 8) & 1048575) + ; + out[3 + outpos] = (in[1 + inpos] >>> 28) + | ((in[2 + inpos] & 65535) << (20 - 16)) + ; + out[4 + outpos] = (in[2 + inpos] >>> 16) + | ((in[3 + inpos] & 15) << (20 - 4)) + ; + out[5 + outpos] = ((in[3 + inpos] >>> 4) & 1048575) + ; + out[6 + outpos] = (in[3 + inpos] >>> 24) + | ((in[4 + inpos] & 4095) << (20 - 12)) + ; + out[7 + outpos] = (in[4 + inpos] >>> 12) + ; + out[8 + outpos] = ((in[5 + inpos] >>> 0) & 1048575) + ; + out[9 + outpos] = (in[5 + inpos] >>> 20) + | ((in[6 + inpos] & 255) << (20 - 8)) + ; + out[10 + outpos] = ((in[6 + inpos] >>> 8) & 1048575) + ; + out[11 + outpos] = (in[6 + inpos] >>> 28) + | ((in[7 + inpos] & 65535) << (20 - 16)) + ; + out[12 + outpos] = (in[7 + inpos] >>> 16) + | ((in[8 + inpos] & 15) << (20 - 4)) + ; + out[13 + outpos] = ((in[8 + inpos] >>> 4) & 1048575) + ; + out[14 + outpos] = (in[8 + inpos] >>> 24) + | ((in[9 + inpos] & 4095) << (20 - 12)) + ; + out[15 + outpos] = (in[9 + inpos] >>> 12) + ; + out[16 + outpos] = ((in[10 + inpos] >>> 0) & 1048575) + ; + out[17 + outpos] = (in[10 + inpos] >>> 20) + | ((in[11 + inpos] & 255) << (20 - 8)) + ; + out[18 + outpos] = ((in[11 + inpos] >>> 8) & 1048575) + ; + out[19 + outpos] = (in[11 + inpos] >>> 28) + | ((in[12 + inpos] & 65535) << (20 - 16)) + ; + out[20 + outpos] = (in[12 + inpos] >>> 16) + | ((in[13 + inpos] & 15) << (20 - 4)) + ; + out[21 + outpos] = ((in[13 + inpos] >>> 4) & 1048575) + ; + out[22 + outpos] = (in[13 + inpos] >>> 24) + | ((in[14 + inpos] & 4095) << (20 - 12)) + ; + out[23 + outpos] = (in[14 + inpos] >>> 12) + ; + out[24 + outpos] = ((in[15 + inpos] >>> 0) & 1048575) + ; + out[25 + outpos] = (in[15 + inpos] >>> 20) + | ((in[16 + inpos] & 255) << (20 - 8)) + ; + out[26 + outpos] = ((in[16 + inpos] >>> 8) & 1048575) + ; + out[27 + outpos] = (in[16 + inpos] >>> 28) + | ((in[17 + inpos] & 65535) << (20 - 16)) + ; + out[28 + outpos] = (in[17 + inpos] >>> 16) + | ((in[18 + inpos] & 15) << (20 - 4)) + ; + out[29 + outpos] = ((in[18 + inpos] >>> 4) & 1048575) + ; + out[30 + outpos] = (in[18 + inpos] >>> 24) + | ((in[19 + inpos] & 4095) << (20 - 12)) + ; + out[31 + outpos] = (in[19 + inpos] >>> 12) + ; + } + + + public static void fastunpack21(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 2097151) + ; + out[1 + outpos] = (in[0 + inpos] >>> 21) + | ((in[1 + inpos] & 1023) << (21 - 10)) + ; + out[2 + outpos] = ((in[1 + inpos] >>> 10) & 2097151) + ; + out[3 + outpos] = (in[1 + inpos] >>> 31) + | ((in[2 + inpos] & 1048575) << (21 - 20)) + ; + out[4 + outpos] = (in[2 + inpos] >>> 20) + | ((in[3 + inpos] & 511) << (21 - 9)) + ; + out[5 + outpos] = ((in[3 + inpos] >>> 9) & 2097151) + ; + out[6 + outpos] = (in[3 + inpos] >>> 30) + | ((in[4 + inpos] & 524287) << (21 - 19)) + ; + out[7 + outpos] = (in[4 + inpos] >>> 19) + | ((in[5 + inpos] & 255) << (21 - 8)) + ; + out[8 + outpos] = ((in[5 + inpos] >>> 8) & 2097151) + ; + out[9 + outpos] = (in[5 + inpos] >>> 29) + | ((in[6 + inpos] & 262143) << (21 - 18)) + ; + out[10 + outpos] = (in[6 + inpos] >>> 18) + | ((in[7 + inpos] & 127) << (21 - 7)) + ; + out[11 + outpos] = ((in[7 + inpos] >>> 7) & 2097151) + ; + out[12 + outpos] = (in[7 + inpos] >>> 28) + | ((in[8 + inpos] & 131071) << (21 - 17)) + ; + out[13 + outpos] = (in[8 + inpos] >>> 17) + | ((in[9 + inpos] & 63) << (21 - 6)) + ; + out[14 + outpos] = ((in[9 + inpos] >>> 6) & 2097151) + ; + out[15 + outpos] = (in[9 + inpos] >>> 27) + | ((in[10 + inpos] & 65535) << (21 - 16)) + ; + out[16 + outpos] = (in[10 + inpos] >>> 16) + | ((in[11 + inpos] & 31) << (21 - 5)) + ; + out[17 + outpos] = ((in[11 + inpos] >>> 5) & 2097151) + ; + out[18 + outpos] = (in[11 + inpos] >>> 26) + | ((in[12 + inpos] & 32767) << (21 - 15)) + ; + out[19 + outpos] = (in[12 + inpos] >>> 15) + | ((in[13 + inpos] & 15) << (21 - 4)) + ; + out[20 + outpos] = ((in[13 + inpos] >>> 4) & 2097151) + ; + out[21 + outpos] = (in[13 + inpos] >>> 25) + | ((in[14 + inpos] & 16383) << (21 - 14)) + ; + out[22 + outpos] = (in[14 + inpos] >>> 14) + | ((in[15 + inpos] & 7) << (21 - 3)) + ; + out[23 + outpos] = ((in[15 + inpos] >>> 3) & 2097151) + ; + out[24 + outpos] = (in[15 + inpos] >>> 24) + | ((in[16 + inpos] & 8191) << (21 - 13)) + ; + out[25 + outpos] = (in[16 + inpos] >>> 13) + | ((in[17 + inpos] & 3) << (21 - 2)) + ; + out[26 + outpos] = ((in[17 + inpos] >>> 2) & 2097151) + ; + out[27 + outpos] = (in[17 + inpos] >>> 23) + | ((in[18 + inpos] & 4095) << (21 - 12)) + ; + out[28 + outpos] = (in[18 + inpos] >>> 12) + | ((in[19 + inpos] & 1) << (21 - 1)) + ; + out[29 + outpos] = ((in[19 + inpos] >>> 1) & 2097151) + ; + out[30 + outpos] = (in[19 + inpos] >>> 22) + | ((in[20 + inpos] & 2047) << (21 - 11)) + ; + out[31 + outpos] = (in[20 + inpos] >>> 11) + ; + } + + + public static void fastunpack22(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 4194303) + ; + out[1 + outpos] = (in[0 + inpos] >>> 22) + | ((in[1 + inpos] & 4095) << (22 - 12)) + ; + out[2 + outpos] = (in[1 + inpos] >>> 12) + | ((in[2 + inpos] & 3) << (22 - 2)) + ; + out[3 + outpos] = ((in[2 + inpos] >>> 2) & 4194303) + ; + out[4 + outpos] = (in[2 + inpos] >>> 24) + | ((in[3 + inpos] & 16383) << (22 - 14)) + ; + out[5 + outpos] = (in[3 + inpos] >>> 14) + | ((in[4 + inpos] & 15) << (22 - 4)) + ; + out[6 + outpos] = ((in[4 + inpos] >>> 4) & 4194303) + ; + out[7 + outpos] = (in[4 + inpos] >>> 26) + | ((in[5 + inpos] & 65535) << (22 - 16)) + ; + out[8 + outpos] = (in[5 + inpos] >>> 16) + | ((in[6 + inpos] & 63) << (22 - 6)) + ; + out[9 + outpos] = ((in[6 + inpos] >>> 6) & 4194303) + ; + out[10 + outpos] = (in[6 + inpos] >>> 28) + | ((in[7 + inpos] & 262143) << (22 - 18)) + ; + out[11 + outpos] = (in[7 + inpos] >>> 18) + | ((in[8 + inpos] & 255) << (22 - 8)) + ; + out[12 + outpos] = ((in[8 + inpos] >>> 8) & 4194303) + ; + out[13 + outpos] = (in[8 + inpos] >>> 30) + | ((in[9 + inpos] & 1048575) << (22 - 20)) + ; + out[14 + outpos] = (in[9 + inpos] >>> 20) + | ((in[10 + inpos] & 1023) << (22 - 10)) + ; + out[15 + outpos] = (in[10 + inpos] >>> 10) + ; + out[16 + outpos] = ((in[11 + inpos] >>> 0) & 4194303) + ; + out[17 + outpos] = (in[11 + inpos] >>> 22) + | ((in[12 + inpos] & 4095) << (22 - 12)) + ; + out[18 + outpos] = (in[12 + inpos] >>> 12) + | ((in[13 + inpos] & 3) << (22 - 2)) + ; + out[19 + outpos] = ((in[13 + inpos] >>> 2) & 4194303) + ; + out[20 + outpos] = (in[13 + inpos] >>> 24) + | ((in[14 + inpos] & 16383) << (22 - 14)) + ; + out[21 + outpos] = (in[14 + inpos] >>> 14) + | ((in[15 + inpos] & 15) << (22 - 4)) + ; + out[22 + outpos] = ((in[15 + inpos] >>> 4) & 4194303) + ; + out[23 + outpos] = (in[15 + inpos] >>> 26) + | ((in[16 + inpos] & 65535) << (22 - 16)) + ; + out[24 + outpos] = (in[16 + inpos] >>> 16) + | ((in[17 + inpos] & 63) << (22 - 6)) + ; + out[25 + outpos] = ((in[17 + inpos] >>> 6) & 4194303) + ; + out[26 + outpos] = (in[17 + inpos] >>> 28) + | ((in[18 + inpos] & 262143) << (22 - 18)) + ; + out[27 + outpos] = (in[18 + inpos] >>> 18) + | ((in[19 + inpos] & 255) << (22 - 8)) + ; + out[28 + outpos] = ((in[19 + inpos] >>> 8) & 4194303) + ; + out[29 + outpos] = (in[19 + inpos] >>> 30) + | ((in[20 + inpos] & 1048575) << (22 - 20)) + ; + out[30 + outpos] = (in[20 + inpos] >>> 20) + | ((in[21 + inpos] & 1023) << (22 - 10)) + ; + out[31 + outpos] = (in[21 + inpos] >>> 10) + ; + } + + + public static void fastunpack23(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 8388607) + ; + out[1 + outpos] = (in[0 + inpos] >>> 23) + | ((in[1 + inpos] & 16383) << (23 - 14)) + ; + out[2 + outpos] = (in[1 + inpos] >>> 14) + | ((in[2 + inpos] & 31) << (23 - 5)) + ; + out[3 + outpos] = ((in[2 + inpos] >>> 5) & 8388607) + ; + out[4 + outpos] = (in[2 + inpos] >>> 28) + | ((in[3 + inpos] & 524287) << (23 - 19)) + ; + out[5 + outpos] = (in[3 + inpos] >>> 19) + | ((in[4 + inpos] & 1023) << (23 - 10)) + ; + out[6 + outpos] = (in[4 + inpos] >>> 10) + | ((in[5 + inpos] & 1) << (23 - 1)) + ; + out[7 + outpos] = ((in[5 + inpos] >>> 1) & 8388607) + ; + out[8 + outpos] = (in[5 + inpos] >>> 24) + | ((in[6 + inpos] & 32767) << (23 - 15)) + ; + out[9 + outpos] = (in[6 + inpos] >>> 15) + | ((in[7 + inpos] & 63) << (23 - 6)) + ; + out[10 + outpos] = ((in[7 + inpos] >>> 6) & 8388607) + ; + out[11 + outpos] = (in[7 + inpos] >>> 29) + | ((in[8 + inpos] & 1048575) << (23 - 20)) + ; + out[12 + outpos] = (in[8 + inpos] >>> 20) + | ((in[9 + inpos] & 2047) << (23 - 11)) + ; + out[13 + outpos] = (in[9 + inpos] >>> 11) + | ((in[10 + inpos] & 3) << (23 - 2)) + ; + out[14 + outpos] = ((in[10 + inpos] >>> 2) & 8388607) + ; + out[15 + outpos] = (in[10 + inpos] >>> 25) + | ((in[11 + inpos] & 65535) << (23 - 16)) + ; + out[16 + outpos] = (in[11 + inpos] >>> 16) + | ((in[12 + inpos] & 127) << (23 - 7)) + ; + out[17 + outpos] = ((in[12 + inpos] >>> 7) & 8388607) + ; + out[18 + outpos] = (in[12 + inpos] >>> 30) + | ((in[13 + inpos] & 2097151) << (23 - 21)) + ; + out[19 + outpos] = (in[13 + inpos] >>> 21) + | ((in[14 + inpos] & 4095) << (23 - 12)) + ; + out[20 + outpos] = (in[14 + inpos] >>> 12) + | ((in[15 + inpos] & 7) << (23 - 3)) + ; + out[21 + outpos] = ((in[15 + inpos] >>> 3) & 8388607) + ; + out[22 + outpos] = (in[15 + inpos] >>> 26) + | ((in[16 + inpos] & 131071) << (23 - 17)) + ; + out[23 + outpos] = (in[16 + inpos] >>> 17) + | ((in[17 + inpos] & 255) << (23 - 8)) + ; + out[24 + outpos] = ((in[17 + inpos] >>> 8) & 8388607) + ; + out[25 + outpos] = (in[17 + inpos] >>> 31) + | ((in[18 + inpos] & 4194303) << (23 - 22)) + ; + out[26 + outpos] = (in[18 + inpos] >>> 22) + | ((in[19 + inpos] & 8191) << (23 - 13)) + ; + out[27 + outpos] = (in[19 + inpos] >>> 13) + | ((in[20 + inpos] & 15) << (23 - 4)) + ; + out[28 + outpos] = ((in[20 + inpos] >>> 4) & 8388607) + ; + out[29 + outpos] = (in[20 + inpos] >>> 27) + | ((in[21 + inpos] & 262143) << (23 - 18)) + ; + out[30 + outpos] = (in[21 + inpos] >>> 18) + | ((in[22 + inpos] & 511) << (23 - 9)) + ; + out[31 + outpos] = (in[22 + inpos] >>> 9) + ; + } + + + public static void fastunpack24(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 16777215) + ; + out[1 + outpos] = (in[0 + inpos] >>> 24) + | ((in[1 + inpos] & 65535) << (24 - 16)) + ; + out[2 + outpos] = (in[1 + inpos] >>> 16) + | ((in[2 + inpos] & 255) << (24 - 8)) + ; + out[3 + outpos] = (in[2 + inpos] >>> 8) + ; + out[4 + outpos] = ((in[3 + inpos] >>> 0) & 16777215) + ; + out[5 + outpos] = (in[3 + inpos] >>> 24) + | ((in[4 + inpos] & 65535) << (24 - 16)) + ; + out[6 + outpos] = (in[4 + inpos] >>> 16) + | ((in[5 + inpos] & 255) << (24 - 8)) + ; + out[7 + outpos] = (in[5 + inpos] >>> 8) + ; + out[8 + outpos] = ((in[6 + inpos] >>> 0) & 16777215) + ; + out[9 + outpos] = (in[6 + inpos] >>> 24) + | ((in[7 + inpos] & 65535) << (24 - 16)) + ; + out[10 + outpos] = (in[7 + inpos] >>> 16) + | ((in[8 + inpos] & 255) << (24 - 8)) + ; + out[11 + outpos] = (in[8 + inpos] >>> 8) + ; + out[12 + outpos] = ((in[9 + inpos] >>> 0) & 16777215) + ; + out[13 + outpos] = (in[9 + inpos] >>> 24) + | ((in[10 + inpos] & 65535) << (24 - 16)) + ; + out[14 + outpos] = (in[10 + inpos] >>> 16) + | ((in[11 + inpos] & 255) << (24 - 8)) + ; + out[15 + outpos] = (in[11 + inpos] >>> 8) + ; + out[16 + outpos] = ((in[12 + inpos] >>> 0) & 16777215) + ; + out[17 + outpos] = (in[12 + inpos] >>> 24) + | ((in[13 + inpos] & 65535) << (24 - 16)) + ; + out[18 + outpos] = (in[13 + inpos] >>> 16) + | ((in[14 + inpos] & 255) << (24 - 8)) + ; + out[19 + outpos] = (in[14 + inpos] >>> 8) + ; + out[20 + outpos] = ((in[15 + inpos] >>> 0) & 16777215) + ; + out[21 + outpos] = (in[15 + inpos] >>> 24) + | ((in[16 + inpos] & 65535) << (24 - 16)) + ; + out[22 + outpos] = (in[16 + inpos] >>> 16) + | ((in[17 + inpos] & 255) << (24 - 8)) + ; + out[23 + outpos] = (in[17 + inpos] >>> 8) + ; + out[24 + outpos] = ((in[18 + inpos] >>> 0) & 16777215) + ; + out[25 + outpos] = (in[18 + inpos] >>> 24) + | ((in[19 + inpos] & 65535) << (24 - 16)) + ; + out[26 + outpos] = (in[19 + inpos] >>> 16) + | ((in[20 + inpos] & 255) << (24 - 8)) + ; + out[27 + outpos] = (in[20 + inpos] >>> 8) + ; + out[28 + outpos] = ((in[21 + inpos] >>> 0) & 16777215) + ; + out[29 + outpos] = (in[21 + inpos] >>> 24) + | ((in[22 + inpos] & 65535) << (24 - 16)) + ; + out[30 + outpos] = (in[22 + inpos] >>> 16) + | ((in[23 + inpos] & 255) << (24 - 8)) + ; + out[31 + outpos] = (in[23 + inpos] >>> 8) + ; + } + + + public static void fastunpack25(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 33554431) + ; + out[1 + outpos] = (in[0 + inpos] >>> 25) + | ((in[1 + inpos] & 262143) << (25 - 18)) + ; + out[2 + outpos] = (in[1 + inpos] >>> 18) + | ((in[2 + inpos] & 2047) << (25 - 11)) + ; + out[3 + outpos] = (in[2 + inpos] >>> 11) + | ((in[3 + inpos] & 15) << (25 - 4)) + ; + out[4 + outpos] = ((in[3 + inpos] >>> 4) & 33554431) + ; + out[5 + outpos] = (in[3 + inpos] >>> 29) + | ((in[4 + inpos] & 4194303) << (25 - 22)) + ; + out[6 + outpos] = (in[4 + inpos] >>> 22) + | ((in[5 + inpos] & 32767) << (25 - 15)) + ; + out[7 + outpos] = (in[5 + inpos] >>> 15) + | ((in[6 + inpos] & 255) << (25 - 8)) + ; + out[8 + outpos] = (in[6 + inpos] >>> 8) + | ((in[7 + inpos] & 1) << (25 - 1)) + ; + out[9 + outpos] = ((in[7 + inpos] >>> 1) & 33554431) + ; + out[10 + outpos] = (in[7 + inpos] >>> 26) + | ((in[8 + inpos] & 524287) << (25 - 19)) + ; + out[11 + outpos] = (in[8 + inpos] >>> 19) + | ((in[9 + inpos] & 4095) << (25 - 12)) + ; + out[12 + outpos] = (in[9 + inpos] >>> 12) + | ((in[10 + inpos] & 31) << (25 - 5)) + ; + out[13 + outpos] = ((in[10 + inpos] >>> 5) & 33554431) + ; + out[14 + outpos] = (in[10 + inpos] >>> 30) + | ((in[11 + inpos] & 8388607) << (25 - 23)) + ; + out[15 + outpos] = (in[11 + inpos] >>> 23) + | ((in[12 + inpos] & 65535) << (25 - 16)) + ; + out[16 + outpos] = (in[12 + inpos] >>> 16) + | ((in[13 + inpos] & 511) << (25 - 9)) + ; + out[17 + outpos] = (in[13 + inpos] >>> 9) + | ((in[14 + inpos] & 3) << (25 - 2)) + ; + out[18 + outpos] = ((in[14 + inpos] >>> 2) & 33554431) + ; + out[19 + outpos] = (in[14 + inpos] >>> 27) + | ((in[15 + inpos] & 1048575) << (25 - 20)) + ; + out[20 + outpos] = (in[15 + inpos] >>> 20) + | ((in[16 + inpos] & 8191) << (25 - 13)) + ; + out[21 + outpos] = (in[16 + inpos] >>> 13) + | ((in[17 + inpos] & 63) << (25 - 6)) + ; + out[22 + outpos] = ((in[17 + inpos] >>> 6) & 33554431) + ; + out[23 + outpos] = (in[17 + inpos] >>> 31) + | ((in[18 + inpos] & 16777215) << (25 - 24)) + ; + out[24 + outpos] = (in[18 + inpos] >>> 24) + | ((in[19 + inpos] & 131071) << (25 - 17)) + ; + out[25 + outpos] = (in[19 + inpos] >>> 17) + | ((in[20 + inpos] & 1023) << (25 - 10)) + ; + out[26 + outpos] = (in[20 + inpos] >>> 10) + | ((in[21 + inpos] & 7) << (25 - 3)) + ; + out[27 + outpos] = ((in[21 + inpos] >>> 3) & 33554431) + ; + out[28 + outpos] = (in[21 + inpos] >>> 28) + | ((in[22 + inpos] & 2097151) << (25 - 21)) + ; + out[29 + outpos] = (in[22 + inpos] >>> 21) + | ((in[23 + inpos] & 16383) << (25 - 14)) + ; + out[30 + outpos] = (in[23 + inpos] >>> 14) + | ((in[24 + inpos] & 127) << (25 - 7)) + ; + out[31 + outpos] = (in[24 + inpos] >>> 7) + ; + } + + + public static void fastunpack26(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 67108863) + ; + out[1 + outpos] = (in[0 + inpos] >>> 26) + | ((in[1 + inpos] & 1048575) << (26 - 20)) + ; + out[2 + outpos] = (in[1 + inpos] >>> 20) + | ((in[2 + inpos] & 16383) << (26 - 14)) + ; + out[3 + outpos] = (in[2 + inpos] >>> 14) + | ((in[3 + inpos] & 255) << (26 - 8)) + ; + out[4 + outpos] = (in[3 + inpos] >>> 8) + | ((in[4 + inpos] & 3) << (26 - 2)) + ; + out[5 + outpos] = ((in[4 + inpos] >>> 2) & 67108863) + ; + out[6 + outpos] = (in[4 + inpos] >>> 28) + | ((in[5 + inpos] & 4194303) << (26 - 22)) + ; + out[7 + outpos] = (in[5 + inpos] >>> 22) + | ((in[6 + inpos] & 65535) << (26 - 16)) + ; + out[8 + outpos] = (in[6 + inpos] >>> 16) + | ((in[7 + inpos] & 1023) << (26 - 10)) + ; + out[9 + outpos] = (in[7 + inpos] >>> 10) + | ((in[8 + inpos] & 15) << (26 - 4)) + ; + out[10 + outpos] = ((in[8 + inpos] >>> 4) & 67108863) + ; + out[11 + outpos] = (in[8 + inpos] >>> 30) + | ((in[9 + inpos] & 16777215) << (26 - 24)) + ; + out[12 + outpos] = (in[9 + inpos] >>> 24) + | ((in[10 + inpos] & 262143) << (26 - 18)) + ; + out[13 + outpos] = (in[10 + inpos] >>> 18) + | ((in[11 + inpos] & 4095) << (26 - 12)) + ; + out[14 + outpos] = (in[11 + inpos] >>> 12) + | ((in[12 + inpos] & 63) << (26 - 6)) + ; + out[15 + outpos] = (in[12 + inpos] >>> 6) + ; + out[16 + outpos] = ((in[13 + inpos] >>> 0) & 67108863) + ; + out[17 + outpos] = (in[13 + inpos] >>> 26) + | ((in[14 + inpos] & 1048575) << (26 - 20)) + ; + out[18 + outpos] = (in[14 + inpos] >>> 20) + | ((in[15 + inpos] & 16383) << (26 - 14)) + ; + out[19 + outpos] = (in[15 + inpos] >>> 14) + | ((in[16 + inpos] & 255) << (26 - 8)) + ; + out[20 + outpos] = (in[16 + inpos] >>> 8) + | ((in[17 + inpos] & 3) << (26 - 2)) + ; + out[21 + outpos] = ((in[17 + inpos] >>> 2) & 67108863) + ; + out[22 + outpos] = (in[17 + inpos] >>> 28) + | ((in[18 + inpos] & 4194303) << (26 - 22)) + ; + out[23 + outpos] = (in[18 + inpos] >>> 22) + | ((in[19 + inpos] & 65535) << (26 - 16)) + ; + out[24 + outpos] = (in[19 + inpos] >>> 16) + | ((in[20 + inpos] & 1023) << (26 - 10)) + ; + out[25 + outpos] = (in[20 + inpos] >>> 10) + | ((in[21 + inpos] & 15) << (26 - 4)) + ; + out[26 + outpos] = ((in[21 + inpos] >>> 4) & 67108863) + ; + out[27 + outpos] = (in[21 + inpos] >>> 30) + | ((in[22 + inpos] & 16777215) << (26 - 24)) + ; + out[28 + outpos] = (in[22 + inpos] >>> 24) + | ((in[23 + inpos] & 262143) << (26 - 18)) + ; + out[29 + outpos] = (in[23 + inpos] >>> 18) + | ((in[24 + inpos] & 4095) << (26 - 12)) + ; + out[30 + outpos] = (in[24 + inpos] >>> 12) + | ((in[25 + inpos] & 63) << (26 - 6)) + ; + out[31 + outpos] = (in[25 + inpos] >>> 6) + ; + } + + + public static void fastunpack27(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 134217727) + ; + out[1 + outpos] = (in[0 + inpos] >>> 27) + | ((in[1 + inpos] & 4194303) << (27 - 22)) + ; + out[2 + outpos] = (in[1 + inpos] >>> 22) + | ((in[2 + inpos] & 131071) << (27 - 17)) + ; + out[3 + outpos] = (in[2 + inpos] >>> 17) + | ((in[3 + inpos] & 4095) << (27 - 12)) + ; + out[4 + outpos] = (in[3 + inpos] >>> 12) + | ((in[4 + inpos] & 127) << (27 - 7)) + ; + out[5 + outpos] = (in[4 + inpos] >>> 7) + | ((in[5 + inpos] & 3) << (27 - 2)) + ; + out[6 + outpos] = ((in[5 + inpos] >>> 2) & 134217727) + ; + out[7 + outpos] = (in[5 + inpos] >>> 29) + | ((in[6 + inpos] & 16777215) << (27 - 24)) + ; + out[8 + outpos] = (in[6 + inpos] >>> 24) + | ((in[7 + inpos] & 524287) << (27 - 19)) + ; + out[9 + outpos] = (in[7 + inpos] >>> 19) + | ((in[8 + inpos] & 16383) << (27 - 14)) + ; + out[10 + outpos] = (in[8 + inpos] >>> 14) + | ((in[9 + inpos] & 511) << (27 - 9)) + ; + out[11 + outpos] = (in[9 + inpos] >>> 9) + | ((in[10 + inpos] & 15) << (27 - 4)) + ; + out[12 + outpos] = ((in[10 + inpos] >>> 4) & 134217727) + ; + out[13 + outpos] = (in[10 + inpos] >>> 31) + | ((in[11 + inpos] & 67108863) << (27 - 26)) + ; + out[14 + outpos] = (in[11 + inpos] >>> 26) + | ((in[12 + inpos] & 2097151) << (27 - 21)) + ; + out[15 + outpos] = (in[12 + inpos] >>> 21) + | ((in[13 + inpos] & 65535) << (27 - 16)) + ; + out[16 + outpos] = (in[13 + inpos] >>> 16) + | ((in[14 + inpos] & 2047) << (27 - 11)) + ; + out[17 + outpos] = (in[14 + inpos] >>> 11) + | ((in[15 + inpos] & 63) << (27 - 6)) + ; + out[18 + outpos] = (in[15 + inpos] >>> 6) + | ((in[16 + inpos] & 1) << (27 - 1)) + ; + out[19 + outpos] = ((in[16 + inpos] >>> 1) & 134217727) + ; + out[20 + outpos] = (in[16 + inpos] >>> 28) + | ((in[17 + inpos] & 8388607) << (27 - 23)) + ; + out[21 + outpos] = (in[17 + inpos] >>> 23) + | ((in[18 + inpos] & 262143) << (27 - 18)) + ; + out[22 + outpos] = (in[18 + inpos] >>> 18) + | ((in[19 + inpos] & 8191) << (27 - 13)) + ; + out[23 + outpos] = (in[19 + inpos] >>> 13) + | ((in[20 + inpos] & 255) << (27 - 8)) + ; + out[24 + outpos] = (in[20 + inpos] >>> 8) + | ((in[21 + inpos] & 7) << (27 - 3)) + ; + out[25 + outpos] = ((in[21 + inpos] >>> 3) & 134217727) + ; + out[26 + outpos] = (in[21 + inpos] >>> 30) + | ((in[22 + inpos] & 33554431) << (27 - 25)) + ; + out[27 + outpos] = (in[22 + inpos] >>> 25) + | ((in[23 + inpos] & 1048575) << (27 - 20)) + ; + out[28 + outpos] = (in[23 + inpos] >>> 20) + | ((in[24 + inpos] & 32767) << (27 - 15)) + ; + out[29 + outpos] = (in[24 + inpos] >>> 15) + | ((in[25 + inpos] & 1023) << (27 - 10)) + ; + out[30 + outpos] = (in[25 + inpos] >>> 10) + | ((in[26 + inpos] & 31) << (27 - 5)) + ; + out[31 + outpos] = (in[26 + inpos] >>> 5) + ; + } + + + public static void fastunpack28(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 268435455) + ; + out[1 + outpos] = (in[0 + inpos] >>> 28) + | ((in[1 + inpos] & 16777215) << (28 - 24)) + ; + out[2 + outpos] = (in[1 + inpos] >>> 24) + | ((in[2 + inpos] & 1048575) << (28 - 20)) + ; + out[3 + outpos] = (in[2 + inpos] >>> 20) + | ((in[3 + inpos] & 65535) << (28 - 16)) + ; + out[4 + outpos] = (in[3 + inpos] >>> 16) + | ((in[4 + inpos] & 4095) << (28 - 12)) + ; + out[5 + outpos] = (in[4 + inpos] >>> 12) + | ((in[5 + inpos] & 255) << (28 - 8)) + ; + out[6 + outpos] = (in[5 + inpos] >>> 8) + | ((in[6 + inpos] & 15) << (28 - 4)) + ; + out[7 + outpos] = (in[6 + inpos] >>> 4) + ; + out[8 + outpos] = ((in[7 + inpos] >>> 0) & 268435455) + ; + out[9 + outpos] = (in[7 + inpos] >>> 28) + | ((in[8 + inpos] & 16777215) << (28 - 24)) + ; + out[10 + outpos] = (in[8 + inpos] >>> 24) + | ((in[9 + inpos] & 1048575) << (28 - 20)) + ; + out[11 + outpos] = (in[9 + inpos] >>> 20) + | ((in[10 + inpos] & 65535) << (28 - 16)) + ; + out[12 + outpos] = (in[10 + inpos] >>> 16) + | ((in[11 + inpos] & 4095) << (28 - 12)) + ; + out[13 + outpos] = (in[11 + inpos] >>> 12) + | ((in[12 + inpos] & 255) << (28 - 8)) + ; + out[14 + outpos] = (in[12 + inpos] >>> 8) + | ((in[13 + inpos] & 15) << (28 - 4)) + ; + out[15 + outpos] = (in[13 + inpos] >>> 4) + ; + out[16 + outpos] = ((in[14 + inpos] >>> 0) & 268435455) + ; + out[17 + outpos] = (in[14 + inpos] >>> 28) + | ((in[15 + inpos] & 16777215) << (28 - 24)) + ; + out[18 + outpos] = (in[15 + inpos] >>> 24) + | ((in[16 + inpos] & 1048575) << (28 - 20)) + ; + out[19 + outpos] = (in[16 + inpos] >>> 20) + | ((in[17 + inpos] & 65535) << (28 - 16)) + ; + out[20 + outpos] = (in[17 + inpos] >>> 16) + | ((in[18 + inpos] & 4095) << (28 - 12)) + ; + out[21 + outpos] = (in[18 + inpos] >>> 12) + | ((in[19 + inpos] & 255) << (28 - 8)) + ; + out[22 + outpos] = (in[19 + inpos] >>> 8) + | ((in[20 + inpos] & 15) << (28 - 4)) + ; + out[23 + outpos] = (in[20 + inpos] >>> 4) + ; + out[24 + outpos] = ((in[21 + inpos] >>> 0) & 268435455) + ; + out[25 + outpos] = (in[21 + inpos] >>> 28) + | ((in[22 + inpos] & 16777215) << (28 - 24)) + ; + out[26 + outpos] = (in[22 + inpos] >>> 24) + | ((in[23 + inpos] & 1048575) << (28 - 20)) + ; + out[27 + outpos] = (in[23 + inpos] >>> 20) + | ((in[24 + inpos] & 65535) << (28 - 16)) + ; + out[28 + outpos] = (in[24 + inpos] >>> 16) + | ((in[25 + inpos] & 4095) << (28 - 12)) + ; + out[29 + outpos] = (in[25 + inpos] >>> 12) + | ((in[26 + inpos] & 255) << (28 - 8)) + ; + out[30 + outpos] = (in[26 + inpos] >>> 8) + | ((in[27 + inpos] & 15) << (28 - 4)) + ; + out[31 + outpos] = (in[27 + inpos] >>> 4) + ; + } + + + public static void fastunpack29(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 536870911) + ; + out[1 + outpos] = (in[0 + inpos] >>> 29) + | ((in[1 + inpos] & 67108863) << (29 - 26)) + ; + out[2 + outpos] = (in[1 + inpos] >>> 26) + | ((in[2 + inpos] & 8388607) << (29 - 23)) + ; + out[3 + outpos] = (in[2 + inpos] >>> 23) + | ((in[3 + inpos] & 1048575) << (29 - 20)) + ; + out[4 + outpos] = (in[3 + inpos] >>> 20) + | ((in[4 + inpos] & 131071) << (29 - 17)) + ; + out[5 + outpos] = (in[4 + inpos] >>> 17) + | ((in[5 + inpos] & 16383) << (29 - 14)) + ; + out[6 + outpos] = (in[5 + inpos] >>> 14) + | ((in[6 + inpos] & 2047) << (29 - 11)) + ; + out[7 + outpos] = (in[6 + inpos] >>> 11) + | ((in[7 + inpos] & 255) << (29 - 8)) + ; + out[8 + outpos] = (in[7 + inpos] >>> 8) + | ((in[8 + inpos] & 31) << (29 - 5)) + ; + out[9 + outpos] = (in[8 + inpos] >>> 5) + | ((in[9 + inpos] & 3) << (29 - 2)) + ; + out[10 + outpos] = ((in[9 + inpos] >>> 2) & 536870911) + ; + out[11 + outpos] = (in[9 + inpos] >>> 31) + | ((in[10 + inpos] & 268435455) << (29 - 28)) + ; + out[12 + outpos] = (in[10 + inpos] >>> 28) + | ((in[11 + inpos] & 33554431) << (29 - 25)) + ; + out[13 + outpos] = (in[11 + inpos] >>> 25) + | ((in[12 + inpos] & 4194303) << (29 - 22)) + ; + out[14 + outpos] = (in[12 + inpos] >>> 22) + | ((in[13 + inpos] & 524287) << (29 - 19)) + ; + out[15 + outpos] = (in[13 + inpos] >>> 19) + | ((in[14 + inpos] & 65535) << (29 - 16)) + ; + out[16 + outpos] = (in[14 + inpos] >>> 16) + | ((in[15 + inpos] & 8191) << (29 - 13)) + ; + out[17 + outpos] = (in[15 + inpos] >>> 13) + | ((in[16 + inpos] & 1023) << (29 - 10)) + ; + out[18 + outpos] = (in[16 + inpos] >>> 10) + | ((in[17 + inpos] & 127) << (29 - 7)) + ; + out[19 + outpos] = (in[17 + inpos] >>> 7) + | ((in[18 + inpos] & 15) << (29 - 4)) + ; + out[20 + outpos] = (in[18 + inpos] >>> 4) + | ((in[19 + inpos] & 1) << (29 - 1)) + ; + out[21 + outpos] = ((in[19 + inpos] >>> 1) & 536870911) + ; + out[22 + outpos] = (in[19 + inpos] >>> 30) + | ((in[20 + inpos] & 134217727) << (29 - 27)) + ; + out[23 + outpos] = (in[20 + inpos] >>> 27) + | ((in[21 + inpos] & 16777215) << (29 - 24)) + ; + out[24 + outpos] = (in[21 + inpos] >>> 24) + | ((in[22 + inpos] & 2097151) << (29 - 21)) + ; + out[25 + outpos] = (in[22 + inpos] >>> 21) + | ((in[23 + inpos] & 262143) << (29 - 18)) + ; + out[26 + outpos] = (in[23 + inpos] >>> 18) + | ((in[24 + inpos] & 32767) << (29 - 15)) + ; + out[27 + outpos] = (in[24 + inpos] >>> 15) + | ((in[25 + inpos] & 4095) << (29 - 12)) + ; + out[28 + outpos] = (in[25 + inpos] >>> 12) + | ((in[26 + inpos] & 511) << (29 - 9)) + ; + out[29 + outpos] = (in[26 + inpos] >>> 9) + | ((in[27 + inpos] & 63) << (29 - 6)) + ; + out[30 + outpos] = (in[27 + inpos] >>> 6) + | ((in[28 + inpos] & 7) << (29 - 3)) + ; + out[31 + outpos] = (in[28 + inpos] >>> 3) + ; + } + + + public static void fastunpack30(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 1073741823) + ; + out[1 + outpos] = (in[0 + inpos] >>> 30) + | ((in[1 + inpos] & 268435455) << (30 - 28)) + ; + out[2 + outpos] = (in[1 + inpos] >>> 28) + | ((in[2 + inpos] & 67108863) << (30 - 26)) + ; + out[3 + outpos] = (in[2 + inpos] >>> 26) + | ((in[3 + inpos] & 16777215) << (30 - 24)) + ; + out[4 + outpos] = (in[3 + inpos] >>> 24) + | ((in[4 + inpos] & 4194303) << (30 - 22)) + ; + out[5 + outpos] = (in[4 + inpos] >>> 22) + | ((in[5 + inpos] & 1048575) << (30 - 20)) + ; + out[6 + outpos] = (in[5 + inpos] >>> 20) + | ((in[6 + inpos] & 262143) << (30 - 18)) + ; + out[7 + outpos] = (in[6 + inpos] >>> 18) + | ((in[7 + inpos] & 65535) << (30 - 16)) + ; + out[8 + outpos] = (in[7 + inpos] >>> 16) + | ((in[8 + inpos] & 16383) << (30 - 14)) + ; + out[9 + outpos] = (in[8 + inpos] >>> 14) + | ((in[9 + inpos] & 4095) << (30 - 12)) + ; + out[10 + outpos] = (in[9 + inpos] >>> 12) + | ((in[10 + inpos] & 1023) << (30 - 10)) + ; + out[11 + outpos] = (in[10 + inpos] >>> 10) + | ((in[11 + inpos] & 255) << (30 - 8)) + ; + out[12 + outpos] = (in[11 + inpos] >>> 8) + | ((in[12 + inpos] & 63) << (30 - 6)) + ; + out[13 + outpos] = (in[12 + inpos] >>> 6) + | ((in[13 + inpos] & 15) << (30 - 4)) + ; + out[14 + outpos] = (in[13 + inpos] >>> 4) + | ((in[14 + inpos] & 3) << (30 - 2)) + ; + out[15 + outpos] = (in[14 + inpos] >>> 2) + ; + out[16 + outpos] = ((in[15 + inpos] >>> 0) & 1073741823) + ; + out[17 + outpos] = (in[15 + inpos] >>> 30) + | ((in[16 + inpos] & 268435455) << (30 - 28)) + ; + out[18 + outpos] = (in[16 + inpos] >>> 28) + | ((in[17 + inpos] & 67108863) << (30 - 26)) + ; + out[19 + outpos] = (in[17 + inpos] >>> 26) + | ((in[18 + inpos] & 16777215) << (30 - 24)) + ; + out[20 + outpos] = (in[18 + inpos] >>> 24) + | ((in[19 + inpos] & 4194303) << (30 - 22)) + ; + out[21 + outpos] = (in[19 + inpos] >>> 22) + | ((in[20 + inpos] & 1048575) << (30 - 20)) + ; + out[22 + outpos] = (in[20 + inpos] >>> 20) + | ((in[21 + inpos] & 262143) << (30 - 18)) + ; + out[23 + outpos] = (in[21 + inpos] >>> 18) + | ((in[22 + inpos] & 65535) << (30 - 16)) + ; + out[24 + outpos] = (in[22 + inpos] >>> 16) + | ((in[23 + inpos] & 16383) << (30 - 14)) + ; + out[25 + outpos] = (in[23 + inpos] >>> 14) + | ((in[24 + inpos] & 4095) << (30 - 12)) + ; + out[26 + outpos] = (in[24 + inpos] >>> 12) + | ((in[25 + inpos] & 1023) << (30 - 10)) + ; + out[27 + outpos] = (in[25 + inpos] >>> 10) + | ((in[26 + inpos] & 255) << (30 - 8)) + ; + out[28 + outpos] = (in[26 + inpos] >>> 8) + | ((in[27 + inpos] & 63) << (30 - 6)) + ; + out[29 + outpos] = (in[27 + inpos] >>> 6) + | ((in[28 + inpos] & 15) << (30 - 4)) + ; + out[30 + outpos] = (in[28 + inpos] >>> 4) + | ((in[29 + inpos] & 3) << (30 - 2)) + ; + out[31 + outpos] = (in[29 + inpos] >>> 2) + ; + } + + + public static void fastunpack31(final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 2147483647) + ; + out[1 + outpos] = (in[0 + inpos] >>> 31) + | ((in[1 + inpos] & 1073741823) << (31 - 30)) + ; + out[2 + outpos] = (in[1 + inpos] >>> 30) + | ((in[2 + inpos] & 536870911) << (31 - 29)) + ; + out[3 + outpos] = (in[2 + inpos] >>> 29) + | ((in[3 + inpos] & 268435455) << (31 - 28)) + ; + out[4 + outpos] = (in[3 + inpos] >>> 28) + | ((in[4 + inpos] & 134217727) << (31 - 27)) + ; + out[5 + outpos] = (in[4 + inpos] >>> 27) + | ((in[5 + inpos] & 67108863) << (31 - 26)) + ; + out[6 + outpos] = (in[5 + inpos] >>> 26) + | ((in[6 + inpos] & 33554431) << (31 - 25)) + ; + out[7 + outpos] = (in[6 + inpos] >>> 25) + | ((in[7 + inpos] & 16777215) << (31 - 24)) + ; + out[8 + outpos] = (in[7 + inpos] >>> 24) + | ((in[8 + inpos] & 8388607) << (31 - 23)) + ; + out[9 + outpos] = (in[8 + inpos] >>> 23) + | ((in[9 + inpos] & 4194303) << (31 - 22)) + ; + out[10 + outpos] = (in[9 + inpos] >>> 22) + | ((in[10 + inpos] & 2097151) << (31 - 21)) + ; + out[11 + outpos] = (in[10 + inpos] >>> 21) + | ((in[11 + inpos] & 1048575) << (31 - 20)) + ; + out[12 + outpos] = (in[11 + inpos] >>> 20) + | ((in[12 + inpos] & 524287) << (31 - 19)) + ; + out[13 + outpos] = (in[12 + inpos] >>> 19) + | ((in[13 + inpos] & 262143) << (31 - 18)) + ; + out[14 + outpos] = (in[13 + inpos] >>> 18) + | ((in[14 + inpos] & 131071) << (31 - 17)) + ; + out[15 + outpos] = (in[14 + inpos] >>> 17) + | ((in[15 + inpos] & 65535) << (31 - 16)) + ; + out[16 + outpos] = (in[15 + inpos] >>> 16) + | ((in[16 + inpos] & 32767) << (31 - 15)) + ; + out[17 + outpos] = (in[16 + inpos] >>> 15) + | ((in[17 + inpos] & 16383) << (31 - 14)) + ; + out[18 + outpos] = (in[17 + inpos] >>> 14) + | ((in[18 + inpos] & 8191) << (31 - 13)) + ; + out[19 + outpos] = (in[18 + inpos] >>> 13) + | ((in[19 + inpos] & 4095) << (31 - 12)) + ; + out[20 + outpos] = (in[19 + inpos] >>> 12) + | ((in[20 + inpos] & 2047) << (31 - 11)) + ; + out[21 + outpos] = (in[20 + inpos] >>> 11) + | ((in[21 + inpos] & 1023) << (31 - 10)) + ; + out[22 + outpos] = (in[21 + inpos] >>> 10) + | ((in[22 + inpos] & 511) << (31 - 9)) + ; + out[23 + outpos] = (in[22 + inpos] >>> 9) + | ((in[23 + inpos] & 255) << (31 - 8)) + ; + out[24 + outpos] = (in[23 + inpos] >>> 8) + | ((in[24 + inpos] & 127) << (31 - 7)) + ; + out[25 + outpos] = (in[24 + inpos] >>> 7) + | ((in[25 + inpos] & 63) << (31 - 6)) + ; + out[26 + outpos] = (in[25 + inpos] >>> 6) + | ((in[26 + inpos] & 31) << (31 - 5)) + ; + out[27 + outpos] = (in[26 + inpos] >>> 5) + | ((in[27 + inpos] & 15) << (31 - 4)) + ; + out[28 + outpos] = (in[27 + inpos] >>> 4) + | ((in[28 + inpos] & 7) << (31 - 3)) + ; + out[29 + outpos] = (in[28 + inpos] >>> 3) + | ((in[29 + inpos] & 3) << (31 - 2)) + ; + out[30 + outpos] = (in[29 + inpos] >>> 2) + | ((in[30 + inpos] & 1) << (31 - 1)) + ; + out[31 + outpos] = (in[30 + inpos] >>> 1) + ; + } + + + public static void fastunpack32(final int[] in, int inpos, final int[] out, int outpos) { + System.arraycopy(in, inpos, out, outpos, 32); + } + + + public static void fastpack32(final int[] in, int inpos, final int[] out, int outpos) { + System.arraycopy(in, inpos, out, outpos, 32); + } + + + public static void fastpackwithoutmask32(final int[] in, int inpos, final int[] out, int outpos) { + System.arraycopy(in, inpos, out, outpos, 32); + } + + + public static void fastunpack0(final int[] in, int inpos, final int[] out, int outpos) { + Arrays.fill(out, outpos, outpos + 32, 0); + } + + + public static void fastpack0(final int[] in, int inpos, final int[] out, int outpos) { + // nothing + } + + + public static void fastpackwithoutmask0(final int[] in, int inpos, final int[] out, int outpos) { + // nothing + } + + + public static void fastunpack(final int[] in, int inpos, final int[] out, int outpos, final int bit) { + switch (bit) { + case 0: + fastunpack0(in, inpos, out, outpos); + break; + case 1: + fastunpack1(in, inpos, out, outpos); + break; + case 2: + fastunpack2(in, inpos, out, outpos); + break; + case 3: + fastunpack3(in, inpos, out, outpos); + break; + case 4: + fastunpack4(in, inpos, out, outpos); + break; + case 5: + fastunpack5(in, inpos, out, outpos); + break; + case 6: + fastunpack6(in, inpos, out, outpos); + break; + case 7: + fastunpack7(in, inpos, out, outpos); + break; + case 8: + fastunpack8(in, inpos, out, outpos); + break; + case 9: + fastunpack9(in, inpos, out, outpos); + break; + case 10: + fastunpack10(in, inpos, out, outpos); + break; + case 11: + fastunpack11(in, inpos, out, outpos); + break; + case 12: + fastunpack12(in, inpos, out, outpos); + break; + case 13: + fastunpack13(in, inpos, out, outpos); + break; + case 14: + fastunpack14(in, inpos, out, outpos); + break; + case 15: + fastunpack15(in, inpos, out, outpos); + break; + case 16: + fastunpack16(in, inpos, out, outpos); + break; + case 17: + fastunpack17(in, inpos, out, outpos); + break; + case 18: + fastunpack18(in, inpos, out, outpos); + break; + case 19: + fastunpack19(in, inpos, out, outpos); + break; + case 20: + fastunpack20(in, inpos, out, outpos); + break; + case 21: + fastunpack21(in, inpos, out, outpos); + break; + case 22: + fastunpack22(in, inpos, out, outpos); + break; + case 23: + fastunpack23(in, inpos, out, outpos); + break; + case 24: + fastunpack24(in, inpos, out, outpos); + break; + case 25: + fastunpack25(in, inpos, out, outpos); + break; + case 26: + fastunpack26(in, inpos, out, outpos); + break; + case 27: + fastunpack27(in, inpos, out, outpos); + break; + case 28: + fastunpack28(in, inpos, out, outpos); + break; + case 29: + fastunpack29(in, inpos, out, outpos); + break; + case 30: + fastunpack30(in, inpos, out, outpos); + break; + case 31: + fastunpack31(in, inpos, out, outpos); + break; + case 32: + fastunpack32(in, inpos, out, outpos); + break; + default: + throw new IllegalArgumentException("Unsupported bit width."); + } + } + + + public static void fastpack(final int[] in, int inpos, final int[] out, int outpos, final int bit) { + switch (bit) { + case 0: + fastpack0(in, inpos, out, outpos); + break; + case 1: + fastpack1(in, inpos, out, outpos); + break; + case 2: + fastpack2(in, inpos, out, outpos); + break; + case 3: + fastpack3(in, inpos, out, outpos); + break; + case 4: + fastpack4(in, inpos, out, outpos); + break; + case 5: + fastpack5(in, inpos, out, outpos); + break; + case 6: + fastpack6(in, inpos, out, outpos); + break; + case 7: + fastpack7(in, inpos, out, outpos); + break; + case 8: + fastpack8(in, inpos, out, outpos); + break; + case 9: + fastpack9(in, inpos, out, outpos); + break; + case 10: + fastpack10(in, inpos, out, outpos); + break; + case 11: + fastpack11(in, inpos, out, outpos); + break; + case 12: + fastpack12(in, inpos, out, outpos); + break; + case 13: + fastpack13(in, inpos, out, outpos); + break; + case 14: + fastpack14(in, inpos, out, outpos); + break; + case 15: + fastpack15(in, inpos, out, outpos); + break; + case 16: + fastpack16(in, inpos, out, outpos); + break; + case 17: + fastpack17(in, inpos, out, outpos); + break; + case 18: + fastpack18(in, inpos, out, outpos); + break; + case 19: + fastpack19(in, inpos, out, outpos); + break; + case 20: + fastpack20(in, inpos, out, outpos); + break; + case 21: + fastpack21(in, inpos, out, outpos); + break; + case 22: + fastpack22(in, inpos, out, outpos); + break; + case 23: + fastpack23(in, inpos, out, outpos); + break; + case 24: + fastpack24(in, inpos, out, outpos); + break; + case 25: + fastpack25(in, inpos, out, outpos); + break; + case 26: + fastpack26(in, inpos, out, outpos); + break; + case 27: + fastpack27(in, inpos, out, outpos); + break; + case 28: + fastpack28(in, inpos, out, outpos); + break; + case 29: + fastpack29(in, inpos, out, outpos); + break; + case 30: + fastpack30(in, inpos, out, outpos); + break; + case 31: + fastpack31(in, inpos, out, outpos); + break; + case 32: + fastpack32(in, inpos, out, outpos); + break; + default: + throw new IllegalArgumentException("Unsupported bit width."); + } + } + + + public static void fastpackwithoutmask(final int[] in, int inpos, final int[] out, int outpos, final int bit) { + switch (bit) { + case 0: + fastpackwithoutmask0(in, inpos, out, outpos); + break; + case 1: + fastpackwithoutmask1(in, inpos, out, outpos); + break; + case 2: + fastpackwithoutmask2(in, inpos, out, outpos); + break; + case 3: + fastpackwithoutmask3(in, inpos, out, outpos); + break; + case 4: + fastpackwithoutmask4(in, inpos, out, outpos); + break; + case 5: + fastpackwithoutmask5(in, inpos, out, outpos); + break; + case 6: + fastpackwithoutmask6(in, inpos, out, outpos); + break; + case 7: + fastpackwithoutmask7(in, inpos, out, outpos); + break; + case 8: + fastpackwithoutmask8(in, inpos, out, outpos); + break; + case 9: + fastpackwithoutmask9(in, inpos, out, outpos); + break; + case 10: + fastpackwithoutmask10(in, inpos, out, outpos); + break; + case 11: + fastpackwithoutmask11(in, inpos, out, outpos); + break; + case 12: + fastpackwithoutmask12(in, inpos, out, outpos); + break; + case 13: + fastpackwithoutmask13(in, inpos, out, outpos); + break; + case 14: + fastpackwithoutmask14(in, inpos, out, outpos); + break; + case 15: + fastpackwithoutmask15(in, inpos, out, outpos); + break; + case 16: + fastpackwithoutmask16(in, inpos, out, outpos); + break; + case 17: + fastpackwithoutmask17(in, inpos, out, outpos); + break; + case 18: + fastpackwithoutmask18(in, inpos, out, outpos); + break; + case 19: + fastpackwithoutmask19(in, inpos, out, outpos); + break; + case 20: + fastpackwithoutmask20(in, inpos, out, outpos); + break; + case 21: + fastpackwithoutmask21(in, inpos, out, outpos); + break; + case 22: + fastpackwithoutmask22(in, inpos, out, outpos); + break; + case 23: + fastpackwithoutmask23(in, inpos, out, outpos); + break; + case 24: + fastpackwithoutmask24(in, inpos, out, outpos); + break; + case 25: + fastpackwithoutmask25(in, inpos, out, outpos); + break; + case 26: + fastpackwithoutmask26(in, inpos, out, outpos); + break; + case 27: + fastpackwithoutmask27(in, inpos, out, outpos); + break; + case 28: + fastpackwithoutmask28(in, inpos, out, outpos); + break; + case 29: + fastpackwithoutmask29(in, inpos, out, outpos); + break; + case 30: + fastpackwithoutmask30(in, inpos, out, outpos); + break; + case 31: + fastpackwithoutmask31(in, inpos, out, outpos); + break; + case 32: + fastpackwithoutmask32(in, inpos, out, outpos); + break; + default: + throw new IllegalArgumentException("Unsupported bit width."); + } + } } diff --git a/src/main/java/me/lemire/integercompression/Composition.java b/src/main/java/me/lemire/integercompression/Composition.java index 06d0492..cc5f177 100644 --- a/src/main/java/me/lemire/integercompression/Composition.java +++ b/src/main/java/me/lemire/integercompression/Composition.java @@ -9,35 +9,39 @@ /** * Helper class to compose schemes. - * + * * @author Daniel Lemire */ -public class Composition implements IntegerCODEC{ - IntegerCODEC F1, F2; - public Composition(IntegerCODEC f1, IntegerCODEC f2) {F1 = f1; F2= f2;} - - @Override -public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - int init = inpos.get(); - F1.compress(in, inpos, inlength, out, outpos); - inlength -= inpos.get() - init; - F2.compress(in, inpos, inlength, out, outpos); - } - - @Override -public void uncompress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { - int init = inpos.get(); - F1.uncompress(in, inpos, inlength, out, outpos); - inlength -= inpos.get() - init; - F2.uncompress(in, inpos, inlength, out, outpos); - } - - - @Override -public String toString() { - return F1.getClass().getName()+"+"+F2.getClass().getName(); - } +public class Composition implements IntegerCODEC { + IntegerCODEC F1, F2; + + public Composition(IntegerCODEC f1, IntegerCODEC f2) { + F1 = f1; + F2 = f2; + } + + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + int init = inpos.get(); + F1.compress(in, inpos, inlength, out, outpos); + inlength -= inpos.get() - init; + F2.compress(in, inpos, inlength, out, outpos); + } + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + int init = inpos.get(); + F1.uncompress(in, inpos, inlength, out, outpos); + inlength -= inpos.get() - init; + F2.uncompress(in, inpos, inlength, out, outpos); + } + + + @Override + public String toString() { + return F1.getClass().getName() + "+" + F2.getClass().getName(); + } } diff --git a/src/main/java/me/lemire/integercompression/Delta.java b/src/main/java/me/lemire/integercompression/Delta.java index 6a34237..b3963ca 100644 --- a/src/main/java/me/lemire/integercompression/Delta.java +++ b/src/main/java/me/lemire/integercompression/Delta.java @@ -9,33 +9,33 @@ public class Delta { - public static void delta(int[] data) { - for (int i = data.length - 1; i > 0; --i) { - data[i] -= data[i - 1]; + public static void delta(int[] data) { + for (int i = data.length - 1; i > 0; --i) { + data[i] -= data[i - 1]; + } } - } - public static void inverseDelta(int[] data) { - for (int i = 1; i < data.length; ++i) { - data[i] += data[i - 1]; + public static void inverseDelta(int[] data) { + for (int i = 1; i < data.length; ++i) { + data[i] += data[i - 1]; + } } - } - public static void fastinverseDelta(int[] data) { - int sz0 = data.length / 4 * 4; - int i = 1; - if (sz0 >= 4) { - int a = data[0]; - for (; i < sz0 - 4; i += 4) { - a = data[i] += a; - a = data[i + 1] += a; - a = data[i + 2] += a; - a = data[i + 3] += a; - } - } + public static void fastinverseDelta(int[] data) { + int sz0 = data.length / 4 * 4; + int i = 1; + if (sz0 >= 4) { + int a = data[0]; + for (; i < sz0 - 4; i += 4) { + a = data[i] += a; + a = data[i + 1] += a; + a = data[i + 2] += a; + a = data[i + 3] += a; + } + } - for (; i != data.length; ++i) { - data[i] += data[i - 1]; + for (; i != data.length; ++i) { + data[i] += data[i - 1]; + } } - } } diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 68d7103..93270bc 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -11,228 +11,228 @@ /** * This is a new PFOR Scheme designed by D. Lemire called FastPFOR. - * - * For details, please see - * - * Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second through vectorization + *

+ * For details, please see + *

+ * Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second through vectorization * http://arxiv.org/abs/1209.2137 - * + *

* For sufficiently compressible arrays, it is faster and better than other PFOR * schemes. - * + * * @author Daniel Lemire */ public final class FastPFOR implements IntegerCODEC { - int PageSize; - final static int BlockSize = 128; - final static int overheadofeachexcept = 8; - - int[][] datatobepacked = new int[32][]; - ByteBuffer bytecontainer; - - public FastPFOR(int pagesize) { - PageSize = pagesize; - initArrays(); - } - - public FastPFOR() { - PageSize = 65536; - initArrays(); - } - - public void initArrays() { - bytecontainer = ByteBuffer.allocateDirect(3 * PageSize / BlockSize - + PageSize); - for (int k = 1; k < 32; ++k) - datatobepacked[k] = new int[PageSize / 32 * 4];// heuristic - } - - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - inlength = inlength / 128 * 128; - - final int finalinpos = inpos.get() + inlength; - out[outpos.get()] = inlength; - outpos.increment(); - while (inpos.get() != finalinpos) { - int thissize = finalinpos > PageSize + inpos.get() ? PageSize - : (finalinpos - inpos.get()); - encodePage(in, inpos, thissize, out, outpos); - } - } - - public static void getBestBFromData(int[] in, int pos, - byte[] bestbbestcexceptmaxb) { - int freqs[] = new int[32]; - for (int k = pos; k < BlockSize + pos; ++k) - freqs[Util.bits(in[k])]++; - bestbbestcexceptmaxb[0] = 31; - while (freqs[bestbbestcexceptmaxb[0]] == 0) - bestbbestcexceptmaxb[0]--; - bestbbestcexceptmaxb[2] = bestbbestcexceptmaxb[0]; - int bestcost = bestbbestcexceptmaxb[0] * BlockSize; - byte cexcept = 0; - bestbbestcexceptmaxb[1] = cexcept; - for (int b = bestbbestcexceptmaxb[0] - 1; b >= 0; --b) { - cexcept += freqs[b + 1]; - if (cexcept < 0) - break; - int thiscost = cexcept * overheadofeachexcept + cexcept - * (bestbbestcexceptmaxb[2] - b) + b * BlockSize + 8;// the - // extra - // 8 is - // the - // cost - // of - // storing - // maxbits - if (thiscost < bestcost) { - bestcost = thiscost; - bestbbestcexceptmaxb[0] = (byte) b; - bestbbestcexceptmaxb[1] = cexcept; - } - } - } - - private void encodePage(int[] in, IntWrapper inpos, int thissize, - int[] out, IntWrapper outpos) { - final int headerpos = outpos.get(); - outpos.increment(); - int tmpoutpos = outpos.get(); - int[] datapointers = new int[32]; - bytecontainer.clear(); - final byte[] bestbbestcexceptmaxb = new byte[3]; - int tmpinpos = inpos.get(); - for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { - getBestBFromData(in, tmpinpos, bestbbestcexceptmaxb); - final int tmpbestb = bestbbestcexceptmaxb[0]; - bytecontainer.put(bestbbestcexceptmaxb[0]); - bytecontainer.put(bestbbestcexceptmaxb[1]); - if (bestbbestcexceptmaxb[1] > 0) { - bytecontainer.put(bestbbestcexceptmaxb[2]); - final int index = bestbbestcexceptmaxb[2] - - bestbbestcexceptmaxb[0]; - if (datapointers[index] + bestbbestcexceptmaxb[1] >= datatobepacked[index].length) { - int newsize = 2 * (datapointers[index] + bestbbestcexceptmaxb[1]); - newsize = (newsize + 31) / 32 * 32;// make sure it is a - // multiple of - // 32 - datatobepacked[index] = Arrays.copyOf( - datatobepacked[index], newsize); - } - final int maxval = 1 << bestbbestcexceptmaxb[0]; - for (int k = 0; k < BlockSize; ++k) { - if (in[k + tmpinpos] >= maxval) { - // we have an exception - bytecontainer.put((byte) k); - datatobepacked[index][datapointers[index]++] = in[k - + tmpinpos] >>> tmpbestb; - } - } - } - for (int k = 0; k < 128; k += 32) { - BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, tmpbestb); - tmpoutpos += tmpbestb; - } - } - inpos.set(tmpinpos); - out[headerpos] = tmpoutpos - headerpos; - while ((bytecontainer.position() & 3) != 0) - bytecontainer.put((byte) 0); - final int bytesize = bytecontainer.position(); - out[tmpoutpos++] = bytesize; - final int howmanyints = bytesize / 4; - bytecontainer.flip(); - bytecontainer.asIntBuffer().get(out, tmpoutpos, howmanyints); - tmpoutpos += howmanyints; - int bitmap = 0; - for (int k = 1; k <= 31; ++k) { - if (datapointers[k] != 0) - bitmap |= (1 << (k - 1)); - } - out[tmpoutpos++] = bitmap; - for (int k = 1; k <= 31; ++k) { - - if (datapointers[k] != 0) { - out[tmpoutpos++] = datapointers[k];// size - for (int j = 0; j < datapointers[k]; j += 32) { - BitPacking - .fastpack(datatobepacked[k], j, out, tmpoutpos, k); - tmpoutpos += k; - } - } - } - outpos.set(tmpoutpos); - } - - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); - int mynvalue = in[inpos.get()]; - inpos.increment(); - int finalout = outpos.get() + mynvalue; - while (outpos.get() != finalout) { - int thissize = finalout > PageSize + outpos.get() ? PageSize - : (finalout - outpos.get()); - decodePage(in, inpos, out, outpos, thissize); - } - } - - private void decodePage(int[] in, IntWrapper inpos, int[] out, - IntWrapper outpos, int thissize) { - final int initpos = inpos.get(); - final int wheremeta = in[inpos.get()]; - inpos.increment(); - int inexcept = initpos + wheremeta; - final int bytesize = in[inexcept++]; - bytecontainer.clear(); - // Util.assertTrue((bytesize & 3) == 0); - bytecontainer.asIntBuffer().put(in, inexcept, bytesize / 4); - inexcept += bytesize / 4; - - final int bitmap = in[inexcept++]; - for (int k = 1; k <= 31; ++k) { - if ((bitmap & (1 << (k - 1))) != 0) { - int size = in[inexcept++]; - if (datatobepacked[k].length < size) - datatobepacked[k] = new int[(size + 31) / 32 * 32]; - for (int j = 0; j < size; j += 32) { - BitPacking - .fastunpack(in, inexcept, datatobepacked[k], j, k); - inexcept += k; - } - } - } - int[] datapointers = new int[32]; - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); - - for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { - final byte b = bytecontainer.get(); - final byte cexcept = bytecontainer.get(); - for (int k = 0; k < 128; k += 32) { - BitPacking.fastunpack(in, tmpinpos, out, tmpoutpos + k, b); - tmpinpos += b; - } - if (cexcept > 0) { - final byte maxbits = bytecontainer.get(); - final int index = maxbits - b; - for (int k = 0; k < cexcept; ++k) { - final byte pos = bytecontainer.get(); - final int exceptvalue = datatobepacked[index][datapointers[index]++]; - out[pos + tmpoutpos] |= exceptvalue << b; - } - - } - } - outpos.set(tmpoutpos); - inpos.set(inexcept); - } - - @Override - public String toString() { - return this.getClass().getName(); - } + int PageSize; + final static int BlockSize = 128; + final static int overheadofeachexcept = 8; + + int[][] datatobepacked = new int[32][]; + ByteBuffer bytecontainer; + + public FastPFOR(int pagesize) { + PageSize = pagesize; + initArrays(); + } + + public FastPFOR() { + PageSize = 65536; + initArrays(); + } + + public void initArrays() { + bytecontainer = ByteBuffer.allocateDirect(3 * PageSize / BlockSize + + PageSize); + for (int k = 1; k < 32; ++k) + datatobepacked[k] = new int[PageSize / 32 * 4];// heuristic + } + + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + inlength = inlength / 128 * 128; + + final int finalinpos = inpos.get() + inlength; + out[outpos.get()] = inlength; + outpos.increment(); + while (inpos.get() != finalinpos) { + int thissize = finalinpos > PageSize + inpos.get() ? PageSize + : (finalinpos - inpos.get()); + encodePage(in, inpos, thissize, out, outpos); + } + } + + public static void getBestBFromData(int[] in, int pos, + byte[] bestbbestcexceptmaxb) { + int freqs[] = new int[32]; + for (int k = pos; k < BlockSize + pos; ++k) + freqs[Util.bits(in[k])]++; + bestbbestcexceptmaxb[0] = 31; + while (freqs[bestbbestcexceptmaxb[0]] == 0) + bestbbestcexceptmaxb[0]--; + bestbbestcexceptmaxb[2] = bestbbestcexceptmaxb[0]; + int bestcost = bestbbestcexceptmaxb[0] * BlockSize; + byte cexcept = 0; + bestbbestcexceptmaxb[1] = cexcept; + for (int b = bestbbestcexceptmaxb[0] - 1; b >= 0; --b) { + cexcept += freqs[b + 1]; + if (cexcept < 0) + break; + int thiscost = cexcept * overheadofeachexcept + cexcept + * (bestbbestcexceptmaxb[2] - b) + b * BlockSize + 8;// the + // extra + // 8 is + // the + // cost + // of + // storing + // maxbits + if (thiscost < bestcost) { + bestcost = thiscost; + bestbbestcexceptmaxb[0] = (byte) b; + bestbbestcexceptmaxb[1] = cexcept; + } + } + } + + private void encodePage(int[] in, IntWrapper inpos, int thissize, + int[] out, IntWrapper outpos) { + final int headerpos = outpos.get(); + outpos.increment(); + int tmpoutpos = outpos.get(); + int[] datapointers = new int[32]; + bytecontainer.clear(); + final byte[] bestbbestcexceptmaxb = new byte[3]; + int tmpinpos = inpos.get(); + for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { + getBestBFromData(in, tmpinpos, bestbbestcexceptmaxb); + final int tmpbestb = bestbbestcexceptmaxb[0]; + bytecontainer.put(bestbbestcexceptmaxb[0]); + bytecontainer.put(bestbbestcexceptmaxb[1]); + if (bestbbestcexceptmaxb[1] > 0) { + bytecontainer.put(bestbbestcexceptmaxb[2]); + final int index = bestbbestcexceptmaxb[2] + - bestbbestcexceptmaxb[0]; + if (datapointers[index] + bestbbestcexceptmaxb[1] >= datatobepacked[index].length) { + int newsize = 2 * (datapointers[index] + bestbbestcexceptmaxb[1]); + newsize = (newsize + 31) / 32 * 32;// make sure it is a + // multiple of + // 32 + datatobepacked[index] = Arrays.copyOf( + datatobepacked[index], newsize); + } + final int maxval = 1 << bestbbestcexceptmaxb[0]; + for (int k = 0; k < BlockSize; ++k) { + if (in[k + tmpinpos] >= maxval) { + // we have an exception + bytecontainer.put((byte) k); + datatobepacked[index][datapointers[index]++] = in[k + + tmpinpos] >>> tmpbestb; + } + } + } + for (int k = 0; k < 128; k += 32) { + BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, tmpbestb); + tmpoutpos += tmpbestb; + } + } + inpos.set(tmpinpos); + out[headerpos] = tmpoutpos - headerpos; + while ((bytecontainer.position() & 3) != 0) + bytecontainer.put((byte) 0); + final int bytesize = bytecontainer.position(); + out[tmpoutpos++] = bytesize; + final int howmanyints = bytesize / 4; + bytecontainer.flip(); + bytecontainer.asIntBuffer().get(out, tmpoutpos, howmanyints); + tmpoutpos += howmanyints; + int bitmap = 0; + for (int k = 1; k <= 31; ++k) { + if (datapointers[k] != 0) + bitmap |= (1 << (k - 1)); + } + out[tmpoutpos++] = bitmap; + for (int k = 1; k <= 31; ++k) { + + if (datapointers[k] != 0) { + out[tmpoutpos++] = datapointers[k];// size + for (int j = 0; j < datapointers[k]; j += 32) { + BitPacking + .fastpack(datatobepacked[k], j, out, tmpoutpos, k); + tmpoutpos += k; + } + } + } + outpos.set(tmpoutpos); + } + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + // Util.assertTrue(inpos.get()+inlength <= in.length); + int mynvalue = in[inpos.get()]; + inpos.increment(); + int finalout = outpos.get() + mynvalue; + while (outpos.get() != finalout) { + int thissize = finalout > PageSize + outpos.get() ? PageSize + : (finalout - outpos.get()); + decodePage(in, inpos, out, outpos, thissize); + } + } + + private void decodePage(int[] in, IntWrapper inpos, int[] out, + IntWrapper outpos, int thissize) { + final int initpos = inpos.get(); + final int wheremeta = in[inpos.get()]; + inpos.increment(); + int inexcept = initpos + wheremeta; + final int bytesize = in[inexcept++]; + bytecontainer.clear(); + // Util.assertTrue((bytesize & 3) == 0); + bytecontainer.asIntBuffer().put(in, inexcept, bytesize / 4); + inexcept += bytesize / 4; + + final int bitmap = in[inexcept++]; + for (int k = 1; k <= 31; ++k) { + if ((bitmap & (1 << (k - 1))) != 0) { + int size = in[inexcept++]; + if (datatobepacked[k].length < size) + datatobepacked[k] = new int[(size + 31) / 32 * 32]; + for (int j = 0; j < size; j += 32) { + BitPacking + .fastunpack(in, inexcept, datatobepacked[k], j, k); + inexcept += k; + } + } + } + int[] datapointers = new int[32]; + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); + + for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { + final byte b = bytecontainer.get(); + final byte cexcept = bytecontainer.get(); + for (int k = 0; k < 128; k += 32) { + BitPacking.fastunpack(in, tmpinpos, out, tmpoutpos + k, b); + tmpinpos += b; + } + if (cexcept > 0) { + final byte maxbits = bytecontainer.get(); + final int index = maxbits - b; + for (int k = 0; k < cexcept; ++k) { + final byte pos = bytecontainer.get(); + final int exceptvalue = datatobepacked[index][datapointers[index]++]; + out[pos + tmpoutpos] |= exceptvalue << b; + } + + } + } + outpos.set(tmpoutpos); + inpos.set(inexcept); + } + + @Override + public String toString() { + return this.getClass().getName(); + } } diff --git a/src/main/java/me/lemire/integercompression/IntegerCODEC.java b/src/main/java/me/lemire/integercompression/IntegerCODEC.java index e3a419d..9c72322 100644 --- a/src/main/java/me/lemire/integercompression/IntegerCODEC.java +++ b/src/main/java/me/lemire/integercompression/IntegerCODEC.java @@ -9,18 +9,18 @@ public interface IntegerCODEC { - /** - * Both inpos and outpos are modified to represent how much - * data was read and written to - * if 12 ints (inlength = 12) are compressed to 3 ints, then - * inpos will be incremented by 12 while outpos will be - * incremented by 3 - * we use IntWrapper to pass the values by reference. - */ - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos); + /** + * Both inpos and outpos are modified to represent how much + * data was read and written to + * if 12 ints (inlength = 12) are compressed to 3 ints, then + * inpos will be incremented by 12 while outpos will be + * incremented by 3 + * we use IntWrapper to pass the values by reference. + */ + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos); + + // returns how many integers we decompressed + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos); - // returns how many integers we decompressed - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos); - } diff --git a/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java b/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java index 0efccea..ed31ddb 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java @@ -9,66 +9,66 @@ public class IntegratedBinaryPacking implements IntegratedIntegerCODEC { - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = inlength / 128 * 128; - out[outpos.get()] = inlength; - outpos.increment(); - int tmpoutpos = outpos.get(); - int initoffset = 0; - for (int s = inpos.get(); s < inpos.get() + inlength; s += 32 * 4) { - final int mbits1 = Util.maxdiffbits(initoffset, in, s, 32); - int initoffset2 = in[s+31]; - final int mbits2 = Util.maxdiffbits(initoffset2, in, s + 32, 32); - int initoffset3 = in[s+32+31]; - final int mbits3 = Util.maxdiffbits(initoffset3, in, s + 2 * 32, 32); - int initoffset4 = in[s+2*32+31]; - final int mbits4 = Util.maxdiffbits(initoffset4, in, s + 3 * 32, 32); - out[tmpoutpos++] = (mbits1 << 24) | (mbits2 << 16) | (mbits3 << 8) - | (mbits4); - IntegratedBitPacking.integratedpack(initoffset, in, s, out, tmpoutpos, mbits1); - tmpoutpos += mbits1; - IntegratedBitPacking.integratedpack(initoffset2, in, s + 32, out, tmpoutpos, mbits2); - tmpoutpos += mbits2; - IntegratedBitPacking.integratedpack(initoffset3, in, s + 2 * 32, out, tmpoutpos, mbits3); - tmpoutpos += mbits3; - IntegratedBitPacking.integratedpack(initoffset4, in, s + 3 * 32, out, tmpoutpos, mbits4); - tmpoutpos += mbits4; - initoffset = in[s+3*32+31]; - } - inpos.add(inlength); - outpos.set(tmpoutpos); - } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + inlength = inlength / 128 * 128; + out[outpos.get()] = inlength; + outpos.increment(); + int tmpoutpos = outpos.get(); + int initoffset = 0; + for (int s = inpos.get(); s < inpos.get() + inlength; s += 32 * 4) { + final int mbits1 = Util.maxdiffbits(initoffset, in, s, 32); + int initoffset2 = in[s + 31]; + final int mbits2 = Util.maxdiffbits(initoffset2, in, s + 32, 32); + int initoffset3 = in[s + 32 + 31]; + final int mbits3 = Util.maxdiffbits(initoffset3, in, s + 2 * 32, 32); + int initoffset4 = in[s + 2 * 32 + 31]; + final int mbits4 = Util.maxdiffbits(initoffset4, in, s + 3 * 32, 32); + out[tmpoutpos++] = (mbits1 << 24) | (mbits2 << 16) | (mbits3 << 8) + | (mbits4); + IntegratedBitPacking.integratedpack(initoffset, in, s, out, tmpoutpos, mbits1); + tmpoutpos += mbits1; + IntegratedBitPacking.integratedpack(initoffset2, in, s + 32, out, tmpoutpos, mbits2); + tmpoutpos += mbits2; + IntegratedBitPacking.integratedpack(initoffset3, in, s + 2 * 32, out, tmpoutpos, mbits3); + tmpoutpos += mbits3; + IntegratedBitPacking.integratedpack(initoffset4, in, s + 3 * 32, out, tmpoutpos, mbits4); + tmpoutpos += mbits4; + initoffset = in[s + 3 * 32 + 31]; + } + inpos.add(inlength); + outpos.set(tmpoutpos); + } - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); - final int outlength = in[inpos.get()]; - inpos.increment(); - int tmpinpos = inpos.get(); - int initoffset = 0; - for (int s = outpos.get(); s < outpos.get() + outlength; s += 32 * 4) { - final int mbits1 = (in[tmpinpos] >>> 24); - final int mbits2 = (in[tmpinpos] >>> 16) & 0xFF; - final int mbits3 = (in[tmpinpos] >>> 8) & 0xFF; - final int mbits4 = (in[tmpinpos]) & 0xFF; - ++tmpinpos; - IntegratedBitPacking.integratedunpack(initoffset, in, tmpinpos, out, s, mbits1); - tmpinpos += mbits1; - initoffset = out[s+31]; - IntegratedBitPacking.integratedunpack(initoffset,in, tmpinpos, out, s + 32, mbits2); - tmpinpos += mbits2; - initoffset = out[s+32+31]; - IntegratedBitPacking.integratedunpack(initoffset,in, tmpinpos, out, s + 2 * 32, mbits3); - tmpinpos += mbits3; - initoffset = out[s+2*32+31]; - IntegratedBitPacking.integratedunpack(initoffset,in, tmpinpos, out, s + 3 * 32, mbits4); - tmpinpos += mbits4; - initoffset = out[s+3*32+31]; - } - outpos.add(outlength); - inpos.set(tmpinpos); - } + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + // Util.assertTrue(inpos.get()+inlength <= in.length); + final int outlength = in[inpos.get()]; + inpos.increment(); + int tmpinpos = inpos.get(); + int initoffset = 0; + for (int s = outpos.get(); s < outpos.get() + outlength; s += 32 * 4) { + final int mbits1 = (in[tmpinpos] >>> 24); + final int mbits2 = (in[tmpinpos] >>> 16) & 0xFF; + final int mbits3 = (in[tmpinpos] >>> 8) & 0xFF; + final int mbits4 = (in[tmpinpos]) & 0xFF; + ++tmpinpos; + IntegratedBitPacking.integratedunpack(initoffset, in, tmpinpos, out, s, mbits1); + tmpinpos += mbits1; + initoffset = out[s + 31]; + IntegratedBitPacking.integratedunpack(initoffset, in, tmpinpos, out, s + 32, mbits2); + tmpinpos += mbits2; + initoffset = out[s + 32 + 31]; + IntegratedBitPacking.integratedunpack(initoffset, in, tmpinpos, out, s + 2 * 32, mbits3); + tmpinpos += mbits3; + initoffset = out[s + 2 * 32 + 31]; + IntegratedBitPacking.integratedunpack(initoffset, in, tmpinpos, out, s + 3 * 32, mbits4); + tmpinpos += mbits4; + initoffset = out[s + 3 * 32 + 31]; + } + outpos.add(outlength); + inpos.set(tmpinpos); + } } diff --git a/src/main/java/me/lemire/integercompression/IntegratedBitPacking.java b/src/main/java/me/lemire/integercompression/IntegratedBitPacking.java index 9ab36cb..0327cd9 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedBitPacking.java +++ b/src/main/java/me/lemire/integercompression/IntegratedBitPacking.java @@ -10,4918 +10,4791 @@ import java.util.Arrays; public final class IntegratedBitPacking { - - - - -public static void integratedpack1(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 1 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 2 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 3 ) - | ( ( in[ 4 + inpos] - in [4 + inpos - 1] ) << 4 ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 5 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 6 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 7 ) - | ( ( in[ 8 + inpos] - in [8 + inpos - 1] ) << 8 ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 9 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 10 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 11 ) - | ( ( in[ 12 + inpos] - in [12 + inpos - 1] ) << 12 ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 13 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 14 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 15 ) - | ( ( in[ 16 + inpos] - in [16 + inpos - 1] ) << 16 ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 17 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 18 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 19 ) - | ( ( in[ 20 + inpos] - in [20 + inpos - 1] ) << 20 ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 21 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 22 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 23 ) - | ( ( in[ 24 + inpos] - in [24 + inpos - 1] ) << 24 ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 25 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 26 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 27 ) - | ( ( in[ 28 + inpos] - in [28 + inpos - 1] ) << 28 ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 29 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 30 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 31 ) - ; -} - - - - -public static void integratedpack2(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 2 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 4 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 6 ) - | ( ( in[ 4 + inpos] - in [4 + inpos - 1] ) << 8 ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 10 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 12 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 14 ) - | ( ( in[ 8 + inpos] - in [8 + inpos - 1] ) << 16 ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 18 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 20 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 22 ) - | ( ( in[ 12 + inpos] - in [12 + inpos - 1] ) << 24 ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 26 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 28 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 30 ) - ; - out[ 1 + outpos] = (in[ 16 + inpos] - in [16 + inpos - 1] ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 2 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 4 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 6 ) - | ( ( in[ 20 + inpos] - in [20 + inpos - 1] ) << 8 ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 10 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 12 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 14 ) - | ( ( in[ 24 + inpos] - in [24 + inpos - 1] ) << 16 ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 18 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 20 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 22 ) - | ( ( in[ 28 + inpos] - in [28 + inpos - 1] ) << 24 ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 26 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 28 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 30 ) - ; -} - - - - -public static void integratedpack3(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 3 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 6 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 9 ) - | ( ( in[ 4 + inpos] - in [4 + inpos - 1] ) << 12 ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 15 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 18 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 21 ) - | ( ( in[ 8 + inpos] - in [8 + inpos - 1] ) << 24 ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 27 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 30 ) - ; - out[ 1 + outpos] = ( in[ 10 + inpos] - in [10 + inpos - 1] ) >>> ( 3 - 1 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 1 ) - | ( ( in[ 12 + inpos] - in [12 + inpos - 1] ) << 4 ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 7 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 10 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 13 ) - | ( ( in[ 16 + inpos] - in [16 + inpos - 1] ) << 16 ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 19 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 22 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 25 ) - | ( ( in[ 20 + inpos] - in [20 + inpos - 1] ) << 28 ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 31 ) - ; - out[ 2 + outpos] = ( in[ 21 + inpos] - in [21 + inpos - 1] ) >>> ( 3 - 2 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 2 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 5 ) - | ( ( in[ 24 + inpos] - in [24 + inpos - 1] ) << 8 ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 11 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 14 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 17 ) - | ( ( in[ 28 + inpos] - in [28 + inpos - 1] ) << 20 ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 23 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 26 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 29 ) - ; -} - - - - -public static void integratedpack4(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 4 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 8 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 12 ) - | ( ( in[ 4 + inpos] - in [4 + inpos - 1] ) << 16 ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 20 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 24 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 28 ) - ; - out[ 1 + outpos] = (in[ 8 + inpos] - in [8 + inpos - 1] ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 4 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 8 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 12 ) - | ( ( in[ 12 + inpos] - in [12 + inpos - 1] ) << 16 ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 20 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 24 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 28 ) - ; - out[ 2 + outpos] = (in[ 16 + inpos] - in [16 + inpos - 1] ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 4 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 8 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 12 ) - | ( ( in[ 20 + inpos] - in [20 + inpos - 1] ) << 16 ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 20 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 24 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 28 ) - ; - out[ 3 + outpos] = (in[ 24 + inpos] - in [24 + inpos - 1] ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 4 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 8 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 12 ) - | ( ( in[ 28 + inpos] - in [28 + inpos - 1] ) << 16 ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 20 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 24 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 28 ) - ; -} - - - - -public static void integratedpack5(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 5 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 10 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 15 ) - | ( ( in[ 4 + inpos] - in [4 + inpos - 1] ) << 20 ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 25 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 30 ) - ; - out[ 1 + outpos] = ( in[ 6 + inpos] - in [6 + inpos - 1] ) >>> ( 5 - 3 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 3 ) - | ( ( in[ 8 + inpos] - in [8 + inpos - 1] ) << 8 ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 13 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 18 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 23 ) - | ( ( in[ 12 + inpos] - in [12 + inpos - 1] ) << 28 ) - ; - out[ 2 + outpos] = ( in[ 12 + inpos] - in [12 + inpos - 1] ) >>> ( 5 - 1 ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 1 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 6 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 11 ) - | ( ( in[ 16 + inpos] - in [16 + inpos - 1] ) << 16 ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 21 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 26 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 31 ) - ; - out[ 3 + outpos] = ( in[ 19 + inpos] - in [19 + inpos - 1] ) >>> ( 5 - 4 ) - | ( ( in[ 20 + inpos] - in [20 + inpos - 1] ) << 4 ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 9 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 14 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 19 ) - | ( ( in[ 24 + inpos] - in [24 + inpos - 1] ) << 24 ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 29 ) - ; - out[ 4 + outpos] = ( in[ 25 + inpos] - in [25 + inpos - 1] ) >>> ( 5 - 2 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 2 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 7 ) - | ( ( in[ 28 + inpos] - in [28 + inpos - 1] ) << 12 ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 17 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 22 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 27 ) - ; -} - - - - -public static void integratedpack6(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 6 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 12 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 18 ) - | ( ( in[ 4 + inpos] - in [4 + inpos - 1] ) << 24 ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 30 ) - ; - out[ 1 + outpos] = ( in[ 5 + inpos] - in [5 + inpos - 1] ) >>> ( 6 - 4 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 4 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 10 ) - | ( ( in[ 8 + inpos] - in [8 + inpos - 1] ) << 16 ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 22 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 28 ) - ; - out[ 2 + outpos] = ( in[ 10 + inpos] - in [10 + inpos - 1] ) >>> ( 6 - 2 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 2 ) - | ( ( in[ 12 + inpos] - in [12 + inpos - 1] ) << 8 ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 14 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 20 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 26 ) - ; - out[ 3 + outpos] = (in[ 16 + inpos] - in [16 + inpos - 1] ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 6 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 12 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 18 ) - | ( ( in[ 20 + inpos] - in [20 + inpos - 1] ) << 24 ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 30 ) - ; - out[ 4 + outpos] = ( in[ 21 + inpos] - in [21 + inpos - 1] ) >>> ( 6 - 4 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 4 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 10 ) - | ( ( in[ 24 + inpos] - in [24 + inpos - 1] ) << 16 ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 22 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 28 ) - ; - out[ 5 + outpos] = ( in[ 26 + inpos] - in [26 + inpos - 1] ) >>> ( 6 - 2 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 2 ) - | ( ( in[ 28 + inpos] - in [28 + inpos - 1] ) << 8 ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 14 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 20 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 26 ) - ; -} - - - - -public static void integratedpack7(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 7 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 14 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 21 ) - | ( ( in[ 4 + inpos] - in [4 + inpos - 1] ) << 28 ) - ; - out[ 1 + outpos] = ( in[ 4 + inpos] - in [4 + inpos - 1] ) >>> ( 7 - 3 ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 3 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 10 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 17 ) - | ( ( in[ 8 + inpos] - in [8 + inpos - 1] ) << 24 ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 31 ) - ; - out[ 2 + outpos] = ( in[ 9 + inpos] - in [9 + inpos - 1] ) >>> ( 7 - 6 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 6 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 13 ) - | ( ( in[ 12 + inpos] - in [12 + inpos - 1] ) << 20 ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 27 ) - ; - out[ 3 + outpos] = ( in[ 13 + inpos] - in [13 + inpos - 1] ) >>> ( 7 - 2 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 2 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 9 ) - | ( ( in[ 16 + inpos] - in [16 + inpos - 1] ) << 16 ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 23 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 30 ) - ; - out[ 4 + outpos] = ( in[ 18 + inpos] - in [18 + inpos - 1] ) >>> ( 7 - 5 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 5 ) - | ( ( in[ 20 + inpos] - in [20 + inpos - 1] ) << 12 ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 19 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 26 ) - ; - out[ 5 + outpos] = ( in[ 22 + inpos] - in [22 + inpos - 1] ) >>> ( 7 - 1 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 1 ) - | ( ( in[ 24 + inpos] - in [24 + inpos - 1] ) << 8 ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 15 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 22 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 29 ) - ; - out[ 6 + outpos] = ( in[ 27 + inpos] - in [27 + inpos - 1] ) >>> ( 7 - 4 ) - | ( ( in[ 28 + inpos] - in [28 + inpos - 1] ) << 4 ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 11 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 18 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 25 ) - ; -} - - - - -public static void integratedpack8(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 8 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 16 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 24 ) - ; - out[ 1 + outpos] = (in[ 4 + inpos] - in [4 + inpos - 1] ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 8 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 16 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 24 ) - ; - out[ 2 + outpos] = (in[ 8 + inpos] - in [8 + inpos - 1] ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 8 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 16 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 24 ) - ; - out[ 3 + outpos] = (in[ 12 + inpos] - in [12 + inpos - 1] ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 8 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 16 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 24 ) - ; - out[ 4 + outpos] = (in[ 16 + inpos] - in [16 + inpos - 1] ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 8 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 16 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 24 ) - ; - out[ 5 + outpos] = (in[ 20 + inpos] - in [20 + inpos - 1] ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 8 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 16 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 24 ) - ; - out[ 6 + outpos] = (in[ 24 + inpos] - in [24 + inpos - 1] ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 8 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 16 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 24 ) - ; - out[ 7 + outpos] = (in[ 28 + inpos] - in [28 + inpos - 1] ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 8 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 16 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 24 ) - ; -} - - - - -public static void integratedpack9(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 9 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 18 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 27 ) - ; - out[ 1 + outpos] = ( in[ 3 + inpos] - in [3 + inpos - 1] ) >>> ( 9 - 4 ) - | ( ( in[ 4 + inpos] - in [4 + inpos - 1] ) << 4 ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 13 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 22 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 31 ) - ; - out[ 2 + outpos] = ( in[ 7 + inpos] - in [7 + inpos - 1] ) >>> ( 9 - 8 ) - | ( ( in[ 8 + inpos] - in [8 + inpos - 1] ) << 8 ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 17 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 26 ) - ; - out[ 3 + outpos] = ( in[ 10 + inpos] - in [10 + inpos - 1] ) >>> ( 9 - 3 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 3 ) - | ( ( in[ 12 + inpos] - in [12 + inpos - 1] ) << 12 ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 21 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 30 ) - ; - out[ 4 + outpos] = ( in[ 14 + inpos] - in [14 + inpos - 1] ) >>> ( 9 - 7 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 7 ) - | ( ( in[ 16 + inpos] - in [16 + inpos - 1] ) << 16 ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 25 ) - ; - out[ 5 + outpos] = ( in[ 17 + inpos] - in [17 + inpos - 1] ) >>> ( 9 - 2 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 2 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 11 ) - | ( ( in[ 20 + inpos] - in [20 + inpos - 1] ) << 20 ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 29 ) - ; - out[ 6 + outpos] = ( in[ 21 + inpos] - in [21 + inpos - 1] ) >>> ( 9 - 6 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 6 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 15 ) - | ( ( in[ 24 + inpos] - in [24 + inpos - 1] ) << 24 ) - ; - out[ 7 + outpos] = ( in[ 24 + inpos] - in [24 + inpos - 1] ) >>> ( 9 - 1 ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 1 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 10 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 19 ) - | ( ( in[ 28 + inpos] - in [28 + inpos - 1] ) << 28 ) - ; - out[ 8 + outpos] = ( in[ 28 + inpos] - in [28 + inpos - 1] ) >>> ( 9 - 5 ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 5 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 14 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 23 ) - ; -} - - - - -public static void integratedpack10(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 10 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 20 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 30 ) - ; - out[ 1 + outpos] = ( in[ 3 + inpos] - in [3 + inpos - 1] ) >>> ( 10 - 8 ) - | ( ( in[ 4 + inpos] - in [4 + inpos - 1] ) << 8 ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 18 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 28 ) - ; - out[ 2 + outpos] = ( in[ 6 + inpos] - in [6 + inpos - 1] ) >>> ( 10 - 6 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 6 ) - | ( ( in[ 8 + inpos] - in [8 + inpos - 1] ) << 16 ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 26 ) - ; - out[ 3 + outpos] = ( in[ 9 + inpos] - in [9 + inpos - 1] ) >>> ( 10 - 4 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 4 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 14 ) - | ( ( in[ 12 + inpos] - in [12 + inpos - 1] ) << 24 ) - ; - out[ 4 + outpos] = ( in[ 12 + inpos] - in [12 + inpos - 1] ) >>> ( 10 - 2 ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 2 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 12 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 22 ) - ; - out[ 5 + outpos] = (in[ 16 + inpos] - in [16 + inpos - 1] ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 10 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 20 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 30 ) - ; - out[ 6 + outpos] = ( in[ 19 + inpos] - in [19 + inpos - 1] ) >>> ( 10 - 8 ) - | ( ( in[ 20 + inpos] - in [20 + inpos - 1] ) << 8 ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 18 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 28 ) - ; - out[ 7 + outpos] = ( in[ 22 + inpos] - in [22 + inpos - 1] ) >>> ( 10 - 6 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 6 ) - | ( ( in[ 24 + inpos] - in [24 + inpos - 1] ) << 16 ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 26 ) - ; - out[ 8 + outpos] = ( in[ 25 + inpos] - in [25 + inpos - 1] ) >>> ( 10 - 4 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 4 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 14 ) - | ( ( in[ 28 + inpos] - in [28 + inpos - 1] ) << 24 ) - ; - out[ 9 + outpos] = ( in[ 28 + inpos] - in [28 + inpos - 1] ) >>> ( 10 - 2 ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 2 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 12 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 22 ) - ; -} - - - - -public static void integratedpack11(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 11 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 22 ) - ; - out[ 1 + outpos] = ( in[ 2 + inpos] - in [2 + inpos - 1] ) >>> ( 11 - 1 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 1 ) - | ( ( in[ 4 + inpos] - in [4 + inpos - 1] ) << 12 ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 23 ) - ; - out[ 2 + outpos] = ( in[ 5 + inpos] - in [5 + inpos - 1] ) >>> ( 11 - 2 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 2 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 13 ) - | ( ( in[ 8 + inpos] - in [8 + inpos - 1] ) << 24 ) - ; - out[ 3 + outpos] = ( in[ 8 + inpos] - in [8 + inpos - 1] ) >>> ( 11 - 3 ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 3 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 14 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 25 ) - ; - out[ 4 + outpos] = ( in[ 11 + inpos] - in [11 + inpos - 1] ) >>> ( 11 - 4 ) - | ( ( in[ 12 + inpos] - in [12 + inpos - 1] ) << 4 ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 15 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 26 ) - ; - out[ 5 + outpos] = ( in[ 14 + inpos] - in [14 + inpos - 1] ) >>> ( 11 - 5 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 5 ) - | ( ( in[ 16 + inpos] - in [16 + inpos - 1] ) << 16 ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 27 ) - ; - out[ 6 + outpos] = ( in[ 17 + inpos] - in [17 + inpos - 1] ) >>> ( 11 - 6 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 6 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 17 ) - | ( ( in[ 20 + inpos] - in [20 + inpos - 1] ) << 28 ) - ; - out[ 7 + outpos] = ( in[ 20 + inpos] - in [20 + inpos - 1] ) >>> ( 11 - 7 ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 7 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 18 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 29 ) - ; - out[ 8 + outpos] = ( in[ 23 + inpos] - in [23 + inpos - 1] ) >>> ( 11 - 8 ) - | ( ( in[ 24 + inpos] - in [24 + inpos - 1] ) << 8 ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 19 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 30 ) - ; - out[ 9 + outpos] = ( in[ 26 + inpos] - in [26 + inpos - 1] ) >>> ( 11 - 9 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 9 ) - | ( ( in[ 28 + inpos] - in [28 + inpos - 1] ) << 20 ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 31 ) - ; - out[ 10 + outpos] = ( in[ 29 + inpos] - in [29 + inpos - 1] ) >>> ( 11 - 10 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 10 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 21 ) - ; -} - - - - -public static void integratedpack12(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 12 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 24 ) - ; - out[ 1 + outpos] = ( in[ 2 + inpos] - in [2 + inpos - 1] ) >>> ( 12 - 4 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 4 ) - | ( ( in[ 4 + inpos] - in [4 + inpos - 1] ) << 16 ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 28 ) - ; - out[ 2 + outpos] = ( in[ 5 + inpos] - in [5 + inpos - 1] ) >>> ( 12 - 8 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 8 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 20 ) - ; - out[ 3 + outpos] = (in[ 8 + inpos] - in [8 + inpos - 1] ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 12 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 24 ) - ; - out[ 4 + outpos] = ( in[ 10 + inpos] - in [10 + inpos - 1] ) >>> ( 12 - 4 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 4 ) - | ( ( in[ 12 + inpos] - in [12 + inpos - 1] ) << 16 ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 28 ) - ; - out[ 5 + outpos] = ( in[ 13 + inpos] - in [13 + inpos - 1] ) >>> ( 12 - 8 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 8 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 20 ) - ; - out[ 6 + outpos] = (in[ 16 + inpos] - in [16 + inpos - 1] ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 12 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 24 ) - ; - out[ 7 + outpos] = ( in[ 18 + inpos] - in [18 + inpos - 1] ) >>> ( 12 - 4 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 4 ) - | ( ( in[ 20 + inpos] - in [20 + inpos - 1] ) << 16 ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 28 ) - ; - out[ 8 + outpos] = ( in[ 21 + inpos] - in [21 + inpos - 1] ) >>> ( 12 - 8 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 8 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 20 ) - ; - out[ 9 + outpos] = (in[ 24 + inpos] - in [24 + inpos - 1] ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 12 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 24 ) - ; - out[ 10 + outpos] = ( in[ 26 + inpos] - in [26 + inpos - 1] ) >>> ( 12 - 4 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 4 ) - | ( ( in[ 28 + inpos] - in [28 + inpos - 1] ) << 16 ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 28 ) - ; - out[ 11 + outpos] = ( in[ 29 + inpos] - in [29 + inpos - 1] ) >>> ( 12 - 8 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 8 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 20 ) - ; -} - - - - -public static void integratedpack13(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 13 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 26 ) - ; - out[ 1 + outpos] = ( in[ 2 + inpos] - in [2 + inpos - 1] ) >>> ( 13 - 7 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 7 ) - | ( ( in[ 4 + inpos] - in [4 + inpos - 1] ) << 20 ) - ; - out[ 2 + outpos] = ( in[ 4 + inpos] - in [4 + inpos - 1] ) >>> ( 13 - 1 ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 1 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 14 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 27 ) - ; - out[ 3 + outpos] = ( in[ 7 + inpos] - in [7 + inpos - 1] ) >>> ( 13 - 8 ) - | ( ( in[ 8 + inpos] - in [8 + inpos - 1] ) << 8 ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 21 ) - ; - out[ 4 + outpos] = ( in[ 9 + inpos] - in [9 + inpos - 1] ) >>> ( 13 - 2 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 2 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 15 ) - | ( ( in[ 12 + inpos] - in [12 + inpos - 1] ) << 28 ) - ; - out[ 5 + outpos] = ( in[ 12 + inpos] - in [12 + inpos - 1] ) >>> ( 13 - 9 ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 9 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 22 ) - ; - out[ 6 + outpos] = ( in[ 14 + inpos] - in [14 + inpos - 1] ) >>> ( 13 - 3 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 3 ) - | ( ( in[ 16 + inpos] - in [16 + inpos - 1] ) << 16 ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 29 ) - ; - out[ 7 + outpos] = ( in[ 17 + inpos] - in [17 + inpos - 1] ) >>> ( 13 - 10 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 10 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 23 ) - ; - out[ 8 + outpos] = ( in[ 19 + inpos] - in [19 + inpos - 1] ) >>> ( 13 - 4 ) - | ( ( in[ 20 + inpos] - in [20 + inpos - 1] ) << 4 ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 17 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 30 ) - ; - out[ 9 + outpos] = ( in[ 22 + inpos] - in [22 + inpos - 1] ) >>> ( 13 - 11 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 11 ) - | ( ( in[ 24 + inpos] - in [24 + inpos - 1] ) << 24 ) - ; - out[ 10 + outpos] = ( in[ 24 + inpos] - in [24 + inpos - 1] ) >>> ( 13 - 5 ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 5 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 18 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 31 ) - ; - out[ 11 + outpos] = ( in[ 27 + inpos] - in [27 + inpos - 1] ) >>> ( 13 - 12 ) - | ( ( in[ 28 + inpos] - in [28 + inpos - 1] ) << 12 ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 25 ) - ; - out[ 12 + outpos] = ( in[ 29 + inpos] - in [29 + inpos - 1] ) >>> ( 13 - 6 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 6 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 19 ) - ; -} - - - - -public static void integratedpack14(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 14 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 28 ) - ; - out[ 1 + outpos] = ( in[ 2 + inpos] - in [2 + inpos - 1] ) >>> ( 14 - 10 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 10 ) - | ( ( in[ 4 + inpos] - in [4 + inpos - 1] ) << 24 ) - ; - out[ 2 + outpos] = ( in[ 4 + inpos] - in [4 + inpos - 1] ) >>> ( 14 - 6 ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 6 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 20 ) - ; - out[ 3 + outpos] = ( in[ 6 + inpos] - in [6 + inpos - 1] ) >>> ( 14 - 2 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 2 ) - | ( ( in[ 8 + inpos] - in [8 + inpos - 1] ) << 16 ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 30 ) - ; - out[ 4 + outpos] = ( in[ 9 + inpos] - in [9 + inpos - 1] ) >>> ( 14 - 12 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 12 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 26 ) - ; - out[ 5 + outpos] = ( in[ 11 + inpos] - in [11 + inpos - 1] ) >>> ( 14 - 8 ) - | ( ( in[ 12 + inpos] - in [12 + inpos - 1] ) << 8 ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 22 ) - ; - out[ 6 + outpos] = ( in[ 13 + inpos] - in [13 + inpos - 1] ) >>> ( 14 - 4 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 4 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 18 ) - ; - out[ 7 + outpos] = (in[ 16 + inpos] - in [16 + inpos - 1] ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 14 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 28 ) - ; - out[ 8 + outpos] = ( in[ 18 + inpos] - in [18 + inpos - 1] ) >>> ( 14 - 10 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 10 ) - | ( ( in[ 20 + inpos] - in [20 + inpos - 1] ) << 24 ) - ; - out[ 9 + outpos] = ( in[ 20 + inpos] - in [20 + inpos - 1] ) >>> ( 14 - 6 ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 6 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 20 ) - ; - out[ 10 + outpos] = ( in[ 22 + inpos] - in [22 + inpos - 1] ) >>> ( 14 - 2 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 2 ) - | ( ( in[ 24 + inpos] - in [24 + inpos - 1] ) << 16 ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 30 ) - ; - out[ 11 + outpos] = ( in[ 25 + inpos] - in [25 + inpos - 1] ) >>> ( 14 - 12 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 12 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 26 ) - ; - out[ 12 + outpos] = ( in[ 27 + inpos] - in [27 + inpos - 1] ) >>> ( 14 - 8 ) - | ( ( in[ 28 + inpos] - in [28 + inpos - 1] ) << 8 ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 22 ) - ; - out[ 13 + outpos] = ( in[ 29 + inpos] - in [29 + inpos - 1] ) >>> ( 14 - 4 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 4 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 18 ) - ; -} - - - - -public static void integratedpack15(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 15 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 30 ) - ; - out[ 1 + outpos] = ( in[ 2 + inpos] - in [2 + inpos - 1] ) >>> ( 15 - 13 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 13 ) - | ( ( in[ 4 + inpos] - in [4 + inpos - 1] ) << 28 ) - ; - out[ 2 + outpos] = ( in[ 4 + inpos] - in [4 + inpos - 1] ) >>> ( 15 - 11 ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 11 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 26 ) - ; - out[ 3 + outpos] = ( in[ 6 + inpos] - in [6 + inpos - 1] ) >>> ( 15 - 9 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 9 ) - | ( ( in[ 8 + inpos] - in [8 + inpos - 1] ) << 24 ) - ; - out[ 4 + outpos] = ( in[ 8 + inpos] - in [8 + inpos - 1] ) >>> ( 15 - 7 ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 7 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 22 ) - ; - out[ 5 + outpos] = ( in[ 10 + inpos] - in [10 + inpos - 1] ) >>> ( 15 - 5 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 5 ) - | ( ( in[ 12 + inpos] - in [12 + inpos - 1] ) << 20 ) - ; - out[ 6 + outpos] = ( in[ 12 + inpos] - in [12 + inpos - 1] ) >>> ( 15 - 3 ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 3 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 18 ) - ; - out[ 7 + outpos] = ( in[ 14 + inpos] - in [14 + inpos - 1] ) >>> ( 15 - 1 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 1 ) - | ( ( in[ 16 + inpos] - in [16 + inpos - 1] ) << 16 ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 31 ) - ; - out[ 8 + outpos] = ( in[ 17 + inpos] - in [17 + inpos - 1] ) >>> ( 15 - 14 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 14 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 29 ) - ; - out[ 9 + outpos] = ( in[ 19 + inpos] - in [19 + inpos - 1] ) >>> ( 15 - 12 ) - | ( ( in[ 20 + inpos] - in [20 + inpos - 1] ) << 12 ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 27 ) - ; - out[ 10 + outpos] = ( in[ 21 + inpos] - in [21 + inpos - 1] ) >>> ( 15 - 10 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 10 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 25 ) - ; - out[ 11 + outpos] = ( in[ 23 + inpos] - in [23 + inpos - 1] ) >>> ( 15 - 8 ) - | ( ( in[ 24 + inpos] - in [24 + inpos - 1] ) << 8 ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 23 ) - ; - out[ 12 + outpos] = ( in[ 25 + inpos] - in [25 + inpos - 1] ) >>> ( 15 - 6 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 6 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 21 ) - ; - out[ 13 + outpos] = ( in[ 27 + inpos] - in [27 + inpos - 1] ) >>> ( 15 - 4 ) - | ( ( in[ 28 + inpos] - in [28 + inpos - 1] ) << 4 ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 19 ) - ; - out[ 14 + outpos] = ( in[ 29 + inpos] - in [29 + inpos - 1] ) >>> ( 15 - 2 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 2 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 17 ) - ; -} - - - - -public static void integratedpack16(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 16 ) - ; - out[ 1 + outpos] = (in[ 2 + inpos] - in [2 + inpos - 1] ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 16 ) - ; - out[ 2 + outpos] = (in[ 4 + inpos] - in [4 + inpos - 1] ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 16 ) - ; - out[ 3 + outpos] = (in[ 6 + inpos] - in [6 + inpos - 1] ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 16 ) - ; - out[ 4 + outpos] = (in[ 8 + inpos] - in [8 + inpos - 1] ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 16 ) - ; - out[ 5 + outpos] = (in[ 10 + inpos] - in [10 + inpos - 1] ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 16 ) - ; - out[ 6 + outpos] = (in[ 12 + inpos] - in [12 + inpos - 1] ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 16 ) - ; - out[ 7 + outpos] = (in[ 14 + inpos] - in [14 + inpos - 1] ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 16 ) - ; - out[ 8 + outpos] = (in[ 16 + inpos] - in [16 + inpos - 1] ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 16 ) - ; - out[ 9 + outpos] = (in[ 18 + inpos] - in [18 + inpos - 1] ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 16 ) - ; - out[ 10 + outpos] = (in[ 20 + inpos] - in [20 + inpos - 1] ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 16 ) - ; - out[ 11 + outpos] = (in[ 22 + inpos] - in [22 + inpos - 1] ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 16 ) - ; - out[ 12 + outpos] = (in[ 24 + inpos] - in [24 + inpos - 1] ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 16 ) - ; - out[ 13 + outpos] = (in[ 26 + inpos] - in [26 + inpos - 1] ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 16 ) - ; - out[ 14 + outpos] = (in[ 28 + inpos] - in [28 + inpos - 1] ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 16 ) - ; - out[ 15 + outpos] = (in[ 30 + inpos] - in [30 + inpos - 1] ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 16 ) - ; -} - - - - -public static void integratedpack17(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 17 ) - ; - out[ 1 + outpos] = ( in[ 1 + inpos] - in [1 + inpos - 1] ) >>> ( 17 - 2 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 2 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 19 ) - ; - out[ 2 + outpos] = ( in[ 3 + inpos] - in [3 + inpos - 1] ) >>> ( 17 - 4 ) - | ( ( in[ 4 + inpos] - in [4 + inpos - 1] ) << 4 ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 21 ) - ; - out[ 3 + outpos] = ( in[ 5 + inpos] - in [5 + inpos - 1] ) >>> ( 17 - 6 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 6 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 23 ) - ; - out[ 4 + outpos] = ( in[ 7 + inpos] - in [7 + inpos - 1] ) >>> ( 17 - 8 ) - | ( ( in[ 8 + inpos] - in [8 + inpos - 1] ) << 8 ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 25 ) - ; - out[ 5 + outpos] = ( in[ 9 + inpos] - in [9 + inpos - 1] ) >>> ( 17 - 10 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 10 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 27 ) - ; - out[ 6 + outpos] = ( in[ 11 + inpos] - in [11 + inpos - 1] ) >>> ( 17 - 12 ) - | ( ( in[ 12 + inpos] - in [12 + inpos - 1] ) << 12 ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 29 ) - ; - out[ 7 + outpos] = ( in[ 13 + inpos] - in [13 + inpos - 1] ) >>> ( 17 - 14 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 14 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 31 ) - ; - out[ 8 + outpos] = ( in[ 15 + inpos] - in [15 + inpos - 1] ) >>> ( 17 - 16 ) - | ( ( in[ 16 + inpos] - in [16 + inpos - 1] ) << 16 ) - ; - out[ 9 + outpos] = ( in[ 16 + inpos] - in [16 + inpos - 1] ) >>> ( 17 - 1 ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 1 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 18 ) - ; - out[ 10 + outpos] = ( in[ 18 + inpos] - in [18 + inpos - 1] ) >>> ( 17 - 3 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 3 ) - | ( ( in[ 20 + inpos] - in [20 + inpos - 1] ) << 20 ) - ; - out[ 11 + outpos] = ( in[ 20 + inpos] - in [20 + inpos - 1] ) >>> ( 17 - 5 ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 5 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 22 ) - ; - out[ 12 + outpos] = ( in[ 22 + inpos] - in [22 + inpos - 1] ) >>> ( 17 - 7 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 7 ) - | ( ( in[ 24 + inpos] - in [24 + inpos - 1] ) << 24 ) - ; - out[ 13 + outpos] = ( in[ 24 + inpos] - in [24 + inpos - 1] ) >>> ( 17 - 9 ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 9 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 26 ) - ; - out[ 14 + outpos] = ( in[ 26 + inpos] - in [26 + inpos - 1] ) >>> ( 17 - 11 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 11 ) - | ( ( in[ 28 + inpos] - in [28 + inpos - 1] ) << 28 ) - ; - out[ 15 + outpos] = ( in[ 28 + inpos] - in [28 + inpos - 1] ) >>> ( 17 - 13 ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 13 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 30 ) - ; - out[ 16 + outpos] = ( in[ 30 + inpos] - in [30 + inpos - 1] ) >>> ( 17 - 15 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 15 ) - ; -} - - - - -public static void integratedpack18(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 18 ) - ; - out[ 1 + outpos] = ( in[ 1 + inpos] - in [1 + inpos - 1] ) >>> ( 18 - 4 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 4 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 22 ) - ; - out[ 2 + outpos] = ( in[ 3 + inpos] - in [3 + inpos - 1] ) >>> ( 18 - 8 ) - | ( ( in[ 4 + inpos] - in [4 + inpos - 1] ) << 8 ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 26 ) - ; - out[ 3 + outpos] = ( in[ 5 + inpos] - in [5 + inpos - 1] ) >>> ( 18 - 12 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 12 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 30 ) - ; - out[ 4 + outpos] = ( in[ 7 + inpos] - in [7 + inpos - 1] ) >>> ( 18 - 16 ) - | ( ( in[ 8 + inpos] - in [8 + inpos - 1] ) << 16 ) - ; - out[ 5 + outpos] = ( in[ 8 + inpos] - in [8 + inpos - 1] ) >>> ( 18 - 2 ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 2 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 20 ) - ; - out[ 6 + outpos] = ( in[ 10 + inpos] - in [10 + inpos - 1] ) >>> ( 18 - 6 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 6 ) - | ( ( in[ 12 + inpos] - in [12 + inpos - 1] ) << 24 ) - ; - out[ 7 + outpos] = ( in[ 12 + inpos] - in [12 + inpos - 1] ) >>> ( 18 - 10 ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 10 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 28 ) - ; - out[ 8 + outpos] = ( in[ 14 + inpos] - in [14 + inpos - 1] ) >>> ( 18 - 14 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 14 ) - ; - out[ 9 + outpos] = (in[ 16 + inpos] - in [16 + inpos - 1] ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 18 ) - ; - out[ 10 + outpos] = ( in[ 17 + inpos] - in [17 + inpos - 1] ) >>> ( 18 - 4 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 4 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 22 ) - ; - out[ 11 + outpos] = ( in[ 19 + inpos] - in [19 + inpos - 1] ) >>> ( 18 - 8 ) - | ( ( in[ 20 + inpos] - in [20 + inpos - 1] ) << 8 ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 26 ) - ; - out[ 12 + outpos] = ( in[ 21 + inpos] - in [21 + inpos - 1] ) >>> ( 18 - 12 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 12 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 30 ) - ; - out[ 13 + outpos] = ( in[ 23 + inpos] - in [23 + inpos - 1] ) >>> ( 18 - 16 ) - | ( ( in[ 24 + inpos] - in [24 + inpos - 1] ) << 16 ) - ; - out[ 14 + outpos] = ( in[ 24 + inpos] - in [24 + inpos - 1] ) >>> ( 18 - 2 ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 2 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 20 ) - ; - out[ 15 + outpos] = ( in[ 26 + inpos] - in [26 + inpos - 1] ) >>> ( 18 - 6 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 6 ) - | ( ( in[ 28 + inpos] - in [28 + inpos - 1] ) << 24 ) - ; - out[ 16 + outpos] = ( in[ 28 + inpos] - in [28 + inpos - 1] ) >>> ( 18 - 10 ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 10 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 28 ) - ; - out[ 17 + outpos] = ( in[ 30 + inpos] - in [30 + inpos - 1] ) >>> ( 18 - 14 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 14 ) - ; -} - - - - -public static void integratedpack19(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 19 ) - ; - out[ 1 + outpos] = ( in[ 1 + inpos] - in [1 + inpos - 1] ) >>> ( 19 - 6 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 6 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 25 ) - ; - out[ 2 + outpos] = ( in[ 3 + inpos] - in [3 + inpos - 1] ) >>> ( 19 - 12 ) - | ( ( in[ 4 + inpos] - in [4 + inpos - 1] ) << 12 ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 31 ) - ; - out[ 3 + outpos] = ( in[ 5 + inpos] - in [5 + inpos - 1] ) >>> ( 19 - 18 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 18 ) - ; - out[ 4 + outpos] = ( in[ 6 + inpos] - in [6 + inpos - 1] ) >>> ( 19 - 5 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 5 ) - | ( ( in[ 8 + inpos] - in [8 + inpos - 1] ) << 24 ) - ; - out[ 5 + outpos] = ( in[ 8 + inpos] - in [8 + inpos - 1] ) >>> ( 19 - 11 ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 11 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 30 ) - ; - out[ 6 + outpos] = ( in[ 10 + inpos] - in [10 + inpos - 1] ) >>> ( 19 - 17 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 17 ) - ; - out[ 7 + outpos] = ( in[ 11 + inpos] - in [11 + inpos - 1] ) >>> ( 19 - 4 ) - | ( ( in[ 12 + inpos] - in [12 + inpos - 1] ) << 4 ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 23 ) - ; - out[ 8 + outpos] = ( in[ 13 + inpos] - in [13 + inpos - 1] ) >>> ( 19 - 10 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 10 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 29 ) - ; - out[ 9 + outpos] = ( in[ 15 + inpos] - in [15 + inpos - 1] ) >>> ( 19 - 16 ) - | ( ( in[ 16 + inpos] - in [16 + inpos - 1] ) << 16 ) - ; - out[ 10 + outpos] = ( in[ 16 + inpos] - in [16 + inpos - 1] ) >>> ( 19 - 3 ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 3 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 22 ) - ; - out[ 11 + outpos] = ( in[ 18 + inpos] - in [18 + inpos - 1] ) >>> ( 19 - 9 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 9 ) - | ( ( in[ 20 + inpos] - in [20 + inpos - 1] ) << 28 ) - ; - out[ 12 + outpos] = ( in[ 20 + inpos] - in [20 + inpos - 1] ) >>> ( 19 - 15 ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 15 ) - ; - out[ 13 + outpos] = ( in[ 21 + inpos] - in [21 + inpos - 1] ) >>> ( 19 - 2 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 2 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 21 ) - ; - out[ 14 + outpos] = ( in[ 23 + inpos] - in [23 + inpos - 1] ) >>> ( 19 - 8 ) - | ( ( in[ 24 + inpos] - in [24 + inpos - 1] ) << 8 ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 27 ) - ; - out[ 15 + outpos] = ( in[ 25 + inpos] - in [25 + inpos - 1] ) >>> ( 19 - 14 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 14 ) - ; - out[ 16 + outpos] = ( in[ 26 + inpos] - in [26 + inpos - 1] ) >>> ( 19 - 1 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 1 ) - | ( ( in[ 28 + inpos] - in [28 + inpos - 1] ) << 20 ) - ; - out[ 17 + outpos] = ( in[ 28 + inpos] - in [28 + inpos - 1] ) >>> ( 19 - 7 ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 7 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 26 ) - ; - out[ 18 + outpos] = ( in[ 30 + inpos] - in [30 + inpos - 1] ) >>> ( 19 - 13 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 13 ) - ; -} - - - - -public static void integratedpack20(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 20 ) - ; - out[ 1 + outpos] = ( in[ 1 + inpos] - in [1 + inpos - 1] ) >>> ( 20 - 8 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 8 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 28 ) - ; - out[ 2 + outpos] = ( in[ 3 + inpos] - in [3 + inpos - 1] ) >>> ( 20 - 16 ) - | ( ( in[ 4 + inpos] - in [4 + inpos - 1] ) << 16 ) - ; - out[ 3 + outpos] = ( in[ 4 + inpos] - in [4 + inpos - 1] ) >>> ( 20 - 4 ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 4 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 24 ) - ; - out[ 4 + outpos] = ( in[ 6 + inpos] - in [6 + inpos - 1] ) >>> ( 20 - 12 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 12 ) - ; - out[ 5 + outpos] = (in[ 8 + inpos] - in [8 + inpos - 1] ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 20 ) - ; - out[ 6 + outpos] = ( in[ 9 + inpos] - in [9 + inpos - 1] ) >>> ( 20 - 8 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 8 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 28 ) - ; - out[ 7 + outpos] = ( in[ 11 + inpos] - in [11 + inpos - 1] ) >>> ( 20 - 16 ) - | ( ( in[ 12 + inpos] - in [12 + inpos - 1] ) << 16 ) - ; - out[ 8 + outpos] = ( in[ 12 + inpos] - in [12 + inpos - 1] ) >>> ( 20 - 4 ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 4 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 24 ) - ; - out[ 9 + outpos] = ( in[ 14 + inpos] - in [14 + inpos - 1] ) >>> ( 20 - 12 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 12 ) - ; - out[ 10 + outpos] = (in[ 16 + inpos] - in [16 + inpos - 1] ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 20 ) - ; - out[ 11 + outpos] = ( in[ 17 + inpos] - in [17 + inpos - 1] ) >>> ( 20 - 8 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 8 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 28 ) - ; - out[ 12 + outpos] = ( in[ 19 + inpos] - in [19 + inpos - 1] ) >>> ( 20 - 16 ) - | ( ( in[ 20 + inpos] - in [20 + inpos - 1] ) << 16 ) - ; - out[ 13 + outpos] = ( in[ 20 + inpos] - in [20 + inpos - 1] ) >>> ( 20 - 4 ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 4 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 24 ) - ; - out[ 14 + outpos] = ( in[ 22 + inpos] - in [22 + inpos - 1] ) >>> ( 20 - 12 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 12 ) - ; - out[ 15 + outpos] = (in[ 24 + inpos] - in [24 + inpos - 1] ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 20 ) - ; - out[ 16 + outpos] = ( in[ 25 + inpos] - in [25 + inpos - 1] ) >>> ( 20 - 8 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 8 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 28 ) - ; - out[ 17 + outpos] = ( in[ 27 + inpos] - in [27 + inpos - 1] ) >>> ( 20 - 16 ) - | ( ( in[ 28 + inpos] - in [28 + inpos - 1] ) << 16 ) - ; - out[ 18 + outpos] = ( in[ 28 + inpos] - in [28 + inpos - 1] ) >>> ( 20 - 4 ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 4 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 24 ) - ; - out[ 19 + outpos] = ( in[ 30 + inpos] - in [30 + inpos - 1] ) >>> ( 20 - 12 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 12 ) - ; -} - - - - -public static void integratedpack21(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 21 ) - ; - out[ 1 + outpos] = ( in[ 1 + inpos] - in [1 + inpos - 1] ) >>> ( 21 - 10 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 10 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 31 ) - ; - out[ 2 + outpos] = ( in[ 3 + inpos] - in [3 + inpos - 1] ) >>> ( 21 - 20 ) - | ( ( in[ 4 + inpos] - in [4 + inpos - 1] ) << 20 ) - ; - out[ 3 + outpos] = ( in[ 4 + inpos] - in [4 + inpos - 1] ) >>> ( 21 - 9 ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 9 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 30 ) - ; - out[ 4 + outpos] = ( in[ 6 + inpos] - in [6 + inpos - 1] ) >>> ( 21 - 19 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 19 ) - ; - out[ 5 + outpos] = ( in[ 7 + inpos] - in [7 + inpos - 1] ) >>> ( 21 - 8 ) - | ( ( in[ 8 + inpos] - in [8 + inpos - 1] ) << 8 ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 29 ) - ; - out[ 6 + outpos] = ( in[ 9 + inpos] - in [9 + inpos - 1] ) >>> ( 21 - 18 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 18 ) - ; - out[ 7 + outpos] = ( in[ 10 + inpos] - in [10 + inpos - 1] ) >>> ( 21 - 7 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 7 ) - | ( ( in[ 12 + inpos] - in [12 + inpos - 1] ) << 28 ) - ; - out[ 8 + outpos] = ( in[ 12 + inpos] - in [12 + inpos - 1] ) >>> ( 21 - 17 ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 17 ) - ; - out[ 9 + outpos] = ( in[ 13 + inpos] - in [13 + inpos - 1] ) >>> ( 21 - 6 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 6 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 27 ) - ; - out[ 10 + outpos] = ( in[ 15 + inpos] - in [15 + inpos - 1] ) >>> ( 21 - 16 ) - | ( ( in[ 16 + inpos] - in [16 + inpos - 1] ) << 16 ) - ; - out[ 11 + outpos] = ( in[ 16 + inpos] - in [16 + inpos - 1] ) >>> ( 21 - 5 ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 5 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 26 ) - ; - out[ 12 + outpos] = ( in[ 18 + inpos] - in [18 + inpos - 1] ) >>> ( 21 - 15 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 15 ) - ; - out[ 13 + outpos] = ( in[ 19 + inpos] - in [19 + inpos - 1] ) >>> ( 21 - 4 ) - | ( ( in[ 20 + inpos] - in [20 + inpos - 1] ) << 4 ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 25 ) - ; - out[ 14 + outpos] = ( in[ 21 + inpos] - in [21 + inpos - 1] ) >>> ( 21 - 14 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 14 ) - ; - out[ 15 + outpos] = ( in[ 22 + inpos] - in [22 + inpos - 1] ) >>> ( 21 - 3 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 3 ) - | ( ( in[ 24 + inpos] - in [24 + inpos - 1] ) << 24 ) - ; - out[ 16 + outpos] = ( in[ 24 + inpos] - in [24 + inpos - 1] ) >>> ( 21 - 13 ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 13 ) - ; - out[ 17 + outpos] = ( in[ 25 + inpos] - in [25 + inpos - 1] ) >>> ( 21 - 2 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 2 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 23 ) - ; - out[ 18 + outpos] = ( in[ 27 + inpos] - in [27 + inpos - 1] ) >>> ( 21 - 12 ) - | ( ( in[ 28 + inpos] - in [28 + inpos - 1] ) << 12 ) - ; - out[ 19 + outpos] = ( in[ 28 + inpos] - in [28 + inpos - 1] ) >>> ( 21 - 1 ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 1 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 22 ) - ; - out[ 20 + outpos] = ( in[ 30 + inpos] - in [30 + inpos - 1] ) >>> ( 21 - 11 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 11 ) - ; -} - - - - -public static void integratedpack22(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 22 ) - ; - out[ 1 + outpos] = ( in[ 1 + inpos] - in [1 + inpos - 1] ) >>> ( 22 - 12 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 12 ) - ; - out[ 2 + outpos] = ( in[ 2 + inpos] - in [2 + inpos - 1] ) >>> ( 22 - 2 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 2 ) - | ( ( in[ 4 + inpos] - in [4 + inpos - 1] ) << 24 ) - ; - out[ 3 + outpos] = ( in[ 4 + inpos] - in [4 + inpos - 1] ) >>> ( 22 - 14 ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 14 ) - ; - out[ 4 + outpos] = ( in[ 5 + inpos] - in [5 + inpos - 1] ) >>> ( 22 - 4 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 4 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 26 ) - ; - out[ 5 + outpos] = ( in[ 7 + inpos] - in [7 + inpos - 1] ) >>> ( 22 - 16 ) - | ( ( in[ 8 + inpos] - in [8 + inpos - 1] ) << 16 ) - ; - out[ 6 + outpos] = ( in[ 8 + inpos] - in [8 + inpos - 1] ) >>> ( 22 - 6 ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 6 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 28 ) - ; - out[ 7 + outpos] = ( in[ 10 + inpos] - in [10 + inpos - 1] ) >>> ( 22 - 18 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 18 ) - ; - out[ 8 + outpos] = ( in[ 11 + inpos] - in [11 + inpos - 1] ) >>> ( 22 - 8 ) - | ( ( in[ 12 + inpos] - in [12 + inpos - 1] ) << 8 ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 30 ) - ; - out[ 9 + outpos] = ( in[ 13 + inpos] - in [13 + inpos - 1] ) >>> ( 22 - 20 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 20 ) - ; - out[ 10 + outpos] = ( in[ 14 + inpos] - in [14 + inpos - 1] ) >>> ( 22 - 10 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 10 ) - ; - out[ 11 + outpos] = (in[ 16 + inpos] - in [16 + inpos - 1] ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 22 ) - ; - out[ 12 + outpos] = ( in[ 17 + inpos] - in [17 + inpos - 1] ) >>> ( 22 - 12 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 12 ) - ; - out[ 13 + outpos] = ( in[ 18 + inpos] - in [18 + inpos - 1] ) >>> ( 22 - 2 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 2 ) - | ( ( in[ 20 + inpos] - in [20 + inpos - 1] ) << 24 ) - ; - out[ 14 + outpos] = ( in[ 20 + inpos] - in [20 + inpos - 1] ) >>> ( 22 - 14 ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 14 ) - ; - out[ 15 + outpos] = ( in[ 21 + inpos] - in [21 + inpos - 1] ) >>> ( 22 - 4 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 4 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 26 ) - ; - out[ 16 + outpos] = ( in[ 23 + inpos] - in [23 + inpos - 1] ) >>> ( 22 - 16 ) - | ( ( in[ 24 + inpos] - in [24 + inpos - 1] ) << 16 ) - ; - out[ 17 + outpos] = ( in[ 24 + inpos] - in [24 + inpos - 1] ) >>> ( 22 - 6 ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 6 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 28 ) - ; - out[ 18 + outpos] = ( in[ 26 + inpos] - in [26 + inpos - 1] ) >>> ( 22 - 18 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 18 ) - ; - out[ 19 + outpos] = ( in[ 27 + inpos] - in [27 + inpos - 1] ) >>> ( 22 - 8 ) - | ( ( in[ 28 + inpos] - in [28 + inpos - 1] ) << 8 ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 30 ) - ; - out[ 20 + outpos] = ( in[ 29 + inpos] - in [29 + inpos - 1] ) >>> ( 22 - 20 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 20 ) - ; - out[ 21 + outpos] = ( in[ 30 + inpos] - in [30 + inpos - 1] ) >>> ( 22 - 10 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 10 ) - ; -} - - - - -public static void integratedpack23(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 23 ) - ; - out[ 1 + outpos] = ( in[ 1 + inpos] - in [1 + inpos - 1] ) >>> ( 23 - 14 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 14 ) - ; - out[ 2 + outpos] = ( in[ 2 + inpos] - in [2 + inpos - 1] ) >>> ( 23 - 5 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 5 ) - | ( ( in[ 4 + inpos] - in [4 + inpos - 1] ) << 28 ) - ; - out[ 3 + outpos] = ( in[ 4 + inpos] - in [4 + inpos - 1] ) >>> ( 23 - 19 ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 19 ) - ; - out[ 4 + outpos] = ( in[ 5 + inpos] - in [5 + inpos - 1] ) >>> ( 23 - 10 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 10 ) - ; - out[ 5 + outpos] = ( in[ 6 + inpos] - in [6 + inpos - 1] ) >>> ( 23 - 1 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 1 ) - | ( ( in[ 8 + inpos] - in [8 + inpos - 1] ) << 24 ) - ; - out[ 6 + outpos] = ( in[ 8 + inpos] - in [8 + inpos - 1] ) >>> ( 23 - 15 ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 15 ) - ; - out[ 7 + outpos] = ( in[ 9 + inpos] - in [9 + inpos - 1] ) >>> ( 23 - 6 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 6 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 29 ) - ; - out[ 8 + outpos] = ( in[ 11 + inpos] - in [11 + inpos - 1] ) >>> ( 23 - 20 ) - | ( ( in[ 12 + inpos] - in [12 + inpos - 1] ) << 20 ) - ; - out[ 9 + outpos] = ( in[ 12 + inpos] - in [12 + inpos - 1] ) >>> ( 23 - 11 ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 11 ) - ; - out[ 10 + outpos] = ( in[ 13 + inpos] - in [13 + inpos - 1] ) >>> ( 23 - 2 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 2 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 25 ) - ; - out[ 11 + outpos] = ( in[ 15 + inpos] - in [15 + inpos - 1] ) >>> ( 23 - 16 ) - | ( ( in[ 16 + inpos] - in [16 + inpos - 1] ) << 16 ) - ; - out[ 12 + outpos] = ( in[ 16 + inpos] - in [16 + inpos - 1] ) >>> ( 23 - 7 ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 7 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 30 ) - ; - out[ 13 + outpos] = ( in[ 18 + inpos] - in [18 + inpos - 1] ) >>> ( 23 - 21 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 21 ) - ; - out[ 14 + outpos] = ( in[ 19 + inpos] - in [19 + inpos - 1] ) >>> ( 23 - 12 ) - | ( ( in[ 20 + inpos] - in [20 + inpos - 1] ) << 12 ) - ; - out[ 15 + outpos] = ( in[ 20 + inpos] - in [20 + inpos - 1] ) >>> ( 23 - 3 ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 3 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 26 ) - ; - out[ 16 + outpos] = ( in[ 22 + inpos] - in [22 + inpos - 1] ) >>> ( 23 - 17 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 17 ) - ; - out[ 17 + outpos] = ( in[ 23 + inpos] - in [23 + inpos - 1] ) >>> ( 23 - 8 ) - | ( ( in[ 24 + inpos] - in [24 + inpos - 1] ) << 8 ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 31 ) - ; - out[ 18 + outpos] = ( in[ 25 + inpos] - in [25 + inpos - 1] ) >>> ( 23 - 22 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 22 ) - ; - out[ 19 + outpos] = ( in[ 26 + inpos] - in [26 + inpos - 1] ) >>> ( 23 - 13 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 13 ) - ; - out[ 20 + outpos] = ( in[ 27 + inpos] - in [27 + inpos - 1] ) >>> ( 23 - 4 ) - | ( ( in[ 28 + inpos] - in [28 + inpos - 1] ) << 4 ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 27 ) - ; - out[ 21 + outpos] = ( in[ 29 + inpos] - in [29 + inpos - 1] ) >>> ( 23 - 18 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 18 ) - ; - out[ 22 + outpos] = ( in[ 30 + inpos] - in [30 + inpos - 1] ) >>> ( 23 - 9 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 9 ) - ; -} - - - - -public static void integratedpack24(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 24 ) - ; - out[ 1 + outpos] = ( in[ 1 + inpos] - in [1 + inpos - 1] ) >>> ( 24 - 16 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 16 ) - ; - out[ 2 + outpos] = ( in[ 2 + inpos] - in [2 + inpos - 1] ) >>> ( 24 - 8 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 8 ) - ; - out[ 3 + outpos] = (in[ 4 + inpos] - in [4 + inpos - 1] ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 24 ) - ; - out[ 4 + outpos] = ( in[ 5 + inpos] - in [5 + inpos - 1] ) >>> ( 24 - 16 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 16 ) - ; - out[ 5 + outpos] = ( in[ 6 + inpos] - in [6 + inpos - 1] ) >>> ( 24 - 8 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 8 ) - ; - out[ 6 + outpos] = (in[ 8 + inpos] - in [8 + inpos - 1] ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 24 ) - ; - out[ 7 + outpos] = ( in[ 9 + inpos] - in [9 + inpos - 1] ) >>> ( 24 - 16 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 16 ) - ; - out[ 8 + outpos] = ( in[ 10 + inpos] - in [10 + inpos - 1] ) >>> ( 24 - 8 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 8 ) - ; - out[ 9 + outpos] = (in[ 12 + inpos] - in [12 + inpos - 1] ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 24 ) - ; - out[ 10 + outpos] = ( in[ 13 + inpos] - in [13 + inpos - 1] ) >>> ( 24 - 16 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 16 ) - ; - out[ 11 + outpos] = ( in[ 14 + inpos] - in [14 + inpos - 1] ) >>> ( 24 - 8 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 8 ) - ; - out[ 12 + outpos] = (in[ 16 + inpos] - in [16 + inpos - 1] ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 24 ) - ; - out[ 13 + outpos] = ( in[ 17 + inpos] - in [17 + inpos - 1] ) >>> ( 24 - 16 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 16 ) - ; - out[ 14 + outpos] = ( in[ 18 + inpos] - in [18 + inpos - 1] ) >>> ( 24 - 8 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 8 ) - ; - out[ 15 + outpos] = (in[ 20 + inpos] - in [20 + inpos - 1] ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 24 ) - ; - out[ 16 + outpos] = ( in[ 21 + inpos] - in [21 + inpos - 1] ) >>> ( 24 - 16 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 16 ) - ; - out[ 17 + outpos] = ( in[ 22 + inpos] - in [22 + inpos - 1] ) >>> ( 24 - 8 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 8 ) - ; - out[ 18 + outpos] = (in[ 24 + inpos] - in [24 + inpos - 1] ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 24 ) - ; - out[ 19 + outpos] = ( in[ 25 + inpos] - in [25 + inpos - 1] ) >>> ( 24 - 16 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 16 ) - ; - out[ 20 + outpos] = ( in[ 26 + inpos] - in [26 + inpos - 1] ) >>> ( 24 - 8 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 8 ) - ; - out[ 21 + outpos] = (in[ 28 + inpos] - in [28 + inpos - 1] ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 24 ) - ; - out[ 22 + outpos] = ( in[ 29 + inpos] - in [29 + inpos - 1] ) >>> ( 24 - 16 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 16 ) - ; - out[ 23 + outpos] = ( in[ 30 + inpos] - in [30 + inpos - 1] ) >>> ( 24 - 8 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 8 ) - ; -} - - - - -public static void integratedpack25(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 25 ) - ; - out[ 1 + outpos] = ( in[ 1 + inpos] - in [1 + inpos - 1] ) >>> ( 25 - 18 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 18 ) - ; - out[ 2 + outpos] = ( in[ 2 + inpos] - in [2 + inpos - 1] ) >>> ( 25 - 11 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 11 ) - ; - out[ 3 + outpos] = ( in[ 3 + inpos] - in [3 + inpos - 1] ) >>> ( 25 - 4 ) - | ( ( in[ 4 + inpos] - in [4 + inpos - 1] ) << 4 ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 29 ) - ; - out[ 4 + outpos] = ( in[ 5 + inpos] - in [5 + inpos - 1] ) >>> ( 25 - 22 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 22 ) - ; - out[ 5 + outpos] = ( in[ 6 + inpos] - in [6 + inpos - 1] ) >>> ( 25 - 15 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 15 ) - ; - out[ 6 + outpos] = ( in[ 7 + inpos] - in [7 + inpos - 1] ) >>> ( 25 - 8 ) - | ( ( in[ 8 + inpos] - in [8 + inpos - 1] ) << 8 ) - ; - out[ 7 + outpos] = ( in[ 8 + inpos] - in [8 + inpos - 1] ) >>> ( 25 - 1 ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 1 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 26 ) - ; - out[ 8 + outpos] = ( in[ 10 + inpos] - in [10 + inpos - 1] ) >>> ( 25 - 19 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 19 ) - ; - out[ 9 + outpos] = ( in[ 11 + inpos] - in [11 + inpos - 1] ) >>> ( 25 - 12 ) - | ( ( in[ 12 + inpos] - in [12 + inpos - 1] ) << 12 ) - ; - out[ 10 + outpos] = ( in[ 12 + inpos] - in [12 + inpos - 1] ) >>> ( 25 - 5 ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 5 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 30 ) - ; - out[ 11 + outpos] = ( in[ 14 + inpos] - in [14 + inpos - 1] ) >>> ( 25 - 23 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 23 ) - ; - out[ 12 + outpos] = ( in[ 15 + inpos] - in [15 + inpos - 1] ) >>> ( 25 - 16 ) - | ( ( in[ 16 + inpos] - in [16 + inpos - 1] ) << 16 ) - ; - out[ 13 + outpos] = ( in[ 16 + inpos] - in [16 + inpos - 1] ) >>> ( 25 - 9 ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 9 ) - ; - out[ 14 + outpos] = ( in[ 17 + inpos] - in [17 + inpos - 1] ) >>> ( 25 - 2 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 2 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 27 ) - ; - out[ 15 + outpos] = ( in[ 19 + inpos] - in [19 + inpos - 1] ) >>> ( 25 - 20 ) - | ( ( in[ 20 + inpos] - in [20 + inpos - 1] ) << 20 ) - ; - out[ 16 + outpos] = ( in[ 20 + inpos] - in [20 + inpos - 1] ) >>> ( 25 - 13 ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 13 ) - ; - out[ 17 + outpos] = ( in[ 21 + inpos] - in [21 + inpos - 1] ) >>> ( 25 - 6 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 6 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 31 ) - ; - out[ 18 + outpos] = ( in[ 23 + inpos] - in [23 + inpos - 1] ) >>> ( 25 - 24 ) - | ( ( in[ 24 + inpos] - in [24 + inpos - 1] ) << 24 ) - ; - out[ 19 + outpos] = ( in[ 24 + inpos] - in [24 + inpos - 1] ) >>> ( 25 - 17 ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 17 ) - ; - out[ 20 + outpos] = ( in[ 25 + inpos] - in [25 + inpos - 1] ) >>> ( 25 - 10 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 10 ) - ; - out[ 21 + outpos] = ( in[ 26 + inpos] - in [26 + inpos - 1] ) >>> ( 25 - 3 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 3 ) - | ( ( in[ 28 + inpos] - in [28 + inpos - 1] ) << 28 ) - ; - out[ 22 + outpos] = ( in[ 28 + inpos] - in [28 + inpos - 1] ) >>> ( 25 - 21 ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 21 ) - ; - out[ 23 + outpos] = ( in[ 29 + inpos] - in [29 + inpos - 1] ) >>> ( 25 - 14 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 14 ) - ; - out[ 24 + outpos] = ( in[ 30 + inpos] - in [30 + inpos - 1] ) >>> ( 25 - 7 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 7 ) - ; -} - - - - -public static void integratedpack26(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 26 ) - ; - out[ 1 + outpos] = ( in[ 1 + inpos] - in [1 + inpos - 1] ) >>> ( 26 - 20 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 20 ) - ; - out[ 2 + outpos] = ( in[ 2 + inpos] - in [2 + inpos - 1] ) >>> ( 26 - 14 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 14 ) - ; - out[ 3 + outpos] = ( in[ 3 + inpos] - in [3 + inpos - 1] ) >>> ( 26 - 8 ) - | ( ( in[ 4 + inpos] - in [4 + inpos - 1] ) << 8 ) - ; - out[ 4 + outpos] = ( in[ 4 + inpos] - in [4 + inpos - 1] ) >>> ( 26 - 2 ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 2 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 28 ) - ; - out[ 5 + outpos] = ( in[ 6 + inpos] - in [6 + inpos - 1] ) >>> ( 26 - 22 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 22 ) - ; - out[ 6 + outpos] = ( in[ 7 + inpos] - in [7 + inpos - 1] ) >>> ( 26 - 16 ) - | ( ( in[ 8 + inpos] - in [8 + inpos - 1] ) << 16 ) - ; - out[ 7 + outpos] = ( in[ 8 + inpos] - in [8 + inpos - 1] ) >>> ( 26 - 10 ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 10 ) - ; - out[ 8 + outpos] = ( in[ 9 + inpos] - in [9 + inpos - 1] ) >>> ( 26 - 4 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 4 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 30 ) - ; - out[ 9 + outpos] = ( in[ 11 + inpos] - in [11 + inpos - 1] ) >>> ( 26 - 24 ) - | ( ( in[ 12 + inpos] - in [12 + inpos - 1] ) << 24 ) - ; - out[ 10 + outpos] = ( in[ 12 + inpos] - in [12 + inpos - 1] ) >>> ( 26 - 18 ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 18 ) - ; - out[ 11 + outpos] = ( in[ 13 + inpos] - in [13 + inpos - 1] ) >>> ( 26 - 12 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 12 ) - ; - out[ 12 + outpos] = ( in[ 14 + inpos] - in [14 + inpos - 1] ) >>> ( 26 - 6 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 6 ) - ; - out[ 13 + outpos] = (in[ 16 + inpos] - in [16 + inpos - 1] ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 26 ) - ; - out[ 14 + outpos] = ( in[ 17 + inpos] - in [17 + inpos - 1] ) >>> ( 26 - 20 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 20 ) - ; - out[ 15 + outpos] = ( in[ 18 + inpos] - in [18 + inpos - 1] ) >>> ( 26 - 14 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 14 ) - ; - out[ 16 + outpos] = ( in[ 19 + inpos] - in [19 + inpos - 1] ) >>> ( 26 - 8 ) - | ( ( in[ 20 + inpos] - in [20 + inpos - 1] ) << 8 ) - ; - out[ 17 + outpos] = ( in[ 20 + inpos] - in [20 + inpos - 1] ) >>> ( 26 - 2 ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 2 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 28 ) - ; - out[ 18 + outpos] = ( in[ 22 + inpos] - in [22 + inpos - 1] ) >>> ( 26 - 22 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 22 ) - ; - out[ 19 + outpos] = ( in[ 23 + inpos] - in [23 + inpos - 1] ) >>> ( 26 - 16 ) - | ( ( in[ 24 + inpos] - in [24 + inpos - 1] ) << 16 ) - ; - out[ 20 + outpos] = ( in[ 24 + inpos] - in [24 + inpos - 1] ) >>> ( 26 - 10 ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 10 ) - ; - out[ 21 + outpos] = ( in[ 25 + inpos] - in [25 + inpos - 1] ) >>> ( 26 - 4 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 4 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 30 ) - ; - out[ 22 + outpos] = ( in[ 27 + inpos] - in [27 + inpos - 1] ) >>> ( 26 - 24 ) - | ( ( in[ 28 + inpos] - in [28 + inpos - 1] ) << 24 ) - ; - out[ 23 + outpos] = ( in[ 28 + inpos] - in [28 + inpos - 1] ) >>> ( 26 - 18 ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 18 ) - ; - out[ 24 + outpos] = ( in[ 29 + inpos] - in [29 + inpos - 1] ) >>> ( 26 - 12 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 12 ) - ; - out[ 25 + outpos] = ( in[ 30 + inpos] - in [30 + inpos - 1] ) >>> ( 26 - 6 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 6 ) - ; -} - - - - -public static void integratedpack27(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 27 ) - ; - out[ 1 + outpos] = ( in[ 1 + inpos] - in [1 + inpos - 1] ) >>> ( 27 - 22 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 22 ) - ; - out[ 2 + outpos] = ( in[ 2 + inpos] - in [2 + inpos - 1] ) >>> ( 27 - 17 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 17 ) - ; - out[ 3 + outpos] = ( in[ 3 + inpos] - in [3 + inpos - 1] ) >>> ( 27 - 12 ) - | ( ( in[ 4 + inpos] - in [4 + inpos - 1] ) << 12 ) - ; - out[ 4 + outpos] = ( in[ 4 + inpos] - in [4 + inpos - 1] ) >>> ( 27 - 7 ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 7 ) - ; - out[ 5 + outpos] = ( in[ 5 + inpos] - in [5 + inpos - 1] ) >>> ( 27 - 2 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 2 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 29 ) - ; - out[ 6 + outpos] = ( in[ 7 + inpos] - in [7 + inpos - 1] ) >>> ( 27 - 24 ) - | ( ( in[ 8 + inpos] - in [8 + inpos - 1] ) << 24 ) - ; - out[ 7 + outpos] = ( in[ 8 + inpos] - in [8 + inpos - 1] ) >>> ( 27 - 19 ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 19 ) - ; - out[ 8 + outpos] = ( in[ 9 + inpos] - in [9 + inpos - 1] ) >>> ( 27 - 14 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 14 ) - ; - out[ 9 + outpos] = ( in[ 10 + inpos] - in [10 + inpos - 1] ) >>> ( 27 - 9 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 9 ) - ; - out[ 10 + outpos] = ( in[ 11 + inpos] - in [11 + inpos - 1] ) >>> ( 27 - 4 ) - | ( ( in[ 12 + inpos] - in [12 + inpos - 1] ) << 4 ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 31 ) - ; - out[ 11 + outpos] = ( in[ 13 + inpos] - in [13 + inpos - 1] ) >>> ( 27 - 26 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 26 ) - ; - out[ 12 + outpos] = ( in[ 14 + inpos] - in [14 + inpos - 1] ) >>> ( 27 - 21 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 21 ) - ; - out[ 13 + outpos] = ( in[ 15 + inpos] - in [15 + inpos - 1] ) >>> ( 27 - 16 ) - | ( ( in[ 16 + inpos] - in [16 + inpos - 1] ) << 16 ) - ; - out[ 14 + outpos] = ( in[ 16 + inpos] - in [16 + inpos - 1] ) >>> ( 27 - 11 ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 11 ) - ; - out[ 15 + outpos] = ( in[ 17 + inpos] - in [17 + inpos - 1] ) >>> ( 27 - 6 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 6 ) - ; - out[ 16 + outpos] = ( in[ 18 + inpos] - in [18 + inpos - 1] ) >>> ( 27 - 1 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 1 ) - | ( ( in[ 20 + inpos] - in [20 + inpos - 1] ) << 28 ) - ; - out[ 17 + outpos] = ( in[ 20 + inpos] - in [20 + inpos - 1] ) >>> ( 27 - 23 ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 23 ) - ; - out[ 18 + outpos] = ( in[ 21 + inpos] - in [21 + inpos - 1] ) >>> ( 27 - 18 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 18 ) - ; - out[ 19 + outpos] = ( in[ 22 + inpos] - in [22 + inpos - 1] ) >>> ( 27 - 13 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 13 ) - ; - out[ 20 + outpos] = ( in[ 23 + inpos] - in [23 + inpos - 1] ) >>> ( 27 - 8 ) - | ( ( in[ 24 + inpos] - in [24 + inpos - 1] ) << 8 ) - ; - out[ 21 + outpos] = ( in[ 24 + inpos] - in [24 + inpos - 1] ) >>> ( 27 - 3 ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 3 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 30 ) - ; - out[ 22 + outpos] = ( in[ 26 + inpos] - in [26 + inpos - 1] ) >>> ( 27 - 25 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 25 ) - ; - out[ 23 + outpos] = ( in[ 27 + inpos] - in [27 + inpos - 1] ) >>> ( 27 - 20 ) - | ( ( in[ 28 + inpos] - in [28 + inpos - 1] ) << 20 ) - ; - out[ 24 + outpos] = ( in[ 28 + inpos] - in [28 + inpos - 1] ) >>> ( 27 - 15 ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 15 ) - ; - out[ 25 + outpos] = ( in[ 29 + inpos] - in [29 + inpos - 1] ) >>> ( 27 - 10 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 10 ) - ; - out[ 26 + outpos] = ( in[ 30 + inpos] - in [30 + inpos - 1] ) >>> ( 27 - 5 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 5 ) - ; -} - - - - -public static void integratedpack28(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 28 ) - ; - out[ 1 + outpos] = ( in[ 1 + inpos] - in [1 + inpos - 1] ) >>> ( 28 - 24 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 24 ) - ; - out[ 2 + outpos] = ( in[ 2 + inpos] - in [2 + inpos - 1] ) >>> ( 28 - 20 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 20 ) - ; - out[ 3 + outpos] = ( in[ 3 + inpos] - in [3 + inpos - 1] ) >>> ( 28 - 16 ) - | ( ( in[ 4 + inpos] - in [4 + inpos - 1] ) << 16 ) - ; - out[ 4 + outpos] = ( in[ 4 + inpos] - in [4 + inpos - 1] ) >>> ( 28 - 12 ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 12 ) - ; - out[ 5 + outpos] = ( in[ 5 + inpos] - in [5 + inpos - 1] ) >>> ( 28 - 8 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 8 ) - ; - out[ 6 + outpos] = ( in[ 6 + inpos] - in [6 + inpos - 1] ) >>> ( 28 - 4 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 4 ) - ; - out[ 7 + outpos] = (in[ 8 + inpos] - in [8 + inpos - 1] ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 28 ) - ; - out[ 8 + outpos] = ( in[ 9 + inpos] - in [9 + inpos - 1] ) >>> ( 28 - 24 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 24 ) - ; - out[ 9 + outpos] = ( in[ 10 + inpos] - in [10 + inpos - 1] ) >>> ( 28 - 20 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 20 ) - ; - out[ 10 + outpos] = ( in[ 11 + inpos] - in [11 + inpos - 1] ) >>> ( 28 - 16 ) - | ( ( in[ 12 + inpos] - in [12 + inpos - 1] ) << 16 ) - ; - out[ 11 + outpos] = ( in[ 12 + inpos] - in [12 + inpos - 1] ) >>> ( 28 - 12 ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 12 ) - ; - out[ 12 + outpos] = ( in[ 13 + inpos] - in [13 + inpos - 1] ) >>> ( 28 - 8 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 8 ) - ; - out[ 13 + outpos] = ( in[ 14 + inpos] - in [14 + inpos - 1] ) >>> ( 28 - 4 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 4 ) - ; - out[ 14 + outpos] = (in[ 16 + inpos] - in [16 + inpos - 1] ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 28 ) - ; - out[ 15 + outpos] = ( in[ 17 + inpos] - in [17 + inpos - 1] ) >>> ( 28 - 24 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 24 ) - ; - out[ 16 + outpos] = ( in[ 18 + inpos] - in [18 + inpos - 1] ) >>> ( 28 - 20 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 20 ) - ; - out[ 17 + outpos] = ( in[ 19 + inpos] - in [19 + inpos - 1] ) >>> ( 28 - 16 ) - | ( ( in[ 20 + inpos] - in [20 + inpos - 1] ) << 16 ) - ; - out[ 18 + outpos] = ( in[ 20 + inpos] - in [20 + inpos - 1] ) >>> ( 28 - 12 ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 12 ) - ; - out[ 19 + outpos] = ( in[ 21 + inpos] - in [21 + inpos - 1] ) >>> ( 28 - 8 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 8 ) - ; - out[ 20 + outpos] = ( in[ 22 + inpos] - in [22 + inpos - 1] ) >>> ( 28 - 4 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 4 ) - ; - out[ 21 + outpos] = (in[ 24 + inpos] - in [24 + inpos - 1] ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 28 ) - ; - out[ 22 + outpos] = ( in[ 25 + inpos] - in [25 + inpos - 1] ) >>> ( 28 - 24 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 24 ) - ; - out[ 23 + outpos] = ( in[ 26 + inpos] - in [26 + inpos - 1] ) >>> ( 28 - 20 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 20 ) - ; - out[ 24 + outpos] = ( in[ 27 + inpos] - in [27 + inpos - 1] ) >>> ( 28 - 16 ) - | ( ( in[ 28 + inpos] - in [28 + inpos - 1] ) << 16 ) - ; - out[ 25 + outpos] = ( in[ 28 + inpos] - in [28 + inpos - 1] ) >>> ( 28 - 12 ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 12 ) - ; - out[ 26 + outpos] = ( in[ 29 + inpos] - in [29 + inpos - 1] ) >>> ( 28 - 8 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 8 ) - ; - out[ 27 + outpos] = ( in[ 30 + inpos] - in [30 + inpos - 1] ) >>> ( 28 - 4 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 4 ) - ; -} - - - - -public static void integratedpack29(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 29 ) - ; - out[ 1 + outpos] = ( in[ 1 + inpos] - in [1 + inpos - 1] ) >>> ( 29 - 26 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 26 ) - ; - out[ 2 + outpos] = ( in[ 2 + inpos] - in [2 + inpos - 1] ) >>> ( 29 - 23 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 23 ) - ; - out[ 3 + outpos] = ( in[ 3 + inpos] - in [3 + inpos - 1] ) >>> ( 29 - 20 ) - | ( ( in[ 4 + inpos] - in [4 + inpos - 1] ) << 20 ) - ; - out[ 4 + outpos] = ( in[ 4 + inpos] - in [4 + inpos - 1] ) >>> ( 29 - 17 ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 17 ) - ; - out[ 5 + outpos] = ( in[ 5 + inpos] - in [5 + inpos - 1] ) >>> ( 29 - 14 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 14 ) - ; - out[ 6 + outpos] = ( in[ 6 + inpos] - in [6 + inpos - 1] ) >>> ( 29 - 11 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 11 ) - ; - out[ 7 + outpos] = ( in[ 7 + inpos] - in [7 + inpos - 1] ) >>> ( 29 - 8 ) - | ( ( in[ 8 + inpos] - in [8 + inpos - 1] ) << 8 ) - ; - out[ 8 + outpos] = ( in[ 8 + inpos] - in [8 + inpos - 1] ) >>> ( 29 - 5 ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 5 ) - ; - out[ 9 + outpos] = ( in[ 9 + inpos] - in [9 + inpos - 1] ) >>> ( 29 - 2 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 2 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 31 ) - ; - out[ 10 + outpos] = ( in[ 11 + inpos] - in [11 + inpos - 1] ) >>> ( 29 - 28 ) - | ( ( in[ 12 + inpos] - in [12 + inpos - 1] ) << 28 ) - ; - out[ 11 + outpos] = ( in[ 12 + inpos] - in [12 + inpos - 1] ) >>> ( 29 - 25 ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 25 ) - ; - out[ 12 + outpos] = ( in[ 13 + inpos] - in [13 + inpos - 1] ) >>> ( 29 - 22 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 22 ) - ; - out[ 13 + outpos] = ( in[ 14 + inpos] - in [14 + inpos - 1] ) >>> ( 29 - 19 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 19 ) - ; - out[ 14 + outpos] = ( in[ 15 + inpos] - in [15 + inpos - 1] ) >>> ( 29 - 16 ) - | ( ( in[ 16 + inpos] - in [16 + inpos - 1] ) << 16 ) - ; - out[ 15 + outpos] = ( in[ 16 + inpos] - in [16 + inpos - 1] ) >>> ( 29 - 13 ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 13 ) - ; - out[ 16 + outpos] = ( in[ 17 + inpos] - in [17 + inpos - 1] ) >>> ( 29 - 10 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 10 ) - ; - out[ 17 + outpos] = ( in[ 18 + inpos] - in [18 + inpos - 1] ) >>> ( 29 - 7 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 7 ) - ; - out[ 18 + outpos] = ( in[ 19 + inpos] - in [19 + inpos - 1] ) >>> ( 29 - 4 ) - | ( ( in[ 20 + inpos] - in [20 + inpos - 1] ) << 4 ) - ; - out[ 19 + outpos] = ( in[ 20 + inpos] - in [20 + inpos - 1] ) >>> ( 29 - 1 ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 1 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 30 ) - ; - out[ 20 + outpos] = ( in[ 22 + inpos] - in [22 + inpos - 1] ) >>> ( 29 - 27 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 27 ) - ; - out[ 21 + outpos] = ( in[ 23 + inpos] - in [23 + inpos - 1] ) >>> ( 29 - 24 ) - | ( ( in[ 24 + inpos] - in [24 + inpos - 1] ) << 24 ) - ; - out[ 22 + outpos] = ( in[ 24 + inpos] - in [24 + inpos - 1] ) >>> ( 29 - 21 ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 21 ) - ; - out[ 23 + outpos] = ( in[ 25 + inpos] - in [25 + inpos - 1] ) >>> ( 29 - 18 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 18 ) - ; - out[ 24 + outpos] = ( in[ 26 + inpos] - in [26 + inpos - 1] ) >>> ( 29 - 15 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 15 ) - ; - out[ 25 + outpos] = ( in[ 27 + inpos] - in [27 + inpos - 1] ) >>> ( 29 - 12 ) - | ( ( in[ 28 + inpos] - in [28 + inpos - 1] ) << 12 ) - ; - out[ 26 + outpos] = ( in[ 28 + inpos] - in [28 + inpos - 1] ) >>> ( 29 - 9 ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 9 ) - ; - out[ 27 + outpos] = ( in[ 29 + inpos] - in [29 + inpos - 1] ) >>> ( 29 - 6 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 6 ) - ; - out[ 28 + outpos] = ( in[ 30 + inpos] - in [30 + inpos - 1] ) >>> ( 29 - 3 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 3 ) - ; -} - - - - -public static void integratedpack30(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 30 ) - ; - out[ 1 + outpos] = ( in[ 1 + inpos] - in [1 + inpos - 1] ) >>> ( 30 - 28 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 28 ) - ; - out[ 2 + outpos] = ( in[ 2 + inpos] - in [2 + inpos - 1] ) >>> ( 30 - 26 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 26 ) - ; - out[ 3 + outpos] = ( in[ 3 + inpos] - in [3 + inpos - 1] ) >>> ( 30 - 24 ) - | ( ( in[ 4 + inpos] - in [4 + inpos - 1] ) << 24 ) - ; - out[ 4 + outpos] = ( in[ 4 + inpos] - in [4 + inpos - 1] ) >>> ( 30 - 22 ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 22 ) - ; - out[ 5 + outpos] = ( in[ 5 + inpos] - in [5 + inpos - 1] ) >>> ( 30 - 20 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 20 ) - ; - out[ 6 + outpos] = ( in[ 6 + inpos] - in [6 + inpos - 1] ) >>> ( 30 - 18 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 18 ) - ; - out[ 7 + outpos] = ( in[ 7 + inpos] - in [7 + inpos - 1] ) >>> ( 30 - 16 ) - | ( ( in[ 8 + inpos] - in [8 + inpos - 1] ) << 16 ) - ; - out[ 8 + outpos] = ( in[ 8 + inpos] - in [8 + inpos - 1] ) >>> ( 30 - 14 ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 14 ) - ; - out[ 9 + outpos] = ( in[ 9 + inpos] - in [9 + inpos - 1] ) >>> ( 30 - 12 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 12 ) - ; - out[ 10 + outpos] = ( in[ 10 + inpos] - in [10 + inpos - 1] ) >>> ( 30 - 10 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 10 ) - ; - out[ 11 + outpos] = ( in[ 11 + inpos] - in [11 + inpos - 1] ) >>> ( 30 - 8 ) - | ( ( in[ 12 + inpos] - in [12 + inpos - 1] ) << 8 ) - ; - out[ 12 + outpos] = ( in[ 12 + inpos] - in [12 + inpos - 1] ) >>> ( 30 - 6 ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 6 ) - ; - out[ 13 + outpos] = ( in[ 13 + inpos] - in [13 + inpos - 1] ) >>> ( 30 - 4 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 4 ) - ; - out[ 14 + outpos] = ( in[ 14 + inpos] - in [14 + inpos - 1] ) >>> ( 30 - 2 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 2 ) - ; - out[ 15 + outpos] = (in[ 16 + inpos] - in [16 + inpos - 1] ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 30 ) - ; - out[ 16 + outpos] = ( in[ 17 + inpos] - in [17 + inpos - 1] ) >>> ( 30 - 28 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 28 ) - ; - out[ 17 + outpos] = ( in[ 18 + inpos] - in [18 + inpos - 1] ) >>> ( 30 - 26 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 26 ) - ; - out[ 18 + outpos] = ( in[ 19 + inpos] - in [19 + inpos - 1] ) >>> ( 30 - 24 ) - | ( ( in[ 20 + inpos] - in [20 + inpos - 1] ) << 24 ) - ; - out[ 19 + outpos] = ( in[ 20 + inpos] - in [20 + inpos - 1] ) >>> ( 30 - 22 ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 22 ) - ; - out[ 20 + outpos] = ( in[ 21 + inpos] - in [21 + inpos - 1] ) >>> ( 30 - 20 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 20 ) - ; - out[ 21 + outpos] = ( in[ 22 + inpos] - in [22 + inpos - 1] ) >>> ( 30 - 18 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 18 ) - ; - out[ 22 + outpos] = ( in[ 23 + inpos] - in [23 + inpos - 1] ) >>> ( 30 - 16 ) - | ( ( in[ 24 + inpos] - in [24 + inpos - 1] ) << 16 ) - ; - out[ 23 + outpos] = ( in[ 24 + inpos] - in [24 + inpos - 1] ) >>> ( 30 - 14 ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 14 ) - ; - out[ 24 + outpos] = ( in[ 25 + inpos] - in [25 + inpos - 1] ) >>> ( 30 - 12 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 12 ) - ; - out[ 25 + outpos] = ( in[ 26 + inpos] - in [26 + inpos - 1] ) >>> ( 30 - 10 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 10 ) - ; - out[ 26 + outpos] = ( in[ 27 + inpos] - in [27 + inpos - 1] ) >>> ( 30 - 8 ) - | ( ( in[ 28 + inpos] - in [28 + inpos - 1] ) << 8 ) - ; - out[ 27 + outpos] = ( in[ 28 + inpos] - in [28 + inpos - 1] ) >>> ( 30 - 6 ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 6 ) - ; - out[ 28 + outpos] = ( in[ 29 + inpos] - in [29 + inpos - 1] ) >>> ( 30 - 4 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 4 ) - ; - out[ 29 + outpos] = ( in[ 30 + inpos] - in [30 + inpos - 1] ) >>> ( 30 - 2 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 2 ) - ; -} - - - - -public static void integratedpack31(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = (in[ 0 + inpos] - initoffset ) - | ( ( in[ 1 + inpos] - in [1 + inpos - 1] ) << 31 ) - ; - out[ 1 + outpos] = ( in[ 1 + inpos] - in [1 + inpos - 1] ) >>> ( 31 - 30 ) - | ( ( in[ 2 + inpos] - in [2 + inpos - 1] ) << 30 ) - ; - out[ 2 + outpos] = ( in[ 2 + inpos] - in [2 + inpos - 1] ) >>> ( 31 - 29 ) - | ( ( in[ 3 + inpos] - in [3 + inpos - 1] ) << 29 ) - ; - out[ 3 + outpos] = ( in[ 3 + inpos] - in [3 + inpos - 1] ) >>> ( 31 - 28 ) - | ( ( in[ 4 + inpos] - in [4 + inpos - 1] ) << 28 ) - ; - out[ 4 + outpos] = ( in[ 4 + inpos] - in [4 + inpos - 1] ) >>> ( 31 - 27 ) - | ( ( in[ 5 + inpos] - in [5 + inpos - 1] ) << 27 ) - ; - out[ 5 + outpos] = ( in[ 5 + inpos] - in [5 + inpos - 1] ) >>> ( 31 - 26 ) - | ( ( in[ 6 + inpos] - in [6 + inpos - 1] ) << 26 ) - ; - out[ 6 + outpos] = ( in[ 6 + inpos] - in [6 + inpos - 1] ) >>> ( 31 - 25 ) - | ( ( in[ 7 + inpos] - in [7 + inpos - 1] ) << 25 ) - ; - out[ 7 + outpos] = ( in[ 7 + inpos] - in [7 + inpos - 1] ) >>> ( 31 - 24 ) - | ( ( in[ 8 + inpos] - in [8 + inpos - 1] ) << 24 ) - ; - out[ 8 + outpos] = ( in[ 8 + inpos] - in [8 + inpos - 1] ) >>> ( 31 - 23 ) - | ( ( in[ 9 + inpos] - in [9 + inpos - 1] ) << 23 ) - ; - out[ 9 + outpos] = ( in[ 9 + inpos] - in [9 + inpos - 1] ) >>> ( 31 - 22 ) - | ( ( in[ 10 + inpos] - in [10 + inpos - 1] ) << 22 ) - ; - out[ 10 + outpos] = ( in[ 10 + inpos] - in [10 + inpos - 1] ) >>> ( 31 - 21 ) - | ( ( in[ 11 + inpos] - in [11 + inpos - 1] ) << 21 ) - ; - out[ 11 + outpos] = ( in[ 11 + inpos] - in [11 + inpos - 1] ) >>> ( 31 - 20 ) - | ( ( in[ 12 + inpos] - in [12 + inpos - 1] ) << 20 ) - ; - out[ 12 + outpos] = ( in[ 12 + inpos] - in [12 + inpos - 1] ) >>> ( 31 - 19 ) - | ( ( in[ 13 + inpos] - in [13 + inpos - 1] ) << 19 ) - ; - out[ 13 + outpos] = ( in[ 13 + inpos] - in [13 + inpos - 1] ) >>> ( 31 - 18 ) - | ( ( in[ 14 + inpos] - in [14 + inpos - 1] ) << 18 ) - ; - out[ 14 + outpos] = ( in[ 14 + inpos] - in [14 + inpos - 1] ) >>> ( 31 - 17 ) - | ( ( in[ 15 + inpos] - in [15 + inpos - 1] ) << 17 ) - ; - out[ 15 + outpos] = ( in[ 15 + inpos] - in [15 + inpos - 1] ) >>> ( 31 - 16 ) - | ( ( in[ 16 + inpos] - in [16 + inpos - 1] ) << 16 ) - ; - out[ 16 + outpos] = ( in[ 16 + inpos] - in [16 + inpos - 1] ) >>> ( 31 - 15 ) - | ( ( in[ 17 + inpos] - in [17 + inpos - 1] ) << 15 ) - ; - out[ 17 + outpos] = ( in[ 17 + inpos] - in [17 + inpos - 1] ) >>> ( 31 - 14 ) - | ( ( in[ 18 + inpos] - in [18 + inpos - 1] ) << 14 ) - ; - out[ 18 + outpos] = ( in[ 18 + inpos] - in [18 + inpos - 1] ) >>> ( 31 - 13 ) - | ( ( in[ 19 + inpos] - in [19 + inpos - 1] ) << 13 ) - ; - out[ 19 + outpos] = ( in[ 19 + inpos] - in [19 + inpos - 1] ) >>> ( 31 - 12 ) - | ( ( in[ 20 + inpos] - in [20 + inpos - 1] ) << 12 ) - ; - out[ 20 + outpos] = ( in[ 20 + inpos] - in [20 + inpos - 1] ) >>> ( 31 - 11 ) - | ( ( in[ 21 + inpos] - in [21 + inpos - 1] ) << 11 ) - ; - out[ 21 + outpos] = ( in[ 21 + inpos] - in [21 + inpos - 1] ) >>> ( 31 - 10 ) - | ( ( in[ 22 + inpos] - in [22 + inpos - 1] ) << 10 ) - ; - out[ 22 + outpos] = ( in[ 22 + inpos] - in [22 + inpos - 1] ) >>> ( 31 - 9 ) - | ( ( in[ 23 + inpos] - in [23 + inpos - 1] ) << 9 ) - ; - out[ 23 + outpos] = ( in[ 23 + inpos] - in [23 + inpos - 1] ) >>> ( 31 - 8 ) - | ( ( in[ 24 + inpos] - in [24 + inpos - 1] ) << 8 ) - ; - out[ 24 + outpos] = ( in[ 24 + inpos] - in [24 + inpos - 1] ) >>> ( 31 - 7 ) - | ( ( in[ 25 + inpos] - in [25 + inpos - 1] ) << 7 ) - ; - out[ 25 + outpos] = ( in[ 25 + inpos] - in [25 + inpos - 1] ) >>> ( 31 - 6 ) - | ( ( in[ 26 + inpos] - in [26 + inpos - 1] ) << 6 ) - ; - out[ 26 + outpos] = ( in[ 26 + inpos] - in [26 + inpos - 1] ) >>> ( 31 - 5 ) - | ( ( in[ 27 + inpos] - in [27 + inpos - 1] ) << 5 ) - ; - out[ 27 + outpos] = ( in[ 27 + inpos] - in [27 + inpos - 1] ) >>> ( 31 - 4 ) - | ( ( in[ 28 + inpos] - in [28 + inpos - 1] ) << 4 ) - ; - out[ 28 + outpos] = ( in[ 28 + inpos] - in [28 + inpos - 1] ) >>> ( 31 - 3 ) - | ( ( in[ 29 + inpos] - in [29 + inpos - 1] ) << 3 ) - ; - out[ 29 + outpos] = ( in[ 29 + inpos] - in [29 + inpos - 1] ) >>> ( 31 - 2 ) - | ( ( in[ 30 + inpos] - in [30 + inpos - 1] ) << 2 ) - ; - out[ 30 + outpos] = ( in[ 30 + inpos] - in [30 + inpos - 1] ) >>> ( 31 - 1 ) - | ( ( in[ 31 + inpos] - in [31 + inpos - 1] ) << 1 ) - ; -} - - - - -public static void integratedunpack1(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 1 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( ( in[ 0 + inpos] >>> 1 ) & 1 ) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( ( in[ 0 + inpos] >>> 2 ) & 1 ) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( ( in[ 0 + inpos] >>> 3 ) & 1 ) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( ( in[ 0 + inpos] >>> 4 ) & 1 ) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( ( in[ 0 + inpos] >>> 5 ) & 1 ) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( ( in[ 0 + inpos] >>> 6 ) & 1 ) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( ( in[ 0 + inpos] >>> 7 ) & 1 ) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( ( in[ 0 + inpos] >>> 8 ) & 1 ) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( ( in[ 0 + inpos] >>> 9 ) & 1 ) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( ( in[ 0 + inpos] >>> 10 ) & 1 ) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( ( in[ 0 + inpos] >>> 11 ) & 1 ) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( ( in[ 0 + inpos] >>> 12 ) & 1 ) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( ( in[ 0 + inpos] >>> 13 ) & 1 ) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( ( in[ 0 + inpos] >>> 14 ) & 1 ) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( ( in[ 0 + inpos] >>> 15 ) & 1 ) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( ( in[ 0 + inpos] >>> 16 ) & 1 ) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( ( in[ 0 + inpos] >>> 17 ) & 1 ) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( ( in[ 0 + inpos] >>> 18 ) & 1 ) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( ( in[ 0 + inpos] >>> 19 ) & 1 ) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( ( in[ 0 + inpos] >>> 20 ) & 1 ) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( ( in[ 0 + inpos] >>> 21 ) & 1 ) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( ( in[ 0 + inpos] >>> 22 ) & 1 ) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( ( in[ 0 + inpos] >>> 23 ) & 1 ) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( ( in[ 0 + inpos] >>> 24 ) & 1 ) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( ( in[ 0 + inpos] >>> 25 ) & 1 ) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( ( in[ 0 + inpos] >>> 26 ) & 1 ) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( ( in[ 0 + inpos] >>> 27 ) & 1 ) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( ( in[ 0 + inpos] >>> 28 ) & 1 ) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( ( in[ 0 + inpos] >>> 29 ) & 1 ) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( ( in[ 0 + inpos] >>> 30 ) & 1 ) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 0 + inpos] >>> 31 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack2(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 3 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( ( in[ 0 + inpos] >>> 2 ) & 3 ) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( ( in[ 0 + inpos] >>> 4 ) & 3 ) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( ( in[ 0 + inpos] >>> 6 ) & 3 ) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( ( in[ 0 + inpos] >>> 8 ) & 3 ) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( ( in[ 0 + inpos] >>> 10 ) & 3 ) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( ( in[ 0 + inpos] >>> 12 ) & 3 ) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( ( in[ 0 + inpos] >>> 14 ) & 3 ) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( ( in[ 0 + inpos] >>> 16 ) & 3 ) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( ( in[ 0 + inpos] >>> 18 ) & 3 ) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( ( in[ 0 + inpos] >>> 20 ) & 3 ) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( ( in[ 0 + inpos] >>> 22 ) & 3 ) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( ( in[ 0 + inpos] >>> 24 ) & 3 ) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( ( in[ 0 + inpos] >>> 26 ) & 3 ) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( ( in[ 0 + inpos] >>> 28 ) & 3 ) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( in[ 0 + inpos] >>> 30 ) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( ( in[ 1 + inpos] >>> 0 ) & 3 ) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( ( in[ 1 + inpos] >>> 2 ) & 3 ) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( ( in[ 1 + inpos] >>> 4 ) & 3 ) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( ( in[ 1 + inpos] >>> 6 ) & 3 ) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( ( in[ 1 + inpos] >>> 8 ) & 3 ) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( ( in[ 1 + inpos] >>> 10 ) & 3 ) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( ( in[ 1 + inpos] >>> 12 ) & 3 ) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( ( in[ 1 + inpos] >>> 14 ) & 3 ) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( ( in[ 1 + inpos] >>> 16 ) & 3 ) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( ( in[ 1 + inpos] >>> 18 ) & 3 ) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( ( in[ 1 + inpos] >>> 20 ) & 3 ) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( ( in[ 1 + inpos] >>> 22 ) & 3 ) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( ( in[ 1 + inpos] >>> 24 ) & 3 ) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( ( in[ 1 + inpos] >>> 26 ) & 3 ) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( ( in[ 1 + inpos] >>> 28 ) & 3 ) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 1 + inpos] >>> 30 ) - ) + out[31 + outpos - 1] ; -} - - -public static void integratedunpack3(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 7 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( ( in[ 0 + inpos] >>> 3 ) & 7 ) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( ( in[ 0 + inpos] >>> 6 ) & 7 ) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( ( in[ 0 + inpos] >>> 9 ) & 7 ) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( ( in[ 0 + inpos] >>> 12 ) & 7 ) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( ( in[ 0 + inpos] >>> 15 ) & 7 ) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( ( in[ 0 + inpos] >>> 18 ) & 7 ) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( ( in[ 0 + inpos] >>> 21 ) & 7 ) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( ( in[ 0 + inpos] >>> 24 ) & 7 ) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( ( in[ 0 + inpos] >>> 27 ) & 7 ) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( in[ 0 + inpos] >>> 30 ) - | ((in[ 1 + inpos] & 1 )<<( 3 - 1 )) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( ( in[ 1 + inpos] >>> 1 ) & 7 ) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( ( in[ 1 + inpos] >>> 4 ) & 7 ) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( ( in[ 1 + inpos] >>> 7 ) & 7 ) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( ( in[ 1 + inpos] >>> 10 ) & 7 ) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( ( in[ 1 + inpos] >>> 13 ) & 7 ) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( ( in[ 1 + inpos] >>> 16 ) & 7 ) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( ( in[ 1 + inpos] >>> 19 ) & 7 ) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( ( in[ 1 + inpos] >>> 22 ) & 7 ) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( ( in[ 1 + inpos] >>> 25 ) & 7 ) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( ( in[ 1 + inpos] >>> 28 ) & 7 ) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( in[ 1 + inpos] >>> 31 ) - | ((in[ 2 + inpos] & 3 )<<( 3 - 2 )) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( ( in[ 2 + inpos] >>> 2 ) & 7 ) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( ( in[ 2 + inpos] >>> 5 ) & 7 ) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( ( in[ 2 + inpos] >>> 8 ) & 7 ) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( ( in[ 2 + inpos] >>> 11 ) & 7 ) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( ( in[ 2 + inpos] >>> 14 ) & 7 ) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( ( in[ 2 + inpos] >>> 17 ) & 7 ) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( ( in[ 2 + inpos] >>> 20 ) & 7 ) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( ( in[ 2 + inpos] >>> 23 ) & 7 ) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( ( in[ 2 + inpos] >>> 26 ) & 7 ) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 2 + inpos] >>> 29 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack4(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 15 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( ( in[ 0 + inpos] >>> 4 ) & 15 ) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( ( in[ 0 + inpos] >>> 8 ) & 15 ) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( ( in[ 0 + inpos] >>> 12 ) & 15 ) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( ( in[ 0 + inpos] >>> 16 ) & 15 ) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( ( in[ 0 + inpos] >>> 20 ) & 15 ) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( ( in[ 0 + inpos] >>> 24 ) & 15 ) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( in[ 0 + inpos] >>> 28 ) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( ( in[ 1 + inpos] >>> 0 ) & 15 ) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( ( in[ 1 + inpos] >>> 4 ) & 15 ) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( ( in[ 1 + inpos] >>> 8 ) & 15 ) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( ( in[ 1 + inpos] >>> 12 ) & 15 ) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( ( in[ 1 + inpos] >>> 16 ) & 15 ) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( ( in[ 1 + inpos] >>> 20 ) & 15 ) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( ( in[ 1 + inpos] >>> 24 ) & 15 ) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( in[ 1 + inpos] >>> 28 ) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( ( in[ 2 + inpos] >>> 0 ) & 15 ) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( ( in[ 2 + inpos] >>> 4 ) & 15 ) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( ( in[ 2 + inpos] >>> 8 ) & 15 ) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( ( in[ 2 + inpos] >>> 12 ) & 15 ) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( ( in[ 2 + inpos] >>> 16 ) & 15 ) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( ( in[ 2 + inpos] >>> 20 ) & 15 ) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( ( in[ 2 + inpos] >>> 24 ) & 15 ) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( in[ 2 + inpos] >>> 28 ) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( ( in[ 3 + inpos] >>> 0 ) & 15 ) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( ( in[ 3 + inpos] >>> 4 ) & 15 ) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( ( in[ 3 + inpos] >>> 8 ) & 15 ) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( ( in[ 3 + inpos] >>> 12 ) & 15 ) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( ( in[ 3 + inpos] >>> 16 ) & 15 ) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( ( in[ 3 + inpos] >>> 20 ) & 15 ) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( ( in[ 3 + inpos] >>> 24 ) & 15 ) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 3 + inpos] >>> 28 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack5(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 31 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( ( in[ 0 + inpos] >>> 5 ) & 31 ) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( ( in[ 0 + inpos] >>> 10 ) & 31 ) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( ( in[ 0 + inpos] >>> 15 ) & 31 ) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( ( in[ 0 + inpos] >>> 20 ) & 31 ) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( ( in[ 0 + inpos] >>> 25 ) & 31 ) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( in[ 0 + inpos] >>> 30 ) - | ((in[ 1 + inpos] & 7 )<<( 5 - 3 )) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( ( in[ 1 + inpos] >>> 3 ) & 31 ) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( ( in[ 1 + inpos] >>> 8 ) & 31 ) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( ( in[ 1 + inpos] >>> 13 ) & 31 ) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( ( in[ 1 + inpos] >>> 18 ) & 31 ) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( ( in[ 1 + inpos] >>> 23 ) & 31 ) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( in[ 1 + inpos] >>> 28 ) - | ((in[ 2 + inpos] & 1 )<<( 5 - 1 )) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( ( in[ 2 + inpos] >>> 1 ) & 31 ) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( ( in[ 2 + inpos] >>> 6 ) & 31 ) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( ( in[ 2 + inpos] >>> 11 ) & 31 ) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( ( in[ 2 + inpos] >>> 16 ) & 31 ) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( ( in[ 2 + inpos] >>> 21 ) & 31 ) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( ( in[ 2 + inpos] >>> 26 ) & 31 ) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( in[ 2 + inpos] >>> 31 ) - | ((in[ 3 + inpos] & 15 )<<( 5 - 4 )) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( ( in[ 3 + inpos] >>> 4 ) & 31 ) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( ( in[ 3 + inpos] >>> 9 ) & 31 ) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( ( in[ 3 + inpos] >>> 14 ) & 31 ) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( ( in[ 3 + inpos] >>> 19 ) & 31 ) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( ( in[ 3 + inpos] >>> 24 ) & 31 ) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( in[ 3 + inpos] >>> 29 ) - | ((in[ 4 + inpos] & 3 )<<( 5 - 2 )) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( ( in[ 4 + inpos] >>> 2 ) & 31 ) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( ( in[ 4 + inpos] >>> 7 ) & 31 ) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( ( in[ 4 + inpos] >>> 12 ) & 31 ) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( ( in[ 4 + inpos] >>> 17 ) & 31 ) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( ( in[ 4 + inpos] >>> 22 ) & 31 ) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 4 + inpos] >>> 27 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack6(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 63 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( ( in[ 0 + inpos] >>> 6 ) & 63 ) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( ( in[ 0 + inpos] >>> 12 ) & 63 ) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( ( in[ 0 + inpos] >>> 18 ) & 63 ) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( ( in[ 0 + inpos] >>> 24 ) & 63 ) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( in[ 0 + inpos] >>> 30 ) - | ((in[ 1 + inpos] & 15 )<<( 6 - 4 )) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( ( in[ 1 + inpos] >>> 4 ) & 63 ) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( ( in[ 1 + inpos] >>> 10 ) & 63 ) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( ( in[ 1 + inpos] >>> 16 ) & 63 ) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( ( in[ 1 + inpos] >>> 22 ) & 63 ) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( in[ 1 + inpos] >>> 28 ) - | ((in[ 2 + inpos] & 3 )<<( 6 - 2 )) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( ( in[ 2 + inpos] >>> 2 ) & 63 ) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( ( in[ 2 + inpos] >>> 8 ) & 63 ) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( ( in[ 2 + inpos] >>> 14 ) & 63 ) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( ( in[ 2 + inpos] >>> 20 ) & 63 ) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( in[ 2 + inpos] >>> 26 ) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( ( in[ 3 + inpos] >>> 0 ) & 63 ) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( ( in[ 3 + inpos] >>> 6 ) & 63 ) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( ( in[ 3 + inpos] >>> 12 ) & 63 ) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( ( in[ 3 + inpos] >>> 18 ) & 63 ) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( ( in[ 3 + inpos] >>> 24 ) & 63 ) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( in[ 3 + inpos] >>> 30 ) - | ((in[ 4 + inpos] & 15 )<<( 6 - 4 )) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( ( in[ 4 + inpos] >>> 4 ) & 63 ) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( ( in[ 4 + inpos] >>> 10 ) & 63 ) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( ( in[ 4 + inpos] >>> 16 ) & 63 ) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( ( in[ 4 + inpos] >>> 22 ) & 63 ) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( in[ 4 + inpos] >>> 28 ) - | ((in[ 5 + inpos] & 3 )<<( 6 - 2 )) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( ( in[ 5 + inpos] >>> 2 ) & 63 ) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( ( in[ 5 + inpos] >>> 8 ) & 63 ) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( ( in[ 5 + inpos] >>> 14 ) & 63 ) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( ( in[ 5 + inpos] >>> 20 ) & 63 ) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 5 + inpos] >>> 26 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack7(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 127 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( ( in[ 0 + inpos] >>> 7 ) & 127 ) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( ( in[ 0 + inpos] >>> 14 ) & 127 ) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( ( in[ 0 + inpos] >>> 21 ) & 127 ) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( in[ 0 + inpos] >>> 28 ) - | ((in[ 1 + inpos] & 7 )<<( 7 - 3 )) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( ( in[ 1 + inpos] >>> 3 ) & 127 ) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( ( in[ 1 + inpos] >>> 10 ) & 127 ) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( ( in[ 1 + inpos] >>> 17 ) & 127 ) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( ( in[ 1 + inpos] >>> 24 ) & 127 ) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( in[ 1 + inpos] >>> 31 ) - | ((in[ 2 + inpos] & 63 )<<( 7 - 6 )) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( ( in[ 2 + inpos] >>> 6 ) & 127 ) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( ( in[ 2 + inpos] >>> 13 ) & 127 ) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( ( in[ 2 + inpos] >>> 20 ) & 127 ) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( in[ 2 + inpos] >>> 27 ) - | ((in[ 3 + inpos] & 3 )<<( 7 - 2 )) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( ( in[ 3 + inpos] >>> 2 ) & 127 ) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( ( in[ 3 + inpos] >>> 9 ) & 127 ) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( ( in[ 3 + inpos] >>> 16 ) & 127 ) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( ( in[ 3 + inpos] >>> 23 ) & 127 ) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( in[ 3 + inpos] >>> 30 ) - | ((in[ 4 + inpos] & 31 )<<( 7 - 5 )) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( ( in[ 4 + inpos] >>> 5 ) & 127 ) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( ( in[ 4 + inpos] >>> 12 ) & 127 ) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( ( in[ 4 + inpos] >>> 19 ) & 127 ) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( in[ 4 + inpos] >>> 26 ) - | ((in[ 5 + inpos] & 1 )<<( 7 - 1 )) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( ( in[ 5 + inpos] >>> 1 ) & 127 ) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( ( in[ 5 + inpos] >>> 8 ) & 127 ) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( ( in[ 5 + inpos] >>> 15 ) & 127 ) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( ( in[ 5 + inpos] >>> 22 ) & 127 ) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( in[ 5 + inpos] >>> 29 ) - | ((in[ 6 + inpos] & 15 )<<( 7 - 4 )) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( ( in[ 6 + inpos] >>> 4 ) & 127 ) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( ( in[ 6 + inpos] >>> 11 ) & 127 ) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( ( in[ 6 + inpos] >>> 18 ) & 127 ) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 6 + inpos] >>> 25 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack8(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 255 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( ( in[ 0 + inpos] >>> 8 ) & 255 ) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( ( in[ 0 + inpos] >>> 16 ) & 255 ) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( in[ 0 + inpos] >>> 24 ) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( ( in[ 1 + inpos] >>> 0 ) & 255 ) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( ( in[ 1 + inpos] >>> 8 ) & 255 ) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( ( in[ 1 + inpos] >>> 16 ) & 255 ) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( in[ 1 + inpos] >>> 24 ) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( ( in[ 2 + inpos] >>> 0 ) & 255 ) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( ( in[ 2 + inpos] >>> 8 ) & 255 ) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( ( in[ 2 + inpos] >>> 16 ) & 255 ) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( in[ 2 + inpos] >>> 24 ) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( ( in[ 3 + inpos] >>> 0 ) & 255 ) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( ( in[ 3 + inpos] >>> 8 ) & 255 ) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( ( in[ 3 + inpos] >>> 16 ) & 255 ) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( in[ 3 + inpos] >>> 24 ) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( ( in[ 4 + inpos] >>> 0 ) & 255 ) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( ( in[ 4 + inpos] >>> 8 ) & 255 ) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( ( in[ 4 + inpos] >>> 16 ) & 255 ) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( in[ 4 + inpos] >>> 24 ) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( ( in[ 5 + inpos] >>> 0 ) & 255 ) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( ( in[ 5 + inpos] >>> 8 ) & 255 ) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( ( in[ 5 + inpos] >>> 16 ) & 255 ) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( in[ 5 + inpos] >>> 24 ) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( ( in[ 6 + inpos] >>> 0 ) & 255 ) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( ( in[ 6 + inpos] >>> 8 ) & 255 ) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( ( in[ 6 + inpos] >>> 16 ) & 255 ) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( in[ 6 + inpos] >>> 24 ) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( ( in[ 7 + inpos] >>> 0 ) & 255 ) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( ( in[ 7 + inpos] >>> 8 ) & 255 ) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( ( in[ 7 + inpos] >>> 16 ) & 255 ) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 7 + inpos] >>> 24 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack9(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 511 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( ( in[ 0 + inpos] >>> 9 ) & 511 ) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( ( in[ 0 + inpos] >>> 18 ) & 511 ) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( in[ 0 + inpos] >>> 27 ) - | ((in[ 1 + inpos] & 15 )<<( 9 - 4 )) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( ( in[ 1 + inpos] >>> 4 ) & 511 ) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( ( in[ 1 + inpos] >>> 13 ) & 511 ) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( ( in[ 1 + inpos] >>> 22 ) & 511 ) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( in[ 1 + inpos] >>> 31 ) - | ((in[ 2 + inpos] & 255 )<<( 9 - 8 )) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( ( in[ 2 + inpos] >>> 8 ) & 511 ) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( ( in[ 2 + inpos] >>> 17 ) & 511 ) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( in[ 2 + inpos] >>> 26 ) - | ((in[ 3 + inpos] & 7 )<<( 9 - 3 )) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( ( in[ 3 + inpos] >>> 3 ) & 511 ) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( ( in[ 3 + inpos] >>> 12 ) & 511 ) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( ( in[ 3 + inpos] >>> 21 ) & 511 ) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( in[ 3 + inpos] >>> 30 ) - | ((in[ 4 + inpos] & 127 )<<( 9 - 7 )) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( ( in[ 4 + inpos] >>> 7 ) & 511 ) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( ( in[ 4 + inpos] >>> 16 ) & 511 ) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( in[ 4 + inpos] >>> 25 ) - | ((in[ 5 + inpos] & 3 )<<( 9 - 2 )) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( ( in[ 5 + inpos] >>> 2 ) & 511 ) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( ( in[ 5 + inpos] >>> 11 ) & 511 ) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( ( in[ 5 + inpos] >>> 20 ) & 511 ) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( in[ 5 + inpos] >>> 29 ) - | ((in[ 6 + inpos] & 63 )<<( 9 - 6 )) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( ( in[ 6 + inpos] >>> 6 ) & 511 ) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( ( in[ 6 + inpos] >>> 15 ) & 511 ) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( in[ 6 + inpos] >>> 24 ) - | ((in[ 7 + inpos] & 1 )<<( 9 - 1 )) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( ( in[ 7 + inpos] >>> 1 ) & 511 ) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( ( in[ 7 + inpos] >>> 10 ) & 511 ) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( ( in[ 7 + inpos] >>> 19 ) & 511 ) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( in[ 7 + inpos] >>> 28 ) - | ((in[ 8 + inpos] & 31 )<<( 9 - 5 )) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( ( in[ 8 + inpos] >>> 5 ) & 511 ) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( ( in[ 8 + inpos] >>> 14 ) & 511 ) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 8 + inpos] >>> 23 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack10(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 1023 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( ( in[ 0 + inpos] >>> 10 ) & 1023 ) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( ( in[ 0 + inpos] >>> 20 ) & 1023 ) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( in[ 0 + inpos] >>> 30 ) - | ((in[ 1 + inpos] & 255 )<<( 10 - 8 )) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( ( in[ 1 + inpos] >>> 8 ) & 1023 ) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( ( in[ 1 + inpos] >>> 18 ) & 1023 ) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( in[ 1 + inpos] >>> 28 ) - | ((in[ 2 + inpos] & 63 )<<( 10 - 6 )) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( ( in[ 2 + inpos] >>> 6 ) & 1023 ) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( ( in[ 2 + inpos] >>> 16 ) & 1023 ) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( in[ 2 + inpos] >>> 26 ) - | ((in[ 3 + inpos] & 15 )<<( 10 - 4 )) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( ( in[ 3 + inpos] >>> 4 ) & 1023 ) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( ( in[ 3 + inpos] >>> 14 ) & 1023 ) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( in[ 3 + inpos] >>> 24 ) - | ((in[ 4 + inpos] & 3 )<<( 10 - 2 )) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( ( in[ 4 + inpos] >>> 2 ) & 1023 ) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( ( in[ 4 + inpos] >>> 12 ) & 1023 ) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( in[ 4 + inpos] >>> 22 ) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( ( in[ 5 + inpos] >>> 0 ) & 1023 ) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( ( in[ 5 + inpos] >>> 10 ) & 1023 ) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( ( in[ 5 + inpos] >>> 20 ) & 1023 ) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( in[ 5 + inpos] >>> 30 ) - | ((in[ 6 + inpos] & 255 )<<( 10 - 8 )) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( ( in[ 6 + inpos] >>> 8 ) & 1023 ) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( ( in[ 6 + inpos] >>> 18 ) & 1023 ) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( in[ 6 + inpos] >>> 28 ) - | ((in[ 7 + inpos] & 63 )<<( 10 - 6 )) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( ( in[ 7 + inpos] >>> 6 ) & 1023 ) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( ( in[ 7 + inpos] >>> 16 ) & 1023 ) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( in[ 7 + inpos] >>> 26 ) - | ((in[ 8 + inpos] & 15 )<<( 10 - 4 )) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( ( in[ 8 + inpos] >>> 4 ) & 1023 ) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( ( in[ 8 + inpos] >>> 14 ) & 1023 ) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( in[ 8 + inpos] >>> 24 ) - | ((in[ 9 + inpos] & 3 )<<( 10 - 2 )) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( ( in[ 9 + inpos] >>> 2 ) & 1023 ) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( ( in[ 9 + inpos] >>> 12 ) & 1023 ) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 9 + inpos] >>> 22 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack11(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 2047 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( ( in[ 0 + inpos] >>> 11 ) & 2047 ) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( in[ 0 + inpos] >>> 22 ) - | ((in[ 1 + inpos] & 1 )<<( 11 - 1 )) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( ( in[ 1 + inpos] >>> 1 ) & 2047 ) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( ( in[ 1 + inpos] >>> 12 ) & 2047 ) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( in[ 1 + inpos] >>> 23 ) - | ((in[ 2 + inpos] & 3 )<<( 11 - 2 )) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( ( in[ 2 + inpos] >>> 2 ) & 2047 ) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( ( in[ 2 + inpos] >>> 13 ) & 2047 ) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( in[ 2 + inpos] >>> 24 ) - | ((in[ 3 + inpos] & 7 )<<( 11 - 3 )) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( ( in[ 3 + inpos] >>> 3 ) & 2047 ) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( ( in[ 3 + inpos] >>> 14 ) & 2047 ) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( in[ 3 + inpos] >>> 25 ) - | ((in[ 4 + inpos] & 15 )<<( 11 - 4 )) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( ( in[ 4 + inpos] >>> 4 ) & 2047 ) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( ( in[ 4 + inpos] >>> 15 ) & 2047 ) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( in[ 4 + inpos] >>> 26 ) - | ((in[ 5 + inpos] & 31 )<<( 11 - 5 )) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( ( in[ 5 + inpos] >>> 5 ) & 2047 ) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( ( in[ 5 + inpos] >>> 16 ) & 2047 ) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( in[ 5 + inpos] >>> 27 ) - | ((in[ 6 + inpos] & 63 )<<( 11 - 6 )) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( ( in[ 6 + inpos] >>> 6 ) & 2047 ) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( ( in[ 6 + inpos] >>> 17 ) & 2047 ) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( in[ 6 + inpos] >>> 28 ) - | ((in[ 7 + inpos] & 127 )<<( 11 - 7 )) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( ( in[ 7 + inpos] >>> 7 ) & 2047 ) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( ( in[ 7 + inpos] >>> 18 ) & 2047 ) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( in[ 7 + inpos] >>> 29 ) - | ((in[ 8 + inpos] & 255 )<<( 11 - 8 )) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( ( in[ 8 + inpos] >>> 8 ) & 2047 ) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( ( in[ 8 + inpos] >>> 19 ) & 2047 ) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( in[ 8 + inpos] >>> 30 ) - | ((in[ 9 + inpos] & 511 )<<( 11 - 9 )) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( ( in[ 9 + inpos] >>> 9 ) & 2047 ) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( ( in[ 9 + inpos] >>> 20 ) & 2047 ) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( in[ 9 + inpos] >>> 31 ) - | ((in[ 10 + inpos] & 1023 )<<( 11 - 10 )) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( ( in[ 10 + inpos] >>> 10 ) & 2047 ) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 10 + inpos] >>> 21 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack12(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 4095 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( ( in[ 0 + inpos] >>> 12 ) & 4095 ) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( in[ 0 + inpos] >>> 24 ) - | ((in[ 1 + inpos] & 15 )<<( 12 - 4 )) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( ( in[ 1 + inpos] >>> 4 ) & 4095 ) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( ( in[ 1 + inpos] >>> 16 ) & 4095 ) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( in[ 1 + inpos] >>> 28 ) - | ((in[ 2 + inpos] & 255 )<<( 12 - 8 )) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( ( in[ 2 + inpos] >>> 8 ) & 4095 ) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( in[ 2 + inpos] >>> 20 ) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( ( in[ 3 + inpos] >>> 0 ) & 4095 ) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( ( in[ 3 + inpos] >>> 12 ) & 4095 ) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( in[ 3 + inpos] >>> 24 ) - | ((in[ 4 + inpos] & 15 )<<( 12 - 4 )) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( ( in[ 4 + inpos] >>> 4 ) & 4095 ) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( ( in[ 4 + inpos] >>> 16 ) & 4095 ) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( in[ 4 + inpos] >>> 28 ) - | ((in[ 5 + inpos] & 255 )<<( 12 - 8 )) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( ( in[ 5 + inpos] >>> 8 ) & 4095 ) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( in[ 5 + inpos] >>> 20 ) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( ( in[ 6 + inpos] >>> 0 ) & 4095 ) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( ( in[ 6 + inpos] >>> 12 ) & 4095 ) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( in[ 6 + inpos] >>> 24 ) - | ((in[ 7 + inpos] & 15 )<<( 12 - 4 )) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( ( in[ 7 + inpos] >>> 4 ) & 4095 ) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( ( in[ 7 + inpos] >>> 16 ) & 4095 ) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( in[ 7 + inpos] >>> 28 ) - | ((in[ 8 + inpos] & 255 )<<( 12 - 8 )) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( ( in[ 8 + inpos] >>> 8 ) & 4095 ) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( in[ 8 + inpos] >>> 20 ) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( ( in[ 9 + inpos] >>> 0 ) & 4095 ) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( ( in[ 9 + inpos] >>> 12 ) & 4095 ) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( in[ 9 + inpos] >>> 24 ) - | ((in[ 10 + inpos] & 15 )<<( 12 - 4 )) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( ( in[ 10 + inpos] >>> 4 ) & 4095 ) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( ( in[ 10 + inpos] >>> 16 ) & 4095 ) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( in[ 10 + inpos] >>> 28 ) - | ((in[ 11 + inpos] & 255 )<<( 12 - 8 )) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( ( in[ 11 + inpos] >>> 8 ) & 4095 ) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 11 + inpos] >>> 20 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack13(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 8191 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( ( in[ 0 + inpos] >>> 13 ) & 8191 ) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( in[ 0 + inpos] >>> 26 ) - | ((in[ 1 + inpos] & 127 )<<( 13 - 7 )) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( ( in[ 1 + inpos] >>> 7 ) & 8191 ) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( in[ 1 + inpos] >>> 20 ) - | ((in[ 2 + inpos] & 1 )<<( 13 - 1 )) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( ( in[ 2 + inpos] >>> 1 ) & 8191 ) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( ( in[ 2 + inpos] >>> 14 ) & 8191 ) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( in[ 2 + inpos] >>> 27 ) - | ((in[ 3 + inpos] & 255 )<<( 13 - 8 )) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( ( in[ 3 + inpos] >>> 8 ) & 8191 ) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( in[ 3 + inpos] >>> 21 ) - | ((in[ 4 + inpos] & 3 )<<( 13 - 2 )) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( ( in[ 4 + inpos] >>> 2 ) & 8191 ) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( ( in[ 4 + inpos] >>> 15 ) & 8191 ) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( in[ 4 + inpos] >>> 28 ) - | ((in[ 5 + inpos] & 511 )<<( 13 - 9 )) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( ( in[ 5 + inpos] >>> 9 ) & 8191 ) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( in[ 5 + inpos] >>> 22 ) - | ((in[ 6 + inpos] & 7 )<<( 13 - 3 )) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( ( in[ 6 + inpos] >>> 3 ) & 8191 ) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( ( in[ 6 + inpos] >>> 16 ) & 8191 ) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( in[ 6 + inpos] >>> 29 ) - | ((in[ 7 + inpos] & 1023 )<<( 13 - 10 )) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( ( in[ 7 + inpos] >>> 10 ) & 8191 ) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( in[ 7 + inpos] >>> 23 ) - | ((in[ 8 + inpos] & 15 )<<( 13 - 4 )) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( ( in[ 8 + inpos] >>> 4 ) & 8191 ) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( ( in[ 8 + inpos] >>> 17 ) & 8191 ) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( in[ 8 + inpos] >>> 30 ) - | ((in[ 9 + inpos] & 2047 )<<( 13 - 11 )) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( ( in[ 9 + inpos] >>> 11 ) & 8191 ) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( in[ 9 + inpos] >>> 24 ) - | ((in[ 10 + inpos] & 31 )<<( 13 - 5 )) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( ( in[ 10 + inpos] >>> 5 ) & 8191 ) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( ( in[ 10 + inpos] >>> 18 ) & 8191 ) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( in[ 10 + inpos] >>> 31 ) - | ((in[ 11 + inpos] & 4095 )<<( 13 - 12 )) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( ( in[ 11 + inpos] >>> 12 ) & 8191 ) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( in[ 11 + inpos] >>> 25 ) - | ((in[ 12 + inpos] & 63 )<<( 13 - 6 )) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( ( in[ 12 + inpos] >>> 6 ) & 8191 ) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 12 + inpos] >>> 19 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack14(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 16383 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( ( in[ 0 + inpos] >>> 14 ) & 16383 ) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( in[ 0 + inpos] >>> 28 ) - | ((in[ 1 + inpos] & 1023 )<<( 14 - 10 )) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( ( in[ 1 + inpos] >>> 10 ) & 16383 ) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( in[ 1 + inpos] >>> 24 ) - | ((in[ 2 + inpos] & 63 )<<( 14 - 6 )) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( ( in[ 2 + inpos] >>> 6 ) & 16383 ) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( in[ 2 + inpos] >>> 20 ) - | ((in[ 3 + inpos] & 3 )<<( 14 - 2 )) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( ( in[ 3 + inpos] >>> 2 ) & 16383 ) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( ( in[ 3 + inpos] >>> 16 ) & 16383 ) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( in[ 3 + inpos] >>> 30 ) - | ((in[ 4 + inpos] & 4095 )<<( 14 - 12 )) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( ( in[ 4 + inpos] >>> 12 ) & 16383 ) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( in[ 4 + inpos] >>> 26 ) - | ((in[ 5 + inpos] & 255 )<<( 14 - 8 )) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( ( in[ 5 + inpos] >>> 8 ) & 16383 ) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( in[ 5 + inpos] >>> 22 ) - | ((in[ 6 + inpos] & 15 )<<( 14 - 4 )) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( ( in[ 6 + inpos] >>> 4 ) & 16383 ) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( in[ 6 + inpos] >>> 18 ) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( ( in[ 7 + inpos] >>> 0 ) & 16383 ) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( ( in[ 7 + inpos] >>> 14 ) & 16383 ) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( in[ 7 + inpos] >>> 28 ) - | ((in[ 8 + inpos] & 1023 )<<( 14 - 10 )) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( ( in[ 8 + inpos] >>> 10 ) & 16383 ) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( in[ 8 + inpos] >>> 24 ) - | ((in[ 9 + inpos] & 63 )<<( 14 - 6 )) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( ( in[ 9 + inpos] >>> 6 ) & 16383 ) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( in[ 9 + inpos] >>> 20 ) - | ((in[ 10 + inpos] & 3 )<<( 14 - 2 )) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( ( in[ 10 + inpos] >>> 2 ) & 16383 ) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( ( in[ 10 + inpos] >>> 16 ) & 16383 ) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( in[ 10 + inpos] >>> 30 ) - | ((in[ 11 + inpos] & 4095 )<<( 14 - 12 )) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( ( in[ 11 + inpos] >>> 12 ) & 16383 ) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( in[ 11 + inpos] >>> 26 ) - | ((in[ 12 + inpos] & 255 )<<( 14 - 8 )) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( ( in[ 12 + inpos] >>> 8 ) & 16383 ) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( in[ 12 + inpos] >>> 22 ) - | ((in[ 13 + inpos] & 15 )<<( 14 - 4 )) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( ( in[ 13 + inpos] >>> 4 ) & 16383 ) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 13 + inpos] >>> 18 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack15(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 32767 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( ( in[ 0 + inpos] >>> 15 ) & 32767 ) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( in[ 0 + inpos] >>> 30 ) - | ((in[ 1 + inpos] & 8191 )<<( 15 - 13 )) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( ( in[ 1 + inpos] >>> 13 ) & 32767 ) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( in[ 1 + inpos] >>> 28 ) - | ((in[ 2 + inpos] & 2047 )<<( 15 - 11 )) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( ( in[ 2 + inpos] >>> 11 ) & 32767 ) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( in[ 2 + inpos] >>> 26 ) - | ((in[ 3 + inpos] & 511 )<<( 15 - 9 )) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( ( in[ 3 + inpos] >>> 9 ) & 32767 ) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( in[ 3 + inpos] >>> 24 ) - | ((in[ 4 + inpos] & 127 )<<( 15 - 7 )) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( ( in[ 4 + inpos] >>> 7 ) & 32767 ) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( in[ 4 + inpos] >>> 22 ) - | ((in[ 5 + inpos] & 31 )<<( 15 - 5 )) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( ( in[ 5 + inpos] >>> 5 ) & 32767 ) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( in[ 5 + inpos] >>> 20 ) - | ((in[ 6 + inpos] & 7 )<<( 15 - 3 )) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( ( in[ 6 + inpos] >>> 3 ) & 32767 ) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( in[ 6 + inpos] >>> 18 ) - | ((in[ 7 + inpos] & 1 )<<( 15 - 1 )) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( ( in[ 7 + inpos] >>> 1 ) & 32767 ) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( ( in[ 7 + inpos] >>> 16 ) & 32767 ) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( in[ 7 + inpos] >>> 31 ) - | ((in[ 8 + inpos] & 16383 )<<( 15 - 14 )) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( ( in[ 8 + inpos] >>> 14 ) & 32767 ) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( in[ 8 + inpos] >>> 29 ) - | ((in[ 9 + inpos] & 4095 )<<( 15 - 12 )) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( ( in[ 9 + inpos] >>> 12 ) & 32767 ) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( in[ 9 + inpos] >>> 27 ) - | ((in[ 10 + inpos] & 1023 )<<( 15 - 10 )) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( ( in[ 10 + inpos] >>> 10 ) & 32767 ) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( in[ 10 + inpos] >>> 25 ) - | ((in[ 11 + inpos] & 255 )<<( 15 - 8 )) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( ( in[ 11 + inpos] >>> 8 ) & 32767 ) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( in[ 11 + inpos] >>> 23 ) - | ((in[ 12 + inpos] & 63 )<<( 15 - 6 )) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( ( in[ 12 + inpos] >>> 6 ) & 32767 ) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( in[ 12 + inpos] >>> 21 ) - | ((in[ 13 + inpos] & 15 )<<( 15 - 4 )) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( ( in[ 13 + inpos] >>> 4 ) & 32767 ) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( in[ 13 + inpos] >>> 19 ) - | ((in[ 14 + inpos] & 3 )<<( 15 - 2 )) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( ( in[ 14 + inpos] >>> 2 ) & 32767 ) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 14 + inpos] >>> 17 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack16(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 65535 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( in[ 0 + inpos] >>> 16 ) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( ( in[ 1 + inpos] >>> 0 ) & 65535 ) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( in[ 1 + inpos] >>> 16 ) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( ( in[ 2 + inpos] >>> 0 ) & 65535 ) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( in[ 2 + inpos] >>> 16 ) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( ( in[ 3 + inpos] >>> 0 ) & 65535 ) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( in[ 3 + inpos] >>> 16 ) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( ( in[ 4 + inpos] >>> 0 ) & 65535 ) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( in[ 4 + inpos] >>> 16 ) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( ( in[ 5 + inpos] >>> 0 ) & 65535 ) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( in[ 5 + inpos] >>> 16 ) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( ( in[ 6 + inpos] >>> 0 ) & 65535 ) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( in[ 6 + inpos] >>> 16 ) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( ( in[ 7 + inpos] >>> 0 ) & 65535 ) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( in[ 7 + inpos] >>> 16 ) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( ( in[ 8 + inpos] >>> 0 ) & 65535 ) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( in[ 8 + inpos] >>> 16 ) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( ( in[ 9 + inpos] >>> 0 ) & 65535 ) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( in[ 9 + inpos] >>> 16 ) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( ( in[ 10 + inpos] >>> 0 ) & 65535 ) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( in[ 10 + inpos] >>> 16 ) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( ( in[ 11 + inpos] >>> 0 ) & 65535 ) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( in[ 11 + inpos] >>> 16 ) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( ( in[ 12 + inpos] >>> 0 ) & 65535 ) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( in[ 12 + inpos] >>> 16 ) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( ( in[ 13 + inpos] >>> 0 ) & 65535 ) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( in[ 13 + inpos] >>> 16 ) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( ( in[ 14 + inpos] >>> 0 ) & 65535 ) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( in[ 14 + inpos] >>> 16 ) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( ( in[ 15 + inpos] >>> 0 ) & 65535 ) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 15 + inpos] >>> 16 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack17(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 131071 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( in[ 0 + inpos] >>> 17 ) - | ((in[ 1 + inpos] & 3 )<<( 17 - 2 )) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( ( in[ 1 + inpos] >>> 2 ) & 131071 ) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( in[ 1 + inpos] >>> 19 ) - | ((in[ 2 + inpos] & 15 )<<( 17 - 4 )) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( ( in[ 2 + inpos] >>> 4 ) & 131071 ) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( in[ 2 + inpos] >>> 21 ) - | ((in[ 3 + inpos] & 63 )<<( 17 - 6 )) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( ( in[ 3 + inpos] >>> 6 ) & 131071 ) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( in[ 3 + inpos] >>> 23 ) - | ((in[ 4 + inpos] & 255 )<<( 17 - 8 )) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( ( in[ 4 + inpos] >>> 8 ) & 131071 ) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( in[ 4 + inpos] >>> 25 ) - | ((in[ 5 + inpos] & 1023 )<<( 17 - 10 )) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( ( in[ 5 + inpos] >>> 10 ) & 131071 ) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( in[ 5 + inpos] >>> 27 ) - | ((in[ 6 + inpos] & 4095 )<<( 17 - 12 )) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( ( in[ 6 + inpos] >>> 12 ) & 131071 ) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( in[ 6 + inpos] >>> 29 ) - | ((in[ 7 + inpos] & 16383 )<<( 17 - 14 )) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( ( in[ 7 + inpos] >>> 14 ) & 131071 ) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( in[ 7 + inpos] >>> 31 ) - | ((in[ 8 + inpos] & 65535 )<<( 17 - 16 )) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( in[ 8 + inpos] >>> 16 ) - | ((in[ 9 + inpos] & 1 )<<( 17 - 1 )) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( ( in[ 9 + inpos] >>> 1 ) & 131071 ) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( in[ 9 + inpos] >>> 18 ) - | ((in[ 10 + inpos] & 7 )<<( 17 - 3 )) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( ( in[ 10 + inpos] >>> 3 ) & 131071 ) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( in[ 10 + inpos] >>> 20 ) - | ((in[ 11 + inpos] & 31 )<<( 17 - 5 )) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( ( in[ 11 + inpos] >>> 5 ) & 131071 ) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( in[ 11 + inpos] >>> 22 ) - | ((in[ 12 + inpos] & 127 )<<( 17 - 7 )) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( ( in[ 12 + inpos] >>> 7 ) & 131071 ) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( in[ 12 + inpos] >>> 24 ) - | ((in[ 13 + inpos] & 511 )<<( 17 - 9 )) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( ( in[ 13 + inpos] >>> 9 ) & 131071 ) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( in[ 13 + inpos] >>> 26 ) - | ((in[ 14 + inpos] & 2047 )<<( 17 - 11 )) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( ( in[ 14 + inpos] >>> 11 ) & 131071 ) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( in[ 14 + inpos] >>> 28 ) - | ((in[ 15 + inpos] & 8191 )<<( 17 - 13 )) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( ( in[ 15 + inpos] >>> 13 ) & 131071 ) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( in[ 15 + inpos] >>> 30 ) - | ((in[ 16 + inpos] & 32767 )<<( 17 - 15 )) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 16 + inpos] >>> 15 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack18(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 262143 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( in[ 0 + inpos] >>> 18 ) - | ((in[ 1 + inpos] & 15 )<<( 18 - 4 )) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( ( in[ 1 + inpos] >>> 4 ) & 262143 ) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( in[ 1 + inpos] >>> 22 ) - | ((in[ 2 + inpos] & 255 )<<( 18 - 8 )) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( ( in[ 2 + inpos] >>> 8 ) & 262143 ) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( in[ 2 + inpos] >>> 26 ) - | ((in[ 3 + inpos] & 4095 )<<( 18 - 12 )) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( ( in[ 3 + inpos] >>> 12 ) & 262143 ) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( in[ 3 + inpos] >>> 30 ) - | ((in[ 4 + inpos] & 65535 )<<( 18 - 16 )) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( in[ 4 + inpos] >>> 16 ) - | ((in[ 5 + inpos] & 3 )<<( 18 - 2 )) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( ( in[ 5 + inpos] >>> 2 ) & 262143 ) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( in[ 5 + inpos] >>> 20 ) - | ((in[ 6 + inpos] & 63 )<<( 18 - 6 )) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( ( in[ 6 + inpos] >>> 6 ) & 262143 ) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( in[ 6 + inpos] >>> 24 ) - | ((in[ 7 + inpos] & 1023 )<<( 18 - 10 )) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( ( in[ 7 + inpos] >>> 10 ) & 262143 ) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( in[ 7 + inpos] >>> 28 ) - | ((in[ 8 + inpos] & 16383 )<<( 18 - 14 )) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( in[ 8 + inpos] >>> 14 ) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( ( in[ 9 + inpos] >>> 0 ) & 262143 ) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( in[ 9 + inpos] >>> 18 ) - | ((in[ 10 + inpos] & 15 )<<( 18 - 4 )) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( ( in[ 10 + inpos] >>> 4 ) & 262143 ) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( in[ 10 + inpos] >>> 22 ) - | ((in[ 11 + inpos] & 255 )<<( 18 - 8 )) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( ( in[ 11 + inpos] >>> 8 ) & 262143 ) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( in[ 11 + inpos] >>> 26 ) - | ((in[ 12 + inpos] & 4095 )<<( 18 - 12 )) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( ( in[ 12 + inpos] >>> 12 ) & 262143 ) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( in[ 12 + inpos] >>> 30 ) - | ((in[ 13 + inpos] & 65535 )<<( 18 - 16 )) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( in[ 13 + inpos] >>> 16 ) - | ((in[ 14 + inpos] & 3 )<<( 18 - 2 )) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( ( in[ 14 + inpos] >>> 2 ) & 262143 ) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( in[ 14 + inpos] >>> 20 ) - | ((in[ 15 + inpos] & 63 )<<( 18 - 6 )) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( ( in[ 15 + inpos] >>> 6 ) & 262143 ) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( in[ 15 + inpos] >>> 24 ) - | ((in[ 16 + inpos] & 1023 )<<( 18 - 10 )) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( ( in[ 16 + inpos] >>> 10 ) & 262143 ) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( in[ 16 + inpos] >>> 28 ) - | ((in[ 17 + inpos] & 16383 )<<( 18 - 14 )) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 17 + inpos] >>> 14 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack19(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 524287 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( in[ 0 + inpos] >>> 19 ) - | ((in[ 1 + inpos] & 63 )<<( 19 - 6 )) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( ( in[ 1 + inpos] >>> 6 ) & 524287 ) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( in[ 1 + inpos] >>> 25 ) - | ((in[ 2 + inpos] & 4095 )<<( 19 - 12 )) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( ( in[ 2 + inpos] >>> 12 ) & 524287 ) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( in[ 2 + inpos] >>> 31 ) - | ((in[ 3 + inpos] & 262143 )<<( 19 - 18 )) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( in[ 3 + inpos] >>> 18 ) - | ((in[ 4 + inpos] & 31 )<<( 19 - 5 )) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( ( in[ 4 + inpos] >>> 5 ) & 524287 ) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( in[ 4 + inpos] >>> 24 ) - | ((in[ 5 + inpos] & 2047 )<<( 19 - 11 )) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( ( in[ 5 + inpos] >>> 11 ) & 524287 ) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( in[ 5 + inpos] >>> 30 ) - | ((in[ 6 + inpos] & 131071 )<<( 19 - 17 )) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( in[ 6 + inpos] >>> 17 ) - | ((in[ 7 + inpos] & 15 )<<( 19 - 4 )) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( ( in[ 7 + inpos] >>> 4 ) & 524287 ) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( in[ 7 + inpos] >>> 23 ) - | ((in[ 8 + inpos] & 1023 )<<( 19 - 10 )) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( ( in[ 8 + inpos] >>> 10 ) & 524287 ) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( in[ 8 + inpos] >>> 29 ) - | ((in[ 9 + inpos] & 65535 )<<( 19 - 16 )) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( in[ 9 + inpos] >>> 16 ) - | ((in[ 10 + inpos] & 7 )<<( 19 - 3 )) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( ( in[ 10 + inpos] >>> 3 ) & 524287 ) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( in[ 10 + inpos] >>> 22 ) - | ((in[ 11 + inpos] & 511 )<<( 19 - 9 )) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( ( in[ 11 + inpos] >>> 9 ) & 524287 ) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( in[ 11 + inpos] >>> 28 ) - | ((in[ 12 + inpos] & 32767 )<<( 19 - 15 )) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( in[ 12 + inpos] >>> 15 ) - | ((in[ 13 + inpos] & 3 )<<( 19 - 2 )) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( ( in[ 13 + inpos] >>> 2 ) & 524287 ) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( in[ 13 + inpos] >>> 21 ) - | ((in[ 14 + inpos] & 255 )<<( 19 - 8 )) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( ( in[ 14 + inpos] >>> 8 ) & 524287 ) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( in[ 14 + inpos] >>> 27 ) - | ((in[ 15 + inpos] & 16383 )<<( 19 - 14 )) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( in[ 15 + inpos] >>> 14 ) - | ((in[ 16 + inpos] & 1 )<<( 19 - 1 )) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( ( in[ 16 + inpos] >>> 1 ) & 524287 ) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( in[ 16 + inpos] >>> 20 ) - | ((in[ 17 + inpos] & 127 )<<( 19 - 7 )) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( ( in[ 17 + inpos] >>> 7 ) & 524287 ) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( in[ 17 + inpos] >>> 26 ) - | ((in[ 18 + inpos] & 8191 )<<( 19 - 13 )) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 18 + inpos] >>> 13 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack20(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 1048575 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( in[ 0 + inpos] >>> 20 ) - | ((in[ 1 + inpos] & 255 )<<( 20 - 8 )) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( ( in[ 1 + inpos] >>> 8 ) & 1048575 ) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( in[ 1 + inpos] >>> 28 ) - | ((in[ 2 + inpos] & 65535 )<<( 20 - 16 )) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( in[ 2 + inpos] >>> 16 ) - | ((in[ 3 + inpos] & 15 )<<( 20 - 4 )) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( ( in[ 3 + inpos] >>> 4 ) & 1048575 ) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( in[ 3 + inpos] >>> 24 ) - | ((in[ 4 + inpos] & 4095 )<<( 20 - 12 )) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( in[ 4 + inpos] >>> 12 ) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( ( in[ 5 + inpos] >>> 0 ) & 1048575 ) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( in[ 5 + inpos] >>> 20 ) - | ((in[ 6 + inpos] & 255 )<<( 20 - 8 )) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( ( in[ 6 + inpos] >>> 8 ) & 1048575 ) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( in[ 6 + inpos] >>> 28 ) - | ((in[ 7 + inpos] & 65535 )<<( 20 - 16 )) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( in[ 7 + inpos] >>> 16 ) - | ((in[ 8 + inpos] & 15 )<<( 20 - 4 )) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( ( in[ 8 + inpos] >>> 4 ) & 1048575 ) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( in[ 8 + inpos] >>> 24 ) - | ((in[ 9 + inpos] & 4095 )<<( 20 - 12 )) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( in[ 9 + inpos] >>> 12 ) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( ( in[ 10 + inpos] >>> 0 ) & 1048575 ) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( in[ 10 + inpos] >>> 20 ) - | ((in[ 11 + inpos] & 255 )<<( 20 - 8 )) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( ( in[ 11 + inpos] >>> 8 ) & 1048575 ) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( in[ 11 + inpos] >>> 28 ) - | ((in[ 12 + inpos] & 65535 )<<( 20 - 16 )) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( in[ 12 + inpos] >>> 16 ) - | ((in[ 13 + inpos] & 15 )<<( 20 - 4 )) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( ( in[ 13 + inpos] >>> 4 ) & 1048575 ) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( in[ 13 + inpos] >>> 24 ) - | ((in[ 14 + inpos] & 4095 )<<( 20 - 12 )) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( in[ 14 + inpos] >>> 12 ) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( ( in[ 15 + inpos] >>> 0 ) & 1048575 ) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( in[ 15 + inpos] >>> 20 ) - | ((in[ 16 + inpos] & 255 )<<( 20 - 8 )) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( ( in[ 16 + inpos] >>> 8 ) & 1048575 ) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( in[ 16 + inpos] >>> 28 ) - | ((in[ 17 + inpos] & 65535 )<<( 20 - 16 )) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( in[ 17 + inpos] >>> 16 ) - | ((in[ 18 + inpos] & 15 )<<( 20 - 4 )) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( ( in[ 18 + inpos] >>> 4 ) & 1048575 ) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( in[ 18 + inpos] >>> 24 ) - | ((in[ 19 + inpos] & 4095 )<<( 20 - 12 )) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 19 + inpos] >>> 12 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack21(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 2097151 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( in[ 0 + inpos] >>> 21 ) - | ((in[ 1 + inpos] & 1023 )<<( 21 - 10 )) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( ( in[ 1 + inpos] >>> 10 ) & 2097151 ) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( in[ 1 + inpos] >>> 31 ) - | ((in[ 2 + inpos] & 1048575 )<<( 21 - 20 )) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( in[ 2 + inpos] >>> 20 ) - | ((in[ 3 + inpos] & 511 )<<( 21 - 9 )) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( ( in[ 3 + inpos] >>> 9 ) & 2097151 ) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( in[ 3 + inpos] >>> 30 ) - | ((in[ 4 + inpos] & 524287 )<<( 21 - 19 )) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( in[ 4 + inpos] >>> 19 ) - | ((in[ 5 + inpos] & 255 )<<( 21 - 8 )) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( ( in[ 5 + inpos] >>> 8 ) & 2097151 ) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( in[ 5 + inpos] >>> 29 ) - | ((in[ 6 + inpos] & 262143 )<<( 21 - 18 )) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( in[ 6 + inpos] >>> 18 ) - | ((in[ 7 + inpos] & 127 )<<( 21 - 7 )) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( ( in[ 7 + inpos] >>> 7 ) & 2097151 ) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( in[ 7 + inpos] >>> 28 ) - | ((in[ 8 + inpos] & 131071 )<<( 21 - 17 )) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( in[ 8 + inpos] >>> 17 ) - | ((in[ 9 + inpos] & 63 )<<( 21 - 6 )) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( ( in[ 9 + inpos] >>> 6 ) & 2097151 ) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( in[ 9 + inpos] >>> 27 ) - | ((in[ 10 + inpos] & 65535 )<<( 21 - 16 )) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( in[ 10 + inpos] >>> 16 ) - | ((in[ 11 + inpos] & 31 )<<( 21 - 5 )) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( ( in[ 11 + inpos] >>> 5 ) & 2097151 ) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( in[ 11 + inpos] >>> 26 ) - | ((in[ 12 + inpos] & 32767 )<<( 21 - 15 )) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( in[ 12 + inpos] >>> 15 ) - | ((in[ 13 + inpos] & 15 )<<( 21 - 4 )) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( ( in[ 13 + inpos] >>> 4 ) & 2097151 ) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( in[ 13 + inpos] >>> 25 ) - | ((in[ 14 + inpos] & 16383 )<<( 21 - 14 )) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( in[ 14 + inpos] >>> 14 ) - | ((in[ 15 + inpos] & 7 )<<( 21 - 3 )) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( ( in[ 15 + inpos] >>> 3 ) & 2097151 ) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( in[ 15 + inpos] >>> 24 ) - | ((in[ 16 + inpos] & 8191 )<<( 21 - 13 )) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( in[ 16 + inpos] >>> 13 ) - | ((in[ 17 + inpos] & 3 )<<( 21 - 2 )) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( ( in[ 17 + inpos] >>> 2 ) & 2097151 ) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( in[ 17 + inpos] >>> 23 ) - | ((in[ 18 + inpos] & 4095 )<<( 21 - 12 )) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( in[ 18 + inpos] >>> 12 ) - | ((in[ 19 + inpos] & 1 )<<( 21 - 1 )) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( ( in[ 19 + inpos] >>> 1 ) & 2097151 ) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( in[ 19 + inpos] >>> 22 ) - | ((in[ 20 + inpos] & 2047 )<<( 21 - 11 )) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 20 + inpos] >>> 11 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack22(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 4194303 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( in[ 0 + inpos] >>> 22 ) - | ((in[ 1 + inpos] & 4095 )<<( 22 - 12 )) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( in[ 1 + inpos] >>> 12 ) - | ((in[ 2 + inpos] & 3 )<<( 22 - 2 )) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( ( in[ 2 + inpos] >>> 2 ) & 4194303 ) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( in[ 2 + inpos] >>> 24 ) - | ((in[ 3 + inpos] & 16383 )<<( 22 - 14 )) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( in[ 3 + inpos] >>> 14 ) - | ((in[ 4 + inpos] & 15 )<<( 22 - 4 )) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( ( in[ 4 + inpos] >>> 4 ) & 4194303 ) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( in[ 4 + inpos] >>> 26 ) - | ((in[ 5 + inpos] & 65535 )<<( 22 - 16 )) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( in[ 5 + inpos] >>> 16 ) - | ((in[ 6 + inpos] & 63 )<<( 22 - 6 )) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( ( in[ 6 + inpos] >>> 6 ) & 4194303 ) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( in[ 6 + inpos] >>> 28 ) - | ((in[ 7 + inpos] & 262143 )<<( 22 - 18 )) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( in[ 7 + inpos] >>> 18 ) - | ((in[ 8 + inpos] & 255 )<<( 22 - 8 )) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( ( in[ 8 + inpos] >>> 8 ) & 4194303 ) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( in[ 8 + inpos] >>> 30 ) - | ((in[ 9 + inpos] & 1048575 )<<( 22 - 20 )) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( in[ 9 + inpos] >>> 20 ) - | ((in[ 10 + inpos] & 1023 )<<( 22 - 10 )) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( in[ 10 + inpos] >>> 10 ) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( ( in[ 11 + inpos] >>> 0 ) & 4194303 ) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( in[ 11 + inpos] >>> 22 ) - | ((in[ 12 + inpos] & 4095 )<<( 22 - 12 )) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( in[ 12 + inpos] >>> 12 ) - | ((in[ 13 + inpos] & 3 )<<( 22 - 2 )) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( ( in[ 13 + inpos] >>> 2 ) & 4194303 ) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( in[ 13 + inpos] >>> 24 ) - | ((in[ 14 + inpos] & 16383 )<<( 22 - 14 )) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( in[ 14 + inpos] >>> 14 ) - | ((in[ 15 + inpos] & 15 )<<( 22 - 4 )) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( ( in[ 15 + inpos] >>> 4 ) & 4194303 ) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( in[ 15 + inpos] >>> 26 ) - | ((in[ 16 + inpos] & 65535 )<<( 22 - 16 )) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( in[ 16 + inpos] >>> 16 ) - | ((in[ 17 + inpos] & 63 )<<( 22 - 6 )) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( ( in[ 17 + inpos] >>> 6 ) & 4194303 ) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( in[ 17 + inpos] >>> 28 ) - | ((in[ 18 + inpos] & 262143 )<<( 22 - 18 )) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( in[ 18 + inpos] >>> 18 ) - | ((in[ 19 + inpos] & 255 )<<( 22 - 8 )) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( ( in[ 19 + inpos] >>> 8 ) & 4194303 ) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( in[ 19 + inpos] >>> 30 ) - | ((in[ 20 + inpos] & 1048575 )<<( 22 - 20 )) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( in[ 20 + inpos] >>> 20 ) - | ((in[ 21 + inpos] & 1023 )<<( 22 - 10 )) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 21 + inpos] >>> 10 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack23(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 8388607 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( in[ 0 + inpos] >>> 23 ) - | ((in[ 1 + inpos] & 16383 )<<( 23 - 14 )) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( in[ 1 + inpos] >>> 14 ) - | ((in[ 2 + inpos] & 31 )<<( 23 - 5 )) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( ( in[ 2 + inpos] >>> 5 ) & 8388607 ) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( in[ 2 + inpos] >>> 28 ) - | ((in[ 3 + inpos] & 524287 )<<( 23 - 19 )) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( in[ 3 + inpos] >>> 19 ) - | ((in[ 4 + inpos] & 1023 )<<( 23 - 10 )) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( in[ 4 + inpos] >>> 10 ) - | ((in[ 5 + inpos] & 1 )<<( 23 - 1 )) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( ( in[ 5 + inpos] >>> 1 ) & 8388607 ) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( in[ 5 + inpos] >>> 24 ) - | ((in[ 6 + inpos] & 32767 )<<( 23 - 15 )) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( in[ 6 + inpos] >>> 15 ) - | ((in[ 7 + inpos] & 63 )<<( 23 - 6 )) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( ( in[ 7 + inpos] >>> 6 ) & 8388607 ) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( in[ 7 + inpos] >>> 29 ) - | ((in[ 8 + inpos] & 1048575 )<<( 23 - 20 )) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( in[ 8 + inpos] >>> 20 ) - | ((in[ 9 + inpos] & 2047 )<<( 23 - 11 )) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( in[ 9 + inpos] >>> 11 ) - | ((in[ 10 + inpos] & 3 )<<( 23 - 2 )) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( ( in[ 10 + inpos] >>> 2 ) & 8388607 ) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( in[ 10 + inpos] >>> 25 ) - | ((in[ 11 + inpos] & 65535 )<<( 23 - 16 )) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( in[ 11 + inpos] >>> 16 ) - | ((in[ 12 + inpos] & 127 )<<( 23 - 7 )) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( ( in[ 12 + inpos] >>> 7 ) & 8388607 ) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( in[ 12 + inpos] >>> 30 ) - | ((in[ 13 + inpos] & 2097151 )<<( 23 - 21 )) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( in[ 13 + inpos] >>> 21 ) - | ((in[ 14 + inpos] & 4095 )<<( 23 - 12 )) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( in[ 14 + inpos] >>> 12 ) - | ((in[ 15 + inpos] & 7 )<<( 23 - 3 )) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( ( in[ 15 + inpos] >>> 3 ) & 8388607 ) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( in[ 15 + inpos] >>> 26 ) - | ((in[ 16 + inpos] & 131071 )<<( 23 - 17 )) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( in[ 16 + inpos] >>> 17 ) - | ((in[ 17 + inpos] & 255 )<<( 23 - 8 )) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( ( in[ 17 + inpos] >>> 8 ) & 8388607 ) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( in[ 17 + inpos] >>> 31 ) - | ((in[ 18 + inpos] & 4194303 )<<( 23 - 22 )) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( in[ 18 + inpos] >>> 22 ) - | ((in[ 19 + inpos] & 8191 )<<( 23 - 13 )) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( in[ 19 + inpos] >>> 13 ) - | ((in[ 20 + inpos] & 15 )<<( 23 - 4 )) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( ( in[ 20 + inpos] >>> 4 ) & 8388607 ) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( in[ 20 + inpos] >>> 27 ) - | ((in[ 21 + inpos] & 262143 )<<( 23 - 18 )) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( in[ 21 + inpos] >>> 18 ) - | ((in[ 22 + inpos] & 511 )<<( 23 - 9 )) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 22 + inpos] >>> 9 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack24(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 16777215 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( in[ 0 + inpos] >>> 24 ) - | ((in[ 1 + inpos] & 65535 )<<( 24 - 16 )) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( in[ 1 + inpos] >>> 16 ) - | ((in[ 2 + inpos] & 255 )<<( 24 - 8 )) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( in[ 2 + inpos] >>> 8 ) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( ( in[ 3 + inpos] >>> 0 ) & 16777215 ) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( in[ 3 + inpos] >>> 24 ) - | ((in[ 4 + inpos] & 65535 )<<( 24 - 16 )) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( in[ 4 + inpos] >>> 16 ) - | ((in[ 5 + inpos] & 255 )<<( 24 - 8 )) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( in[ 5 + inpos] >>> 8 ) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( ( in[ 6 + inpos] >>> 0 ) & 16777215 ) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( in[ 6 + inpos] >>> 24 ) - | ((in[ 7 + inpos] & 65535 )<<( 24 - 16 )) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( in[ 7 + inpos] >>> 16 ) - | ((in[ 8 + inpos] & 255 )<<( 24 - 8 )) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( in[ 8 + inpos] >>> 8 ) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( ( in[ 9 + inpos] >>> 0 ) & 16777215 ) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( in[ 9 + inpos] >>> 24 ) - | ((in[ 10 + inpos] & 65535 )<<( 24 - 16 )) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( in[ 10 + inpos] >>> 16 ) - | ((in[ 11 + inpos] & 255 )<<( 24 - 8 )) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( in[ 11 + inpos] >>> 8 ) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( ( in[ 12 + inpos] >>> 0 ) & 16777215 ) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( in[ 12 + inpos] >>> 24 ) - | ((in[ 13 + inpos] & 65535 )<<( 24 - 16 )) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( in[ 13 + inpos] >>> 16 ) - | ((in[ 14 + inpos] & 255 )<<( 24 - 8 )) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( in[ 14 + inpos] >>> 8 ) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( ( in[ 15 + inpos] >>> 0 ) & 16777215 ) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( in[ 15 + inpos] >>> 24 ) - | ((in[ 16 + inpos] & 65535 )<<( 24 - 16 )) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( in[ 16 + inpos] >>> 16 ) - | ((in[ 17 + inpos] & 255 )<<( 24 - 8 )) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( in[ 17 + inpos] >>> 8 ) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( ( in[ 18 + inpos] >>> 0 ) & 16777215 ) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( in[ 18 + inpos] >>> 24 ) - | ((in[ 19 + inpos] & 65535 )<<( 24 - 16 )) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( in[ 19 + inpos] >>> 16 ) - | ((in[ 20 + inpos] & 255 )<<( 24 - 8 )) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( in[ 20 + inpos] >>> 8 ) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( ( in[ 21 + inpos] >>> 0 ) & 16777215 ) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( in[ 21 + inpos] >>> 24 ) - | ((in[ 22 + inpos] & 65535 )<<( 24 - 16 )) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( in[ 22 + inpos] >>> 16 ) - | ((in[ 23 + inpos] & 255 )<<( 24 - 8 )) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 23 + inpos] >>> 8 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack25(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 33554431 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( in[ 0 + inpos] >>> 25 ) - | ((in[ 1 + inpos] & 262143 )<<( 25 - 18 )) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( in[ 1 + inpos] >>> 18 ) - | ((in[ 2 + inpos] & 2047 )<<( 25 - 11 )) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( in[ 2 + inpos] >>> 11 ) - | ((in[ 3 + inpos] & 15 )<<( 25 - 4 )) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( ( in[ 3 + inpos] >>> 4 ) & 33554431 ) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( in[ 3 + inpos] >>> 29 ) - | ((in[ 4 + inpos] & 4194303 )<<( 25 - 22 )) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( in[ 4 + inpos] >>> 22 ) - | ((in[ 5 + inpos] & 32767 )<<( 25 - 15 )) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( in[ 5 + inpos] >>> 15 ) - | ((in[ 6 + inpos] & 255 )<<( 25 - 8 )) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( in[ 6 + inpos] >>> 8 ) - | ((in[ 7 + inpos] & 1 )<<( 25 - 1 )) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( ( in[ 7 + inpos] >>> 1 ) & 33554431 ) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( in[ 7 + inpos] >>> 26 ) - | ((in[ 8 + inpos] & 524287 )<<( 25 - 19 )) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( in[ 8 + inpos] >>> 19 ) - | ((in[ 9 + inpos] & 4095 )<<( 25 - 12 )) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( in[ 9 + inpos] >>> 12 ) - | ((in[ 10 + inpos] & 31 )<<( 25 - 5 )) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( ( in[ 10 + inpos] >>> 5 ) & 33554431 ) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( in[ 10 + inpos] >>> 30 ) - | ((in[ 11 + inpos] & 8388607 )<<( 25 - 23 )) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( in[ 11 + inpos] >>> 23 ) - | ((in[ 12 + inpos] & 65535 )<<( 25 - 16 )) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( in[ 12 + inpos] >>> 16 ) - | ((in[ 13 + inpos] & 511 )<<( 25 - 9 )) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( in[ 13 + inpos] >>> 9 ) - | ((in[ 14 + inpos] & 3 )<<( 25 - 2 )) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( ( in[ 14 + inpos] >>> 2 ) & 33554431 ) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( in[ 14 + inpos] >>> 27 ) - | ((in[ 15 + inpos] & 1048575 )<<( 25 - 20 )) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( in[ 15 + inpos] >>> 20 ) - | ((in[ 16 + inpos] & 8191 )<<( 25 - 13 )) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( in[ 16 + inpos] >>> 13 ) - | ((in[ 17 + inpos] & 63 )<<( 25 - 6 )) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( ( in[ 17 + inpos] >>> 6 ) & 33554431 ) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( in[ 17 + inpos] >>> 31 ) - | ((in[ 18 + inpos] & 16777215 )<<( 25 - 24 )) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( in[ 18 + inpos] >>> 24 ) - | ((in[ 19 + inpos] & 131071 )<<( 25 - 17 )) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( in[ 19 + inpos] >>> 17 ) - | ((in[ 20 + inpos] & 1023 )<<( 25 - 10 )) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( in[ 20 + inpos] >>> 10 ) - | ((in[ 21 + inpos] & 7 )<<( 25 - 3 )) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( ( in[ 21 + inpos] >>> 3 ) & 33554431 ) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( in[ 21 + inpos] >>> 28 ) - | ((in[ 22 + inpos] & 2097151 )<<( 25 - 21 )) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( in[ 22 + inpos] >>> 21 ) - | ((in[ 23 + inpos] & 16383 )<<( 25 - 14 )) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( in[ 23 + inpos] >>> 14 ) - | ((in[ 24 + inpos] & 127 )<<( 25 - 7 )) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 24 + inpos] >>> 7 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack26(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 67108863 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( in[ 0 + inpos] >>> 26 ) - | ((in[ 1 + inpos] & 1048575 )<<( 26 - 20 )) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( in[ 1 + inpos] >>> 20 ) - | ((in[ 2 + inpos] & 16383 )<<( 26 - 14 )) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( in[ 2 + inpos] >>> 14 ) - | ((in[ 3 + inpos] & 255 )<<( 26 - 8 )) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( in[ 3 + inpos] >>> 8 ) - | ((in[ 4 + inpos] & 3 )<<( 26 - 2 )) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( ( in[ 4 + inpos] >>> 2 ) & 67108863 ) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( in[ 4 + inpos] >>> 28 ) - | ((in[ 5 + inpos] & 4194303 )<<( 26 - 22 )) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( in[ 5 + inpos] >>> 22 ) - | ((in[ 6 + inpos] & 65535 )<<( 26 - 16 )) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( in[ 6 + inpos] >>> 16 ) - | ((in[ 7 + inpos] & 1023 )<<( 26 - 10 )) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( in[ 7 + inpos] >>> 10 ) - | ((in[ 8 + inpos] & 15 )<<( 26 - 4 )) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( ( in[ 8 + inpos] >>> 4 ) & 67108863 ) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( in[ 8 + inpos] >>> 30 ) - | ((in[ 9 + inpos] & 16777215 )<<( 26 - 24 )) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( in[ 9 + inpos] >>> 24 ) - | ((in[ 10 + inpos] & 262143 )<<( 26 - 18 )) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( in[ 10 + inpos] >>> 18 ) - | ((in[ 11 + inpos] & 4095 )<<( 26 - 12 )) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( in[ 11 + inpos] >>> 12 ) - | ((in[ 12 + inpos] & 63 )<<( 26 - 6 )) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( in[ 12 + inpos] >>> 6 ) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( ( in[ 13 + inpos] >>> 0 ) & 67108863 ) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( in[ 13 + inpos] >>> 26 ) - | ((in[ 14 + inpos] & 1048575 )<<( 26 - 20 )) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( in[ 14 + inpos] >>> 20 ) - | ((in[ 15 + inpos] & 16383 )<<( 26 - 14 )) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( in[ 15 + inpos] >>> 14 ) - | ((in[ 16 + inpos] & 255 )<<( 26 - 8 )) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( in[ 16 + inpos] >>> 8 ) - | ((in[ 17 + inpos] & 3 )<<( 26 - 2 )) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( ( in[ 17 + inpos] >>> 2 ) & 67108863 ) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( in[ 17 + inpos] >>> 28 ) - | ((in[ 18 + inpos] & 4194303 )<<( 26 - 22 )) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( in[ 18 + inpos] >>> 22 ) - | ((in[ 19 + inpos] & 65535 )<<( 26 - 16 )) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( in[ 19 + inpos] >>> 16 ) - | ((in[ 20 + inpos] & 1023 )<<( 26 - 10 )) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( in[ 20 + inpos] >>> 10 ) - | ((in[ 21 + inpos] & 15 )<<( 26 - 4 )) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( ( in[ 21 + inpos] >>> 4 ) & 67108863 ) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( in[ 21 + inpos] >>> 30 ) - | ((in[ 22 + inpos] & 16777215 )<<( 26 - 24 )) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( in[ 22 + inpos] >>> 24 ) - | ((in[ 23 + inpos] & 262143 )<<( 26 - 18 )) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( in[ 23 + inpos] >>> 18 ) - | ((in[ 24 + inpos] & 4095 )<<( 26 - 12 )) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( in[ 24 + inpos] >>> 12 ) - | ((in[ 25 + inpos] & 63 )<<( 26 - 6 )) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 25 + inpos] >>> 6 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack27(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 134217727 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( in[ 0 + inpos] >>> 27 ) - | ((in[ 1 + inpos] & 4194303 )<<( 27 - 22 )) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( in[ 1 + inpos] >>> 22 ) - | ((in[ 2 + inpos] & 131071 )<<( 27 - 17 )) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( in[ 2 + inpos] >>> 17 ) - | ((in[ 3 + inpos] & 4095 )<<( 27 - 12 )) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( in[ 3 + inpos] >>> 12 ) - | ((in[ 4 + inpos] & 127 )<<( 27 - 7 )) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( in[ 4 + inpos] >>> 7 ) - | ((in[ 5 + inpos] & 3 )<<( 27 - 2 )) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( ( in[ 5 + inpos] >>> 2 ) & 134217727 ) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( in[ 5 + inpos] >>> 29 ) - | ((in[ 6 + inpos] & 16777215 )<<( 27 - 24 )) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( in[ 6 + inpos] >>> 24 ) - | ((in[ 7 + inpos] & 524287 )<<( 27 - 19 )) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( in[ 7 + inpos] >>> 19 ) - | ((in[ 8 + inpos] & 16383 )<<( 27 - 14 )) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( in[ 8 + inpos] >>> 14 ) - | ((in[ 9 + inpos] & 511 )<<( 27 - 9 )) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( in[ 9 + inpos] >>> 9 ) - | ((in[ 10 + inpos] & 15 )<<( 27 - 4 )) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( ( in[ 10 + inpos] >>> 4 ) & 134217727 ) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( in[ 10 + inpos] >>> 31 ) - | ((in[ 11 + inpos] & 67108863 )<<( 27 - 26 )) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( in[ 11 + inpos] >>> 26 ) - | ((in[ 12 + inpos] & 2097151 )<<( 27 - 21 )) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( in[ 12 + inpos] >>> 21 ) - | ((in[ 13 + inpos] & 65535 )<<( 27 - 16 )) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( in[ 13 + inpos] >>> 16 ) - | ((in[ 14 + inpos] & 2047 )<<( 27 - 11 )) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( in[ 14 + inpos] >>> 11 ) - | ((in[ 15 + inpos] & 63 )<<( 27 - 6 )) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( in[ 15 + inpos] >>> 6 ) - | ((in[ 16 + inpos] & 1 )<<( 27 - 1 )) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( ( in[ 16 + inpos] >>> 1 ) & 134217727 ) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( in[ 16 + inpos] >>> 28 ) - | ((in[ 17 + inpos] & 8388607 )<<( 27 - 23 )) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( in[ 17 + inpos] >>> 23 ) - | ((in[ 18 + inpos] & 262143 )<<( 27 - 18 )) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( in[ 18 + inpos] >>> 18 ) - | ((in[ 19 + inpos] & 8191 )<<( 27 - 13 )) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( in[ 19 + inpos] >>> 13 ) - | ((in[ 20 + inpos] & 255 )<<( 27 - 8 )) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( in[ 20 + inpos] >>> 8 ) - | ((in[ 21 + inpos] & 7 )<<( 27 - 3 )) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( ( in[ 21 + inpos] >>> 3 ) & 134217727 ) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( in[ 21 + inpos] >>> 30 ) - | ((in[ 22 + inpos] & 33554431 )<<( 27 - 25 )) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( in[ 22 + inpos] >>> 25 ) - | ((in[ 23 + inpos] & 1048575 )<<( 27 - 20 )) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( in[ 23 + inpos] >>> 20 ) - | ((in[ 24 + inpos] & 32767 )<<( 27 - 15 )) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( in[ 24 + inpos] >>> 15 ) - | ((in[ 25 + inpos] & 1023 )<<( 27 - 10 )) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( in[ 25 + inpos] >>> 10 ) - | ((in[ 26 + inpos] & 31 )<<( 27 - 5 )) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 26 + inpos] >>> 5 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack28(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 268435455 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( in[ 0 + inpos] >>> 28 ) - | ((in[ 1 + inpos] & 16777215 )<<( 28 - 24 )) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( in[ 1 + inpos] >>> 24 ) - | ((in[ 2 + inpos] & 1048575 )<<( 28 - 20 )) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( in[ 2 + inpos] >>> 20 ) - | ((in[ 3 + inpos] & 65535 )<<( 28 - 16 )) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( in[ 3 + inpos] >>> 16 ) - | ((in[ 4 + inpos] & 4095 )<<( 28 - 12 )) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( in[ 4 + inpos] >>> 12 ) - | ((in[ 5 + inpos] & 255 )<<( 28 - 8 )) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( in[ 5 + inpos] >>> 8 ) - | ((in[ 6 + inpos] & 15 )<<( 28 - 4 )) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( in[ 6 + inpos] >>> 4 ) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( ( in[ 7 + inpos] >>> 0 ) & 268435455 ) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( in[ 7 + inpos] >>> 28 ) - | ((in[ 8 + inpos] & 16777215 )<<( 28 - 24 )) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( in[ 8 + inpos] >>> 24 ) - | ((in[ 9 + inpos] & 1048575 )<<( 28 - 20 )) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( in[ 9 + inpos] >>> 20 ) - | ((in[ 10 + inpos] & 65535 )<<( 28 - 16 )) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( in[ 10 + inpos] >>> 16 ) - | ((in[ 11 + inpos] & 4095 )<<( 28 - 12 )) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( in[ 11 + inpos] >>> 12 ) - | ((in[ 12 + inpos] & 255 )<<( 28 - 8 )) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( in[ 12 + inpos] >>> 8 ) - | ((in[ 13 + inpos] & 15 )<<( 28 - 4 )) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( in[ 13 + inpos] >>> 4 ) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( ( in[ 14 + inpos] >>> 0 ) & 268435455 ) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( in[ 14 + inpos] >>> 28 ) - | ((in[ 15 + inpos] & 16777215 )<<( 28 - 24 )) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( in[ 15 + inpos] >>> 24 ) - | ((in[ 16 + inpos] & 1048575 )<<( 28 - 20 )) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( in[ 16 + inpos] >>> 20 ) - | ((in[ 17 + inpos] & 65535 )<<( 28 - 16 )) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( in[ 17 + inpos] >>> 16 ) - | ((in[ 18 + inpos] & 4095 )<<( 28 - 12 )) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( in[ 18 + inpos] >>> 12 ) - | ((in[ 19 + inpos] & 255 )<<( 28 - 8 )) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( in[ 19 + inpos] >>> 8 ) - | ((in[ 20 + inpos] & 15 )<<( 28 - 4 )) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( in[ 20 + inpos] >>> 4 ) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( ( in[ 21 + inpos] >>> 0 ) & 268435455 ) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( in[ 21 + inpos] >>> 28 ) - | ((in[ 22 + inpos] & 16777215 )<<( 28 - 24 )) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( in[ 22 + inpos] >>> 24 ) - | ((in[ 23 + inpos] & 1048575 )<<( 28 - 20 )) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( in[ 23 + inpos] >>> 20 ) - | ((in[ 24 + inpos] & 65535 )<<( 28 - 16 )) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( in[ 24 + inpos] >>> 16 ) - | ((in[ 25 + inpos] & 4095 )<<( 28 - 12 )) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( in[ 25 + inpos] >>> 12 ) - | ((in[ 26 + inpos] & 255 )<<( 28 - 8 )) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( in[ 26 + inpos] >>> 8 ) - | ((in[ 27 + inpos] & 15 )<<( 28 - 4 )) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 27 + inpos] >>> 4 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack29(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 536870911 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( in[ 0 + inpos] >>> 29 ) - | ((in[ 1 + inpos] & 67108863 )<<( 29 - 26 )) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( in[ 1 + inpos] >>> 26 ) - | ((in[ 2 + inpos] & 8388607 )<<( 29 - 23 )) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( in[ 2 + inpos] >>> 23 ) - | ((in[ 3 + inpos] & 1048575 )<<( 29 - 20 )) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( in[ 3 + inpos] >>> 20 ) - | ((in[ 4 + inpos] & 131071 )<<( 29 - 17 )) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( in[ 4 + inpos] >>> 17 ) - | ((in[ 5 + inpos] & 16383 )<<( 29 - 14 )) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( in[ 5 + inpos] >>> 14 ) - | ((in[ 6 + inpos] & 2047 )<<( 29 - 11 )) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( in[ 6 + inpos] >>> 11 ) - | ((in[ 7 + inpos] & 255 )<<( 29 - 8 )) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( in[ 7 + inpos] >>> 8 ) - | ((in[ 8 + inpos] & 31 )<<( 29 - 5 )) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( in[ 8 + inpos] >>> 5 ) - | ((in[ 9 + inpos] & 3 )<<( 29 - 2 )) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( ( in[ 9 + inpos] >>> 2 ) & 536870911 ) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( in[ 9 + inpos] >>> 31 ) - | ((in[ 10 + inpos] & 268435455 )<<( 29 - 28 )) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( in[ 10 + inpos] >>> 28 ) - | ((in[ 11 + inpos] & 33554431 )<<( 29 - 25 )) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( in[ 11 + inpos] >>> 25 ) - | ((in[ 12 + inpos] & 4194303 )<<( 29 - 22 )) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( in[ 12 + inpos] >>> 22 ) - | ((in[ 13 + inpos] & 524287 )<<( 29 - 19 )) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( in[ 13 + inpos] >>> 19 ) - | ((in[ 14 + inpos] & 65535 )<<( 29 - 16 )) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( in[ 14 + inpos] >>> 16 ) - | ((in[ 15 + inpos] & 8191 )<<( 29 - 13 )) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( in[ 15 + inpos] >>> 13 ) - | ((in[ 16 + inpos] & 1023 )<<( 29 - 10 )) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( in[ 16 + inpos] >>> 10 ) - | ((in[ 17 + inpos] & 127 )<<( 29 - 7 )) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( in[ 17 + inpos] >>> 7 ) - | ((in[ 18 + inpos] & 15 )<<( 29 - 4 )) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( in[ 18 + inpos] >>> 4 ) - | ((in[ 19 + inpos] & 1 )<<( 29 - 1 )) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( ( in[ 19 + inpos] >>> 1 ) & 536870911 ) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( in[ 19 + inpos] >>> 30 ) - | ((in[ 20 + inpos] & 134217727 )<<( 29 - 27 )) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( in[ 20 + inpos] >>> 27 ) - | ((in[ 21 + inpos] & 16777215 )<<( 29 - 24 )) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( in[ 21 + inpos] >>> 24 ) - | ((in[ 22 + inpos] & 2097151 )<<( 29 - 21 )) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( in[ 22 + inpos] >>> 21 ) - | ((in[ 23 + inpos] & 262143 )<<( 29 - 18 )) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( in[ 23 + inpos] >>> 18 ) - | ((in[ 24 + inpos] & 32767 )<<( 29 - 15 )) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( in[ 24 + inpos] >>> 15 ) - | ((in[ 25 + inpos] & 4095 )<<( 29 - 12 )) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( in[ 25 + inpos] >>> 12 ) - | ((in[ 26 + inpos] & 511 )<<( 29 - 9 )) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( in[ 26 + inpos] >>> 9 ) - | ((in[ 27 + inpos] & 63 )<<( 29 - 6 )) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( in[ 27 + inpos] >>> 6 ) - | ((in[ 28 + inpos] & 7 )<<( 29 - 3 )) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 28 + inpos] >>> 3 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack30(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 1073741823 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( in[ 0 + inpos] >>> 30 ) - | ((in[ 1 + inpos] & 268435455 )<<( 30 - 28 )) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( in[ 1 + inpos] >>> 28 ) - | ((in[ 2 + inpos] & 67108863 )<<( 30 - 26 )) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( in[ 2 + inpos] >>> 26 ) - | ((in[ 3 + inpos] & 16777215 )<<( 30 - 24 )) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( in[ 3 + inpos] >>> 24 ) - | ((in[ 4 + inpos] & 4194303 )<<( 30 - 22 )) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( in[ 4 + inpos] >>> 22 ) - | ((in[ 5 + inpos] & 1048575 )<<( 30 - 20 )) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( in[ 5 + inpos] >>> 20 ) - | ((in[ 6 + inpos] & 262143 )<<( 30 - 18 )) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( in[ 6 + inpos] >>> 18 ) - | ((in[ 7 + inpos] & 65535 )<<( 30 - 16 )) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( in[ 7 + inpos] >>> 16 ) - | ((in[ 8 + inpos] & 16383 )<<( 30 - 14 )) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( in[ 8 + inpos] >>> 14 ) - | ((in[ 9 + inpos] & 4095 )<<( 30 - 12 )) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( in[ 9 + inpos] >>> 12 ) - | ((in[ 10 + inpos] & 1023 )<<( 30 - 10 )) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( in[ 10 + inpos] >>> 10 ) - | ((in[ 11 + inpos] & 255 )<<( 30 - 8 )) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( in[ 11 + inpos] >>> 8 ) - | ((in[ 12 + inpos] & 63 )<<( 30 - 6 )) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( in[ 12 + inpos] >>> 6 ) - | ((in[ 13 + inpos] & 15 )<<( 30 - 4 )) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( in[ 13 + inpos] >>> 4 ) - | ((in[ 14 + inpos] & 3 )<<( 30 - 2 )) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( in[ 14 + inpos] >>> 2 ) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( ( in[ 15 + inpos] >>> 0 ) & 1073741823 ) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( in[ 15 + inpos] >>> 30 ) - | ((in[ 16 + inpos] & 268435455 )<<( 30 - 28 )) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( in[ 16 + inpos] >>> 28 ) - | ((in[ 17 + inpos] & 67108863 )<<( 30 - 26 )) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( in[ 17 + inpos] >>> 26 ) - | ((in[ 18 + inpos] & 16777215 )<<( 30 - 24 )) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( in[ 18 + inpos] >>> 24 ) - | ((in[ 19 + inpos] & 4194303 )<<( 30 - 22 )) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( in[ 19 + inpos] >>> 22 ) - | ((in[ 20 + inpos] & 1048575 )<<( 30 - 20 )) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( in[ 20 + inpos] >>> 20 ) - | ((in[ 21 + inpos] & 262143 )<<( 30 - 18 )) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( in[ 21 + inpos] >>> 18 ) - | ((in[ 22 + inpos] & 65535 )<<( 30 - 16 )) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( in[ 22 + inpos] >>> 16 ) - | ((in[ 23 + inpos] & 16383 )<<( 30 - 14 )) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( in[ 23 + inpos] >>> 14 ) - | ((in[ 24 + inpos] & 4095 )<<( 30 - 12 )) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( in[ 24 + inpos] >>> 12 ) - | ((in[ 25 + inpos] & 1023 )<<( 30 - 10 )) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( in[ 25 + inpos] >>> 10 ) - | ((in[ 26 + inpos] & 255 )<<( 30 - 8 )) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( in[ 26 + inpos] >>> 8 ) - | ((in[ 27 + inpos] & 63 )<<( 30 - 6 )) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( in[ 27 + inpos] >>> 6 ) - | ((in[ 28 + inpos] & 15 )<<( 30 - 4 )) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( in[ 28 + inpos] >>> 4 ) - | ((in[ 29 + inpos] & 3 )<<( 30 - 2 )) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 29 + inpos] >>> 2 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack31(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - out[ 0 + outpos] = ( ( ( in[ 0 + inpos] >>> 0 ) & 2147483647 ) - ) + initoffset ; - out[ 1 + outpos] = ( ( in[ 0 + inpos] >>> 31 ) - | ((in[ 1 + inpos] & 1073741823 )<<( 31 - 30 )) - ) + out[1 + outpos - 1] ; - out[ 2 + outpos] = ( ( in[ 1 + inpos] >>> 30 ) - | ((in[ 2 + inpos] & 536870911 )<<( 31 - 29 )) - ) + out[2 + outpos - 1] ; - out[ 3 + outpos] = ( ( in[ 2 + inpos] >>> 29 ) - | ((in[ 3 + inpos] & 268435455 )<<( 31 - 28 )) - ) + out[3 + outpos - 1] ; - out[ 4 + outpos] = ( ( in[ 3 + inpos] >>> 28 ) - | ((in[ 4 + inpos] & 134217727 )<<( 31 - 27 )) - ) + out[4 + outpos - 1] ; - out[ 5 + outpos] = ( ( in[ 4 + inpos] >>> 27 ) - | ((in[ 5 + inpos] & 67108863 )<<( 31 - 26 )) - ) + out[5 + outpos - 1] ; - out[ 6 + outpos] = ( ( in[ 5 + inpos] >>> 26 ) - | ((in[ 6 + inpos] & 33554431 )<<( 31 - 25 )) - ) + out[6 + outpos - 1] ; - out[ 7 + outpos] = ( ( in[ 6 + inpos] >>> 25 ) - | ((in[ 7 + inpos] & 16777215 )<<( 31 - 24 )) - ) + out[7 + outpos - 1] ; - out[ 8 + outpos] = ( ( in[ 7 + inpos] >>> 24 ) - | ((in[ 8 + inpos] & 8388607 )<<( 31 - 23 )) - ) + out[8 + outpos - 1] ; - out[ 9 + outpos] = ( ( in[ 8 + inpos] >>> 23 ) - | ((in[ 9 + inpos] & 4194303 )<<( 31 - 22 )) - ) + out[9 + outpos - 1] ; - out[ 10 + outpos] = ( ( in[ 9 + inpos] >>> 22 ) - | ((in[ 10 + inpos] & 2097151 )<<( 31 - 21 )) - ) + out[10 + outpos - 1] ; - out[ 11 + outpos] = ( ( in[ 10 + inpos] >>> 21 ) - | ((in[ 11 + inpos] & 1048575 )<<( 31 - 20 )) - ) + out[11 + outpos - 1] ; - out[ 12 + outpos] = ( ( in[ 11 + inpos] >>> 20 ) - | ((in[ 12 + inpos] & 524287 )<<( 31 - 19 )) - ) + out[12 + outpos - 1] ; - out[ 13 + outpos] = ( ( in[ 12 + inpos] >>> 19 ) - | ((in[ 13 + inpos] & 262143 )<<( 31 - 18 )) - ) + out[13 + outpos - 1] ; - out[ 14 + outpos] = ( ( in[ 13 + inpos] >>> 18 ) - | ((in[ 14 + inpos] & 131071 )<<( 31 - 17 )) - ) + out[14 + outpos - 1] ; - out[ 15 + outpos] = ( ( in[ 14 + inpos] >>> 17 ) - | ((in[ 15 + inpos] & 65535 )<<( 31 - 16 )) - ) + out[15 + outpos - 1] ; - out[ 16 + outpos] = ( ( in[ 15 + inpos] >>> 16 ) - | ((in[ 16 + inpos] & 32767 )<<( 31 - 15 )) - ) + out[16 + outpos - 1] ; - out[ 17 + outpos] = ( ( in[ 16 + inpos] >>> 15 ) - | ((in[ 17 + inpos] & 16383 )<<( 31 - 14 )) - ) + out[17 + outpos - 1] ; - out[ 18 + outpos] = ( ( in[ 17 + inpos] >>> 14 ) - | ((in[ 18 + inpos] & 8191 )<<( 31 - 13 )) - ) + out[18 + outpos - 1] ; - out[ 19 + outpos] = ( ( in[ 18 + inpos] >>> 13 ) - | ((in[ 19 + inpos] & 4095 )<<( 31 - 12 )) - ) + out[19 + outpos - 1] ; - out[ 20 + outpos] = ( ( in[ 19 + inpos] >>> 12 ) - | ((in[ 20 + inpos] & 2047 )<<( 31 - 11 )) - ) + out[20 + outpos - 1] ; - out[ 21 + outpos] = ( ( in[ 20 + inpos] >>> 11 ) - | ((in[ 21 + inpos] & 1023 )<<( 31 - 10 )) - ) + out[21 + outpos - 1] ; - out[ 22 + outpos] = ( ( in[ 21 + inpos] >>> 10 ) - | ((in[ 22 + inpos] & 511 )<<( 31 - 9 )) - ) + out[22 + outpos - 1] ; - out[ 23 + outpos] = ( ( in[ 22 + inpos] >>> 9 ) - | ((in[ 23 + inpos] & 255 )<<( 31 - 8 )) - ) + out[23 + outpos - 1] ; - out[ 24 + outpos] = ( ( in[ 23 + inpos] >>> 8 ) - | ((in[ 24 + inpos] & 127 )<<( 31 - 7 )) - ) + out[24 + outpos - 1] ; - out[ 25 + outpos] = ( ( in[ 24 + inpos] >>> 7 ) - | ((in[ 25 + inpos] & 63 )<<( 31 - 6 )) - ) + out[25 + outpos - 1] ; - out[ 26 + outpos] = ( ( in[ 25 + inpos] >>> 6 ) - | ((in[ 26 + inpos] & 31 )<<( 31 - 5 )) - ) + out[26 + outpos - 1] ; - out[ 27 + outpos] = ( ( in[ 26 + inpos] >>> 5 ) - | ((in[ 27 + inpos] & 15 )<<( 31 - 4 )) - ) + out[27 + outpos - 1] ; - out[ 28 + outpos] = ( ( in[ 27 + inpos] >>> 4 ) - | ((in[ 28 + inpos] & 7 )<<( 31 - 3 )) - ) + out[28 + outpos - 1] ; - out[ 29 + outpos] = ( ( in[ 28 + inpos] >>> 3 ) - | ((in[ 29 + inpos] & 3 )<<( 31 - 2 )) - ) + out[29 + outpos - 1] ; - out[ 30 + outpos] = ( ( in[ 29 + inpos] >>> 2 ) - | ((in[ 30 + inpos] & 1 )<<( 31 - 1 )) - ) + out[30 + outpos - 1] ; - out[ 31 + outpos] = ( ( in[ 30 + inpos] >>> 1 ) - ) + out[31 + outpos - 1] ; -} - - - - -public static void integratedunpack32(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - System.arraycopy(in, inpos, out, outpos, 32); // no sense in doing delta coding -} - - -public static void integratedpack32(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - System.arraycopy(in, inpos, out, outpos, 32); // no sense in doing delta coding -} - - -public static void integratedunpack0(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - Arrays.fill(out,outpos,outpos+32,initoffset); -} - - -public static void integratedpack0(final int initoffset, final int [] in, int inpos, final int [] out, int outpos) { - // nothing -} - - - -public static void integratedunpack(final int initoffset, final int [] in, int inpos, final int [] out, int outpos, final int bit) { - switch(bit) { - case 0: - integratedunpack0(initoffset,in,inpos,out,outpos); - break; - case 1: - integratedunpack1(initoffset,in,inpos,out,outpos); - break; - case 2: - integratedunpack2(initoffset,in,inpos,out,outpos); - break; - case 3: - integratedunpack3(initoffset,in,inpos,out,outpos); - break; - case 4: - integratedunpack4(initoffset,in,inpos,out,outpos); - break; - case 5: - integratedunpack5(initoffset,in,inpos,out,outpos); - break; - case 6: - integratedunpack6(initoffset,in,inpos,out,outpos); - break; - case 7: - integratedunpack7(initoffset,in,inpos,out,outpos); - break; - case 8: - integratedunpack8(initoffset,in,inpos,out,outpos); - break; - case 9: - integratedunpack9(initoffset,in,inpos,out,outpos); - break; - case 10: - integratedunpack10(initoffset,in,inpos,out,outpos); - break; - case 11: - integratedunpack11(initoffset,in,inpos,out,outpos); - break; - case 12: - integratedunpack12(initoffset,in,inpos,out,outpos); - break; - case 13: - integratedunpack13(initoffset,in,inpos,out,outpos); - break; - case 14: - integratedunpack14(initoffset,in,inpos,out,outpos); - break; - case 15: - integratedunpack15(initoffset,in,inpos,out,outpos); - break; - case 16: - integratedunpack16(initoffset,in,inpos,out,outpos); - break; - case 17: - integratedunpack17(initoffset,in,inpos,out,outpos); - break; - case 18: - integratedunpack18(initoffset,in,inpos,out,outpos); - break; - case 19: - integratedunpack19(initoffset,in,inpos,out,outpos); - break; - case 20: - integratedunpack20(initoffset,in,inpos,out,outpos); - break; - case 21: - integratedunpack21(initoffset,in,inpos,out,outpos); - break; - case 22: - integratedunpack22(initoffset,in,inpos,out,outpos); - break; - case 23: - integratedunpack23(initoffset,in,inpos,out,outpos); - break; - case 24: - integratedunpack24(initoffset,in,inpos,out,outpos); - break; - case 25: - integratedunpack25(initoffset,in,inpos,out,outpos); - break; - case 26: - integratedunpack26(initoffset,in,inpos,out,outpos); - break; - case 27: - integratedunpack27(initoffset,in,inpos,out,outpos); - break; - case 28: - integratedunpack28(initoffset,in,inpos,out,outpos); - break; - case 29: - integratedunpack29(initoffset,in,inpos,out,outpos); - break; - case 30: - integratedunpack30(initoffset,in,inpos,out,outpos); - break; - case 31: - integratedunpack31(initoffset,in,inpos,out,outpos); - break; - case 32: - integratedunpack32(initoffset,in,inpos,out,outpos); - break; - default: - throw new IllegalArgumentException("Unsupported bit width."); - } -} - - -public static void integratedpack(final int initoffset, final int [] in, int inpos, final int [] out, int outpos, final int bit) { - switch(bit) { - case 0: - integratedpack0(initoffset,in,inpos,out,outpos); - break; - case 1: - integratedpack1(initoffset,in,inpos,out,outpos); - break; - case 2: - integratedpack2(initoffset,in,inpos,out,outpos); - break; - case 3: - integratedpack3(initoffset,in,inpos,out,outpos); - break; - case 4: - integratedpack4(initoffset,in,inpos,out,outpos); - break; - case 5: - integratedpack5(initoffset,in,inpos,out,outpos); - break; - case 6: - integratedpack6(initoffset,in,inpos,out,outpos); - break; - case 7: - integratedpack7(initoffset,in,inpos,out,outpos); - break; - case 8: - integratedpack8(initoffset,in,inpos,out,outpos); - break; - case 9: - integratedpack9(initoffset,in,inpos,out,outpos); - break; - case 10: - integratedpack10(initoffset,in,inpos,out,outpos); - break; - case 11: - integratedpack11(initoffset,in,inpos,out,outpos); - break; - case 12: - integratedpack12(initoffset,in,inpos,out,outpos); - break; - case 13: - integratedpack13(initoffset,in,inpos,out,outpos); - break; - case 14: - integratedpack14(initoffset,in,inpos,out,outpos); - break; - case 15: - integratedpack15(initoffset,in,inpos,out,outpos); - break; - case 16: - integratedpack16(initoffset,in,inpos,out,outpos); - break; - case 17: - integratedpack17(initoffset,in,inpos,out,outpos); - break; - case 18: - integratedpack18(initoffset,in,inpos,out,outpos); - break; - case 19: - integratedpack19(initoffset,in,inpos,out,outpos); - break; - case 20: - integratedpack20(initoffset,in,inpos,out,outpos); - break; - case 21: - integratedpack21(initoffset,in,inpos,out,outpos); - break; - case 22: - integratedpack22(initoffset,in,inpos,out,outpos); - break; - case 23: - integratedpack23(initoffset,in,inpos,out,outpos); - break; - case 24: - integratedpack24(initoffset,in,inpos,out,outpos); - break; - case 25: - integratedpack25(initoffset,in,inpos,out,outpos); - break; - case 26: - integratedpack26(initoffset,in,inpos,out,outpos); - break; - case 27: - integratedpack27(initoffset,in,inpos,out,outpos); - break; - case 28: - integratedpack28(initoffset,in,inpos,out,outpos); - break; - case 29: - integratedpack29(initoffset,in,inpos,out,outpos); - break; - case 30: - integratedpack30(initoffset,in,inpos,out,outpos); - break; - case 31: - integratedpack31(initoffset,in,inpos,out,outpos); - break; - case 32: - integratedpack32(initoffset,in,inpos,out,outpos); - break; - default: - throw new IllegalArgumentException("Unsupported bit width."); - } -} + public static void integratedpack1(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 1) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 2) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 3) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 4) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 5) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 6) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 7) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 9) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 10) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 11) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 12) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 13) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 14) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 15) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 17) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 18) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 19) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 20) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 21) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 22) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 23) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 24) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 25) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 26) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 27) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 28) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 29) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 30) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 31) + ; + } + + + public static void integratedpack2(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 2) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 4) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 6) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 8) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 10) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 12) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 14) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 16) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 18) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 20) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 22) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 24) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 26) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 28) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 30) + ; + out[1 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 2) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 4) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 6) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 8) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 10) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 12) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 14) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 16) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 18) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 20) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 22) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 24) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 26) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 28) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 30) + ; + } + + + public static void integratedpack3(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 3) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 6) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 9) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 12) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 15) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 18) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 21) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 24) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 27) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 30) + ; + out[1 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (3 - 1) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 1) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 4) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 7) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 10) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 13) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 19) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 22) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 25) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 28) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 31) + ; + out[2 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (3 - 2) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 2) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 5) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 11) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 14) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 17) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 20) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 23) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 26) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 29) + ; + } + + + public static void integratedpack4(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 4) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 8) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 12) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 16) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 20) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 24) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 28) + ; + out[1 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 4) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 8) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 12) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 16) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 20) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 24) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 28) + ; + out[2 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 4) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 8) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 12) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 16) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 20) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 24) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 28) + ; + out[3 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 4) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 8) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 12) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 16) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 20) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 24) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 28) + ; + } + + + public static void integratedpack5(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 5) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 10) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 15) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 20) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 25) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 30) + ; + out[1 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (5 - 3) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 3) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 13) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 18) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 23) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 28) + ; + out[2 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (5 - 1) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 1) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 6) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 11) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 21) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 26) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 31) + ; + out[3 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (5 - 4) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 4) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 9) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 14) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 19) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 24) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 29) + ; + out[4 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (5 - 2) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 2) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 7) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 12) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 17) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 22) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 27) + ; + } + + + public static void integratedpack6(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 6) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 12) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 18) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 24) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 30) + ; + out[1 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (6 - 4) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 4) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 10) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 16) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 22) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 28) + ; + out[2 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (6 - 2) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 2) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 8) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 14) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 20) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 26) + ; + out[3 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 6) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 12) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 18) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 24) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 30) + ; + out[4 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (6 - 4) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 4) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 10) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 16) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 22) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 28) + ; + out[5 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (6 - 2) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 2) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 8) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 14) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 20) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 26) + ; + } + + + public static void integratedpack7(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 7) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 14) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 21) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 28) + ; + out[1 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (7 - 3) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 3) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 10) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 17) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 24) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 31) + ; + out[2 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (7 - 6) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 6) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 13) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 20) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 27) + ; + out[3 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (7 - 2) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 2) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 9) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 23) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 30) + ; + out[4 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (7 - 5) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 5) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 12) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 19) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 26) + ; + out[5 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (7 - 1) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 1) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 15) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 22) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 29) + ; + out[6 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (7 - 4) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 4) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 11) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 18) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 25) + ; + } + + + public static void integratedpack8(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 8) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 16) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 24) + ; + out[1 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 8) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 16) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 24) + ; + out[2 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 8) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 16) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 24) + ; + out[3 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 8) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 16) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 24) + ; + out[4 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 8) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 16) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 24) + ; + out[5 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 8) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 16) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 24) + ; + out[6 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 8) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 16) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 24) + ; + out[7 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 8) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 16) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 24) + ; + } + + + public static void integratedpack9(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 9) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 18) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 27) + ; + out[1 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (9 - 4) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 4) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 13) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 22) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 31) + ; + out[2 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (9 - 8) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 17) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 26) + ; + out[3 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (9 - 3) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 3) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 12) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 21) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 30) + ; + out[4 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (9 - 7) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 7) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 25) + ; + out[5 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (9 - 2) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 2) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 11) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 20) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 29) + ; + out[6 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (9 - 6) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 6) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 15) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 24) + ; + out[7 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (9 - 1) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 1) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 10) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 19) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 28) + ; + out[8 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (9 - 5) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 5) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 14) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 23) + ; + } + + + public static void integratedpack10(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 10) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 20) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 30) + ; + out[1 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (10 - 8) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 8) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 18) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 28) + ; + out[2 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (10 - 6) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 6) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 16) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 26) + ; + out[3 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (10 - 4) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 4) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 14) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 24) + ; + out[4 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (10 - 2) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 2) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 12) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 22) + ; + out[5 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 10) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 20) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 30) + ; + out[6 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (10 - 8) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 8) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 18) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 28) + ; + out[7 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (10 - 6) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 6) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 16) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 26) + ; + out[8 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (10 - 4) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 4) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 14) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 24) + ; + out[9 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (10 - 2) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 2) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 12) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 22) + ; + } + + + public static void integratedpack11(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 11) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 22) + ; + out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (11 - 1) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 1) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 12) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 23) + ; + out[2 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (11 - 2) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 2) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 13) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 24) + ; + out[3 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (11 - 3) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 3) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 14) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 25) + ; + out[4 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (11 - 4) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 4) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 15) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 26) + ; + out[5 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (11 - 5) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 5) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 27) + ; + out[6 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (11 - 6) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 6) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 17) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 28) + ; + out[7 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (11 - 7) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 7) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 18) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 29) + ; + out[8 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (11 - 8) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 19) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 30) + ; + out[9 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (11 - 9) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 9) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 20) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 31) + ; + out[10 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (11 - 10) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 10) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 21) + ; + } + + + public static void integratedpack12(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 12) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 24) + ; + out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (12 - 4) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 4) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 16) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 28) + ; + out[2 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (12 - 8) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 8) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 20) + ; + out[3 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 12) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 24) + ; + out[4 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (12 - 4) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 4) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 16) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 28) + ; + out[5 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (12 - 8) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 8) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 20) + ; + out[6 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 12) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 24) + ; + out[7 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (12 - 4) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 4) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 16) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 28) + ; + out[8 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (12 - 8) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 8) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 20) + ; + out[9 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 12) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 24) + ; + out[10 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (12 - 4) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 4) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 16) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 28) + ; + out[11 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (12 - 8) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 8) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 20) + ; + } + + + public static void integratedpack13(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 13) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 26) + ; + out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (13 - 7) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 7) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 20) + ; + out[2 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (13 - 1) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 1) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 14) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 27) + ; + out[3 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (13 - 8) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 21) + ; + out[4 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (13 - 2) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 2) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 15) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 28) + ; + out[5 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (13 - 9) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 9) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 22) + ; + out[6 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (13 - 3) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 3) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 29) + ; + out[7 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (13 - 10) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 10) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 23) + ; + out[8 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (13 - 4) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 4) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 17) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 30) + ; + out[9 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (13 - 11) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 11) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 24) + ; + out[10 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (13 - 5) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 5) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 18) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 31) + ; + out[11 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (13 - 12) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 12) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 25) + ; + out[12 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (13 - 6) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 6) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 19) + ; + } + + + public static void integratedpack14(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 14) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 28) + ; + out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (14 - 10) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 10) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 24) + ; + out[2 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (14 - 6) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 6) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 20) + ; + out[3 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (14 - 2) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 2) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 16) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 30) + ; + out[4 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (14 - 12) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 12) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 26) + ; + out[5 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (14 - 8) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 8) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 22) + ; + out[6 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (14 - 4) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 4) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 18) + ; + out[7 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 14) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 28) + ; + out[8 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (14 - 10) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 10) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 24) + ; + out[9 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (14 - 6) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 6) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 20) + ; + out[10 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (14 - 2) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 2) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 16) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 30) + ; + out[11 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (14 - 12) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 12) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 26) + ; + out[12 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (14 - 8) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 8) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 22) + ; + out[13 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (14 - 4) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 4) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 18) + ; + } + + + public static void integratedpack15(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 15) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 30) + ; + out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (15 - 13) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 13) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 28) + ; + out[2 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (15 - 11) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 11) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 26) + ; + out[3 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (15 - 9) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 9) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 24) + ; + out[4 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (15 - 7) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 7) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 22) + ; + out[5 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (15 - 5) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 5) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 20) + ; + out[6 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (15 - 3) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 3) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 18) + ; + out[7 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (15 - 1) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 1) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 31) + ; + out[8 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (15 - 14) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 14) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 29) + ; + out[9 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (15 - 12) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 12) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 27) + ; + out[10 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (15 - 10) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 10) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 25) + ; + out[11 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (15 - 8) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 23) + ; + out[12 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (15 - 6) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 6) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 21) + ; + out[13 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (15 - 4) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 4) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 19) + ; + out[14 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (15 - 2) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 2) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 17) + ; + } + + + public static void integratedpack16(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 16) + ; + out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 16) + ; + out[2 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 16) + ; + out[3 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 16) + ; + out[4 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 16) + ; + out[5 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 16) + ; + out[6 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 16) + ; + out[7 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 16) + ; + out[8 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 16) + ; + out[9 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 16) + ; + out[10 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 16) + ; + out[11 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 16) + ; + out[12 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 16) + ; + out[13 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 16) + ; + out[14 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 16) + ; + out[15 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 16) + ; + } + + + public static void integratedpack17(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 17) + ; + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (17 - 2) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 2) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 19) + ; + out[2 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (17 - 4) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 4) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 21) + ; + out[3 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (17 - 6) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 6) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 23) + ; + out[4 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (17 - 8) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 25) + ; + out[5 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (17 - 10) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 10) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 27) + ; + out[6 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (17 - 12) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 12) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 29) + ; + out[7 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (17 - 14) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 14) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 31) + ; + out[8 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (17 - 16) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) + ; + out[9 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (17 - 1) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 1) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 18) + ; + out[10 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (17 - 3) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 3) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 20) + ; + out[11 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (17 - 5) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 5) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 22) + ; + out[12 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (17 - 7) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 7) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 24) + ; + out[13 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (17 - 9) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 9) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 26) + ; + out[14 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (17 - 11) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 11) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 28) + ; + out[15 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (17 - 13) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 13) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 30) + ; + out[16 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (17 - 15) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 15) + ; + } + + + public static void integratedpack18(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 18) + ; + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (18 - 4) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 4) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 22) + ; + out[2 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (18 - 8) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 8) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 26) + ; + out[3 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (18 - 12) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 12) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 30) + ; + out[4 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (18 - 16) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 16) + ; + out[5 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (18 - 2) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 2) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 20) + ; + out[6 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (18 - 6) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 6) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 24) + ; + out[7 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (18 - 10) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 10) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 28) + ; + out[8 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (18 - 14) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 14) + ; + out[9 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 18) + ; + out[10 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (18 - 4) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 4) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 22) + ; + out[11 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (18 - 8) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 8) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 26) + ; + out[12 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (18 - 12) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 12) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 30) + ; + out[13 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (18 - 16) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 16) + ; + out[14 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (18 - 2) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 2) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 20) + ; + out[15 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (18 - 6) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 6) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 24) + ; + out[16 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (18 - 10) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 10) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 28) + ; + out[17 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (18 - 14) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 14) + ; + } + + + public static void integratedpack19(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 19) + ; + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (19 - 6) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 6) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 25) + ; + out[2 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (19 - 12) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 12) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 31) + ; + out[3 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (19 - 18) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 18) + ; + out[4 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (19 - 5) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 5) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 24) + ; + out[5 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (19 - 11) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 11) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 30) + ; + out[6 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (19 - 17) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 17) + ; + out[7 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (19 - 4) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 4) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 23) + ; + out[8 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (19 - 10) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 10) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 29) + ; + out[9 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (19 - 16) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) + ; + out[10 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (19 - 3) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 3) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 22) + ; + out[11 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (19 - 9) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 9) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 28) + ; + out[12 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (19 - 15) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 15) + ; + out[13 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (19 - 2) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 2) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 21) + ; + out[14 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (19 - 8) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 27) + ; + out[15 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (19 - 14) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 14) + ; + out[16 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (19 - 1) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 1) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 20) + ; + out[17 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (19 - 7) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 7) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 26) + ; + out[18 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (19 - 13) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 13) + ; + } + + + public static void integratedpack20(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 20) + ; + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (20 - 8) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 8) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 28) + ; + out[2 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (20 - 16) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 16) + ; + out[3 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (20 - 4) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 4) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 24) + ; + out[4 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (20 - 12) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 12) + ; + out[5 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 20) + ; + out[6 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (20 - 8) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 8) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 28) + ; + out[7 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (20 - 16) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 16) + ; + out[8 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (20 - 4) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 4) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 24) + ; + out[9 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (20 - 12) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 12) + ; + out[10 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 20) + ; + out[11 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (20 - 8) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 8) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 28) + ; + out[12 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (20 - 16) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 16) + ; + out[13 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (20 - 4) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 4) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 24) + ; + out[14 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (20 - 12) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 12) + ; + out[15 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 20) + ; + out[16 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (20 - 8) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 8) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 28) + ; + out[17 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (20 - 16) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 16) + ; + out[18 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (20 - 4) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 4) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 24) + ; + out[19 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (20 - 12) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 12) + ; + } + + + public static void integratedpack21(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 21) + ; + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (21 - 10) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 10) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 31) + ; + out[2 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (21 - 20) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 20) + ; + out[3 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (21 - 9) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 9) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 30) + ; + out[4 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (21 - 19) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 19) + ; + out[5 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (21 - 8) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 29) + ; + out[6 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (21 - 18) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 18) + ; + out[7 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (21 - 7) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 7) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 28) + ; + out[8 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (21 - 17) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 17) + ; + out[9 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (21 - 6) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 6) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 27) + ; + out[10 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (21 - 16) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) + ; + out[11 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (21 - 5) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 5) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 26) + ; + out[12 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (21 - 15) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 15) + ; + out[13 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (21 - 4) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 4) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 25) + ; + out[14 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (21 - 14) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 14) + ; + out[15 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (21 - 3) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 3) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 24) + ; + out[16 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (21 - 13) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 13) + ; + out[17 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (21 - 2) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 2) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 23) + ; + out[18 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (21 - 12) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 12) + ; + out[19 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (21 - 1) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 1) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 22) + ; + out[20 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (21 - 11) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 11) + ; + } + + + public static void integratedpack22(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 22) + ; + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (22 - 12) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 12) + ; + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (22 - 2) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 2) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 24) + ; + out[3 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (22 - 14) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 14) + ; + out[4 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (22 - 4) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 4) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 26) + ; + out[5 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (22 - 16) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 16) + ; + out[6 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (22 - 6) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 6) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 28) + ; + out[7 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (22 - 18) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 18) + ; + out[8 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (22 - 8) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 8) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 30) + ; + out[9 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (22 - 20) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 20) + ; + out[10 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (22 - 10) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 10) + ; + out[11 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 22) + ; + out[12 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (22 - 12) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 12) + ; + out[13 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (22 - 2) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 2) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 24) + ; + out[14 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (22 - 14) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 14) + ; + out[15 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (22 - 4) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 4) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 26) + ; + out[16 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (22 - 16) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 16) + ; + out[17 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (22 - 6) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 6) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 28) + ; + out[18 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (22 - 18) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 18) + ; + out[19 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (22 - 8) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 8) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 30) + ; + out[20 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (22 - 20) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 20) + ; + out[21 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (22 - 10) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 10) + ; + } + + + public static void integratedpack23(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 23) + ; + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (23 - 14) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 14) + ; + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (23 - 5) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 5) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 28) + ; + out[3 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (23 - 19) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 19) + ; + out[4 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (23 - 10) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 10) + ; + out[5 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (23 - 1) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 1) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 24) + ; + out[6 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (23 - 15) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 15) + ; + out[7 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (23 - 6) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 6) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 29) + ; + out[8 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (23 - 20) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 20) + ; + out[9 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (23 - 11) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 11) + ; + out[10 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (23 - 2) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 2) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 25) + ; + out[11 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (23 - 16) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) + ; + out[12 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (23 - 7) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 7) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 30) + ; + out[13 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (23 - 21) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 21) + ; + out[14 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (23 - 12) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 12) + ; + out[15 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (23 - 3) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 3) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 26) + ; + out[16 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (23 - 17) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 17) + ; + out[17 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (23 - 8) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 31) + ; + out[18 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (23 - 22) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 22) + ; + out[19 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (23 - 13) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 13) + ; + out[20 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (23 - 4) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 4) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 27) + ; + out[21 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (23 - 18) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 18) + ; + out[22 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (23 - 9) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 9) + ; + } + + + public static void integratedpack24(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 24) + ; + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (24 - 16) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 16) + ; + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (24 - 8) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 8) + ; + out[3 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 24) + ; + out[4 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (24 - 16) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 16) + ; + out[5 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (24 - 8) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 8) + ; + out[6 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 24) + ; + out[7 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (24 - 16) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 16) + ; + out[8 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (24 - 8) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 8) + ; + out[9 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 24) + ; + out[10 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (24 - 16) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 16) + ; + out[11 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (24 - 8) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 8) + ; + out[12 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 24) + ; + out[13 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (24 - 16) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 16) + ; + out[14 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (24 - 8) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 8) + ; + out[15 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 24) + ; + out[16 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (24 - 16) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 16) + ; + out[17 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (24 - 8) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 8) + ; + out[18 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 24) + ; + out[19 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (24 - 16) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 16) + ; + out[20 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (24 - 8) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 8) + ; + out[21 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 24) + ; + out[22 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (24 - 16) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 16) + ; + out[23 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (24 - 8) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 8) + ; + } + + + public static void integratedpack25(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 25) + ; + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (25 - 18) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 18) + ; + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (25 - 11) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 11) + ; + out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (25 - 4) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 4) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 29) + ; + out[4 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (25 - 22) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 22) + ; + out[5 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (25 - 15) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 15) + ; + out[6 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (25 - 8) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) + ; + out[7 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (25 - 1) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 1) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 26) + ; + out[8 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (25 - 19) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 19) + ; + out[9 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (25 - 12) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 12) + ; + out[10 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (25 - 5) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 5) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 30) + ; + out[11 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (25 - 23) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 23) + ; + out[12 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (25 - 16) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) + ; + out[13 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (25 - 9) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 9) + ; + out[14 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (25 - 2) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 2) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 27) + ; + out[15 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (25 - 20) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 20) + ; + out[16 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (25 - 13) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 13) + ; + out[17 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (25 - 6) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 6) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 31) + ; + out[18 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (25 - 24) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 24) + ; + out[19 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (25 - 17) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 17) + ; + out[20 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (25 - 10) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 10) + ; + out[21 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (25 - 3) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 3) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 28) + ; + out[22 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (25 - 21) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 21) + ; + out[23 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (25 - 14) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 14) + ; + out[24 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (25 - 7) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 7) + ; + } + + + public static void integratedpack26(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 26) + ; + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (26 - 20) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 20) + ; + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (26 - 14) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 14) + ; + out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (26 - 8) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 8) + ; + out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (26 - 2) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 2) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 28) + ; + out[5 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (26 - 22) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 22) + ; + out[6 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (26 - 16) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 16) + ; + out[7 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (26 - 10) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 10) + ; + out[8 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (26 - 4) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 4) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 30) + ; + out[9 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (26 - 24) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 24) + ; + out[10 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (26 - 18) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 18) + ; + out[11 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (26 - 12) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 12) + ; + out[12 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (26 - 6) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 6) + ; + out[13 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 26) + ; + out[14 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (26 - 20) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 20) + ; + out[15 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (26 - 14) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 14) + ; + out[16 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (26 - 8) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 8) + ; + out[17 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (26 - 2) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 2) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 28) + ; + out[18 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (26 - 22) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 22) + ; + out[19 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (26 - 16) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 16) + ; + out[20 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (26 - 10) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 10) + ; + out[21 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (26 - 4) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 4) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 30) + ; + out[22 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (26 - 24) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 24) + ; + out[23 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (26 - 18) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 18) + ; + out[24 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (26 - 12) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 12) + ; + out[25 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (26 - 6) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 6) + ; + } + + + public static void integratedpack27(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 27) + ; + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (27 - 22) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 22) + ; + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (27 - 17) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 17) + ; + out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (27 - 12) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 12) + ; + out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (27 - 7) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 7) + ; + out[5 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (27 - 2) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 2) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 29) + ; + out[6 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (27 - 24) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 24) + ; + out[7 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (27 - 19) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 19) + ; + out[8 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (27 - 14) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 14) + ; + out[9 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (27 - 9) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 9) + ; + out[10 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (27 - 4) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 4) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 31) + ; + out[11 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (27 - 26) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 26) + ; + out[12 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (27 - 21) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 21) + ; + out[13 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (27 - 16) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) + ; + out[14 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (27 - 11) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 11) + ; + out[15 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (27 - 6) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 6) + ; + out[16 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (27 - 1) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 1) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 28) + ; + out[17 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (27 - 23) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 23) + ; + out[18 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (27 - 18) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 18) + ; + out[19 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (27 - 13) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 13) + ; + out[20 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (27 - 8) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) + ; + out[21 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (27 - 3) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 3) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 30) + ; + out[22 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (27 - 25) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 25) + ; + out[23 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (27 - 20) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 20) + ; + out[24 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (27 - 15) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 15) + ; + out[25 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (27 - 10) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 10) + ; + out[26 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (27 - 5) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 5) + ; + } + + + public static void integratedpack28(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 28) + ; + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (28 - 24) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 24) + ; + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (28 - 20) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 20) + ; + out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (28 - 16) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 16) + ; + out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (28 - 12) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 12) + ; + out[5 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (28 - 8) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 8) + ; + out[6 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (28 - 4) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 4) + ; + out[7 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 28) + ; + out[8 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (28 - 24) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 24) + ; + out[9 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (28 - 20) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 20) + ; + out[10 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (28 - 16) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 16) + ; + out[11 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (28 - 12) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 12) + ; + out[12 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (28 - 8) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 8) + ; + out[13 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (28 - 4) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 4) + ; + out[14 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 28) + ; + out[15 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (28 - 24) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 24) + ; + out[16 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (28 - 20) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 20) + ; + out[17 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (28 - 16) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 16) + ; + out[18 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (28 - 12) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 12) + ; + out[19 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (28 - 8) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 8) + ; + out[20 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (28 - 4) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 4) + ; + out[21 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 28) + ; + out[22 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (28 - 24) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 24) + ; + out[23 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (28 - 20) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 20) + ; + out[24 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (28 - 16) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 16) + ; + out[25 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (28 - 12) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 12) + ; + out[26 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (28 - 8) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 8) + ; + out[27 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (28 - 4) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 4) + ; + } + + + public static void integratedpack29(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 29) + ; + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (29 - 26) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 26) + ; + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (29 - 23) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 23) + ; + out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (29 - 20) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 20) + ; + out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (29 - 17) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 17) + ; + out[5 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (29 - 14) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 14) + ; + out[6 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (29 - 11) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 11) + ; + out[7 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (29 - 8) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) + ; + out[8 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (29 - 5) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 5) + ; + out[9 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (29 - 2) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 2) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 31) + ; + out[10 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (29 - 28) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 28) + ; + out[11 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (29 - 25) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 25) + ; + out[12 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (29 - 22) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 22) + ; + out[13 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (29 - 19) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 19) + ; + out[14 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (29 - 16) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) + ; + out[15 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (29 - 13) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 13) + ; + out[16 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (29 - 10) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 10) + ; + out[17 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (29 - 7) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 7) + ; + out[18 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (29 - 4) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 4) + ; + out[19 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (29 - 1) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 1) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 30) + ; + out[20 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (29 - 27) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 27) + ; + out[21 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (29 - 24) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 24) + ; + out[22 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (29 - 21) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 21) + ; + out[23 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (29 - 18) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 18) + ; + out[24 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (29 - 15) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 15) + ; + out[25 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (29 - 12) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 12) + ; + out[26 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (29 - 9) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 9) + ; + out[27 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (29 - 6) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 6) + ; + out[28 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (29 - 3) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 3) + ; + } + + + public static void integratedpack30(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 30) + ; + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (30 - 28) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 28) + ; + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (30 - 26) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 26) + ; + out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (30 - 24) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 24) + ; + out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (30 - 22) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 22) + ; + out[5 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (30 - 20) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 20) + ; + out[6 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (30 - 18) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 18) + ; + out[7 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (30 - 16) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 16) + ; + out[8 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (30 - 14) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 14) + ; + out[9 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (30 - 12) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 12) + ; + out[10 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (30 - 10) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 10) + ; + out[11 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (30 - 8) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 8) + ; + out[12 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (30 - 6) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 6) + ; + out[13 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (30 - 4) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 4) + ; + out[14 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (30 - 2) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 2) + ; + out[15 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 30) + ; + out[16 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (30 - 28) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 28) + ; + out[17 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (30 - 26) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 26) + ; + out[18 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (30 - 24) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 24) + ; + out[19 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (30 - 22) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 22) + ; + out[20 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (30 - 20) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 20) + ; + out[21 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (30 - 18) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 18) + ; + out[22 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (30 - 16) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 16) + ; + out[23 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (30 - 14) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 14) + ; + out[24 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (30 - 12) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 12) + ; + out[25 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (30 - 10) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 10) + ; + out[26 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (30 - 8) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 8) + ; + out[27 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (30 - 6) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 6) + ; + out[28 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (30 - 4) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 4) + ; + out[29 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (30 - 2) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 2) + ; + } + + + public static void integratedpack31(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 31) + ; + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (31 - 30) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 30) + ; + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (31 - 29) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 29) + ; + out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (31 - 28) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 28) + ; + out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (31 - 27) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 27) + ; + out[5 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (31 - 26) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 26) + ; + out[6 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (31 - 25) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 25) + ; + out[7 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (31 - 24) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 24) + ; + out[8 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (31 - 23) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 23) + ; + out[9 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (31 - 22) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 22) + ; + out[10 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (31 - 21) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 21) + ; + out[11 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (31 - 20) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 20) + ; + out[12 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (31 - 19) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 19) + ; + out[13 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (31 - 18) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 18) + ; + out[14 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (31 - 17) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 17) + ; + out[15 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (31 - 16) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) + ; + out[16 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (31 - 15) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 15) + ; + out[17 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (31 - 14) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 14) + ; + out[18 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (31 - 13) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 13) + ; + out[19 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (31 - 12) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 12) + ; + out[20 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (31 - 11) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 11) + ; + out[21 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (31 - 10) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 10) + ; + out[22 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (31 - 9) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 9) + ; + out[23 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (31 - 8) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) + ; + out[24 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (31 - 7) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 7) + ; + out[25 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (31 - 6) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 6) + ; + out[26 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (31 - 5) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 5) + ; + out[27 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (31 - 4) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 4) + ; + out[28 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (31 - 3) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 3) + ; + out[29 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (31 - 2) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 2) + ; + out[30 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (31 - 1) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 1) + ; + } + + + public static void integratedunpack1(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 1) + ) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 1) & 1) + ) + out[1 + outpos - 1]; + out[2 + outpos] = (((in[0 + inpos] >>> 2) & 1) + ) + out[2 + outpos - 1]; + out[3 + outpos] = (((in[0 + inpos] >>> 3) & 1) + ) + out[3 + outpos - 1]; + out[4 + outpos] = (((in[0 + inpos] >>> 4) & 1) + ) + out[4 + outpos - 1]; + out[5 + outpos] = (((in[0 + inpos] >>> 5) & 1) + ) + out[5 + outpos - 1]; + out[6 + outpos] = (((in[0 + inpos] >>> 6) & 1) + ) + out[6 + outpos - 1]; + out[7 + outpos] = (((in[0 + inpos] >>> 7) & 1) + ) + out[7 + outpos - 1]; + out[8 + outpos] = (((in[0 + inpos] >>> 8) & 1) + ) + out[8 + outpos - 1]; + out[9 + outpos] = (((in[0 + inpos] >>> 9) & 1) + ) + out[9 + outpos - 1]; + out[10 + outpos] = (((in[0 + inpos] >>> 10) & 1) + ) + out[10 + outpos - 1]; + out[11 + outpos] = (((in[0 + inpos] >>> 11) & 1) + ) + out[11 + outpos - 1]; + out[12 + outpos] = (((in[0 + inpos] >>> 12) & 1) + ) + out[12 + outpos - 1]; + out[13 + outpos] = (((in[0 + inpos] >>> 13) & 1) + ) + out[13 + outpos - 1]; + out[14 + outpos] = (((in[0 + inpos] >>> 14) & 1) + ) + out[14 + outpos - 1]; + out[15 + outpos] = (((in[0 + inpos] >>> 15) & 1) + ) + out[15 + outpos - 1]; + out[16 + outpos] = (((in[0 + inpos] >>> 16) & 1) + ) + out[16 + outpos - 1]; + out[17 + outpos] = (((in[0 + inpos] >>> 17) & 1) + ) + out[17 + outpos - 1]; + out[18 + outpos] = (((in[0 + inpos] >>> 18) & 1) + ) + out[18 + outpos - 1]; + out[19 + outpos] = (((in[0 + inpos] >>> 19) & 1) + ) + out[19 + outpos - 1]; + out[20 + outpos] = (((in[0 + inpos] >>> 20) & 1) + ) + out[20 + outpos - 1]; + out[21 + outpos] = (((in[0 + inpos] >>> 21) & 1) + ) + out[21 + outpos - 1]; + out[22 + outpos] = (((in[0 + inpos] >>> 22) & 1) + ) + out[22 + outpos - 1]; + out[23 + outpos] = (((in[0 + inpos] >>> 23) & 1) + ) + out[23 + outpos - 1]; + out[24 + outpos] = (((in[0 + inpos] >>> 24) & 1) + ) + out[24 + outpos - 1]; + out[25 + outpos] = (((in[0 + inpos] >>> 25) & 1) + ) + out[25 + outpos - 1]; + out[26 + outpos] = (((in[0 + inpos] >>> 26) & 1) + ) + out[26 + outpos - 1]; + out[27 + outpos] = (((in[0 + inpos] >>> 27) & 1) + ) + out[27 + outpos - 1]; + out[28 + outpos] = (((in[0 + inpos] >>> 28) & 1) + ) + out[28 + outpos - 1]; + out[29 + outpos] = (((in[0 + inpos] >>> 29) & 1) + ) + out[29 + outpos - 1]; + out[30 + outpos] = (((in[0 + inpos] >>> 30) & 1) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[0 + inpos] >>> 31) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack2(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 3) + ) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 2) & 3) + ) + out[1 + outpos - 1]; + out[2 + outpos] = (((in[0 + inpos] >>> 4) & 3) + ) + out[2 + outpos - 1]; + out[3 + outpos] = (((in[0 + inpos] >>> 6) & 3) + ) + out[3 + outpos - 1]; + out[4 + outpos] = (((in[0 + inpos] >>> 8) & 3) + ) + out[4 + outpos - 1]; + out[5 + outpos] = (((in[0 + inpos] >>> 10) & 3) + ) + out[5 + outpos - 1]; + out[6 + outpos] = (((in[0 + inpos] >>> 12) & 3) + ) + out[6 + outpos - 1]; + out[7 + outpos] = (((in[0 + inpos] >>> 14) & 3) + ) + out[7 + outpos - 1]; + out[8 + outpos] = (((in[0 + inpos] >>> 16) & 3) + ) + out[8 + outpos - 1]; + out[9 + outpos] = (((in[0 + inpos] >>> 18) & 3) + ) + out[9 + outpos - 1]; + out[10 + outpos] = (((in[0 + inpos] >>> 20) & 3) + ) + out[10 + outpos - 1]; + out[11 + outpos] = (((in[0 + inpos] >>> 22) & 3) + ) + out[11 + outpos - 1]; + out[12 + outpos] = (((in[0 + inpos] >>> 24) & 3) + ) + out[12 + outpos - 1]; + out[13 + outpos] = (((in[0 + inpos] >>> 26) & 3) + ) + out[13 + outpos - 1]; + out[14 + outpos] = (((in[0 + inpos] >>> 28) & 3) + ) + out[14 + outpos - 1]; + out[15 + outpos] = ((in[0 + inpos] >>> 30) + ) + out[15 + outpos - 1]; + out[16 + outpos] = (((in[1 + inpos] >>> 0) & 3) + ) + out[16 + outpos - 1]; + out[17 + outpos] = (((in[1 + inpos] >>> 2) & 3) + ) + out[17 + outpos - 1]; + out[18 + outpos] = (((in[1 + inpos] >>> 4) & 3) + ) + out[18 + outpos - 1]; + out[19 + outpos] = (((in[1 + inpos] >>> 6) & 3) + ) + out[19 + outpos - 1]; + out[20 + outpos] = (((in[1 + inpos] >>> 8) & 3) + ) + out[20 + outpos - 1]; + out[21 + outpos] = (((in[1 + inpos] >>> 10) & 3) + ) + out[21 + outpos - 1]; + out[22 + outpos] = (((in[1 + inpos] >>> 12) & 3) + ) + out[22 + outpos - 1]; + out[23 + outpos] = (((in[1 + inpos] >>> 14) & 3) + ) + out[23 + outpos - 1]; + out[24 + outpos] = (((in[1 + inpos] >>> 16) & 3) + ) + out[24 + outpos - 1]; + out[25 + outpos] = (((in[1 + inpos] >>> 18) & 3) + ) + out[25 + outpos - 1]; + out[26 + outpos] = (((in[1 + inpos] >>> 20) & 3) + ) + out[26 + outpos - 1]; + out[27 + outpos] = (((in[1 + inpos] >>> 22) & 3) + ) + out[27 + outpos - 1]; + out[28 + outpos] = (((in[1 + inpos] >>> 24) & 3) + ) + out[28 + outpos - 1]; + out[29 + outpos] = (((in[1 + inpos] >>> 26) & 3) + ) + out[29 + outpos - 1]; + out[30 + outpos] = (((in[1 + inpos] >>> 28) & 3) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[1 + inpos] >>> 30) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack3(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 7) + ) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 3) & 7) + ) + out[1 + outpos - 1]; + out[2 + outpos] = (((in[0 + inpos] >>> 6) & 7) + ) + out[2 + outpos - 1]; + out[3 + outpos] = (((in[0 + inpos] >>> 9) & 7) + ) + out[3 + outpos - 1]; + out[4 + outpos] = (((in[0 + inpos] >>> 12) & 7) + ) + out[4 + outpos - 1]; + out[5 + outpos] = (((in[0 + inpos] >>> 15) & 7) + ) + out[5 + outpos - 1]; + out[6 + outpos] = (((in[0 + inpos] >>> 18) & 7) + ) + out[6 + outpos - 1]; + out[7 + outpos] = (((in[0 + inpos] >>> 21) & 7) + ) + out[7 + outpos - 1]; + out[8 + outpos] = (((in[0 + inpos] >>> 24) & 7) + ) + out[8 + outpos - 1]; + out[9 + outpos] = (((in[0 + inpos] >>> 27) & 7) + ) + out[9 + outpos - 1]; + out[10 + outpos] = ((in[0 + inpos] >>> 30) + | ((in[1 + inpos] & 1) << (3 - 1)) + ) + out[10 + outpos - 1]; + out[11 + outpos] = (((in[1 + inpos] >>> 1) & 7) + ) + out[11 + outpos - 1]; + out[12 + outpos] = (((in[1 + inpos] >>> 4) & 7) + ) + out[12 + outpos - 1]; + out[13 + outpos] = (((in[1 + inpos] >>> 7) & 7) + ) + out[13 + outpos - 1]; + out[14 + outpos] = (((in[1 + inpos] >>> 10) & 7) + ) + out[14 + outpos - 1]; + out[15 + outpos] = (((in[1 + inpos] >>> 13) & 7) + ) + out[15 + outpos - 1]; + out[16 + outpos] = (((in[1 + inpos] >>> 16) & 7) + ) + out[16 + outpos - 1]; + out[17 + outpos] = (((in[1 + inpos] >>> 19) & 7) + ) + out[17 + outpos - 1]; + out[18 + outpos] = (((in[1 + inpos] >>> 22) & 7) + ) + out[18 + outpos - 1]; + out[19 + outpos] = (((in[1 + inpos] >>> 25) & 7) + ) + out[19 + outpos - 1]; + out[20 + outpos] = (((in[1 + inpos] >>> 28) & 7) + ) + out[20 + outpos - 1]; + out[21 + outpos] = ((in[1 + inpos] >>> 31) + | ((in[2 + inpos] & 3) << (3 - 2)) + ) + out[21 + outpos - 1]; + out[22 + outpos] = (((in[2 + inpos] >>> 2) & 7) + ) + out[22 + outpos - 1]; + out[23 + outpos] = (((in[2 + inpos] >>> 5) & 7) + ) + out[23 + outpos - 1]; + out[24 + outpos] = (((in[2 + inpos] >>> 8) & 7) + ) + out[24 + outpos - 1]; + out[25 + outpos] = (((in[2 + inpos] >>> 11) & 7) + ) + out[25 + outpos - 1]; + out[26 + outpos] = (((in[2 + inpos] >>> 14) & 7) + ) + out[26 + outpos - 1]; + out[27 + outpos] = (((in[2 + inpos] >>> 17) & 7) + ) + out[27 + outpos - 1]; + out[28 + outpos] = (((in[2 + inpos] >>> 20) & 7) + ) + out[28 + outpos - 1]; + out[29 + outpos] = (((in[2 + inpos] >>> 23) & 7) + ) + out[29 + outpos - 1]; + out[30 + outpos] = (((in[2 + inpos] >>> 26) & 7) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[2 + inpos] >>> 29) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack4(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 15) + ) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 4) & 15) + ) + out[1 + outpos - 1]; + out[2 + outpos] = (((in[0 + inpos] >>> 8) & 15) + ) + out[2 + outpos - 1]; + out[3 + outpos] = (((in[0 + inpos] >>> 12) & 15) + ) + out[3 + outpos - 1]; + out[4 + outpos] = (((in[0 + inpos] >>> 16) & 15) + ) + out[4 + outpos - 1]; + out[5 + outpos] = (((in[0 + inpos] >>> 20) & 15) + ) + out[5 + outpos - 1]; + out[6 + outpos] = (((in[0 + inpos] >>> 24) & 15) + ) + out[6 + outpos - 1]; + out[7 + outpos] = ((in[0 + inpos] >>> 28) + ) + out[7 + outpos - 1]; + out[8 + outpos] = (((in[1 + inpos] >>> 0) & 15) + ) + out[8 + outpos - 1]; + out[9 + outpos] = (((in[1 + inpos] >>> 4) & 15) + ) + out[9 + outpos - 1]; + out[10 + outpos] = (((in[1 + inpos] >>> 8) & 15) + ) + out[10 + outpos - 1]; + out[11 + outpos] = (((in[1 + inpos] >>> 12) & 15) + ) + out[11 + outpos - 1]; + out[12 + outpos] = (((in[1 + inpos] >>> 16) & 15) + ) + out[12 + outpos - 1]; + out[13 + outpos] = (((in[1 + inpos] >>> 20) & 15) + ) + out[13 + outpos - 1]; + out[14 + outpos] = (((in[1 + inpos] >>> 24) & 15) + ) + out[14 + outpos - 1]; + out[15 + outpos] = ((in[1 + inpos] >>> 28) + ) + out[15 + outpos - 1]; + out[16 + outpos] = (((in[2 + inpos] >>> 0) & 15) + ) + out[16 + outpos - 1]; + out[17 + outpos] = (((in[2 + inpos] >>> 4) & 15) + ) + out[17 + outpos - 1]; + out[18 + outpos] = (((in[2 + inpos] >>> 8) & 15) + ) + out[18 + outpos - 1]; + out[19 + outpos] = (((in[2 + inpos] >>> 12) & 15) + ) + out[19 + outpos - 1]; + out[20 + outpos] = (((in[2 + inpos] >>> 16) & 15) + ) + out[20 + outpos - 1]; + out[21 + outpos] = (((in[2 + inpos] >>> 20) & 15) + ) + out[21 + outpos - 1]; + out[22 + outpos] = (((in[2 + inpos] >>> 24) & 15) + ) + out[22 + outpos - 1]; + out[23 + outpos] = ((in[2 + inpos] >>> 28) + ) + out[23 + outpos - 1]; + out[24 + outpos] = (((in[3 + inpos] >>> 0) & 15) + ) + out[24 + outpos - 1]; + out[25 + outpos] = (((in[3 + inpos] >>> 4) & 15) + ) + out[25 + outpos - 1]; + out[26 + outpos] = (((in[3 + inpos] >>> 8) & 15) + ) + out[26 + outpos - 1]; + out[27 + outpos] = (((in[3 + inpos] >>> 12) & 15) + ) + out[27 + outpos - 1]; + out[28 + outpos] = (((in[3 + inpos] >>> 16) & 15) + ) + out[28 + outpos - 1]; + out[29 + outpos] = (((in[3 + inpos] >>> 20) & 15) + ) + out[29 + outpos - 1]; + out[30 + outpos] = (((in[3 + inpos] >>> 24) & 15) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[3 + inpos] >>> 28) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack5(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 31) + ) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 5) & 31) + ) + out[1 + outpos - 1]; + out[2 + outpos] = (((in[0 + inpos] >>> 10) & 31) + ) + out[2 + outpos - 1]; + out[3 + outpos] = (((in[0 + inpos] >>> 15) & 31) + ) + out[3 + outpos - 1]; + out[4 + outpos] = (((in[0 + inpos] >>> 20) & 31) + ) + out[4 + outpos - 1]; + out[5 + outpos] = (((in[0 + inpos] >>> 25) & 31) + ) + out[5 + outpos - 1]; + out[6 + outpos] = ((in[0 + inpos] >>> 30) + | ((in[1 + inpos] & 7) << (5 - 3)) + ) + out[6 + outpos - 1]; + out[7 + outpos] = (((in[1 + inpos] >>> 3) & 31) + ) + out[7 + outpos - 1]; + out[8 + outpos] = (((in[1 + inpos] >>> 8) & 31) + ) + out[8 + outpos - 1]; + out[9 + outpos] = (((in[1 + inpos] >>> 13) & 31) + ) + out[9 + outpos - 1]; + out[10 + outpos] = (((in[1 + inpos] >>> 18) & 31) + ) + out[10 + outpos - 1]; + out[11 + outpos] = (((in[1 + inpos] >>> 23) & 31) + ) + out[11 + outpos - 1]; + out[12 + outpos] = ((in[1 + inpos] >>> 28) + | ((in[2 + inpos] & 1) << (5 - 1)) + ) + out[12 + outpos - 1]; + out[13 + outpos] = (((in[2 + inpos] >>> 1) & 31) + ) + out[13 + outpos - 1]; + out[14 + outpos] = (((in[2 + inpos] >>> 6) & 31) + ) + out[14 + outpos - 1]; + out[15 + outpos] = (((in[2 + inpos] >>> 11) & 31) + ) + out[15 + outpos - 1]; + out[16 + outpos] = (((in[2 + inpos] >>> 16) & 31) + ) + out[16 + outpos - 1]; + out[17 + outpos] = (((in[2 + inpos] >>> 21) & 31) + ) + out[17 + outpos - 1]; + out[18 + outpos] = (((in[2 + inpos] >>> 26) & 31) + ) + out[18 + outpos - 1]; + out[19 + outpos] = ((in[2 + inpos] >>> 31) + | ((in[3 + inpos] & 15) << (5 - 4)) + ) + out[19 + outpos - 1]; + out[20 + outpos] = (((in[3 + inpos] >>> 4) & 31) + ) + out[20 + outpos - 1]; + out[21 + outpos] = (((in[3 + inpos] >>> 9) & 31) + ) + out[21 + outpos - 1]; + out[22 + outpos] = (((in[3 + inpos] >>> 14) & 31) + ) + out[22 + outpos - 1]; + out[23 + outpos] = (((in[3 + inpos] >>> 19) & 31) + ) + out[23 + outpos - 1]; + out[24 + outpos] = (((in[3 + inpos] >>> 24) & 31) + ) + out[24 + outpos - 1]; + out[25 + outpos] = ((in[3 + inpos] >>> 29) + | ((in[4 + inpos] & 3) << (5 - 2)) + ) + out[25 + outpos - 1]; + out[26 + outpos] = (((in[4 + inpos] >>> 2) & 31) + ) + out[26 + outpos - 1]; + out[27 + outpos] = (((in[4 + inpos] >>> 7) & 31) + ) + out[27 + outpos - 1]; + out[28 + outpos] = (((in[4 + inpos] >>> 12) & 31) + ) + out[28 + outpos - 1]; + out[29 + outpos] = (((in[4 + inpos] >>> 17) & 31) + ) + out[29 + outpos - 1]; + out[30 + outpos] = (((in[4 + inpos] >>> 22) & 31) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[4 + inpos] >>> 27) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack6(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 63) + ) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 6) & 63) + ) + out[1 + outpos - 1]; + out[2 + outpos] = (((in[0 + inpos] >>> 12) & 63) + ) + out[2 + outpos - 1]; + out[3 + outpos] = (((in[0 + inpos] >>> 18) & 63) + ) + out[3 + outpos - 1]; + out[4 + outpos] = (((in[0 + inpos] >>> 24) & 63) + ) + out[4 + outpos - 1]; + out[5 + outpos] = ((in[0 + inpos] >>> 30) + | ((in[1 + inpos] & 15) << (6 - 4)) + ) + out[5 + outpos - 1]; + out[6 + outpos] = (((in[1 + inpos] >>> 4) & 63) + ) + out[6 + outpos - 1]; + out[7 + outpos] = (((in[1 + inpos] >>> 10) & 63) + ) + out[7 + outpos - 1]; + out[8 + outpos] = (((in[1 + inpos] >>> 16) & 63) + ) + out[8 + outpos - 1]; + out[9 + outpos] = (((in[1 + inpos] >>> 22) & 63) + ) + out[9 + outpos - 1]; + out[10 + outpos] = ((in[1 + inpos] >>> 28) + | ((in[2 + inpos] & 3) << (6 - 2)) + ) + out[10 + outpos - 1]; + out[11 + outpos] = (((in[2 + inpos] >>> 2) & 63) + ) + out[11 + outpos - 1]; + out[12 + outpos] = (((in[2 + inpos] >>> 8) & 63) + ) + out[12 + outpos - 1]; + out[13 + outpos] = (((in[2 + inpos] >>> 14) & 63) + ) + out[13 + outpos - 1]; + out[14 + outpos] = (((in[2 + inpos] >>> 20) & 63) + ) + out[14 + outpos - 1]; + out[15 + outpos] = ((in[2 + inpos] >>> 26) + ) + out[15 + outpos - 1]; + out[16 + outpos] = (((in[3 + inpos] >>> 0) & 63) + ) + out[16 + outpos - 1]; + out[17 + outpos] = (((in[3 + inpos] >>> 6) & 63) + ) + out[17 + outpos - 1]; + out[18 + outpos] = (((in[3 + inpos] >>> 12) & 63) + ) + out[18 + outpos - 1]; + out[19 + outpos] = (((in[3 + inpos] >>> 18) & 63) + ) + out[19 + outpos - 1]; + out[20 + outpos] = (((in[3 + inpos] >>> 24) & 63) + ) + out[20 + outpos - 1]; + out[21 + outpos] = ((in[3 + inpos] >>> 30) + | ((in[4 + inpos] & 15) << (6 - 4)) + ) + out[21 + outpos - 1]; + out[22 + outpos] = (((in[4 + inpos] >>> 4) & 63) + ) + out[22 + outpos - 1]; + out[23 + outpos] = (((in[4 + inpos] >>> 10) & 63) + ) + out[23 + outpos - 1]; + out[24 + outpos] = (((in[4 + inpos] >>> 16) & 63) + ) + out[24 + outpos - 1]; + out[25 + outpos] = (((in[4 + inpos] >>> 22) & 63) + ) + out[25 + outpos - 1]; + out[26 + outpos] = ((in[4 + inpos] >>> 28) + | ((in[5 + inpos] & 3) << (6 - 2)) + ) + out[26 + outpos - 1]; + out[27 + outpos] = (((in[5 + inpos] >>> 2) & 63) + ) + out[27 + outpos - 1]; + out[28 + outpos] = (((in[5 + inpos] >>> 8) & 63) + ) + out[28 + outpos - 1]; + out[29 + outpos] = (((in[5 + inpos] >>> 14) & 63) + ) + out[29 + outpos - 1]; + out[30 + outpos] = (((in[5 + inpos] >>> 20) & 63) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[5 + inpos] >>> 26) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack7(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 127) + ) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 7) & 127) + ) + out[1 + outpos - 1]; + out[2 + outpos] = (((in[0 + inpos] >>> 14) & 127) + ) + out[2 + outpos - 1]; + out[3 + outpos] = (((in[0 + inpos] >>> 21) & 127) + ) + out[3 + outpos - 1]; + out[4 + outpos] = ((in[0 + inpos] >>> 28) + | ((in[1 + inpos] & 7) << (7 - 3)) + ) + out[4 + outpos - 1]; + out[5 + outpos] = (((in[1 + inpos] >>> 3) & 127) + ) + out[5 + outpos - 1]; + out[6 + outpos] = (((in[1 + inpos] >>> 10) & 127) + ) + out[6 + outpos - 1]; + out[7 + outpos] = (((in[1 + inpos] >>> 17) & 127) + ) + out[7 + outpos - 1]; + out[8 + outpos] = (((in[1 + inpos] >>> 24) & 127) + ) + out[8 + outpos - 1]; + out[9 + outpos] = ((in[1 + inpos] >>> 31) + | ((in[2 + inpos] & 63) << (7 - 6)) + ) + out[9 + outpos - 1]; + out[10 + outpos] = (((in[2 + inpos] >>> 6) & 127) + ) + out[10 + outpos - 1]; + out[11 + outpos] = (((in[2 + inpos] >>> 13) & 127) + ) + out[11 + outpos - 1]; + out[12 + outpos] = (((in[2 + inpos] >>> 20) & 127) + ) + out[12 + outpos - 1]; + out[13 + outpos] = ((in[2 + inpos] >>> 27) + | ((in[3 + inpos] & 3) << (7 - 2)) + ) + out[13 + outpos - 1]; + out[14 + outpos] = (((in[3 + inpos] >>> 2) & 127) + ) + out[14 + outpos - 1]; + out[15 + outpos] = (((in[3 + inpos] >>> 9) & 127) + ) + out[15 + outpos - 1]; + out[16 + outpos] = (((in[3 + inpos] >>> 16) & 127) + ) + out[16 + outpos - 1]; + out[17 + outpos] = (((in[3 + inpos] >>> 23) & 127) + ) + out[17 + outpos - 1]; + out[18 + outpos] = ((in[3 + inpos] >>> 30) + | ((in[4 + inpos] & 31) << (7 - 5)) + ) + out[18 + outpos - 1]; + out[19 + outpos] = (((in[4 + inpos] >>> 5) & 127) + ) + out[19 + outpos - 1]; + out[20 + outpos] = (((in[4 + inpos] >>> 12) & 127) + ) + out[20 + outpos - 1]; + out[21 + outpos] = (((in[4 + inpos] >>> 19) & 127) + ) + out[21 + outpos - 1]; + out[22 + outpos] = ((in[4 + inpos] >>> 26) + | ((in[5 + inpos] & 1) << (7 - 1)) + ) + out[22 + outpos - 1]; + out[23 + outpos] = (((in[5 + inpos] >>> 1) & 127) + ) + out[23 + outpos - 1]; + out[24 + outpos] = (((in[5 + inpos] >>> 8) & 127) + ) + out[24 + outpos - 1]; + out[25 + outpos] = (((in[5 + inpos] >>> 15) & 127) + ) + out[25 + outpos - 1]; + out[26 + outpos] = (((in[5 + inpos] >>> 22) & 127) + ) + out[26 + outpos - 1]; + out[27 + outpos] = ((in[5 + inpos] >>> 29) + | ((in[6 + inpos] & 15) << (7 - 4)) + ) + out[27 + outpos - 1]; + out[28 + outpos] = (((in[6 + inpos] >>> 4) & 127) + ) + out[28 + outpos - 1]; + out[29 + outpos] = (((in[6 + inpos] >>> 11) & 127) + ) + out[29 + outpos - 1]; + out[30 + outpos] = (((in[6 + inpos] >>> 18) & 127) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[6 + inpos] >>> 25) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack8(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 255) + ) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 8) & 255) + ) + out[1 + outpos - 1]; + out[2 + outpos] = (((in[0 + inpos] >>> 16) & 255) + ) + out[2 + outpos - 1]; + out[3 + outpos] = ((in[0 + inpos] >>> 24) + ) + out[3 + outpos - 1]; + out[4 + outpos] = (((in[1 + inpos] >>> 0) & 255) + ) + out[4 + outpos - 1]; + out[5 + outpos] = (((in[1 + inpos] >>> 8) & 255) + ) + out[5 + outpos - 1]; + out[6 + outpos] = (((in[1 + inpos] >>> 16) & 255) + ) + out[6 + outpos - 1]; + out[7 + outpos] = ((in[1 + inpos] >>> 24) + ) + out[7 + outpos - 1]; + out[8 + outpos] = (((in[2 + inpos] >>> 0) & 255) + ) + out[8 + outpos - 1]; + out[9 + outpos] = (((in[2 + inpos] >>> 8) & 255) + ) + out[9 + outpos - 1]; + out[10 + outpos] = (((in[2 + inpos] >>> 16) & 255) + ) + out[10 + outpos - 1]; + out[11 + outpos] = ((in[2 + inpos] >>> 24) + ) + out[11 + outpos - 1]; + out[12 + outpos] = (((in[3 + inpos] >>> 0) & 255) + ) + out[12 + outpos - 1]; + out[13 + outpos] = (((in[3 + inpos] >>> 8) & 255) + ) + out[13 + outpos - 1]; + out[14 + outpos] = (((in[3 + inpos] >>> 16) & 255) + ) + out[14 + outpos - 1]; + out[15 + outpos] = ((in[3 + inpos] >>> 24) + ) + out[15 + outpos - 1]; + out[16 + outpos] = (((in[4 + inpos] >>> 0) & 255) + ) + out[16 + outpos - 1]; + out[17 + outpos] = (((in[4 + inpos] >>> 8) & 255) + ) + out[17 + outpos - 1]; + out[18 + outpos] = (((in[4 + inpos] >>> 16) & 255) + ) + out[18 + outpos - 1]; + out[19 + outpos] = ((in[4 + inpos] >>> 24) + ) + out[19 + outpos - 1]; + out[20 + outpos] = (((in[5 + inpos] >>> 0) & 255) + ) + out[20 + outpos - 1]; + out[21 + outpos] = (((in[5 + inpos] >>> 8) & 255) + ) + out[21 + outpos - 1]; + out[22 + outpos] = (((in[5 + inpos] >>> 16) & 255) + ) + out[22 + outpos - 1]; + out[23 + outpos] = ((in[5 + inpos] >>> 24) + ) + out[23 + outpos - 1]; + out[24 + outpos] = (((in[6 + inpos] >>> 0) & 255) + ) + out[24 + outpos - 1]; + out[25 + outpos] = (((in[6 + inpos] >>> 8) & 255) + ) + out[25 + outpos - 1]; + out[26 + outpos] = (((in[6 + inpos] >>> 16) & 255) + ) + out[26 + outpos - 1]; + out[27 + outpos] = ((in[6 + inpos] >>> 24) + ) + out[27 + outpos - 1]; + out[28 + outpos] = (((in[7 + inpos] >>> 0) & 255) + ) + out[28 + outpos - 1]; + out[29 + outpos] = (((in[7 + inpos] >>> 8) & 255) + ) + out[29 + outpos - 1]; + out[30 + outpos] = (((in[7 + inpos] >>> 16) & 255) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[7 + inpos] >>> 24) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack9(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 511) + ) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 9) & 511) + ) + out[1 + outpos - 1]; + out[2 + outpos] = (((in[0 + inpos] >>> 18) & 511) + ) + out[2 + outpos - 1]; + out[3 + outpos] = ((in[0 + inpos] >>> 27) + | ((in[1 + inpos] & 15) << (9 - 4)) + ) + out[3 + outpos - 1]; + out[4 + outpos] = (((in[1 + inpos] >>> 4) & 511) + ) + out[4 + outpos - 1]; + out[5 + outpos] = (((in[1 + inpos] >>> 13) & 511) + ) + out[5 + outpos - 1]; + out[6 + outpos] = (((in[1 + inpos] >>> 22) & 511) + ) + out[6 + outpos - 1]; + out[7 + outpos] = ((in[1 + inpos] >>> 31) + | ((in[2 + inpos] & 255) << (9 - 8)) + ) + out[7 + outpos - 1]; + out[8 + outpos] = (((in[2 + inpos] >>> 8) & 511) + ) + out[8 + outpos - 1]; + out[9 + outpos] = (((in[2 + inpos] >>> 17) & 511) + ) + out[9 + outpos - 1]; + out[10 + outpos] = ((in[2 + inpos] >>> 26) + | ((in[3 + inpos] & 7) << (9 - 3)) + ) + out[10 + outpos - 1]; + out[11 + outpos] = (((in[3 + inpos] >>> 3) & 511) + ) + out[11 + outpos - 1]; + out[12 + outpos] = (((in[3 + inpos] >>> 12) & 511) + ) + out[12 + outpos - 1]; + out[13 + outpos] = (((in[3 + inpos] >>> 21) & 511) + ) + out[13 + outpos - 1]; + out[14 + outpos] = ((in[3 + inpos] >>> 30) + | ((in[4 + inpos] & 127) << (9 - 7)) + ) + out[14 + outpos - 1]; + out[15 + outpos] = (((in[4 + inpos] >>> 7) & 511) + ) + out[15 + outpos - 1]; + out[16 + outpos] = (((in[4 + inpos] >>> 16) & 511) + ) + out[16 + outpos - 1]; + out[17 + outpos] = ((in[4 + inpos] >>> 25) + | ((in[5 + inpos] & 3) << (9 - 2)) + ) + out[17 + outpos - 1]; + out[18 + outpos] = (((in[5 + inpos] >>> 2) & 511) + ) + out[18 + outpos - 1]; + out[19 + outpos] = (((in[5 + inpos] >>> 11) & 511) + ) + out[19 + outpos - 1]; + out[20 + outpos] = (((in[5 + inpos] >>> 20) & 511) + ) + out[20 + outpos - 1]; + out[21 + outpos] = ((in[5 + inpos] >>> 29) + | ((in[6 + inpos] & 63) << (9 - 6)) + ) + out[21 + outpos - 1]; + out[22 + outpos] = (((in[6 + inpos] >>> 6) & 511) + ) + out[22 + outpos - 1]; + out[23 + outpos] = (((in[6 + inpos] >>> 15) & 511) + ) + out[23 + outpos - 1]; + out[24 + outpos] = ((in[6 + inpos] >>> 24) + | ((in[7 + inpos] & 1) << (9 - 1)) + ) + out[24 + outpos - 1]; + out[25 + outpos] = (((in[7 + inpos] >>> 1) & 511) + ) + out[25 + outpos - 1]; + out[26 + outpos] = (((in[7 + inpos] >>> 10) & 511) + ) + out[26 + outpos - 1]; + out[27 + outpos] = (((in[7 + inpos] >>> 19) & 511) + ) + out[27 + outpos - 1]; + out[28 + outpos] = ((in[7 + inpos] >>> 28) + | ((in[8 + inpos] & 31) << (9 - 5)) + ) + out[28 + outpos - 1]; + out[29 + outpos] = (((in[8 + inpos] >>> 5) & 511) + ) + out[29 + outpos - 1]; + out[30 + outpos] = (((in[8 + inpos] >>> 14) & 511) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[8 + inpos] >>> 23) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack10(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 1023) + ) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 10) & 1023) + ) + out[1 + outpos - 1]; + out[2 + outpos] = (((in[0 + inpos] >>> 20) & 1023) + ) + out[2 + outpos - 1]; + out[3 + outpos] = ((in[0 + inpos] >>> 30) + | ((in[1 + inpos] & 255) << (10 - 8)) + ) + out[3 + outpos - 1]; + out[4 + outpos] = (((in[1 + inpos] >>> 8) & 1023) + ) + out[4 + outpos - 1]; + out[5 + outpos] = (((in[1 + inpos] >>> 18) & 1023) + ) + out[5 + outpos - 1]; + out[6 + outpos] = ((in[1 + inpos] >>> 28) + | ((in[2 + inpos] & 63) << (10 - 6)) + ) + out[6 + outpos - 1]; + out[7 + outpos] = (((in[2 + inpos] >>> 6) & 1023) + ) + out[7 + outpos - 1]; + out[8 + outpos] = (((in[2 + inpos] >>> 16) & 1023) + ) + out[8 + outpos - 1]; + out[9 + outpos] = ((in[2 + inpos] >>> 26) + | ((in[3 + inpos] & 15) << (10 - 4)) + ) + out[9 + outpos - 1]; + out[10 + outpos] = (((in[3 + inpos] >>> 4) & 1023) + ) + out[10 + outpos - 1]; + out[11 + outpos] = (((in[3 + inpos] >>> 14) & 1023) + ) + out[11 + outpos - 1]; + out[12 + outpos] = ((in[3 + inpos] >>> 24) + | ((in[4 + inpos] & 3) << (10 - 2)) + ) + out[12 + outpos - 1]; + out[13 + outpos] = (((in[4 + inpos] >>> 2) & 1023) + ) + out[13 + outpos - 1]; + out[14 + outpos] = (((in[4 + inpos] >>> 12) & 1023) + ) + out[14 + outpos - 1]; + out[15 + outpos] = ((in[4 + inpos] >>> 22) + ) + out[15 + outpos - 1]; + out[16 + outpos] = (((in[5 + inpos] >>> 0) & 1023) + ) + out[16 + outpos - 1]; + out[17 + outpos] = (((in[5 + inpos] >>> 10) & 1023) + ) + out[17 + outpos - 1]; + out[18 + outpos] = (((in[5 + inpos] >>> 20) & 1023) + ) + out[18 + outpos - 1]; + out[19 + outpos] = ((in[5 + inpos] >>> 30) + | ((in[6 + inpos] & 255) << (10 - 8)) + ) + out[19 + outpos - 1]; + out[20 + outpos] = (((in[6 + inpos] >>> 8) & 1023) + ) + out[20 + outpos - 1]; + out[21 + outpos] = (((in[6 + inpos] >>> 18) & 1023) + ) + out[21 + outpos - 1]; + out[22 + outpos] = ((in[6 + inpos] >>> 28) + | ((in[7 + inpos] & 63) << (10 - 6)) + ) + out[22 + outpos - 1]; + out[23 + outpos] = (((in[7 + inpos] >>> 6) & 1023) + ) + out[23 + outpos - 1]; + out[24 + outpos] = (((in[7 + inpos] >>> 16) & 1023) + ) + out[24 + outpos - 1]; + out[25 + outpos] = ((in[7 + inpos] >>> 26) + | ((in[8 + inpos] & 15) << (10 - 4)) + ) + out[25 + outpos - 1]; + out[26 + outpos] = (((in[8 + inpos] >>> 4) & 1023) + ) + out[26 + outpos - 1]; + out[27 + outpos] = (((in[8 + inpos] >>> 14) & 1023) + ) + out[27 + outpos - 1]; + out[28 + outpos] = ((in[8 + inpos] >>> 24) + | ((in[9 + inpos] & 3) << (10 - 2)) + ) + out[28 + outpos - 1]; + out[29 + outpos] = (((in[9 + inpos] >>> 2) & 1023) + ) + out[29 + outpos - 1]; + out[30 + outpos] = (((in[9 + inpos] >>> 12) & 1023) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[9 + inpos] >>> 22) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack11(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 2047) + ) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 11) & 2047) + ) + out[1 + outpos - 1]; + out[2 + outpos] = ((in[0 + inpos] >>> 22) + | ((in[1 + inpos] & 1) << (11 - 1)) + ) + out[2 + outpos - 1]; + out[3 + outpos] = (((in[1 + inpos] >>> 1) & 2047) + ) + out[3 + outpos - 1]; + out[4 + outpos] = (((in[1 + inpos] >>> 12) & 2047) + ) + out[4 + outpos - 1]; + out[5 + outpos] = ((in[1 + inpos] >>> 23) + | ((in[2 + inpos] & 3) << (11 - 2)) + ) + out[5 + outpos - 1]; + out[6 + outpos] = (((in[2 + inpos] >>> 2) & 2047) + ) + out[6 + outpos - 1]; + out[7 + outpos] = (((in[2 + inpos] >>> 13) & 2047) + ) + out[7 + outpos - 1]; + out[8 + outpos] = ((in[2 + inpos] >>> 24) + | ((in[3 + inpos] & 7) << (11 - 3)) + ) + out[8 + outpos - 1]; + out[9 + outpos] = (((in[3 + inpos] >>> 3) & 2047) + ) + out[9 + outpos - 1]; + out[10 + outpos] = (((in[3 + inpos] >>> 14) & 2047) + ) + out[10 + outpos - 1]; + out[11 + outpos] = ((in[3 + inpos] >>> 25) + | ((in[4 + inpos] & 15) << (11 - 4)) + ) + out[11 + outpos - 1]; + out[12 + outpos] = (((in[4 + inpos] >>> 4) & 2047) + ) + out[12 + outpos - 1]; + out[13 + outpos] = (((in[4 + inpos] >>> 15) & 2047) + ) + out[13 + outpos - 1]; + out[14 + outpos] = ((in[4 + inpos] >>> 26) + | ((in[5 + inpos] & 31) << (11 - 5)) + ) + out[14 + outpos - 1]; + out[15 + outpos] = (((in[5 + inpos] >>> 5) & 2047) + ) + out[15 + outpos - 1]; + out[16 + outpos] = (((in[5 + inpos] >>> 16) & 2047) + ) + out[16 + outpos - 1]; + out[17 + outpos] = ((in[5 + inpos] >>> 27) + | ((in[6 + inpos] & 63) << (11 - 6)) + ) + out[17 + outpos - 1]; + out[18 + outpos] = (((in[6 + inpos] >>> 6) & 2047) + ) + out[18 + outpos - 1]; + out[19 + outpos] = (((in[6 + inpos] >>> 17) & 2047) + ) + out[19 + outpos - 1]; + out[20 + outpos] = ((in[6 + inpos] >>> 28) + | ((in[7 + inpos] & 127) << (11 - 7)) + ) + out[20 + outpos - 1]; + out[21 + outpos] = (((in[7 + inpos] >>> 7) & 2047) + ) + out[21 + outpos - 1]; + out[22 + outpos] = (((in[7 + inpos] >>> 18) & 2047) + ) + out[22 + outpos - 1]; + out[23 + outpos] = ((in[7 + inpos] >>> 29) + | ((in[8 + inpos] & 255) << (11 - 8)) + ) + out[23 + outpos - 1]; + out[24 + outpos] = (((in[8 + inpos] >>> 8) & 2047) + ) + out[24 + outpos - 1]; + out[25 + outpos] = (((in[8 + inpos] >>> 19) & 2047) + ) + out[25 + outpos - 1]; + out[26 + outpos] = ((in[8 + inpos] >>> 30) + | ((in[9 + inpos] & 511) << (11 - 9)) + ) + out[26 + outpos - 1]; + out[27 + outpos] = (((in[9 + inpos] >>> 9) & 2047) + ) + out[27 + outpos - 1]; + out[28 + outpos] = (((in[9 + inpos] >>> 20) & 2047) + ) + out[28 + outpos - 1]; + out[29 + outpos] = ((in[9 + inpos] >>> 31) + | ((in[10 + inpos] & 1023) << (11 - 10)) + ) + out[29 + outpos - 1]; + out[30 + outpos] = (((in[10 + inpos] >>> 10) & 2047) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[10 + inpos] >>> 21) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack12(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 4095) + ) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 12) & 4095) + ) + out[1 + outpos - 1]; + out[2 + outpos] = ((in[0 + inpos] >>> 24) + | ((in[1 + inpos] & 15) << (12 - 4)) + ) + out[2 + outpos - 1]; + out[3 + outpos] = (((in[1 + inpos] >>> 4) & 4095) + ) + out[3 + outpos - 1]; + out[4 + outpos] = (((in[1 + inpos] >>> 16) & 4095) + ) + out[4 + outpos - 1]; + out[5 + outpos] = ((in[1 + inpos] >>> 28) + | ((in[2 + inpos] & 255) << (12 - 8)) + ) + out[5 + outpos - 1]; + out[6 + outpos] = (((in[2 + inpos] >>> 8) & 4095) + ) + out[6 + outpos - 1]; + out[7 + outpos] = ((in[2 + inpos] >>> 20) + ) + out[7 + outpos - 1]; + out[8 + outpos] = (((in[3 + inpos] >>> 0) & 4095) + ) + out[8 + outpos - 1]; + out[9 + outpos] = (((in[3 + inpos] >>> 12) & 4095) + ) + out[9 + outpos - 1]; + out[10 + outpos] = ((in[3 + inpos] >>> 24) + | ((in[4 + inpos] & 15) << (12 - 4)) + ) + out[10 + outpos - 1]; + out[11 + outpos] = (((in[4 + inpos] >>> 4) & 4095) + ) + out[11 + outpos - 1]; + out[12 + outpos] = (((in[4 + inpos] >>> 16) & 4095) + ) + out[12 + outpos - 1]; + out[13 + outpos] = ((in[4 + inpos] >>> 28) + | ((in[5 + inpos] & 255) << (12 - 8)) + ) + out[13 + outpos - 1]; + out[14 + outpos] = (((in[5 + inpos] >>> 8) & 4095) + ) + out[14 + outpos - 1]; + out[15 + outpos] = ((in[5 + inpos] >>> 20) + ) + out[15 + outpos - 1]; + out[16 + outpos] = (((in[6 + inpos] >>> 0) & 4095) + ) + out[16 + outpos - 1]; + out[17 + outpos] = (((in[6 + inpos] >>> 12) & 4095) + ) + out[17 + outpos - 1]; + out[18 + outpos] = ((in[6 + inpos] >>> 24) + | ((in[7 + inpos] & 15) << (12 - 4)) + ) + out[18 + outpos - 1]; + out[19 + outpos] = (((in[7 + inpos] >>> 4) & 4095) + ) + out[19 + outpos - 1]; + out[20 + outpos] = (((in[7 + inpos] >>> 16) & 4095) + ) + out[20 + outpos - 1]; + out[21 + outpos] = ((in[7 + inpos] >>> 28) + | ((in[8 + inpos] & 255) << (12 - 8)) + ) + out[21 + outpos - 1]; + out[22 + outpos] = (((in[8 + inpos] >>> 8) & 4095) + ) + out[22 + outpos - 1]; + out[23 + outpos] = ((in[8 + inpos] >>> 20) + ) + out[23 + outpos - 1]; + out[24 + outpos] = (((in[9 + inpos] >>> 0) & 4095) + ) + out[24 + outpos - 1]; + out[25 + outpos] = (((in[9 + inpos] >>> 12) & 4095) + ) + out[25 + outpos - 1]; + out[26 + outpos] = ((in[9 + inpos] >>> 24) + | ((in[10 + inpos] & 15) << (12 - 4)) + ) + out[26 + outpos - 1]; + out[27 + outpos] = (((in[10 + inpos] >>> 4) & 4095) + ) + out[27 + outpos - 1]; + out[28 + outpos] = (((in[10 + inpos] >>> 16) & 4095) + ) + out[28 + outpos - 1]; + out[29 + outpos] = ((in[10 + inpos] >>> 28) + | ((in[11 + inpos] & 255) << (12 - 8)) + ) + out[29 + outpos - 1]; + out[30 + outpos] = (((in[11 + inpos] >>> 8) & 4095) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[11 + inpos] >>> 20) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack13(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 8191) + ) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 13) & 8191) + ) + out[1 + outpos - 1]; + out[2 + outpos] = ((in[0 + inpos] >>> 26) + | ((in[1 + inpos] & 127) << (13 - 7)) + ) + out[2 + outpos - 1]; + out[3 + outpos] = (((in[1 + inpos] >>> 7) & 8191) + ) + out[3 + outpos - 1]; + out[4 + outpos] = ((in[1 + inpos] >>> 20) + | ((in[2 + inpos] & 1) << (13 - 1)) + ) + out[4 + outpos - 1]; + out[5 + outpos] = (((in[2 + inpos] >>> 1) & 8191) + ) + out[5 + outpos - 1]; + out[6 + outpos] = (((in[2 + inpos] >>> 14) & 8191) + ) + out[6 + outpos - 1]; + out[7 + outpos] = ((in[2 + inpos] >>> 27) + | ((in[3 + inpos] & 255) << (13 - 8)) + ) + out[7 + outpos - 1]; + out[8 + outpos] = (((in[3 + inpos] >>> 8) & 8191) + ) + out[8 + outpos - 1]; + out[9 + outpos] = ((in[3 + inpos] >>> 21) + | ((in[4 + inpos] & 3) << (13 - 2)) + ) + out[9 + outpos - 1]; + out[10 + outpos] = (((in[4 + inpos] >>> 2) & 8191) + ) + out[10 + outpos - 1]; + out[11 + outpos] = (((in[4 + inpos] >>> 15) & 8191) + ) + out[11 + outpos - 1]; + out[12 + outpos] = ((in[4 + inpos] >>> 28) + | ((in[5 + inpos] & 511) << (13 - 9)) + ) + out[12 + outpos - 1]; + out[13 + outpos] = (((in[5 + inpos] >>> 9) & 8191) + ) + out[13 + outpos - 1]; + out[14 + outpos] = ((in[5 + inpos] >>> 22) + | ((in[6 + inpos] & 7) << (13 - 3)) + ) + out[14 + outpos - 1]; + out[15 + outpos] = (((in[6 + inpos] >>> 3) & 8191) + ) + out[15 + outpos - 1]; + out[16 + outpos] = (((in[6 + inpos] >>> 16) & 8191) + ) + out[16 + outpos - 1]; + out[17 + outpos] = ((in[6 + inpos] >>> 29) + | ((in[7 + inpos] & 1023) << (13 - 10)) + ) + out[17 + outpos - 1]; + out[18 + outpos] = (((in[7 + inpos] >>> 10) & 8191) + ) + out[18 + outpos - 1]; + out[19 + outpos] = ((in[7 + inpos] >>> 23) + | ((in[8 + inpos] & 15) << (13 - 4)) + ) + out[19 + outpos - 1]; + out[20 + outpos] = (((in[8 + inpos] >>> 4) & 8191) + ) + out[20 + outpos - 1]; + out[21 + outpos] = (((in[8 + inpos] >>> 17) & 8191) + ) + out[21 + outpos - 1]; + out[22 + outpos] = ((in[8 + inpos] >>> 30) + | ((in[9 + inpos] & 2047) << (13 - 11)) + ) + out[22 + outpos - 1]; + out[23 + outpos] = (((in[9 + inpos] >>> 11) & 8191) + ) + out[23 + outpos - 1]; + out[24 + outpos] = ((in[9 + inpos] >>> 24) + | ((in[10 + inpos] & 31) << (13 - 5)) + ) + out[24 + outpos - 1]; + out[25 + outpos] = (((in[10 + inpos] >>> 5) & 8191) + ) + out[25 + outpos - 1]; + out[26 + outpos] = (((in[10 + inpos] >>> 18) & 8191) + ) + out[26 + outpos - 1]; + out[27 + outpos] = ((in[10 + inpos] >>> 31) + | ((in[11 + inpos] & 4095) << (13 - 12)) + ) + out[27 + outpos - 1]; + out[28 + outpos] = (((in[11 + inpos] >>> 12) & 8191) + ) + out[28 + outpos - 1]; + out[29 + outpos] = ((in[11 + inpos] >>> 25) + | ((in[12 + inpos] & 63) << (13 - 6)) + ) + out[29 + outpos - 1]; + out[30 + outpos] = (((in[12 + inpos] >>> 6) & 8191) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[12 + inpos] >>> 19) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack14(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 16383) + ) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 14) & 16383) + ) + out[1 + outpos - 1]; + out[2 + outpos] = ((in[0 + inpos] >>> 28) + | ((in[1 + inpos] & 1023) << (14 - 10)) + ) + out[2 + outpos - 1]; + out[3 + outpos] = (((in[1 + inpos] >>> 10) & 16383) + ) + out[3 + outpos - 1]; + out[4 + outpos] = ((in[1 + inpos] >>> 24) + | ((in[2 + inpos] & 63) << (14 - 6)) + ) + out[4 + outpos - 1]; + out[5 + outpos] = (((in[2 + inpos] >>> 6) & 16383) + ) + out[5 + outpos - 1]; + out[6 + outpos] = ((in[2 + inpos] >>> 20) + | ((in[3 + inpos] & 3) << (14 - 2)) + ) + out[6 + outpos - 1]; + out[7 + outpos] = (((in[3 + inpos] >>> 2) & 16383) + ) + out[7 + outpos - 1]; + out[8 + outpos] = (((in[3 + inpos] >>> 16) & 16383) + ) + out[8 + outpos - 1]; + out[9 + outpos] = ((in[3 + inpos] >>> 30) + | ((in[4 + inpos] & 4095) << (14 - 12)) + ) + out[9 + outpos - 1]; + out[10 + outpos] = (((in[4 + inpos] >>> 12) & 16383) + ) + out[10 + outpos - 1]; + out[11 + outpos] = ((in[4 + inpos] >>> 26) + | ((in[5 + inpos] & 255) << (14 - 8)) + ) + out[11 + outpos - 1]; + out[12 + outpos] = (((in[5 + inpos] >>> 8) & 16383) + ) + out[12 + outpos - 1]; + out[13 + outpos] = ((in[5 + inpos] >>> 22) + | ((in[6 + inpos] & 15) << (14 - 4)) + ) + out[13 + outpos - 1]; + out[14 + outpos] = (((in[6 + inpos] >>> 4) & 16383) + ) + out[14 + outpos - 1]; + out[15 + outpos] = ((in[6 + inpos] >>> 18) + ) + out[15 + outpos - 1]; + out[16 + outpos] = (((in[7 + inpos] >>> 0) & 16383) + ) + out[16 + outpos - 1]; + out[17 + outpos] = (((in[7 + inpos] >>> 14) & 16383) + ) + out[17 + outpos - 1]; + out[18 + outpos] = ((in[7 + inpos] >>> 28) + | ((in[8 + inpos] & 1023) << (14 - 10)) + ) + out[18 + outpos - 1]; + out[19 + outpos] = (((in[8 + inpos] >>> 10) & 16383) + ) + out[19 + outpos - 1]; + out[20 + outpos] = ((in[8 + inpos] >>> 24) + | ((in[9 + inpos] & 63) << (14 - 6)) + ) + out[20 + outpos - 1]; + out[21 + outpos] = (((in[9 + inpos] >>> 6) & 16383) + ) + out[21 + outpos - 1]; + out[22 + outpos] = ((in[9 + inpos] >>> 20) + | ((in[10 + inpos] & 3) << (14 - 2)) + ) + out[22 + outpos - 1]; + out[23 + outpos] = (((in[10 + inpos] >>> 2) & 16383) + ) + out[23 + outpos - 1]; + out[24 + outpos] = (((in[10 + inpos] >>> 16) & 16383) + ) + out[24 + outpos - 1]; + out[25 + outpos] = ((in[10 + inpos] >>> 30) + | ((in[11 + inpos] & 4095) << (14 - 12)) + ) + out[25 + outpos - 1]; + out[26 + outpos] = (((in[11 + inpos] >>> 12) & 16383) + ) + out[26 + outpos - 1]; + out[27 + outpos] = ((in[11 + inpos] >>> 26) + | ((in[12 + inpos] & 255) << (14 - 8)) + ) + out[27 + outpos - 1]; + out[28 + outpos] = (((in[12 + inpos] >>> 8) & 16383) + ) + out[28 + outpos - 1]; + out[29 + outpos] = ((in[12 + inpos] >>> 22) + | ((in[13 + inpos] & 15) << (14 - 4)) + ) + out[29 + outpos - 1]; + out[30 + outpos] = (((in[13 + inpos] >>> 4) & 16383) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[13 + inpos] >>> 18) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack15(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 32767) + ) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 15) & 32767) + ) + out[1 + outpos - 1]; + out[2 + outpos] = ((in[0 + inpos] >>> 30) + | ((in[1 + inpos] & 8191) << (15 - 13)) + ) + out[2 + outpos - 1]; + out[3 + outpos] = (((in[1 + inpos] >>> 13) & 32767) + ) + out[3 + outpos - 1]; + out[4 + outpos] = ((in[1 + inpos] >>> 28) + | ((in[2 + inpos] & 2047) << (15 - 11)) + ) + out[4 + outpos - 1]; + out[5 + outpos] = (((in[2 + inpos] >>> 11) & 32767) + ) + out[5 + outpos - 1]; + out[6 + outpos] = ((in[2 + inpos] >>> 26) + | ((in[3 + inpos] & 511) << (15 - 9)) + ) + out[6 + outpos - 1]; + out[7 + outpos] = (((in[3 + inpos] >>> 9) & 32767) + ) + out[7 + outpos - 1]; + out[8 + outpos] = ((in[3 + inpos] >>> 24) + | ((in[4 + inpos] & 127) << (15 - 7)) + ) + out[8 + outpos - 1]; + out[9 + outpos] = (((in[4 + inpos] >>> 7) & 32767) + ) + out[9 + outpos - 1]; + out[10 + outpos] = ((in[4 + inpos] >>> 22) + | ((in[5 + inpos] & 31) << (15 - 5)) + ) + out[10 + outpos - 1]; + out[11 + outpos] = (((in[5 + inpos] >>> 5) & 32767) + ) + out[11 + outpos - 1]; + out[12 + outpos] = ((in[5 + inpos] >>> 20) + | ((in[6 + inpos] & 7) << (15 - 3)) + ) + out[12 + outpos - 1]; + out[13 + outpos] = (((in[6 + inpos] >>> 3) & 32767) + ) + out[13 + outpos - 1]; + out[14 + outpos] = ((in[6 + inpos] >>> 18) + | ((in[7 + inpos] & 1) << (15 - 1)) + ) + out[14 + outpos - 1]; + out[15 + outpos] = (((in[7 + inpos] >>> 1) & 32767) + ) + out[15 + outpos - 1]; + out[16 + outpos] = (((in[7 + inpos] >>> 16) & 32767) + ) + out[16 + outpos - 1]; + out[17 + outpos] = ((in[7 + inpos] >>> 31) + | ((in[8 + inpos] & 16383) << (15 - 14)) + ) + out[17 + outpos - 1]; + out[18 + outpos] = (((in[8 + inpos] >>> 14) & 32767) + ) + out[18 + outpos - 1]; + out[19 + outpos] = ((in[8 + inpos] >>> 29) + | ((in[9 + inpos] & 4095) << (15 - 12)) + ) + out[19 + outpos - 1]; + out[20 + outpos] = (((in[9 + inpos] >>> 12) & 32767) + ) + out[20 + outpos - 1]; + out[21 + outpos] = ((in[9 + inpos] >>> 27) + | ((in[10 + inpos] & 1023) << (15 - 10)) + ) + out[21 + outpos - 1]; + out[22 + outpos] = (((in[10 + inpos] >>> 10) & 32767) + ) + out[22 + outpos - 1]; + out[23 + outpos] = ((in[10 + inpos] >>> 25) + | ((in[11 + inpos] & 255) << (15 - 8)) + ) + out[23 + outpos - 1]; + out[24 + outpos] = (((in[11 + inpos] >>> 8) & 32767) + ) + out[24 + outpos - 1]; + out[25 + outpos] = ((in[11 + inpos] >>> 23) + | ((in[12 + inpos] & 63) << (15 - 6)) + ) + out[25 + outpos - 1]; + out[26 + outpos] = (((in[12 + inpos] >>> 6) & 32767) + ) + out[26 + outpos - 1]; + out[27 + outpos] = ((in[12 + inpos] >>> 21) + | ((in[13 + inpos] & 15) << (15 - 4)) + ) + out[27 + outpos - 1]; + out[28 + outpos] = (((in[13 + inpos] >>> 4) & 32767) + ) + out[28 + outpos - 1]; + out[29 + outpos] = ((in[13 + inpos] >>> 19) + | ((in[14 + inpos] & 3) << (15 - 2)) + ) + out[29 + outpos - 1]; + out[30 + outpos] = (((in[14 + inpos] >>> 2) & 32767) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[14 + inpos] >>> 17) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack16(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 65535) + ) + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 16) + ) + out[1 + outpos - 1]; + out[2 + outpos] = (((in[1 + inpos] >>> 0) & 65535) + ) + out[2 + outpos - 1]; + out[3 + outpos] = ((in[1 + inpos] >>> 16) + ) + out[3 + outpos - 1]; + out[4 + outpos] = (((in[2 + inpos] >>> 0) & 65535) + ) + out[4 + outpos - 1]; + out[5 + outpos] = ((in[2 + inpos] >>> 16) + ) + out[5 + outpos - 1]; + out[6 + outpos] = (((in[3 + inpos] >>> 0) & 65535) + ) + out[6 + outpos - 1]; + out[7 + outpos] = ((in[3 + inpos] >>> 16) + ) + out[7 + outpos - 1]; + out[8 + outpos] = (((in[4 + inpos] >>> 0) & 65535) + ) + out[8 + outpos - 1]; + out[9 + outpos] = ((in[4 + inpos] >>> 16) + ) + out[9 + outpos - 1]; + out[10 + outpos] = (((in[5 + inpos] >>> 0) & 65535) + ) + out[10 + outpos - 1]; + out[11 + outpos] = ((in[5 + inpos] >>> 16) + ) + out[11 + outpos - 1]; + out[12 + outpos] = (((in[6 + inpos] >>> 0) & 65535) + ) + out[12 + outpos - 1]; + out[13 + outpos] = ((in[6 + inpos] >>> 16) + ) + out[13 + outpos - 1]; + out[14 + outpos] = (((in[7 + inpos] >>> 0) & 65535) + ) + out[14 + outpos - 1]; + out[15 + outpos] = ((in[7 + inpos] >>> 16) + ) + out[15 + outpos - 1]; + out[16 + outpos] = (((in[8 + inpos] >>> 0) & 65535) + ) + out[16 + outpos - 1]; + out[17 + outpos] = ((in[8 + inpos] >>> 16) + ) + out[17 + outpos - 1]; + out[18 + outpos] = (((in[9 + inpos] >>> 0) & 65535) + ) + out[18 + outpos - 1]; + out[19 + outpos] = ((in[9 + inpos] >>> 16) + ) + out[19 + outpos - 1]; + out[20 + outpos] = (((in[10 + inpos] >>> 0) & 65535) + ) + out[20 + outpos - 1]; + out[21 + outpos] = ((in[10 + inpos] >>> 16) + ) + out[21 + outpos - 1]; + out[22 + outpos] = (((in[11 + inpos] >>> 0) & 65535) + ) + out[22 + outpos - 1]; + out[23 + outpos] = ((in[11 + inpos] >>> 16) + ) + out[23 + outpos - 1]; + out[24 + outpos] = (((in[12 + inpos] >>> 0) & 65535) + ) + out[24 + outpos - 1]; + out[25 + outpos] = ((in[12 + inpos] >>> 16) + ) + out[25 + outpos - 1]; + out[26 + outpos] = (((in[13 + inpos] >>> 0) & 65535) + ) + out[26 + outpos - 1]; + out[27 + outpos] = ((in[13 + inpos] >>> 16) + ) + out[27 + outpos - 1]; + out[28 + outpos] = (((in[14 + inpos] >>> 0) & 65535) + ) + out[28 + outpos - 1]; + out[29 + outpos] = ((in[14 + inpos] >>> 16) + ) + out[29 + outpos - 1]; + out[30 + outpos] = (((in[15 + inpos] >>> 0) & 65535) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[15 + inpos] >>> 16) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack17(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 131071) + ) + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 17) + | ((in[1 + inpos] & 3) << (17 - 2)) + ) + out[1 + outpos - 1]; + out[2 + outpos] = (((in[1 + inpos] >>> 2) & 131071) + ) + out[2 + outpos - 1]; + out[3 + outpos] = ((in[1 + inpos] >>> 19) + | ((in[2 + inpos] & 15) << (17 - 4)) + ) + out[3 + outpos - 1]; + out[4 + outpos] = (((in[2 + inpos] >>> 4) & 131071) + ) + out[4 + outpos - 1]; + out[5 + outpos] = ((in[2 + inpos] >>> 21) + | ((in[3 + inpos] & 63) << (17 - 6)) + ) + out[5 + outpos - 1]; + out[6 + outpos] = (((in[3 + inpos] >>> 6) & 131071) + ) + out[6 + outpos - 1]; + out[7 + outpos] = ((in[3 + inpos] >>> 23) + | ((in[4 + inpos] & 255) << (17 - 8)) + ) + out[7 + outpos - 1]; + out[8 + outpos] = (((in[4 + inpos] >>> 8) & 131071) + ) + out[8 + outpos - 1]; + out[9 + outpos] = ((in[4 + inpos] >>> 25) + | ((in[5 + inpos] & 1023) << (17 - 10)) + ) + out[9 + outpos - 1]; + out[10 + outpos] = (((in[5 + inpos] >>> 10) & 131071) + ) + out[10 + outpos - 1]; + out[11 + outpos] = ((in[5 + inpos] >>> 27) + | ((in[6 + inpos] & 4095) << (17 - 12)) + ) + out[11 + outpos - 1]; + out[12 + outpos] = (((in[6 + inpos] >>> 12) & 131071) + ) + out[12 + outpos - 1]; + out[13 + outpos] = ((in[6 + inpos] >>> 29) + | ((in[7 + inpos] & 16383) << (17 - 14)) + ) + out[13 + outpos - 1]; + out[14 + outpos] = (((in[7 + inpos] >>> 14) & 131071) + ) + out[14 + outpos - 1]; + out[15 + outpos] = ((in[7 + inpos] >>> 31) + | ((in[8 + inpos] & 65535) << (17 - 16)) + ) + out[15 + outpos - 1]; + out[16 + outpos] = ((in[8 + inpos] >>> 16) + | ((in[9 + inpos] & 1) << (17 - 1)) + ) + out[16 + outpos - 1]; + out[17 + outpos] = (((in[9 + inpos] >>> 1) & 131071) + ) + out[17 + outpos - 1]; + out[18 + outpos] = ((in[9 + inpos] >>> 18) + | ((in[10 + inpos] & 7) << (17 - 3)) + ) + out[18 + outpos - 1]; + out[19 + outpos] = (((in[10 + inpos] >>> 3) & 131071) + ) + out[19 + outpos - 1]; + out[20 + outpos] = ((in[10 + inpos] >>> 20) + | ((in[11 + inpos] & 31) << (17 - 5)) + ) + out[20 + outpos - 1]; + out[21 + outpos] = (((in[11 + inpos] >>> 5) & 131071) + ) + out[21 + outpos - 1]; + out[22 + outpos] = ((in[11 + inpos] >>> 22) + | ((in[12 + inpos] & 127) << (17 - 7)) + ) + out[22 + outpos - 1]; + out[23 + outpos] = (((in[12 + inpos] >>> 7) & 131071) + ) + out[23 + outpos - 1]; + out[24 + outpos] = ((in[12 + inpos] >>> 24) + | ((in[13 + inpos] & 511) << (17 - 9)) + ) + out[24 + outpos - 1]; + out[25 + outpos] = (((in[13 + inpos] >>> 9) & 131071) + ) + out[25 + outpos - 1]; + out[26 + outpos] = ((in[13 + inpos] >>> 26) + | ((in[14 + inpos] & 2047) << (17 - 11)) + ) + out[26 + outpos - 1]; + out[27 + outpos] = (((in[14 + inpos] >>> 11) & 131071) + ) + out[27 + outpos - 1]; + out[28 + outpos] = ((in[14 + inpos] >>> 28) + | ((in[15 + inpos] & 8191) << (17 - 13)) + ) + out[28 + outpos - 1]; + out[29 + outpos] = (((in[15 + inpos] >>> 13) & 131071) + ) + out[29 + outpos - 1]; + out[30 + outpos] = ((in[15 + inpos] >>> 30) + | ((in[16 + inpos] & 32767) << (17 - 15)) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[16 + inpos] >>> 15) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack18(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 262143) + ) + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 18) + | ((in[1 + inpos] & 15) << (18 - 4)) + ) + out[1 + outpos - 1]; + out[2 + outpos] = (((in[1 + inpos] >>> 4) & 262143) + ) + out[2 + outpos - 1]; + out[3 + outpos] = ((in[1 + inpos] >>> 22) + | ((in[2 + inpos] & 255) << (18 - 8)) + ) + out[3 + outpos - 1]; + out[4 + outpos] = (((in[2 + inpos] >>> 8) & 262143) + ) + out[4 + outpos - 1]; + out[5 + outpos] = ((in[2 + inpos] >>> 26) + | ((in[3 + inpos] & 4095) << (18 - 12)) + ) + out[5 + outpos - 1]; + out[6 + outpos] = (((in[3 + inpos] >>> 12) & 262143) + ) + out[6 + outpos - 1]; + out[7 + outpos] = ((in[3 + inpos] >>> 30) + | ((in[4 + inpos] & 65535) << (18 - 16)) + ) + out[7 + outpos - 1]; + out[8 + outpos] = ((in[4 + inpos] >>> 16) + | ((in[5 + inpos] & 3) << (18 - 2)) + ) + out[8 + outpos - 1]; + out[9 + outpos] = (((in[5 + inpos] >>> 2) & 262143) + ) + out[9 + outpos - 1]; + out[10 + outpos] = ((in[5 + inpos] >>> 20) + | ((in[6 + inpos] & 63) << (18 - 6)) + ) + out[10 + outpos - 1]; + out[11 + outpos] = (((in[6 + inpos] >>> 6) & 262143) + ) + out[11 + outpos - 1]; + out[12 + outpos] = ((in[6 + inpos] >>> 24) + | ((in[7 + inpos] & 1023) << (18 - 10)) + ) + out[12 + outpos - 1]; + out[13 + outpos] = (((in[7 + inpos] >>> 10) & 262143) + ) + out[13 + outpos - 1]; + out[14 + outpos] = ((in[7 + inpos] >>> 28) + | ((in[8 + inpos] & 16383) << (18 - 14)) + ) + out[14 + outpos - 1]; + out[15 + outpos] = ((in[8 + inpos] >>> 14) + ) + out[15 + outpos - 1]; + out[16 + outpos] = (((in[9 + inpos] >>> 0) & 262143) + ) + out[16 + outpos - 1]; + out[17 + outpos] = ((in[9 + inpos] >>> 18) + | ((in[10 + inpos] & 15) << (18 - 4)) + ) + out[17 + outpos - 1]; + out[18 + outpos] = (((in[10 + inpos] >>> 4) & 262143) + ) + out[18 + outpos - 1]; + out[19 + outpos] = ((in[10 + inpos] >>> 22) + | ((in[11 + inpos] & 255) << (18 - 8)) + ) + out[19 + outpos - 1]; + out[20 + outpos] = (((in[11 + inpos] >>> 8) & 262143) + ) + out[20 + outpos - 1]; + out[21 + outpos] = ((in[11 + inpos] >>> 26) + | ((in[12 + inpos] & 4095) << (18 - 12)) + ) + out[21 + outpos - 1]; + out[22 + outpos] = (((in[12 + inpos] >>> 12) & 262143) + ) + out[22 + outpos - 1]; + out[23 + outpos] = ((in[12 + inpos] >>> 30) + | ((in[13 + inpos] & 65535) << (18 - 16)) + ) + out[23 + outpos - 1]; + out[24 + outpos] = ((in[13 + inpos] >>> 16) + | ((in[14 + inpos] & 3) << (18 - 2)) + ) + out[24 + outpos - 1]; + out[25 + outpos] = (((in[14 + inpos] >>> 2) & 262143) + ) + out[25 + outpos - 1]; + out[26 + outpos] = ((in[14 + inpos] >>> 20) + | ((in[15 + inpos] & 63) << (18 - 6)) + ) + out[26 + outpos - 1]; + out[27 + outpos] = (((in[15 + inpos] >>> 6) & 262143) + ) + out[27 + outpos - 1]; + out[28 + outpos] = ((in[15 + inpos] >>> 24) + | ((in[16 + inpos] & 1023) << (18 - 10)) + ) + out[28 + outpos - 1]; + out[29 + outpos] = (((in[16 + inpos] >>> 10) & 262143) + ) + out[29 + outpos - 1]; + out[30 + outpos] = ((in[16 + inpos] >>> 28) + | ((in[17 + inpos] & 16383) << (18 - 14)) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[17 + inpos] >>> 14) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack19(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 524287) + ) + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 19) + | ((in[1 + inpos] & 63) << (19 - 6)) + ) + out[1 + outpos - 1]; + out[2 + outpos] = (((in[1 + inpos] >>> 6) & 524287) + ) + out[2 + outpos - 1]; + out[3 + outpos] = ((in[1 + inpos] >>> 25) + | ((in[2 + inpos] & 4095) << (19 - 12)) + ) + out[3 + outpos - 1]; + out[4 + outpos] = (((in[2 + inpos] >>> 12) & 524287) + ) + out[4 + outpos - 1]; + out[5 + outpos] = ((in[2 + inpos] >>> 31) + | ((in[3 + inpos] & 262143) << (19 - 18)) + ) + out[5 + outpos - 1]; + out[6 + outpos] = ((in[3 + inpos] >>> 18) + | ((in[4 + inpos] & 31) << (19 - 5)) + ) + out[6 + outpos - 1]; + out[7 + outpos] = (((in[4 + inpos] >>> 5) & 524287) + ) + out[7 + outpos - 1]; + out[8 + outpos] = ((in[4 + inpos] >>> 24) + | ((in[5 + inpos] & 2047) << (19 - 11)) + ) + out[8 + outpos - 1]; + out[9 + outpos] = (((in[5 + inpos] >>> 11) & 524287) + ) + out[9 + outpos - 1]; + out[10 + outpos] = ((in[5 + inpos] >>> 30) + | ((in[6 + inpos] & 131071) << (19 - 17)) + ) + out[10 + outpos - 1]; + out[11 + outpos] = ((in[6 + inpos] >>> 17) + | ((in[7 + inpos] & 15) << (19 - 4)) + ) + out[11 + outpos - 1]; + out[12 + outpos] = (((in[7 + inpos] >>> 4) & 524287) + ) + out[12 + outpos - 1]; + out[13 + outpos] = ((in[7 + inpos] >>> 23) + | ((in[8 + inpos] & 1023) << (19 - 10)) + ) + out[13 + outpos - 1]; + out[14 + outpos] = (((in[8 + inpos] >>> 10) & 524287) + ) + out[14 + outpos - 1]; + out[15 + outpos] = ((in[8 + inpos] >>> 29) + | ((in[9 + inpos] & 65535) << (19 - 16)) + ) + out[15 + outpos - 1]; + out[16 + outpos] = ((in[9 + inpos] >>> 16) + | ((in[10 + inpos] & 7) << (19 - 3)) + ) + out[16 + outpos - 1]; + out[17 + outpos] = (((in[10 + inpos] >>> 3) & 524287) + ) + out[17 + outpos - 1]; + out[18 + outpos] = ((in[10 + inpos] >>> 22) + | ((in[11 + inpos] & 511) << (19 - 9)) + ) + out[18 + outpos - 1]; + out[19 + outpos] = (((in[11 + inpos] >>> 9) & 524287) + ) + out[19 + outpos - 1]; + out[20 + outpos] = ((in[11 + inpos] >>> 28) + | ((in[12 + inpos] & 32767) << (19 - 15)) + ) + out[20 + outpos - 1]; + out[21 + outpos] = ((in[12 + inpos] >>> 15) + | ((in[13 + inpos] & 3) << (19 - 2)) + ) + out[21 + outpos - 1]; + out[22 + outpos] = (((in[13 + inpos] >>> 2) & 524287) + ) + out[22 + outpos - 1]; + out[23 + outpos] = ((in[13 + inpos] >>> 21) + | ((in[14 + inpos] & 255) << (19 - 8)) + ) + out[23 + outpos - 1]; + out[24 + outpos] = (((in[14 + inpos] >>> 8) & 524287) + ) + out[24 + outpos - 1]; + out[25 + outpos] = ((in[14 + inpos] >>> 27) + | ((in[15 + inpos] & 16383) << (19 - 14)) + ) + out[25 + outpos - 1]; + out[26 + outpos] = ((in[15 + inpos] >>> 14) + | ((in[16 + inpos] & 1) << (19 - 1)) + ) + out[26 + outpos - 1]; + out[27 + outpos] = (((in[16 + inpos] >>> 1) & 524287) + ) + out[27 + outpos - 1]; + out[28 + outpos] = ((in[16 + inpos] >>> 20) + | ((in[17 + inpos] & 127) << (19 - 7)) + ) + out[28 + outpos - 1]; + out[29 + outpos] = (((in[17 + inpos] >>> 7) & 524287) + ) + out[29 + outpos - 1]; + out[30 + outpos] = ((in[17 + inpos] >>> 26) + | ((in[18 + inpos] & 8191) << (19 - 13)) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[18 + inpos] >>> 13) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack20(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 1048575) + ) + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 20) + | ((in[1 + inpos] & 255) << (20 - 8)) + ) + out[1 + outpos - 1]; + out[2 + outpos] = (((in[1 + inpos] >>> 8) & 1048575) + ) + out[2 + outpos - 1]; + out[3 + outpos] = ((in[1 + inpos] >>> 28) + | ((in[2 + inpos] & 65535) << (20 - 16)) + ) + out[3 + outpos - 1]; + out[4 + outpos] = ((in[2 + inpos] >>> 16) + | ((in[3 + inpos] & 15) << (20 - 4)) + ) + out[4 + outpos - 1]; + out[5 + outpos] = (((in[3 + inpos] >>> 4) & 1048575) + ) + out[5 + outpos - 1]; + out[6 + outpos] = ((in[3 + inpos] >>> 24) + | ((in[4 + inpos] & 4095) << (20 - 12)) + ) + out[6 + outpos - 1]; + out[7 + outpos] = ((in[4 + inpos] >>> 12) + ) + out[7 + outpos - 1]; + out[8 + outpos] = (((in[5 + inpos] >>> 0) & 1048575) + ) + out[8 + outpos - 1]; + out[9 + outpos] = ((in[5 + inpos] >>> 20) + | ((in[6 + inpos] & 255) << (20 - 8)) + ) + out[9 + outpos - 1]; + out[10 + outpos] = (((in[6 + inpos] >>> 8) & 1048575) + ) + out[10 + outpos - 1]; + out[11 + outpos] = ((in[6 + inpos] >>> 28) + | ((in[7 + inpos] & 65535) << (20 - 16)) + ) + out[11 + outpos - 1]; + out[12 + outpos] = ((in[7 + inpos] >>> 16) + | ((in[8 + inpos] & 15) << (20 - 4)) + ) + out[12 + outpos - 1]; + out[13 + outpos] = (((in[8 + inpos] >>> 4) & 1048575) + ) + out[13 + outpos - 1]; + out[14 + outpos] = ((in[8 + inpos] >>> 24) + | ((in[9 + inpos] & 4095) << (20 - 12)) + ) + out[14 + outpos - 1]; + out[15 + outpos] = ((in[9 + inpos] >>> 12) + ) + out[15 + outpos - 1]; + out[16 + outpos] = (((in[10 + inpos] >>> 0) & 1048575) + ) + out[16 + outpos - 1]; + out[17 + outpos] = ((in[10 + inpos] >>> 20) + | ((in[11 + inpos] & 255) << (20 - 8)) + ) + out[17 + outpos - 1]; + out[18 + outpos] = (((in[11 + inpos] >>> 8) & 1048575) + ) + out[18 + outpos - 1]; + out[19 + outpos] = ((in[11 + inpos] >>> 28) + | ((in[12 + inpos] & 65535) << (20 - 16)) + ) + out[19 + outpos - 1]; + out[20 + outpos] = ((in[12 + inpos] >>> 16) + | ((in[13 + inpos] & 15) << (20 - 4)) + ) + out[20 + outpos - 1]; + out[21 + outpos] = (((in[13 + inpos] >>> 4) & 1048575) + ) + out[21 + outpos - 1]; + out[22 + outpos] = ((in[13 + inpos] >>> 24) + | ((in[14 + inpos] & 4095) << (20 - 12)) + ) + out[22 + outpos - 1]; + out[23 + outpos] = ((in[14 + inpos] >>> 12) + ) + out[23 + outpos - 1]; + out[24 + outpos] = (((in[15 + inpos] >>> 0) & 1048575) + ) + out[24 + outpos - 1]; + out[25 + outpos] = ((in[15 + inpos] >>> 20) + | ((in[16 + inpos] & 255) << (20 - 8)) + ) + out[25 + outpos - 1]; + out[26 + outpos] = (((in[16 + inpos] >>> 8) & 1048575) + ) + out[26 + outpos - 1]; + out[27 + outpos] = ((in[16 + inpos] >>> 28) + | ((in[17 + inpos] & 65535) << (20 - 16)) + ) + out[27 + outpos - 1]; + out[28 + outpos] = ((in[17 + inpos] >>> 16) + | ((in[18 + inpos] & 15) << (20 - 4)) + ) + out[28 + outpos - 1]; + out[29 + outpos] = (((in[18 + inpos] >>> 4) & 1048575) + ) + out[29 + outpos - 1]; + out[30 + outpos] = ((in[18 + inpos] >>> 24) + | ((in[19 + inpos] & 4095) << (20 - 12)) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[19 + inpos] >>> 12) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack21(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 2097151) + ) + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 21) + | ((in[1 + inpos] & 1023) << (21 - 10)) + ) + out[1 + outpos - 1]; + out[2 + outpos] = (((in[1 + inpos] >>> 10) & 2097151) + ) + out[2 + outpos - 1]; + out[3 + outpos] = ((in[1 + inpos] >>> 31) + | ((in[2 + inpos] & 1048575) << (21 - 20)) + ) + out[3 + outpos - 1]; + out[4 + outpos] = ((in[2 + inpos] >>> 20) + | ((in[3 + inpos] & 511) << (21 - 9)) + ) + out[4 + outpos - 1]; + out[5 + outpos] = (((in[3 + inpos] >>> 9) & 2097151) + ) + out[5 + outpos - 1]; + out[6 + outpos] = ((in[3 + inpos] >>> 30) + | ((in[4 + inpos] & 524287) << (21 - 19)) + ) + out[6 + outpos - 1]; + out[7 + outpos] = ((in[4 + inpos] >>> 19) + | ((in[5 + inpos] & 255) << (21 - 8)) + ) + out[7 + outpos - 1]; + out[8 + outpos] = (((in[5 + inpos] >>> 8) & 2097151) + ) + out[8 + outpos - 1]; + out[9 + outpos] = ((in[5 + inpos] >>> 29) + | ((in[6 + inpos] & 262143) << (21 - 18)) + ) + out[9 + outpos - 1]; + out[10 + outpos] = ((in[6 + inpos] >>> 18) + | ((in[7 + inpos] & 127) << (21 - 7)) + ) + out[10 + outpos - 1]; + out[11 + outpos] = (((in[7 + inpos] >>> 7) & 2097151) + ) + out[11 + outpos - 1]; + out[12 + outpos] = ((in[7 + inpos] >>> 28) + | ((in[8 + inpos] & 131071) << (21 - 17)) + ) + out[12 + outpos - 1]; + out[13 + outpos] = ((in[8 + inpos] >>> 17) + | ((in[9 + inpos] & 63) << (21 - 6)) + ) + out[13 + outpos - 1]; + out[14 + outpos] = (((in[9 + inpos] >>> 6) & 2097151) + ) + out[14 + outpos - 1]; + out[15 + outpos] = ((in[9 + inpos] >>> 27) + | ((in[10 + inpos] & 65535) << (21 - 16)) + ) + out[15 + outpos - 1]; + out[16 + outpos] = ((in[10 + inpos] >>> 16) + | ((in[11 + inpos] & 31) << (21 - 5)) + ) + out[16 + outpos - 1]; + out[17 + outpos] = (((in[11 + inpos] >>> 5) & 2097151) + ) + out[17 + outpos - 1]; + out[18 + outpos] = ((in[11 + inpos] >>> 26) + | ((in[12 + inpos] & 32767) << (21 - 15)) + ) + out[18 + outpos - 1]; + out[19 + outpos] = ((in[12 + inpos] >>> 15) + | ((in[13 + inpos] & 15) << (21 - 4)) + ) + out[19 + outpos - 1]; + out[20 + outpos] = (((in[13 + inpos] >>> 4) & 2097151) + ) + out[20 + outpos - 1]; + out[21 + outpos] = ((in[13 + inpos] >>> 25) + | ((in[14 + inpos] & 16383) << (21 - 14)) + ) + out[21 + outpos - 1]; + out[22 + outpos] = ((in[14 + inpos] >>> 14) + | ((in[15 + inpos] & 7) << (21 - 3)) + ) + out[22 + outpos - 1]; + out[23 + outpos] = (((in[15 + inpos] >>> 3) & 2097151) + ) + out[23 + outpos - 1]; + out[24 + outpos] = ((in[15 + inpos] >>> 24) + | ((in[16 + inpos] & 8191) << (21 - 13)) + ) + out[24 + outpos - 1]; + out[25 + outpos] = ((in[16 + inpos] >>> 13) + | ((in[17 + inpos] & 3) << (21 - 2)) + ) + out[25 + outpos - 1]; + out[26 + outpos] = (((in[17 + inpos] >>> 2) & 2097151) + ) + out[26 + outpos - 1]; + out[27 + outpos] = ((in[17 + inpos] >>> 23) + | ((in[18 + inpos] & 4095) << (21 - 12)) + ) + out[27 + outpos - 1]; + out[28 + outpos] = ((in[18 + inpos] >>> 12) + | ((in[19 + inpos] & 1) << (21 - 1)) + ) + out[28 + outpos - 1]; + out[29 + outpos] = (((in[19 + inpos] >>> 1) & 2097151) + ) + out[29 + outpos - 1]; + out[30 + outpos] = ((in[19 + inpos] >>> 22) + | ((in[20 + inpos] & 2047) << (21 - 11)) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[20 + inpos] >>> 11) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack22(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 4194303) + ) + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 22) + | ((in[1 + inpos] & 4095) << (22 - 12)) + ) + out[1 + outpos - 1]; + out[2 + outpos] = ((in[1 + inpos] >>> 12) + | ((in[2 + inpos] & 3) << (22 - 2)) + ) + out[2 + outpos - 1]; + out[3 + outpos] = (((in[2 + inpos] >>> 2) & 4194303) + ) + out[3 + outpos - 1]; + out[4 + outpos] = ((in[2 + inpos] >>> 24) + | ((in[3 + inpos] & 16383) << (22 - 14)) + ) + out[4 + outpos - 1]; + out[5 + outpos] = ((in[3 + inpos] >>> 14) + | ((in[4 + inpos] & 15) << (22 - 4)) + ) + out[5 + outpos - 1]; + out[6 + outpos] = (((in[4 + inpos] >>> 4) & 4194303) + ) + out[6 + outpos - 1]; + out[7 + outpos] = ((in[4 + inpos] >>> 26) + | ((in[5 + inpos] & 65535) << (22 - 16)) + ) + out[7 + outpos - 1]; + out[8 + outpos] = ((in[5 + inpos] >>> 16) + | ((in[6 + inpos] & 63) << (22 - 6)) + ) + out[8 + outpos - 1]; + out[9 + outpos] = (((in[6 + inpos] >>> 6) & 4194303) + ) + out[9 + outpos - 1]; + out[10 + outpos] = ((in[6 + inpos] >>> 28) + | ((in[7 + inpos] & 262143) << (22 - 18)) + ) + out[10 + outpos - 1]; + out[11 + outpos] = ((in[7 + inpos] >>> 18) + | ((in[8 + inpos] & 255) << (22 - 8)) + ) + out[11 + outpos - 1]; + out[12 + outpos] = (((in[8 + inpos] >>> 8) & 4194303) + ) + out[12 + outpos - 1]; + out[13 + outpos] = ((in[8 + inpos] >>> 30) + | ((in[9 + inpos] & 1048575) << (22 - 20)) + ) + out[13 + outpos - 1]; + out[14 + outpos] = ((in[9 + inpos] >>> 20) + | ((in[10 + inpos] & 1023) << (22 - 10)) + ) + out[14 + outpos - 1]; + out[15 + outpos] = ((in[10 + inpos] >>> 10) + ) + out[15 + outpos - 1]; + out[16 + outpos] = (((in[11 + inpos] >>> 0) & 4194303) + ) + out[16 + outpos - 1]; + out[17 + outpos] = ((in[11 + inpos] >>> 22) + | ((in[12 + inpos] & 4095) << (22 - 12)) + ) + out[17 + outpos - 1]; + out[18 + outpos] = ((in[12 + inpos] >>> 12) + | ((in[13 + inpos] & 3) << (22 - 2)) + ) + out[18 + outpos - 1]; + out[19 + outpos] = (((in[13 + inpos] >>> 2) & 4194303) + ) + out[19 + outpos - 1]; + out[20 + outpos] = ((in[13 + inpos] >>> 24) + | ((in[14 + inpos] & 16383) << (22 - 14)) + ) + out[20 + outpos - 1]; + out[21 + outpos] = ((in[14 + inpos] >>> 14) + | ((in[15 + inpos] & 15) << (22 - 4)) + ) + out[21 + outpos - 1]; + out[22 + outpos] = (((in[15 + inpos] >>> 4) & 4194303) + ) + out[22 + outpos - 1]; + out[23 + outpos] = ((in[15 + inpos] >>> 26) + | ((in[16 + inpos] & 65535) << (22 - 16)) + ) + out[23 + outpos - 1]; + out[24 + outpos] = ((in[16 + inpos] >>> 16) + | ((in[17 + inpos] & 63) << (22 - 6)) + ) + out[24 + outpos - 1]; + out[25 + outpos] = (((in[17 + inpos] >>> 6) & 4194303) + ) + out[25 + outpos - 1]; + out[26 + outpos] = ((in[17 + inpos] >>> 28) + | ((in[18 + inpos] & 262143) << (22 - 18)) + ) + out[26 + outpos - 1]; + out[27 + outpos] = ((in[18 + inpos] >>> 18) + | ((in[19 + inpos] & 255) << (22 - 8)) + ) + out[27 + outpos - 1]; + out[28 + outpos] = (((in[19 + inpos] >>> 8) & 4194303) + ) + out[28 + outpos - 1]; + out[29 + outpos] = ((in[19 + inpos] >>> 30) + | ((in[20 + inpos] & 1048575) << (22 - 20)) + ) + out[29 + outpos - 1]; + out[30 + outpos] = ((in[20 + inpos] >>> 20) + | ((in[21 + inpos] & 1023) << (22 - 10)) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[21 + inpos] >>> 10) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack23(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 8388607) + ) + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 23) + | ((in[1 + inpos] & 16383) << (23 - 14)) + ) + out[1 + outpos - 1]; + out[2 + outpos] = ((in[1 + inpos] >>> 14) + | ((in[2 + inpos] & 31) << (23 - 5)) + ) + out[2 + outpos - 1]; + out[3 + outpos] = (((in[2 + inpos] >>> 5) & 8388607) + ) + out[3 + outpos - 1]; + out[4 + outpos] = ((in[2 + inpos] >>> 28) + | ((in[3 + inpos] & 524287) << (23 - 19)) + ) + out[4 + outpos - 1]; + out[5 + outpos] = ((in[3 + inpos] >>> 19) + | ((in[4 + inpos] & 1023) << (23 - 10)) + ) + out[5 + outpos - 1]; + out[6 + outpos] = ((in[4 + inpos] >>> 10) + | ((in[5 + inpos] & 1) << (23 - 1)) + ) + out[6 + outpos - 1]; + out[7 + outpos] = (((in[5 + inpos] >>> 1) & 8388607) + ) + out[7 + outpos - 1]; + out[8 + outpos] = ((in[5 + inpos] >>> 24) + | ((in[6 + inpos] & 32767) << (23 - 15)) + ) + out[8 + outpos - 1]; + out[9 + outpos] = ((in[6 + inpos] >>> 15) + | ((in[7 + inpos] & 63) << (23 - 6)) + ) + out[9 + outpos - 1]; + out[10 + outpos] = (((in[7 + inpos] >>> 6) & 8388607) + ) + out[10 + outpos - 1]; + out[11 + outpos] = ((in[7 + inpos] >>> 29) + | ((in[8 + inpos] & 1048575) << (23 - 20)) + ) + out[11 + outpos - 1]; + out[12 + outpos] = ((in[8 + inpos] >>> 20) + | ((in[9 + inpos] & 2047) << (23 - 11)) + ) + out[12 + outpos - 1]; + out[13 + outpos] = ((in[9 + inpos] >>> 11) + | ((in[10 + inpos] & 3) << (23 - 2)) + ) + out[13 + outpos - 1]; + out[14 + outpos] = (((in[10 + inpos] >>> 2) & 8388607) + ) + out[14 + outpos - 1]; + out[15 + outpos] = ((in[10 + inpos] >>> 25) + | ((in[11 + inpos] & 65535) << (23 - 16)) + ) + out[15 + outpos - 1]; + out[16 + outpos] = ((in[11 + inpos] >>> 16) + | ((in[12 + inpos] & 127) << (23 - 7)) + ) + out[16 + outpos - 1]; + out[17 + outpos] = (((in[12 + inpos] >>> 7) & 8388607) + ) + out[17 + outpos - 1]; + out[18 + outpos] = ((in[12 + inpos] >>> 30) + | ((in[13 + inpos] & 2097151) << (23 - 21)) + ) + out[18 + outpos - 1]; + out[19 + outpos] = ((in[13 + inpos] >>> 21) + | ((in[14 + inpos] & 4095) << (23 - 12)) + ) + out[19 + outpos - 1]; + out[20 + outpos] = ((in[14 + inpos] >>> 12) + | ((in[15 + inpos] & 7) << (23 - 3)) + ) + out[20 + outpos - 1]; + out[21 + outpos] = (((in[15 + inpos] >>> 3) & 8388607) + ) + out[21 + outpos - 1]; + out[22 + outpos] = ((in[15 + inpos] >>> 26) + | ((in[16 + inpos] & 131071) << (23 - 17)) + ) + out[22 + outpos - 1]; + out[23 + outpos] = ((in[16 + inpos] >>> 17) + | ((in[17 + inpos] & 255) << (23 - 8)) + ) + out[23 + outpos - 1]; + out[24 + outpos] = (((in[17 + inpos] >>> 8) & 8388607) + ) + out[24 + outpos - 1]; + out[25 + outpos] = ((in[17 + inpos] >>> 31) + | ((in[18 + inpos] & 4194303) << (23 - 22)) + ) + out[25 + outpos - 1]; + out[26 + outpos] = ((in[18 + inpos] >>> 22) + | ((in[19 + inpos] & 8191) << (23 - 13)) + ) + out[26 + outpos - 1]; + out[27 + outpos] = ((in[19 + inpos] >>> 13) + | ((in[20 + inpos] & 15) << (23 - 4)) + ) + out[27 + outpos - 1]; + out[28 + outpos] = (((in[20 + inpos] >>> 4) & 8388607) + ) + out[28 + outpos - 1]; + out[29 + outpos] = ((in[20 + inpos] >>> 27) + | ((in[21 + inpos] & 262143) << (23 - 18)) + ) + out[29 + outpos - 1]; + out[30 + outpos] = ((in[21 + inpos] >>> 18) + | ((in[22 + inpos] & 511) << (23 - 9)) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[22 + inpos] >>> 9) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack24(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 16777215) + ) + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 24) + | ((in[1 + inpos] & 65535) << (24 - 16)) + ) + out[1 + outpos - 1]; + out[2 + outpos] = ((in[1 + inpos] >>> 16) + | ((in[2 + inpos] & 255) << (24 - 8)) + ) + out[2 + outpos - 1]; + out[3 + outpos] = ((in[2 + inpos] >>> 8) + ) + out[3 + outpos - 1]; + out[4 + outpos] = (((in[3 + inpos] >>> 0) & 16777215) + ) + out[4 + outpos - 1]; + out[5 + outpos] = ((in[3 + inpos] >>> 24) + | ((in[4 + inpos] & 65535) << (24 - 16)) + ) + out[5 + outpos - 1]; + out[6 + outpos] = ((in[4 + inpos] >>> 16) + | ((in[5 + inpos] & 255) << (24 - 8)) + ) + out[6 + outpos - 1]; + out[7 + outpos] = ((in[5 + inpos] >>> 8) + ) + out[7 + outpos - 1]; + out[8 + outpos] = (((in[6 + inpos] >>> 0) & 16777215) + ) + out[8 + outpos - 1]; + out[9 + outpos] = ((in[6 + inpos] >>> 24) + | ((in[7 + inpos] & 65535) << (24 - 16)) + ) + out[9 + outpos - 1]; + out[10 + outpos] = ((in[7 + inpos] >>> 16) + | ((in[8 + inpos] & 255) << (24 - 8)) + ) + out[10 + outpos - 1]; + out[11 + outpos] = ((in[8 + inpos] >>> 8) + ) + out[11 + outpos - 1]; + out[12 + outpos] = (((in[9 + inpos] >>> 0) & 16777215) + ) + out[12 + outpos - 1]; + out[13 + outpos] = ((in[9 + inpos] >>> 24) + | ((in[10 + inpos] & 65535) << (24 - 16)) + ) + out[13 + outpos - 1]; + out[14 + outpos] = ((in[10 + inpos] >>> 16) + | ((in[11 + inpos] & 255) << (24 - 8)) + ) + out[14 + outpos - 1]; + out[15 + outpos] = ((in[11 + inpos] >>> 8) + ) + out[15 + outpos - 1]; + out[16 + outpos] = (((in[12 + inpos] >>> 0) & 16777215) + ) + out[16 + outpos - 1]; + out[17 + outpos] = ((in[12 + inpos] >>> 24) + | ((in[13 + inpos] & 65535) << (24 - 16)) + ) + out[17 + outpos - 1]; + out[18 + outpos] = ((in[13 + inpos] >>> 16) + | ((in[14 + inpos] & 255) << (24 - 8)) + ) + out[18 + outpos - 1]; + out[19 + outpos] = ((in[14 + inpos] >>> 8) + ) + out[19 + outpos - 1]; + out[20 + outpos] = (((in[15 + inpos] >>> 0) & 16777215) + ) + out[20 + outpos - 1]; + out[21 + outpos] = ((in[15 + inpos] >>> 24) + | ((in[16 + inpos] & 65535) << (24 - 16)) + ) + out[21 + outpos - 1]; + out[22 + outpos] = ((in[16 + inpos] >>> 16) + | ((in[17 + inpos] & 255) << (24 - 8)) + ) + out[22 + outpos - 1]; + out[23 + outpos] = ((in[17 + inpos] >>> 8) + ) + out[23 + outpos - 1]; + out[24 + outpos] = (((in[18 + inpos] >>> 0) & 16777215) + ) + out[24 + outpos - 1]; + out[25 + outpos] = ((in[18 + inpos] >>> 24) + | ((in[19 + inpos] & 65535) << (24 - 16)) + ) + out[25 + outpos - 1]; + out[26 + outpos] = ((in[19 + inpos] >>> 16) + | ((in[20 + inpos] & 255) << (24 - 8)) + ) + out[26 + outpos - 1]; + out[27 + outpos] = ((in[20 + inpos] >>> 8) + ) + out[27 + outpos - 1]; + out[28 + outpos] = (((in[21 + inpos] >>> 0) & 16777215) + ) + out[28 + outpos - 1]; + out[29 + outpos] = ((in[21 + inpos] >>> 24) + | ((in[22 + inpos] & 65535) << (24 - 16)) + ) + out[29 + outpos - 1]; + out[30 + outpos] = ((in[22 + inpos] >>> 16) + | ((in[23 + inpos] & 255) << (24 - 8)) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[23 + inpos] >>> 8) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack25(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 33554431) + ) + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 25) + | ((in[1 + inpos] & 262143) << (25 - 18)) + ) + out[1 + outpos - 1]; + out[2 + outpos] = ((in[1 + inpos] >>> 18) + | ((in[2 + inpos] & 2047) << (25 - 11)) + ) + out[2 + outpos - 1]; + out[3 + outpos] = ((in[2 + inpos] >>> 11) + | ((in[3 + inpos] & 15) << (25 - 4)) + ) + out[3 + outpos - 1]; + out[4 + outpos] = (((in[3 + inpos] >>> 4) & 33554431) + ) + out[4 + outpos - 1]; + out[5 + outpos] = ((in[3 + inpos] >>> 29) + | ((in[4 + inpos] & 4194303) << (25 - 22)) + ) + out[5 + outpos - 1]; + out[6 + outpos] = ((in[4 + inpos] >>> 22) + | ((in[5 + inpos] & 32767) << (25 - 15)) + ) + out[6 + outpos - 1]; + out[7 + outpos] = ((in[5 + inpos] >>> 15) + | ((in[6 + inpos] & 255) << (25 - 8)) + ) + out[7 + outpos - 1]; + out[8 + outpos] = ((in[6 + inpos] >>> 8) + | ((in[7 + inpos] & 1) << (25 - 1)) + ) + out[8 + outpos - 1]; + out[9 + outpos] = (((in[7 + inpos] >>> 1) & 33554431) + ) + out[9 + outpos - 1]; + out[10 + outpos] = ((in[7 + inpos] >>> 26) + | ((in[8 + inpos] & 524287) << (25 - 19)) + ) + out[10 + outpos - 1]; + out[11 + outpos] = ((in[8 + inpos] >>> 19) + | ((in[9 + inpos] & 4095) << (25 - 12)) + ) + out[11 + outpos - 1]; + out[12 + outpos] = ((in[9 + inpos] >>> 12) + | ((in[10 + inpos] & 31) << (25 - 5)) + ) + out[12 + outpos - 1]; + out[13 + outpos] = (((in[10 + inpos] >>> 5) & 33554431) + ) + out[13 + outpos - 1]; + out[14 + outpos] = ((in[10 + inpos] >>> 30) + | ((in[11 + inpos] & 8388607) << (25 - 23)) + ) + out[14 + outpos - 1]; + out[15 + outpos] = ((in[11 + inpos] >>> 23) + | ((in[12 + inpos] & 65535) << (25 - 16)) + ) + out[15 + outpos - 1]; + out[16 + outpos] = ((in[12 + inpos] >>> 16) + | ((in[13 + inpos] & 511) << (25 - 9)) + ) + out[16 + outpos - 1]; + out[17 + outpos] = ((in[13 + inpos] >>> 9) + | ((in[14 + inpos] & 3) << (25 - 2)) + ) + out[17 + outpos - 1]; + out[18 + outpos] = (((in[14 + inpos] >>> 2) & 33554431) + ) + out[18 + outpos - 1]; + out[19 + outpos] = ((in[14 + inpos] >>> 27) + | ((in[15 + inpos] & 1048575) << (25 - 20)) + ) + out[19 + outpos - 1]; + out[20 + outpos] = ((in[15 + inpos] >>> 20) + | ((in[16 + inpos] & 8191) << (25 - 13)) + ) + out[20 + outpos - 1]; + out[21 + outpos] = ((in[16 + inpos] >>> 13) + | ((in[17 + inpos] & 63) << (25 - 6)) + ) + out[21 + outpos - 1]; + out[22 + outpos] = (((in[17 + inpos] >>> 6) & 33554431) + ) + out[22 + outpos - 1]; + out[23 + outpos] = ((in[17 + inpos] >>> 31) + | ((in[18 + inpos] & 16777215) << (25 - 24)) + ) + out[23 + outpos - 1]; + out[24 + outpos] = ((in[18 + inpos] >>> 24) + | ((in[19 + inpos] & 131071) << (25 - 17)) + ) + out[24 + outpos - 1]; + out[25 + outpos] = ((in[19 + inpos] >>> 17) + | ((in[20 + inpos] & 1023) << (25 - 10)) + ) + out[25 + outpos - 1]; + out[26 + outpos] = ((in[20 + inpos] >>> 10) + | ((in[21 + inpos] & 7) << (25 - 3)) + ) + out[26 + outpos - 1]; + out[27 + outpos] = (((in[21 + inpos] >>> 3) & 33554431) + ) + out[27 + outpos - 1]; + out[28 + outpos] = ((in[21 + inpos] >>> 28) + | ((in[22 + inpos] & 2097151) << (25 - 21)) + ) + out[28 + outpos - 1]; + out[29 + outpos] = ((in[22 + inpos] >>> 21) + | ((in[23 + inpos] & 16383) << (25 - 14)) + ) + out[29 + outpos - 1]; + out[30 + outpos] = ((in[23 + inpos] >>> 14) + | ((in[24 + inpos] & 127) << (25 - 7)) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[24 + inpos] >>> 7) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack26(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 67108863) + ) + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 26) + | ((in[1 + inpos] & 1048575) << (26 - 20)) + ) + out[1 + outpos - 1]; + out[2 + outpos] = ((in[1 + inpos] >>> 20) + | ((in[2 + inpos] & 16383) << (26 - 14)) + ) + out[2 + outpos - 1]; + out[3 + outpos] = ((in[2 + inpos] >>> 14) + | ((in[3 + inpos] & 255) << (26 - 8)) + ) + out[3 + outpos - 1]; + out[4 + outpos] = ((in[3 + inpos] >>> 8) + | ((in[4 + inpos] & 3) << (26 - 2)) + ) + out[4 + outpos - 1]; + out[5 + outpos] = (((in[4 + inpos] >>> 2) & 67108863) + ) + out[5 + outpos - 1]; + out[6 + outpos] = ((in[4 + inpos] >>> 28) + | ((in[5 + inpos] & 4194303) << (26 - 22)) + ) + out[6 + outpos - 1]; + out[7 + outpos] = ((in[5 + inpos] >>> 22) + | ((in[6 + inpos] & 65535) << (26 - 16)) + ) + out[7 + outpos - 1]; + out[8 + outpos] = ((in[6 + inpos] >>> 16) + | ((in[7 + inpos] & 1023) << (26 - 10)) + ) + out[8 + outpos - 1]; + out[9 + outpos] = ((in[7 + inpos] >>> 10) + | ((in[8 + inpos] & 15) << (26 - 4)) + ) + out[9 + outpos - 1]; + out[10 + outpos] = (((in[8 + inpos] >>> 4) & 67108863) + ) + out[10 + outpos - 1]; + out[11 + outpos] = ((in[8 + inpos] >>> 30) + | ((in[9 + inpos] & 16777215) << (26 - 24)) + ) + out[11 + outpos - 1]; + out[12 + outpos] = ((in[9 + inpos] >>> 24) + | ((in[10 + inpos] & 262143) << (26 - 18)) + ) + out[12 + outpos - 1]; + out[13 + outpos] = ((in[10 + inpos] >>> 18) + | ((in[11 + inpos] & 4095) << (26 - 12)) + ) + out[13 + outpos - 1]; + out[14 + outpos] = ((in[11 + inpos] >>> 12) + | ((in[12 + inpos] & 63) << (26 - 6)) + ) + out[14 + outpos - 1]; + out[15 + outpos] = ((in[12 + inpos] >>> 6) + ) + out[15 + outpos - 1]; + out[16 + outpos] = (((in[13 + inpos] >>> 0) & 67108863) + ) + out[16 + outpos - 1]; + out[17 + outpos] = ((in[13 + inpos] >>> 26) + | ((in[14 + inpos] & 1048575) << (26 - 20)) + ) + out[17 + outpos - 1]; + out[18 + outpos] = ((in[14 + inpos] >>> 20) + | ((in[15 + inpos] & 16383) << (26 - 14)) + ) + out[18 + outpos - 1]; + out[19 + outpos] = ((in[15 + inpos] >>> 14) + | ((in[16 + inpos] & 255) << (26 - 8)) + ) + out[19 + outpos - 1]; + out[20 + outpos] = ((in[16 + inpos] >>> 8) + | ((in[17 + inpos] & 3) << (26 - 2)) + ) + out[20 + outpos - 1]; + out[21 + outpos] = (((in[17 + inpos] >>> 2) & 67108863) + ) + out[21 + outpos - 1]; + out[22 + outpos] = ((in[17 + inpos] >>> 28) + | ((in[18 + inpos] & 4194303) << (26 - 22)) + ) + out[22 + outpos - 1]; + out[23 + outpos] = ((in[18 + inpos] >>> 22) + | ((in[19 + inpos] & 65535) << (26 - 16)) + ) + out[23 + outpos - 1]; + out[24 + outpos] = ((in[19 + inpos] >>> 16) + | ((in[20 + inpos] & 1023) << (26 - 10)) + ) + out[24 + outpos - 1]; + out[25 + outpos] = ((in[20 + inpos] >>> 10) + | ((in[21 + inpos] & 15) << (26 - 4)) + ) + out[25 + outpos - 1]; + out[26 + outpos] = (((in[21 + inpos] >>> 4) & 67108863) + ) + out[26 + outpos - 1]; + out[27 + outpos] = ((in[21 + inpos] >>> 30) + | ((in[22 + inpos] & 16777215) << (26 - 24)) + ) + out[27 + outpos - 1]; + out[28 + outpos] = ((in[22 + inpos] >>> 24) + | ((in[23 + inpos] & 262143) << (26 - 18)) + ) + out[28 + outpos - 1]; + out[29 + outpos] = ((in[23 + inpos] >>> 18) + | ((in[24 + inpos] & 4095) << (26 - 12)) + ) + out[29 + outpos - 1]; + out[30 + outpos] = ((in[24 + inpos] >>> 12) + | ((in[25 + inpos] & 63) << (26 - 6)) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[25 + inpos] >>> 6) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack27(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 134217727) + ) + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 27) + | ((in[1 + inpos] & 4194303) << (27 - 22)) + ) + out[1 + outpos - 1]; + out[2 + outpos] = ((in[1 + inpos] >>> 22) + | ((in[2 + inpos] & 131071) << (27 - 17)) + ) + out[2 + outpos - 1]; + out[3 + outpos] = ((in[2 + inpos] >>> 17) + | ((in[3 + inpos] & 4095) << (27 - 12)) + ) + out[3 + outpos - 1]; + out[4 + outpos] = ((in[3 + inpos] >>> 12) + | ((in[4 + inpos] & 127) << (27 - 7)) + ) + out[4 + outpos - 1]; + out[5 + outpos] = ((in[4 + inpos] >>> 7) + | ((in[5 + inpos] & 3) << (27 - 2)) + ) + out[5 + outpos - 1]; + out[6 + outpos] = (((in[5 + inpos] >>> 2) & 134217727) + ) + out[6 + outpos - 1]; + out[7 + outpos] = ((in[5 + inpos] >>> 29) + | ((in[6 + inpos] & 16777215) << (27 - 24)) + ) + out[7 + outpos - 1]; + out[8 + outpos] = ((in[6 + inpos] >>> 24) + | ((in[7 + inpos] & 524287) << (27 - 19)) + ) + out[8 + outpos - 1]; + out[9 + outpos] = ((in[7 + inpos] >>> 19) + | ((in[8 + inpos] & 16383) << (27 - 14)) + ) + out[9 + outpos - 1]; + out[10 + outpos] = ((in[8 + inpos] >>> 14) + | ((in[9 + inpos] & 511) << (27 - 9)) + ) + out[10 + outpos - 1]; + out[11 + outpos] = ((in[9 + inpos] >>> 9) + | ((in[10 + inpos] & 15) << (27 - 4)) + ) + out[11 + outpos - 1]; + out[12 + outpos] = (((in[10 + inpos] >>> 4) & 134217727) + ) + out[12 + outpos - 1]; + out[13 + outpos] = ((in[10 + inpos] >>> 31) + | ((in[11 + inpos] & 67108863) << (27 - 26)) + ) + out[13 + outpos - 1]; + out[14 + outpos] = ((in[11 + inpos] >>> 26) + | ((in[12 + inpos] & 2097151) << (27 - 21)) + ) + out[14 + outpos - 1]; + out[15 + outpos] = ((in[12 + inpos] >>> 21) + | ((in[13 + inpos] & 65535) << (27 - 16)) + ) + out[15 + outpos - 1]; + out[16 + outpos] = ((in[13 + inpos] >>> 16) + | ((in[14 + inpos] & 2047) << (27 - 11)) + ) + out[16 + outpos - 1]; + out[17 + outpos] = ((in[14 + inpos] >>> 11) + | ((in[15 + inpos] & 63) << (27 - 6)) + ) + out[17 + outpos - 1]; + out[18 + outpos] = ((in[15 + inpos] >>> 6) + | ((in[16 + inpos] & 1) << (27 - 1)) + ) + out[18 + outpos - 1]; + out[19 + outpos] = (((in[16 + inpos] >>> 1) & 134217727) + ) + out[19 + outpos - 1]; + out[20 + outpos] = ((in[16 + inpos] >>> 28) + | ((in[17 + inpos] & 8388607) << (27 - 23)) + ) + out[20 + outpos - 1]; + out[21 + outpos] = ((in[17 + inpos] >>> 23) + | ((in[18 + inpos] & 262143) << (27 - 18)) + ) + out[21 + outpos - 1]; + out[22 + outpos] = ((in[18 + inpos] >>> 18) + | ((in[19 + inpos] & 8191) << (27 - 13)) + ) + out[22 + outpos - 1]; + out[23 + outpos] = ((in[19 + inpos] >>> 13) + | ((in[20 + inpos] & 255) << (27 - 8)) + ) + out[23 + outpos - 1]; + out[24 + outpos] = ((in[20 + inpos] >>> 8) + | ((in[21 + inpos] & 7) << (27 - 3)) + ) + out[24 + outpos - 1]; + out[25 + outpos] = (((in[21 + inpos] >>> 3) & 134217727) + ) + out[25 + outpos - 1]; + out[26 + outpos] = ((in[21 + inpos] >>> 30) + | ((in[22 + inpos] & 33554431) << (27 - 25)) + ) + out[26 + outpos - 1]; + out[27 + outpos] = ((in[22 + inpos] >>> 25) + | ((in[23 + inpos] & 1048575) << (27 - 20)) + ) + out[27 + outpos - 1]; + out[28 + outpos] = ((in[23 + inpos] >>> 20) + | ((in[24 + inpos] & 32767) << (27 - 15)) + ) + out[28 + outpos - 1]; + out[29 + outpos] = ((in[24 + inpos] >>> 15) + | ((in[25 + inpos] & 1023) << (27 - 10)) + ) + out[29 + outpos - 1]; + out[30 + outpos] = ((in[25 + inpos] >>> 10) + | ((in[26 + inpos] & 31) << (27 - 5)) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[26 + inpos] >>> 5) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack28(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 268435455) + ) + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 28) + | ((in[1 + inpos] & 16777215) << (28 - 24)) + ) + out[1 + outpos - 1]; + out[2 + outpos] = ((in[1 + inpos] >>> 24) + | ((in[2 + inpos] & 1048575) << (28 - 20)) + ) + out[2 + outpos - 1]; + out[3 + outpos] = ((in[2 + inpos] >>> 20) + | ((in[3 + inpos] & 65535) << (28 - 16)) + ) + out[3 + outpos - 1]; + out[4 + outpos] = ((in[3 + inpos] >>> 16) + | ((in[4 + inpos] & 4095) << (28 - 12)) + ) + out[4 + outpos - 1]; + out[5 + outpos] = ((in[4 + inpos] >>> 12) + | ((in[5 + inpos] & 255) << (28 - 8)) + ) + out[5 + outpos - 1]; + out[6 + outpos] = ((in[5 + inpos] >>> 8) + | ((in[6 + inpos] & 15) << (28 - 4)) + ) + out[6 + outpos - 1]; + out[7 + outpos] = ((in[6 + inpos] >>> 4) + ) + out[7 + outpos - 1]; + out[8 + outpos] = (((in[7 + inpos] >>> 0) & 268435455) + ) + out[8 + outpos - 1]; + out[9 + outpos] = ((in[7 + inpos] >>> 28) + | ((in[8 + inpos] & 16777215) << (28 - 24)) + ) + out[9 + outpos - 1]; + out[10 + outpos] = ((in[8 + inpos] >>> 24) + | ((in[9 + inpos] & 1048575) << (28 - 20)) + ) + out[10 + outpos - 1]; + out[11 + outpos] = ((in[9 + inpos] >>> 20) + | ((in[10 + inpos] & 65535) << (28 - 16)) + ) + out[11 + outpos - 1]; + out[12 + outpos] = ((in[10 + inpos] >>> 16) + | ((in[11 + inpos] & 4095) << (28 - 12)) + ) + out[12 + outpos - 1]; + out[13 + outpos] = ((in[11 + inpos] >>> 12) + | ((in[12 + inpos] & 255) << (28 - 8)) + ) + out[13 + outpos - 1]; + out[14 + outpos] = ((in[12 + inpos] >>> 8) + | ((in[13 + inpos] & 15) << (28 - 4)) + ) + out[14 + outpos - 1]; + out[15 + outpos] = ((in[13 + inpos] >>> 4) + ) + out[15 + outpos - 1]; + out[16 + outpos] = (((in[14 + inpos] >>> 0) & 268435455) + ) + out[16 + outpos - 1]; + out[17 + outpos] = ((in[14 + inpos] >>> 28) + | ((in[15 + inpos] & 16777215) << (28 - 24)) + ) + out[17 + outpos - 1]; + out[18 + outpos] = ((in[15 + inpos] >>> 24) + | ((in[16 + inpos] & 1048575) << (28 - 20)) + ) + out[18 + outpos - 1]; + out[19 + outpos] = ((in[16 + inpos] >>> 20) + | ((in[17 + inpos] & 65535) << (28 - 16)) + ) + out[19 + outpos - 1]; + out[20 + outpos] = ((in[17 + inpos] >>> 16) + | ((in[18 + inpos] & 4095) << (28 - 12)) + ) + out[20 + outpos - 1]; + out[21 + outpos] = ((in[18 + inpos] >>> 12) + | ((in[19 + inpos] & 255) << (28 - 8)) + ) + out[21 + outpos - 1]; + out[22 + outpos] = ((in[19 + inpos] >>> 8) + | ((in[20 + inpos] & 15) << (28 - 4)) + ) + out[22 + outpos - 1]; + out[23 + outpos] = ((in[20 + inpos] >>> 4) + ) + out[23 + outpos - 1]; + out[24 + outpos] = (((in[21 + inpos] >>> 0) & 268435455) + ) + out[24 + outpos - 1]; + out[25 + outpos] = ((in[21 + inpos] >>> 28) + | ((in[22 + inpos] & 16777215) << (28 - 24)) + ) + out[25 + outpos - 1]; + out[26 + outpos] = ((in[22 + inpos] >>> 24) + | ((in[23 + inpos] & 1048575) << (28 - 20)) + ) + out[26 + outpos - 1]; + out[27 + outpos] = ((in[23 + inpos] >>> 20) + | ((in[24 + inpos] & 65535) << (28 - 16)) + ) + out[27 + outpos - 1]; + out[28 + outpos] = ((in[24 + inpos] >>> 16) + | ((in[25 + inpos] & 4095) << (28 - 12)) + ) + out[28 + outpos - 1]; + out[29 + outpos] = ((in[25 + inpos] >>> 12) + | ((in[26 + inpos] & 255) << (28 - 8)) + ) + out[29 + outpos - 1]; + out[30 + outpos] = ((in[26 + inpos] >>> 8) + | ((in[27 + inpos] & 15) << (28 - 4)) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[27 + inpos] >>> 4) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack29(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 536870911) + ) + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 29) + | ((in[1 + inpos] & 67108863) << (29 - 26)) + ) + out[1 + outpos - 1]; + out[2 + outpos] = ((in[1 + inpos] >>> 26) + | ((in[2 + inpos] & 8388607) << (29 - 23)) + ) + out[2 + outpos - 1]; + out[3 + outpos] = ((in[2 + inpos] >>> 23) + | ((in[3 + inpos] & 1048575) << (29 - 20)) + ) + out[3 + outpos - 1]; + out[4 + outpos] = ((in[3 + inpos] >>> 20) + | ((in[4 + inpos] & 131071) << (29 - 17)) + ) + out[4 + outpos - 1]; + out[5 + outpos] = ((in[4 + inpos] >>> 17) + | ((in[5 + inpos] & 16383) << (29 - 14)) + ) + out[5 + outpos - 1]; + out[6 + outpos] = ((in[5 + inpos] >>> 14) + | ((in[6 + inpos] & 2047) << (29 - 11)) + ) + out[6 + outpos - 1]; + out[7 + outpos] = ((in[6 + inpos] >>> 11) + | ((in[7 + inpos] & 255) << (29 - 8)) + ) + out[7 + outpos - 1]; + out[8 + outpos] = ((in[7 + inpos] >>> 8) + | ((in[8 + inpos] & 31) << (29 - 5)) + ) + out[8 + outpos - 1]; + out[9 + outpos] = ((in[8 + inpos] >>> 5) + | ((in[9 + inpos] & 3) << (29 - 2)) + ) + out[9 + outpos - 1]; + out[10 + outpos] = (((in[9 + inpos] >>> 2) & 536870911) + ) + out[10 + outpos - 1]; + out[11 + outpos] = ((in[9 + inpos] >>> 31) + | ((in[10 + inpos] & 268435455) << (29 - 28)) + ) + out[11 + outpos - 1]; + out[12 + outpos] = ((in[10 + inpos] >>> 28) + | ((in[11 + inpos] & 33554431) << (29 - 25)) + ) + out[12 + outpos - 1]; + out[13 + outpos] = ((in[11 + inpos] >>> 25) + | ((in[12 + inpos] & 4194303) << (29 - 22)) + ) + out[13 + outpos - 1]; + out[14 + outpos] = ((in[12 + inpos] >>> 22) + | ((in[13 + inpos] & 524287) << (29 - 19)) + ) + out[14 + outpos - 1]; + out[15 + outpos] = ((in[13 + inpos] >>> 19) + | ((in[14 + inpos] & 65535) << (29 - 16)) + ) + out[15 + outpos - 1]; + out[16 + outpos] = ((in[14 + inpos] >>> 16) + | ((in[15 + inpos] & 8191) << (29 - 13)) + ) + out[16 + outpos - 1]; + out[17 + outpos] = ((in[15 + inpos] >>> 13) + | ((in[16 + inpos] & 1023) << (29 - 10)) + ) + out[17 + outpos - 1]; + out[18 + outpos] = ((in[16 + inpos] >>> 10) + | ((in[17 + inpos] & 127) << (29 - 7)) + ) + out[18 + outpos - 1]; + out[19 + outpos] = ((in[17 + inpos] >>> 7) + | ((in[18 + inpos] & 15) << (29 - 4)) + ) + out[19 + outpos - 1]; + out[20 + outpos] = ((in[18 + inpos] >>> 4) + | ((in[19 + inpos] & 1) << (29 - 1)) + ) + out[20 + outpos - 1]; + out[21 + outpos] = (((in[19 + inpos] >>> 1) & 536870911) + ) + out[21 + outpos - 1]; + out[22 + outpos] = ((in[19 + inpos] >>> 30) + | ((in[20 + inpos] & 134217727) << (29 - 27)) + ) + out[22 + outpos - 1]; + out[23 + outpos] = ((in[20 + inpos] >>> 27) + | ((in[21 + inpos] & 16777215) << (29 - 24)) + ) + out[23 + outpos - 1]; + out[24 + outpos] = ((in[21 + inpos] >>> 24) + | ((in[22 + inpos] & 2097151) << (29 - 21)) + ) + out[24 + outpos - 1]; + out[25 + outpos] = ((in[22 + inpos] >>> 21) + | ((in[23 + inpos] & 262143) << (29 - 18)) + ) + out[25 + outpos - 1]; + out[26 + outpos] = ((in[23 + inpos] >>> 18) + | ((in[24 + inpos] & 32767) << (29 - 15)) + ) + out[26 + outpos - 1]; + out[27 + outpos] = ((in[24 + inpos] >>> 15) + | ((in[25 + inpos] & 4095) << (29 - 12)) + ) + out[27 + outpos - 1]; + out[28 + outpos] = ((in[25 + inpos] >>> 12) + | ((in[26 + inpos] & 511) << (29 - 9)) + ) + out[28 + outpos - 1]; + out[29 + outpos] = ((in[26 + inpos] >>> 9) + | ((in[27 + inpos] & 63) << (29 - 6)) + ) + out[29 + outpos - 1]; + out[30 + outpos] = ((in[27 + inpos] >>> 6) + | ((in[28 + inpos] & 7) << (29 - 3)) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[28 + inpos] >>> 3) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack30(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 1073741823) + ) + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 30) + | ((in[1 + inpos] & 268435455) << (30 - 28)) + ) + out[1 + outpos - 1]; + out[2 + outpos] = ((in[1 + inpos] >>> 28) + | ((in[2 + inpos] & 67108863) << (30 - 26)) + ) + out[2 + outpos - 1]; + out[3 + outpos] = ((in[2 + inpos] >>> 26) + | ((in[3 + inpos] & 16777215) << (30 - 24)) + ) + out[3 + outpos - 1]; + out[4 + outpos] = ((in[3 + inpos] >>> 24) + | ((in[4 + inpos] & 4194303) << (30 - 22)) + ) + out[4 + outpos - 1]; + out[5 + outpos] = ((in[4 + inpos] >>> 22) + | ((in[5 + inpos] & 1048575) << (30 - 20)) + ) + out[5 + outpos - 1]; + out[6 + outpos] = ((in[5 + inpos] >>> 20) + | ((in[6 + inpos] & 262143) << (30 - 18)) + ) + out[6 + outpos - 1]; + out[7 + outpos] = ((in[6 + inpos] >>> 18) + | ((in[7 + inpos] & 65535) << (30 - 16)) + ) + out[7 + outpos - 1]; + out[8 + outpos] = ((in[7 + inpos] >>> 16) + | ((in[8 + inpos] & 16383) << (30 - 14)) + ) + out[8 + outpos - 1]; + out[9 + outpos] = ((in[8 + inpos] >>> 14) + | ((in[9 + inpos] & 4095) << (30 - 12)) + ) + out[9 + outpos - 1]; + out[10 + outpos] = ((in[9 + inpos] >>> 12) + | ((in[10 + inpos] & 1023) << (30 - 10)) + ) + out[10 + outpos - 1]; + out[11 + outpos] = ((in[10 + inpos] >>> 10) + | ((in[11 + inpos] & 255) << (30 - 8)) + ) + out[11 + outpos - 1]; + out[12 + outpos] = ((in[11 + inpos] >>> 8) + | ((in[12 + inpos] & 63) << (30 - 6)) + ) + out[12 + outpos - 1]; + out[13 + outpos] = ((in[12 + inpos] >>> 6) + | ((in[13 + inpos] & 15) << (30 - 4)) + ) + out[13 + outpos - 1]; + out[14 + outpos] = ((in[13 + inpos] >>> 4) + | ((in[14 + inpos] & 3) << (30 - 2)) + ) + out[14 + outpos - 1]; + out[15 + outpos] = ((in[14 + inpos] >>> 2) + ) + out[15 + outpos - 1]; + out[16 + outpos] = (((in[15 + inpos] >>> 0) & 1073741823) + ) + out[16 + outpos - 1]; + out[17 + outpos] = ((in[15 + inpos] >>> 30) + | ((in[16 + inpos] & 268435455) << (30 - 28)) + ) + out[17 + outpos - 1]; + out[18 + outpos] = ((in[16 + inpos] >>> 28) + | ((in[17 + inpos] & 67108863) << (30 - 26)) + ) + out[18 + outpos - 1]; + out[19 + outpos] = ((in[17 + inpos] >>> 26) + | ((in[18 + inpos] & 16777215) << (30 - 24)) + ) + out[19 + outpos - 1]; + out[20 + outpos] = ((in[18 + inpos] >>> 24) + | ((in[19 + inpos] & 4194303) << (30 - 22)) + ) + out[20 + outpos - 1]; + out[21 + outpos] = ((in[19 + inpos] >>> 22) + | ((in[20 + inpos] & 1048575) << (30 - 20)) + ) + out[21 + outpos - 1]; + out[22 + outpos] = ((in[20 + inpos] >>> 20) + | ((in[21 + inpos] & 262143) << (30 - 18)) + ) + out[22 + outpos - 1]; + out[23 + outpos] = ((in[21 + inpos] >>> 18) + | ((in[22 + inpos] & 65535) << (30 - 16)) + ) + out[23 + outpos - 1]; + out[24 + outpos] = ((in[22 + inpos] >>> 16) + | ((in[23 + inpos] & 16383) << (30 - 14)) + ) + out[24 + outpos - 1]; + out[25 + outpos] = ((in[23 + inpos] >>> 14) + | ((in[24 + inpos] & 4095) << (30 - 12)) + ) + out[25 + outpos - 1]; + out[26 + outpos] = ((in[24 + inpos] >>> 12) + | ((in[25 + inpos] & 1023) << (30 - 10)) + ) + out[26 + outpos - 1]; + out[27 + outpos] = ((in[25 + inpos] >>> 10) + | ((in[26 + inpos] & 255) << (30 - 8)) + ) + out[27 + outpos - 1]; + out[28 + outpos] = ((in[26 + inpos] >>> 8) + | ((in[27 + inpos] & 63) << (30 - 6)) + ) + out[28 + outpos - 1]; + out[29 + outpos] = ((in[27 + inpos] >>> 6) + | ((in[28 + inpos] & 15) << (30 - 4)) + ) + out[29 + outpos - 1]; + out[30 + outpos] = ((in[28 + inpos] >>> 4) + | ((in[29 + inpos] & 3) << (30 - 2)) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[29 + inpos] >>> 2) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack31(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 2147483647) + ) + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 31) + | ((in[1 + inpos] & 1073741823) << (31 - 30)) + ) + out[1 + outpos - 1]; + out[2 + outpos] = ((in[1 + inpos] >>> 30) + | ((in[2 + inpos] & 536870911) << (31 - 29)) + ) + out[2 + outpos - 1]; + out[3 + outpos] = ((in[2 + inpos] >>> 29) + | ((in[3 + inpos] & 268435455) << (31 - 28)) + ) + out[3 + outpos - 1]; + out[4 + outpos] = ((in[3 + inpos] >>> 28) + | ((in[4 + inpos] & 134217727) << (31 - 27)) + ) + out[4 + outpos - 1]; + out[5 + outpos] = ((in[4 + inpos] >>> 27) + | ((in[5 + inpos] & 67108863) << (31 - 26)) + ) + out[5 + outpos - 1]; + out[6 + outpos] = ((in[5 + inpos] >>> 26) + | ((in[6 + inpos] & 33554431) << (31 - 25)) + ) + out[6 + outpos - 1]; + out[7 + outpos] = ((in[6 + inpos] >>> 25) + | ((in[7 + inpos] & 16777215) << (31 - 24)) + ) + out[7 + outpos - 1]; + out[8 + outpos] = ((in[7 + inpos] >>> 24) + | ((in[8 + inpos] & 8388607) << (31 - 23)) + ) + out[8 + outpos - 1]; + out[9 + outpos] = ((in[8 + inpos] >>> 23) + | ((in[9 + inpos] & 4194303) << (31 - 22)) + ) + out[9 + outpos - 1]; + out[10 + outpos] = ((in[9 + inpos] >>> 22) + | ((in[10 + inpos] & 2097151) << (31 - 21)) + ) + out[10 + outpos - 1]; + out[11 + outpos] = ((in[10 + inpos] >>> 21) + | ((in[11 + inpos] & 1048575) << (31 - 20)) + ) + out[11 + outpos - 1]; + out[12 + outpos] = ((in[11 + inpos] >>> 20) + | ((in[12 + inpos] & 524287) << (31 - 19)) + ) + out[12 + outpos - 1]; + out[13 + outpos] = ((in[12 + inpos] >>> 19) + | ((in[13 + inpos] & 262143) << (31 - 18)) + ) + out[13 + outpos - 1]; + out[14 + outpos] = ((in[13 + inpos] >>> 18) + | ((in[14 + inpos] & 131071) << (31 - 17)) + ) + out[14 + outpos - 1]; + out[15 + outpos] = ((in[14 + inpos] >>> 17) + | ((in[15 + inpos] & 65535) << (31 - 16)) + ) + out[15 + outpos - 1]; + out[16 + outpos] = ((in[15 + inpos] >>> 16) + | ((in[16 + inpos] & 32767) << (31 - 15)) + ) + out[16 + outpos - 1]; + out[17 + outpos] = ((in[16 + inpos] >>> 15) + | ((in[17 + inpos] & 16383) << (31 - 14)) + ) + out[17 + outpos - 1]; + out[18 + outpos] = ((in[17 + inpos] >>> 14) + | ((in[18 + inpos] & 8191) << (31 - 13)) + ) + out[18 + outpos - 1]; + out[19 + outpos] = ((in[18 + inpos] >>> 13) + | ((in[19 + inpos] & 4095) << (31 - 12)) + ) + out[19 + outpos - 1]; + out[20 + outpos] = ((in[19 + inpos] >>> 12) + | ((in[20 + inpos] & 2047) << (31 - 11)) + ) + out[20 + outpos - 1]; + out[21 + outpos] = ((in[20 + inpos] >>> 11) + | ((in[21 + inpos] & 1023) << (31 - 10)) + ) + out[21 + outpos - 1]; + out[22 + outpos] = ((in[21 + inpos] >>> 10) + | ((in[22 + inpos] & 511) << (31 - 9)) + ) + out[22 + outpos - 1]; + out[23 + outpos] = ((in[22 + inpos] >>> 9) + | ((in[23 + inpos] & 255) << (31 - 8)) + ) + out[23 + outpos - 1]; + out[24 + outpos] = ((in[23 + inpos] >>> 8) + | ((in[24 + inpos] & 127) << (31 - 7)) + ) + out[24 + outpos - 1]; + out[25 + outpos] = ((in[24 + inpos] >>> 7) + | ((in[25 + inpos] & 63) << (31 - 6)) + ) + out[25 + outpos - 1]; + out[26 + outpos] = ((in[25 + inpos] >>> 6) + | ((in[26 + inpos] & 31) << (31 - 5)) + ) + out[26 + outpos - 1]; + out[27 + outpos] = ((in[26 + inpos] >>> 5) + | ((in[27 + inpos] & 15) << (31 - 4)) + ) + out[27 + outpos - 1]; + out[28 + outpos] = ((in[27 + inpos] >>> 4) + | ((in[28 + inpos] & 7) << (31 - 3)) + ) + out[28 + outpos - 1]; + out[29 + outpos] = ((in[28 + inpos] >>> 3) + | ((in[29 + inpos] & 3) << (31 - 2)) + ) + out[29 + outpos - 1]; + out[30 + outpos] = ((in[29 + inpos] >>> 2) + | ((in[30 + inpos] & 1) << (31 - 1)) + ) + out[30 + outpos - 1]; + out[31 + outpos] = ((in[30 + inpos] >>> 1) + ) + out[31 + outpos - 1]; + } + + + public static void integratedunpack32(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + System.arraycopy(in, inpos, out, outpos, 32); // no sense in doing delta coding + } + + + public static void integratedpack32(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + System.arraycopy(in, inpos, out, outpos, 32); // no sense in doing delta coding + } + + + public static void integratedunpack0(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + Arrays.fill(out, outpos, outpos + 32, initoffset); + } + + + public static void integratedpack0(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + // nothing + } + + + public static void integratedunpack(final int initoffset, final int[] in, int inpos, final int[] out, int outpos, final int bit) { + switch (bit) { + case 0: + integratedunpack0(initoffset, in, inpos, out, outpos); + break; + case 1: + integratedunpack1(initoffset, in, inpos, out, outpos); + break; + case 2: + integratedunpack2(initoffset, in, inpos, out, outpos); + break; + case 3: + integratedunpack3(initoffset, in, inpos, out, outpos); + break; + case 4: + integratedunpack4(initoffset, in, inpos, out, outpos); + break; + case 5: + integratedunpack5(initoffset, in, inpos, out, outpos); + break; + case 6: + integratedunpack6(initoffset, in, inpos, out, outpos); + break; + case 7: + integratedunpack7(initoffset, in, inpos, out, outpos); + break; + case 8: + integratedunpack8(initoffset, in, inpos, out, outpos); + break; + case 9: + integratedunpack9(initoffset, in, inpos, out, outpos); + break; + case 10: + integratedunpack10(initoffset, in, inpos, out, outpos); + break; + case 11: + integratedunpack11(initoffset, in, inpos, out, outpos); + break; + case 12: + integratedunpack12(initoffset, in, inpos, out, outpos); + break; + case 13: + integratedunpack13(initoffset, in, inpos, out, outpos); + break; + case 14: + integratedunpack14(initoffset, in, inpos, out, outpos); + break; + case 15: + integratedunpack15(initoffset, in, inpos, out, outpos); + break; + case 16: + integratedunpack16(initoffset, in, inpos, out, outpos); + break; + case 17: + integratedunpack17(initoffset, in, inpos, out, outpos); + break; + case 18: + integratedunpack18(initoffset, in, inpos, out, outpos); + break; + case 19: + integratedunpack19(initoffset, in, inpos, out, outpos); + break; + case 20: + integratedunpack20(initoffset, in, inpos, out, outpos); + break; + case 21: + integratedunpack21(initoffset, in, inpos, out, outpos); + break; + case 22: + integratedunpack22(initoffset, in, inpos, out, outpos); + break; + case 23: + integratedunpack23(initoffset, in, inpos, out, outpos); + break; + case 24: + integratedunpack24(initoffset, in, inpos, out, outpos); + break; + case 25: + integratedunpack25(initoffset, in, inpos, out, outpos); + break; + case 26: + integratedunpack26(initoffset, in, inpos, out, outpos); + break; + case 27: + integratedunpack27(initoffset, in, inpos, out, outpos); + break; + case 28: + integratedunpack28(initoffset, in, inpos, out, outpos); + break; + case 29: + integratedunpack29(initoffset, in, inpos, out, outpos); + break; + case 30: + integratedunpack30(initoffset, in, inpos, out, outpos); + break; + case 31: + integratedunpack31(initoffset, in, inpos, out, outpos); + break; + case 32: + integratedunpack32(initoffset, in, inpos, out, outpos); + break; + default: + throw new IllegalArgumentException("Unsupported bit width."); + } + } + + + public static void integratedpack(final int initoffset, final int[] in, int inpos, final int[] out, int outpos, final int bit) { + switch (bit) { + case 0: + integratedpack0(initoffset, in, inpos, out, outpos); + break; + case 1: + integratedpack1(initoffset, in, inpos, out, outpos); + break; + case 2: + integratedpack2(initoffset, in, inpos, out, outpos); + break; + case 3: + integratedpack3(initoffset, in, inpos, out, outpos); + break; + case 4: + integratedpack4(initoffset, in, inpos, out, outpos); + break; + case 5: + integratedpack5(initoffset, in, inpos, out, outpos); + break; + case 6: + integratedpack6(initoffset, in, inpos, out, outpos); + break; + case 7: + integratedpack7(initoffset, in, inpos, out, outpos); + break; + case 8: + integratedpack8(initoffset, in, inpos, out, outpos); + break; + case 9: + integratedpack9(initoffset, in, inpos, out, outpos); + break; + case 10: + integratedpack10(initoffset, in, inpos, out, outpos); + break; + case 11: + integratedpack11(initoffset, in, inpos, out, outpos); + break; + case 12: + integratedpack12(initoffset, in, inpos, out, outpos); + break; + case 13: + integratedpack13(initoffset, in, inpos, out, outpos); + break; + case 14: + integratedpack14(initoffset, in, inpos, out, outpos); + break; + case 15: + integratedpack15(initoffset, in, inpos, out, outpos); + break; + case 16: + integratedpack16(initoffset, in, inpos, out, outpos); + break; + case 17: + integratedpack17(initoffset, in, inpos, out, outpos); + break; + case 18: + integratedpack18(initoffset, in, inpos, out, outpos); + break; + case 19: + integratedpack19(initoffset, in, inpos, out, outpos); + break; + case 20: + integratedpack20(initoffset, in, inpos, out, outpos); + break; + case 21: + integratedpack21(initoffset, in, inpos, out, outpos); + break; + case 22: + integratedpack22(initoffset, in, inpos, out, outpos); + break; + case 23: + integratedpack23(initoffset, in, inpos, out, outpos); + break; + case 24: + integratedpack24(initoffset, in, inpos, out, outpos); + break; + case 25: + integratedpack25(initoffset, in, inpos, out, outpos); + break; + case 26: + integratedpack26(initoffset, in, inpos, out, outpos); + break; + case 27: + integratedpack27(initoffset, in, inpos, out, outpos); + break; + case 28: + integratedpack28(initoffset, in, inpos, out, outpos); + break; + case 29: + integratedpack29(initoffset, in, inpos, out, outpos); + break; + case 30: + integratedpack30(initoffset, in, inpos, out, outpos); + break; + case 31: + integratedpack31(initoffset, in, inpos, out, outpos); + break; + case 32: + integratedpack32(initoffset, in, inpos, out, outpos); + break; + default: + throw new IllegalArgumentException("Unsupported bit width."); + } + } } diff --git a/src/main/java/me/lemire/integercompression/IntegratedComposition.java b/src/main/java/me/lemire/integercompression/IntegratedComposition.java index 72ba2ed..3567186 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedComposition.java +++ b/src/main/java/me/lemire/integercompression/IntegratedComposition.java @@ -8,38 +8,38 @@ /** * Helper class to compose schemes. - * + * * @author Daniel Lemire */ public class IntegratedComposition implements IntegratedIntegerCODEC { - IntegratedIntegerCODEC F1, F2; + IntegratedIntegerCODEC F1, F2; - public IntegratedComposition(IntegratedIntegerCODEC f1, IntegratedIntegerCODEC f2) { - F1 = f1; - F2 = f2; - } + public IntegratedComposition(IntegratedIntegerCODEC f1, IntegratedIntegerCODEC f2) { + F1 = f1; + F2 = f2; + } - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - int init = inpos.get(); - F1.compress(in, inpos, inlength, out, outpos); - inlength -= inpos.get() - init; - F2.compress(in, inpos, inlength, out, outpos); - } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + int init = inpos.get(); + F1.compress(in, inpos, inlength, out, outpos); + inlength -= inpos.get() - init; + F2.compress(in, inpos, inlength, out, outpos); + } - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - int init = inpos.get(); - F1.uncompress(in, inpos, inlength, out, outpos); - inlength -= inpos.get() - init; - F2.uncompress(in, inpos, inlength, out, outpos); - } + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + int init = inpos.get(); + F1.uncompress(in, inpos, inlength, out, outpos); + inlength -= inpos.get() - init; + F2.uncompress(in, inpos, inlength, out, outpos); + } - @Override - public String toString() { - return F1.getClass().getName() + "+" + F2.getClass().getName(); - } + @Override + public String toString() { + return F1.getClass().getName() + "+" + F2.getClass().getName(); + } } diff --git a/src/main/java/me/lemire/integercompression/IntegratedIntegerCODEC.java b/src/main/java/me/lemire/integercompression/IntegratedIntegerCODEC.java index 10e22db..dcfe0c4 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedIntegerCODEC.java +++ b/src/main/java/me/lemire/integercompression/IntegratedIntegerCODEC.java @@ -8,13 +8,11 @@ /** - * * This is just like IntegerCODEC, except that it indicates * that delta coding is "integrated", so that you don't * need a separate step for delta coding. - * - * @author Daniel Lemire * + * @author Daniel Lemire */ public interface IntegratedIntegerCODEC extends IntegerCODEC { diff --git a/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java b/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java index 836e329..fcf7120 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java +++ b/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java @@ -11,61 +11,65 @@ import java.nio.IntBuffer; public class IntegratedVariableByte implements IntegratedIntegerCODEC { - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - int initoffset = 0; - ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); - for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { - int val = in[k] - initoffset; - initoffset=in[k]; - do { - int b = (val & 127); - val >>>= 7; - if (val != 0) { - b |= 128; - } - buf.put((byte) b); - } while (val != 0); - } - while (buf.position() % 4 != 0) - buf.put((byte) 128); - final int length = buf.position(); - buf.flip(); - IntBuffer ibuf = buf.asIntBuffer(); - ibuf.get(out, outpos.get(), length / 4); - outpos.add(length / 4); - inpos.add(inlength); - } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + int initoffset = 0; + ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); + for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { + int val = in[k] - initoffset; + initoffset = in[k]; + do { + int b = (val & 127); + val >>>= 7; + if (val != 0) { + b |= 128; + } + buf.put((byte) b); + } while (val != 0); + } + while (buf.position() % 4 != 0) + buf.put((byte) 128); + final int length = buf.position(); + buf.flip(); + IntBuffer ibuf = buf.asIntBuffer(); + ibuf.get(out, outpos.get(), length / 4); + outpos.add(length / 4); + inpos.add(inlength); + } - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { - int s = 0; - int p = inpos.get(); - int finalp = inpos.get() + inlength; - int tmpoutpos = outpos.get(); - int initoffset = 0; - for (int v = 0, shift = 0; p>> (24-s)); - s+=8; if(s == 32) {s = 0; p++;} - v += ((c & 127) << shift); - if ((c & 128) == 0) { - out[tmpoutpos] = v + initoffset; - initoffset = out[tmpoutpos]; - tmpoutpos++; - v = 0; - shift = 0; - } else - shift += 7; - } - outpos.set(tmpoutpos); - inpos.add(inlength); - } + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + int s = 0; + int p = inpos.get(); + int finalp = inpos.get() + inlength; + int tmpoutpos = outpos.get(); + int initoffset = 0; + for (int v = 0, shift = 0; p < finalp; ) { + int c = (byte) (in[p] >>> (24 - s)); + s += 8; + if (s == 32) { + s = 0; + p++; + } + v += ((c & 127) << shift); + if ((c & 128) == 0) { + out[tmpoutpos] = v + initoffset; + initoffset = out[tmpoutpos]; + tmpoutpos++; + v = 0; + shift = 0; + } else + shift += 7; + } + outpos.set(tmpoutpos); + inpos.add(inlength); + } - @Override - public String toString() { - return this.getClass().getName(); - } + @Override + public String toString() { + return this.getClass().getName(); + } } diff --git a/src/main/java/me/lemire/integercompression/JustCopy.java b/src/main/java/me/lemire/integercompression/JustCopy.java index 321b93f..a76875b 100644 --- a/src/main/java/me/lemire/integercompression/JustCopy.java +++ b/src/main/java/me/lemire/integercompression/JustCopy.java @@ -10,28 +10,27 @@ public final class JustCopy implements IntegerCODEC { - @Override -public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); - System.arraycopy(in, inpos.get(), out, outpos.get(), inlength); - inpos.add(inlength); - outpos.add(inlength); - } - - @Override -public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); - System.arraycopy(in, inpos.get(), out, outpos.get(), inlength); - inpos.add(inlength); - outpos.add(inlength); - } - - - - @Override -public String toString() { - return this.getClass().getName(); - } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + // Util.assertTrue(inpos.get()+inlength <= in.length); + System.arraycopy(in, inpos.get(), out, outpos.get(), inlength); + inpos.add(inlength); + outpos.add(inlength); + } + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + // Util.assertTrue(inpos.get()+inlength <= in.length); + System.arraycopy(in, inpos.get(), out, outpos.get(), inlength); + inpos.add(inlength); + outpos.add(inlength); + } + + + @Override + public String toString() { + return this.getClass().getName(); + } } diff --git a/src/main/java/me/lemire/integercompression/NewPFD.java b/src/main/java/me/lemire/integercompression/NewPFD.java index dd3b732..15a4717 100644 --- a/src/main/java/me/lemire/integercompression/NewPFD.java +++ b/src/main/java/me/lemire/integercompression/NewPFD.java @@ -9,154 +9,153 @@ /** * NewPFD/NewPFOR implemented by Daniel Lemire - * + *

* Follows: - * + *

* H. Yan, S. Ding, T. Suel, Inverted index compression and query processing * with optimized document ordering, in: WWW �09, 2009, pp. 401�410. - * + *

* using Simple16 as the secondary coder. - * + * * @author Daniel Lemire - * */ public final class NewPFD implements IntegerCODEC { - final int PageSize; - final static int BlockSize = 128; + final int PageSize; + final static int BlockSize = 128; - int[] exceptbuffer = new int[2 * BlockSize]; + int[] exceptbuffer = new int[2 * BlockSize]; - public NewPFD() { - PageSize = 65536; - } + public NewPFD() { + PageSize = 65536; + } - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); - inlength = inlength / BlockSize * BlockSize; + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + // Util.assertTrue(inpos.get()+inlength <= in.length); + inlength = inlength / BlockSize * BlockSize; - final int finalinpos = inpos.get() + inlength; - out[outpos.get()] = inlength; - outpos.increment(); - while (inpos.get() != finalinpos) { - int thissize = finalinpos > PageSize + inpos.get() ? PageSize - : (finalinpos - inpos.get()); - encodePage(in, inpos, thissize, out, outpos); - } + final int finalinpos = inpos.get() + inlength; + out[outpos.get()] = inlength; + outpos.increment(); + while (inpos.get() != finalinpos) { + int thissize = finalinpos > PageSize + inpos.get() ? PageSize + : (finalinpos - inpos.get()); + encodePage(in, inpos, thissize, out, outpos); + } - } + } - public static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 16, 20, 32 }; - public static final int[] invbits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16 }; + public static final int[] bits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 16, 20, 32}; + public static final int[] invbits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16}; - public static void getBestBFromData(int[] in, int pos, IntWrapper bestb, - IntWrapper bestexcept) { - final int mb = Util.maxbits(in, pos, BlockSize); - int mini = 0; - if (mini + 28 < bits[invbits[mb]]) - mini = bits[invbits[mb]] - 28; // 28 is the max for exceptions - int besti = bits.length - 1; - int exceptcounter = 0; - for (int i = mini; i < bits.length - 1; ++i) { - int tmpcounter = 0; - final int maxv = 1 << bits[i]; - for (int k = pos; k < BlockSize + pos; ++k) - if (in[k] >= maxv) - ++tmpcounter; - if (tmpcounter * 10 <= BlockSize) { - besti = i; - exceptcounter = tmpcounter; - break; - } - } - bestb.set(besti); - bestexcept.set(exceptcounter); - } + public static void getBestBFromData(int[] in, int pos, IntWrapper bestb, + IntWrapper bestexcept) { + final int mb = Util.maxbits(in, pos, BlockSize); + int mini = 0; + if (mini + 28 < bits[invbits[mb]]) + mini = bits[invbits[mb]] - 28; // 28 is the max for exceptions + int besti = bits.length - 1; + int exceptcounter = 0; + for (int i = mini; i < bits.length - 1; ++i) { + int tmpcounter = 0; + final int maxv = 1 << bits[i]; + for (int k = pos; k < BlockSize + pos; ++k) + if (in[k] >= maxv) + ++tmpcounter; + if (tmpcounter * 10 <= BlockSize) { + besti = i; + exceptcounter = tmpcounter; + break; + } + } + bestb.set(besti); + bestexcept.set(exceptcounter); + } - private void encodePage(int[] in, IntWrapper inpos, int thissize, - int[] out, IntWrapper outpos) { - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); - IntWrapper bestb = new IntWrapper(); - IntWrapper bestexcept = new IntWrapper(); - for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { - getBestBFromData(in, tmpinpos, bestb, bestexcept); - int tmpbestb = bestb.get(); - int nbrexcept = bestexcept.get(); - int exceptsize = 0; - int remember = tmpoutpos; - tmpoutpos++; - if (nbrexcept > 0) { - final int maxv = 1 << bits[tmpbestb]; - for (int i = 0, c = 0; i < BlockSize; ++i) { - if (in[tmpinpos + i] >= maxv) { - exceptbuffer[c + nbrexcept] = i; - exceptbuffer[c] = in[tmpinpos + i] >>> bits[tmpbestb]; - ++c; - } - } - exceptsize = S16.compress(exceptbuffer, 0, 2 * nbrexcept, out, - tmpoutpos); - tmpoutpos += exceptsize; - } - out[remember] = tmpbestb | (nbrexcept << 8) | (exceptsize << 16); - for (int k = 0; k < BlockSize; k += 32) { - BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, - bits[tmpbestb]); - tmpoutpos += bits[tmpbestb]; - } - } - inpos.set(tmpinpos); - outpos.set(tmpoutpos); - } + private void encodePage(int[] in, IntWrapper inpos, int thissize, + int[] out, IntWrapper outpos) { + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); + IntWrapper bestb = new IntWrapper(); + IntWrapper bestexcept = new IntWrapper(); + for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { + getBestBFromData(in, tmpinpos, bestb, bestexcept); + int tmpbestb = bestb.get(); + int nbrexcept = bestexcept.get(); + int exceptsize = 0; + int remember = tmpoutpos; + tmpoutpos++; + if (nbrexcept > 0) { + final int maxv = 1 << bits[tmpbestb]; + for (int i = 0, c = 0; i < BlockSize; ++i) { + if (in[tmpinpos + i] >= maxv) { + exceptbuffer[c + nbrexcept] = i; + exceptbuffer[c] = in[tmpinpos + i] >>> bits[tmpbestb]; + ++c; + } + } + exceptsize = S16.compress(exceptbuffer, 0, 2 * nbrexcept, out, + tmpoutpos); + tmpoutpos += exceptsize; + } + out[remember] = tmpbestb | (nbrexcept << 8) | (exceptsize << 16); + for (int k = 0; k < BlockSize; k += 32) { + BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, + bits[tmpbestb]); + tmpoutpos += bits[tmpbestb]; + } + } + inpos.set(tmpinpos); + outpos.set(tmpoutpos); + } - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); - int mynvalue = in[inpos.get()]; - inpos.increment(); - int finalout = outpos.get() + mynvalue; - while (outpos.get() != finalout) { - int thissize = finalout > PageSize + outpos.get() ? PageSize - : (finalout - outpos.get()); - decodePage(in, inpos, out, outpos, thissize); - } - } + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + // Util.assertTrue(inpos.get()+inlength <= in.length); + int mynvalue = in[inpos.get()]; + inpos.increment(); + int finalout = outpos.get() + mynvalue; + while (outpos.get() != finalout) { + int thissize = finalout > PageSize + outpos.get() ? PageSize + : (finalout - outpos.get()); + decodePage(in, inpos, out, outpos, thissize); + } + } - private void decodePage(int[] in, IntWrapper inpos, int[] out, - IntWrapper outpos, int thissize) { - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); + private void decodePage(int[] in, IntWrapper inpos, int[] out, + IntWrapper outpos, int thissize) { + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); - for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { - final int b = in[tmpinpos] & 0xFF; - final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; - final int exceptsize = (in[tmpinpos] >>> 16); - ++tmpinpos; - S16.uncompress(in, tmpinpos, exceptsize, exceptbuffer, 0, - 2 * cexcept); - tmpinpos += exceptsize; - for (int k = 0; k < BlockSize; k += 32) { - BitPacking - .fastunpack(in, tmpinpos, out, tmpoutpos + k, bits[b]); - tmpinpos += bits[b]; - } - for (int k = 0; k < cexcept; ++k) { - out[tmpoutpos + exceptbuffer[k + cexcept]] |= (exceptbuffer[k] << bits[b]); - } - } - outpos.set(tmpoutpos); - inpos.set(tmpinpos); - } + for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { + final int b = in[tmpinpos] & 0xFF; + final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; + final int exceptsize = (in[tmpinpos] >>> 16); + ++tmpinpos; + S16.uncompress(in, tmpinpos, exceptsize, exceptbuffer, 0, + 2 * cexcept); + tmpinpos += exceptsize; + for (int k = 0; k < BlockSize; k += 32) { + BitPacking + .fastunpack(in, tmpinpos, out, tmpoutpos + k, bits[b]); + tmpinpos += bits[b]; + } + for (int k = 0; k < cexcept; ++k) { + out[tmpoutpos + exceptbuffer[k + cexcept]] |= (exceptbuffer[k] << bits[b]); + } + } + outpos.set(tmpoutpos); + inpos.set(tmpinpos); + } - @Override - public String toString() { - return this.getClass().getName(); - } + @Override + public String toString() { + return this.getClass().getName(); + } } diff --git a/src/main/java/me/lemire/integercompression/NewPFDS9.java b/src/main/java/me/lemire/integercompression/NewPFDS9.java index dd32ca5..73e8392 100644 --- a/src/main/java/me/lemire/integercompression/NewPFDS9.java +++ b/src/main/java/me/lemire/integercompression/NewPFDS9.java @@ -9,154 +9,153 @@ /** * NewPFD/NewPFOR implemented by Daniel Lemire - * + *

* Follows: - * + *

* H. Yan, S. Ding, T. Suel, Inverted index compression and query processing * with optimized document ordering, in: WWW 09, 2009, pp. 401-410. - * + *

* using Simple9 as the secondary coder. - * + * * @author Daniel Lemire - * */ public final class NewPFDS9 implements IntegerCODEC { - final int PageSize; - final static int BlockSize = 128; + final int PageSize; + final static int BlockSize = 128; - int[] exceptbuffer = new int[2 * BlockSize]; + int[] exceptbuffer = new int[2 * BlockSize]; - public NewPFDS9() { - PageSize = 65536; - } + public NewPFDS9() { + PageSize = 65536; + } - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); - inlength = inlength / BlockSize * BlockSize; + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + // Util.assertTrue(inpos.get()+inlength <= in.length); + inlength = inlength / BlockSize * BlockSize; - final int finalinpos = inpos.get() + inlength; - out[outpos.get()] = inlength; - outpos.increment(); - while (inpos.get() != finalinpos) { - int thissize = finalinpos > PageSize + inpos.get() ? PageSize - : (finalinpos - inpos.get()); - encodePage(in, inpos, thissize, out, outpos); - } + final int finalinpos = inpos.get() + inlength; + out[outpos.get()] = inlength; + outpos.increment(); + while (inpos.get() != finalinpos) { + int thissize = finalinpos > PageSize + inpos.get() ? PageSize + : (finalinpos - inpos.get()); + encodePage(in, inpos, thissize, out, outpos); + } - } + } - public static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 16, 20, 32 }; - public static final int[] invbits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16 }; + public static final int[] bits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 16, 20, 32}; + public static final int[] invbits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16}; - public static void getBestBFromData(int[] in, int pos, IntWrapper bestb, - IntWrapper bestexcept) { - final int mb = Util.maxbits(in, pos, BlockSize); - int mini = 0; - if (mini + 28 < bits[invbits[mb]]) - mini = bits[invbits[mb]] - 28; // 28 is the max for exceptions - int besti = bits.length - 1; - int exceptcounter = 0; - for (int i = mini; i < bits.length - 1; ++i) { - int tmpcounter = 0; - final int maxv = 1 << bits[i]; - for (int k = pos; k < BlockSize + pos; ++k) - if (in[k] >= maxv) - ++tmpcounter; - if (tmpcounter * 10 <= BlockSize) { - besti = i; - exceptcounter = tmpcounter; - break; - } - } - bestb.set(besti); - bestexcept.set(exceptcounter); - } + public static void getBestBFromData(int[] in, int pos, IntWrapper bestb, + IntWrapper bestexcept) { + final int mb = Util.maxbits(in, pos, BlockSize); + int mini = 0; + if (mini + 28 < bits[invbits[mb]]) + mini = bits[invbits[mb]] - 28; // 28 is the max for exceptions + int besti = bits.length - 1; + int exceptcounter = 0; + for (int i = mini; i < bits.length - 1; ++i) { + int tmpcounter = 0; + final int maxv = 1 << bits[i]; + for (int k = pos; k < BlockSize + pos; ++k) + if (in[k] >= maxv) + ++tmpcounter; + if (tmpcounter * 10 <= BlockSize) { + besti = i; + exceptcounter = tmpcounter; + break; + } + } + bestb.set(besti); + bestexcept.set(exceptcounter); + } - private void encodePage(int[] in, IntWrapper inpos, int thissize, - int[] out, IntWrapper outpos) { - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); - IntWrapper bestb = new IntWrapper(); - IntWrapper bestexcept = new IntWrapper(); - for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { - getBestBFromData(in, tmpinpos, bestb, bestexcept); - int tmpbestb = bestb.get(); - int nbrexcept = bestexcept.get(); - int exceptsize = 0; - int remember = tmpoutpos; - tmpoutpos++; - if (nbrexcept > 0) { - final int maxv = 1 << bits[tmpbestb]; - for (int i = 0, c = 0; i < BlockSize; ++i) { - if (in[tmpinpos + i] >= maxv) { - exceptbuffer[c + nbrexcept] = i; - exceptbuffer[c] = in[tmpinpos + i] >>> bits[tmpbestb]; - ++c; - } - } - exceptsize = S9.compress(exceptbuffer, 0, 2 * nbrexcept, out, - tmpoutpos); - tmpoutpos += exceptsize; - } - out[remember] = tmpbestb | (nbrexcept << 8) | (exceptsize << 16); - for (int k = 0; k < BlockSize; k += 32) { - BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, - bits[tmpbestb]); - tmpoutpos += bits[tmpbestb]; - } - } - inpos.set(tmpinpos); - outpos.set(tmpoutpos); - } + private void encodePage(int[] in, IntWrapper inpos, int thissize, + int[] out, IntWrapper outpos) { + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); + IntWrapper bestb = new IntWrapper(); + IntWrapper bestexcept = new IntWrapper(); + for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { + getBestBFromData(in, tmpinpos, bestb, bestexcept); + int tmpbestb = bestb.get(); + int nbrexcept = bestexcept.get(); + int exceptsize = 0; + int remember = tmpoutpos; + tmpoutpos++; + if (nbrexcept > 0) { + final int maxv = 1 << bits[tmpbestb]; + for (int i = 0, c = 0; i < BlockSize; ++i) { + if (in[tmpinpos + i] >= maxv) { + exceptbuffer[c + nbrexcept] = i; + exceptbuffer[c] = in[tmpinpos + i] >>> bits[tmpbestb]; + ++c; + } + } + exceptsize = S9.compress(exceptbuffer, 0, 2 * nbrexcept, out, + tmpoutpos); + tmpoutpos += exceptsize; + } + out[remember] = tmpbestb | (nbrexcept << 8) | (exceptsize << 16); + for (int k = 0; k < BlockSize; k += 32) { + BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, + bits[tmpbestb]); + tmpoutpos += bits[tmpbestb]; + } + } + inpos.set(tmpinpos); + outpos.set(tmpoutpos); + } - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); - int mynvalue = in[inpos.get()]; - inpos.increment(); - int finalout = outpos.get() + mynvalue; - while (outpos.get() != finalout) { - int thissize = finalout > PageSize + outpos.get() ? PageSize - : (finalout - outpos.get()); - decodePage(in, inpos, out, outpos, thissize); - } - } + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + // Util.assertTrue(inpos.get()+inlength <= in.length); + int mynvalue = in[inpos.get()]; + inpos.increment(); + int finalout = outpos.get() + mynvalue; + while (outpos.get() != finalout) { + int thissize = finalout > PageSize + outpos.get() ? PageSize + : (finalout - outpos.get()); + decodePage(in, inpos, out, outpos, thissize); + } + } - private void decodePage(int[] in, IntWrapper inpos, int[] out, - IntWrapper outpos, int thissize) { - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); + private void decodePage(int[] in, IntWrapper inpos, int[] out, + IntWrapper outpos, int thissize) { + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); - for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { - final int b = in[tmpinpos] & 0xFF; - final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; - final int exceptsize = (in[tmpinpos] >>> 16); - ++tmpinpos; - S9.uncompress(in, tmpinpos, exceptsize, exceptbuffer, 0, - 2 * cexcept); - tmpinpos += exceptsize; - for (int k = 0; k < BlockSize; k += 32) { - BitPacking - .fastunpack(in, tmpinpos, out, tmpoutpos + k, bits[b]); - tmpinpos += bits[b]; - } - for (int k = 0; k < cexcept; ++k) { - out[tmpoutpos + exceptbuffer[k + cexcept]] |= (exceptbuffer[k] << bits[b]); - } - } - outpos.set(tmpoutpos); - inpos.set(tmpinpos); - } + for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { + final int b = in[tmpinpos] & 0xFF; + final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; + final int exceptsize = (in[tmpinpos] >>> 16); + ++tmpinpos; + S9.uncompress(in, tmpinpos, exceptsize, exceptbuffer, 0, + 2 * cexcept); + tmpinpos += exceptsize; + for (int k = 0; k < BlockSize; k += 32) { + BitPacking + .fastunpack(in, tmpinpos, out, tmpoutpos + k, bits[b]); + tmpinpos += bits[b]; + } + for (int k = 0; k < cexcept; ++k) { + out[tmpoutpos + exceptbuffer[k + cexcept]] |= (exceptbuffer[k] << bits[b]); + } + } + outpos.set(tmpoutpos); + inpos.set(tmpinpos); + } - @Override - public String toString() { - return this.getClass().getName(); - } + @Override + public String toString() { + return this.getClass().getName(); + } } diff --git a/src/main/java/me/lemire/integercompression/OptPFD.java b/src/main/java/me/lemire/integercompression/OptPFD.java index e4d0a0e..f74c5d0 100644 --- a/src/main/java/me/lemire/integercompression/OptPFD.java +++ b/src/main/java/me/lemire/integercompression/OptPFD.java @@ -8,170 +8,169 @@ /** * OptPFD implemented by Daniel Lemire - * + *

* Follows: - * + *

* H. Yan, S. Ding, T. Suel, Inverted index compression and query processing * with optimized document ordering, in: WWW �09, 2009, pp. 401�410. - * + *

* using Simple16 as the secondary coder. - * + * * @author Daniel Lemire - * */ public final class OptPFD implements IntegerCODEC { - final int PageSize; - final static int BlockSize = 128; - - int[] exceptbuffer = new int[2 * BlockSize]; - int[] sillybuffer = new int[2 * BlockSize]; - - public OptPFD() { - PageSize = 65536; - } - - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); - inlength = inlength / BlockSize * BlockSize; - - final int finalinpos = inpos.get() + inlength; - out[outpos.get()] = inlength; - outpos.increment(); - while (inpos.get() != finalinpos) { - int thissize = finalinpos > PageSize + inpos.get() ? PageSize - : (finalinpos - inpos.get()); - encodePage(in, inpos, thissize, out, outpos); - } - - } - - public static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 16, 20, 32 }; - public static final int[] invbits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16 }; - - void getBestBFromData(int[] in, int pos, IntWrapper bestb, - IntWrapper bestexcept) { - final int mb = Util.maxbits(in, pos, BlockSize); - int mini = 0; - if (mini + 28 < bits[invbits[mb]]) - mini = bits[invbits[mb]] - 28; // 28 is the max for exceptions - int besti = bits.length - 1; - int bestcost = bits[besti] * 4; - int exceptcounter = 0; - for (int i = mini; i < bits.length - 1; ++i) { - int tmpcounter = 0; - final int maxv = 1 << bits[i]; - for (int k = pos; k < BlockSize + pos; ++k) - if (in[k] >= maxv) { - ++tmpcounter; - } - if (tmpcounter == BlockSize) - continue; // no need - for (int k = pos, c = 0; k < pos + BlockSize; ++k) - if (in[k] >= maxv) { - exceptbuffer[tmpcounter + c] = k - pos; - exceptbuffer[c] = in[k] >>> bits[i]; - ++c; - } - - final int thiscost = bits[i] * 4 - + S16.estimatecompress(exceptbuffer, 0, 2 * tmpcounter); - if (thiscost <= bestcost) { - bestcost = thiscost; - besti = i; - exceptcounter = tmpcounter; - } - } - - bestb.set(besti); - bestexcept.set(exceptcounter); - } - - private void encodePage(int[] in, IntWrapper inpos, int thissize, - int[] out, IntWrapper outpos) { - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); - IntWrapper bestb = new IntWrapper(); - IntWrapper bestexcept = new IntWrapper(); - for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { - getBestBFromData(in, tmpinpos, bestb, bestexcept); - int tmpbestb = bestb.get(); - int nbrexcept = bestexcept.get(); - int exceptsize = 0; - int remember = tmpoutpos; - tmpoutpos++; - if (nbrexcept > 0) { - final int maxv = 1 << bits[tmpbestb]; - int c = 0; - for (int i = 0; i < BlockSize; ++i) { - if (in[tmpinpos + i] >= maxv) { - exceptbuffer[c + nbrexcept] = i; - exceptbuffer[c] = in[tmpinpos + i] >>> bits[tmpbestb]; - ++c; - } - } - exceptsize = S16.compress(exceptbuffer, 0, 2 * nbrexcept, out, - tmpoutpos); - tmpoutpos += exceptsize; - } - out[remember] = tmpbestb | (nbrexcept << 8) | (exceptsize << 16); - for (int k = 0; k < BlockSize; k += 32) { - BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, - bits[tmpbestb]); - tmpoutpos += bits[tmpbestb]; - } - } - inpos.set(tmpinpos); - outpos.set(tmpoutpos); - } - - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); - int mynvalue = in[inpos.get()]; - inpos.increment(); - int finalout = outpos.get() + mynvalue; - while (outpos.get() != finalout) { - int thissize = finalout > PageSize + outpos.get() ? PageSize - : (finalout - outpos.get()); - decodePage(in, inpos, out, outpos, thissize); - } - } - - private void decodePage(int[] in, IntWrapper inpos, int[] out, - IntWrapper outpos, int thissize) { - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); - - for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { - final int b = in[tmpinpos] & 0xFF; - final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; - final int exceptsize = (in[tmpinpos] >>> 16); - ++tmpinpos; - S16.uncompress(in, tmpinpos, exceptsize, exceptbuffer, 0, - 2 * cexcept); - tmpinpos += exceptsize; - for (int k = 0; k < BlockSize; k += 32) { - BitPacking - .fastunpack(in, tmpinpos, out, tmpoutpos + k, bits[b]); - tmpinpos += bits[b]; - } - for (int k = 0; k < cexcept; ++k) { - out[tmpoutpos + exceptbuffer[k + cexcept]] |= (exceptbuffer[k] << bits[b]); - } - } - outpos.set(tmpoutpos); - inpos.set(tmpinpos); - } - - @Override - public String toString() { - return this.getClass().getName(); - } + final int PageSize; + final static int BlockSize = 128; + + int[] exceptbuffer = new int[2 * BlockSize]; + int[] sillybuffer = new int[2 * BlockSize]; + + public OptPFD() { + PageSize = 65536; + } + + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + // Util.assertTrue(inpos.get()+inlength <= in.length); + inlength = inlength / BlockSize * BlockSize; + + final int finalinpos = inpos.get() + inlength; + out[outpos.get()] = inlength; + outpos.increment(); + while (inpos.get() != finalinpos) { + int thissize = finalinpos > PageSize + inpos.get() ? PageSize + : (finalinpos - inpos.get()); + encodePage(in, inpos, thissize, out, outpos); + } + + } + + public static final int[] bits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 16, 20, 32}; + public static final int[] invbits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16}; + + void getBestBFromData(int[] in, int pos, IntWrapper bestb, + IntWrapper bestexcept) { + final int mb = Util.maxbits(in, pos, BlockSize); + int mini = 0; + if (mini + 28 < bits[invbits[mb]]) + mini = bits[invbits[mb]] - 28; // 28 is the max for exceptions + int besti = bits.length - 1; + int bestcost = bits[besti] * 4; + int exceptcounter = 0; + for (int i = mini; i < bits.length - 1; ++i) { + int tmpcounter = 0; + final int maxv = 1 << bits[i]; + for (int k = pos; k < BlockSize + pos; ++k) + if (in[k] >= maxv) { + ++tmpcounter; + } + if (tmpcounter == BlockSize) + continue; // no need + for (int k = pos, c = 0; k < pos + BlockSize; ++k) + if (in[k] >= maxv) { + exceptbuffer[tmpcounter + c] = k - pos; + exceptbuffer[c] = in[k] >>> bits[i]; + ++c; + } + + final int thiscost = bits[i] * 4 + + S16.estimatecompress(exceptbuffer, 0, 2 * tmpcounter); + if (thiscost <= bestcost) { + bestcost = thiscost; + besti = i; + exceptcounter = tmpcounter; + } + } + + bestb.set(besti); + bestexcept.set(exceptcounter); + } + + private void encodePage(int[] in, IntWrapper inpos, int thissize, + int[] out, IntWrapper outpos) { + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); + IntWrapper bestb = new IntWrapper(); + IntWrapper bestexcept = new IntWrapper(); + for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { + getBestBFromData(in, tmpinpos, bestb, bestexcept); + int tmpbestb = bestb.get(); + int nbrexcept = bestexcept.get(); + int exceptsize = 0; + int remember = tmpoutpos; + tmpoutpos++; + if (nbrexcept > 0) { + final int maxv = 1 << bits[tmpbestb]; + int c = 0; + for (int i = 0; i < BlockSize; ++i) { + if (in[tmpinpos + i] >= maxv) { + exceptbuffer[c + nbrexcept] = i; + exceptbuffer[c] = in[tmpinpos + i] >>> bits[tmpbestb]; + ++c; + } + } + exceptsize = S16.compress(exceptbuffer, 0, 2 * nbrexcept, out, + tmpoutpos); + tmpoutpos += exceptsize; + } + out[remember] = tmpbestb | (nbrexcept << 8) | (exceptsize << 16); + for (int k = 0; k < BlockSize; k += 32) { + BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, + bits[tmpbestb]); + tmpoutpos += bits[tmpbestb]; + } + } + inpos.set(tmpinpos); + outpos.set(tmpoutpos); + } + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + // Util.assertTrue(inpos.get()+inlength <= in.length); + int mynvalue = in[inpos.get()]; + inpos.increment(); + int finalout = outpos.get() + mynvalue; + while (outpos.get() != finalout) { + int thissize = finalout > PageSize + outpos.get() ? PageSize + : (finalout - outpos.get()); + decodePage(in, inpos, out, outpos, thissize); + } + } + + private void decodePage(int[] in, IntWrapper inpos, int[] out, + IntWrapper outpos, int thissize) { + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); + + for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { + final int b = in[tmpinpos] & 0xFF; + final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; + final int exceptsize = (in[tmpinpos] >>> 16); + ++tmpinpos; + S16.uncompress(in, tmpinpos, exceptsize, exceptbuffer, 0, + 2 * cexcept); + tmpinpos += exceptsize; + for (int k = 0; k < BlockSize; k += 32) { + BitPacking + .fastunpack(in, tmpinpos, out, tmpoutpos + k, bits[b]); + tmpinpos += bits[b]; + } + for (int k = 0; k < cexcept; ++k) { + out[tmpoutpos + exceptbuffer[k + cexcept]] |= (exceptbuffer[k] << bits[b]); + } + } + outpos.set(tmpoutpos); + inpos.set(tmpinpos); + } + + @Override + public String toString() { + return this.getClass().getName(); + } } diff --git a/src/main/java/me/lemire/integercompression/OptPFDS9.java b/src/main/java/me/lemire/integercompression/OptPFDS9.java index 4090ec5..5a967d3 100644 --- a/src/main/java/me/lemire/integercompression/OptPFDS9.java +++ b/src/main/java/me/lemire/integercompression/OptPFDS9.java @@ -9,167 +9,166 @@ /** * OptPFD implemented by Daniel Lemire - * + *

* Follows: - * + *

* H. Yan, S. Ding, T. Suel, Inverted index compression and query processing * with optimized document ordering, in: WWW 09, 2009, pp. 401--410. - * + *

* using Simple9 as the secondary coder. - * + * * @author Daniel Lemire - * */ public final class OptPFDS9 implements IntegerCODEC { - final int PageSize; - final static int BlockSize = 128; - int[] exceptbuffer = new int[2 * BlockSize]; + final int PageSize; + final static int BlockSize = 128; + int[] exceptbuffer = new int[2 * BlockSize]; - public OptPFDS9() { - PageSize = 65536; - } + public OptPFDS9() { + PageSize = 65536; + } - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); - inlength = inlength / BlockSize * BlockSize; + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + // Util.assertTrue(inpos.get()+inlength <= in.length); + inlength = inlength / BlockSize * BlockSize; - final int finalinpos = inpos.get() + inlength; - out[outpos.get()] = inlength; - outpos.increment(); - while (inpos.get() != finalinpos) { - int thissize = finalinpos > PageSize + inpos.get() ? PageSize - : (finalinpos - inpos.get()); - encodePage(in, inpos, thissize, out, outpos); - } + final int finalinpos = inpos.get() + inlength; + out[outpos.get()] = inlength; + outpos.increment(); + while (inpos.get() != finalinpos) { + int thissize = finalinpos > PageSize + inpos.get() ? PageSize + : (finalinpos - inpos.get()); + encodePage(in, inpos, thissize, out, outpos); + } - } + } - public static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 16, 20, 32 }; - public static final int[] invbits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16 }; + public static final int[] bits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 16, 20, 32}; + public static final int[] invbits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16}; - void getBestBFromData(int[] in, int pos, IntWrapper bestb, - IntWrapper bestexcept) { - final int mb = Util.maxbits(in, pos, BlockSize); - int mini = 0; - if (mini + 28 < bits[invbits[mb]]) - mini = bits[invbits[mb]] - 28; // 28 is the max for exceptions - int besti = bits.length - 1; - int bestcost = bits[besti] * 4; - int exceptcounter = 0; - for (int i = mini; i < bits.length - 1; ++i) { - int tmpcounter = 0; - final int maxv = 1 << bits[i]; - for (int k = pos; k < BlockSize + pos; ++k) - if (in[k] >= maxv) { - ++tmpcounter; - } - if (tmpcounter == BlockSize) - continue; // no need - for (int k = pos, c = 0; k < pos + BlockSize; ++k) - if (in[k] >= maxv) { - exceptbuffer[tmpcounter + c] = k - pos; - exceptbuffer[c] = in[k] >>> bits[i]; - ++c; - } + void getBestBFromData(int[] in, int pos, IntWrapper bestb, + IntWrapper bestexcept) { + final int mb = Util.maxbits(in, pos, BlockSize); + int mini = 0; + if (mini + 28 < bits[invbits[mb]]) + mini = bits[invbits[mb]] - 28; // 28 is the max for exceptions + int besti = bits.length - 1; + int bestcost = bits[besti] * 4; + int exceptcounter = 0; + for (int i = mini; i < bits.length - 1; ++i) { + int tmpcounter = 0; + final int maxv = 1 << bits[i]; + for (int k = pos; k < BlockSize + pos; ++k) + if (in[k] >= maxv) { + ++tmpcounter; + } + if (tmpcounter == BlockSize) + continue; // no need + for (int k = pos, c = 0; k < pos + BlockSize; ++k) + if (in[k] >= maxv) { + exceptbuffer[tmpcounter + c] = k - pos; + exceptbuffer[c] = in[k] >>> bits[i]; + ++c; + } - final int thiscost = bits[i] * 4 - + S9.estimatecompress(exceptbuffer, 0, 2 * tmpcounter); - if (thiscost <= bestcost) { - bestcost = thiscost; - besti = i; - exceptcounter = tmpcounter; - } - } - bestb.set(besti); - bestexcept.set(exceptcounter); - } + final int thiscost = bits[i] * 4 + + S9.estimatecompress(exceptbuffer, 0, 2 * tmpcounter); + if (thiscost <= bestcost) { + bestcost = thiscost; + besti = i; + exceptcounter = tmpcounter; + } + } + bestb.set(besti); + bestexcept.set(exceptcounter); + } - private void encodePage(int[] in, IntWrapper inpos, int thissize, - int[] out, IntWrapper outpos) { - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); - IntWrapper bestb = new IntWrapper(); - IntWrapper bestexcept = new IntWrapper(); - for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { - getBestBFromData(in, tmpinpos, bestb, bestexcept); - int tmpbestb = bestb.get(); - int nbrexcept = bestexcept.get(); - int exceptsize = 0; - int remember = tmpoutpos; - tmpoutpos++; - if (nbrexcept > 0) { - final int maxv = 1 << bits[tmpbestb]; - int c = 0; - for (int i = 0; i < BlockSize; ++i) { - if (in[tmpinpos + i] >= maxv) { - exceptbuffer[c + nbrexcept] = i; - exceptbuffer[c] = in[tmpinpos + i] >>> bits[tmpbestb]; - ++c; - } - } - exceptsize = S9.compress(exceptbuffer, 0, 2 * nbrexcept, out, - tmpoutpos); - tmpoutpos += exceptsize; - } - out[remember] = tmpbestb | (nbrexcept << 8) | (exceptsize << 16); - for (int k = 0; k < BlockSize; k += 32) { - BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, - bits[tmpbestb]); - tmpoutpos += bits[tmpbestb]; - } - } - inpos.set(tmpinpos); - outpos.set(tmpoutpos); - } + private void encodePage(int[] in, IntWrapper inpos, int thissize, + int[] out, IntWrapper outpos) { + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); + IntWrapper bestb = new IntWrapper(); + IntWrapper bestexcept = new IntWrapper(); + for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { + getBestBFromData(in, tmpinpos, bestb, bestexcept); + int tmpbestb = bestb.get(); + int nbrexcept = bestexcept.get(); + int exceptsize = 0; + int remember = tmpoutpos; + tmpoutpos++; + if (nbrexcept > 0) { + final int maxv = 1 << bits[tmpbestb]; + int c = 0; + for (int i = 0; i < BlockSize; ++i) { + if (in[tmpinpos + i] >= maxv) { + exceptbuffer[c + nbrexcept] = i; + exceptbuffer[c] = in[tmpinpos + i] >>> bits[tmpbestb]; + ++c; + } + } + exceptsize = S9.compress(exceptbuffer, 0, 2 * nbrexcept, out, + tmpoutpos); + tmpoutpos += exceptsize; + } + out[remember] = tmpbestb | (nbrexcept << 8) | (exceptsize << 16); + for (int k = 0; k < BlockSize; k += 32) { + BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, + bits[tmpbestb]); + tmpoutpos += bits[tmpbestb]; + } + } + inpos.set(tmpinpos); + outpos.set(tmpoutpos); + } - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); - int mynvalue = in[inpos.get()]; - inpos.increment(); - int finalout = outpos.get() + mynvalue; - while (outpos.get() != finalout) { - int thissize = finalout > PageSize + outpos.get() ? PageSize - : (finalout - outpos.get()); - decodePage(in, inpos, out, outpos, thissize); - } - } + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + // Util.assertTrue(inpos.get()+inlength <= in.length); + int mynvalue = in[inpos.get()]; + inpos.increment(); + int finalout = outpos.get() + mynvalue; + while (outpos.get() != finalout) { + int thissize = finalout > PageSize + outpos.get() ? PageSize + : (finalout - outpos.get()); + decodePage(in, inpos, out, outpos, thissize); + } + } - private void decodePage(int[] in, IntWrapper inpos, int[] out, - IntWrapper outpos, int thissize) { - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); + private void decodePage(int[] in, IntWrapper inpos, int[] out, + IntWrapper outpos, int thissize) { + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); - for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { - final int b = in[tmpinpos] & 0xFF; - final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; - final int exceptsize = (in[tmpinpos] >>> 16); - ++tmpinpos; - S9.uncompress(in, tmpinpos, exceptsize, exceptbuffer, 0, - 2 * cexcept); - tmpinpos += exceptsize; - for (int k = 0; k < BlockSize; k += 32) { - BitPacking - .fastunpack(in, tmpinpos, out, tmpoutpos + k, bits[b]); - tmpinpos += bits[b]; - } - for (int k = 0; k < cexcept; ++k) { - out[tmpoutpos + exceptbuffer[k + cexcept]] |= (exceptbuffer[k] << bits[b]); - } - } - outpos.set(tmpoutpos); - inpos.set(tmpinpos); - } + for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { + final int b = in[tmpinpos] & 0xFF; + final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; + final int exceptsize = (in[tmpinpos] >>> 16); + ++tmpinpos; + S9.uncompress(in, tmpinpos, exceptsize, exceptbuffer, 0, + 2 * cexcept); + tmpinpos += exceptsize; + for (int k = 0; k < BlockSize; k += 32) { + BitPacking + .fastunpack(in, tmpinpos, out, tmpoutpos + k, bits[b]); + tmpinpos += bits[b]; + } + for (int k = 0; k < cexcept; ++k) { + out[tmpoutpos + exceptbuffer[k + cexcept]] |= (exceptbuffer[k] << bits[b]); + } + } + outpos.set(tmpoutpos); + inpos.set(tmpinpos); + } - @Override - public String toString() { - return this.getClass().getName(); - } + @Override + public String toString() { + return this.getClass().getName(); + } } \ No newline at end of file diff --git a/src/main/java/me/lemire/integercompression/S16.java b/src/main/java/me/lemire/integercompression/S16.java index fe5a9db..7f30d53 100644 --- a/src/main/java/me/lemire/integercompression/S16.java +++ b/src/main/java/me/lemire/integercompression/S16.java @@ -9,163 +9,153 @@ /** * Version of Simple16 for NewPFD and OptPFD. - * + *

* Adapted by D. Lemire from the Apache Lucene project. */ public final class S16 { - public static int compress(int[] in, int currentPos, int inlength, - int out[], int tmpoutpos) { - int outpos = tmpoutpos; - final int finalin = currentPos + inlength; - while (currentPos < finalin) { - int inoffset = compressblock(out, outpos++, in, currentPos, - inlength); - if (inoffset == -1) - throw new RuntimeException("Too big a number"); - currentPos += inoffset; - inlength -= inoffset; - } - return outpos - tmpoutpos; - } - - public static int estimatecompress(int[] in, int currentPos, int inlength) { - final int finalin = currentPos + inlength; - int counter = 0; - while (currentPos < finalin) { - int inoffset = fakecompressblock(in, currentPos, inlength); - if (inoffset == -1) - throw new RuntimeException("Too big a number"); - currentPos += inoffset; - inlength -= inoffset; - ++counter; - } - return counter; - } - - /** - * Compress an integer array using Simple16 - * - * @param out - * the compressed output - * @param outOffset - * the offset of the output in the number of integers - * @param in - * the integer input array - * @param inOffset - * the offset of the input in the number of integers - * @param n - * the number of elements to be compressed - * @return the number of compressed integers - */ - public static final int compressblock(int[] out, int outOffset, int[] in, - int inOffset, int n) { - int numIdx, j, num, bits; - for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { - out[outOffset] = numIdx << S16_BITSSIZE; - num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; - - for (j = 0, bits = 0; (j < num) - && (in[inOffset + j] < SHIFTED_S16_BITS[numIdx][j]);) { - out[outOffset] |= (in[inOffset + j] << bits); - bits += S16_BITS[numIdx][j]; - j++; - } - - if (j == num) { - return num; - } - } - - return -1; - } - - public static final int fakecompressblock(int[] in, int inOffset, int n) { - int numIdx, j, num; - for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { - num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; - - for (j = 0; (j < num) - && (in[inOffset + j] < SHIFTED_S16_BITS[numIdx][j]);) { - j++; - } - - if (j == num) { - return num; - } - } - - return -1; - } - - /** - * Decompress an integer array using Simple16 - * - * @param out - * the decompressed output - * @param outOffset - * the offset of the output in the number of integers - * @param in - * the compressed input array - * @param inOffset - * the offset of the input in the number of integers - * @param n - * the number of elements to be compressed - * @return the number of processed integers - */ - public static final int decompressblock(int[] out, int outOffset, int[] in, - int inOffset, int n) { - int numIdx, j = 0, bits = 0; - numIdx = in[inOffset] >>> S16_BITSSIZE; - int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; - for (j = 0, bits = 0; j < num; j++) { - out[outOffset + j] = (in[inOffset] >>> bits) - & (0xffffffff >>> (32 - S16_BITS[numIdx][j])); - bits += S16_BITS[numIdx][j]; - } - return num; - } - - public static void uncompress(int[] in, int tmpinpos, int inlength, - int[] out, int currentPos, int outlength) { - final int finalpos = tmpinpos + inlength; - while (tmpinpos < finalpos) { - final int howmany = decompressblock(out, currentPos, in, tmpinpos, - outlength); - outlength -= howmany; - currentPos += howmany; - tmpinpos += 1; - } - - } - - private static int[][] shiftme(int[][] x) { - int[][] answer = new int[x.length][]; - for (int k = 0; k < x.length; ++k) { - answer[k] = new int[x[k].length]; - for (int z = 0; z < answer[k].length; ++z) - answer[k][z] = 1 << x[k][z]; - } - return answer; - } - - private static final int S16_NUMSIZE = 16; - private static final int S16_BITSSIZE = 28; - // the possible number of bits used to represent one integer - private static final int[] S16_NUM = { 28, 21, 21, 21, 14, 9, 8, 7, 6, 6, - 5, 5, 4, 3, 2, 1 }; - // the corresponding number of elements for each value of the number of bits - private static final int[][] S16_BITS = { - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1 }, - { 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, - { 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1 }, - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2 }, - { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, - { 4, 3, 3, 3, 3, 3, 3, 3, 3 }, { 3, 4, 4, 4, 4, 3, 3, 3 }, - { 4, 4, 4, 4, 4, 4, 4 }, { 5, 5, 5, 5, 4, 4 }, - { 4, 4, 5, 5, 5, 5 }, { 6, 6, 6, 5, 5 }, { 5, 5, 6, 6, 6 }, - { 7, 7, 7, 7 }, { 10, 9, 9, }, { 14, 14 }, { 28 } }; - private static final int[][] SHIFTED_S16_BITS = shiftme(S16_BITS); + public static int compress(int[] in, int currentPos, int inlength, + int out[], int tmpoutpos) { + int outpos = tmpoutpos; + final int finalin = currentPos + inlength; + while (currentPos < finalin) { + int inoffset = compressblock(out, outpos++, in, currentPos, + inlength); + if (inoffset == -1) + throw new RuntimeException("Too big a number"); + currentPos += inoffset; + inlength -= inoffset; + } + return outpos - tmpoutpos; + } + + public static int estimatecompress(int[] in, int currentPos, int inlength) { + final int finalin = currentPos + inlength; + int counter = 0; + while (currentPos < finalin) { + int inoffset = fakecompressblock(in, currentPos, inlength); + if (inoffset == -1) + throw new RuntimeException("Too big a number"); + currentPos += inoffset; + inlength -= inoffset; + ++counter; + } + return counter; + } + + /** + * Compress an integer array using Simple16 + * + * @param out the compressed output + * @param outOffset the offset of the output in the number of integers + * @param in the integer input array + * @param inOffset the offset of the input in the number of integers + * @param n the number of elements to be compressed + * @return the number of compressed integers + */ + public static final int compressblock(int[] out, int outOffset, int[] in, + int inOffset, int n) { + int numIdx, j, num, bits; + for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { + out[outOffset] = numIdx << S16_BITSSIZE; + num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; + + for (j = 0, bits = 0; (j < num) + && (in[inOffset + j] < SHIFTED_S16_BITS[numIdx][j]); ) { + out[outOffset] |= (in[inOffset + j] << bits); + bits += S16_BITS[numIdx][j]; + j++; + } + + if (j == num) { + return num; + } + } + + return -1; + } + + public static final int fakecompressblock(int[] in, int inOffset, int n) { + int numIdx, j, num; + for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { + num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; + + for (j = 0; (j < num) + && (in[inOffset + j] < SHIFTED_S16_BITS[numIdx][j]); ) { + j++; + } + + if (j == num) { + return num; + } + } + + return -1; + } + + /** + * Decompress an integer array using Simple16 + * + * @param out the decompressed output + * @param outOffset the offset of the output in the number of integers + * @param in the compressed input array + * @param inOffset the offset of the input in the number of integers + * @param n the number of elements to be compressed + * @return the number of processed integers + */ + public static final int decompressblock(int[] out, int outOffset, int[] in, + int inOffset, int n) { + int numIdx, j = 0, bits = 0; + numIdx = in[inOffset] >>> S16_BITSSIZE; + int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; + for (j = 0, bits = 0; j < num; j++) { + out[outOffset + j] = (in[inOffset] >>> bits) + & (0xffffffff >>> (32 - S16_BITS[numIdx][j])); + bits += S16_BITS[numIdx][j]; + } + return num; + } + + public static void uncompress(int[] in, int tmpinpos, int inlength, + int[] out, int currentPos, int outlength) { + final int finalpos = tmpinpos + inlength; + while (tmpinpos < finalpos) { + final int howmany = decompressblock(out, currentPos, in, tmpinpos, + outlength); + outlength -= howmany; + currentPos += howmany; + tmpinpos += 1; + } + + } + + private static int[][] shiftme(int[][] x) { + int[][] answer = new int[x.length][]; + for (int k = 0; k < x.length; ++k) { + answer[k] = new int[x[k].length]; + for (int z = 0; z < answer[k].length; ++z) + answer[k][z] = 1 << x[k][z]; + } + return answer; + } + + private static final int S16_NUMSIZE = 16; + private static final int S16_BITSSIZE = 28; + // the possible number of bits used to represent one integer + private static final int[] S16_NUM = {28, 21, 21, 21, 14, 9, 8, 7, 6, 6, + 5, 5, 4, 3, 2, 1}; + // the corresponding number of elements for each value of the number of bits + private static final int[][] S16_BITS = { + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2}, + {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, + {4, 3, 3, 3, 3, 3, 3, 3, 3}, {3, 4, 4, 4, 4, 3, 3, 3}, + {4, 4, 4, 4, 4, 4, 4}, {5, 5, 5, 5, 4, 4}, + {4, 4, 5, 5, 5, 5}, {6, 6, 6, 5, 5}, {5, 5, 6, 6, 6}, + {7, 7, 7, 7}, {10, 9, 9,}, {14, 14}, {28}}; + private static final int[][] SHIFTED_S16_BITS = shiftme(S16_BITS); } diff --git a/src/main/java/me/lemire/integercompression/S9.java b/src/main/java/me/lemire/integercompression/S9.java index 1fb9a77..7cc6acc 100644 --- a/src/main/java/me/lemire/integercompression/S9.java +++ b/src/main/java/me/lemire/integercompression/S9.java @@ -8,167 +8,169 @@ /** * This is a version of Simple9 optimized for NewPFOR, OptPFOR - * + * * @author Daniel Lemire - * */ public final class S9 { - public static int estimatecompress(int[] in, int currentPos, int inlength) { - int tmpoutpos = 0; - int finalpos = currentPos + inlength; - outer: while (currentPos < finalpos) { - mainloop: for (int selector = 0; selector < 8; selector++) { + public static int estimatecompress(int[] in, int currentPos, int inlength) { + int tmpoutpos = 0; + int finalpos = currentPos + inlength; + outer: + while (currentPos < finalpos) { + mainloop: + for (int selector = 0; selector < 8; selector++) { - int compressedNum = codeNum[selector]; - if (finalpos <= currentPos + compressedNum - 1) - compressedNum = finalpos - currentPos; - int b = bitLength[selector]; - int max = 1 << b; - int i = 0; - for (; i < compressedNum; i++) - if (max <= in[currentPos + i]) - continue mainloop; - currentPos += compressedNum; - ++tmpoutpos; - continue outer; - } - final int selector = 8; - // Util.assertTrue(codeNum[selector] == 1); - if (in[currentPos] >= 1 << bitLength[selector]) - throw new RuntimeException("Too big a number"); - tmpoutpos++; - currentPos++; + int compressedNum = codeNum[selector]; + if (finalpos <= currentPos + compressedNum - 1) + compressedNum = finalpos - currentPos; + int b = bitLength[selector]; + int max = 1 << b; + int i = 0; + for (; i < compressedNum; i++) + if (max <= in[currentPos + i]) + continue mainloop; + currentPos += compressedNum; + ++tmpoutpos; + continue outer; + } + final int selector = 8; + // Util.assertTrue(codeNum[selector] == 1); + if (in[currentPos] >= 1 << bitLength[selector]) + throw new RuntimeException("Too big a number"); + tmpoutpos++; + currentPos++; + } + return tmpoutpos; } - return tmpoutpos; - } - public static int compress(int[] in, int currentPos, int inlength, int out[], - int tmpoutpos) { - int origtmpoutpos = tmpoutpos; - int finalpos = currentPos + inlength; - outer: while (currentPos < finalpos) { - mainloop: for (int selector = 0; selector < 8; selector++) { - int res = 0; - int compressedNum = codeNum[selector]; - if (finalpos <= currentPos + compressedNum - 1) - compressedNum = finalpos - currentPos; - int b = bitLength[selector]; - int max = 1 << b; - int i = 0; - for (; i < compressedNum; i++) { - if (max <= in[currentPos + i]) - continue mainloop; - res = (res << b) + in[currentPos + i]; + public static int compress(int[] in, int currentPos, int inlength, int out[], + int tmpoutpos) { + int origtmpoutpos = tmpoutpos; + int finalpos = currentPos + inlength; + outer: + while (currentPos < finalpos) { + mainloop: + for (int selector = 0; selector < 8; selector++) { + int res = 0; + int compressedNum = codeNum[selector]; + if (finalpos <= currentPos + compressedNum - 1) + compressedNum = finalpos - currentPos; + int b = bitLength[selector]; + int max = 1 << b; + int i = 0; + for (; i < compressedNum; i++) { + if (max <= in[currentPos + i]) + continue mainloop; + res = (res << b) + in[currentPos + i]; + } + if (compressedNum != codeNum[selector]) + res <<= (codeNum[selector] - compressedNum) * b; + res |= selector << 28; + out[tmpoutpos++] = res; + currentPos += compressedNum; + continue outer; + } + final int selector = 8; + // Util.assertTrue(codeNum[selector] == 1); + if (in[currentPos] >= 1 << bitLength[selector]) + throw new RuntimeException("Too big a number"); + out[tmpoutpos++] = in[currentPos++] | (selector << 28); } - if (compressedNum != codeNum[selector]) - res <<= (codeNum[selector] - compressedNum) * b; - res |= selector << 28; - out[tmpoutpos++] = res; - currentPos += compressedNum; - continue outer; - } - final int selector = 8; - // Util.assertTrue(codeNum[selector] == 1); - if (in[currentPos] >= 1 << bitLength[selector]) - throw new RuntimeException("Too big a number"); - out[tmpoutpos++] = in[currentPos++] | (selector << 28); + // Util.assertTrue(currentPos == finalpos); + return tmpoutpos - origtmpoutpos; } - // Util.assertTrue(currentPos == finalpos); - return tmpoutpos - origtmpoutpos; - } - public static void uncompress(int[] in, int tmpinpos, int inlength, - int[] out, int currentPos, int outlength) { - int finallength = currentPos + outlength; + public static void uncompress(int[] in, int tmpinpos, int inlength, + int[] out, int currentPos, int outlength) { + int finallength = currentPos + outlength; - while (currentPos < finallength) { - int val = in[tmpinpos++]; - int header = val >>> 28; - switch (header) { - case 0: { // number : 28, bitwidth : 1 - final int howmany = finallength - currentPos < 28 ? finallength - - currentPos : 28; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (k + 4)) >>> 31; - } - break; - } - case 1: { // number : 14, bitwidth : 2 - final int howmany = finallength - currentPos < 14 ? finallength - - currentPos : 14; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (2 * k + 4)) >>> 30; - } - break; - } - case 2: { // number : 9, bitwidth : 3 - final int howmany = finallength - currentPos < 9 ? finallength - - currentPos : 9; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (3 * k + 5)) >>> 29; - } - break; - } - case 3: { // number : 7, bitwidth : 4 - final int howmany = finallength - currentPos < 7 ? finallength - - currentPos : 7; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (4 * k + 4)) >>> 28; + while (currentPos < finallength) { + int val = in[tmpinpos++]; + int header = val >>> 28; + switch (header) { + case 0: { // number : 28, bitwidth : 1 + final int howmany = finallength - currentPos < 28 ? finallength + - currentPos : 28; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (k + 4)) >>> 31; + } + break; + } + case 1: { // number : 14, bitwidth : 2 + final int howmany = finallength - currentPos < 14 ? finallength + - currentPos : 14; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (2 * k + 4)) >>> 30; + } + break; + } + case 2: { // number : 9, bitwidth : 3 + final int howmany = finallength - currentPos < 9 ? finallength + - currentPos : 9; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (3 * k + 5)) >>> 29; + } + break; + } + case 3: { // number : 7, bitwidth : 4 + final int howmany = finallength - currentPos < 7 ? finallength + - currentPos : 7; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (4 * k + 4)) >>> 28; + } + break; + } + case 4: { // number : 5, bitwidth : 5 + final int howmany = finallength - currentPos < 5 ? finallength + - currentPos : 5; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (5 * k + 7)) >>> 27; + } + break; + } + case 5: { // number : 4, bitwidth : 7 + final int howmany = finallength - currentPos < 4 ? finallength + - currentPos : 4; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (7 * k + 4)) >>> 25; + } + break; + } + case 6: { // number : 3, bitwidth : 9 + final int howmany = finallength - currentPos < 3 ? finallength + - currentPos : 3; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (9 * k + 5)) >>> 23; + } + break; + } + case 7: { // number : 2, bitwidth : 14 + final int howmany = finallength - currentPos < 2 ? finallength + - currentPos : 2; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (14 * k + 4)) >>> 18; + } + break; + } + case 8: { // number : 1, bitwidth : 28 + out[currentPos++] = (val << 4) >>> 4; + break; + } + default: { + throw new RuntimeException("shouldn't happen"); + } + } } - break; - } - case 4: { // number : 5, bitwidth : 5 - final int howmany = finallength - currentPos < 5 ? finallength - - currentPos : 5; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (5 * k + 7)) >>> 27; - } - break; - } - case 5: { // number : 4, bitwidth : 7 - final int howmany = finallength - currentPos < 4 ? finallength - - currentPos : 4; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (7 * k + 4)) >>> 25; - } - break; - } - case 6: { // number : 3, bitwidth : 9 - final int howmany = finallength - currentPos < 3 ? finallength - - currentPos : 3; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (9 * k + 5)) >>> 23; - } - break; - } - case 7: { // number : 2, bitwidth : 14 - final int howmany = finallength - currentPos < 2 ? finallength - - currentPos : 2; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (14 * k + 4)) >>> 18; - } - break; - } - case 8: { // number : 1, bitwidth : 28 - out[currentPos++] = (val << 4) >>> 4; - break; - } - default: { - throw new RuntimeException("shouldn't happen"); - } - } + // Util.assertTrue(currentPos == finallength); + // Util.assertTrue(tmpinpos <= finalin); + } - // Util.assertTrue(currentPos == finallength); - // Util.assertTrue(tmpinpos <= finalin); - } - - private final static int bitLength[] = { 1, 2, 3, 4, 5, 7, 9, 14, 28 }; + private final static int bitLength[] = {1, 2, 3, 4, 5, 7, 9, 14, 28}; - private final static int codeNum[] = { 28, 14, 9, 7, 5, 4, 3, 2, 1 }; + private final static int codeNum[] = {28, 14, 9, 7, 5, 4, 3, 2, 1}; - } diff --git a/src/main/java/me/lemire/integercompression/Simple9.java b/src/main/java/me/lemire/integercompression/Simple9.java index 35d6fbc..7642ff3 100644 --- a/src/main/java/me/lemire/integercompression/Simple9.java +++ b/src/main/java/me/lemire/integercompression/Simple9.java @@ -9,280 +9,284 @@ public final class Simple9 implements IntegerCODEC { - // @Override - @Override -public void compress(int[] in, IntWrapper inpos, int inlength, int out[], - IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); - int tmpoutpos = outpos.get(); - int currentPos = inpos.get(); - out[tmpoutpos++] = inlength; - final int finalin = currentPos + inlength; - // Util.assertTrue(finalin <= in.length); - outer: while (currentPos < finalin - 28) { - mainloop: for (int selector = 0; selector < 8; selector++) { + // @Override + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int out[], + IntWrapper outpos) { + // Util.assertTrue(inpos.get()+inlength <= in.length); + int tmpoutpos = outpos.get(); + int currentPos = inpos.get(); + out[tmpoutpos++] = inlength; + final int finalin = currentPos + inlength; + // Util.assertTrue(finalin <= in.length); + outer: + while (currentPos < finalin - 28) { + mainloop: + for (int selector = 0; selector < 8; selector++) { - int res = 0; - int compressedNum = codeNum[selector]; - int b = bitLength[selector]; - int max = 1 << b; - int i = 0; - for (; i < compressedNum; i++) { - if (max <= in[currentPos + i]) - continue mainloop; - res = (res << b) + in[currentPos + i]; - } - res |= selector << 28; - out[tmpoutpos++] = res; - currentPos += compressedNum; - continue outer; - } - final int selector = 8; - if (in[currentPos] >= 1 << bitLength[selector]) - throw new RuntimeException("Too big a number"); - out[tmpoutpos++] = in[currentPos++] | (selector << 28); - } - outer: while (currentPos < finalin) { - mainloop: for (int selector = 0; selector < 8; selector++) { - int res = 0; - int compressedNum = codeNum[selector]; - if (finalin <= currentPos + compressedNum - 1) - compressedNum = finalin - currentPos; - int b = bitLength[selector]; - int max = 1 << b; - int i = 0; - for (; i < compressedNum; i++) { - if (max <= in[currentPos + i]) - continue mainloop; - res = (res << b) + in[currentPos + i]; + int res = 0; + int compressedNum = codeNum[selector]; + int b = bitLength[selector]; + int max = 1 << b; + int i = 0; + for (; i < compressedNum; i++) { + if (max <= in[currentPos + i]) + continue mainloop; + res = (res << b) + in[currentPos + i]; + } + res |= selector << 28; + out[tmpoutpos++] = res; + currentPos += compressedNum; + continue outer; + } + final int selector = 8; + if (in[currentPos] >= 1 << bitLength[selector]) + throw new RuntimeException("Too big a number"); + out[tmpoutpos++] = in[currentPos++] | (selector << 28); } + outer: + while (currentPos < finalin) { + mainloop: + for (int selector = 0; selector < 8; selector++) { + int res = 0; + int compressedNum = codeNum[selector]; + if (finalin <= currentPos + compressedNum - 1) + compressedNum = finalin - currentPos; + int b = bitLength[selector]; + int max = 1 << b; + int i = 0; + for (; i < compressedNum; i++) { + if (max <= in[currentPos + i]) + continue mainloop; + res = (res << b) + in[currentPos + i]; + } - if (compressedNum != codeNum[selector]) - res <<= (codeNum[selector] - compressedNum) * b; - res |= selector << 28; - out[tmpoutpos++] = res; - currentPos += compressedNum; - continue outer; - } - final int selector = 8; - // Util.assertTrue(codeNum[selector] == 1); - if (in[currentPos] >= 1 << bitLength[selector]) - throw new RuntimeException("Too big a number"); - out[tmpoutpos++] = in[currentPos++] | (selector << 28); + if (compressedNum != codeNum[selector]) + res <<= (codeNum[selector] - compressedNum) * b; + res |= selector << 28; + out[tmpoutpos++] = res; + currentPos += compressedNum; + continue outer; + } + final int selector = 8; + // Util.assertTrue(codeNum[selector] == 1); + if (in[currentPos] >= 1 << bitLength[selector]) + throw new RuntimeException("Too big a number"); + out[tmpoutpos++] = in[currentPos++] | (selector << 28); + } + // Util.assertTrue(currentPos == finalin); + inpos.set(currentPos); + outpos.set(tmpoutpos); } - // Util.assertTrue(currentPos == finalin); - inpos.set(currentPos); - outpos.set(tmpoutpos); - } - // @Override - @Override -public void uncompress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); - int currentPos = outpos.get(); - int tmpinpos = inpos.get(); - final int finalout = currentPos + in[tmpinpos++]; - // Util.assertTrue(finalout <= out.length); - while (currentPos < finalout - 28) { - int val = in[tmpinpos++]; - int header = val >>> 28; - switch (header) { - case 0: { // number : 28, bitwidth : 1 - out[currentPos++] = (val << 4) >>> 31; - out[currentPos++] = (val << 5) >>> 31; - out[currentPos++] = (val << 6) >>> 31; - out[currentPos++] = (val << 7) >>> 31; - out[currentPos++] = (val << 8) >>> 31; - out[currentPos++] = (val << 9) >>> 31; - out[currentPos++] = (val << 10) >>> 31; - out[currentPos++] = (val << 11) >>> 31; - out[currentPos++] = (val << 12) >>> 31; - out[currentPos++] = (val << 13) >>> 31; // 10 - out[currentPos++] = (val << 14) >>> 31; - out[currentPos++] = (val << 15) >>> 31; - out[currentPos++] = (val << 16) >>> 31; - out[currentPos++] = (val << 17) >>> 31; - out[currentPos++] = (val << 18) >>> 31; - out[currentPos++] = (val << 19) >>> 31; - out[currentPos++] = (val << 20) >>> 31; - out[currentPos++] = (val << 21) >>> 31; - out[currentPos++] = (val << 22) >>> 31; - out[currentPos++] = (val << 23) >>> 31; // 20 - out[currentPos++] = (val << 24) >>> 31; - out[currentPos++] = (val << 25) >>> 31; - out[currentPos++] = (val << 26) >>> 31; - out[currentPos++] = (val << 27) >>> 31; - out[currentPos++] = (val << 28) >>> 31; - out[currentPos++] = (val << 29) >>> 31; - out[currentPos++] = (val << 30) >>> 31; - out[currentPos++] = (val << 31) >>> 31; - break; - } - case 1: { // number : 14, bitwidth : 2 - out[currentPos++] = (val << 4) >>> 30; - out[currentPos++] = (val << 6) >>> 30; - out[currentPos++] = (val << 8) >>> 30; - out[currentPos++] = (val << 10) >>> 30; - out[currentPos++] = (val << 12) >>> 30; - out[currentPos++] = (val << 14) >>> 30; - out[currentPos++] = (val << 16) >>> 30; - out[currentPos++] = (val << 18) >>> 30; - out[currentPos++] = (val << 20) >>> 30; - out[currentPos++] = (val << 22) >>> 30; // 10 - out[currentPos++] = (val << 24) >>> 30; - out[currentPos++] = (val << 26) >>> 30; - out[currentPos++] = (val << 28) >>> 30; - out[currentPos++] = (val << 30) >>> 30; - break; - } - case 2: { // number : 9, bitwidth : 3 - out[currentPos++] = (val << 5) >>> 29; - out[currentPos++] = (val << 8) >>> 29; - out[currentPos++] = (val << 11) >>> 29; - out[currentPos++] = (val << 14) >>> 29; - out[currentPos++] = (val << 17) >>> 29; - out[currentPos++] = (val << 20) >>> 29; - out[currentPos++] = (val << 23) >>> 29; - out[currentPos++] = (val << 26) >>> 29; - out[currentPos++] = (val << 29) >>> 29; - break; - } - case 3: { // number : 7, bitwidth : 4 - out[currentPos++] = (val << 4) >>> 28; - out[currentPos++] = (val << 8) >>> 28; - out[currentPos++] = (val << 12) >>> 28; - out[currentPos++] = (val << 16) >>> 28; - out[currentPos++] = (val << 20) >>> 28; - out[currentPos++] = (val << 24) >>> 28; - out[currentPos++] = (val << 28) >>> 28; - break; - } - case 4: { // number : 5, bitwidth : 5 - out[currentPos++] = (val << 7) >>> 27; - out[currentPos++] = (val << 12) >>> 27; - out[currentPos++] = (val << 17) >>> 27; - out[currentPos++] = (val << 22) >>> 27; - out[currentPos++] = (val << 27) >>> 27; - break; - } - case 5: { // number : 4, bitwidth : 7 - out[currentPos++] = (val << 4) >>> 25; - out[currentPos++] = (val << 11) >>> 25; - out[currentPos++] = (val << 18) >>> 25; - out[currentPos++] = (val << 25) >>> 25; - break; - } - case 6: { // number : 3, bitwidth : 9 - out[currentPos++] = (val << 5) >>> 23; - out[currentPos++] = (val << 14) >>> 23; - out[currentPos++] = (val << 23) >>> 23; - break; - } - case 7: { // number : 2, bitwidth : 14 - out[currentPos++] = (val << 4) >>> 18; - out[currentPos++] = (val << 18) >>> 18; - break; - } - case 8: { // number : 1, bitwidth : 28 - out[currentPos++] = (val << 4) >>> 4; - break; - } - default: { - throw new RuntimeException("shouldn't happen"); - } - } - } - while (currentPos < finalout) { - int val = in[tmpinpos++]; - int header = val >>> 28; - switch (header) { - case 0: { // number : 28, bitwidth : 1 - final int howmany = finalout - currentPos; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (k + 4)) >>> 31; - } - break; - } - case 1: { // number : 14, bitwidth : 2 - final int howmany = finalout - currentPos < 14 ? finalout - currentPos - : 14; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (2 * k + 4)) >>> 30; - } - break; - } - case 2: { // number : 9, bitwidth : 3 - final int howmany = finalout - currentPos < 9 ? finalout - currentPos - : 9; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (3 * k + 5)) >>> 29; - } - break; - } - case 3: { // number : 7, bitwidth : 4 - final int howmany = finalout - currentPos < 7 ? finalout - currentPos - : 7; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (4 * k + 4)) >>> 28; + // @Override + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + // Util.assertTrue(inpos.get()+inlength <= in.length); + int currentPos = outpos.get(); + int tmpinpos = inpos.get(); + final int finalout = currentPos + in[tmpinpos++]; + // Util.assertTrue(finalout <= out.length); + while (currentPos < finalout - 28) { + int val = in[tmpinpos++]; + int header = val >>> 28; + switch (header) { + case 0: { // number : 28, bitwidth : 1 + out[currentPos++] = (val << 4) >>> 31; + out[currentPos++] = (val << 5) >>> 31; + out[currentPos++] = (val << 6) >>> 31; + out[currentPos++] = (val << 7) >>> 31; + out[currentPos++] = (val << 8) >>> 31; + out[currentPos++] = (val << 9) >>> 31; + out[currentPos++] = (val << 10) >>> 31; + out[currentPos++] = (val << 11) >>> 31; + out[currentPos++] = (val << 12) >>> 31; + out[currentPos++] = (val << 13) >>> 31; // 10 + out[currentPos++] = (val << 14) >>> 31; + out[currentPos++] = (val << 15) >>> 31; + out[currentPos++] = (val << 16) >>> 31; + out[currentPos++] = (val << 17) >>> 31; + out[currentPos++] = (val << 18) >>> 31; + out[currentPos++] = (val << 19) >>> 31; + out[currentPos++] = (val << 20) >>> 31; + out[currentPos++] = (val << 21) >>> 31; + out[currentPos++] = (val << 22) >>> 31; + out[currentPos++] = (val << 23) >>> 31; // 20 + out[currentPos++] = (val << 24) >>> 31; + out[currentPos++] = (val << 25) >>> 31; + out[currentPos++] = (val << 26) >>> 31; + out[currentPos++] = (val << 27) >>> 31; + out[currentPos++] = (val << 28) >>> 31; + out[currentPos++] = (val << 29) >>> 31; + out[currentPos++] = (val << 30) >>> 31; + out[currentPos++] = (val << 31) >>> 31; + break; + } + case 1: { // number : 14, bitwidth : 2 + out[currentPos++] = (val << 4) >>> 30; + out[currentPos++] = (val << 6) >>> 30; + out[currentPos++] = (val << 8) >>> 30; + out[currentPos++] = (val << 10) >>> 30; + out[currentPos++] = (val << 12) >>> 30; + out[currentPos++] = (val << 14) >>> 30; + out[currentPos++] = (val << 16) >>> 30; + out[currentPos++] = (val << 18) >>> 30; + out[currentPos++] = (val << 20) >>> 30; + out[currentPos++] = (val << 22) >>> 30; // 10 + out[currentPos++] = (val << 24) >>> 30; + out[currentPos++] = (val << 26) >>> 30; + out[currentPos++] = (val << 28) >>> 30; + out[currentPos++] = (val << 30) >>> 30; + break; + } + case 2: { // number : 9, bitwidth : 3 + out[currentPos++] = (val << 5) >>> 29; + out[currentPos++] = (val << 8) >>> 29; + out[currentPos++] = (val << 11) >>> 29; + out[currentPos++] = (val << 14) >>> 29; + out[currentPos++] = (val << 17) >>> 29; + out[currentPos++] = (val << 20) >>> 29; + out[currentPos++] = (val << 23) >>> 29; + out[currentPos++] = (val << 26) >>> 29; + out[currentPos++] = (val << 29) >>> 29; + break; + } + case 3: { // number : 7, bitwidth : 4 + out[currentPos++] = (val << 4) >>> 28; + out[currentPos++] = (val << 8) >>> 28; + out[currentPos++] = (val << 12) >>> 28; + out[currentPos++] = (val << 16) >>> 28; + out[currentPos++] = (val << 20) >>> 28; + out[currentPos++] = (val << 24) >>> 28; + out[currentPos++] = (val << 28) >>> 28; + break; + } + case 4: { // number : 5, bitwidth : 5 + out[currentPos++] = (val << 7) >>> 27; + out[currentPos++] = (val << 12) >>> 27; + out[currentPos++] = (val << 17) >>> 27; + out[currentPos++] = (val << 22) >>> 27; + out[currentPos++] = (val << 27) >>> 27; + break; + } + case 5: { // number : 4, bitwidth : 7 + out[currentPos++] = (val << 4) >>> 25; + out[currentPos++] = (val << 11) >>> 25; + out[currentPos++] = (val << 18) >>> 25; + out[currentPos++] = (val << 25) >>> 25; + break; + } + case 6: { // number : 3, bitwidth : 9 + out[currentPos++] = (val << 5) >>> 23; + out[currentPos++] = (val << 14) >>> 23; + out[currentPos++] = (val << 23) >>> 23; + break; + } + case 7: { // number : 2, bitwidth : 14 + out[currentPos++] = (val << 4) >>> 18; + out[currentPos++] = (val << 18) >>> 18; + break; + } + case 8: { // number : 1, bitwidth : 28 + out[currentPos++] = (val << 4) >>> 4; + break; + } + default: { + throw new RuntimeException("shouldn't happen"); + } + } } - break; - } - case 4: { // number : 5, bitwidth : 5 - final int howmany = finalout - currentPos < 5 ? finalout - currentPos - : 5; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (5 * k + 7)) >>> 27; + while (currentPos < finalout) { + int val = in[tmpinpos++]; + int header = val >>> 28; + switch (header) { + case 0: { // number : 28, bitwidth : 1 + final int howmany = finalout - currentPos; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (k + 4)) >>> 31; + } + break; + } + case 1: { // number : 14, bitwidth : 2 + final int howmany = finalout - currentPos < 14 ? finalout - currentPos + : 14; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (2 * k + 4)) >>> 30; + } + break; + } + case 2: { // number : 9, bitwidth : 3 + final int howmany = finalout - currentPos < 9 ? finalout - currentPos + : 9; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (3 * k + 5)) >>> 29; + } + break; + } + case 3: { // number : 7, bitwidth : 4 + final int howmany = finalout - currentPos < 7 ? finalout - currentPos + : 7; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (4 * k + 4)) >>> 28; + } + break; + } + case 4: { // number : 5, bitwidth : 5 + final int howmany = finalout - currentPos < 5 ? finalout - currentPos + : 5; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (5 * k + 7)) >>> 27; + } + break; + } + case 5: { // number : 4, bitwidth : 7 + final int howmany = finalout - currentPos < 4 ? finalout - currentPos + : 4; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (7 * k + 4)) >>> 25; + } + break; + } + case 6: { // number : 3, bitwidth : 9 + final int howmany = finalout - currentPos < 3 ? finalout - currentPos + : 3; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (9 * k + 5)) >>> 23; + } + break; + } + case 7: { // number : 2, bitwidth : 14 + final int howmany = finalout - currentPos < 2 ? finalout - currentPos + : 2; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (14 * k + 4)) >>> 18; + } + break; + } + case 8: { // number : 1, bitwidth : 28 + out[currentPos++] = (val << 4) >>> 4; + break; + } + default: { + throw new RuntimeException("shouldn't happen"); + } + } } - break; - } - case 5: { // number : 4, bitwidth : 7 - final int howmany = finalout - currentPos < 4 ? finalout - currentPos - : 4; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (7 * k + 4)) >>> 25; - } - break; - } - case 6: { // number : 3, bitwidth : 9 - final int howmany = finalout - currentPos < 3 ? finalout - currentPos - : 3; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (9 * k + 5)) >>> 23; - } - break; - } - case 7: { // number : 2, bitwidth : 14 - final int howmany = finalout - currentPos < 2 ? finalout - currentPos - : 2; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (14 * k + 4)) >>> 18; - } - break; - } - case 8: { // number : 1, bitwidth : 28 - out[currentPos++] = (val << 4) >>> 4; - break; - } - default: { - throw new RuntimeException("shouldn't happen"); - } - } - } - // Util.assertTrue(currentPos == finalout); - outpos.set(currentPos); - inpos.set(tmpinpos); + // Util.assertTrue(currentPos == finalout); + outpos.set(currentPos); + inpos.set(tmpinpos); - } + } - private final static int bitLength[] = { 1, 2, 3, 4, 5, 7, 9, 14, 28 }; + private final static int bitLength[] = {1, 2, 3, 4, 5, 7, 9, 14, 28}; - private final static int codeNum[] = { 28, 14, 9, 7, 5, 4, 3, 2, 1 }; + private final static int codeNum[] = {28, 14, 9, 7, 5, 4, 3, 2, 1}; - @Override -public String toString() { - return this.getClass().getName(); - } + @Override + public String toString() { + return this.getClass().getName(); + } } diff --git a/src/main/java/me/lemire/integercompression/Util.java b/src/main/java/me/lemire/integercompression/Util.java index 89efc80..3293b46 100644 --- a/src/main/java/me/lemire/integercompression/Util.java +++ b/src/main/java/me/lemire/integercompression/Util.java @@ -7,31 +7,32 @@ package me.lemire.integercompression; public class Util { - public static int maxbits(int[] i, int pos, int length) { - int mask = 0; - for (int k = pos; k < pos + length; ++k) - mask |= i[k]; - return bits(mask); - } - public static int maxdiffbits(int initoffset, int[] i, int pos, int length) { - int mask = 0; - mask |= (i[pos] - initoffset); - for (int k = pos+1; k < pos + length; ++k) { - mask |= i[k] - i[k-1]; - } - return bits(mask); - } + public static int maxbits(int[] i, int pos, int length) { + int mask = 0; + for (int k = pos; k < pos + length; ++k) + mask |= i[k]; + return bits(mask); + } - public static int bits(int i) { - return 32 - Integer.numberOfLeadingZeros(i); - } - - public static void assertTrue(boolean b) { - if(!b) throw new RuntimeException("bug!"); - } + public static int maxdiffbits(int initoffset, int[] i, int pos, int length) { + int mask = 0; + mask |= (i[pos] - initoffset); + for (int k = pos + 1; k < pos + length; ++k) { + mask |= i[k] - i[k - 1]; + } + return bits(mask); + } - public static void assertTrue(boolean b, String message) { - if(!b) throw new RuntimeException(message); - } + public static int bits(int i) { + return 32 - Integer.numberOfLeadingZeros(i); + } + + public static void assertTrue(boolean b) { + if (!b) throw new RuntimeException("bug!"); + } + + public static void assertTrue(boolean b, String message) { + if (!b) throw new RuntimeException(message); + } } diff --git a/src/main/java/me/lemire/integercompression/VariableByte.java b/src/main/java/me/lemire/integercompression/VariableByte.java index 95491c1..53d4bb4 100644 --- a/src/main/java/me/lemire/integercompression/VariableByte.java +++ b/src/main/java/me/lemire/integercompression/VariableByte.java @@ -13,59 +13,62 @@ * Implementation of variable-byte. Possibly inefficient. * * @author Daniel Lemire - * */ public class VariableByte implements IntegerCODEC { - @Override -public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); - for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { - int val = in[k]; - do { - int b = (val & 127); - val >>>= 7; - if (val != 0) { - b |= 128; - } - buf.put((byte) b); - } while (val != 0); + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); + for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { + int val = in[k]; + do { + int b = (val & 127); + val >>>= 7; + if (val != 0) { + b |= 128; + } + buf.put((byte) b); + } while (val != 0); + } + while (buf.position() % 4 != 0) + buf.put((byte) 128); + final int length = buf.position(); + buf.flip(); + IntBuffer ibuf = buf.asIntBuffer(); + ibuf.get(out, outpos.get(), length / 4); + outpos.add(length / 4); + inpos.add(inlength); } - while (buf.position() % 4 != 0) - buf.put((byte) 128); - final int length = buf.position(); - buf.flip(); - IntBuffer ibuf = buf.asIntBuffer(); - ibuf.get(out, outpos.get(), length / 4); - outpos.add(length / 4); - inpos.add(inlength); - } - @Override -public void uncompress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { - int s = 0; - int p = inpos.get(); - int finalp = inpos.get() + inlength; - int tmpoutpos = outpos.get(); - for (int v = 0, shift = 0; p>> (24-s)); - s+=8; if(s == 32) {s = 0; p++;} - v += ((c & 127) << shift); - if ((c & 128) == 0) { - out[tmpoutpos++] = v; - v = 0; - shift = 0; - } else - shift += 7; + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + int s = 0; + int p = inpos.get(); + int finalp = inpos.get() + inlength; + int tmpoutpos = outpos.get(); + for (int v = 0, shift = 0; p < finalp; ) { + int c = (byte) (in[p] >>> (24 - s)); + s += 8; + if (s == 32) { + s = 0; + p++; + } + v += ((c & 127) << shift); + if ((c & 128) == 0) { + out[tmpoutpos++] = v; + v = 0; + shift = 0; + } else + shift += 7; + } + outpos.set(tmpoutpos); + inpos.add(inlength); } - outpos.set(tmpoutpos); - inpos.add(inlength); - } - @Override -public String toString() { - return this.getClass().getName(); - } + @Override + public String toString() { + return this.getClass().getName(); + } } diff --git a/src/main/java/me/lemire/integercompression/synth/ClusteredDataGenerator.java b/src/main/java/me/lemire/integercompression/synth/ClusteredDataGenerator.java index 897b3e5..4bd39b8 100644 --- a/src/main/java/me/lemire/integercompression/synth/ClusteredDataGenerator.java +++ b/src/main/java/me/lemire/integercompression/synth/ClusteredDataGenerator.java @@ -8,61 +8,61 @@ /** * This class will generate uniformly distributed lists of random integers. - * + * * @author Daniel Lemire */ public class ClusteredDataGenerator { - UniformDataGenerator unidg = new UniformDataGenerator(); - - public ClusteredDataGenerator() { - } + UniformDataGenerator unidg = new UniformDataGenerator(); - void fillUniform(int[] array, int offset, int length, int Min, int Max) { - int[] v = this.unidg.generateUniform(length, Max - Min); - for (int k = 0; k < v.length; ++k) - array[k + offset] = Min + v[k]; - } + public ClusteredDataGenerator() { + } - void fillClustered(int[] array, int offset, int length, int Min, int Max) { - final int range = Max - Min; - if ((range == length) || (length <= 10)) { - fillUniform(array, offset, length, Min, Max); - return; + void fillUniform(int[] array, int offset, int length, int Min, int Max) { + int[] v = this.unidg.generateUniform(length, Max - Min); + for (int k = 0; k < v.length; ++k) + array[k + offset] = Min + v[k]; } - final int cut = length - / 2 - + ((range - length - 1 > 0) ? this.unidg.rand.nextInt(range - length - 1) - : 0); - final double p = this.unidg.rand.nextDouble(); - if (p < 0.25) { - fillUniform(array, offset, length / 2, Min, Min + cut); - fillClustered(array, offset + length / 2, length - length / 2, Min + cut, - Max); - } else if (p < 0.5) { - fillClustered(array, offset, length / 2, Min, Min + cut); - fillUniform(array, offset + length / 2, length - length / 2, Min + cut, - Max); - } else { - fillClustered(array, offset, length / 2, Min, Min + cut); - fillClustered(array, offset + length / 2, length - length / 2, Min + cut, - Max); + + void fillClustered(int[] array, int offset, int length, int Min, int Max) { + final int range = Max - Min; + if ((range == length) || (length <= 10)) { + fillUniform(array, offset, length, Min, Max); + return; + } + final int cut = length + / 2 + + ((range - length - 1 > 0) ? this.unidg.rand.nextInt(range - length - 1) + : 0); + final double p = this.unidg.rand.nextDouble(); + if (p < 0.25) { + fillUniform(array, offset, length / 2, Min, Min + cut); + fillClustered(array, offset + length / 2, length - length / 2, Min + cut, + Max); + } else if (p < 0.5) { + fillClustered(array, offset, length / 2, Min, Min + cut); + fillUniform(array, offset + length / 2, length - length / 2, Min + cut, + Max); + } else { + fillClustered(array, offset, length / 2, Min, Min + cut); + fillClustered(array, offset + length / 2, length - length / 2, Min + cut, + Max); + } } - } - /** - * generates randomly N distinct integers from 0 to Max. - */ - public int[] generateClustered(int N, int Max) { - int[] array = new int[N]; - fillClustered(array, 0, N, 0, Max); - return array; - } + /** + * generates randomly N distinct integers from 0 to Max. + */ + public int[] generateClustered(int N, int Max) { + int[] array = new int[N]; + fillClustered(array, 0, N, 0, Max); + return array; + } - public static void main(String[] args) { - int[] example = (new ClusteredDataGenerator()).generateClustered(20, 1000); - for (int k = 0; k < example.length; ++k) - System.out.println(example[k]); - } + public static void main(String[] args) { + int[] example = (new ClusteredDataGenerator()).generateClustered(20, 1000); + for (int k = 0; k < example.length; ++k) + System.out.println(example[k]); + } } diff --git a/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java b/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java index 7e7cf3e..4ac2ae4 100644 --- a/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java +++ b/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java @@ -13,35 +13,35 @@ /** * This class will generate "clustered" lists of random integers. That is, the * integers tend not to be randomly distributed. - * + * * @author Daniel Lemire */ public class UniformDataGenerator { - Random rand = new Random(); + Random rand = new Random(); - public UniformDataGenerator() { - } + public UniformDataGenerator() { + } - /** - * generates randomly N distinct integers from 0 to Max. - */ - int[] generateUniform(int N, int Max) { - if (N > Max) - throw new RuntimeException("not possible"); - int[] ans = new int[N]; - if (N == Max) { - for (int k = 0; k < N; ++k) - ans[k] = k; - return ans; + /** + * generates randomly N distinct integers from 0 to Max. + */ + int[] generateUniform(int N, int Max) { + if (N > Max) + throw new RuntimeException("not possible"); + int[] ans = new int[N]; + if (N == Max) { + for (int k = 0; k < N; ++k) + ans[k] = k; + return ans; + } + // can be done faster: + TreeSet s = new TreeSet(); + while (s.size() < N) + s.add(new Integer(this.rand.nextInt(Max))); + Iterator i = s.iterator(); + for (int k = 0; k < N; ++k) + ans[k] = i.next().intValue(); + return ans; } - // can be done faster: - TreeSet s = new TreeSet(); - while (s.size() < N) - s.add(new Integer(this.rand.nextInt(Max))); - Iterator i = s.iterator(); - for (int k = 0; k < N; ++k) - ans[k] = i.next().intValue(); - return ans; - } } From a2fd0acaf9f5e5d7038ace401b10ad9d1af39051 Mon Sep 17 00:00:00 2001 From: JD Maturen Date: Tue, 21 May 2013 19:02:11 -0700 Subject: [PATCH 003/412] clean up docs --- src/main/java/com/kamikaze/pfordelta/LCPForDelta.java | 1 - src/main/java/com/kamikaze/pfordelta/PForDelta.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java b/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java index 6eb489c..c9e5f42 100644 --- a/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java +++ b/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java @@ -481,7 +481,6 @@ public static final void writeBits(int[] out, int val, int outOffset, int bits) * Read a certain number of bits of an integer into an integer array starting from the given start offset * * @param in the input array - * @param val the integer to be read * @param inOffset the start offset in bits in the input array * @param bits the number of bits to be read, unlike writeBits(), readBits() does not deal with bits==0 and thus bits must > 0. When bits ==0, the calling functions will just skip the entire bits-bit slots without decoding them * @return the bits bits of the input diff --git a/src/main/java/com/kamikaze/pfordelta/PForDelta.java b/src/main/java/com/kamikaze/pfordelta/PForDelta.java index f826ce5..37041ea 100644 --- a/src/main/java/com/kamikaze/pfordelta/PForDelta.java +++ b/src/main/java/com/kamikaze/pfordelta/PForDelta.java @@ -338,7 +338,6 @@ static int decompressBBitSlotsWithHardCodes(int[] decompressedSlots, int[] compB * Read a certain number of bits of an integer into an integer array starting from the given start offset * * @param in the input array - * @param val the integer to be read * @param inOffset the start offset in bits in the input array * @param bits the number of bits to be read, unlike writeBits(), readBits() does not deal with bits==0 and thus bits must > 0. When bits ==0, the calling functions will just skip the entire bits-bit slots without decoding them * @return the bits bits of the input From 88934d8dbefb133e67230a44dbe3389965b2044e Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 28 Jun 2013 09:14:22 -0400 Subject: [PATCH 004/412] Better README --- README => README.md | 79 ++++++++++++++++++++++++++++----------------- 1 file changed, 49 insertions(+), 30 deletions(-) rename README => README.md (66%) diff --git a/README b/README.md similarity index 66% rename from README rename to README.md index cc69003..028aac9 100644 --- a/README +++ b/README.md @@ -1,22 +1,30 @@ JavaFastPFOR: A simple integer compression library in Java -Main contributors -Daniel Lemire, http://lemire.me/en/ +========================================================== -Minor contributors -Di Wu, http://www.facebook.com/diwu1989 +License +------- -== What does this do == +This code is released under the +Apache License Version 2.0 http://www.apache.org/licenses/. + + +What does this do? +------------------ It is a library to compress and uncompress arrays of integers very fast. The assumption is that most (but not all) values in your array use less than 32 bits. These sort of arrays often come up -when using differential coding. +when using differential coding in databases and information +retrieval (e.g., in inverted indexes or column stores). Some CODECs ("integrated codecs") assume that the integers are in sorted orders. Most others do not. -== Why? == + + +Why? +---- I found a few libraries that implemented Binary Packing, NewPFD, OptPFD, Variable Byte, Simple 9 and so on in Java. However, I could not find @@ -24,22 +32,38 @@ one that I liked. I threw in a cool little benchmark program. -== How does it compare to the Kamikaze PForDelta library? == + +Authors +------- + +Main contributor +Daniel Lemire, http://lemire.me/en/ + +Minor contribution by +Di Wu, http://www.facebook.com/diwu1989 + +How does it compare to the Kamikaze PForDelta library? +------------------------------------------------------ In our tests, Kamikaze PForDelta does not fare well. (Run the benchmarks yourself, see below.) -== License == -This code is released under the -Apache License Version 2.0 http://www.apache.org/licenses/. +Requirements +------------ + +A recent Java compiler. Java 7 or better is recommended. + +Good instructions on installing Java 7 on Linux: + +http://forums.linuxmint.com/viewtopic.php?f=42&t=93052 + -== Requirements == -A recent Java compiler. -== What can I do? == +What can I do? +-------------- Compile the code and execute integercompression.benchmark. @@ -48,13 +72,17 @@ I recommend running all the benchmarks with the "-server" flag. Speed is always reported in millions of integers per second. -=== For Maven users === +For Maven users +--------------- + +mvn compile mvn exec:java -=== For ant users === +For ant users +------------- -When you use Apache ant, please try this: +If you use Apache ant, please try this: $ ant Benchmark @@ -63,11 +91,13 @@ or: $ ant Benchmark -Dbenchmark.target=BenchmarkBitPacking -== Usage == +Usage +----- See example.java for a simple demonstration. -== what to read more? == +Want to read more? +------------------ We wrote a research paper which documents many of the CODECs implemented here: @@ -76,14 +106,3 @@ http://arxiv.org/abs/1209.2137 - -== Limitation == - -Currently this library compresses and uncompresses arrays in bulk. -An alternative strategy is to compress them block-by-block. - -== Installing java 7 (optional) == - -Good instructions: -http://forums.linuxmint.com/viewtopic.php?f=42&t=93052 - From ff6ebccffd98d676d631bd07b157e1f984bddb71 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 28 Jun 2013 09:20:17 -0400 Subject: [PATCH 005/412] Adding URI --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0c208b7..d920b4a 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ How does it compare to the Kamikaze PForDelta library? In our tests, Kamikaze PForDelta does not fare well. See the benchmarkresults directory for some results. - +https://github.com/lemire/JavaFastPFOR/blob/master/benchmarkresults/benchmarkresults_icore7_10may2013.txt Requirements ------------ From 0cfad672f202bc3906b80a1c0223a876e8a4e01b Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 28 Jun 2013 09:25:16 -0400 Subject: [PATCH 006/412] Link to Parquet --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index d920b4a..1d5d27b 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,8 @@ your array use less than 32 bits. These sort of arrays often come up when using differential coding in databases and information retrieval (e.g., in inverted indexes or column stores). +This library is used by the Columnar file format for Hadoop "Parquet" +(http://parquet.io/). Some CODECs ("integrated codecs") assume that the integers are in sorted orders. Most others do not. From a46d2bc9224bcbcc11672b5a5207226dfa6ce315 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 5 Jul 2013 10:24:55 -0400 Subject: [PATCH 007/412] Preparing maven release --- pom.xml | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9b1ba2e..c90628f 100644 --- a/pom.xml +++ b/pom.xml @@ -1,7 +1,7 @@ 4.0.0 - com.googlecode.javafastpfor + me.lemire.integercompression JavaFastPFOR 0.0.2 jar @@ -55,8 +55,28 @@ GitHub Issue Tracking https://github.com/lemire/JavaFastPFOR/issues + + org.sonatype.oss + oss-parent + 5 + + + + + org.apache.felix + maven-bundle-plugin + 2.3.7 + true + + + me.lemire.integercompression.* + * + + + + org.codehaus.mojo exec-maven-plugin From 101afcde8f926f23296884a47fe39e7b9a40b905 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 5 Jul 2013 10:26:41 -0400 Subject: [PATCH 008/412] Still prep maven release --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c90628f..6cf29c6 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.2 + 0.0.2-SNAPSHOT jar From 948b62cca8bace695bafb402c64bab5109967950 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 5 Jul 2013 10:27:39 -0400 Subject: [PATCH 009/412] Still hacking --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6cf29c6..2975805 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.2-SNAPSHOT + 0.0.3-SNAPSHOT jar From 058d80a5380d393bc820edd3d1b04cff37f64759 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 5 Jul 2013 10:28:26 -0400 Subject: [PATCH 010/412] [maven-release-plugin] prepare release JavaFastPFOR-0.0.3 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2975805..cca09fc 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.3-SNAPSHOT + 0.0.3 jar From d58932c8eb87af3a3a687115b9c48470055411aa Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 5 Jul 2013 10:30:54 -0400 Subject: [PATCH 011/412] Fixing pom.xml --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index cca09fc..d1e4cce 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.3 + 0.0.3-SNAPSHOT jar @@ -20,9 +20,9 @@ - scm:git:git@github.com:lemire/javafastpfor.git - scm:git:git@github.com:lemire/javafastpfor.git - scm:git:git@github.com:lemire/javafastpfor.git + scm:git:git@github.com:lemire/JavaFastPFOR.git + scm:git:git@github.com:lemire/JavaFastPFOR.git + scm:git:git@github.com:lemire/JavaFastPFOR.git From 0fbaef392b2a4e1a7e86b69f10e5fe1a71b22bba Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 5 Jul 2013 10:31:55 -0400 Subject: [PATCH 012/412] [maven-release-plugin] prepare release JavaFastPFOR-0.0.3 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d1e4cce..44f8284 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.3-SNAPSHOT + 0.0.3 jar From b566b58d0cf3be022ef1ea78d9b2eacd0c366a2c Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 5 Jul 2013 10:32:00 -0400 Subject: [PATCH 013/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 44f8284..59da688 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.3 + 0.0.4-SNAPSHOT jar From daac2159f6473c531b3f350ab3764b3d00de924d Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 8 Jul 2013 14:02:06 -0400 Subject: [PATCH 014/412] Maven documentation --- README.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/README.md b/README.md index 1d5d27b..7742124 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,19 @@ This library is used by the Columnar file format for Hadoop "Parquet" Some CODECs ("integrated codecs") assume that the integers are in sorted orders. Most others do not. +Maven +----- + +Using this code in your own project is easy with maven, just add +the following code in your pom.xml file: + + + me.lemire.integercompression + JavaFastPFOR + 0.0.3 + + Why? ---- @@ -44,6 +56,7 @@ Daniel Lemire, http://lemire.me/en/ Minor contribution by Di Wu, http://www.facebook.com/diwu1989 + How does it compare to the Kamikaze PForDelta library? ------------------------------------------------------ @@ -61,6 +74,24 @@ Good instructions on installing Java 7 on Linux: http://forums.linuxmint.com/viewtopic.php?f=42&t=93052 +Maven central repository +------------------------ + +You can download JavaFastPFOR from the Maven central repository: +http://repo1.maven.org/maven2/me/lemire/integercompression/JavaFastPFOR/ + +You can also specify the dependency in the Maven "pom.xml" file: + + + + me.lemire.integercompression + JavaFastPFOR + 0.0.3 + + + +Naturally, you should replace "version" by the version +you desire. From 11e7fd804abab70c03701e02cd8e2bfaeaa272da Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 16 Jul 2013 09:43:21 -0400 Subject: [PATCH 015/412] LICENSE --- LICENSE | 191 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 191 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..37ec93a --- /dev/null +++ b/LICENSE @@ -0,0 +1,191 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object code, +generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made +available under the License, as indicated by a copyright notice that is included +in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative Works +thereof, that is intentionally submitted to Licensor for inclusion in the Work +by the copyright owner or by an individual or Legal Entity authorized to submit +on behalf of the copyright owner. For the purposes of this definition, +"submitted" means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor for +the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +2. Grant of Copyright License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +3. Grant of Patent License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such Contributor +that are necessarily infringed by their Contribution(s) alone or by combination +of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or contributory +patent infringement, then any patent licenses granted to You under this License +for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. + +You may reproduce and distribute copies of the Work or Derivative Works thereof +in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source form +of the Work, excluding those notices that do not pertain to any part of the +Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any +Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. + +5. Submission of Contributions. + +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. + +6. Trademarks. + +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. + +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +8. Limitation of Liability. + +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. + +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included on +the same "printed page" as the copyright notice for easier identification within +third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. From a963a7fd3521628474d3d0c47b9b85a56de0731d Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 16 Jul 2013 19:17:19 -0400 Subject: [PATCH 016/412] Link to JL work. --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7742124..f606ee4 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,9 @@ when using differential coding in databases and information retrieval (e.g., in inverted indexes or column stores). This library is used by the Columnar file format for Hadoop "Parquet" -(http://parquet.io/). +(http://parquet.io/). It is also used by Jimmy Lin's +Hadoop tools for manipulating ClueWeb collections +(https://github.com/lintool/clueweb). Some CODECs ("integrated codecs") assume that the integers are in sorted orders. Most others do not. From 42eb1afeb83f62cf9d85002552c858be44062676 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 22 Jul 2013 17:33:07 -0400 Subject: [PATCH 017/412] Preparing a new release... (still lots of work though). --- .classpath | 2 ++ .../lemire/integercompression/Benchmark.java | 6 +++++ .../integercompression/BinaryPacking.java | 1 + .../me/lemire/integercompression/Delta.java | 22 +++++++++++++++ .../lemire/integercompression/FastPFOR.java | 27 ++++++++++++++++--- .../integercompression/IntegerCODEC.java | 14 +++++++++- .../IntegratedBinaryPacking.java | 1 + .../me/lemire/integercompression/NewPFD.java | 3 +-- .../lemire/integercompression/NewPFDS9.java | 3 +-- .../me/lemire/integercompression/OptPFD.java | 3 +-- .../lemire/integercompression/OptPFDS9.java | 2 +- .../me/lemire/integercompression/Simple9.java | 7 ----- .../me/lemire/integercompression/Util.java | 20 +++++++------- 13 files changed, 81 insertions(+), 30 deletions(-) diff --git a/.classpath b/.classpath index f624b1b..49a9848 100644 --- a/.classpath +++ b/.classpath @@ -1,6 +1,8 @@ + + diff --git a/src/main/java/me/lemire/integercompression/Benchmark.java b/src/main/java/me/lemire/integercompression/Benchmark.java index d8dbe4f..61ea3cd 100644 --- a/src/main/java/me/lemire/integercompression/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/Benchmark.java @@ -14,6 +14,12 @@ import java.util.ArrayList; import java.util.Arrays; +/** + * + * Simple class meant to compare the speed of different schemes. + * @author lemire + * + */ public class Benchmark { public static void testCodec(IntegerCODEC c, int[][] data, int Max, diff --git a/src/main/java/me/lemire/integercompression/BinaryPacking.java b/src/main/java/me/lemire/integercompression/BinaryPacking.java index af2cd95..f59e79b 100644 --- a/src/main/java/me/lemire/integercompression/BinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/BinaryPacking.java @@ -17,6 +17,7 @@ public final class BinaryPacking implements IntegerCODEC { @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { inlength = inlength / 128 * 128; + if(inlength == 0) return; out[outpos.get()] = inlength; outpos.increment(); diff --git a/src/main/java/me/lemire/integercompression/Delta.java b/src/main/java/me/lemire/integercompression/Delta.java index b3963ca..91b2e31 100644 --- a/src/main/java/me/lemire/integercompression/Delta.java +++ b/src/main/java/me/lemire/integercompression/Delta.java @@ -7,20 +7,42 @@ package me.lemire.integercompression; +/** + * Generic class to compute differential coding. + * + * @author lemire + * + */ public class Delta { + /** + * Apply differential coding (in-place). + * + * @param data data to be modified + */ public static void delta(int[] data) { for (int i = data.length - 1; i > 0; --i) { data[i] -= data[i - 1]; } } + /** + * Undo differential coding (in-place). Effectively + * computes a prefix sum. + * + * @param data to be modified. + */ public static void inverseDelta(int[] data) { for (int i = 1; i < data.length; ++i) { data[i] += data[i - 1]; } } + /** + * Like inverseDelta, only faster. + * + * @param data to be modified + */ public static void fastinverseDelta(int[] data) { int sz0 = data.length / 4 * 4; int i = 1; diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 93270bc..7a87e91 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -30,27 +30,41 @@ public final class FastPFOR implements IntegerCODEC { int[][] datatobepacked = new int[32][]; ByteBuffer bytecontainer; + /** + * Construct the FastPFOR CODEC. + * @param pagesize the desired page size (for expert use) + */ public FastPFOR(int pagesize) { PageSize = pagesize; initArrays(); } + /** + * Construct the fastPFOR CODEC with default parameters. + */ public FastPFOR() { PageSize = 65536; initArrays(); } - public void initArrays() { + private void initArrays() { bytecontainer = ByteBuffer.allocateDirect(3 * PageSize / BlockSize + PageSize); for (int k = 1; k < 32; ++k) datatobepacked[k] = new int[PageSize / 32 * 4];// heuristic } + /** + * Compress data in blocks of 128 integers (if fewer than 128 integers are + * provided, nothing is done). + * + * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) + */ @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { inlength = inlength / 128 * 128; + if(inlength == 0) return; final int finalinpos = inpos.get() + inlength; out[outpos.get()] = inlength; @@ -62,7 +76,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, } } - public static void getBestBFromData(int[] in, int pos, + private static void getBestBFromData(int[] in, int pos, byte[] bestbbestcexceptmaxb) { int freqs[] = new int[32]; for (int k = pos; k < BlockSize + pos; ++k) @@ -166,10 +180,16 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, outpos.set(tmpoutpos); } + /** + * Uncompress data in blocks of 128 integers. In this + * particular case, the inlength parameter is ignored: + * it is deduced from the compressed data. + * + * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) + */ @Override public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); int mynvalue = in[inpos.get()]; inpos.increment(); int finalout = outpos.get() + mynvalue; @@ -188,7 +208,6 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, int inexcept = initpos + wheremeta; final int bytesize = in[inexcept++]; bytecontainer.clear(); - // Util.assertTrue((bytesize & 3) == 0); bytecontainer.asIntBuffer().put(in, inexcept, bytesize / 4); inexcept += bytesize / 4; diff --git a/src/main/java/me/lemire/integercompression/IntegerCODEC.java b/src/main/java/me/lemire/integercompression/IntegerCODEC.java index 9c72322..d23c053 100644 --- a/src/main/java/me/lemire/integercompression/IntegerCODEC.java +++ b/src/main/java/me/lemire/integercompression/IntegerCODEC.java @@ -10,6 +10,8 @@ public interface IntegerCODEC { /** + * Compress data from an array to another array. + * * Both inpos and outpos are modified to represent how much * data was read and written to * if 12 ints (inlength = 12) are compressed to 3 ints, then @@ -19,7 +21,17 @@ public interface IntegerCODEC { */ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos); - // returns how many integers we decompressed + /** + * Uncompress data from an array to another array. + * + * Both inpos and outpos parameters are modified to indicate new positions after read/write. + * + * @param in array containing data in compressed form + * @param inpos where to start reading in the array + * @param inlength length of the compressed data (ignored by some schemes) + * @param out array where to write the compressed output + * @param outpos where to write the compressed output in out + */ public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos); diff --git a/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java b/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java index ed31ddb..6222ab5 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java @@ -12,6 +12,7 @@ public class IntegratedBinaryPacking implements IntegratedIntegerCODEC { @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { inlength = inlength / 128 * 128; + if(inlength == 0) return; out[outpos.get()] = inlength; outpos.increment(); int tmpoutpos = outpos.get(); diff --git a/src/main/java/me/lemire/integercompression/NewPFD.java b/src/main/java/me/lemire/integercompression/NewPFD.java index 15a4717..d3684f8 100644 --- a/src/main/java/me/lemire/integercompression/NewPFD.java +++ b/src/main/java/me/lemire/integercompression/NewPFD.java @@ -32,9 +32,8 @@ public NewPFD() { @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); inlength = inlength / BlockSize * BlockSize; - + if(inlength == 0) return; final int finalinpos = inpos.get() + inlength; out[outpos.get()] = inlength; outpos.increment(); diff --git a/src/main/java/me/lemire/integercompression/NewPFDS9.java b/src/main/java/me/lemire/integercompression/NewPFDS9.java index 73e8392..3e0d054 100644 --- a/src/main/java/me/lemire/integercompression/NewPFDS9.java +++ b/src/main/java/me/lemire/integercompression/NewPFDS9.java @@ -32,9 +32,8 @@ public NewPFDS9() { @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); inlength = inlength / BlockSize * BlockSize; - + if(inlength == 0) return; final int finalinpos = inpos.get() + inlength; out[outpos.get()] = inlength; outpos.increment(); diff --git a/src/main/java/me/lemire/integercompression/OptPFD.java b/src/main/java/me/lemire/integercompression/OptPFD.java index f74c5d0..e815e2a 100644 --- a/src/main/java/me/lemire/integercompression/OptPFD.java +++ b/src/main/java/me/lemire/integercompression/OptPFD.java @@ -32,9 +32,8 @@ public OptPFD() { @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); inlength = inlength / BlockSize * BlockSize; - + if(inlength == 0) return; final int finalinpos = inpos.get() + inlength; out[outpos.get()] = inlength; outpos.increment(); diff --git a/src/main/java/me/lemire/integercompression/OptPFDS9.java b/src/main/java/me/lemire/integercompression/OptPFDS9.java index 5a967d3..bce2db7 100644 --- a/src/main/java/me/lemire/integercompression/OptPFDS9.java +++ b/src/main/java/me/lemire/integercompression/OptPFDS9.java @@ -31,8 +31,8 @@ public OptPFDS9() { @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); inlength = inlength / BlockSize * BlockSize; + if(inlength == 0) return; final int finalinpos = inpos.get() + inlength; out[outpos.get()] = inlength; diff --git a/src/main/java/me/lemire/integercompression/Simple9.java b/src/main/java/me/lemire/integercompression/Simple9.java index 7642ff3..3029619 100644 --- a/src/main/java/me/lemire/integercompression/Simple9.java +++ b/src/main/java/me/lemire/integercompression/Simple9.java @@ -13,12 +13,10 @@ public final class Simple9 implements IntegerCODEC { @Override public void compress(int[] in, IntWrapper inpos, int inlength, int out[], IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); int tmpoutpos = outpos.get(); int currentPos = inpos.get(); out[tmpoutpos++] = inlength; final int finalin = currentPos + inlength; - // Util.assertTrue(finalin <= in.length); outer: while (currentPos < finalin - 28) { mainloop: @@ -69,25 +67,20 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int out[], continue outer; } final int selector = 8; - // Util.assertTrue(codeNum[selector] == 1); if (in[currentPos] >= 1 << bitLength[selector]) throw new RuntimeException("Too big a number"); out[tmpoutpos++] = in[currentPos++] | (selector << 28); } - // Util.assertTrue(currentPos == finalin); inpos.set(currentPos); outpos.set(tmpoutpos); } - // @Override @Override public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); int currentPos = outpos.get(); int tmpinpos = inpos.get(); final int finalout = currentPos + in[tmpinpos++]; - // Util.assertTrue(finalout <= out.length); while (currentPos < finalout - 28) { int val = in[tmpinpos++]; int header = val >>> 28; diff --git a/src/main/java/me/lemire/integercompression/Util.java b/src/main/java/me/lemire/integercompression/Util.java index 3293b46..45aa72f 100644 --- a/src/main/java/me/lemire/integercompression/Util.java +++ b/src/main/java/me/lemire/integercompression/Util.java @@ -6,15 +6,21 @@ */ package me.lemire.integercompression; +/** + * Routine utility functions. + * + * @author lemire + * + */ public class Util { - public static int maxbits(int[] i, int pos, int length) { + protected static int maxbits(int[] i, int pos, int length) { int mask = 0; for (int k = pos; k < pos + length; ++k) mask |= i[k]; return bits(mask); } - public static int maxdiffbits(int initoffset, int[] i, int pos, int length) { + protected static int maxdiffbits(int initoffset, int[] i, int pos, int length) { int mask = 0; mask |= (i[pos] - initoffset); for (int k = pos + 1; k < pos + length; ++k) { @@ -23,16 +29,8 @@ public static int maxdiffbits(int initoffset, int[] i, int pos, int length) { return bits(mask); } - public static int bits(int i) { + protected static int bits(int i) { return 32 - Integer.numberOfLeadingZeros(i); } - public static void assertTrue(boolean b) { - if (!b) throw new RuntimeException("bug!"); - } - - public static void assertTrue(boolean b, String message) { - if (!b) throw new RuntimeException(message); - } - } From e84db2e78fe75874d98283b9d6edd86a86f00f84 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 22 Jul 2013 18:10:38 -0400 Subject: [PATCH 018/412] Preparing new release --- CHANGELOG | 6 + README.md | 2 +- .../lemire/integercompression/Benchmark.java | 107 +++++---- .../BenchmarkBitPacking.java | 94 ++------ .../integercompression/BinaryPacking.java | 1 - .../lemire/integercompression/BitPacking.java | 210 +++++++++-------- .../integercompression/Composition.java | 8 + .../me/lemire/integercompression/Delta.java | 2 +- .../lemire/integercompression/FastPFOR.java | 2 + .../lemire/integercompression/IntWrapper.java | 27 ++- .../integercompression/IntegerCODEC.java | 11 + .../IntegratedBinaryPacking.java | 5 +- .../IntegratedBitPacking.java | 143 ++++++------ .../IntegratedComposition.java | 10 +- .../IntegratedVariableByte.java | 4 + .../lemire/integercompression/JustCopy.java | 6 +- .../me/lemire/integercompression/NewPFD.java | 12 +- .../lemire/integercompression/NewPFDS9.java | 10 +- .../me/lemire/integercompression/OptPFD.java | 8 +- .../lemire/integercompression/OptPFDS9.java | 10 +- .../me/lemire/integercompression/S16.java | 25 +- .../java/me/lemire/integercompression/S9.java | 18 +- .../me/lemire/integercompression/Simple9.java | 6 +- .../me/lemire/integercompression/Util.java | 2 +- .../lemire/integercompression/BasicTest.java | 219 ++++++++++++++++++ 25 files changed, 614 insertions(+), 334 deletions(-) create mode 100644 CHANGELOG create mode 100644 src/test/java/me/lemire/integercompression/BasicTest.java diff --git a/CHANGELOG b/CHANGELOG new file mode 100644 index 0000000..54a8358 --- /dev/null +++ b/CHANGELOG @@ -0,0 +1,6 @@ +0.0.4 (July 22nd 2013) + - moved unit testing to comply with maven standard + - codecs that have length limits no longer write out if they don't read in (Jimmy Lin) + - better documentation + +0.0.3 : first public release diff --git a/README.md b/README.md index f606ee4..ec62755 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ the following code in your pom.xml file: me.lemire.integercompression JavaFastPFOR - 0.0.3 + 0.0.4 diff --git a/src/main/java/me/lemire/integercompression/Benchmark.java b/src/main/java/me/lemire/integercompression/Benchmark.java index 61ea3cd..43a1ae6 100644 --- a/src/main/java/me/lemire/integercompression/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/Benchmark.java @@ -17,12 +17,20 @@ /** * * Simple class meant to compare the speed of different schemes. - * @author lemire + * @author Daniel Lemire * */ public class Benchmark { - public static void testCodec(IntegerCODEC c, int[][] data, int Max, + /** + * Standard benchmark + * + * @param c the codec + * @param data arrays of input data + * @param repeat How many times to repeat the test + * @param verbose whether to output result on screen + */ + private static void testCodec(IntegerCODEC c, int[][] data, int repeat, boolean verbose) { DecimalFormat df = new DecimalFormat("0.00"); DecimalFormat dfspeed = new DecimalFormat("0"); @@ -99,6 +107,11 @@ public static void testCodec(IntegerCODEC c, int[][] data, int Max, System.out.println(line); } + /** + * Main method. + * + * @param args command-line arguments + */ public static void main(String args[]) { System.out.println("# benchmark based on the ClusterData model from:"); System.out.println("# Vo Ngoc Anh and Alistair Moffat. "); @@ -108,7 +121,14 @@ public static void main(String args[]) { test(20, 18, 10); } - public static void testKamikaze(int[][] data, int Max, + /** + * Standard test for the Kamikaze library + * + * @param data input data + * @param repeat how many times to repeat + * @param verbose whether to output data on screen + */ + public static void testKamikaze(int[][] data, int repeat, boolean verbose) { DecimalFormat df = new DecimalFormat("0.00"); DecimalFormat dfspeed = new DecimalFormat("0"); @@ -190,7 +210,14 @@ public static void testKamikaze(int[][] data, int Max, System.out.println(line); } - public static void test(int N, int nbr, int repeat) { + /** + * Generates data and calls other tests. + * + * @param N How many input arrays to generate + * @param nbr how big (in log2) should the arrays be + * @param repeat How many times should we repeat tests. + */ + private static void test(int N, int nbr, int repeat) { ClusteredDataGenerator cdg = new ClusteredDataGenerator(); for (int sparsity = 1; sparsity < 31 - nbr; sparsity += 1) { System.out.println("# sparsity " + sparsity); @@ -201,89 +228,89 @@ public static void test(int N, int nbr, int repeat) { data[k] = cdg.generateClustered((1 << nbr), Max); } System.out.println("# generating random data... ok."); - testKamikaze(data, Max, repeat, false); - testKamikaze(data, Max, repeat, false); - testKamikaze(data, Max, repeat, true); + testKamikaze(data, repeat, false); + testKamikaze(data, repeat, false); + testKamikaze(data, repeat, true); System.out.println(); testCodec(new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()), data, Max, repeat, false); + new IntegratedVariableByte()), data, repeat, false); testCodec(new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()), data, Max, repeat, false); + new IntegratedVariableByte()), data, repeat, false); testCodec(new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()), data, Max, repeat, true); + new IntegratedVariableByte()), data, repeat, true); System.out.println(); - testCodec(new JustCopy(), data, Max, repeat, false); - testCodec(new JustCopy(), data, Max, repeat, false); - testCodec(new JustCopy(), data, Max, repeat, true); + testCodec(new JustCopy(), data, repeat, false); + testCodec(new JustCopy(), data, repeat, false); + testCodec(new JustCopy(), data, repeat, true); System.out.println(); - testCodec(new VariableByte(), data, Max, repeat, false); - testCodec(new VariableByte(), data, Max, repeat, false); - testCodec(new VariableByte(), data, Max, repeat, true); + testCodec(new VariableByte(), data, repeat, false); + testCodec(new VariableByte(), data, repeat, false); + testCodec(new VariableByte(), data, repeat, true); System.out.println(); - testCodec(new IntegratedVariableByte(), data, Max, repeat, false); - testCodec(new IntegratedVariableByte(), data, Max, repeat, false); - testCodec(new IntegratedVariableByte(), data, Max, repeat, true); + testCodec(new IntegratedVariableByte(), data, repeat, false); + testCodec(new IntegratedVariableByte(), data, repeat, false); + testCodec(new IntegratedVariableByte(), data, repeat, true); System.out.println(); testCodec(new Composition(new BinaryPacking(), new VariableByte()), - data, Max, repeat, false); + data, repeat, false); testCodec(new Composition(new BinaryPacking(), new VariableByte()), - data, Max, repeat, false); + data, repeat, false); testCodec(new Composition(new BinaryPacking(), new VariableByte()), - data, Max, repeat, true); + data, repeat, true); System.out.println(); testCodec(new Composition(new NewPFD(), new VariableByte()), data, - Max, repeat, false); + repeat, false); testCodec(new Composition(new NewPFD(), new VariableByte()), data, - Max, repeat, false); + repeat, false); testCodec(new Composition(new NewPFD(), new VariableByte()), data, - Max, repeat, true); + repeat, true); System.out.println(); testCodec(new Composition(new NewPFDS9(), new VariableByte()), data, - Max, repeat, false); + repeat, false); testCodec(new Composition(new NewPFDS9(), new VariableByte()), data, - Max, repeat, false); + repeat, false); testCodec(new Composition(new NewPFDS9(), new VariableByte()), data, - Max, repeat, true); + repeat, true); System.out.println(); testCodec(new Composition(new OptPFD(), new VariableByte()), data, - Max, repeat, false); + repeat, false); testCodec(new Composition(new OptPFD(), new VariableByte()), data, - Max, repeat, false); + repeat, false); testCodec(new Composition(new OptPFD(), new VariableByte()), data, - Max, repeat, true); + repeat, true); System.out.println(); testCodec(new Composition(new OptPFDS9(), new VariableByte()), data, - Max, repeat, false); + repeat, false); testCodec(new Composition(new OptPFDS9(), new VariableByte()), data, - Max, repeat, false); + repeat, false); testCodec(new Composition(new OptPFDS9(), new VariableByte()), data, - Max, repeat, true); + repeat, true); System.out.println(); testCodec(new Composition(new FastPFOR(), new VariableByte()), - data, Max, repeat, false); + data, repeat, false); testCodec(new Composition(new FastPFOR(), new VariableByte()), - data, Max, repeat, false); + data, repeat, false); testCodec(new Composition(new FastPFOR(), new VariableByte()), - data, Max, repeat, true); + data, repeat, true); System.out.println(); - testCodec(new Simple9(), data, Max, repeat, false); - testCodec(new Simple9(), data, Max, repeat, false); - testCodec(new Simple9(), data, Max, repeat, true); + testCodec(new Simple9(), data, repeat, false); + testCodec(new Simple9(), data, repeat, false); + testCodec(new Simple9(), data, repeat, true); System.out.println(); } } diff --git a/src/main/java/me/lemire/integercompression/BenchmarkBitPacking.java b/src/main/java/me/lemire/integercompression/BenchmarkBitPacking.java index 4659339..88ec99c 100644 --- a/src/main/java/me/lemire/integercompression/BenchmarkBitPacking.java +++ b/src/main/java/me/lemire/integercompression/BenchmarkBitPacking.java @@ -10,9 +10,16 @@ import java.util.Arrays; import java.util.Random; +/** + * Class used to benchmark the speed of bit packing. (For + * expert use.) + * + * @author Daniel Lemire + * + */ public class BenchmarkBitPacking { - public static void test(boolean verbose) { + private static void test(boolean verbose) { DecimalFormat dfspeed = new DecimalFormat("0"); final int N = 32; final int times = 100000; @@ -49,7 +56,7 @@ public static void test(boolean verbose) { } } - public static void testWithDeltas(boolean verbose) { + private static void testWithDeltas(boolean verbose) { DecimalFormat dfspeed = new DecimalFormat("0"); final int N = 32; final int times = 100000; @@ -103,85 +110,12 @@ public static void testWithDeltas(boolean verbose) { } } - public static void verify() { - System.out.println("Checking the code..."); - final int N = 32; - final int times = 1000; - Random r = new Random(); - int[] data = new int[N]; - int[] compressed = new int[N]; - int[] uncompressed = new int[N]; - for (int bit = 0; bit < 31; ++bit) { - for (int t = 0; t < times; ++t) { - for (int k = 0; k < N; ++k) { - data[k] = r.nextInt(1 << bit); - } - BitPacking.fastpack(data, 0, compressed, 0, bit); - BitPacking.fastunpack(compressed, 0, uncompressed, 0, bit); - if (!Arrays.equals(uncompressed, data)) { - throw new RuntimeException("bug " + bit); - } - } - } - System.out.println("Code appears to be correct."); - } - - public static void verifyWithoutMask() { - System.out.println("Checking the code..."); - final int N = 32; - final int times = 1000; - Random r = new Random(); - int[] data = new int[N]; - int[] compressed = new int[N]; - int[] uncompressed = new int[N]; - for (int bit = 0; bit < 31; ++bit) { - for (int t = 0; t < times; ++t) { - for (int k = 0; k < N; ++k) { - data[k] = r.nextInt(1 << bit); - } - BitPacking.fastpackwithoutmask(data, 0, compressed, 0, bit); - BitPacking.fastunpack(compressed, 0, uncompressed, 0, bit); - if (!Arrays.equals(uncompressed, data)) { - throw new RuntimeException("bug " + bit); - } - } - } - System.out.println("Code appears to be correct."); - } - - public static void verifyWithExceptions() { - System.out.println("Checking the code..."); - final int N = 32; - final int times = 1000; - Random r = new Random(); - int[] data = new int[N]; - int[] compressed = new int[N]; - int[] uncompressed = new int[N]; - for (int bit = 0; bit < 31; ++bit) { - for (int t = 0; t < times; ++t) { - for (int k = 0; k < N; ++k) { - data[k] = r.nextInt(); - } - BitPacking.fastpack(data, 0, compressed, 0, bit); - BitPacking.fastunpack(compressed, 0, uncompressed, 0, bit); - for (int k = 0; k < N; ++k) { - if ((data[k] & ((1 << bit) - 1)) != uncompressed[k]) { - for (int k2 = 0; k2 < N; ++k2) { - System.out.println((data[k] & ((1 << bit) - 1)) + " " + uncompressed[k]); - } - System.out.println(compressed[0]); - throw new RuntimeException("bug " + bit); - } - } - } - } - System.out.println("Code with overflow appears to be correct."); - } - + /** + * Main method + * + * @param args command-line arguments + */ public static void main(String[] args) { - verify(); - verifyWithExceptions(); - verifyWithoutMask(); System.out.println("Testing packing and delta "); testWithDeltas(false); testWithDeltas(true); diff --git a/src/main/java/me/lemire/integercompression/BinaryPacking.java b/src/main/java/me/lemire/integercompression/BinaryPacking.java index f59e79b..ad02965 100644 --- a/src/main/java/me/lemire/integercompression/BinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/BinaryPacking.java @@ -44,7 +44,6 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWra @Override public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); final int outlength = in[inpos.get()]; inpos.increment(); int tmpinpos = inpos.get(); diff --git a/src/main/java/me/lemire/integercompression/BitPacking.java b/src/main/java/me/lemire/integercompression/BitPacking.java index 349ab32..8af38b5 100644 --- a/src/main/java/me/lemire/integercompression/BitPacking.java +++ b/src/main/java/me/lemire/integercompression/BitPacking.java @@ -9,10 +9,16 @@ import java.util.Arrays; +/** + * Bitpacking routines + * + * @author Daniel Lemire + * + */ public final class BitPacking { - public static void fastpackwithoutmask1(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask1(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 1) | ((in[2 + inpos]) << 2) @@ -49,7 +55,7 @@ public static void fastpackwithoutmask1(final int[] in, int inpos, final int[] o } - public static void fastpackwithoutmask2(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask2(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 2) | ((in[2 + inpos]) << 4) @@ -87,7 +93,7 @@ public static void fastpackwithoutmask2(final int[] in, int inpos, final int[] o } - public static void fastpackwithoutmask3(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask3(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 3) | ((in[2 + inpos]) << 6) @@ -128,7 +134,7 @@ public static void fastpackwithoutmask3(final int[] in, int inpos, final int[] o } - public static void fastpackwithoutmask4(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask4(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 4) | ((in[2 + inpos]) << 8) @@ -168,7 +174,7 @@ public static void fastpackwithoutmask4(final int[] in, int inpos, final int[] o } - public static void fastpackwithoutmask5(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask5(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 5) | ((in[2 + inpos]) << 10) @@ -213,7 +219,7 @@ public static void fastpackwithoutmask5(final int[] in, int inpos, final int[] o } - public static void fastpackwithoutmask6(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask6(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 6) | ((in[2 + inpos]) << 12) @@ -259,7 +265,7 @@ public static void fastpackwithoutmask6(final int[] in, int inpos, final int[] o } - public static void fastpackwithoutmask7(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask7(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 7) | ((in[2 + inpos]) << 14) @@ -308,7 +314,7 @@ public static void fastpackwithoutmask7(final int[] in, int inpos, final int[] o } - public static void fastpackwithoutmask8(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask8(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 8) | ((in[2 + inpos]) << 16) @@ -352,7 +358,7 @@ public static void fastpackwithoutmask8(final int[] in, int inpos, final int[] o } - public static void fastpackwithoutmask9(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask9(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 9) | ((in[2 + inpos]) << 18) @@ -405,7 +411,7 @@ public static void fastpackwithoutmask9(final int[] in, int inpos, final int[] o } - public static void fastpackwithoutmask10(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask10(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 10) | ((in[2 + inpos]) << 20) @@ -459,7 +465,7 @@ public static void fastpackwithoutmask10(final int[] in, int inpos, final int[] } - public static void fastpackwithoutmask11(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask11(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 11) | ((in[2 + inpos]) << 22) @@ -516,7 +522,7 @@ public static void fastpackwithoutmask11(final int[] in, int inpos, final int[] } - public static void fastpackwithoutmask12(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask12(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 12) | ((in[2 + inpos]) << 24) @@ -572,7 +578,7 @@ public static void fastpackwithoutmask12(final int[] in, int inpos, final int[] } - public static void fastpackwithoutmask13(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask13(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 13) | ((in[2 + inpos]) << 26) @@ -633,7 +639,7 @@ public static void fastpackwithoutmask13(final int[] in, int inpos, final int[] } - public static void fastpackwithoutmask14(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask14(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 14) | ((in[2 + inpos]) << 28) @@ -695,7 +701,7 @@ public static void fastpackwithoutmask14(final int[] in, int inpos, final int[] } - public static void fastpackwithoutmask15(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask15(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 15) | ((in[2 + inpos]) << 30) @@ -760,7 +766,7 @@ public static void fastpackwithoutmask15(final int[] in, int inpos, final int[] } - public static void fastpackwithoutmask16(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask16(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 16) ; @@ -812,7 +818,7 @@ public static void fastpackwithoutmask16(final int[] in, int inpos, final int[] } - public static void fastpackwithoutmask17(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask17(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 17) ; @@ -881,7 +887,7 @@ public static void fastpackwithoutmask17(final int[] in, int inpos, final int[] } - public static void fastpackwithoutmask18(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask18(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 18) ; @@ -951,7 +957,7 @@ public static void fastpackwithoutmask18(final int[] in, int inpos, final int[] } - public static void fastpackwithoutmask19(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask19(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 19) ; @@ -1024,7 +1030,7 @@ public static void fastpackwithoutmask19(final int[] in, int inpos, final int[] } - public static void fastpackwithoutmask20(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask20(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 20) ; @@ -1096,7 +1102,7 @@ public static void fastpackwithoutmask20(final int[] in, int inpos, final int[] } - public static void fastpackwithoutmask21(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask21(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 21) ; @@ -1173,7 +1179,7 @@ public static void fastpackwithoutmask21(final int[] in, int inpos, final int[] } - public static void fastpackwithoutmask22(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask22(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 22) ; @@ -1251,7 +1257,7 @@ public static void fastpackwithoutmask22(final int[] in, int inpos, final int[] } - public static void fastpackwithoutmask23(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask23(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 23) ; @@ -1332,7 +1338,7 @@ public static void fastpackwithoutmask23(final int[] in, int inpos, final int[] } - public static void fastpackwithoutmask24(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask24(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 24) ; @@ -1408,7 +1414,7 @@ public static void fastpackwithoutmask24(final int[] in, int inpos, final int[] } - public static void fastpackwithoutmask25(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask25(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 25) ; @@ -1493,7 +1499,7 @@ public static void fastpackwithoutmask25(final int[] in, int inpos, final int[] } - public static void fastpackwithoutmask26(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask26(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 26) ; @@ -1579,7 +1585,7 @@ public static void fastpackwithoutmask26(final int[] in, int inpos, final int[] } - public static void fastpackwithoutmask27(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask27(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 27) ; @@ -1668,7 +1674,7 @@ public static void fastpackwithoutmask27(final int[] in, int inpos, final int[] } - public static void fastpackwithoutmask28(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask28(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 28) ; @@ -1756,7 +1762,7 @@ public static void fastpackwithoutmask28(final int[] in, int inpos, final int[] } - public static void fastpackwithoutmask29(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask29(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 29) ; @@ -1849,7 +1855,7 @@ public static void fastpackwithoutmask29(final int[] in, int inpos, final int[] } - public static void fastpackwithoutmask30(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask30(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 30) ; @@ -1943,7 +1949,7 @@ public static void fastpackwithoutmask30(final int[] in, int inpos, final int[] } - public static void fastpackwithoutmask31(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask31(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 31) ; @@ -2040,7 +2046,7 @@ public static void fastpackwithoutmask31(final int[] in, int inpos, final int[] } - public static void fastpack1(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack1(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 1) | ((in[1 + inpos] & 1) << 1) | ((in[2 + inpos] & 1) << 2) @@ -2077,7 +2083,7 @@ public static void fastpack1(final int[] in, int inpos, final int[] out, int out } - public static void fastpack2(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack2(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 3) | ((in[1 + inpos] & 3) << 2) | ((in[2 + inpos] & 3) << 4) @@ -2115,7 +2121,7 @@ public static void fastpack2(final int[] in, int inpos, final int[] out, int out } - public static void fastpack3(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack3(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 7) | ((in[1 + inpos] & 7) << 3) | ((in[2 + inpos] & 7) << 6) @@ -2156,7 +2162,7 @@ public static void fastpack3(final int[] in, int inpos, final int[] out, int out } - public static void fastpack4(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack4(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 15) | ((in[1 + inpos] & 15) << 4) | ((in[2 + inpos] & 15) << 8) @@ -2196,7 +2202,7 @@ public static void fastpack4(final int[] in, int inpos, final int[] out, int out } - public static void fastpack5(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack5(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 31) | ((in[1 + inpos] & 31) << 5) | ((in[2 + inpos] & 31) << 10) @@ -2241,7 +2247,7 @@ public static void fastpack5(final int[] in, int inpos, final int[] out, int out } - public static void fastpack6(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack6(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 63) | ((in[1 + inpos] & 63) << 6) | ((in[2 + inpos] & 63) << 12) @@ -2287,7 +2293,7 @@ public static void fastpack6(final int[] in, int inpos, final int[] out, int out } - public static void fastpack7(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack7(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 127) | ((in[1 + inpos] & 127) << 7) | ((in[2 + inpos] & 127) << 14) @@ -2336,7 +2342,7 @@ public static void fastpack7(final int[] in, int inpos, final int[] out, int out } - public static void fastpack8(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack8(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 255) | ((in[1 + inpos] & 255) << 8) | ((in[2 + inpos] & 255) << 16) @@ -2380,7 +2386,7 @@ public static void fastpack8(final int[] in, int inpos, final int[] out, int out } - public static void fastpack9(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack9(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 511) | ((in[1 + inpos] & 511) << 9) | ((in[2 + inpos] & 511) << 18) @@ -2433,7 +2439,7 @@ public static void fastpack9(final int[] in, int inpos, final int[] out, int out } - public static void fastpack10(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack10(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 1023) | ((in[1 + inpos] & 1023) << 10) | ((in[2 + inpos] & 1023) << 20) @@ -2487,7 +2493,7 @@ public static void fastpack10(final int[] in, int inpos, final int[] out, int ou } - public static void fastpack11(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack11(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 2047) | ((in[1 + inpos] & 2047) << 11) | ((in[2 + inpos]) << 22) @@ -2544,7 +2550,7 @@ public static void fastpack11(final int[] in, int inpos, final int[] out, int ou } - public static void fastpack12(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack12(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 4095) | ((in[1 + inpos] & 4095) << 12) | ((in[2 + inpos]) << 24) @@ -2600,7 +2606,7 @@ public static void fastpack12(final int[] in, int inpos, final int[] out, int ou } - public static void fastpack13(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack13(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 8191) | ((in[1 + inpos] & 8191) << 13) | ((in[2 + inpos]) << 26) @@ -2661,7 +2667,7 @@ public static void fastpack13(final int[] in, int inpos, final int[] out, int ou } - public static void fastpack14(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack14(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 16383) | ((in[1 + inpos] & 16383) << 14) | ((in[2 + inpos]) << 28) @@ -2723,7 +2729,7 @@ public static void fastpack14(final int[] in, int inpos, final int[] out, int ou } - public static void fastpack15(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack15(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 32767) | ((in[1 + inpos] & 32767) << 15) | ((in[2 + inpos]) << 30) @@ -2788,7 +2794,7 @@ public static void fastpack15(final int[] in, int inpos, final int[] out, int ou } - public static void fastpack16(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack16(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 65535) | ((in[1 + inpos]) << 16) ; @@ -2840,7 +2846,7 @@ public static void fastpack16(final int[] in, int inpos, final int[] out, int ou } - public static void fastpack17(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack17(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 131071) | ((in[1 + inpos]) << 17) ; @@ -2909,7 +2915,7 @@ public static void fastpack17(final int[] in, int inpos, final int[] out, int ou } - public static void fastpack18(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack18(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 262143) | ((in[1 + inpos]) << 18) ; @@ -2979,7 +2985,7 @@ public static void fastpack18(final int[] in, int inpos, final int[] out, int ou } - public static void fastpack19(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack19(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 524287) | ((in[1 + inpos]) << 19) ; @@ -3052,7 +3058,7 @@ public static void fastpack19(final int[] in, int inpos, final int[] out, int ou } - public static void fastpack20(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack20(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 1048575) | ((in[1 + inpos]) << 20) ; @@ -3124,7 +3130,7 @@ public static void fastpack20(final int[] in, int inpos, final int[] out, int ou } - public static void fastpack21(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack21(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 2097151) | ((in[1 + inpos]) << 21) ; @@ -3201,7 +3207,7 @@ public static void fastpack21(final int[] in, int inpos, final int[] out, int ou } - public static void fastpack22(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack22(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 4194303) | ((in[1 + inpos]) << 22) ; @@ -3279,7 +3285,7 @@ public static void fastpack22(final int[] in, int inpos, final int[] out, int ou } - public static void fastpack23(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack23(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 8388607) | ((in[1 + inpos]) << 23) ; @@ -3360,7 +3366,7 @@ public static void fastpack23(final int[] in, int inpos, final int[] out, int ou } - public static void fastpack24(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack24(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 16777215) | ((in[1 + inpos]) << 24) ; @@ -3436,7 +3442,7 @@ public static void fastpack24(final int[] in, int inpos, final int[] out, int ou } - public static void fastpack25(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack25(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 33554431) | ((in[1 + inpos]) << 25) ; @@ -3521,7 +3527,7 @@ public static void fastpack25(final int[] in, int inpos, final int[] out, int ou } - public static void fastpack26(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack26(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 67108863) | ((in[1 + inpos]) << 26) ; @@ -3607,7 +3613,7 @@ public static void fastpack26(final int[] in, int inpos, final int[] out, int ou } - public static void fastpack27(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack27(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 134217727) | ((in[1 + inpos]) << 27) ; @@ -3696,7 +3702,7 @@ public static void fastpack27(final int[] in, int inpos, final int[] out, int ou } - public static void fastpack28(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack28(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 268435455) | ((in[1 + inpos]) << 28) ; @@ -3784,7 +3790,7 @@ public static void fastpack28(final int[] in, int inpos, final int[] out, int ou } - public static void fastpack29(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack29(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 536870911) | ((in[1 + inpos]) << 29) ; @@ -3877,7 +3883,7 @@ public static void fastpack29(final int[] in, int inpos, final int[] out, int ou } - public static void fastpack30(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack30(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 1073741823) | ((in[1 + inpos]) << 30) ; @@ -3971,7 +3977,7 @@ public static void fastpack30(final int[] in, int inpos, final int[] out, int ou } - public static void fastpack31(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack31(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 2147483647) | ((in[1 + inpos]) << 31) ; @@ -4068,7 +4074,7 @@ public static void fastpack31(final int[] in, int inpos, final int[] out, int ou } - public static void fastunpack1(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack1(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 1) ; out[1 + outpos] = ((in[0 + inpos] >>> 1) & 1) @@ -4136,7 +4142,7 @@ public static void fastunpack1(final int[] in, int inpos, final int[] out, int o } - public static void fastunpack2(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack2(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 3) ; out[1 + outpos] = ((in[0 + inpos] >>> 2) & 3) @@ -4204,7 +4210,7 @@ public static void fastunpack2(final int[] in, int inpos, final int[] out, int o } - public static void fastunpack3(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack3(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 7) ; out[1 + outpos] = ((in[0 + inpos] >>> 3) & 7) @@ -4274,7 +4280,7 @@ public static void fastunpack3(final int[] in, int inpos, final int[] out, int o } - public static void fastunpack4(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack4(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 15) ; out[1 + outpos] = ((in[0 + inpos] >>> 4) & 15) @@ -4342,7 +4348,7 @@ public static void fastunpack4(final int[] in, int inpos, final int[] out, int o } - public static void fastunpack5(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack5(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 31) ; out[1 + outpos] = ((in[0 + inpos] >>> 5) & 31) @@ -4414,7 +4420,7 @@ public static void fastunpack5(final int[] in, int inpos, final int[] out, int o } - public static void fastunpack6(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack6(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 63) ; out[1 + outpos] = ((in[0 + inpos] >>> 6) & 63) @@ -4486,7 +4492,7 @@ public static void fastunpack6(final int[] in, int inpos, final int[] out, int o } - public static void fastunpack7(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack7(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 127) ; out[1 + outpos] = ((in[0 + inpos] >>> 7) & 127) @@ -4560,7 +4566,7 @@ public static void fastunpack7(final int[] in, int inpos, final int[] out, int o } - public static void fastunpack8(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack8(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 255) ; out[1 + outpos] = ((in[0 + inpos] >>> 8) & 255) @@ -4628,7 +4634,7 @@ public static void fastunpack8(final int[] in, int inpos, final int[] out, int o } - public static void fastunpack9(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack9(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 511) ; out[1 + outpos] = ((in[0 + inpos] >>> 9) & 511) @@ -4704,7 +4710,7 @@ public static void fastunpack9(final int[] in, int inpos, final int[] out, int o } - public static void fastunpack10(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack10(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 1023) ; out[1 + outpos] = ((in[0 + inpos] >>> 10) & 1023) @@ -4780,7 +4786,7 @@ public static void fastunpack10(final int[] in, int inpos, final int[] out, int } - public static void fastunpack11(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack11(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 2047) ; out[1 + outpos] = ((in[0 + inpos] >>> 11) & 2047) @@ -4858,7 +4864,7 @@ public static void fastunpack11(final int[] in, int inpos, final int[] out, int } - public static void fastunpack12(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack12(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 4095) ; out[1 + outpos] = ((in[0 + inpos] >>> 12) & 4095) @@ -4934,7 +4940,7 @@ public static void fastunpack12(final int[] in, int inpos, final int[] out, int } - public static void fastunpack13(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack13(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 8191) ; out[1 + outpos] = ((in[0 + inpos] >>> 13) & 8191) @@ -5014,7 +5020,7 @@ public static void fastunpack13(final int[] in, int inpos, final int[] out, int } - public static void fastunpack14(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack14(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 16383) ; out[1 + outpos] = ((in[0 + inpos] >>> 14) & 16383) @@ -5094,7 +5100,7 @@ public static void fastunpack14(final int[] in, int inpos, final int[] out, int } - public static void fastunpack15(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack15(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 32767) ; out[1 + outpos] = ((in[0 + inpos] >>> 15) & 32767) @@ -5176,7 +5182,7 @@ public static void fastunpack15(final int[] in, int inpos, final int[] out, int } - public static void fastunpack16(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack16(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 65535) ; out[1 + outpos] = (in[0 + inpos] >>> 16) @@ -5244,7 +5250,7 @@ public static void fastunpack16(final int[] in, int inpos, final int[] out, int } - public static void fastunpack17(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack17(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 131071) ; out[1 + outpos] = (in[0 + inpos] >>> 17) @@ -5328,7 +5334,7 @@ public static void fastunpack17(final int[] in, int inpos, final int[] out, int } - public static void fastunpack18(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack18(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 262143) ; out[1 + outpos] = (in[0 + inpos] >>> 18) @@ -5412,7 +5418,7 @@ public static void fastunpack18(final int[] in, int inpos, final int[] out, int } - public static void fastunpack19(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack19(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 524287) ; out[1 + outpos] = (in[0 + inpos] >>> 19) @@ -5498,7 +5504,7 @@ public static void fastunpack19(final int[] in, int inpos, final int[] out, int } - public static void fastunpack20(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack20(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 1048575) ; out[1 + outpos] = (in[0 + inpos] >>> 20) @@ -5582,7 +5588,7 @@ public static void fastunpack20(final int[] in, int inpos, final int[] out, int } - public static void fastunpack21(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack21(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 2097151) ; out[1 + outpos] = (in[0 + inpos] >>> 21) @@ -5670,7 +5676,7 @@ public static void fastunpack21(final int[] in, int inpos, final int[] out, int } - public static void fastunpack22(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack22(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 4194303) ; out[1 + outpos] = (in[0 + inpos] >>> 22) @@ -5758,7 +5764,7 @@ public static void fastunpack22(final int[] in, int inpos, final int[] out, int } - public static void fastunpack23(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack23(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 8388607) ; out[1 + outpos] = (in[0 + inpos] >>> 23) @@ -5848,7 +5854,7 @@ public static void fastunpack23(final int[] in, int inpos, final int[] out, int } - public static void fastunpack24(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack24(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 16777215) ; out[1 + outpos] = (in[0 + inpos] >>> 24) @@ -5932,7 +5938,7 @@ public static void fastunpack24(final int[] in, int inpos, final int[] out, int } - public static void fastunpack25(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack25(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 33554431) ; out[1 + outpos] = (in[0 + inpos] >>> 25) @@ -6024,7 +6030,7 @@ public static void fastunpack25(final int[] in, int inpos, final int[] out, int } - public static void fastunpack26(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack26(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 67108863) ; out[1 + outpos] = (in[0 + inpos] >>> 26) @@ -6116,7 +6122,7 @@ public static void fastunpack26(final int[] in, int inpos, final int[] out, int } - public static void fastunpack27(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack27(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 134217727) ; out[1 + outpos] = (in[0 + inpos] >>> 27) @@ -6210,7 +6216,7 @@ public static void fastunpack27(final int[] in, int inpos, final int[] out, int } - public static void fastunpack28(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack28(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 268435455) ; out[1 + outpos] = (in[0 + inpos] >>> 28) @@ -6302,7 +6308,7 @@ public static void fastunpack28(final int[] in, int inpos, final int[] out, int } - public static void fastunpack29(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack29(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 536870911) ; out[1 + outpos] = (in[0 + inpos] >>> 29) @@ -6398,7 +6404,7 @@ public static void fastunpack29(final int[] in, int inpos, final int[] out, int } - public static void fastunpack30(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack30(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 1073741823) ; out[1 + outpos] = (in[0 + inpos] >>> 30) @@ -6494,7 +6500,7 @@ public static void fastunpack30(final int[] in, int inpos, final int[] out, int } - public static void fastunpack31(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack31(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 2147483647) ; out[1 + outpos] = (in[0 + inpos] >>> 31) @@ -6592,37 +6598,37 @@ public static void fastunpack31(final int[] in, int inpos, final int[] out, int } - public static void fastunpack32(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack32(final int[] in, int inpos, final int[] out, int outpos) { System.arraycopy(in, inpos, out, outpos, 32); } - public static void fastpack32(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack32(final int[] in, int inpos, final int[] out, int outpos) { System.arraycopy(in, inpos, out, outpos, 32); } - public static void fastpackwithoutmask32(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask32(final int[] in, int inpos, final int[] out, int outpos) { System.arraycopy(in, inpos, out, outpos, 32); } - public static void fastunpack0(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastunpack0(final int[] in, int inpos, final int[] out, int outpos) { Arrays.fill(out, outpos, outpos + 32, 0); } - public static void fastpack0(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpack0(final int[] in, int inpos, final int[] out, int outpos) { // nothing } - public static void fastpackwithoutmask0(final int[] in, int inpos, final int[] out, int outpos) { + protected static void fastpackwithoutmask0(final int[] in, int inpos, final int[] out, int outpos) { // nothing } - public static void fastunpack(final int[] in, int inpos, final int[] out, int outpos, final int bit) { + protected static void fastunpack(final int[] in, int inpos, final int[] out, int outpos, final int bit) { switch (bit) { case 0: fastunpack0(in, inpos, out, outpos); @@ -6729,7 +6735,7 @@ public static void fastunpack(final int[] in, int inpos, final int[] out, int ou } - public static void fastpack(final int[] in, int inpos, final int[] out, int outpos, final int bit) { + protected static void fastpack(final int[] in, int inpos, final int[] out, int outpos, final int bit) { switch (bit) { case 0: fastpack0(in, inpos, out, outpos); @@ -6836,7 +6842,7 @@ public static void fastpack(final int[] in, int inpos, final int[] out, int outp } - public static void fastpackwithoutmask(final int[] in, int inpos, final int[] out, int outpos, final int bit) { + protected static void fastpackwithoutmask(final int[] in, int inpos, final int[] out, int outpos, final int bit) { switch (bit) { case 0: fastpackwithoutmask0(in, inpos, out, outpos); diff --git a/src/main/java/me/lemire/integercompression/Composition.java b/src/main/java/me/lemire/integercompression/Composition.java index cc5f177..e6a5fb9 100644 --- a/src/main/java/me/lemire/integercompression/Composition.java +++ b/src/main/java/me/lemire/integercompression/Composition.java @@ -15,6 +15,14 @@ public class Composition implements IntegerCODEC { IntegerCODEC F1, F2; + /** + * Compose a scheme from a first one (f1) and a second one (f2). + * The first one is called first and then the second one tries to + * compress whatever remains from the first run. + * + * @param f1 first codec + * @param f2 second codec + */ public Composition(IntegerCODEC f1, IntegerCODEC f2) { F1 = f1; F2 = f2; diff --git a/src/main/java/me/lemire/integercompression/Delta.java b/src/main/java/me/lemire/integercompression/Delta.java index 91b2e31..372da82 100644 --- a/src/main/java/me/lemire/integercompression/Delta.java +++ b/src/main/java/me/lemire/integercompression/Delta.java @@ -10,7 +10,7 @@ /** * Generic class to compute differential coding. * - * @author lemire + * @author Daniel Lemire * */ public class Delta { diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 7a87e91..b6cb7a1 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -15,6 +15,8 @@ * For details, please see *

* Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second through vectorization + * Software: Practice & Experience + * http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract * http://arxiv.org/abs/1209.2137 *

* For sufficiently compressible arrays, it is faster and better than other PFOR diff --git a/src/main/java/me/lemire/integercompression/IntWrapper.java b/src/main/java/me/lemire/integercompression/IntWrapper.java index 02e4479..d875eb4 100644 --- a/src/main/java/me/lemire/integercompression/IntWrapper.java +++ b/src/main/java/me/lemire/integercompression/IntWrapper.java @@ -7,20 +7,33 @@ package me.lemire.integercompression; /** + * Essentially a mutable wrapper around an integer. + * * @author dwu */ public final class IntWrapper extends Number { private static final long serialVersionUID = 1L; private int value; + /** + * Constructor: value set to 0. + */ public IntWrapper() { this(0); } - public IntWrapper(int v) { + /** + * Construction: value set to provided argument. + * + * @param v value to wrap + */ + public IntWrapper(final int v) { this.value = v; } + /** + * @param v + */ public void add(int v) { this.value += v; } @@ -35,10 +48,16 @@ public float floatValue() { return this.value; } + /** + * @return the integer value + */ public int get() { return this.value; } + /** + * add 1 to the integer value + */ public void increment() { this.value++; } @@ -53,7 +72,11 @@ public long longValue() { return this.value; } - public void set(int value) { + /** + * Set the value to that of the specified integer. + * @param value specified integer value + */ + public void set(final int value) { this.value = value; } diff --git a/src/main/java/me/lemire/integercompression/IntegerCODEC.java b/src/main/java/me/lemire/integercompression/IntegerCODEC.java index d23c053..9a27f4a 100644 --- a/src/main/java/me/lemire/integercompression/IntegerCODEC.java +++ b/src/main/java/me/lemire/integercompression/IntegerCODEC.java @@ -8,6 +8,12 @@ package me.lemire.integercompression; +/** + * Interface describing a standard CODEC to compress integers. + * + * @author Daniel Lemire + * + */ public interface IntegerCODEC { /** * Compress data from an array to another array. @@ -18,6 +24,11 @@ public interface IntegerCODEC { * inpos will be incremented by 12 while outpos will be * incremented by 3 * we use IntWrapper to pass the values by reference. + * @param in input array + * @param inpos location in the input array + * @param inlength how many integers to compress + * @param out output array + * @param outpos where to write in the output array */ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos); diff --git a/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java b/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java index 6222ab5..0137d77 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java @@ -7,6 +7,10 @@ package me.lemire.integercompression; +/** + * @author Daniel Lemire + * + */ public class IntegratedBinaryPacking implements IntegratedIntegerCODEC { @Override @@ -43,7 +47,6 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWra @Override public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); final int outlength = in[inpos.get()]; inpos.increment(); int tmpinpos = inpos.get(); diff --git a/src/main/java/me/lemire/integercompression/IntegratedBitPacking.java b/src/main/java/me/lemire/integercompression/IntegratedBitPacking.java index 0327cd9..86f7265 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedBitPacking.java +++ b/src/main/java/me/lemire/integercompression/IntegratedBitPacking.java @@ -9,10 +9,17 @@ import java.util.Arrays; +/** + * "Integrated" bit packing routines: they include + * both the bit packing and the differential coding. + * + * @author Daniel Lemire + * + */ public final class IntegratedBitPacking { - public static void integratedpack1(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack1(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 1) | ((in[2 + inpos] - in[2 + inpos - 1]) << 2) @@ -49,7 +56,7 @@ public static void integratedpack1(final int initoffset, final int[] in, int inp } - public static void integratedpack2(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack2(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 2) | ((in[2 + inpos] - in[2 + inpos - 1]) << 4) @@ -87,7 +94,7 @@ public static void integratedpack2(final int initoffset, final int[] in, int inp } - public static void integratedpack3(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack3(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 3) | ((in[2 + inpos] - in[2 + inpos - 1]) << 6) @@ -128,7 +135,7 @@ public static void integratedpack3(final int initoffset, final int[] in, int inp } - public static void integratedpack4(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack4(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 4) | ((in[2 + inpos] - in[2 + inpos - 1]) << 8) @@ -168,7 +175,7 @@ public static void integratedpack4(final int initoffset, final int[] in, int inp } - public static void integratedpack5(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack5(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 5) | ((in[2 + inpos] - in[2 + inpos - 1]) << 10) @@ -213,7 +220,7 @@ public static void integratedpack5(final int initoffset, final int[] in, int inp } - public static void integratedpack6(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack6(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 6) | ((in[2 + inpos] - in[2 + inpos - 1]) << 12) @@ -259,7 +266,7 @@ public static void integratedpack6(final int initoffset, final int[] in, int inp } - public static void integratedpack7(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack7(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 7) | ((in[2 + inpos] - in[2 + inpos - 1]) << 14) @@ -308,7 +315,7 @@ public static void integratedpack7(final int initoffset, final int[] in, int inp } - public static void integratedpack8(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack8(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 8) | ((in[2 + inpos] - in[2 + inpos - 1]) << 16) @@ -352,7 +359,7 @@ public static void integratedpack8(final int initoffset, final int[] in, int inp } - public static void integratedpack9(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack9(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 9) | ((in[2 + inpos] - in[2 + inpos - 1]) << 18) @@ -405,7 +412,7 @@ public static void integratedpack9(final int initoffset, final int[] in, int inp } - public static void integratedpack10(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack10(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 10) | ((in[2 + inpos] - in[2 + inpos - 1]) << 20) @@ -459,7 +466,7 @@ public static void integratedpack10(final int initoffset, final int[] in, int in } - public static void integratedpack11(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack11(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 11) | ((in[2 + inpos] - in[2 + inpos - 1]) << 22) @@ -516,7 +523,7 @@ public static void integratedpack11(final int initoffset, final int[] in, int in } - public static void integratedpack12(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack12(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 12) | ((in[2 + inpos] - in[2 + inpos - 1]) << 24) @@ -572,7 +579,7 @@ public static void integratedpack12(final int initoffset, final int[] in, int in } - public static void integratedpack13(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack13(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 13) | ((in[2 + inpos] - in[2 + inpos - 1]) << 26) @@ -633,7 +640,7 @@ public static void integratedpack13(final int initoffset, final int[] in, int in } - public static void integratedpack14(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack14(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 14) | ((in[2 + inpos] - in[2 + inpos - 1]) << 28) @@ -695,7 +702,7 @@ public static void integratedpack14(final int initoffset, final int[] in, int in } - public static void integratedpack15(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack15(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 15) | ((in[2 + inpos] - in[2 + inpos - 1]) << 30) @@ -760,7 +767,7 @@ public static void integratedpack15(final int initoffset, final int[] in, int in } - public static void integratedpack16(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack16(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 16) ; @@ -812,7 +819,7 @@ public static void integratedpack16(final int initoffset, final int[] in, int in } - public static void integratedpack17(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack17(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 17) ; @@ -881,7 +888,7 @@ public static void integratedpack17(final int initoffset, final int[] in, int in } - public static void integratedpack18(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack18(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 18) ; @@ -951,7 +958,7 @@ public static void integratedpack18(final int initoffset, final int[] in, int in } - public static void integratedpack19(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack19(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 19) ; @@ -1024,7 +1031,7 @@ public static void integratedpack19(final int initoffset, final int[] in, int in } - public static void integratedpack20(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack20(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 20) ; @@ -1096,7 +1103,7 @@ public static void integratedpack20(final int initoffset, final int[] in, int in } - public static void integratedpack21(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack21(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 21) ; @@ -1173,7 +1180,7 @@ public static void integratedpack21(final int initoffset, final int[] in, int in } - public static void integratedpack22(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack22(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 22) ; @@ -1251,7 +1258,7 @@ public static void integratedpack22(final int initoffset, final int[] in, int in } - public static void integratedpack23(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack23(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 23) ; @@ -1332,7 +1339,7 @@ public static void integratedpack23(final int initoffset, final int[] in, int in } - public static void integratedpack24(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack24(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 24) ; @@ -1408,7 +1415,7 @@ public static void integratedpack24(final int initoffset, final int[] in, int in } - public static void integratedpack25(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack25(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 25) ; @@ -1493,7 +1500,7 @@ public static void integratedpack25(final int initoffset, final int[] in, int in } - public static void integratedpack26(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack26(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 26) ; @@ -1579,7 +1586,7 @@ public static void integratedpack26(final int initoffset, final int[] in, int in } - public static void integratedpack27(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack27(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 27) ; @@ -1668,7 +1675,7 @@ public static void integratedpack27(final int initoffset, final int[] in, int in } - public static void integratedpack28(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack28(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 28) ; @@ -1756,7 +1763,7 @@ public static void integratedpack28(final int initoffset, final int[] in, int in } - public static void integratedpack29(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack29(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 29) ; @@ -1849,7 +1856,7 @@ public static void integratedpack29(final int initoffset, final int[] in, int in } - public static void integratedpack30(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack30(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 30) ; @@ -1943,7 +1950,7 @@ public static void integratedpack30(final int initoffset, final int[] in, int in } - public static void integratedpack31(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack31(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) | ((in[1 + inpos] - in[1 + inpos - 1]) << 31) ; @@ -2040,7 +2047,7 @@ public static void integratedpack31(final int initoffset, final int[] in, int in } - public static void integratedunpack1(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack1(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 1) ) + initoffset; out[1 + outpos] = (((in[0 + inpos] >>> 1) & 1) @@ -2108,7 +2115,7 @@ public static void integratedunpack1(final int initoffset, final int[] in, int i } - public static void integratedunpack2(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack2(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 3) ) + initoffset; out[1 + outpos] = (((in[0 + inpos] >>> 2) & 3) @@ -2176,7 +2183,7 @@ public static void integratedunpack2(final int initoffset, final int[] in, int i } - public static void integratedunpack3(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack3(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 7) ) + initoffset; out[1 + outpos] = (((in[0 + inpos] >>> 3) & 7) @@ -2246,7 +2253,7 @@ public static void integratedunpack3(final int initoffset, final int[] in, int i } - public static void integratedunpack4(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack4(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 15) ) + initoffset; out[1 + outpos] = (((in[0 + inpos] >>> 4) & 15) @@ -2314,7 +2321,7 @@ public static void integratedunpack4(final int initoffset, final int[] in, int i } - public static void integratedunpack5(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack5(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 31) ) + initoffset; out[1 + outpos] = (((in[0 + inpos] >>> 5) & 31) @@ -2386,7 +2393,7 @@ public static void integratedunpack5(final int initoffset, final int[] in, int i } - public static void integratedunpack6(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack6(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 63) ) + initoffset; out[1 + outpos] = (((in[0 + inpos] >>> 6) & 63) @@ -2458,7 +2465,7 @@ public static void integratedunpack6(final int initoffset, final int[] in, int i } - public static void integratedunpack7(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack7(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 127) ) + initoffset; out[1 + outpos] = (((in[0 + inpos] >>> 7) & 127) @@ -2532,7 +2539,7 @@ public static void integratedunpack7(final int initoffset, final int[] in, int i } - public static void integratedunpack8(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack8(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 255) ) + initoffset; out[1 + outpos] = (((in[0 + inpos] >>> 8) & 255) @@ -2600,7 +2607,7 @@ public static void integratedunpack8(final int initoffset, final int[] in, int i } - public static void integratedunpack9(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack9(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 511) ) + initoffset; out[1 + outpos] = (((in[0 + inpos] >>> 9) & 511) @@ -2676,7 +2683,7 @@ public static void integratedunpack9(final int initoffset, final int[] in, int i } - public static void integratedunpack10(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack10(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 1023) ) + initoffset; out[1 + outpos] = (((in[0 + inpos] >>> 10) & 1023) @@ -2752,7 +2759,7 @@ public static void integratedunpack10(final int initoffset, final int[] in, int } - public static void integratedunpack11(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack11(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 2047) ) + initoffset; out[1 + outpos] = (((in[0 + inpos] >>> 11) & 2047) @@ -2830,7 +2837,7 @@ public static void integratedunpack11(final int initoffset, final int[] in, int } - public static void integratedunpack12(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack12(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 4095) ) + initoffset; out[1 + outpos] = (((in[0 + inpos] >>> 12) & 4095) @@ -2906,7 +2913,7 @@ public static void integratedunpack12(final int initoffset, final int[] in, int } - public static void integratedunpack13(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack13(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 8191) ) + initoffset; out[1 + outpos] = (((in[0 + inpos] >>> 13) & 8191) @@ -2986,7 +2993,7 @@ public static void integratedunpack13(final int initoffset, final int[] in, int } - public static void integratedunpack14(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack14(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 16383) ) + initoffset; out[1 + outpos] = (((in[0 + inpos] >>> 14) & 16383) @@ -3066,7 +3073,7 @@ public static void integratedunpack14(final int initoffset, final int[] in, int } - public static void integratedunpack15(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack15(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 32767) ) + initoffset; out[1 + outpos] = (((in[0 + inpos] >>> 15) & 32767) @@ -3148,7 +3155,7 @@ public static void integratedunpack15(final int initoffset, final int[] in, int } - public static void integratedunpack16(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack16(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 65535) ) + initoffset; out[1 + outpos] = ((in[0 + inpos] >>> 16) @@ -3216,7 +3223,7 @@ public static void integratedunpack16(final int initoffset, final int[] in, int } - public static void integratedunpack17(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack17(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 131071) ) + initoffset; out[1 + outpos] = ((in[0 + inpos] >>> 17) @@ -3300,7 +3307,7 @@ public static void integratedunpack17(final int initoffset, final int[] in, int } - public static void integratedunpack18(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack18(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 262143) ) + initoffset; out[1 + outpos] = ((in[0 + inpos] >>> 18) @@ -3384,7 +3391,7 @@ public static void integratedunpack18(final int initoffset, final int[] in, int } - public static void integratedunpack19(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack19(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 524287) ) + initoffset; out[1 + outpos] = ((in[0 + inpos] >>> 19) @@ -3470,7 +3477,7 @@ public static void integratedunpack19(final int initoffset, final int[] in, int } - public static void integratedunpack20(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack20(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 1048575) ) + initoffset; out[1 + outpos] = ((in[0 + inpos] >>> 20) @@ -3554,7 +3561,7 @@ public static void integratedunpack20(final int initoffset, final int[] in, int } - public static void integratedunpack21(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack21(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 2097151) ) + initoffset; out[1 + outpos] = ((in[0 + inpos] >>> 21) @@ -3642,7 +3649,7 @@ public static void integratedunpack21(final int initoffset, final int[] in, int } - public static void integratedunpack22(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack22(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 4194303) ) + initoffset; out[1 + outpos] = ((in[0 + inpos] >>> 22) @@ -3730,7 +3737,7 @@ public static void integratedunpack22(final int initoffset, final int[] in, int } - public static void integratedunpack23(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack23(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 8388607) ) + initoffset; out[1 + outpos] = ((in[0 + inpos] >>> 23) @@ -3820,7 +3827,7 @@ public static void integratedunpack23(final int initoffset, final int[] in, int } - public static void integratedunpack24(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack24(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 16777215) ) + initoffset; out[1 + outpos] = ((in[0 + inpos] >>> 24) @@ -3904,7 +3911,7 @@ public static void integratedunpack24(final int initoffset, final int[] in, int } - public static void integratedunpack25(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack25(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 33554431) ) + initoffset; out[1 + outpos] = ((in[0 + inpos] >>> 25) @@ -3996,7 +4003,7 @@ public static void integratedunpack25(final int initoffset, final int[] in, int } - public static void integratedunpack26(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack26(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 67108863) ) + initoffset; out[1 + outpos] = ((in[0 + inpos] >>> 26) @@ -4088,7 +4095,7 @@ public static void integratedunpack26(final int initoffset, final int[] in, int } - public static void integratedunpack27(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack27(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 134217727) ) + initoffset; out[1 + outpos] = ((in[0 + inpos] >>> 27) @@ -4182,7 +4189,7 @@ public static void integratedunpack27(final int initoffset, final int[] in, int } - public static void integratedunpack28(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack28(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 268435455) ) + initoffset; out[1 + outpos] = ((in[0 + inpos] >>> 28) @@ -4274,7 +4281,7 @@ public static void integratedunpack28(final int initoffset, final int[] in, int } - public static void integratedunpack29(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack29(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 536870911) ) + initoffset; out[1 + outpos] = ((in[0 + inpos] >>> 29) @@ -4370,7 +4377,7 @@ public static void integratedunpack29(final int initoffset, final int[] in, int } - public static void integratedunpack30(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack30(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 1073741823) ) + initoffset; out[1 + outpos] = ((in[0 + inpos] >>> 30) @@ -4466,7 +4473,7 @@ public static void integratedunpack30(final int initoffset, final int[] in, int } - public static void integratedunpack31(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack31(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (((in[0 + inpos] >>> 0) & 2147483647) ) + initoffset; out[1 + outpos] = ((in[0 + inpos] >>> 31) @@ -4564,27 +4571,27 @@ public static void integratedunpack31(final int initoffset, final int[] in, int } - public static void integratedunpack32(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack32(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { System.arraycopy(in, inpos, out, outpos, 32); // no sense in doing delta coding } - public static void integratedpack32(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack32(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { System.arraycopy(in, inpos, out, outpos, 32); // no sense in doing delta coding } - public static void integratedunpack0(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedunpack0(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { Arrays.fill(out, outpos, outpos + 32, initoffset); } - public static void integratedpack0(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { + protected static void integratedpack0(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { // nothing } - public static void integratedunpack(final int initoffset, final int[] in, int inpos, final int[] out, int outpos, final int bit) { + protected static void integratedunpack(final int initoffset, final int[] in, int inpos, final int[] out, int outpos, final int bit) { switch (bit) { case 0: integratedunpack0(initoffset, in, inpos, out, outpos); @@ -4691,7 +4698,7 @@ public static void integratedunpack(final int initoffset, final int[] in, int in } - public static void integratedpack(final int initoffset, final int[] in, int inpos, final int[] out, int outpos, final int bit) { + protected static void integratedpack(final int initoffset, final int[] in, int inpos, final int[] out, int outpos, final int bit) { switch (bit) { case 0: integratedpack0(initoffset, in, inpos, out, outpos); diff --git a/src/main/java/me/lemire/integercompression/IntegratedComposition.java b/src/main/java/me/lemire/integercompression/IntegratedComposition.java index 3567186..6e86334 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedComposition.java +++ b/src/main/java/me/lemire/integercompression/IntegratedComposition.java @@ -13,7 +13,15 @@ */ public class IntegratedComposition implements IntegratedIntegerCODEC { IntegratedIntegerCODEC F1, F2; - + + /** + * Compose a scheme from a first one (f1) and a second one (f2). + * The first one is called first and then the second one tries to + * compress whatever remains from the first run. + * + * @param f1 first codec + * @param f2 second codec + */ public IntegratedComposition(IntegratedIntegerCODEC f1, IntegratedIntegerCODEC f2) { F1 = f1; F2 = f2; diff --git a/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java b/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java index fcf7120..7d84114 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java +++ b/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java @@ -10,6 +10,10 @@ import java.nio.ByteBuffer; import java.nio.IntBuffer; +/** + * @author Daniel Lemire + * + */ public class IntegratedVariableByte implements IntegratedIntegerCODEC { @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, diff --git a/src/main/java/me/lemire/integercompression/JustCopy.java b/src/main/java/me/lemire/integercompression/JustCopy.java index a76875b..f0d7faa 100644 --- a/src/main/java/me/lemire/integercompression/JustCopy.java +++ b/src/main/java/me/lemire/integercompression/JustCopy.java @@ -8,11 +8,14 @@ package me.lemire.integercompression; +/** + * @author Daniel Lemire + * + */ public final class JustCopy implements IntegerCODEC { @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); System.arraycopy(in, inpos.get(), out, outpos.get(), inlength); inpos.add(inlength); outpos.add(inlength); @@ -20,7 +23,6 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWra @Override public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); System.arraycopy(in, inpos.get(), out, outpos.get(), inlength); inpos.add(inlength); outpos.add(inlength); diff --git a/src/main/java/me/lemire/integercompression/NewPFD.java b/src/main/java/me/lemire/integercompression/NewPFD.java index d3684f8..94ba5b6 100644 --- a/src/main/java/me/lemire/integercompression/NewPFD.java +++ b/src/main/java/me/lemire/integercompression/NewPFD.java @@ -24,7 +24,10 @@ public final class NewPFD implements IntegerCODEC { final static int BlockSize = 128; int[] exceptbuffer = new int[2 * BlockSize]; - + + /** + * Constructor for the NewPFD CODEC. + */ public NewPFD() { PageSize = 65536; } @@ -45,13 +48,13 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, } - public static final int[] bits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + protected static final int[] bits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 20, 32}; - public static final int[] invbits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + protected static final int[] invbits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}; - public static void getBestBFromData(int[] in, int pos, IntWrapper bestb, + protected static void getBestBFromData(int[] in, int pos, IntWrapper bestb, IntWrapper bestexcept) { final int mb = Util.maxbits(in, pos, BlockSize); int mini = 0; @@ -115,7 +118,6 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, @Override public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); int mynvalue = in[inpos.get()]; inpos.increment(); int finalout = outpos.get() + mynvalue; diff --git a/src/main/java/me/lemire/integercompression/NewPFDS9.java b/src/main/java/me/lemire/integercompression/NewPFDS9.java index 3e0d054..bb53b44 100644 --- a/src/main/java/me/lemire/integercompression/NewPFDS9.java +++ b/src/main/java/me/lemire/integercompression/NewPFDS9.java @@ -25,6 +25,9 @@ public final class NewPFDS9 implements IntegerCODEC { int[] exceptbuffer = new int[2 * BlockSize]; + /** + * Constructor for the NewPFDS9 CODEC. + */ public NewPFDS9() { PageSize = 65536; } @@ -45,13 +48,13 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, } - public static final int[] bits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + protected static final int[] bits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 20, 32}; - public static final int[] invbits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + protected static final int[] invbits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}; - public static void getBestBFromData(int[] in, int pos, IntWrapper bestb, + protected static void getBestBFromData(int[] in, int pos, IntWrapper bestb, IntWrapper bestexcept) { final int mb = Util.maxbits(in, pos, BlockSize); int mini = 0; @@ -115,7 +118,6 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, @Override public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); int mynvalue = in[inpos.get()]; inpos.increment(); int finalout = outpos.get() + mynvalue; diff --git a/src/main/java/me/lemire/integercompression/OptPFD.java b/src/main/java/me/lemire/integercompression/OptPFD.java index e815e2a..dce640f 100644 --- a/src/main/java/me/lemire/integercompression/OptPFD.java +++ b/src/main/java/me/lemire/integercompression/OptPFD.java @@ -25,6 +25,9 @@ public final class OptPFD implements IntegerCODEC { int[] exceptbuffer = new int[2 * BlockSize]; int[] sillybuffer = new int[2 * BlockSize]; + /** + * Constructor for the OptPFD CODEC. + */ public OptPFD() { PageSize = 65536; } @@ -45,9 +48,9 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, } - public static final int[] bits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + protected static final int[] bits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 20, 32}; - public static final int[] invbits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + protected static final int[] invbits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}; @@ -130,7 +133,6 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, @Override public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); int mynvalue = in[inpos.get()]; inpos.increment(); int finalout = outpos.get() + mynvalue; diff --git a/src/main/java/me/lemire/integercompression/OptPFDS9.java b/src/main/java/me/lemire/integercompression/OptPFDS9.java index bce2db7..97ba453 100644 --- a/src/main/java/me/lemire/integercompression/OptPFDS9.java +++ b/src/main/java/me/lemire/integercompression/OptPFDS9.java @@ -24,6 +24,9 @@ public final class OptPFDS9 implements IntegerCODEC { final static int BlockSize = 128; int[] exceptbuffer = new int[2 * BlockSize]; + /** + * Constructor for the OptPFDS9 CODEC. + */ public OptPFDS9() { PageSize = 65536; } @@ -45,13 +48,13 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, } - public static final int[] bits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + protected static final int[] bits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 20, 32}; - public static final int[] invbits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + protected static final int[] invbits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}; - void getBestBFromData(int[] in, int pos, IntWrapper bestb, + protected void getBestBFromData(int[] in, int pos, IntWrapper bestb, IntWrapper bestexcept) { final int mb = Util.maxbits(in, pos, BlockSize); int mini = 0; @@ -129,7 +132,6 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, @Override public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); int mynvalue = in[inpos.get()]; inpos.increment(); int finalout = outpos.get() + mynvalue; diff --git a/src/main/java/me/lemire/integercompression/S16.java b/src/main/java/me/lemire/integercompression/S16.java index 7f30d53..8b51cf1 100644 --- a/src/main/java/me/lemire/integercompression/S16.java +++ b/src/main/java/me/lemire/integercompression/S16.java @@ -14,8 +14,9 @@ */ public final class S16 { - public static int compress(int[] in, int currentPos, int inlength, - int out[], int tmpoutpos) { + + protected static int compress(final int[] in, int currentPos, int inlength, + final int out[], final int tmpoutpos) { int outpos = tmpoutpos; final int finalin = currentPos + inlength; while (currentPos < finalin) { @@ -28,8 +29,15 @@ public static int compress(int[] in, int currentPos, int inlength, } return outpos - tmpoutpos; } - - public static int estimatecompress(int[] in, int currentPos, int inlength) { + /** + * Estimate size of the compressed output. + * + * @param in array to compress + * @param currentPos where to start reading + * @param inlength how many integers to read + * @return estimated size of the output (in 32-bit integers) + */ + public static int estimatecompress(final int[] in, int currentPos, int inlength) { final int finalin = currentPos + inlength; int counter = 0; while (currentPos < finalin) { @@ -51,7 +59,8 @@ public static int estimatecompress(int[] in, int currentPos, int inlength) { * @param in the integer input array * @param inOffset the offset of the input in the number of integers * @param n the number of elements to be compressed - * @return the number of compressed integers + * @return the size of the outputs in 32-bit integers + * */ public static final int compressblock(int[] out, int outOffset, int[] in, int inOffset, int n) { @@ -75,7 +84,7 @@ public static final int compressblock(int[] out, int outOffset, int[] in, return -1; } - public static final int fakecompressblock(int[] in, int inOffset, int n) { + private static final int fakecompressblock(int[] in, int inOffset, int n) { int numIdx, j, num; for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; @@ -116,8 +125,8 @@ public static final int decompressblock(int[] out, int outOffset, int[] in, return num; } - public static void uncompress(int[] in, int tmpinpos, int inlength, - int[] out, int currentPos, int outlength) { + protected static void uncompress(final int[] in, int tmpinpos, final int inlength, + final int[] out, int currentPos, int outlength) { final int finalpos = tmpinpos + inlength; while (tmpinpos < finalpos) { final int howmany = decompressblock(out, currentPos, in, tmpinpos, diff --git a/src/main/java/me/lemire/integercompression/S9.java b/src/main/java/me/lemire/integercompression/S9.java index 7cc6acc..72fc062 100644 --- a/src/main/java/me/lemire/integercompression/S9.java +++ b/src/main/java/me/lemire/integercompression/S9.java @@ -11,8 +11,15 @@ * * @author Daniel Lemire */ - public final class S9 { + /** + * Estimate size of the compressed output. + * + * @param in array to compress + * @param currentPos where to start reading + * @param inlength how many integers to read + * @return estimated size of the output (in 32-bit integers) + */ public static int estimatecompress(int[] in, int currentPos, int inlength) { int tmpoutpos = 0; int finalpos = currentPos + inlength; @@ -35,7 +42,6 @@ public static int estimatecompress(int[] in, int currentPos, int inlength) { continue outer; } final int selector = 8; - // Util.assertTrue(codeNum[selector] == 1); if (in[currentPos] >= 1 << bitLength[selector]) throw new RuntimeException("Too big a number"); tmpoutpos++; @@ -45,7 +51,7 @@ public static int estimatecompress(int[] in, int currentPos, int inlength) { return tmpoutpos; } - public static int compress(int[] in, int currentPos, int inlength, int out[], + protected static int compress(int[] in, int currentPos, int inlength, int out[], int tmpoutpos) { int origtmpoutpos = tmpoutpos; int finalpos = currentPos + inlength; @@ -73,16 +79,14 @@ public static int compress(int[] in, int currentPos, int inlength, int out[], continue outer; } final int selector = 8; - // Util.assertTrue(codeNum[selector] == 1); if (in[currentPos] >= 1 << bitLength[selector]) throw new RuntimeException("Too big a number"); out[tmpoutpos++] = in[currentPos++] | (selector << 28); } - // Util.assertTrue(currentPos == finalpos); return tmpoutpos - origtmpoutpos; } - public static void uncompress(int[] in, int tmpinpos, int inlength, + protected static void uncompress(int[] in, int tmpinpos, int inlength, int[] out, int currentPos, int outlength) { int finallength = currentPos + outlength; @@ -163,8 +167,6 @@ public static void uncompress(int[] in, int tmpinpos, int inlength, } } } - // Util.assertTrue(currentPos == finallength); - // Util.assertTrue(tmpinpos <= finalin); } diff --git a/src/main/java/me/lemire/integercompression/Simple9.java b/src/main/java/me/lemire/integercompression/Simple9.java index 3029619..c97ba38 100644 --- a/src/main/java/me/lemire/integercompression/Simple9.java +++ b/src/main/java/me/lemire/integercompression/Simple9.java @@ -8,8 +8,11 @@ package me.lemire.integercompression; +/** + * @author Daniel Lemire + * + */ public final class Simple9 implements IntegerCODEC { - // @Override @Override public void compress(int[] in, IntWrapper inpos, int inlength, int out[], IntWrapper outpos) { @@ -266,7 +269,6 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, } } } - // Util.assertTrue(currentPos == finalout); outpos.set(currentPos); inpos.set(tmpinpos); diff --git a/src/main/java/me/lemire/integercompression/Util.java b/src/main/java/me/lemire/integercompression/Util.java index 45aa72f..961bb5b 100644 --- a/src/main/java/me/lemire/integercompression/Util.java +++ b/src/main/java/me/lemire/integercompression/Util.java @@ -9,7 +9,7 @@ /** * Routine utility functions. * - * @author lemire + * @author Daniel Lemire * */ public class Util { diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java new file mode 100644 index 0000000..7539e59 --- /dev/null +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -0,0 +1,219 @@ +package me.lemire.integercompression; + +import java.util.Arrays; +import java.util.Random; + +import me.lemire.integercompression.synth.ClusteredDataGenerator; + +import org.junit.Test; + +/** + * Just some basic sanity tests. + * + * @author Daniel Lemire + * + */ +public class BasicTest { + + /** + * Verify bitpacking + */ + @SuppressWarnings("static-method") + @Test + public void verify() { + System.out.println("Checking the code..."); + final int N = 32; + final int times = 1000; + Random r = new Random(); + int[] data = new int[N]; + int[] compressed = new int[N]; + int[] uncompressed = new int[N]; + for (int bit = 0; bit < 31; ++bit) { + for (int t = 0; t < times; ++t) { + for (int k = 0; k < N; ++k) { + data[k] = r.nextInt(1 << bit); + } + BitPacking.fastpack(data, 0, compressed, 0, bit); + BitPacking.fastunpack(compressed, 0, uncompressed, 0, bit); + if (!Arrays.equals(uncompressed, data)) { + throw new RuntimeException("bug " + bit); + } + } + } + System.out.println("Code appears to be correct."); + } + + /** + * Verify bitpacking without mask + */ + @SuppressWarnings("static-method") + @Test + public void verifyWithoutMask() { + System.out.println("Checking the code..."); + final int N = 32; + final int times = 1000; + Random r = new Random(); + int[] data = new int[N]; + int[] compressed = new int[N]; + int[] uncompressed = new int[N]; + for (int bit = 0; bit < 31; ++bit) { + for (int t = 0; t < times; ++t) { + for (int k = 0; k < N; ++k) { + data[k] = r.nextInt(1 << bit); + } + BitPacking.fastpackwithoutmask(data, 0, compressed, 0, bit); + BitPacking.fastunpack(compressed, 0, uncompressed, 0, bit); + if (!Arrays.equals(uncompressed, data)) { + throw new RuntimeException("bug " + bit); + } + } + } + System.out.println("Code appears to be correct."); + } + + /** + * Verify bitpacking with exception + */ + @SuppressWarnings("static-method") + @Test + public void verifyWithExceptions() { + System.out.println("Checking the code..."); + final int N = 32; + final int times = 1000; + Random r = new Random(); + int[] data = new int[N]; + int[] compressed = new int[N]; + int[] uncompressed = new int[N]; + for (int bit = 0; bit < 31; ++bit) { + for (int t = 0; t < times; ++t) { + for (int k = 0; k < N; ++k) { + data[k] = r.nextInt(); + } + BitPacking.fastpack(data, 0, compressed, 0, bit); + BitPacking.fastunpack(compressed, 0, uncompressed, 0, bit); + for (int k = 0; k < N; ++k) { + if ((data[k] & ((1 << bit) - 1)) != uncompressed[k]) { + for (int k2 = 0; k2 < N; ++k2) { + System.out.println((data[k] & ((1 << bit) - 1)) + " " + uncompressed[k]); + } + System.out.println(compressed[0]); + throw new RuntimeException("bug " + bit); + } + } + } + } + System.out.println("Code with overflow appears to be correct."); + } + + /** + * check that the codecs can be inverted. + */ + @SuppressWarnings("static-method") + @Test + public void basictest() { + test(5, 10); + test(5, 14); + test(2, 18); + } + /** + * check that there is no spurious output. + */ + @SuppressWarnings("static-method") + @Test + public void spuriousouttest() { + testSpurious(new IntegratedBinaryPacking()); + testSpurious(new BinaryPacking()); + testSpurious(new NewPFD()); + testSpurious(new NewPFDS9()); + testSpurious(new OptPFD()); + testSpurious(new OptPFDS9()); + testSpurious(new FastPFOR()); + } + + private static void testSpurious(IntegerCODEC c) { + int[] x = new int[1024]; + int[] y = new int[0]; + IntWrapper i0 = new IntWrapper(0); + IntWrapper i1 = new IntWrapper(0); + for(int inlength = 0; inlength <128;++inlength) { + c.compress(x, i0, inlength,y,i1); + } + } + + private static void test(int N, int nbr) { + ClusteredDataGenerator cdg = new ClusteredDataGenerator(); + for (int sparsity = 1; sparsity < 31 - nbr; sparsity += 4) { + System.out.println("#testing sparsity "+sparsity); + int[][] data = new int[N][]; + int Max = (1 << (nbr + sparsity)); + for (int k = 0; k < N; ++k) { + data[k] = cdg.generateClustered((1 << nbr), Max); + } + + testCodec(new IntegratedComposition(new IntegratedBinaryPacking(), + new IntegratedVariableByte()), data, Max); + testCodec(new JustCopy(), data, Max); + testCodec(new VariableByte(), data, Max); + testCodec(new IntegratedVariableByte(), data, Max); + testCodec(new Composition(new BinaryPacking(), new VariableByte()), + data, Max); + testCodec(new Composition(new NewPFD(), new VariableByte()), data, + Max); + testCodec(new Composition(new NewPFDS9(), new VariableByte()), + data, Max); + testCodec(new Composition(new OptPFD(), new VariableByte()), data, + Max); + testCodec(new Composition(new OptPFDS9(), new VariableByte()), + data, Max); + testCodec(new Composition(new FastPFOR(), new VariableByte()), + data, Max); + testCodec(new Simple9(), data, Max); + } + } + + private static void testCodec(IntegerCODEC c, int[][] data, int Max) { + int N = data.length; + int maxlength = 0; + for (int k = 0; k < N; ++k) { + if (data[k].length > maxlength) + maxlength = data[k].length; + } + int[] buffer = new int[maxlength + 1024]; + int[] dataout = new int[4 * maxlength + 1024]; + /* 4x + 1024 to account for the possibility of some negative compression */ + IntWrapper inpos = new IntWrapper(); + IntWrapper outpos = new IntWrapper(); + for (int k = 0; k < N; ++k) { + int[] backupdata = Arrays.copyOf(data[k], data[k].length); + // + inpos.set(1); + outpos.set(0); + if (!(c instanceof IntegratedIntegerCODEC)) { + Delta.delta(backupdata); + } + c.compress(backupdata, inpos, backupdata.length - inpos.get(), + dataout, outpos); + final int thiscompsize = outpos.get() + 1; + inpos.set(0); + outpos.set(1); + buffer[0] = backupdata[0]; + c.uncompress(dataout, inpos, thiscompsize - 1, buffer, outpos); + if (!(c instanceof IntegratedIntegerCODEC)) + Delta.fastinverseDelta(buffer); + // + if (outpos.get() != data[k].length) + throw new RuntimeException("we have a bug (diff length) " + c + + " expected " + data[k].length + " got " + + outpos.get()); + for (int m = 0; m < outpos.get(); ++m) + if (buffer[m] != data[k][m]) { + throw new RuntimeException( + "we have a bug (actual difference), expected " + + data[k][m] + " found " + buffer[m] + + " at " + m); + } + + } + } + +} From d0edb3706e0b373e5c7fcb96cdc2c07698f2be03 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 22 Jul 2013 18:11:40 -0400 Subject: [PATCH 019/412] [maven-release-plugin] prepare release JavaFastPFOR-0.0.4 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 59da688..5bf83c4 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.4-SNAPSHOT + 0.0.4 jar From e85a4836b997eeb713adef1e92140814abbdb40e Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 22 Jul 2013 18:11:44 -0400 Subject: [PATCH 020/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5bf83c4..f1b2c71 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.4 + 0.0.5-SNAPSHOT jar From 5e772f82bf770a2660e3d554fec9328632a82d45 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 22 Jul 2013 18:17:39 -0400 Subject: [PATCH 021/412] Better readme --- README.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index ec62755..9a680d4 100644 --- a/README.md +++ b/README.md @@ -28,9 +28,6 @@ in sorted orders. Most others do not. Maven ----- -Using this code in your own project is easy with maven, just add -the following code in your pom.xml file: - me.lemire.integercompression @@ -79,10 +76,9 @@ http://forums.linuxmint.com/viewtopic.php?f=42&t=93052 Maven central repository ------------------------ -You can download JavaFastPFOR from the Maven central repository: -http://repo1.maven.org/maven2/me/lemire/integercompression/JavaFastPFOR/ +Using this code in your own project is easy with maven, just add +the following code in your pom.xml file: -You can also specify the dependency in the Maven "pom.xml" file: @@ -97,10 +93,15 @@ you desire. +You can also download JavaFastPFOR from the Maven central repository: +http://repo1.maven.org/maven2/me/lemire/integercompression/JavaFastPFOR/ + + + What can I do? -------------- -Compile the code and execute integercompression.benchmark. +Compile the code and execute me.lemire.integercompression.Benchmark. I recommend running all the benchmarks with the "-server" flag. From 9fa815cff691df1c9ed7e797f329eea3123bf296 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 14 Aug 2013 14:09:43 -0400 Subject: [PATCH 022/412] Faster random data generation --- .../synth/UniformDataGenerator.java | 104 +++++++++++++----- 1 file changed, 77 insertions(+), 27 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java b/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java index 4ac2ae4..3408377 100644 --- a/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java +++ b/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java @@ -6,42 +6,92 @@ */ package me.lemire.integercompression.synth; +import java.util.Arrays; +import java.util.BitSet; +import java.util.HashSet; import java.util.Iterator; import java.util.Random; import java.util.TreeSet; /** - * This class will generate "clustered" lists of random integers. That is, the - * integers tend not to be randomly distributed. + * This class will generate "uniform" lists of random integers. * * @author Daniel Lemire */ public class UniformDataGenerator { - Random rand = new Random(); - - public UniformDataGenerator() { - } - - /** - * generates randomly N distinct integers from 0 to Max. - */ - int[] generateUniform(int N, int Max) { - if (N > Max) - throw new RuntimeException("not possible"); - int[] ans = new int[N]; - if (N == Max) { - for (int k = 0; k < N; ++k) - ans[k] = k; - return ans; + /** + * construct generator of random arrays. + */ + public UniformDataGenerator() { + this.rand = new Random(); } - // can be done faster: - TreeSet s = new TreeSet(); - while (s.size() < N) - s.add(new Integer(this.rand.nextInt(Max))); - Iterator i = s.iterator(); - for (int k = 0; k < N; ++k) - ans[k] = i.next().intValue(); - return ans; - } + + /** + * @param seed random seed + */ + public UniformDataGenerator(final int seed) { + this.rand = new Random(seed); + } + + /** + * generates randomly N distinct integers from 0 to Max. + */ + int[] generateUniformHash(int N, int Max) { + if (N > Max) + throw new RuntimeException("not possible"); + int[] ans = new int[N]; + if (N == Max) { + for (int k = 0; k < N; ++k) + ans[k] = k; + return ans; + } + HashSet s = new HashSet(); + while (s.size() < N) + s.add(new Integer(this.rand.nextInt(Max))); + Iterator i = s.iterator(); + for (int k = 0; k < N; ++k) + ans[k] = i.next().intValue(); + Arrays.sort(ans); + return ans; + } + + /** + * generates randomly N distinct integers from 0 to Max. + */ + public int[] generateUniform(int N, int Max) { + if (2048 * N > Max) + return generateUniformBitmap(N, Max); + return generateUniformHash(N, Max); + } + + /** + * generates randomly N distinct integers from 0 to Max. + */ + int[] generateUniformBitmap(int N, int Max) { + if (N > Max) + throw new RuntimeException("not possible"); + int[] ans = new int[N]; + if (N == Max) { + for (int k = 0; k < N; ++k) + ans[k] = k; + return ans; + } + BitSet bs = new BitSet(Max); + int cardinality = 0; + while (cardinality < N) { + int v = rand.nextInt(Max); + if (!bs.get(v)) { + bs.set(v); + cardinality++; + } + } + int pos = 0; + for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) { + ans[pos++] = i; + } + return ans; + } + + Random rand = new Random(); } From bb62feb48776bddb9f3b09008c934ba220de7a96 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Sat, 17 Aug 2013 13:01:15 -0400 Subject: [PATCH 023/412] Cleaning up data generator --- .../synth/UniformDataGenerator.java | 35 +++++++++++++------ 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java b/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java index 3408377..2677d7f 100644 --- a/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java +++ b/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java @@ -40,11 +40,6 @@ int[] generateUniformHash(int N, int Max) { if (N > Max) throw new RuntimeException("not possible"); int[] ans = new int[N]; - if (N == Max) { - for (int k = 0; k < N; ++k) - ans[k] = k; - return ans; - } HashSet s = new HashSet(); while (s.size() < N) s.add(new Integer(this.rand.nextInt(Max))); @@ -55,10 +50,33 @@ int[] generateUniformHash(int N, int Max) { return ans; } + /** + * output all integers from the range [0,Max) that are not + * in the array + */ + static int[] negate(int[] x, int Max) { + int[] ans = new int[Max - x.length]; + int i = 0; + int c = 0; + for (int j = 0; j < x.length; ++j) { + int v = x[j]; + for (; i < v; ++i) + ans[c++] = i; + ++i; + } + while (c < ans.length) + ans[c++] = i++; + return ans; + } + + /** * generates randomly N distinct integers from 0 to Max. */ public int[] generateUniform(int N, int Max) { + if(N * 2 > Max) { + return negate( generateUniform(Max - N, Max), Max ); + } if (2048 * N > Max) return generateUniformBitmap(N, Max); return generateUniformHash(N, Max); @@ -71,11 +89,6 @@ int[] generateUniformBitmap(int N, int Max) { if (N > Max) throw new RuntimeException("not possible"); int[] ans = new int[N]; - if (N == Max) { - for (int k = 0; k < N; ++k) - ans[k] = k; - return ans; - } BitSet bs = new BitSet(Max); int cardinality = 0; while (cardinality < N) { @@ -94,4 +107,4 @@ int[] generateUniformBitmap(int N, int Max) { Random rand = new Random(); -} +} \ No newline at end of file From 92572551214e7ee0716d04fb76b5c099ee58170d Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 2 Sep 2013 10:30:23 -0400 Subject: [PATCH 024/412] Changed the package name --- example.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example.java b/example.java index 7097ebc..fd7430e 100644 --- a/example.java +++ b/example.java @@ -1,4 +1,4 @@ -import integercompression.*; +import me.lemire.integercompression.*; import java.util.*; public class example { From 1768bd72a174d80cd4745922c406695a39f2d200 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 3 Sep 2013 15:33:53 +0900 Subject: [PATCH 025/412] test to check boudary of length, which failed --- .../integercompression/BoundaryTest.java | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/test/java/me/lemire/integercompression/BoundaryTest.java diff --git a/src/test/java/me/lemire/integercompression/BoundaryTest.java b/src/test/java/me/lemire/integercompression/BoundaryTest.java new file mode 100644 index 0000000..efd0fcc --- /dev/null +++ b/src/test/java/me/lemire/integercompression/BoundaryTest.java @@ -0,0 +1,59 @@ +package me.lemire.integercompression; + +import java.util.Arrays; + +import org.junit.Test; +import static org.junit.Assert.*; + +public class BoundaryTest +{ + private IntegratedComposition newComposition() { + return new IntegratedComposition( + new IntegratedBinaryPacking(), + new IntegratedVariableByte()); + } + + private void compressAndUncompress(int length, IntegratedComposition c) + throws Exception + { + // Initialize array. + int[] source = new int[length]; + for (int i = 0; i < source.length; ++i) { + source[i] = i; + } + + // Compress an array. + int[] compressed = new int[length]; + IntWrapper c_inpos = new IntWrapper(0); + IntWrapper c_outpos = new IntWrapper(0); + c.compress(source, c_inpos, source.length, compressed, c_outpos); + assertTrue(c_outpos.get() <= length); + + // Uncompress an array. + int[] uncompressed = new int[length]; + IntWrapper u_inpos = new IntWrapper(0); + IntWrapper u_outpos = new IntWrapper(0); + c.uncompress(compressed, u_inpos, c_outpos.get(), + uncompressed, u_outpos); + + // Compare between uncompressed and original arrays. + int[] target = Arrays.copyOf(uncompressed, u_outpos.get()); + assertArrayEquals(source, target); + } + + @Test + public void around128() throws Exception { + IntegratedComposition c = newComposition(); + compressAndUncompress(127, c); + compressAndUncompress(128, c); + compressAndUncompress(129, c); + } + + @Test + public void around256() throws Exception { + IntegratedComposition c = newComposition(); + compressAndUncompress(255, c); + compressAndUncompress(255, c); + compressAndUncompress(257, c); + } +} From 2c7ad819efc3ec705d81b6d0ed62056062e59ef9 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 3 Sep 2013 15:56:45 +0900 Subject: [PATCH 026/412] supports short compress --- .../me/lemire/integercompression/IntegratedComposition.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/me/lemire/integercompression/IntegratedComposition.java b/src/main/java/me/lemire/integercompression/IntegratedComposition.java index 6e86334..b7bc3cf 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedComposition.java +++ b/src/main/java/me/lemire/integercompression/IntegratedComposition.java @@ -32,6 +32,10 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { int init = inpos.get(); F1.compress(in, inpos, inlength, out, outpos); + if (outpos.get() == 0) { + out[0] = 0; + outpos.increment(); + } inlength -= inpos.get() - init; F2.compress(in, inpos, inlength, out, outpos); } From e17ed1481705d58f473725f7eefeabc4a418c22d Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 3 Sep 2013 17:56:45 +0900 Subject: [PATCH 027/412] fix same problem on Composition --- .../integercompression/Composition.java | 4 ++ .../integercompression/BoundaryTest.java | 39 ++++++++++++------- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/Composition.java b/src/main/java/me/lemire/integercompression/Composition.java index e6a5fb9..a95e44a 100644 --- a/src/main/java/me/lemire/integercompression/Composition.java +++ b/src/main/java/me/lemire/integercompression/Composition.java @@ -33,6 +33,10 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { int init = inpos.get(); F1.compress(in, inpos, inlength, out, outpos); + if (outpos.get() == 0) { + out[0] = 0; + outpos.increment(); + } inlength -= inpos.get() - init; F2.compress(in, inpos, inlength, out, outpos); } diff --git a/src/test/java/me/lemire/integercompression/BoundaryTest.java b/src/test/java/me/lemire/integercompression/BoundaryTest.java index efd0fcc..e047678 100644 --- a/src/test/java/me/lemire/integercompression/BoundaryTest.java +++ b/src/test/java/me/lemire/integercompression/BoundaryTest.java @@ -7,15 +7,7 @@ public class BoundaryTest { - private IntegratedComposition newComposition() { - return new IntegratedComposition( - new IntegratedBinaryPacking(), - new IntegratedVariableByte()); - } - - private void compressAndUncompress(int length, IntegratedComposition c) - throws Exception - { + private static void compressAndUncompress(int length, IntegerCODEC c) { // Initialize array. int[] source = new int[length]; for (int i = 0; i < source.length; ++i) { @@ -41,19 +33,36 @@ private void compressAndUncompress(int length, IntegratedComposition c) assertArrayEquals(source, target); } - @Test - public void around128() throws Exception { - IntegratedComposition c = newComposition(); + private static void around128(IntegerCODEC c) { compressAndUncompress(127, c); compressAndUncompress(128, c); compressAndUncompress(129, c); } - @Test - public void around256() throws Exception { - IntegratedComposition c = newComposition(); + private static void around256(IntegerCODEC c) { compressAndUncompress(255, c); compressAndUncompress(255, c); compressAndUncompress(257, c); } + + private static void testBoundary(IntegerCODEC c) { + around128(c); + around256(c); + } + + @Test + public void testIntegratedComposition() throws Exception { + IntegratedComposition c = new IntegratedComposition( + new IntegratedBinaryPacking(), + new IntegratedVariableByte()); + testBoundary(c); + } + + @Test + public void testComposition() throws Exception { + Composition c = new Composition( + new BinaryPacking(), + new VariableByte()); + testBoundary(c); + } } From f121be4fa14c9bee817957bbddb2c6441058c0be Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 3 Sep 2013 18:26:51 +0900 Subject: [PATCH 028/412] fix mistake on parameter --- src/test/java/me/lemire/integercompression/BoundaryTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/me/lemire/integercompression/BoundaryTest.java b/src/test/java/me/lemire/integercompression/BoundaryTest.java index e047678..f8539d8 100644 --- a/src/test/java/me/lemire/integercompression/BoundaryTest.java +++ b/src/test/java/me/lemire/integercompression/BoundaryTest.java @@ -41,7 +41,7 @@ private static void around128(IntegerCODEC c) { private static void around256(IntegerCODEC c) { compressAndUncompress(255, c); - compressAndUncompress(255, c); + compressAndUncompress(256, c); compressAndUncompress(257, c); } From 244ba8e0dc2487fe03701bcd4d42a4414c7a26f5 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 3 Sep 2013 10:26:32 -0400 Subject: [PATCH 029/412] Added some unit testing --- .../integercompression/BinaryPacking.java | 1 + .../integercompression/Composition.java | 8 +++- .../lemire/integercompression/FastPFOR.java | 1 + .../IntegratedBinaryPacking.java | 1 + .../IntegratedComposition.java | 8 +++- .../me/lemire/integercompression/NewPFD.java | 1 + .../lemire/integercompression/NewPFDS9.java | 1 + .../me/lemire/integercompression/OptPFD.java | 1 + .../lemire/integercompression/OptPFDS9.java | 1 + .../integercompression/VariableByte.java | 1 + .../lemire/integercompression/BasicTest.java | 45 +++++++++++++++++++ 11 files changed, 67 insertions(+), 2 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/BinaryPacking.java b/src/main/java/me/lemire/integercompression/BinaryPacking.java index ad02965..98d93a1 100644 --- a/src/main/java/me/lemire/integercompression/BinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/BinaryPacking.java @@ -44,6 +44,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWra @Override public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + if(inlength == 0) return; final int outlength = in[inpos.get()]; inpos.increment(); int tmpinpos = inpos.get(); diff --git a/src/main/java/me/lemire/integercompression/Composition.java b/src/main/java/me/lemire/integercompression/Composition.java index a95e44a..eb1fd4e 100644 --- a/src/main/java/me/lemire/integercompression/Composition.java +++ b/src/main/java/me/lemire/integercompression/Composition.java @@ -20,6 +20,10 @@ public class Composition implements IntegerCODEC { * The first one is called first and then the second one tries to * compress whatever remains from the first run. * + * By convention, the first scheme should be such that if, during + * decoding, a 32-bit zero is first encountered, then there is no + * output. + * * @param f1 first codec * @param f2 second codec */ @@ -31,6 +35,7 @@ public Composition(IntegerCODEC f1, IntegerCODEC f2) { @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + if(inlength == 0) return; int init = inpos.get(); F1.compress(in, inpos, inlength, out, outpos); if (outpos.get() == 0) { @@ -44,7 +49,8 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, @Override public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - int init = inpos.get(); + if(inlength == 0) return; + final int init = inpos.get(); F1.uncompress(in, inpos, inlength, out, outpos); inlength -= inpos.get() - init; F2.uncompress(in, inpos, inlength, out, outpos); diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index b6cb7a1..4b0afc1 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -192,6 +192,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, @Override public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + if(inlength == 0) return; int mynvalue = in[inpos.get()]; inpos.increment(); int finalout = outpos.get() + mynvalue; diff --git a/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java b/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java index 0137d77..4b058ae 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java @@ -47,6 +47,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWra @Override public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + if(inlength == 0) return; final int outlength = in[inpos.get()]; inpos.increment(); int tmpinpos = inpos.get(); diff --git a/src/main/java/me/lemire/integercompression/IntegratedComposition.java b/src/main/java/me/lemire/integercompression/IntegratedComposition.java index b7bc3cf..324d30c 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedComposition.java +++ b/src/main/java/me/lemire/integercompression/IntegratedComposition.java @@ -19,6 +19,10 @@ public class IntegratedComposition implements IntegratedIntegerCODEC { * The first one is called first and then the second one tries to * compress whatever remains from the first run. * + * By convention, the first scheme should be such that if, during + * decoding, a 32-bit zero is first encountered, then there is no + * output. + * * @param f1 first codec * @param f2 second codec */ @@ -30,7 +34,8 @@ public IntegratedComposition(IntegratedIntegerCODEC f1, IntegratedIntegerCODEC f @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - int init = inpos.get(); + if(inlength == 0) return; + final int init = inpos.get(); F1.compress(in, inpos, inlength, out, outpos); if (outpos.get() == 0) { out[0] = 0; @@ -43,6 +48,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, @Override public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + if(inlength == 0) return; int init = inpos.get(); F1.uncompress(in, inpos, inlength, out, outpos); inlength -= inpos.get() - init; diff --git a/src/main/java/me/lemire/integercompression/NewPFD.java b/src/main/java/me/lemire/integercompression/NewPFD.java index 94ba5b6..d3ebc24 100644 --- a/src/main/java/me/lemire/integercompression/NewPFD.java +++ b/src/main/java/me/lemire/integercompression/NewPFD.java @@ -118,6 +118,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, @Override public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + if(inlength == 0) return; int mynvalue = in[inpos.get()]; inpos.increment(); int finalout = outpos.get() + mynvalue; diff --git a/src/main/java/me/lemire/integercompression/NewPFDS9.java b/src/main/java/me/lemire/integercompression/NewPFDS9.java index bb53b44..f0534a1 100644 --- a/src/main/java/me/lemire/integercompression/NewPFDS9.java +++ b/src/main/java/me/lemire/integercompression/NewPFDS9.java @@ -118,6 +118,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, @Override public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + if(inlength == 0) return; int mynvalue = in[inpos.get()]; inpos.increment(); int finalout = outpos.get() + mynvalue; diff --git a/src/main/java/me/lemire/integercompression/OptPFD.java b/src/main/java/me/lemire/integercompression/OptPFD.java index dce640f..7600738 100644 --- a/src/main/java/me/lemire/integercompression/OptPFD.java +++ b/src/main/java/me/lemire/integercompression/OptPFD.java @@ -133,6 +133,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, @Override public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + if(inlength == 0) return; int mynvalue = in[inpos.get()]; inpos.increment(); int finalout = outpos.get() + mynvalue; diff --git a/src/main/java/me/lemire/integercompression/OptPFDS9.java b/src/main/java/me/lemire/integercompression/OptPFDS9.java index 97ba453..981b5f0 100644 --- a/src/main/java/me/lemire/integercompression/OptPFDS9.java +++ b/src/main/java/me/lemire/integercompression/OptPFDS9.java @@ -132,6 +132,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, @Override public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + if(inlength == 0) return; int mynvalue = in[inpos.get()]; inpos.increment(); int finalout = outpos.get() + mynvalue; diff --git a/src/main/java/me/lemire/integercompression/VariableByte.java b/src/main/java/me/lemire/integercompression/VariableByte.java index 53d4bb4..f1adf25 100644 --- a/src/main/java/me/lemire/integercompression/VariableByte.java +++ b/src/main/java/me/lemire/integercompression/VariableByte.java @@ -18,6 +18,7 @@ public class VariableByte implements IntegerCODEC { @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + if(inlength == 0) return; ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { int val = in[k]; diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 7539e59..2cf1760 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -3,6 +3,8 @@ import java.util.Arrays; import java.util.Random; +import junit.framework.Assert; + import me.lemire.integercompression.synth.ClusteredDataGenerator; import org.junit.Test; @@ -128,7 +130,36 @@ public void spuriousouttest() { testSpurious(new OptPFD()); testSpurious(new OptPFDS9()); testSpurious(new FastPFOR()); + } + /** + * check that an empty array generates an empty array + * after compression. + */ + @SuppressWarnings("static-method") + @Test + public void zeroinzerouttest() { + testZeroInZeroOut(new IntegratedBinaryPacking()); + testZeroInZeroOut(new BinaryPacking()); + testZeroInZeroOut(new NewPFD()); + testZeroInZeroOut(new NewPFDS9()); + testZeroInZeroOut(new OptPFD()); + testZeroInZeroOut(new OptPFDS9()); + testZeroInZeroOut(new FastPFOR()); + testZeroInZeroOut(new VariableByte()); + testZeroInZeroOut(new Composition(new IntegratedBinaryPacking(), new VariableByte())); + testZeroInZeroOut(new Composition(new BinaryPacking(), new VariableByte())); + testZeroInZeroOut(new Composition(new NewPFD(), new VariableByte())); + testZeroInZeroOut(new Composition(new NewPFDS9(), new VariableByte())); + testZeroInZeroOut(new Composition(new OptPFD(), new VariableByte())); + testZeroInZeroOut(new Composition(new OptPFDS9(), new VariableByte())); + testZeroInZeroOut(new Composition(new FastPFOR(), new VariableByte())); + + testZeroInZeroOut(new IntegratedComposition(new IntegratedBinaryPacking(), + new IntegratedVariableByte())); + + } + private static void testSpurious(IntegerCODEC c) { int[] x = new int[1024]; @@ -137,9 +168,23 @@ private static void testSpurious(IntegerCODEC c) { IntWrapper i1 = new IntWrapper(0); for(int inlength = 0; inlength <128;++inlength) { c.compress(x, i0, inlength,y,i1); + Assert.assertEquals(i1.intValue(), 0); } } + private static void testZeroInZeroOut(IntegerCODEC c) { + int[] x = new int[0]; + int[] y = new int[0]; + IntWrapper i0 = new IntWrapper(0); + IntWrapper i1 = new IntWrapper(0); + c.compress(x, i0, 0,y,i1); + Assert.assertEquals(i1.intValue(), 0); + int[] out = new int[0]; + IntWrapper outpos = new IntWrapper(0); + c.uncompress(y, i1, 0, out, outpos); + Assert.assertEquals(outpos.intValue(), 0); + } + private static void test(int N, int nbr) { ClusteredDataGenerator cdg = new ClusteredDataGenerator(); for (int sparsity = 1; sparsity < 31 - nbr; sparsity += 4) { From 355807a9d1588b4b19b284698f64b77b3840800d Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 3 Sep 2013 12:12:25 -0400 Subject: [PATCH 030/412] Two bug fixes. About to create a new version (0.0.5) --- CHANGELOG | 4 ++ README.md | 3 +- .../lemire/integercompression/FastPFOR.java | 20 +++++----- .../lemire/integercompression/BasicTest.java | 40 +++++++++++++++++++ 4 files changed, 56 insertions(+), 11 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 54a8358..c71433b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +0.0.5 (Sept. 3rd 2013) + - Fixed problem with FastPFOR when integers contain negatives (samuelbosch) + - Fixed problem with composition with short arrays (MURAOKA Taro) + 0.0.4 (July 22nd 2013) - moved unit testing to comply with maven standard - codecs that have length limits no longer write out if they don't read in (Jimmy Lin) diff --git a/README.md b/README.md index 9a680d4..d6d1df6 100644 --- a/README.md +++ b/README.md @@ -52,8 +52,9 @@ Authors Main contributor Daniel Lemire, http://lemire.me/en/ -Minor contribution by +Contributions by Di Wu, http://www.facebook.com/diwu1989 +Muraoka Taro, https://github.com/koron How does it compare to the Kamikaze PForDelta library? diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 4b0afc1..afe7da5 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -80,10 +80,11 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, private static void getBestBFromData(int[] in, int pos, byte[] bestbbestcexceptmaxb) { - int freqs[] = new int[32]; - for (int k = pos; k < BlockSize + pos; ++k) + int freqs[] = new int[33]; + for (int k = pos; k < BlockSize + pos; ++k) { freqs[Util.bits(in[k])]++; - bestbbestcexceptmaxb[0] = 31; + } + bestbbestcexceptmaxb[0] = 32; while (freqs[bestbbestcexceptmaxb[0]] == 0) bestbbestcexceptmaxb[0]--; bestbbestcexceptmaxb[2] = bestbbestcexceptmaxb[0]; @@ -116,7 +117,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, final int headerpos = outpos.get(); outpos.increment(); int tmpoutpos = outpos.get(); - int[] datapointers = new int[32]; + int[] datapointers = new int[33]; bytecontainer.clear(); final byte[] bestbbestcexceptmaxb = new byte[3]; int tmpinpos = inpos.get(); @@ -126,8 +127,8 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, bytecontainer.put(bestbbestcexceptmaxb[0]); bytecontainer.put(bestbbestcexceptmaxb[1]); if (bestbbestcexceptmaxb[1] > 0) { - bytecontainer.put(bestbbestcexceptmaxb[2]); - final int index = bestbbestcexceptmaxb[2] + bytecontainer.put(bestbbestcexceptmaxb[2]); + final int index = bestbbestcexceptmaxb[2] - bestbbestcexceptmaxb[0]; if (datapointers[index] + bestbbestcexceptmaxb[1] >= datatobepacked[index].length) { int newsize = 2 * (datapointers[index] + bestbbestcexceptmaxb[1]); @@ -137,15 +138,15 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, datatobepacked[index] = Arrays.copyOf( datatobepacked[index], newsize); } - final int maxval = 1 << bestbbestcexceptmaxb[0]; for (int k = 0; k < BlockSize; ++k) { - if (in[k + tmpinpos] >= maxval) { + if ((in[k + tmpinpos] >>> bestbbestcexceptmaxb[0]) != 0) { // we have an exception bytecontainer.put((byte) k); datatobepacked[index][datapointers[index]++] = in[k + tmpinpos] >>> tmpbestb; } } + } for (int k = 0; k < 128; k += 32) { BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, tmpbestb); @@ -163,13 +164,12 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, bytecontainer.asIntBuffer().get(out, tmpoutpos, howmanyints); tmpoutpos += howmanyints; int bitmap = 0; - for (int k = 1; k <= 31; ++k) { + for (int k = 1; k <= 32; ++k) { if (datapointers[k] != 0) bitmap |= (1 << (k - 1)); } out[tmpoutpos++] = bitmap; for (int k = 1; k <= 31; ++k) { - if (datapointers[k] != 0) { out[tmpoutpos++] = datapointers[k];// size for (int j = 0; j < datapointers[k]; j += 32) { diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 2cf1760..0e77109 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -261,4 +261,44 @@ private static void testCodec(IntegerCODEC c, int[][] data, int Max) { } } + @SuppressWarnings("static-method") + @Test + public void testUnsortedExample() { + final int N = 1333333; + int[] data = new int[N]; + // initialize the data (most will be small + for (int k = 0; k < N; k += 1) + data[k] = 3; + // throw some larger values + for (int k = 0; k < N; k += 5) + data[k] = 100; + for (int k = 0; k < N; k += 533) + data[k] = 10000; + data[5] = -311; + int[] compressed = new int[N];// could need more + IntegerCODEC codec = new Composition(new FastPFOR(), + new VariableByte()); + // compressing + IntWrapper inputoffset = new IntWrapper(0); + IntWrapper outputoffset = new IntWrapper(0); + codec.compress(data, inputoffset, data.length, compressed, + outputoffset); + System.out.println("compressed unsorted integers from " + + data.length * 4 / 1024 + "KB to " + + outputoffset.intValue() * 4 / 1024 + "KB"); + // we can repack the data: (optional) + compressed = Arrays.copyOf(compressed, outputoffset.intValue()); + + int[] recovered = new int[N]; + IntWrapper recoffset = new IntWrapper(0); + codec.uncompress(compressed, new IntWrapper(0), + compressed.length, recovered, recoffset); + if (Arrays.equals(data, recovered)) + System.out.println("data is recovered without loss"); + else + throw new RuntimeException("bug"); // could use assert + System.out.println(); + + } + } From 11e88f8f1969a8aa1f824aba4841a26a815d810d Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 3 Sep 2013 12:13:41 -0400 Subject: [PATCH 031/412] [maven-release-plugin] prepare release JavaFastPFOR-0.0.5 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f1b2c71..47bfe67 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.5-SNAPSHOT + 0.0.5 jar From 369ac6bce8445c791d1e11425b281c6d4311b4a4 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 3 Sep 2013 12:13:44 -0400 Subject: [PATCH 032/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 47bfe67..6497436 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.5 + 0.0.6-SNAPSHOT jar From 0c585122e5012f06fa224232f349f5ed86f84db3 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 3 Sep 2013 12:17:52 -0400 Subject: [PATCH 033/412] Updated README.md file --- README.md | 74 +++++++++++++++++++++++-------------------------------- 1 file changed, 31 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index d6d1df6..e521186 100644 --- a/README.md +++ b/README.md @@ -25,25 +25,37 @@ Hadoop tools for manipulating ClueWeb collections Some CODECs ("integrated codecs") assume that the integers are in sorted orders. Most others do not. -Maven ------ + +Maven central repository +------------------------ + +Using this code in your own project is easy with maven, just add +the following code in your pom.xml file: + - - me.lemire.integercompression - JavaFastPFOR - 0.0.4 - - + + me.lemire.integercompression + JavaFastPFOR + 0.0.5 + + + +Naturally, you should replace "version" by the version +you desire. + + + +You can also download JavaFastPFOR from the Maven central repository: +http://repo1.maven.org/maven2/me/lemire/integercompression/JavaFastPFOR/ + Why? ---- -I found a few libraries that implemented Binary Packing, NewPFD, OptPFD, -Variable Byte, Simple 9 and so on in Java. However, I could not find -one that I liked. - -I threw in a cool little benchmark program. +We found no library that implemented state-of-the-art integer coding techniques +such as Binary Packing, NewPFD, OptPFD, Variable Byte, Simple 9 and so on in Java. +We wrote one. Authors @@ -74,37 +86,18 @@ Good instructions on installing Java 7 on Linux: http://forums.linuxmint.com/viewtopic.php?f=42&t=93052 -Maven central repository ------------------------- - -Using this code in your own project is easy with maven, just add -the following code in your pom.xml file: - - - - - me.lemire.integercompression - JavaFastPFOR - 0.0.3 - - - -Naturally, you should replace "version" by the version -you desire. - - - -You can also download JavaFastPFOR from the Maven central repository: -http://repo1.maven.org/maven2/me/lemire/integercompression/JavaFastPFOR/ +Usage +----- +See example.java for a simple demonstration. -What can I do? --------------- +How fast is it? +--------------- Compile the code and execute me.lemire.integercompression.Benchmark. -I recommend running all the benchmarks with the "-server" flag. +I recommend running all the benchmarks with the "-server" flag on a desktop machine. Speed is always reported in millions of integers per second. @@ -128,11 +121,6 @@ or: $ ant Benchmark -Dbenchmark.target=BenchmarkBitPacking -Usage ------ - -See example.java for a simple demonstration. - Want to read more? ------------------ From cf63b7d5aec39ca0d5d8c52c030788eaed4abee0 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 3 Sep 2013 12:22:56 -0400 Subject: [PATCH 034/412] Adding the prebuilt library for version 0.0.5 for convenience. --- prebuiltbinaries/JavaFastPFOR-0.0.5.jar | Bin 0 -> 122081 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 prebuiltbinaries/JavaFastPFOR-0.0.5.jar diff --git a/prebuiltbinaries/JavaFastPFOR-0.0.5.jar b/prebuiltbinaries/JavaFastPFOR-0.0.5.jar new file mode 100644 index 0000000000000000000000000000000000000000..615ebec13e8d5f3ed4244400ff2724c7177b6d4d GIT binary patch literal 122081 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 z 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�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 literal 0 HcmV?d00001 From 31681ff8555a7ddc5a5ac986720225355b20ba0d Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 3 Sep 2013 12:24:14 -0400 Subject: [PATCH 035/412] Removing obsolete TODO --- TODO | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 TODO diff --git a/TODO b/TODO deleted file mode 100644 index c0c7320..0000000 --- a/TODO +++ /dev/null @@ -1,14 +0,0 @@ -TODO -Last modif: Daniel Lemire, July 6, 2012 - - -1) Implement Simple16. (Done in Feb. 2013). - -2) Implement Simple8b. - -3) Implement VSEncoding. - -4) Implement SimplePFOR. - -5) Implement block-by-block coding and decoding for the -block-based schemes (Binary Packing, NewPFD, and so on). From a3c34cfb1eab105adf0960019fd55618ab1ede7a Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Wed, 4 Sep 2013 22:50:12 +0900 Subject: [PATCH 036/412] fix unreadable comments --- .../me/lemire/integercompression/FastPFOR.java | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index afe7da5..0f33fef 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -95,15 +95,9 @@ private static void getBestBFromData(int[] in, int pos, cexcept += freqs[b + 1]; if (cexcept < 0) break; + // the extra 8 is the cost of storing maxbits int thiscost = cexcept * overheadofeachexcept + cexcept - * (bestbbestcexceptmaxb[2] - b) + b * BlockSize + 8;// the - // extra - // 8 is - // the - // cost - // of - // storing - // maxbits + * (bestbbestcexceptmaxb[2] - b) + b * BlockSize + 8; if (thiscost < bestcost) { bestcost = thiscost; bestbbestcexceptmaxb[0] = (byte) b; @@ -132,9 +126,8 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, - bestbbestcexceptmaxb[0]; if (datapointers[index] + bestbbestcexceptmaxb[1] >= datatobepacked[index].length) { int newsize = 2 * (datapointers[index] + bestbbestcexceptmaxb[1]); - newsize = (newsize + 31) / 32 * 32;// make sure it is a - // multiple of - // 32 + // make sure it is a multiple of 32 + newsize = (newsize + 31) / 32 * 32; datatobepacked[index] = Arrays.copyOf( datatobepacked[index], newsize); } From 611d49a7487514d79716a2b999e0d4fe8481b44b Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Wed, 4 Sep 2013 22:53:17 +0900 Subject: [PATCH 037/412] use word:LCM to understand easily --- src/main/java/me/lemire/integercompression/FastPFOR.java | 2 +- src/main/java/me/lemire/integercompression/Util.java | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 0f33fef..7118d2a 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -65,7 +65,7 @@ private void initArrays() { @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = inlength / 128 * 128; + inlength = Util.lcm(inlength, 128); if(inlength == 0) return; final int finalinpos = inpos.get() + inlength; diff --git a/src/main/java/me/lemire/integercompression/Util.java b/src/main/java/me/lemire/integercompression/Util.java index 961bb5b..13b306b 100644 --- a/src/main/java/me/lemire/integercompression/Util.java +++ b/src/main/java/me/lemire/integercompression/Util.java @@ -33,4 +33,7 @@ protected static int bits(int i) { return 32 - Integer.numberOfLeadingZeros(i); } + protected static int lcm(int value, int factor) { + return value - value % factor; + } } From 6a5607ae37798f98de107aab3ce0322c2e4ca410 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Wed, 4 Sep 2013 22:55:16 +0900 Subject: [PATCH 038/412] use Java standard style for constant values --- .../lemire/integercompression/FastPFOR.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 7118d2a..85c5a36 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -26,8 +26,8 @@ */ public final class FastPFOR implements IntegerCODEC { int PageSize; - final static int BlockSize = 128; - final static int overheadofeachexcept = 8; + final static int BLOCK_SIZE = 128; + final static int OVERHEAD_OF_EACH_EXCEPT = 8; int[][] datatobepacked = new int[32][]; ByteBuffer bytecontainer; @@ -50,7 +50,7 @@ public FastPFOR() { } private void initArrays() { - bytecontainer = ByteBuffer.allocateDirect(3 * PageSize / BlockSize + bytecontainer = ByteBuffer.allocateDirect(3 * PageSize / BLOCK_SIZE + PageSize); for (int k = 1; k < 32; ++k) datatobepacked[k] = new int[PageSize / 32 * 4];// heuristic @@ -66,7 +66,7 @@ private void initArrays() { public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { inlength = Util.lcm(inlength, 128); - if(inlength == 0) return; + if (inlength == 0) return; final int finalinpos = inpos.get() + inlength; out[outpos.get()] = inlength; @@ -81,14 +81,14 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, private static void getBestBFromData(int[] in, int pos, byte[] bestbbestcexceptmaxb) { int freqs[] = new int[33]; - for (int k = pos; k < BlockSize + pos; ++k) { + for (int k = pos; k < BLOCK_SIZE + pos; ++k) { freqs[Util.bits(in[k])]++; } bestbbestcexceptmaxb[0] = 32; while (freqs[bestbbestcexceptmaxb[0]] == 0) bestbbestcexceptmaxb[0]--; bestbbestcexceptmaxb[2] = bestbbestcexceptmaxb[0]; - int bestcost = bestbbestcexceptmaxb[0] * BlockSize; + int bestcost = bestbbestcexceptmaxb[0] * BLOCK_SIZE; byte cexcept = 0; bestbbestcexceptmaxb[1] = cexcept; for (int b = bestbbestcexceptmaxb[0] - 1; b >= 0; --b) { @@ -96,8 +96,8 @@ private static void getBestBFromData(int[] in, int pos, if (cexcept < 0) break; // the extra 8 is the cost of storing maxbits - int thiscost = cexcept * overheadofeachexcept + cexcept - * (bestbbestcexceptmaxb[2] - b) + b * BlockSize + 8; + int thiscost = cexcept * OVERHEAD_OF_EACH_EXCEPT + cexcept + * (bestbbestcexceptmaxb[2] - b) + b * BLOCK_SIZE + 8; if (thiscost < bestcost) { bestcost = thiscost; bestbbestcexceptmaxb[0] = (byte) b; @@ -115,7 +115,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, bytecontainer.clear(); final byte[] bestbbestcexceptmaxb = new byte[3]; int tmpinpos = inpos.get(); - for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { + for (final int finalinpos = tmpinpos + thissize; tmpinpos + BLOCK_SIZE <= finalinpos; tmpinpos += BLOCK_SIZE) { getBestBFromData(in, tmpinpos, bestbbestcexceptmaxb); final int tmpbestb = bestbbestcexceptmaxb[0]; bytecontainer.put(bestbbestcexceptmaxb[0]); @@ -131,7 +131,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, datatobepacked[index] = Arrays.copyOf( datatobepacked[index], newsize); } - for (int k = 0; k < BlockSize; ++k) { + for (int k = 0; k < BLOCK_SIZE; ++k) { if ((in[k + tmpinpos] >>> bestbbestcexceptmaxb[0]) != 0) { // we have an exception bytecontainer.put((byte) k); @@ -224,7 +224,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, int tmpoutpos = outpos.get(); int tmpinpos = inpos.get(); - for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { + for (int run = 0; run < thissize / BLOCK_SIZE; ++run, tmpoutpos += BLOCK_SIZE) { final byte b = bytecontainer.get(); final byte cexcept = bytecontainer.get(); for (int k = 0; k < 128; k += 32) { From b0cbd73520321a76faae30afd5abd96772ef942d Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Wed, 4 Sep 2013 22:58:40 +0900 Subject: [PATCH 039/412] apply Java standard coding style for member properties (fields) --- .../lemire/integercompression/FastPFOR.java | 70 +++++++++---------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 85c5a36..b0df647 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -25,19 +25,19 @@ * @author Daniel Lemire */ public final class FastPFOR implements IntegerCODEC { - int PageSize; final static int BLOCK_SIZE = 128; final static int OVERHEAD_OF_EACH_EXCEPT = 8; - int[][] datatobepacked = new int[32][]; - ByteBuffer bytecontainer; + int pageSize; + int[][] dataTobePacked = new int[32][]; + ByteBuffer byteContainer; /** * Construct the FastPFOR CODEC. * @param pagesize the desired page size (for expert use) */ public FastPFOR(int pagesize) { - PageSize = pagesize; + pageSize = pagesize; initArrays(); } @@ -45,15 +45,15 @@ public FastPFOR(int pagesize) { * Construct the fastPFOR CODEC with default parameters. */ public FastPFOR() { - PageSize = 65536; + pageSize = 65536; initArrays(); } private void initArrays() { - bytecontainer = ByteBuffer.allocateDirect(3 * PageSize / BLOCK_SIZE - + PageSize); + byteContainer = ByteBuffer.allocateDirect(3 * pageSize / BLOCK_SIZE + + pageSize); for (int k = 1; k < 32; ++k) - datatobepacked[k] = new int[PageSize / 32 * 4];// heuristic + dataTobePacked[k] = new int[pageSize / 32 * 4];// heuristic } /** @@ -72,7 +72,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, out[outpos.get()] = inlength; outpos.increment(); while (inpos.get() != finalinpos) { - int thissize = finalinpos > PageSize + inpos.get() ? PageSize + int thissize = finalinpos > pageSize + inpos.get() ? pageSize : (finalinpos - inpos.get()); encodePage(in, inpos, thissize, out, outpos); } @@ -112,30 +112,30 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, outpos.increment(); int tmpoutpos = outpos.get(); int[] datapointers = new int[33]; - bytecontainer.clear(); + byteContainer.clear(); final byte[] bestbbestcexceptmaxb = new byte[3]; int tmpinpos = inpos.get(); for (final int finalinpos = tmpinpos + thissize; tmpinpos + BLOCK_SIZE <= finalinpos; tmpinpos += BLOCK_SIZE) { getBestBFromData(in, tmpinpos, bestbbestcexceptmaxb); final int tmpbestb = bestbbestcexceptmaxb[0]; - bytecontainer.put(bestbbestcexceptmaxb[0]); - bytecontainer.put(bestbbestcexceptmaxb[1]); + byteContainer.put(bestbbestcexceptmaxb[0]); + byteContainer.put(bestbbestcexceptmaxb[1]); if (bestbbestcexceptmaxb[1] > 0) { - bytecontainer.put(bestbbestcexceptmaxb[2]); + byteContainer.put(bestbbestcexceptmaxb[2]); final int index = bestbbestcexceptmaxb[2] - bestbbestcexceptmaxb[0]; - if (datapointers[index] + bestbbestcexceptmaxb[1] >= datatobepacked[index].length) { + if (datapointers[index] + bestbbestcexceptmaxb[1] >= dataTobePacked[index].length) { int newsize = 2 * (datapointers[index] + bestbbestcexceptmaxb[1]); // make sure it is a multiple of 32 newsize = (newsize + 31) / 32 * 32; - datatobepacked[index] = Arrays.copyOf( - datatobepacked[index], newsize); + dataTobePacked[index] = Arrays.copyOf( + dataTobePacked[index], newsize); } for (int k = 0; k < BLOCK_SIZE; ++k) { if ((in[k + tmpinpos] >>> bestbbestcexceptmaxb[0]) != 0) { // we have an exception - bytecontainer.put((byte) k); - datatobepacked[index][datapointers[index]++] = in[k + byteContainer.put((byte) k); + dataTobePacked[index][datapointers[index]++] = in[k + tmpinpos] >>> tmpbestb; } } @@ -148,13 +148,13 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, } inpos.set(tmpinpos); out[headerpos] = tmpoutpos - headerpos; - while ((bytecontainer.position() & 3) != 0) - bytecontainer.put((byte) 0); - final int bytesize = bytecontainer.position(); + while ((byteContainer.position() & 3) != 0) + byteContainer.put((byte) 0); + final int bytesize = byteContainer.position(); out[tmpoutpos++] = bytesize; final int howmanyints = bytesize / 4; - bytecontainer.flip(); - bytecontainer.asIntBuffer().get(out, tmpoutpos, howmanyints); + byteContainer.flip(); + byteContainer.asIntBuffer().get(out, tmpoutpos, howmanyints); tmpoutpos += howmanyints; int bitmap = 0; for (int k = 1; k <= 32; ++k) { @@ -167,7 +167,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, out[tmpoutpos++] = datapointers[k];// size for (int j = 0; j < datapointers[k]; j += 32) { BitPacking - .fastpack(datatobepacked[k], j, out, tmpoutpos, k); + .fastpack(dataTobePacked[k], j, out, tmpoutpos, k); tmpoutpos += k; } } @@ -190,7 +190,7 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, inpos.increment(); int finalout = outpos.get() + mynvalue; while (outpos.get() != finalout) { - int thissize = finalout > PageSize + outpos.get() ? PageSize + int thissize = finalout > pageSize + outpos.get() ? pageSize : (finalout - outpos.get()); decodePage(in, inpos, out, outpos, thissize); } @@ -203,19 +203,19 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, inpos.increment(); int inexcept = initpos + wheremeta; final int bytesize = in[inexcept++]; - bytecontainer.clear(); - bytecontainer.asIntBuffer().put(in, inexcept, bytesize / 4); + byteContainer.clear(); + byteContainer.asIntBuffer().put(in, inexcept, bytesize / 4); inexcept += bytesize / 4; final int bitmap = in[inexcept++]; for (int k = 1; k <= 31; ++k) { if ((bitmap & (1 << (k - 1))) != 0) { int size = in[inexcept++]; - if (datatobepacked[k].length < size) - datatobepacked[k] = new int[(size + 31) / 32 * 32]; + if (dataTobePacked[k].length < size) + dataTobePacked[k] = new int[(size + 31) / 32 * 32]; for (int j = 0; j < size; j += 32) { BitPacking - .fastunpack(in, inexcept, datatobepacked[k], j, k); + .fastunpack(in, inexcept, dataTobePacked[k], j, k); inexcept += k; } } @@ -225,18 +225,18 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, int tmpinpos = inpos.get(); for (int run = 0; run < thissize / BLOCK_SIZE; ++run, tmpoutpos += BLOCK_SIZE) { - final byte b = bytecontainer.get(); - final byte cexcept = bytecontainer.get(); + final byte b = byteContainer.get(); + final byte cexcept = byteContainer.get(); for (int k = 0; k < 128; k += 32) { BitPacking.fastunpack(in, tmpinpos, out, tmpoutpos + k, b); tmpinpos += b; } if (cexcept > 0) { - final byte maxbits = bytecontainer.get(); + final byte maxbits = byteContainer.get(); final int index = maxbits - b; for (int k = 0; k < cexcept; ++k) { - final byte pos = bytecontainer.get(); - final int exceptvalue = datatobepacked[index][datapointers[index]++]; + final byte pos = byteContainer.get(); + final int exceptvalue = dataTobePacked[index][datapointers[index]++]; out[pos + tmpoutpos] |= exceptvalue << b; } From 98f927c94b1b92c6f6d52b21992a7ab8662dd357 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Wed, 4 Sep 2013 23:03:28 +0900 Subject: [PATCH 040/412] use constant variable for default page size --- src/main/java/me/lemire/integercompression/FastPFOR.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index b0df647..a56207e 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -27,6 +27,7 @@ public final class FastPFOR implements IntegerCODEC { final static int BLOCK_SIZE = 128; final static int OVERHEAD_OF_EACH_EXCEPT = 8; + final static int DEFAULT_PAGE_SIZE = 65536; int pageSize; int[][] dataTobePacked = new int[32][]; @@ -45,7 +46,7 @@ public FastPFOR(int pagesize) { * Construct the fastPFOR CODEC with default parameters. */ public FastPFOR() { - pageSize = 65536; + pageSize = DEFAULT_PAGE_SIZE; initArrays(); } From 5866f97ca520f2c2dabce12e300faa8c975a8293 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Wed, 4 Sep 2013 23:05:09 +0900 Subject: [PATCH 041/412] reuse a constructor from another one --- .../me/lemire/integercompression/FastPFOR.java | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index a56207e..71fe140 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -39,22 +39,18 @@ public final class FastPFOR implements IntegerCODEC { */ public FastPFOR(int pagesize) { pageSize = pagesize; - initArrays(); + // Initiate arrrays. + byteContainer = ByteBuffer.allocateDirect(3 * pageSize / BLOCK_SIZE + + pageSize); + for (int k = 1; k < 32; ++k) + dataTobePacked[k] = new int[pageSize / 32 * 4]; // heuristic } /** * Construct the fastPFOR CODEC with default parameters. */ public FastPFOR() { - pageSize = DEFAULT_PAGE_SIZE; - initArrays(); - } - - private void initArrays() { - byteContainer = ByteBuffer.allocateDirect(3 * pageSize / BLOCK_SIZE - + pageSize); - for (int k = 1; k < 32; ++k) - dataTobePacked[k] = new int[pageSize / 32 * 4];// heuristic + this(DEFAULT_PAGE_SIZE); } /** From cbce0f906594f7d09181daff21bbbea8497fe5a8 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Wed, 4 Sep 2013 23:07:17 +0900 Subject: [PATCH 042/412] make a formula simple --- src/main/java/me/lemire/integercompression/FastPFOR.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 71fe140..3581baf 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -69,8 +69,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, out[outpos.get()] = inlength; outpos.increment(); while (inpos.get() != finalinpos) { - int thissize = finalinpos > pageSize + inpos.get() ? pageSize - : (finalinpos - inpos.get()); + int thissize = Math.min(pageSize, finalinpos - inpos.get()); encodePage(in, inpos, thissize, out, outpos); } } From 40f40a354060773f5302e10c9ed2c6f8a00756ef Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Wed, 4 Sep 2013 23:16:08 +0900 Subject: [PATCH 043/412] optimize condition of loops --- src/main/java/me/lemire/integercompression/FastPFOR.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 3581baf..f6f0334 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -77,7 +77,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, private static void getBestBFromData(int[] in, int pos, byte[] bestbbestcexceptmaxb) { int freqs[] = new int[33]; - for (int k = pos; k < BLOCK_SIZE + pos; ++k) { + for (int k = pos, k_end = pos + BLOCK_SIZE; k < k_end; ++k) { freqs[Util.bits(in[k])]++; } bestbbestcexceptmaxb[0] = 32; @@ -111,7 +111,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, byteContainer.clear(); final byte[] bestbbestcexceptmaxb = new byte[3]; int tmpinpos = inpos.get(); - for (final int finalinpos = tmpinpos + thissize; tmpinpos + BLOCK_SIZE <= finalinpos; tmpinpos += BLOCK_SIZE) { + for (final int finalinpos = tmpinpos + thissize - BLOCK_SIZE; tmpinpos <= finalinpos; tmpinpos += BLOCK_SIZE) { getBestBFromData(in, tmpinpos, bestbbestcexceptmaxb); final int tmpbestb = bestbbestcexceptmaxb[0]; byteContainer.put(bestbbestcexceptmaxb[0]); @@ -220,7 +220,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, int tmpoutpos = outpos.get(); int tmpinpos = inpos.get(); - for (int run = 0; run < thissize / BLOCK_SIZE; ++run, tmpoutpos += BLOCK_SIZE) { + for (int run = 0, run_end = thissize / BLOCK_SIZE; run < run_end; ++run, tmpoutpos += BLOCK_SIZE) { final byte b = byteContainer.get(); final byte cexcept = byteContainer.get(); for (int k = 0; k < 128; k += 32) { From 177490a178065648b0c9de6cace8235b65844f61 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Wed, 4 Sep 2013 23:17:30 +0900 Subject: [PATCH 044/412] make a formula simple (using Math.min part 2) --- src/main/java/me/lemire/integercompression/FastPFOR.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index f6f0334..c521283 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -186,8 +186,7 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, inpos.increment(); int finalout = outpos.get() + mynvalue; while (outpos.get() != finalout) { - int thissize = finalout > pageSize + outpos.get() ? pageSize - : (finalout - outpos.get()); + int thissize = Math.min(pageSize, finalout - outpos.get()); decodePage(in, inpos, out, outpos, thissize); } } From d1350082a6b92a8c49cde596f4b5a3b905a4ef5d Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Wed, 4 Sep 2013 23:50:22 +0900 Subject: [PATCH 045/412] reduce/optimize memory allocation --- .../lemire/integercompression/FastPFOR.java | 64 +++++++++++++------ 1 file changed, 43 insertions(+), 21 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index c521283..0bb0e67 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -33,6 +33,11 @@ public final class FastPFOR implements IntegerCODEC { int[][] dataTobePacked = new int[32][]; ByteBuffer byteContainer; + // Working area for compress and uncompress. + int[] dataPointers; + int[] freqs; + byte[] bestbbestcexceptmaxb; + /** * Construct the FastPFOR CODEC. * @param pagesize the desired page size (for expert use) @@ -65,18 +70,27 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, inlength = Util.lcm(inlength, 128); if (inlength == 0) return; - final int finalinpos = inpos.get() + inlength; out[outpos.get()] = inlength; outpos.increment(); + + // Allocate memory for working area. + dataPointers = new int[33]; + freqs = new int[33]; + bestbbestcexceptmaxb = new byte[3]; + + final int finalinpos = inpos.get() + inlength; while (inpos.get() != finalinpos) { int thissize = Math.min(pageSize, finalinpos - inpos.get()); encodePage(in, inpos, thissize, out, outpos); } + + dataPointers = null; + freqs = null; + bestbbestcexceptmaxb = null; } - private static void getBestBFromData(int[] in, int pos, - byte[] bestbbestcexceptmaxb) { - int freqs[] = new int[33]; + private void getBestBFromData(int[] in, int pos) { + Arrays.fill(freqs, 0); for (int k = pos, k_end = pos + BLOCK_SIZE; k < k_end; ++k) { freqs[Util.bits(in[k])]++; } @@ -107,12 +121,15 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, final int headerpos = outpos.get(); outpos.increment(); int tmpoutpos = outpos.get(); - int[] datapointers = new int[33]; + + // Clear working area. + Arrays.fill(dataPointers, 0); + Arrays.fill(bestbbestcexceptmaxb, (byte)0); byteContainer.clear(); - final byte[] bestbbestcexceptmaxb = new byte[3]; + int tmpinpos = inpos.get(); for (final int finalinpos = tmpinpos + thissize - BLOCK_SIZE; tmpinpos <= finalinpos; tmpinpos += BLOCK_SIZE) { - getBestBFromData(in, tmpinpos, bestbbestcexceptmaxb); + getBestBFromData(in, tmpinpos); final int tmpbestb = bestbbestcexceptmaxb[0]; byteContainer.put(bestbbestcexceptmaxb[0]); byteContainer.put(bestbbestcexceptmaxb[1]); @@ -120,10 +137,10 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, byteContainer.put(bestbbestcexceptmaxb[2]); final int index = bestbbestcexceptmaxb[2] - bestbbestcexceptmaxb[0]; - if (datapointers[index] + bestbbestcexceptmaxb[1] >= dataTobePacked[index].length) { - int newsize = 2 * (datapointers[index] + bestbbestcexceptmaxb[1]); + if (dataPointers[index] + bestbbestcexceptmaxb[1] >= dataTobePacked[index].length) { + int newsize = 2 * (dataPointers[index] + bestbbestcexceptmaxb[1]); // make sure it is a multiple of 32 - newsize = (newsize + 31) / 32 * 32; + newsize = Util.lcm(newsize + 31, 32); dataTobePacked[index] = Arrays.copyOf( dataTobePacked[index], newsize); } @@ -131,7 +148,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, if ((in[k + tmpinpos] >>> bestbbestcexceptmaxb[0]) != 0) { // we have an exception byteContainer.put((byte) k); - dataTobePacked[index][datapointers[index]++] = in[k + dataTobePacked[index][dataPointers[index]++] = in[k + tmpinpos] >>> tmpbestb; } } @@ -154,16 +171,15 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, tmpoutpos += howmanyints; int bitmap = 0; for (int k = 1; k <= 32; ++k) { - if (datapointers[k] != 0) + if (dataPointers[k] != 0) bitmap |= (1 << (k - 1)); } out[tmpoutpos++] = bitmap; for (int k = 1; k <= 31; ++k) { - if (datapointers[k] != 0) { - out[tmpoutpos++] = datapointers[k];// size - for (int j = 0; j < datapointers[k]; j += 32) { - BitPacking - .fastpack(dataTobePacked[k], j, out, tmpoutpos, k); + if (dataPointers[k] != 0) { + out[tmpoutpos++] = dataPointers[k];// size + for (int j = 0; j < dataPointers[k]; j += 32) { + BitPacking.fastpack(dataTobePacked[k], j, out, tmpoutpos, k); tmpoutpos += k; } } @@ -181,14 +197,20 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, @Override public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - if(inlength == 0) return; + if (inlength == 0) return; + int mynvalue = in[inpos.get()]; inpos.increment(); + + dataPointers = new int[33]; + int finalout = outpos.get() + mynvalue; while (outpos.get() != finalout) { int thissize = Math.min(pageSize, finalout - outpos.get()); decodePage(in, inpos, out, outpos, thissize); } + + dataPointers = null; } private void decodePage(int[] in, IntWrapper inpos, int[] out, @@ -207,7 +229,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, if ((bitmap & (1 << (k - 1))) != 0) { int size = in[inexcept++]; if (dataTobePacked[k].length < size) - dataTobePacked[k] = new int[(size + 31) / 32 * 32]; + dataTobePacked[k] = new int[Util.lcm(size + 31, 32)]; for (int j = 0; j < size; j += 32) { BitPacking .fastunpack(in, inexcept, dataTobePacked[k], j, k); @@ -215,7 +237,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, } } } - int[] datapointers = new int[32]; + Arrays.fill(dataPointers, 0); int tmpoutpos = outpos.get(); int tmpinpos = inpos.get(); @@ -231,7 +253,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, final int index = maxbits - b; for (int k = 0; k < cexcept; ++k) { final byte pos = byteContainer.get(); - final int exceptvalue = dataTobePacked[index][datapointers[index]++]; + final int exceptvalue = dataTobePacked[index][dataPointers[index]++]; out[pos + tmpoutpos] |= exceptvalue << b; } From 9d57c6a6a2d7d9c9e82d5c550291a9bc546cca9e Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Thu, 5 Sep 2013 00:32:33 +0900 Subject: [PATCH 046/412] replace LCM by floorBy, LCM is wrong word --- src/main/java/me/lemire/integercompression/FastPFOR.java | 6 +++--- src/main/java/me/lemire/integercompression/Util.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 0bb0e67..686752d 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -67,7 +67,7 @@ public FastPFOR() { @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = Util.lcm(inlength, 128); + inlength = Util.floorBy(inlength, 128); if (inlength == 0) return; out[outpos.get()] = inlength; @@ -140,7 +140,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, if (dataPointers[index] + bestbbestcexceptmaxb[1] >= dataTobePacked[index].length) { int newsize = 2 * (dataPointers[index] + bestbbestcexceptmaxb[1]); // make sure it is a multiple of 32 - newsize = Util.lcm(newsize + 31, 32); + newsize = Util.floorBy(newsize + 31, 32); dataTobePacked[index] = Arrays.copyOf( dataTobePacked[index], newsize); } @@ -229,7 +229,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, if ((bitmap & (1 << (k - 1))) != 0) { int size = in[inexcept++]; if (dataTobePacked[k].length < size) - dataTobePacked[k] = new int[Util.lcm(size + 31, 32)]; + dataTobePacked[k] = new int[Util.floorBy(size + 31, 32)]; for (int j = 0; j < size; j += 32) { BitPacking .fastunpack(in, inexcept, dataTobePacked[k], j, k); diff --git a/src/main/java/me/lemire/integercompression/Util.java b/src/main/java/me/lemire/integercompression/Util.java index 13b306b..d8df561 100644 --- a/src/main/java/me/lemire/integercompression/Util.java +++ b/src/main/java/me/lemire/integercompression/Util.java @@ -33,7 +33,7 @@ protected static int bits(int i) { return 32 - Integer.numberOfLeadingZeros(i); } - protected static int lcm(int value, int factor) { + protected static int floorBy(int value, int factor) { return value - value % factor; } } From 08079d770e8907be8bd815ba4871247b8e16db85 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 4 Sep 2013 13:52:17 -0400 Subject: [PATCH 047/412] Preparing new release --- CHANGELOG | 4 + README.md | 13 +-- .../com/kamikaze/pfordelta/LCPForDelta.java | 1 + .../pfordelta/PForDeltaUnpack128.java | 2 +- .../PForDeltaUnpack128WIthIntBuffer.java | 2 +- .../java/com/kamikaze/pfordelta/Simple16.java | 2 +- .../pfordelta/Simple16WithHardCodes.java | 2 +- .../lemire/integercompression/FastPFOR.java | 6 +- .../IntegratedBitPacking.java | 5 +- .../me/lemire/integercompression/NewPFD.java | 14 ++-- .../lemire/integercompression/NewPFDS9.java | 14 ++-- .../me/lemire/integercompression/OptPFD.java | 18 ++--- .../lemire/integercompression/OptPFDS9.java | 18 ++--- .../me/lemire/integercompression/Util.java | 2 +- .../synth/UniformDataGenerator.java | 3 + .../lemire/integercompression/BasicTest.java | 81 +++++++++++-------- 16 files changed, 100 insertions(+), 87 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index c71433b..9a051a5 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +0.0.6 (Sept. 4th 2013) + - Refactoring (MURAOKA Taro) + - Fixed issues with NewPFD and OptPFD when data is locally uncompressible. + 0.0.5 (Sept. 3rd 2013) - Fixed problem with FastPFOR when integers contain negatives (samuelbosch) - Fixed problem with composition with short arrays (MURAOKA Taro) diff --git a/README.md b/README.md index e521186..4da4332 100644 --- a/README.md +++ b/README.md @@ -17,11 +17,6 @@ your array use less than 32 bits. These sort of arrays often come up when using differential coding in databases and information retrieval (e.g., in inverted indexes or column stores). -This library is used by the Columnar file format for Hadoop "Parquet" -(http://parquet.io/). It is also used by Jimmy Lin's -Hadoop tools for manipulating ClueWeb collections -(https://github.com/lintool/clueweb). - Some CODECs ("integrated codecs") assume that the integers are in sorted orders. Most others do not. @@ -37,7 +32,7 @@ the following code in your pom.xml file: me.lemire.integercompression JavaFastPFOR - 0.0.5 + 0.0.6 @@ -61,12 +56,12 @@ We wrote one. Authors ------- -Main contributor +Main contributors Daniel Lemire, http://lemire.me/en/ +Muraoka Taro, https://github.com/koron -Contributions by +with contributions by Di Wu, http://www.facebook.com/diwu1989 -Muraoka Taro, https://github.com/koron How does it compare to the Kamikaze PForDelta library? diff --git a/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java b/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java index c9e5f42..659ba4d 100644 --- a/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java +++ b/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java @@ -49,6 +49,7 @@ * * @author hao yan, hyan2008@gmail.com */ +@SuppressWarnings("javadoc") public class LCPForDelta { // NOTE: we expect the blockSize is always < (1<<(31-POSSIBLE_B_BITS)). For example, in the current default settings, diff --git a/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128.java b/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128.java index a32208c..82d9f30 100644 --- a/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128.java +++ b/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128.java @@ -5,7 +5,7 @@ * was slightly cleaned up by D. Lemire. It is included in the * JavaFastPFOR library for comparison purposes. As the original */ - +@SuppressWarnings("javadoc") public class PForDeltaUnpack128 { static public void unpack(int[] out, int[] in, int bits) { diff --git a/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128WIthIntBuffer.java b/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128WIthIntBuffer.java index 59ac09c..1d1cebb 100644 --- a/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128WIthIntBuffer.java +++ b/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128WIthIntBuffer.java @@ -12,7 +12,7 @@ /** * PForDeltaUnpack128WIthIntBuffer is almost the same as PForDeltaUnpack128, except that it use IntBuffer as input instead of int[]. */ - +@SuppressWarnings("javadoc") public class PForDeltaUnpack128WIthIntBuffer { static public void unpack(int[] out, IntBuffer in, int bits) { diff --git a/src/main/java/com/kamikaze/pfordelta/Simple16.java b/src/main/java/com/kamikaze/pfordelta/Simple16.java index b73a68c..a9f7338 100644 --- a/src/main/java/com/kamikaze/pfordelta/Simple16.java +++ b/src/main/java/com/kamikaze/pfordelta/Simple16.java @@ -17,7 +17,7 @@ * Therefore, in order to use Simple16, the application must write their own code to encode numbers in the range of [2^28, 2^32). * A simple way is just write those numbers as 32-bit integers (that is, no compression for very big numbers). */ - +@SuppressWarnings("javadoc") public class Simple16 { private static final int S16_NUMSIZE = 16; diff --git a/src/main/java/com/kamikaze/pfordelta/Simple16WithHardCodes.java b/src/main/java/com/kamikaze/pfordelta/Simple16WithHardCodes.java index b9ca1e0..cbdc725 100644 --- a/src/main/java/com/kamikaze/pfordelta/Simple16WithHardCodes.java +++ b/src/main/java/com/kamikaze/pfordelta/Simple16WithHardCodes.java @@ -22,7 +22,7 @@ *

* Author: Hao Yan, hyan2008@gmail.com */ - +@SuppressWarnings("javadoc") public class Simple16WithHardCodes { private static final int S16_NUMSIZE = 16; diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 686752d..a6b3681 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -30,8 +30,8 @@ public final class FastPFOR implements IntegerCODEC { final static int DEFAULT_PAGE_SIZE = 65536; int pageSize; - int[][] dataTobePacked = new int[32][]; - ByteBuffer byteContainer; + final int[][] dataTobePacked = new int[32][]; + final ByteBuffer byteContainer; // Working area for compress and uncompress. int[] dataPointers; @@ -124,7 +124,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, // Clear working area. Arrays.fill(dataPointers, 0); - Arrays.fill(bestbbestcexceptmaxb, (byte)0); + //Arrays.fill(bestbbestcexceptmaxb, (byte)0);//DL:unncessary byteContainer.clear(); int tmpinpos = inpos.get(); diff --git a/src/main/java/me/lemire/integercompression/IntegratedBitPacking.java b/src/main/java/me/lemire/integercompression/IntegratedBitPacking.java index 86f7265..7da8936 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedBitPacking.java +++ b/src/main/java/me/lemire/integercompression/IntegratedBitPacking.java @@ -4797,7 +4797,10 @@ protected static void integratedpack(final int initoffset, final int[] in, int i integratedpack31(initoffset, in, inpos, out, outpos); break; case 32: - integratedpack32(initoffset, in, inpos, out, outpos); +if(out.length < outpos + 32) throw new RuntimeException(outpos + " "+out.length); +if(in.length < inpos + 32) throw new RuntimeException(); + +integratedpack32(initoffset, in, inpos, out, outpos); break; default: throw new IllegalArgumentException("Unsupported bit width."); diff --git a/src/main/java/me/lemire/integercompression/NewPFD.java b/src/main/java/me/lemire/integercompression/NewPFD.java index d3ebc24..62a0179 100644 --- a/src/main/java/me/lemire/integercompression/NewPFD.java +++ b/src/main/java/me/lemire/integercompression/NewPFD.java @@ -64,9 +64,8 @@ protected static void getBestBFromData(int[] in, int pos, IntWrapper bestb, int exceptcounter = 0; for (int i = mini; i < bits.length - 1; ++i) { int tmpcounter = 0; - final int maxv = 1 << bits[i]; for (int k = pos; k < BlockSize + pos; ++k) - if (in[k] >= maxv) + if ((in[k] >>> bits[i]) != 0) ++tmpcounter; if (tmpcounter * 10 <= BlockSize) { besti = i; @@ -86,15 +85,14 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, IntWrapper bestexcept = new IntWrapper(); for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { getBestBFromData(in, tmpinpos, bestb, bestexcept); - int tmpbestb = bestb.get(); - int nbrexcept = bestexcept.get(); + final int tmpbestb = bestb.get(); + final int nbrexcept = bestexcept.get(); int exceptsize = 0; - int remember = tmpoutpos; + final int remember = tmpoutpos; tmpoutpos++; if (nbrexcept > 0) { - final int maxv = 1 << bits[tmpbestb]; for (int i = 0, c = 0; i < BlockSize; ++i) { - if (in[tmpinpos + i] >= maxv) { + if ((in[tmpinpos + i] >>> bits[tmpbestb])!=0) { exceptbuffer[c + nbrexcept] = i; exceptbuffer[c] = in[tmpinpos + i] >>> bits[tmpbestb]; ++c; @@ -121,7 +119,7 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, if(inlength == 0) return; int mynvalue = in[inpos.get()]; inpos.increment(); - int finalout = outpos.get() + mynvalue; + final int finalout = outpos.get() + mynvalue; while (outpos.get() != finalout) { int thissize = finalout > PageSize + outpos.get() ? PageSize : (finalout - outpos.get()); diff --git a/src/main/java/me/lemire/integercompression/NewPFDS9.java b/src/main/java/me/lemire/integercompression/NewPFDS9.java index f0534a1..73b6d68 100644 --- a/src/main/java/me/lemire/integercompression/NewPFDS9.java +++ b/src/main/java/me/lemire/integercompression/NewPFDS9.java @@ -64,9 +64,8 @@ protected static void getBestBFromData(int[] in, int pos, IntWrapper bestb, int exceptcounter = 0; for (int i = mini; i < bits.length - 1; ++i) { int tmpcounter = 0; - final int maxv = 1 << bits[i]; for (int k = pos; k < BlockSize + pos; ++k) - if (in[k] >= maxv) + if ((in[k] >>> bits[i])!=0) ++tmpcounter; if (tmpcounter * 10 <= BlockSize) { besti = i; @@ -86,15 +85,14 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, IntWrapper bestexcept = new IntWrapper(); for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { getBestBFromData(in, tmpinpos, bestb, bestexcept); - int tmpbestb = bestb.get(); - int nbrexcept = bestexcept.get(); + final int tmpbestb = bestb.get(); + final int nbrexcept = bestexcept.get(); int exceptsize = 0; - int remember = tmpoutpos; + final int remember = tmpoutpos; tmpoutpos++; if (nbrexcept > 0) { - final int maxv = 1 << bits[tmpbestb]; for (int i = 0, c = 0; i < BlockSize; ++i) { - if (in[tmpinpos + i] >= maxv) { + if ((in[tmpinpos + i]>>> bits[tmpbestb])!= 0) { exceptbuffer[c + nbrexcept] = i; exceptbuffer[c] = in[tmpinpos + i] >>> bits[tmpbestb]; ++c; @@ -119,7 +117,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { if(inlength == 0) return; - int mynvalue = in[inpos.get()]; + final int mynvalue = in[inpos.get()]; inpos.increment(); int finalout = outpos.get() + mynvalue; while (outpos.get() != finalout) { diff --git a/src/main/java/me/lemire/integercompression/OptPFD.java b/src/main/java/me/lemire/integercompression/OptPFD.java index 7600738..f18284c 100644 --- a/src/main/java/me/lemire/integercompression/OptPFD.java +++ b/src/main/java/me/lemire/integercompression/OptPFD.java @@ -65,15 +65,14 @@ void getBestBFromData(int[] in, int pos, IntWrapper bestb, int exceptcounter = 0; for (int i = mini; i < bits.length - 1; ++i) { int tmpcounter = 0; - final int maxv = 1 << bits[i]; for (int k = pos; k < BlockSize + pos; ++k) - if (in[k] >= maxv) { + if ((in[k] >>> bits[i])!=0) { ++tmpcounter; } if (tmpcounter == BlockSize) continue; // no need for (int k = pos, c = 0; k < pos + BlockSize; ++k) - if (in[k] >= maxv) { + if ((in[k] >>> bits[i])!=0) { exceptbuffer[tmpcounter + c] = k - pos; exceptbuffer[c] = in[k] >>> bits[i]; ++c; @@ -100,16 +99,15 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, IntWrapper bestexcept = new IntWrapper(); for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { getBestBFromData(in, tmpinpos, bestb, bestexcept); - int tmpbestb = bestb.get(); - int nbrexcept = bestexcept.get(); + final int tmpbestb = bestb.get(); + final int nbrexcept = bestexcept.get(); int exceptsize = 0; - int remember = tmpoutpos; + final int remember = tmpoutpos; tmpoutpos++; if (nbrexcept > 0) { - final int maxv = 1 << bits[tmpbestb]; int c = 0; for (int i = 0; i < BlockSize; ++i) { - if (in[tmpinpos + i] >= maxv) { + if ((in[tmpinpos + i] >>> bits[tmpbestb])!=0) { exceptbuffer[c + nbrexcept] = i; exceptbuffer[c] = in[tmpinpos + i] >>> bits[tmpbestb]; ++c; @@ -134,9 +132,9 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { if(inlength == 0) return; - int mynvalue = in[inpos.get()]; + final int mynvalue = in[inpos.get()]; inpos.increment(); - int finalout = outpos.get() + mynvalue; + final int finalout = outpos.get() + mynvalue; while (outpos.get() != finalout) { int thissize = finalout > PageSize + outpos.get() ? PageSize : (finalout - outpos.get()); diff --git a/src/main/java/me/lemire/integercompression/OptPFDS9.java b/src/main/java/me/lemire/integercompression/OptPFDS9.java index 981b5f0..614793d 100644 --- a/src/main/java/me/lemire/integercompression/OptPFDS9.java +++ b/src/main/java/me/lemire/integercompression/OptPFDS9.java @@ -65,15 +65,14 @@ protected void getBestBFromData(int[] in, int pos, IntWrapper bestb, int exceptcounter = 0; for (int i = mini; i < bits.length - 1; ++i) { int tmpcounter = 0; - final int maxv = 1 << bits[i]; for (int k = pos; k < BlockSize + pos; ++k) - if (in[k] >= maxv) { + if ((in[k] >>> bits[i]) !=0) { ++tmpcounter; } if (tmpcounter == BlockSize) continue; // no need for (int k = pos, c = 0; k < pos + BlockSize; ++k) - if (in[k] >= maxv) { + if ((in[k] >>> bits[i]) !=0) { exceptbuffer[tmpcounter + c] = k - pos; exceptbuffer[c] = in[k] >>> bits[i]; ++c; @@ -99,16 +98,15 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, IntWrapper bestexcept = new IntWrapper(); for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { getBestBFromData(in, tmpinpos, bestb, bestexcept); - int tmpbestb = bestb.get(); - int nbrexcept = bestexcept.get(); + final int tmpbestb = bestb.get(); + final int nbrexcept = bestexcept.get(); int exceptsize = 0; - int remember = tmpoutpos; + final int remember = tmpoutpos; tmpoutpos++; if (nbrexcept > 0) { - final int maxv = 1 << bits[tmpbestb]; int c = 0; for (int i = 0; i < BlockSize; ++i) { - if (in[tmpinpos + i] >= maxv) { + if ((in[tmpinpos + i] >>> bits[tmpbestb]) != 0) { exceptbuffer[c + nbrexcept] = i; exceptbuffer[c] = in[tmpinpos + i] >>> bits[tmpbestb]; ++c; @@ -133,9 +131,9 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { if(inlength == 0) return; - int mynvalue = in[inpos.get()]; + final int mynvalue = in[inpos.get()]; inpos.increment(); - int finalout = outpos.get() + mynvalue; + final int finalout = outpos.get() + mynvalue; while (outpos.get() != finalout) { int thissize = finalout > PageSize + outpos.get() ? PageSize : (finalout - outpos.get()); diff --git a/src/main/java/me/lemire/integercompression/Util.java b/src/main/java/me/lemire/integercompression/Util.java index d8df561..f55dfbd 100644 --- a/src/main/java/me/lemire/integercompression/Util.java +++ b/src/main/java/me/lemire/integercompression/Util.java @@ -12,7 +12,7 @@ * @author Daniel Lemire * */ -public class Util { +public final class Util { protected static int maxbits(int[] i, int pos, int length) { int mask = 0; for (int k = pos; k < pos + length; ++k) diff --git a/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java b/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java index 2677d7f..f93e2b5 100644 --- a/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java +++ b/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java @@ -72,6 +72,9 @@ static int[] negate(int[] x, int Max) { /** * generates randomly N distinct integers from 0 to Max. + * @param N number of integers to generate + * @param Max bound on the value of integers + * @return an array containing randomly selected integers */ public int[] generateUniform(int N, int Max) { if(N * 2 > Max) { diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 0e77109..047be8f 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -261,43 +261,58 @@ private static void testCodec(IntegerCODEC c, int[][] data, int Max) { } } + /** + * Test + */ @SuppressWarnings("static-method") @Test public void testUnsortedExample() { - final int N = 1333333; - int[] data = new int[N]; - // initialize the data (most will be small - for (int k = 0; k < N; k += 1) - data[k] = 3; - // throw some larger values - for (int k = 0; k < N; k += 5) - data[k] = 100; - for (int k = 0; k < N; k += 533) - data[k] = 10000; - data[5] = -311; - int[] compressed = new int[N];// could need more - IntegerCODEC codec = new Composition(new FastPFOR(), - new VariableByte()); - // compressing - IntWrapper inputoffset = new IntWrapper(0); - IntWrapper outputoffset = new IntWrapper(0); - codec.compress(data, inputoffset, data.length, compressed, - outputoffset); - System.out.println("compressed unsorted integers from " - + data.length * 4 / 1024 + "KB to " - + outputoffset.intValue() * 4 / 1024 + "KB"); - // we can repack the data: (optional) - compressed = Arrays.copyOf(compressed, outputoffset.intValue()); - int[] recovered = new int[N]; - IntWrapper recoffset = new IntWrapper(0); - codec.uncompress(compressed, new IntWrapper(0), - compressed.length, recovered, recoffset); - if (Arrays.equals(data, recovered)) - System.out.println("data is recovered without loss"); - else - throw new RuntimeException("bug"); // could use assert - System.out.println(); + testUnsorted(new VariableByte()); + testUnsorted(new Composition(new BinaryPacking(), new VariableByte())); + testUnsorted(new Composition(new NewPFD(), new VariableByte())); + testUnsorted(new Composition(new NewPFDS9(), new VariableByte())); + testUnsorted(new Composition(new OptPFD(), new VariableByte())); + testUnsorted(new Composition(new OptPFDS9(), new VariableByte())); + testUnsorted(new Composition(new FastPFOR(), new VariableByte())); + + testUnsorted(new IntegratedComposition(new IntegratedBinaryPacking(), + new IntegratedVariableByte())); + testUnsorted(new Composition(new IntegratedBinaryPacking(), new VariableByte())); + + } + + public void testUnsorted(IntegerCODEC codec) { + int[] lengths = {133,1333333}; + for (int N : lengths ) { + int[] data = new int[N]; + // initialize the data (most will be small + for (int k = 0; k < N; k += 1) + data[k] = 3; + // throw some larger values + for (int k = 0; k < N; k += 5) + data[k] = 100; + for (int k = 0; k < N; k += 533) + data[k] = 10000; + data[5] = -311; + int[] compressed = new int[(int) Math.ceil(N * 1.01) + 1024];// could + // need + // more + // compressing + IntWrapper inputoffset = new IntWrapper(0); + IntWrapper outputoffset = new IntWrapper(0); + codec.compress(data, inputoffset, data.length, + compressed, outputoffset); + // we can repack the data: (optional) + compressed = Arrays.copyOf(compressed, + outputoffset.intValue()); + + int[] recovered = new int[N]; + IntWrapper recoffset = new IntWrapper(0); + codec.uncompress(compressed, new IntWrapper(0), + compressed.length, recovered, recoffset); + Assert.assertTrue(Arrays.equals(data, recovered)); + } } From a21636c2846a9e4d93afa051c4f044af16e98300 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 4 Sep 2013 13:53:09 -0400 Subject: [PATCH 048/412] [maven-release-plugin] prepare release JavaFastPFOR-0.0.6 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6497436..9713098 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.6-SNAPSHOT + 0.0.6 jar From 5d159275ded30a7f07a4336f87be4749937fe683 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 4 Sep 2013 13:53:14 -0400 Subject: [PATCH 049/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9713098..4901bf1 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.6 + 0.0.7-SNAPSHOT jar From 762724c5317498ffc1cb09dd929e9f5c0aa616df Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 4 Sep 2013 13:59:05 -0400 Subject: [PATCH 050/412] Adding another prebuilt binary (for convenience) --- prebuiltbinaries/JavaFastPFOR-0.0.6.jar | Bin 0 -> 122284 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 prebuiltbinaries/JavaFastPFOR-0.0.6.jar diff --git a/prebuiltbinaries/JavaFastPFOR-0.0.6.jar b/prebuiltbinaries/JavaFastPFOR-0.0.6.jar new file mode 100644 index 0000000000000000000000000000000000000000..4eca83485446e15e90492cbf3d9c1ad9e3a944fd GIT binary patch literal 122284 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 z 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 ZKtX^vE3iQaYSQU3Yy!sU6QI!y3;=K;XZHXA literal 0 HcmV?d00001 From b94d380fee728328d4e314e16cfbe44d11298f8f Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 4 Sep 2013 14:42:01 -0400 Subject: [PATCH 051/412] added two new (minor) codecs NewPFD16 and OptPFD16 --- CHANGELOG | 3 + .../com/kamikaze/pfordelta/LCPForDelta.java | 12 +- .../com/kamikaze/pfordelta/PForDelta.java | 12 +- .../java/com/kamikaze/pfordelta/Simple16.java | 6 +- .../pfordelta/Simple16WithHardCodes.java | 10 +- .../lemire/integercompression/Benchmark.java | 15 ++ .../integercompression/Composition.java | 2 +- .../lemire/integercompression/FastPFOR.java | 2 +- .../IntegratedComposition.java | 2 +- .../IntegratedVariableByte.java | 4 +- .../lemire/integercompression/JustCopy.java | 2 +- .../me/lemire/integercompression/NewPFD.java | 2 +- .../lemire/integercompression/NewPFDS16.java | 161 ++++++++++++++++ .../lemire/integercompression/NewPFDS9.java | 2 +- .../me/lemire/integercompression/OptPFD.java | 2 +- .../lemire/integercompression/OptPFDS16.java | 175 ++++++++++++++++++ .../lemire/integercompression/OptPFDS9.java | 2 +- .../me/lemire/integercompression/Simple9.java | 2 +- .../integercompression/VariableByte.java | 2 +- .../lemire/integercompression/BasicTest.java | 14 ++ 20 files changed, 401 insertions(+), 31 deletions(-) create mode 100644 src/main/java/me/lemire/integercompression/NewPFDS16.java create mode 100644 src/main/java/me/lemire/integercompression/OptPFDS16.java diff --git a/CHANGELOG b/CHANGELOG index 9a051a5..eb8d2f0 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +upcoming + - added two new (minor) codecs NewPFD16 and OptPFD16 + 0.0.6 (Sept. 4th 2013) - Refactoring (MURAOKA Taro) - Fixed issues with NewPFD and OptPFD when data is locally uncompressible. diff --git a/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java b/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java index 659ba4d..abf6c4f 100644 --- a/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java +++ b/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java @@ -29,21 +29,21 @@ /** * Implementation of the optimized PForDelta algorithm for sorted integer arrays. The basic ideas are based on - *

+ * * 1. Original algorithm from * http://homepages.cwi.nl/~heman/downloads/msthesis.pdf - *

+ * * 2. Optimization and * variation from http://www2008.org/papers/pdf/p387-zhangA.pdf - *

+ * * 3. Further optimization * http://www2009.org/proceedings/pdf/p401.pdf - *

+ * * As a part of the PForDelta implementation, Simple16 is used to compress exceptions. * The original Simple16 algorithm can also be found in the above literature. - *

+ * * This implementation overcomes the problem that Simple16 cannot deal with >2^28 numbers. - *

+ * * This implementation is almost same as PForDelta in the same package, except that it is tuned especially for Lucene-4.0 Codec to achieve * the best performance in Lucene-4.0. * diff --git a/src/main/java/com/kamikaze/pfordelta/PForDelta.java b/src/main/java/com/kamikaze/pfordelta/PForDelta.java index 37041ea..69bb56f 100644 --- a/src/main/java/com/kamikaze/pfordelta/PForDelta.java +++ b/src/main/java/com/kamikaze/pfordelta/PForDelta.java @@ -11,20 +11,20 @@ /** * Implementation of the optimized PForDelta algorithm for sorted integer arrays. The basic ideas are based on - *

+ * * 1. Original algorithm from * http://homepages.cwi.nl/~heman/downloads/msthesis.pdf - *

+ * * 2. Optimization and * variation from http://www2008.org/papers/pdf/p387-zhangA.pdf - *

+ * * 3. Further optimization * http://www2009.org/proceedings/pdf/p401.pdf - *

+ * * As a part of the PForDelta implementation, Simple16 is used to compress exceptions. The original Simple16 algorithm can also be found in the above literatures. - *

+ * * This implementation overcomes the problem that Simple16 cannot deal with >2^28 numbers. - *

+ * * Author: hao yan hyan2008@gmail.com */ diff --git a/src/main/java/com/kamikaze/pfordelta/Simple16.java b/src/main/java/com/kamikaze/pfordelta/Simple16.java index a9f7338..b615818 100644 --- a/src/main/java/com/kamikaze/pfordelta/Simple16.java +++ b/src/main/java/com/kamikaze/pfordelta/Simple16.java @@ -8,11 +8,11 @@ /** * Implementation of the Simple16 algorithm for sorted integer arrays. The basic ideas are based on papers from - *

+ * * 1. http://www2008.org/papers/pdf/p387-zhangA.pdf - *

+ * * 2. http://www2009.org/proceedings/pdf/p401.pdf - *

+ * * The maximum possible integer value Simple16 can encode is < 2^28 (this is dertermined by the Simple16 algorithm itself). * Therefore, in order to use Simple16, the application must write their own code to encode numbers in the range of [2^28, 2^32). * A simple way is just write those numbers as 32-bit integers (that is, no compression for very big numbers). diff --git a/src/main/java/com/kamikaze/pfordelta/Simple16WithHardCodes.java b/src/main/java/com/kamikaze/pfordelta/Simple16WithHardCodes.java index cbdc725..6965176 100644 --- a/src/main/java/com/kamikaze/pfordelta/Simple16WithHardCodes.java +++ b/src/main/java/com/kamikaze/pfordelta/Simple16WithHardCodes.java @@ -8,18 +8,18 @@ /** * Implementation of the Simple16 algorithm for sorted integer arrays. The basic ideas are based on papers from - *

+ * * 1. http://www2008.org/papers/pdf/p387-zhangA.pdf - *

+ * * 2. http://www2009.org/proceedings/pdf/p401.pdf - *

+ * * The maximum possible integer value Simple16 can encode is < 2^28 (this is dertermined by the Simple16 algorithm itself). * Therefore, in order to use Simple16, the application must write their own code to encode numbers in the range of [2^28, 2^32). * A simple way is just write those numbers as 32-bit integers (that is, no compression for very big numbers). - *

+ * * Compared to Simple16, Simple16WithHardCodes will decompress each compressed integer using hardwired codes, * resulting in faster decompression speed. However, it will sacrifice with slightly larger index size. - *

+ * * Author: Hao Yan, hyan2008@gmail.com */ @SuppressWarnings("javadoc") diff --git a/src/main/java/me/lemire/integercompression/Benchmark.java b/src/main/java/me/lemire/integercompression/Benchmark.java index 43a1ae6..25c7bff 100644 --- a/src/main/java/me/lemire/integercompression/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/Benchmark.java @@ -283,6 +283,14 @@ private static void test(int N, int nbr, int repeat) { repeat, true); System.out.println(); + testCodec(new Composition(new NewPFDS16(), new VariableByte()), data, + repeat, false); + testCodec(new Composition(new NewPFDS16(), new VariableByte()), data, + repeat, false); + testCodec(new Composition(new NewPFDS16(), new VariableByte()), data, + repeat, true); + System.out.println(); + testCodec(new Composition(new OptPFD(), new VariableByte()), data, repeat, false); testCodec(new Composition(new OptPFD(), new VariableByte()), data, @@ -299,6 +307,13 @@ private static void test(int N, int nbr, int repeat) { repeat, true); System.out.println(); + testCodec(new Composition(new OptPFDS16(), new VariableByte()), data, + repeat, false); + testCodec(new Composition(new OptPFDS16(), new VariableByte()), data, + repeat, false); + testCodec(new Composition(new OptPFDS16(), new VariableByte()), data, + repeat, true); + System.out.println(); testCodec(new Composition(new FastPFOR(), new VariableByte()), data, repeat, false); diff --git a/src/main/java/me/lemire/integercompression/Composition.java b/src/main/java/me/lemire/integercompression/Composition.java index eb1fd4e..df6f3a5 100644 --- a/src/main/java/me/lemire/integercompression/Composition.java +++ b/src/main/java/me/lemire/integercompression/Composition.java @@ -59,7 +59,7 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, @Override public String toString() { - return F1.getClass().getName() + "+" + F2.getClass().getName(); + return F1.toString() + "+" + F2.toString(); } } diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index a6b3681..e0f7da1 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -265,6 +265,6 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, @Override public String toString() { - return this.getClass().getName(); + return this.getClass().getSimpleName(); } } diff --git a/src/main/java/me/lemire/integercompression/IntegratedComposition.java b/src/main/java/me/lemire/integercompression/IntegratedComposition.java index 324d30c..d2bd59f 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedComposition.java +++ b/src/main/java/me/lemire/integercompression/IntegratedComposition.java @@ -57,7 +57,7 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, @Override public String toString() { - return F1.getClass().getName() + "+" + F2.getClass().getName(); + return F1.toString() + "+" + F2.toString(); } } diff --git a/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java b/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java index 7d84114..f4aa11b 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java +++ b/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java @@ -18,6 +18,7 @@ public class IntegratedVariableByte implements IntegratedIntegerCODEC { @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + if(inlength == 0) return; int initoffset = 0; ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { @@ -45,6 +46,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, @Override public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + if(inlength == 0) return; int s = 0; int p = inpos.get(); int finalp = inpos.get() + inlength; @@ -73,7 +75,7 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, @Override public String toString() { - return this.getClass().getName(); + return this.getClass().getSimpleName(); } } diff --git a/src/main/java/me/lemire/integercompression/JustCopy.java b/src/main/java/me/lemire/integercompression/JustCopy.java index f0d7faa..2ef2f7a 100644 --- a/src/main/java/me/lemire/integercompression/JustCopy.java +++ b/src/main/java/me/lemire/integercompression/JustCopy.java @@ -31,7 +31,7 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntW @Override public String toString() { - return this.getClass().getName(); + return this.getClass().getSimpleName(); } diff --git a/src/main/java/me/lemire/integercompression/NewPFD.java b/src/main/java/me/lemire/integercompression/NewPFD.java index 62a0179..d6cae1f 100644 --- a/src/main/java/me/lemire/integercompression/NewPFD.java +++ b/src/main/java/me/lemire/integercompression/NewPFD.java @@ -155,7 +155,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, @Override public String toString() { - return this.getClass().getName(); + return this.getClass().getSimpleName(); } } diff --git a/src/main/java/me/lemire/integercompression/NewPFDS16.java b/src/main/java/me/lemire/integercompression/NewPFDS16.java new file mode 100644 index 0000000..73f4e31 --- /dev/null +++ b/src/main/java/me/lemire/integercompression/NewPFDS16.java @@ -0,0 +1,161 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + +package me.lemire.integercompression; + +/** + * NewPFD/NewPFOR implemented by Daniel Lemire + *

+ * Follows: + *

+ * H. Yan, S. Ding, T. Suel, Inverted index compression and query processing + * with optimized document ordering, in: WWW 09, 2009, pp. 401-410. + *

+ * using Simple16 as the secondary coder. + * + * @author Daniel Lemire + */ +public final class NewPFDS16 implements IntegerCODEC { + final int PageSize; + final static int BlockSize = 128; + + int[] exceptbuffer = new int[2 * BlockSize]; + + /** + * Constructor for the NewPFDS16 CODEC. + */ + public NewPFDS16() { + PageSize = 65536; + } + + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + inlength = inlength / BlockSize * BlockSize; + if(inlength == 0) return; + final int finalinpos = inpos.get() + inlength; + out[outpos.get()] = inlength; + outpos.increment(); + while (inpos.get() != finalinpos) { + int thissize = finalinpos > PageSize + inpos.get() ? PageSize + : (finalinpos - inpos.get()); + encodePage(in, inpos, thissize, out, outpos); + } + + } + + protected static final int[] bits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 16, 20, 32}; + protected static final int[] invbits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16}; + + protected static void getBestBFromData(int[] in, int pos, IntWrapper bestb, + IntWrapper bestexcept) { + final int mb = Util.maxbits(in, pos, BlockSize); + int mini = 0; + if (mini + 28 < bits[invbits[mb]]) + mini = bits[invbits[mb]] - 28; // 28 is the max for exceptions + int besti = bits.length - 1; + int exceptcounter = 0; + for (int i = mini; i < bits.length - 1; ++i) { + int tmpcounter = 0; + for (int k = pos; k < BlockSize + pos; ++k) + if ((in[k] >>> bits[i])!=0) + ++tmpcounter; + if (tmpcounter * 10 <= BlockSize) { + besti = i; + exceptcounter = tmpcounter; + break; + } + } + bestb.set(besti); + bestexcept.set(exceptcounter); + } + + private void encodePage(int[] in, IntWrapper inpos, int thissize, + int[] out, IntWrapper outpos) { + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); + IntWrapper bestb = new IntWrapper(); + IntWrapper bestexcept = new IntWrapper(); + for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { + getBestBFromData(in, tmpinpos, bestb, bestexcept); + final int tmpbestb = bestb.get(); + final int nbrexcept = bestexcept.get(); + int exceptsize = 0; + final int remember = tmpoutpos; + tmpoutpos++; + if (nbrexcept > 0) { + for (int i = 0, c = 0; i < BlockSize; ++i) { + if ((in[tmpinpos + i]>>> bits[tmpbestb])!= 0) { + exceptbuffer[c + nbrexcept] = i; + exceptbuffer[c] = in[tmpinpos + i] >>> bits[tmpbestb]; + ++c; + } + } + exceptsize = S16.compress(exceptbuffer, 0, 2 * nbrexcept, out, + tmpoutpos); + tmpoutpos += exceptsize; + } + out[remember] = tmpbestb | (nbrexcept << 8) | (exceptsize << 16); + for (int k = 0; k < BlockSize; k += 32) { + BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, + bits[tmpbestb]); + tmpoutpos += bits[tmpbestb]; + } + } + inpos.set(tmpinpos); + outpos.set(tmpoutpos); + } + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + if(inlength == 0) return; + final int mynvalue = in[inpos.get()]; + inpos.increment(); + int finalout = outpos.get() + mynvalue; + while (outpos.get() != finalout) { + int thissize = finalout > PageSize + outpos.get() ? PageSize + : (finalout - outpos.get()); + decodePage(in, inpos, out, outpos, thissize); + } + } + + private void decodePage(int[] in, IntWrapper inpos, int[] out, + IntWrapper outpos, int thissize) { + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); + + for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { + final int b = in[tmpinpos] & 0xFF; + final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; + final int exceptsize = (in[tmpinpos] >>> 16); + ++tmpinpos; + S16.uncompress(in, tmpinpos, exceptsize, exceptbuffer, 0, + 2 * cexcept); + tmpinpos += exceptsize; + for (int k = 0; k < BlockSize; k += 32) { + BitPacking + .fastunpack(in, tmpinpos, out, tmpoutpos + k, bits[b]); + tmpinpos += bits[b]; + } + for (int k = 0; k < cexcept; ++k) { + out[tmpoutpos + exceptbuffer[k + cexcept]] |= (exceptbuffer[k] << bits[b]); + } + } + outpos.set(tmpoutpos); + inpos.set(tmpinpos); + } + + @Override + public String toString() { + return this.getClass().getSimpleName(); + } + +} diff --git a/src/main/java/me/lemire/integercompression/NewPFDS9.java b/src/main/java/me/lemire/integercompression/NewPFDS9.java index 73b6d68..5465d27 100644 --- a/src/main/java/me/lemire/integercompression/NewPFDS9.java +++ b/src/main/java/me/lemire/integercompression/NewPFDS9.java @@ -155,7 +155,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, @Override public String toString() { - return this.getClass().getName(); + return this.getClass().getSimpleName(); } } diff --git a/src/main/java/me/lemire/integercompression/OptPFD.java b/src/main/java/me/lemire/integercompression/OptPFD.java index f18284c..6696bf7 100644 --- a/src/main/java/me/lemire/integercompression/OptPFD.java +++ b/src/main/java/me/lemire/integercompression/OptPFD.java @@ -170,7 +170,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, @Override public String toString() { - return this.getClass().getName(); + return this.getClass().getSimpleName(); } } diff --git a/src/main/java/me/lemire/integercompression/OptPFDS16.java b/src/main/java/me/lemire/integercompression/OptPFDS16.java new file mode 100644 index 0000000..4580f4b --- /dev/null +++ b/src/main/java/me/lemire/integercompression/OptPFDS16.java @@ -0,0 +1,175 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + +package me.lemire.integercompression; + +/** + * OptPFD implemented by Daniel Lemire + *

+ * Follows: + *

+ * H. Yan, S. Ding, T. Suel, Inverted index compression and query processing + * with optimized document ordering, in: WWW 09, 2009, pp. 401--410. + *

+ * using Simple16 as the secondary coder. + * + * @author Daniel Lemire + */ +public final class OptPFDS16 implements IntegerCODEC { + final int PageSize; + final static int BlockSize = 128; + int[] exceptbuffer = new int[2 * BlockSize]; + + /** + * Constructor for the OptPFDS16 CODEC. + */ + public OptPFDS16() { + PageSize = 65536; + } + + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + inlength = inlength / BlockSize * BlockSize; + if(inlength == 0) return; + + final int finalinpos = inpos.get() + inlength; + out[outpos.get()] = inlength; + outpos.increment(); + while (inpos.get() != finalinpos) { + int thissize = finalinpos > PageSize + inpos.get() ? PageSize + : (finalinpos - inpos.get()); + encodePage(in, inpos, thissize, out, outpos); + } + + } + + protected static final int[] bits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 16, 20, 32}; + protected static final int[] invbits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16}; + + protected void getBestBFromData(int[] in, int pos, IntWrapper bestb, + IntWrapper bestexcept) { + final int mb = Util.maxbits(in, pos, BlockSize); + int mini = 0; + if (mini + 28 < bits[invbits[mb]]) + mini = bits[invbits[mb]] - 28; // 28 is the max for exceptions + int besti = bits.length - 1; + int bestcost = bits[besti] * 4; + int exceptcounter = 0; + for (int i = mini; i < bits.length - 1; ++i) { + int tmpcounter = 0; + for (int k = pos; k < BlockSize + pos; ++k) + if ((in[k] >>> bits[i]) !=0) { + ++tmpcounter; + } + if (tmpcounter == BlockSize) + continue; // no need + for (int k = pos, c = 0; k < pos + BlockSize; ++k) + if ((in[k] >>> bits[i]) !=0) { + exceptbuffer[tmpcounter + c] = k - pos; + exceptbuffer[c] = in[k] >>> bits[i]; + ++c; + } + + final int thiscost = bits[i] * 4 + + S16.estimatecompress(exceptbuffer, 0, 2 * tmpcounter); + if (thiscost <= bestcost) { + bestcost = thiscost; + besti = i; + exceptcounter = tmpcounter; + } + } + bestb.set(besti); + bestexcept.set(exceptcounter); + } + + private void encodePage(int[] in, IntWrapper inpos, int thissize, + int[] out, IntWrapper outpos) { + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); + IntWrapper bestb = new IntWrapper(); + IntWrapper bestexcept = new IntWrapper(); + for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { + getBestBFromData(in, tmpinpos, bestb, bestexcept); + final int tmpbestb = bestb.get(); + final int nbrexcept = bestexcept.get(); + int exceptsize = 0; + final int remember = tmpoutpos; + tmpoutpos++; + if (nbrexcept > 0) { + int c = 0; + for (int i = 0; i < BlockSize; ++i) { + if ((in[tmpinpos + i] >>> bits[tmpbestb]) != 0) { + exceptbuffer[c + nbrexcept] = i; + exceptbuffer[c] = in[tmpinpos + i] >>> bits[tmpbestb]; + ++c; + } + } + exceptsize = S16.compress(exceptbuffer, 0, 2 * nbrexcept, out, + tmpoutpos); + tmpoutpos += exceptsize; + } + out[remember] = tmpbestb | (nbrexcept << 8) | (exceptsize << 16); + for (int k = 0; k < BlockSize; k += 32) { + BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, + bits[tmpbestb]); + tmpoutpos += bits[tmpbestb]; + } + } + inpos.set(tmpinpos); + outpos.set(tmpoutpos); + } + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + if(inlength == 0) return; + final int mynvalue = in[inpos.get()]; + inpos.increment(); + final int finalout = outpos.get() + mynvalue; + while (outpos.get() != finalout) { + int thissize = finalout > PageSize + outpos.get() ? PageSize + : (finalout - outpos.get()); + decodePage(in, inpos, out, outpos, thissize); + } + } + + private void decodePage(int[] in, IntWrapper inpos, int[] out, + IntWrapper outpos, int thissize) { + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); + + for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { + final int b = in[tmpinpos] & 0xFF; + final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; + final int exceptsize = (in[tmpinpos] >>> 16); + ++tmpinpos; + S16.uncompress(in, tmpinpos, exceptsize, exceptbuffer, 0, + 2 * cexcept); + tmpinpos += exceptsize; + for (int k = 0; k < BlockSize; k += 32) { + BitPacking + .fastunpack(in, tmpinpos, out, tmpoutpos + k, bits[b]); + tmpinpos += bits[b]; + } + for (int k = 0; k < cexcept; ++k) { + out[tmpoutpos + exceptbuffer[k + cexcept]] |= (exceptbuffer[k] << bits[b]); + } + } + outpos.set(tmpoutpos); + inpos.set(tmpinpos); + } + + @Override + public String toString() { + return this.getClass().getSimpleName(); + } + +} \ No newline at end of file diff --git a/src/main/java/me/lemire/integercompression/OptPFDS9.java b/src/main/java/me/lemire/integercompression/OptPFDS9.java index 614793d..22faf7e 100644 --- a/src/main/java/me/lemire/integercompression/OptPFDS9.java +++ b/src/main/java/me/lemire/integercompression/OptPFDS9.java @@ -169,7 +169,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, @Override public String toString() { - return this.getClass().getName(); + return this.getClass().getSimpleName(); } } \ No newline at end of file diff --git a/src/main/java/me/lemire/integercompression/Simple9.java b/src/main/java/me/lemire/integercompression/Simple9.java index c97ba38..7b8136a 100644 --- a/src/main/java/me/lemire/integercompression/Simple9.java +++ b/src/main/java/me/lemire/integercompression/Simple9.java @@ -281,7 +281,7 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, @Override public String toString() { - return this.getClass().getName(); + return this.getClass().getSimpleName(); } } diff --git a/src/main/java/me/lemire/integercompression/VariableByte.java b/src/main/java/me/lemire/integercompression/VariableByte.java index f1adf25..f1de669 100644 --- a/src/main/java/me/lemire/integercompression/VariableByte.java +++ b/src/main/java/me/lemire/integercompression/VariableByte.java @@ -69,7 +69,7 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, @Override public String toString() { - return this.getClass().getName(); + return this.getClass().getSimpleName(); } } diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 047be8f..afb47b3 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -127,8 +127,10 @@ public void spuriousouttest() { testSpurious(new BinaryPacking()); testSpurious(new NewPFD()); testSpurious(new NewPFDS9()); + testSpurious(new NewPFDS16()); testSpurious(new OptPFD()); testSpurious(new OptPFDS9()); + testSpurious(new OptPFDS16()); testSpurious(new FastPFOR()); } @@ -140,19 +142,24 @@ public void spuriousouttest() { @Test public void zeroinzerouttest() { testZeroInZeroOut(new IntegratedBinaryPacking()); + testZeroInZeroOut(new IntegratedVariableByte()); testZeroInZeroOut(new BinaryPacking()); testZeroInZeroOut(new NewPFD()); testZeroInZeroOut(new NewPFDS9()); + testZeroInZeroOut(new NewPFDS16()); testZeroInZeroOut(new OptPFD()); testZeroInZeroOut(new OptPFDS9()); + testZeroInZeroOut(new OptPFDS16()); testZeroInZeroOut(new FastPFOR()); testZeroInZeroOut(new VariableByte()); testZeroInZeroOut(new Composition(new IntegratedBinaryPacking(), new VariableByte())); testZeroInZeroOut(new Composition(new BinaryPacking(), new VariableByte())); testZeroInZeroOut(new Composition(new NewPFD(), new VariableByte())); testZeroInZeroOut(new Composition(new NewPFDS9(), new VariableByte())); + testZeroInZeroOut(new Composition(new NewPFDS16(), new VariableByte())); testZeroInZeroOut(new Composition(new OptPFD(), new VariableByte())); testZeroInZeroOut(new Composition(new OptPFDS9(), new VariableByte())); + testZeroInZeroOut(new Composition(new OptPFDS16(), new VariableByte())); testZeroInZeroOut(new Composition(new FastPFOR(), new VariableByte())); testZeroInZeroOut(new IntegratedComposition(new IntegratedBinaryPacking(), @@ -206,10 +213,14 @@ private static void test(int N, int nbr) { Max); testCodec(new Composition(new NewPFDS9(), new VariableByte()), data, Max); + testCodec(new Composition(new NewPFDS16(), new VariableByte()), + data, Max); testCodec(new Composition(new OptPFD(), new VariableByte()), data, Max); testCodec(new Composition(new OptPFDS9(), new VariableByte()), data, Max); + testCodec(new Composition(new OptPFDS16(), new VariableByte()), + data, Max); testCodec(new Composition(new FastPFOR(), new VariableByte()), data, Max); testCodec(new Simple9(), data, Max); @@ -269,11 +280,14 @@ private static void testCodec(IntegerCODEC c, int[][] data, int Max) { public void testUnsortedExample() { testUnsorted(new VariableByte()); + testUnsorted(new IntegratedVariableByte()); testUnsorted(new Composition(new BinaryPacking(), new VariableByte())); testUnsorted(new Composition(new NewPFD(), new VariableByte())); testUnsorted(new Composition(new NewPFDS9(), new VariableByte())); + testUnsorted(new Composition(new NewPFDS16(), new VariableByte())); testUnsorted(new Composition(new OptPFD(), new VariableByte())); testUnsorted(new Composition(new OptPFDS9(), new VariableByte())); + testUnsorted(new Composition(new OptPFDS16(), new VariableByte())); testUnsorted(new Composition(new FastPFOR(), new VariableByte())); testUnsorted(new IntegratedComposition(new IntegratedBinaryPacking(), From cea3c15a9d802d5fc6077da26130922fd1809007 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Thu, 5 Sep 2013 19:34:34 +0900 Subject: [PATCH 052/412] travis-ci settings --- .travis.yml | 5 +++++ README.md | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..b6a55f6 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,5 @@ +language: java + +jdk: + - openjdk7 + - openjdk6 diff --git a/README.md b/README.md index 4da4332..fb646d3 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -JavaFastPFOR: A simple integer compression library in Java +JavaFastPFOR: A simple integer compression library in Java [![Build Status](https://travis-ci.org/lemire/JavaFastPFOR.png)](https://travis-ci.org/lemire/JavaFastPFOR) ========================================================== License From 420e1f6a8118f9c2e58477e60d7fde5abdd0ba59 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Thu, 5 Sep 2013 20:20:07 +0900 Subject: [PATCH 053/412] fix for this project --- .travis.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.travis.yml b/.travis.yml index b6a55f6..4a5d403 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,10 @@ language: java jdk: + - oraclejdk7 - openjdk7 - openjdk6 + +install: + +script: mvn test From 2430cd818626b96b55bc45f68eea3553d9b20f2c Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Thu, 5 Sep 2013 20:25:23 +0900 Subject: [PATCH 054/412] skip install stage entirely --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 4a5d403..a159cc4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,6 +5,6 @@ jdk: - openjdk7 - openjdk6 -install: +install: true script: mvn test From 55110523cdf11f7a1867d6df0288c7534cbf79a2 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Thu, 5 Sep 2013 02:27:37 +0900 Subject: [PATCH 055/412] add addhoc test container --- .../lemire/integercompression/AdhocTest.java | 20 ++++++++++ .../lemire/integercompression/TestUtils.java | 37 +++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 src/test/java/me/lemire/integercompression/AdhocTest.java create mode 100644 src/test/java/me/lemire/integercompression/TestUtils.java diff --git a/src/test/java/me/lemire/integercompression/AdhocTest.java b/src/test/java/me/lemire/integercompression/AdhocTest.java new file mode 100644 index 0000000..abe3c7c --- /dev/null +++ b/src/test/java/me/lemire/integercompression/AdhocTest.java @@ -0,0 +1,20 @@ +package me.lemire.integercompression; + +import org.junit.Test; +import static org.junit.Assert.*; + +import static me.lemire.integercompression.TestUtils.*; + +/** + * Collection of adhoc tests. + */ +public class AdhocTest +{ + + @Test + public void adhoc1() { + Composition c = new Composition(new FastPFOR(), new VariableByte()); + assertSymmetry(c, 0, 16384); + } + +} diff --git a/src/test/java/me/lemire/integercompression/TestUtils.java b/src/test/java/me/lemire/integercompression/TestUtils.java new file mode 100644 index 0000000..24be36b --- /dev/null +++ b/src/test/java/me/lemire/integercompression/TestUtils.java @@ -0,0 +1,37 @@ +package me.lemire.integercompression; + +import java.util.Arrays; + +import static org.junit.Assert.*; + +/** + * Static utility methods for test. + */ +public class TestUtils { + + /** + * Check that compress and uncompress keep original array. + * + * @param codec CODEC to test. + * @param source Data for test. + */ + public static void assertSymmetry(IntegerCODEC codec, int... source) { + int[] compressed = new int[source.length]; + IntWrapper c_inpos = new IntWrapper(0); + IntWrapper c_outpos = new IntWrapper(0); + codec.compress(source, c_inpos, source.length, compressed, c_outpos); + assertTrue(c_outpos.get() <= source.length); + + // Uncompress an array. + int[] uncompressed = new int[source.length]; + IntWrapper u_inpos = new IntWrapper(0); + IntWrapper u_outpos = new IntWrapper(0); + codec.uncompress(compressed, u_inpos, c_outpos.get(), + uncompressed, u_outpos); + + // Compare between uncompressed and original arrays. + int[] target = Arrays.copyOf(uncompressed, u_outpos.get()); + assertArrayEquals(source, target); + } + +} From 5265606ca025da812c57a3f1d7fa26b3c5963ae9 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Thu, 5 Sep 2013 03:17:19 +0900 Subject: [PATCH 056/412] sample for bigger compressed array --- .../lemire/integercompression/AdhocTest.java | 19 +++++++++++++-- .../lemire/integercompression/TestUtils.java | 23 +++++++++++++------ 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/test/java/me/lemire/integercompression/AdhocTest.java b/src/test/java/me/lemire/integercompression/AdhocTest.java index abe3c7c..4e3f90f 100644 --- a/src/test/java/me/lemire/integercompression/AdhocTest.java +++ b/src/test/java/me/lemire/integercompression/AdhocTest.java @@ -12,9 +12,24 @@ public class AdhocTest { @Test - public void adhoc1() { - Composition c = new Composition(new FastPFOR(), new VariableByte()); + public void biggerCompressedArray0() { + // No problem: for comparison. + IntegerCODEC c = new Composition(new FastPFOR(), new VariableByte()); assertSymmetry(c, 0, 16384); } + @Test + public void biggerCompressedArray1() { + // Compressed array is bigger than original, because of VariableByte. + IntegerCODEC c = new VariableByte(); + assertSymmetry(c, -1); + } + + @Test + public void biggerCompressedArray2() { + // Compressed array is bigger than original, because of Composition. + IntegerCODEC c = new Composition(new FastPFOR(), new VariableByte()); + assertSymmetry(c, 65535, 65535); + } + } diff --git a/src/test/java/me/lemire/integercompression/TestUtils.java b/src/test/java/me/lemire/integercompression/TestUtils.java index 24be36b..bb7e536 100644 --- a/src/test/java/me/lemire/integercompression/TestUtils.java +++ b/src/test/java/me/lemire/integercompression/TestUtils.java @@ -15,23 +15,32 @@ public class TestUtils { * @param codec CODEC to test. * @param source Data for test. */ - public static void assertSymmetry(IntegerCODEC codec, int... source) { - int[] compressed = new int[source.length]; + public static void assertSymmetry(IntegerCODEC codec, int... orig) { + // There are some cases that compressed array is bigger than original + // array. So output array for compress must be larger. + // + // Example: + // - VariableByte compresses an array like [ -1 ]. + // - Composition compresses a short array. + + int[] compressed = new int[orig.length + 1]; IntWrapper c_inpos = new IntWrapper(0); IntWrapper c_outpos = new IntWrapper(0); - codec.compress(source, c_inpos, source.length, compressed, c_outpos); - assertTrue(c_outpos.get() <= source.length); + codec.compress(orig, c_inpos, orig.length, compressed, + c_outpos); + + assertTrue(c_outpos.get() <= orig.length + 1); // Uncompress an array. - int[] uncompressed = new int[source.length]; + int[] uncompressed = new int[orig.length]; IntWrapper u_inpos = new IntWrapper(0); IntWrapper u_outpos = new IntWrapper(0); codec.uncompress(compressed, u_inpos, c_outpos.get(), uncompressed, u_outpos); - // Compare between uncompressed and original arrays. + // Compare between uncompressed and orig arrays. int[] target = Arrays.copyOf(uncompressed, u_outpos.get()); - assertArrayEquals(source, target); + assertArrayEquals(orig, target); } } From c523646dfb2cbd4cd783da410772c7bbc6357286 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Thu, 5 Sep 2013 03:24:28 +0900 Subject: [PATCH 057/412] make array extension clearly --- src/test/java/me/lemire/integercompression/TestUtils.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/test/java/me/lemire/integercompression/TestUtils.java b/src/test/java/me/lemire/integercompression/TestUtils.java index bb7e536..217a6dd 100644 --- a/src/test/java/me/lemire/integercompression/TestUtils.java +++ b/src/test/java/me/lemire/integercompression/TestUtils.java @@ -22,14 +22,15 @@ public static void assertSymmetry(IntegerCODEC codec, int... orig) { // Example: // - VariableByte compresses an array like [ -1 ]. // - Composition compresses a short array. + final int EXTEND = 1; - int[] compressed = new int[orig.length + 1]; + int[] compressed = new int[orig.length + EXTEND]; IntWrapper c_inpos = new IntWrapper(0); IntWrapper c_outpos = new IntWrapper(0); codec.compress(orig, c_inpos, orig.length, compressed, c_outpos); - assertTrue(c_outpos.get() <= orig.length + 1); + assertTrue(c_outpos.get() <= orig.length + EXTEND); // Uncompress an array. int[] uncompressed = new int[orig.length]; From f56a286b700fc07bc7e759124c770b7a4717bfba Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Thu, 5 Sep 2013 23:08:33 +0900 Subject: [PATCH 058/412] add an error case --- .../java/me/lemire/integercompression/AdhocTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/test/java/me/lemire/integercompression/AdhocTest.java b/src/test/java/me/lemire/integercompression/AdhocTest.java index 4e3f90f..59241de 100644 --- a/src/test/java/me/lemire/integercompression/AdhocTest.java +++ b/src/test/java/me/lemire/integercompression/AdhocTest.java @@ -1,5 +1,7 @@ package me.lemire.integercompression; +import java.util.Arrays; + import org.junit.Test; import static org.junit.Assert.*; @@ -32,4 +34,14 @@ public void biggerCompressedArray2() { assertSymmetry(c, 65535, 65535); } + // NOTE: This require bigger 2 items for compressed array than original. + /* + @Test + public void overflowVariableByte() { + IntegerCODEC c = new VariableByte(); + int[] d = new int[8]; + Arrays.fill(d, -1); + assertSymmetry(c, d); + } + */ } From 35fae84e49d1480637d86ff80bb2830708de08f3 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Thu, 5 Sep 2013 23:18:11 +0900 Subject: [PATCH 059/412] fix indentation, spacing, doc comment styles. --- .../lemire/integercompression/BasicTest.java | 454 +++++++++--------- 1 file changed, 226 insertions(+), 228 deletions(-) diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index afb47b3..4f5e6f9 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -13,16 +13,16 @@ * Just some basic sanity tests. * * @author Daniel Lemire - * */ -public class BasicTest { - - /** - * Verify bitpacking - */ - @SuppressWarnings("static-method") - @Test - public void verify() { +public class BasicTest +{ + + /** + * Verify bitpacking. + */ + @SuppressWarnings("static-method") + @Test + public void verify() { System.out.println("Checking the code..."); final int N = 32; final int times = 1000; @@ -45,12 +45,12 @@ public void verify() { System.out.println("Code appears to be correct."); } - /** - * Verify bitpacking without mask - */ - @SuppressWarnings("static-method") - @Test - public void verifyWithoutMask() { + /** + * Verify bitpacking without mask. + */ + @SuppressWarnings("static-method") + @Test + public void verifyWithoutMask() { System.out.println("Checking the code..."); final int N = 32; final int times = 1000; @@ -73,12 +73,12 @@ public void verifyWithoutMask() { System.out.println("Code appears to be correct."); } - /** - * Verify bitpacking with exception - */ - @SuppressWarnings("static-method") - @Test - public void verifyWithExceptions() { + /** + * Verify bitpacking with exception. + */ + @SuppressWarnings("static-method") + @Test + public void verifyWithExceptions() { System.out.println("Checking the code..."); final int N = 32; final int times = 1000; @@ -107,227 +107,225 @@ public void verifyWithExceptions() { System.out.println("Code with overflow appears to be correct."); } - /** - * check that the codecs can be inverted. - */ - @SuppressWarnings("static-method") - @Test - public void basictest() { - test(5, 10); - test(5, 14); - test(2, 18); - } - /** - * check that there is no spurious output. - */ - @SuppressWarnings("static-method") - @Test - public void spuriousouttest() { - testSpurious(new IntegratedBinaryPacking()); - testSpurious(new BinaryPacking()); - testSpurious(new NewPFD()); - testSpurious(new NewPFDS9()); - testSpurious(new NewPFDS16()); - testSpurious(new OptPFD()); - testSpurious(new OptPFDS9()); - testSpurious(new OptPFDS16()); - testSpurious(new FastPFOR()); + /** + * check that the codecs can be inverted. + */ + @SuppressWarnings("static-method") + @Test + public void basictest() { + test(5, 10); + test(5, 14); + test(2, 18); + } - } - /** - * check that an empty array generates an empty array - * after compression. - */ - @SuppressWarnings("static-method") - @Test - public void zeroinzerouttest() { - testZeroInZeroOut(new IntegratedBinaryPacking()); - testZeroInZeroOut(new IntegratedVariableByte()); - testZeroInZeroOut(new BinaryPacking()); - testZeroInZeroOut(new NewPFD()); - testZeroInZeroOut(new NewPFDS9()); - testZeroInZeroOut(new NewPFDS16()); - testZeroInZeroOut(new OptPFD()); - testZeroInZeroOut(new OptPFDS9()); - testZeroInZeroOut(new OptPFDS16()); - testZeroInZeroOut(new FastPFOR()); - testZeroInZeroOut(new VariableByte()); - testZeroInZeroOut(new Composition(new IntegratedBinaryPacking(), new VariableByte())); - testZeroInZeroOut(new Composition(new BinaryPacking(), new VariableByte())); - testZeroInZeroOut(new Composition(new NewPFD(), new VariableByte())); - testZeroInZeroOut(new Composition(new NewPFDS9(), new VariableByte())); - testZeroInZeroOut(new Composition(new NewPFDS16(), new VariableByte())); - testZeroInZeroOut(new Composition(new OptPFD(), new VariableByte())); - testZeroInZeroOut(new Composition(new OptPFDS9(), new VariableByte())); - testZeroInZeroOut(new Composition(new OptPFDS16(), new VariableByte())); - testZeroInZeroOut(new Composition(new FastPFOR(), new VariableByte())); - - testZeroInZeroOut(new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte())); + /** + * check that there is no spurious output. + */ + @SuppressWarnings("static-method") + @Test + public void spuriousouttest() { + testSpurious(new IntegratedBinaryPacking()); + testSpurious(new BinaryPacking()); + testSpurious(new NewPFD()); + testSpurious(new NewPFDS9()); + testSpurious(new NewPFDS16()); + testSpurious(new OptPFD()); + testSpurious(new OptPFDS9()); + testSpurious(new OptPFDS16()); + testSpurious(new FastPFOR()); + } - } + /** + * check that an empty array generates an empty array + * after compression. + */ + @SuppressWarnings("static-method") + @Test + public void zeroinzerouttest() { + testZeroInZeroOut(new IntegratedBinaryPacking()); + testZeroInZeroOut(new IntegratedVariableByte()); + testZeroInZeroOut(new BinaryPacking()); + testZeroInZeroOut(new NewPFD()); + testZeroInZeroOut(new NewPFDS9()); + testZeroInZeroOut(new NewPFDS16()); + testZeroInZeroOut(new OptPFD()); + testZeroInZeroOut(new OptPFDS9()); + testZeroInZeroOut(new OptPFDS16()); + testZeroInZeroOut(new FastPFOR()); + testZeroInZeroOut(new VariableByte()); + testZeroInZeroOut(new Composition(new IntegratedBinaryPacking(), new VariableByte())); + testZeroInZeroOut(new Composition(new BinaryPacking(), new VariableByte())); + testZeroInZeroOut(new Composition(new NewPFD(), new VariableByte())); + testZeroInZeroOut(new Composition(new NewPFDS9(), new VariableByte())); + testZeroInZeroOut(new Composition(new NewPFDS16(), new VariableByte())); + testZeroInZeroOut(new Composition(new OptPFD(), new VariableByte())); + testZeroInZeroOut(new Composition(new OptPFDS9(), new VariableByte())); + testZeroInZeroOut(new Composition(new OptPFDS16(), new VariableByte())); + testZeroInZeroOut(new Composition(new FastPFOR(), new VariableByte())); - - private static void testSpurious(IntegerCODEC c) { - int[] x = new int[1024]; - int[] y = new int[0]; - IntWrapper i0 = new IntWrapper(0); - IntWrapper i1 = new IntWrapper(0); - for(int inlength = 0; inlength <128;++inlength) { - c.compress(x, i0, inlength,y,i1); - Assert.assertEquals(i1.intValue(), 0); - } - } + testZeroInZeroOut(new IntegratedComposition(new IntegratedBinaryPacking(), + new IntegratedVariableByte())); + } - private static void testZeroInZeroOut(IntegerCODEC c) { - int[] x = new int[0]; - int[] y = new int[0]; - IntWrapper i0 = new IntWrapper(0); - IntWrapper i1 = new IntWrapper(0); - c.compress(x, i0, 0,y,i1); - Assert.assertEquals(i1.intValue(), 0); - int[] out = new int[0]; - IntWrapper outpos = new IntWrapper(0); - c.uncompress(y, i1, 0, out, outpos); - Assert.assertEquals(outpos.intValue(), 0); + private static void testSpurious(IntegerCODEC c) { + int[] x = new int[1024]; + int[] y = new int[0]; + IntWrapper i0 = new IntWrapper(0); + IntWrapper i1 = new IntWrapper(0); + for(int inlength = 0; inlength <128;++inlength) { + c.compress(x, i0, inlength,y,i1); + Assert.assertEquals(i1.intValue(), 0); } + } - private static void test(int N, int nbr) { - ClusteredDataGenerator cdg = new ClusteredDataGenerator(); - for (int sparsity = 1; sparsity < 31 - nbr; sparsity += 4) { - System.out.println("#testing sparsity "+sparsity); - int[][] data = new int[N][]; - int Max = (1 << (nbr + sparsity)); - for (int k = 0; k < N; ++k) { - data[k] = cdg.generateClustered((1 << nbr), Max); - } + private static void testZeroInZeroOut(IntegerCODEC c) { + int[] x = new int[0]; + int[] y = new int[0]; + IntWrapper i0 = new IntWrapper(0); + IntWrapper i1 = new IntWrapper(0); + c.compress(x, i0, 0,y,i1); + Assert.assertEquals(i1.intValue(), 0); + int[] out = new int[0]; + IntWrapper outpos = new IntWrapper(0); + c.uncompress(y, i1, 0, out, outpos); + Assert.assertEquals(outpos.intValue(), 0); + } - testCodec(new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()), data, Max); - testCodec(new JustCopy(), data, Max); - testCodec(new VariableByte(), data, Max); - testCodec(new IntegratedVariableByte(), data, Max); - testCodec(new Composition(new BinaryPacking(), new VariableByte()), - data, Max); - testCodec(new Composition(new NewPFD(), new VariableByte()), data, - Max); - testCodec(new Composition(new NewPFDS9(), new VariableByte()), - data, Max); - testCodec(new Composition(new NewPFDS16(), new VariableByte()), - data, Max); - testCodec(new Composition(new OptPFD(), new VariableByte()), data, - Max); - testCodec(new Composition(new OptPFDS9(), new VariableByte()), - data, Max); - testCodec(new Composition(new OptPFDS16(), new VariableByte()), - data, Max); - testCodec(new Composition(new FastPFOR(), new VariableByte()), - data, Max); - testCodec(new Simple9(), data, Max); - } - } + private static void test(int N, int nbr) { + ClusteredDataGenerator cdg = new ClusteredDataGenerator(); + for (int sparsity = 1; sparsity < 31 - nbr; sparsity += 4) { + System.out.println("#testing sparsity "+sparsity); + int[][] data = new int[N][]; + int Max = (1 << (nbr + sparsity)); + for (int k = 0; k < N; ++k) { + data[k] = cdg.generateClustered((1 << nbr), Max); + } + + testCodec(new IntegratedComposition(new IntegratedBinaryPacking(), + new IntegratedVariableByte()), data, Max); + testCodec(new JustCopy(), data, Max); + testCodec(new VariableByte(), data, Max); + testCodec(new IntegratedVariableByte(), data, Max); + testCodec(new Composition(new BinaryPacking(), new VariableByte()), + data, Max); + testCodec(new Composition(new NewPFD(), new VariableByte()), data, + Max); + testCodec(new Composition(new NewPFDS9(), new VariableByte()), + data, Max); + testCodec(new Composition(new NewPFDS16(), new VariableByte()), + data, Max); + testCodec(new Composition(new OptPFD(), new VariableByte()), data, + Max); + testCodec(new Composition(new OptPFDS9(), new VariableByte()), + data, Max); + testCodec(new Composition(new OptPFDS16(), new VariableByte()), + data, Max); + testCodec(new Composition(new FastPFOR(), new VariableByte()), + data, Max); + testCodec(new Simple9(), data, Max); + } + } - private static void testCodec(IntegerCODEC c, int[][] data, int Max) { - int N = data.length; - int maxlength = 0; - for (int k = 0; k < N; ++k) { - if (data[k].length > maxlength) - maxlength = data[k].length; - } - int[] buffer = new int[maxlength + 1024]; - int[] dataout = new int[4 * maxlength + 1024]; - /* 4x + 1024 to account for the possibility of some negative compression */ - IntWrapper inpos = new IntWrapper(); - IntWrapper outpos = new IntWrapper(); - for (int k = 0; k < N; ++k) { - int[] backupdata = Arrays.copyOf(data[k], data[k].length); - // - inpos.set(1); - outpos.set(0); - if (!(c instanceof IntegratedIntegerCODEC)) { - Delta.delta(backupdata); - } - c.compress(backupdata, inpos, backupdata.length - inpos.get(), - dataout, outpos); - final int thiscompsize = outpos.get() + 1; - inpos.set(0); - outpos.set(1); - buffer[0] = backupdata[0]; - c.uncompress(dataout, inpos, thiscompsize - 1, buffer, outpos); - if (!(c instanceof IntegratedIntegerCODEC)) - Delta.fastinverseDelta(buffer); - // - if (outpos.get() != data[k].length) - throw new RuntimeException("we have a bug (diff length) " + c - + " expected " + data[k].length + " got " - + outpos.get()); - for (int m = 0; m < outpos.get(); ++m) - if (buffer[m] != data[k][m]) { - throw new RuntimeException( - "we have a bug (actual difference), expected " - + data[k][m] + " found " + buffer[m] - + " at " + m); - } + private static void testCodec(IntegerCODEC c, int[][] data, int Max) { + int N = data.length; + int maxlength = 0; + for (int k = 0; k < N; ++k) { + if (data[k].length > maxlength) + maxlength = data[k].length; + } + int[] buffer = new int[maxlength + 1024]; + int[] dataout = new int[4 * maxlength + 1024]; + /* 4x + 1024 to account for the possibility of some negative compression */ + IntWrapper inpos = new IntWrapper(); + IntWrapper outpos = new IntWrapper(); + for (int k = 0; k < N; ++k) { + int[] backupdata = Arrays.copyOf(data[k], data[k].length); + // + inpos.set(1); + outpos.set(0); + if (!(c instanceof IntegratedIntegerCODEC)) { + Delta.delta(backupdata); + } + c.compress(backupdata, inpos, backupdata.length - inpos.get(), + dataout, outpos); + final int thiscompsize = outpos.get() + 1; + inpos.set(0); + outpos.set(1); + buffer[0] = backupdata[0]; + c.uncompress(dataout, inpos, thiscompsize - 1, buffer, outpos); + if (!(c instanceof IntegratedIntegerCODEC)) + Delta.fastinverseDelta(buffer); + // + if (outpos.get() != data[k].length) + throw new RuntimeException("we have a bug (diff length) " + c + + " expected " + data[k].length + " got " + + outpos.get()); + for (int m = 0; m < outpos.get(); ++m) + if (buffer[m] != data[k][m]) { + throw new RuntimeException( + "we have a bug (actual difference), expected " + + data[k][m] + " found " + buffer[m] + + " at " + m); + } - } - } + } + } - /** - * Test - */ - @SuppressWarnings("static-method") - @Test - public void testUnsortedExample() { + /** + * Test for unsorted array. + */ + @SuppressWarnings("static-method") + @Test + public void testUnsortedExample() { - testUnsorted(new VariableByte()); - testUnsorted(new IntegratedVariableByte()); - testUnsorted(new Composition(new BinaryPacking(), new VariableByte())); - testUnsorted(new Composition(new NewPFD(), new VariableByte())); - testUnsorted(new Composition(new NewPFDS9(), new VariableByte())); - testUnsorted(new Composition(new NewPFDS16(), new VariableByte())); - testUnsorted(new Composition(new OptPFD(), new VariableByte())); - testUnsorted(new Composition(new OptPFDS9(), new VariableByte())); - testUnsorted(new Composition(new OptPFDS16(), new VariableByte())); - testUnsorted(new Composition(new FastPFOR(), new VariableByte())); - - testUnsorted(new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte())); - testUnsorted(new Composition(new IntegratedBinaryPacking(), new VariableByte())); + testUnsorted(new VariableByte()); + testUnsorted(new IntegratedVariableByte()); + testUnsorted(new Composition(new BinaryPacking(), new VariableByte())); + testUnsorted(new Composition(new NewPFD(), new VariableByte())); + testUnsorted(new Composition(new NewPFDS9(), new VariableByte())); + testUnsorted(new Composition(new NewPFDS16(), new VariableByte())); + testUnsorted(new Composition(new OptPFD(), new VariableByte())); + testUnsorted(new Composition(new OptPFDS9(), new VariableByte())); + testUnsorted(new Composition(new OptPFDS16(), new VariableByte())); + testUnsorted(new Composition(new FastPFOR(), new VariableByte())); - } - - public void testUnsorted(IntegerCODEC codec) { - int[] lengths = {133,1333333}; - for (int N : lengths ) { - int[] data = new int[N]; - // initialize the data (most will be small - for (int k = 0; k < N; k += 1) - data[k] = 3; - // throw some larger values - for (int k = 0; k < N; k += 5) - data[k] = 100; - for (int k = 0; k < N; k += 533) - data[k] = 10000; - data[5] = -311; - int[] compressed = new int[(int) Math.ceil(N * 1.01) + 1024];// could - // need - // more - // compressing - IntWrapper inputoffset = new IntWrapper(0); - IntWrapper outputoffset = new IntWrapper(0); - codec.compress(data, inputoffset, data.length, - compressed, outputoffset); - // we can repack the data: (optional) - compressed = Arrays.copyOf(compressed, - outputoffset.intValue()); + testUnsorted(new IntegratedComposition(new IntegratedBinaryPacking(), + new IntegratedVariableByte())); + testUnsorted(new Composition(new IntegratedBinaryPacking(), new VariableByte())); + } - int[] recovered = new int[N]; - IntWrapper recoffset = new IntWrapper(0); - codec.uncompress(compressed, new IntWrapper(0), - compressed.length, recovered, recoffset); - Assert.assertTrue(Arrays.equals(data, recovered)); - } + public void testUnsorted(IntegerCODEC codec) + { + int[] lengths = {133,1333333}; + for (int N : lengths ) { + int[] data = new int[N]; + // initialize the data (most will be small + for (int k = 0; k < N; k += 1) + data[k] = 3; + // throw some larger values + for (int k = 0; k < N; k += 5) + data[k] = 100; + for (int k = 0; k < N; k += 533) + data[k] = 10000; + data[5] = -311; + int[] compressed = new int[(int) Math.ceil(N * 1.01) + 1024];// could + // need + // more + // compressing + IntWrapper inputoffset = new IntWrapper(0); + IntWrapper outputoffset = new IntWrapper(0); + codec.compress(data, inputoffset, data.length, + compressed, outputoffset); + // we can repack the data: (optional) + compressed = Arrays.copyOf(compressed, + outputoffset.intValue()); + int[] recovered = new int[N]; + IntWrapper recoffset = new IntWrapper(0); + codec.uncompress(compressed, new IntWrapper(0), + compressed.length, recovered, recoffset); + Assert.assertTrue(Arrays.equals(data, recovered)); } + } } From afba78077371b97b74b28d7b5d3efe1f4b3ddc41 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Thu, 5 Sep 2013 23:19:30 +0900 Subject: [PATCH 060/412] fix comment --- src/test/java/me/lemire/integercompression/BasicTest.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 4f5e6f9..d8bd053 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -277,7 +277,6 @@ private static void testCodec(IntegerCODEC c, int[][] data, int Max) { @SuppressWarnings("static-method") @Test public void testUnsortedExample() { - testUnsorted(new VariableByte()); testUnsorted(new IntegratedVariableByte()); testUnsorted(new Composition(new BinaryPacking(), new VariableByte())); @@ -308,10 +307,8 @@ public void testUnsorted(IntegerCODEC codec) for (int k = 0; k < N; k += 533) data[k] = 10000; data[5] = -311; - int[] compressed = new int[(int) Math.ceil(N * 1.01) + 1024];// could - // need - // more - // compressing + // could need more compressing + int[] compressed = new int[(int) Math.ceil(N * 1.01) + 1024]; IntWrapper inputoffset = new IntWrapper(0); IntWrapper outputoffset = new IntWrapper(0); codec.compress(data, inputoffset, data.length, From e761e677cfd9ed4e05c9c0a287c03761890f67e2 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Thu, 5 Sep 2013 23:25:10 +0900 Subject: [PATCH 061/412] make BasicTest quiet when there are no problems. --- .../java/me/lemire/integercompression/BasicTest.java | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index d8bd053..601644e 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -23,7 +23,6 @@ public class BasicTest @SuppressWarnings("static-method") @Test public void verify() { - System.out.println("Checking the code..."); final int N = 32; final int times = 1000; Random r = new Random(); @@ -42,7 +41,6 @@ public void verify() { } } } - System.out.println("Code appears to be correct."); } /** @@ -51,7 +49,6 @@ public void verify() { @SuppressWarnings("static-method") @Test public void verifyWithoutMask() { - System.out.println("Checking the code..."); final int N = 32; final int times = 1000; Random r = new Random(); @@ -70,7 +67,6 @@ public void verifyWithoutMask() { } } } - System.out.println("Code appears to be correct."); } /** @@ -79,7 +75,6 @@ public void verifyWithoutMask() { @SuppressWarnings("static-method") @Test public void verifyWithExceptions() { - System.out.println("Checking the code..."); final int N = 32; final int times = 1000; Random r = new Random(); @@ -95,16 +90,16 @@ public void verifyWithExceptions() { BitPacking.fastunpack(compressed, 0, uncompressed, 0, bit); for (int k = 0; k < N; ++k) { if ((data[k] & ((1 << bit) - 1)) != uncompressed[k]) { + System.err.println("ERROR: detected a problem, dump debugging info:"); for (int k2 = 0; k2 < N; ++k2) { - System.out.println((data[k] & ((1 << bit) - 1)) + " " + uncompressed[k]); + System.err.println((data[k] & ((1 << bit) - 1)) + " " + uncompressed[k]); } - System.out.println(compressed[0]); + System.err.println(compressed[0]); throw new RuntimeException("bug " + bit); } } } } - System.out.println("Code with overflow appears to be correct."); } /** @@ -194,7 +189,6 @@ private static void testZeroInZeroOut(IntegerCODEC c) { private static void test(int N, int nbr) { ClusteredDataGenerator cdg = new ClusteredDataGenerator(); for (int sparsity = 1; sparsity < 31 - nbr; sparsity += 4) { - System.out.println("#testing sparsity "+sparsity); int[][] data = new int[N][]; int Max = (1 << (nbr + sparsity)); for (int k = 0; k < N; ++k) { From dd666a83a36b9b8ec77dae0811c33ff998f697d1 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Thu, 5 Sep 2013 23:29:51 +0900 Subject: [PATCH 062/412] refactor BasicTest for BitPacking --- .../java/me/lemire/integercompression/BasicTest.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 601644e..3efa14b 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -8,6 +8,7 @@ import me.lemire.integercompression.synth.ClusteredDataGenerator; import org.junit.Test; +import static org.junit.Assert.*; /** * Just some basic sanity tests. @@ -22,23 +23,21 @@ public class BasicTest */ @SuppressWarnings("static-method") @Test - public void verify() { + public void verifyBitPacking() { final int N = 32; - final int times = 1000; + final int TIMES = 1000; Random r = new Random(); int[] data = new int[N]; int[] compressed = new int[N]; int[] uncompressed = new int[N]; for (int bit = 0; bit < 31; ++bit) { - for (int t = 0; t < times; ++t) { + for (int t = 0; t < TIMES; ++t) { for (int k = 0; k < N; ++k) { data[k] = r.nextInt(1 << bit); } BitPacking.fastpack(data, 0, compressed, 0, bit); BitPacking.fastunpack(compressed, 0, uncompressed, 0, bit); - if (!Arrays.equals(uncompressed, data)) { - throw new RuntimeException("bug " + bit); - } + assertArrayEquals(uncompressed, data); } } } From e08da5120c2f037b5062cb5481a493800fa5fbf9 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Thu, 5 Sep 2013 23:31:26 +0900 Subject: [PATCH 063/412] refactor BasicTest#verifyWithoutMask --- src/test/java/me/lemire/integercompression/BasicTest.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 3efa14b..dfa67e5 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -49,21 +49,19 @@ public void verifyBitPacking() { @Test public void verifyWithoutMask() { final int N = 32; - final int times = 1000; + final int TIMES = 1000; Random r = new Random(); int[] data = new int[N]; int[] compressed = new int[N]; int[] uncompressed = new int[N]; for (int bit = 0; bit < 31; ++bit) { - for (int t = 0; t < times; ++t) { + for (int t = 0; t < TIMES; ++t) { for (int k = 0; k < N; ++k) { data[k] = r.nextInt(1 << bit); } BitPacking.fastpackwithoutmask(data, 0, compressed, 0, bit); BitPacking.fastunpack(compressed, 0, uncompressed, 0, bit); - if (!Arrays.equals(uncompressed, data)) { - throw new RuntimeException("bug " + bit); - } + assertArrayEquals(uncompressed, data); } } } From 255efee23a056aebf7ebfe140e2f768f95209c1a Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Thu, 5 Sep 2013 23:37:16 +0900 Subject: [PATCH 064/412] refactor test methods --- .../lemire/integercompression/BasicTest.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index dfa67e5..8a834c9 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -73,13 +73,13 @@ public void verifyWithoutMask() { @Test public void verifyWithExceptions() { final int N = 32; - final int times = 1000; + final int TIMES = 1000; Random r = new Random(); int[] data = new int[N]; int[] compressed = new int[N]; int[] uncompressed = new int[N]; for (int bit = 0; bit < 31; ++bit) { - for (int t = 0; t < times; ++t) { + for (int t = 0; t < TIMES; ++t) { for (int k = 0; k < N; ++k) { data[k] = r.nextInt(); } @@ -87,6 +87,7 @@ public void verifyWithExceptions() { BitPacking.fastunpack(compressed, 0, uncompressed, 0, bit); for (int k = 0; k < N; ++k) { if ((data[k] & ((1 << bit) - 1)) != uncompressed[k]) { + // TODO: use Assert System.err.println("ERROR: detected a problem, dump debugging info:"); for (int k2 = 0; k2 < N; ++k2) { System.err.println((data[k] & ((1 << bit) - 1)) + " " + uncompressed[k]); @@ -155,8 +156,7 @@ public void zeroinzerouttest() { testZeroInZeroOut(new Composition(new OptPFDS16(), new VariableByte())); testZeroInZeroOut(new Composition(new FastPFOR(), new VariableByte())); - testZeroInZeroOut(new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte())); + testZeroInZeroOut(new IntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte())); } private static void testSpurious(IntegerCODEC c) { @@ -164,9 +164,9 @@ private static void testSpurious(IntegerCODEC c) { int[] y = new int[0]; IntWrapper i0 = new IntWrapper(0); IntWrapper i1 = new IntWrapper(0); - for(int inlength = 0; inlength <128;++inlength) { - c.compress(x, i0, inlength,y,i1); - Assert.assertEquals(i1.intValue(), 0); + for (int inlength = 0; inlength < 128; ++inlength) { + c.compress(x, i0, inlength, y, i1); + assertEquals(0, i1.intValue()); } } @@ -175,12 +175,12 @@ private static void testZeroInZeroOut(IntegerCODEC c) { int[] y = new int[0]; IntWrapper i0 = new IntWrapper(0); IntWrapper i1 = new IntWrapper(0); - c.compress(x, i0, 0,y,i1); - Assert.assertEquals(i1.intValue(), 0); + c.compress(x, i0, 0, y, i1); + assertEquals(0, i1.intValue()); int[] out = new int[0]; IntWrapper outpos = new IntWrapper(0); c.uncompress(y, i1, 0, out, outpos); - Assert.assertEquals(outpos.intValue(), 0); + assertEquals(0, outpos.intValue()); } private static void test(int N, int nbr) { From 87ab2c78952832a85e50b5ccbc037a3818fc4283 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Thu, 5 Sep 2013 23:55:04 +0900 Subject: [PATCH 065/412] refactor literal issues --- .../lemire/integercompression/BasicTest.java | 61 ++++++++++--------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 8a834c9..2a4b726 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -3,8 +3,6 @@ import java.util.Arrays; import java.util.Random; -import junit.framework.Assert; - import me.lemire.integercompression.synth.ClusteredDataGenerator; import org.junit.Test; @@ -85,9 +83,11 @@ public void verifyWithExceptions() { } BitPacking.fastpack(data, 0, compressed, 0, bit); BitPacking.fastunpack(compressed, 0, uncompressed, 0, bit); + + // Check assertions. + // FIXME: rewrite using assert* method. for (int k = 0; k < N; ++k) { if ((data[k] & ((1 << bit) - 1)) != uncompressed[k]) { - // TODO: use Assert System.err.println("ERROR: detected a problem, dump debugging info:"); for (int k2 = 0; k2 < N; ++k2) { System.err.println((data[k] & ((1 << bit) - 1)) + " " + uncompressed[k]); @@ -177,6 +177,7 @@ private static void testZeroInZeroOut(IntegerCODEC c) { IntWrapper i1 = new IntWrapper(0); c.compress(x, i0, 0, y, i1); assertEquals(0, i1.intValue()); + int[] out = new int[0]; IntWrapper outpos = new IntWrapper(0); c.uncompress(y, i1, 0, out, outpos); @@ -187,37 +188,37 @@ private static void test(int N, int nbr) { ClusteredDataGenerator cdg = new ClusteredDataGenerator(); for (int sparsity = 1; sparsity < 31 - nbr; sparsity += 4) { int[][] data = new int[N][]; - int Max = (1 << (nbr + sparsity)); + int max = (1 << (nbr + sparsity)); for (int k = 0; k < N; ++k) { - data[k] = cdg.generateClustered((1 << nbr), Max); + data[k] = cdg.generateClustered((1 << nbr), max); } testCodec(new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()), data, Max); - testCodec(new JustCopy(), data, Max); - testCodec(new VariableByte(), data, Max); - testCodec(new IntegratedVariableByte(), data, Max); + new IntegratedVariableByte()), data, max); + testCodec(new JustCopy(), data, max); + testCodec(new VariableByte(), data, max); + testCodec(new IntegratedVariableByte(), data, max); testCodec(new Composition(new BinaryPacking(), new VariableByte()), - data, Max); + data, max); testCodec(new Composition(new NewPFD(), new VariableByte()), data, - Max); + max); testCodec(new Composition(new NewPFDS9(), new VariableByte()), - data, Max); + data, max); testCodec(new Composition(new NewPFDS16(), new VariableByte()), - data, Max); + data, max); testCodec(new Composition(new OptPFD(), new VariableByte()), data, - Max); + max); testCodec(new Composition(new OptPFDS9(), new VariableByte()), - data, Max); + data, max); testCodec(new Composition(new OptPFDS16(), new VariableByte()), - data, Max); + data, max); testCodec(new Composition(new FastPFOR(), new VariableByte()), - data, Max); - testCodec(new Simple9(), data, Max); + data, max); + testCodec(new Simple9(), data, max); } } - private static void testCodec(IntegerCODEC c, int[][] data, int Max) { + private static void testCodec(IntegerCODEC c, int[][] data, int max) { int N = data.length; int maxlength = 0; for (int k = 0; k < N; ++k) { @@ -226,12 +227,13 @@ private static void testCodec(IntegerCODEC c, int[][] data, int Max) { } int[] buffer = new int[maxlength + 1024]; int[] dataout = new int[4 * maxlength + 1024]; - /* 4x + 1024 to account for the possibility of some negative compression */ + // 4x + 1024 to account for the possibility of some negative + // compression. IntWrapper inpos = new IntWrapper(); IntWrapper outpos = new IntWrapper(); for (int k = 0; k < N; ++k) { int[] backupdata = Arrays.copyOf(data[k], data[k].length); - // + inpos.set(1); outpos.set(0); if (!(c instanceof IntegratedIntegerCODEC)) { @@ -246,7 +248,9 @@ private static void testCodec(IntegerCODEC c, int[][] data, int Max) { c.uncompress(dataout, inpos, thiscompsize - 1, buffer, outpos); if (!(c instanceof IntegratedIntegerCODEC)) Delta.fastinverseDelta(buffer); - // + + // Check assertions. + // FIXME: rewrite using assert* method. if (outpos.get() != data[k].length) throw new RuntimeException("we have a bug (diff length) " + c + " expected " + data[k].length + " got " @@ -258,7 +262,6 @@ private static void testCodec(IntegerCODEC c, int[][] data, int Max) { + data[k][m] + " found " + buffer[m] + " at " + m); } - } } @@ -286,8 +289,8 @@ public void testUnsortedExample() { public void testUnsorted(IntegerCODEC codec) { - int[] lengths = {133,1333333}; - for (int N : lengths ) { + int[] lengths = { 133, 1333333 }; + for (int N : lengths) { int[] data = new int[N]; // initialize the data (most will be small for (int k = 0; k < N; k += 1) @@ -302,17 +305,15 @@ public void testUnsorted(IntegerCODEC codec) int[] compressed = new int[(int) Math.ceil(N * 1.01) + 1024]; IntWrapper inputoffset = new IntWrapper(0); IntWrapper outputoffset = new IntWrapper(0); - codec.compress(data, inputoffset, data.length, - compressed, outputoffset); + codec.compress(data, inputoffset, data.length, compressed, outputoffset); // we can repack the data: (optional) - compressed = Arrays.copyOf(compressed, - outputoffset.intValue()); + compressed = Arrays.copyOf(compressed, outputoffset.intValue()); int[] recovered = new int[N]; IntWrapper recoffset = new IntWrapper(0); codec.uncompress(compressed, new IntWrapper(0), compressed.length, recovered, recoffset); - Assert.assertTrue(Arrays.equals(data, recovered)); + assertArrayEquals(data, recovered); } } From b4cf9408f307e255d4f8cc1b2c9ee868a0c80f47 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Fri, 6 Sep 2013 00:17:46 +0900 Subject: [PATCH 066/412] use Assert methods for assertions --- .../lemire/integercompression/BasicTest.java | 35 +++++++------------ 1 file changed, 12 insertions(+), 23 deletions(-) diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 2a4b726..3e01554 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -64,6 +64,12 @@ public void verifyWithoutMask() { } } + public static void maskArray(int[] array, int mask) { + for (int i = 0, end = array.length; i < end; ++i) { + array[i] &= mask; + } + } + /** * Verify bitpacking with exception. */ @@ -85,17 +91,8 @@ public void verifyWithExceptions() { BitPacking.fastunpack(compressed, 0, uncompressed, 0, bit); // Check assertions. - // FIXME: rewrite using assert* method. - for (int k = 0; k < N; ++k) { - if ((data[k] & ((1 << bit) - 1)) != uncompressed[k]) { - System.err.println("ERROR: detected a problem, dump debugging info:"); - for (int k2 = 0; k2 < N; ++k2) { - System.err.println((data[k] & ((1 << bit) - 1)) + " " + uncompressed[k]); - } - System.err.println(compressed[0]); - throw new RuntimeException("bug " + bit); - } - } + maskArray(data, ((1 << bit) - 1)); + assertArrayEquals(data, uncompressed); } } } @@ -250,18 +247,10 @@ private static void testCodec(IntegerCODEC c, int[][] data, int max) { Delta.fastinverseDelta(buffer); // Check assertions. - // FIXME: rewrite using assert* method. - if (outpos.get() != data[k].length) - throw new RuntimeException("we have a bug (diff length) " + c - + " expected " + data[k].length + " got " - + outpos.get()); - for (int m = 0; m < outpos.get(); ++m) - if (buffer[m] != data[k][m]) { - throw new RuntimeException( - "we have a bug (actual difference), expected " - + data[k][m] + " found " + buffer[m] - + " at " + m); - } + assertEquals("length is not match", outpos.get(), data[k].length); + int[] bufferCutout = Arrays.copyOf(buffer, outpos.get()); + assertArrayEquals("failed to reconstruct original data", + data[k], bufferCutout); } } From 72aa69e3f15107fffe7c03ebd2f2cf67246dc231 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 17 Sep 2013 11:57:24 +0900 Subject: [PATCH 067/412] fix indentation and spacing, automatically --- .../lemire/integercompression/Benchmark.java | 97 +++++++++---------- 1 file changed, 48 insertions(+), 49 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/Benchmark.java b/src/main/java/me/lemire/integercompression/Benchmark.java index 25c7bff..43b08eb 100644 --- a/src/main/java/me/lemire/integercompression/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/Benchmark.java @@ -15,7 +15,7 @@ import java.util.Arrays; /** - * + * * Simple class meant to compare the speed of different schemes. * @author Daniel Lemire * @@ -24,21 +24,20 @@ public class Benchmark { /** * Standard benchmark - * + * * @param c the codec * @param data arrays of input data * @param repeat How many times to repeat the test * @param verbose whether to output result on screen */ - private static void testCodec(IntegerCODEC c, int[][] data, - int repeat, boolean verbose) { + private static void testCodec(IntegerCODEC c, int[][] data, + int repeat, boolean verbose) { DecimalFormat df = new DecimalFormat("0.00"); DecimalFormat dfspeed = new DecimalFormat("0"); if (verbose) System.out.println("# " + c.toString()); if (verbose) - System.out - .println("# bits per int, compress speed (mis), decompression speed (mis) "); + System.out.println("# bits per int, compress speed (mis), decompression speed (mis) "); long bef, aft; String line = ""; int N = data.length; @@ -94,8 +93,8 @@ private static void testCodec(IntegerCODEC c, int[][] data, if (buffer[m] != data[k][m]) { throw new RuntimeException( "we have a bug (actual difference), expected " - + data[k][m] + " found " + buffer[m] - + " at " + m); + + data[k][m] + " found " + buffer[m] + + " at " + m); } } @@ -107,36 +106,36 @@ private static void testCodec(IntegerCODEC c, int[][] data, System.out.println(line); } - /** - * Main method. - * - * @param args command-line arguments - */ - public static void main(String args[]) { - System.out.println("# benchmark based on the ClusterData model from:"); - System.out.println("# Vo Ngoc Anh and Alistair Moffat. "); - System.out.println("# Index compression using 64-bit words.") ; - System.out.println("# Softw. Pract. Exper.40, 2 (February 2010), 131-147. "); - System.out.println(); - test(20, 18, 10); - } + /** + * Main method. + * + * @param args command-line arguments + */ + public static void main(String args[]) { + System.out.println("# benchmark based on the ClusterData model from:"); + System.out.println("# Vo Ngoc Anh and Alistair Moffat. "); + System.out.println("# Index compression using 64-bit words.") ; + System.out.println("# Softw. Pract. Exper.40, 2 (February 2010), 131-147. "); + System.out.println(); + test(20, 18, 10); + } /** * Standard test for the Kamikaze library - * + * * @param data input data * @param repeat how many times to repeat * @param verbose whether to output data on screen */ public static void testKamikaze(int[][] data, - int repeat, boolean verbose) { + int repeat, boolean verbose) { DecimalFormat df = new DecimalFormat("0.00"); DecimalFormat dfspeed = new DecimalFormat("0"); if (verbose) System.out.println("# kamikaze PForDelta"); if (verbose) System.out - .println("# bits per int, compress speed (mis), decompression speed (mis) "); + .println("# bits per int, compress speed (mis), decompression speed (mis) "); long bef, aft; String line = ""; int N = data.length; @@ -148,7 +147,7 @@ public static void testKamikaze(int[][] data, maxlength = data[k].length; } int[] buffer = new int[maxlength + 1024]; - /* 4x + 1024 to account for the possibility of some negative compression */ + /* 4x + 1024 to account for the possibility of some negative compression */ int size = 0; int comptime = 0; long decomptime = 0; @@ -196,8 +195,8 @@ public static void testKamikaze(int[][] data, if (datauncomp.get(m / 128)[m % 128] != data[k][m]) { throw new RuntimeException( "we have a bug (actual difference), expected " - + data[k][m] + " found " + buffer[m] - + " at " + m); + + data[k][m] + " found " + buffer[m] + + " at " + m); } } @@ -212,7 +211,7 @@ public static void testKamikaze(int[][] data, /** * Generates data and calls other tests. - * + * * @param N How many input arrays to generate * @param nbr how big (in log2) should the arrays be * @param repeat How many times should we repeat tests. @@ -234,11 +233,11 @@ private static void test(int N, int nbr, int repeat) { System.out.println(); testCodec(new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()), data, repeat, false); + new IntegratedVariableByte()), data, repeat, false); testCodec(new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()), data, repeat, false); + new IntegratedVariableByte()), data, repeat, false); testCodec(new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()), data, repeat, true); + new IntegratedVariableByte()), data, repeat, true); System.out.println(); @@ -267,53 +266,53 @@ private static void test(int N, int nbr, int repeat) { System.out.println(); testCodec(new Composition(new NewPFD(), new VariableByte()), data, - repeat, false); + repeat, false); testCodec(new Composition(new NewPFD(), new VariableByte()), data, - repeat, false); + repeat, false); testCodec(new Composition(new NewPFD(), new VariableByte()), data, - repeat, true); + repeat, true); System.out.println(); testCodec(new Composition(new NewPFDS9(), new VariableByte()), data, - repeat, false); + repeat, false); testCodec(new Composition(new NewPFDS9(), new VariableByte()), data, - repeat, false); + repeat, false); testCodec(new Composition(new NewPFDS9(), new VariableByte()), data, - repeat, true); + repeat, true); System.out.println(); testCodec(new Composition(new NewPFDS16(), new VariableByte()), data, repeat, false); - testCodec(new Composition(new NewPFDS16(), new VariableByte()), data, + testCodec(new Composition(new NewPFDS16(), new VariableByte()), data, repeat, false); - testCodec(new Composition(new NewPFDS16(), new VariableByte()), data, + testCodec(new Composition(new NewPFDS16(), new VariableByte()), data, repeat, true); - System.out.println(); + System.out.println(); testCodec(new Composition(new OptPFD(), new VariableByte()), data, - repeat, false); + repeat, false); testCodec(new Composition(new OptPFD(), new VariableByte()), data, - repeat, false); + repeat, false); testCodec(new Composition(new OptPFD(), new VariableByte()), data, - repeat, true); + repeat, true); System.out.println(); testCodec(new Composition(new OptPFDS9(), new VariableByte()), data, - repeat, false); + repeat, false); testCodec(new Composition(new OptPFDS9(), new VariableByte()), data, - repeat, false); + repeat, false); testCodec(new Composition(new OptPFDS9(), new VariableByte()), data, - repeat, true); + repeat, true); System.out.println(); testCodec(new Composition(new OptPFDS16(), new VariableByte()), data, repeat, false); - testCodec(new Composition(new OptPFDS16(), new VariableByte()), data, + testCodec(new Composition(new OptPFDS16(), new VariableByte()), data, repeat, false); - testCodec(new Composition(new OptPFDS16(), new VariableByte()), data, + testCodec(new Composition(new OptPFDS16(), new VariableByte()), data, repeat, true); - System.out.println(); + System.out.println(); testCodec(new Composition(new FastPFOR(), new VariableByte()), data, repeat, false); From 0d42e42f645b58036bea6ba7e5547a2f3fd74c19 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 17 Sep 2013 12:10:20 +0900 Subject: [PATCH 068/412] split test data genrator method --- .../lemire/integercompression/Benchmark.java | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/Benchmark.java b/src/main/java/me/lemire/integercompression/Benchmark.java index 43b08eb..b5f743c 100644 --- a/src/main/java/me/lemire/integercompression/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/Benchmark.java @@ -209,6 +209,27 @@ public static void testKamikaze(int[][] data, System.out.println(line); } + /** + * Generate test data. + * + * @param N How many input arrays to generate + * @param nbr How big (in log2) should the arrays be + * @param sparsity How sparse test data generated + */ + private static int[][] generateTestData( + ClusteredDataGenerator dataGen, + int N, + int nbr, + int sparsity) + { + final int[][] data = new int[N][]; + final int dataSize = (1 << (nbr + sparsity)); + for (int i = 0; i < N; ++i) { + data[i] = dataGen.generateClustered((1 << nbr), dataSize); + } + return data; + } + /** * Generates data and calls other tests. * @@ -218,14 +239,11 @@ public static void testKamikaze(int[][] data, */ private static void test(int N, int nbr, int repeat) { ClusteredDataGenerator cdg = new ClusteredDataGenerator(); - for (int sparsity = 1; sparsity < 31 - nbr; sparsity += 1) { + final int max_sparsity = 31 - nbr; + for (int sparsity = 1; sparsity < max_sparsity; ++sparsity) { System.out.println("# sparsity " + sparsity); - int[][] data = new int[N][]; - int Max = (1 << (nbr + sparsity)); System.out.println("# generating random data..."); - for (int k = 0; k < N; ++k) { - data[k] = cdg.generateClustered((1 << nbr), Max); - } + int[][] data = generateTestData(cdg, N, nbr, sparsity); System.out.println("# generating random data... ok."); testKamikaze(data, repeat, false); testKamikaze(data, repeat, false); From 69e957b916b718e00d749a2ddf4ad5ff622bccb1 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 17 Sep 2013 12:13:06 +0900 Subject: [PATCH 069/412] fix spacing of test() method --- .../lemire/integercompression/Benchmark.java | 99 +++++++++---------- 1 file changed, 48 insertions(+), 51 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/Benchmark.java b/src/main/java/me/lemire/integercompression/Benchmark.java index b5f743c..61cfdf5 100644 --- a/src/main/java/me/lemire/integercompression/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/Benchmark.java @@ -245,42 +245,40 @@ private static void test(int N, int nbr, int repeat) { System.out.println("# generating random data..."); int[][] data = generateTestData(cdg, N, nbr, sparsity); System.out.println("# generating random data... ok."); - testKamikaze(data, repeat, false); - testKamikaze(data, repeat, false); - testKamikaze(data, repeat, true); + testKamikaze(data, repeat, false); + testKamikaze(data, repeat, false); + testKamikaze(data, repeat, true); System.out.println(); testCodec(new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()), data, repeat, false); + new IntegratedVariableByte()), data, repeat, false); testCodec(new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()), data, repeat, false); + new IntegratedVariableByte()), data, repeat, false); testCodec(new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()), data, repeat, true); + new IntegratedVariableByte()), data, repeat, true); System.out.println(); - - testCodec(new JustCopy(), data, repeat, false); - testCodec(new JustCopy(), data, repeat, false); - testCodec(new JustCopy(), data, repeat, true); + testCodec(new JustCopy(), data, repeat, false); + testCodec(new JustCopy(), data, repeat, false); + testCodec(new JustCopy(), data, repeat, true); System.out.println(); - testCodec(new VariableByte(), data, repeat, false); - testCodec(new VariableByte(), data, repeat, false); - testCodec(new VariableByte(), data, repeat, true); + testCodec(new VariableByte(), data, repeat, false); + testCodec(new VariableByte(), data, repeat, false); + testCodec(new VariableByte(), data, repeat, true); System.out.println(); - testCodec(new IntegratedVariableByte(), data, repeat, false); - testCodec(new IntegratedVariableByte(), data, repeat, false); - testCodec(new IntegratedVariableByte(), data, repeat, true); + testCodec(new IntegratedVariableByte(), data, repeat, false); + testCodec(new IntegratedVariableByte(), data, repeat, false); + testCodec(new IntegratedVariableByte(), data, repeat, true); System.out.println(); - testCodec(new Composition(new BinaryPacking(), new VariableByte()), - data, repeat, false); + data, repeat, false); testCodec(new Composition(new BinaryPacking(), new VariableByte()), - data, repeat, false); + data, repeat, false); testCodec(new Composition(new BinaryPacking(), new VariableByte()), - data, repeat, true); + data, repeat, true); System.out.println(); testCodec(new Composition(new NewPFD(), new VariableByte()), data, @@ -291,21 +289,20 @@ private static void test(int N, int nbr, int repeat) { repeat, true); System.out.println(); - - testCodec(new Composition(new NewPFDS9(), new VariableByte()), data, - repeat, false); - testCodec(new Composition(new NewPFDS9(), new VariableByte()), data, - repeat, false); - testCodec(new Composition(new NewPFDS9(), new VariableByte()), data, - repeat, true); + testCodec(new Composition(new NewPFDS9(), new VariableByte()), + data, repeat, false); + testCodec(new Composition(new NewPFDS9(), new VariableByte()), + data, repeat, false); + testCodec(new Composition(new NewPFDS9(), new VariableByte()), + data, repeat, true); System.out.println(); - testCodec(new Composition(new NewPFDS16(), new VariableByte()), data, - repeat, false); - testCodec(new Composition(new NewPFDS16(), new VariableByte()), data, - repeat, false); - testCodec(new Composition(new NewPFDS16(), new VariableByte()), data, - repeat, true); + testCodec(new Composition(new NewPFDS16(), new VariableByte()), + data, repeat, false); + testCodec(new Composition(new NewPFDS16(), new VariableByte()), + data, repeat, false); + testCodec(new Composition(new NewPFDS16(), new VariableByte()), + data, repeat, true); System.out.println(); testCodec(new Composition(new OptPFD(), new VariableByte()), data, @@ -316,33 +313,33 @@ private static void test(int N, int nbr, int repeat) { repeat, true); System.out.println(); - testCodec(new Composition(new OptPFDS9(), new VariableByte()), data, - repeat, false); - testCodec(new Composition(new OptPFDS9(), new VariableByte()), data, - repeat, false); - testCodec(new Composition(new OptPFDS9(), new VariableByte()), data, - repeat, true); + testCodec(new Composition(new OptPFDS9(), new VariableByte()), + data, repeat, false); + testCodec(new Composition(new OptPFDS9(), new VariableByte()), + data, repeat, false); + testCodec(new Composition(new OptPFDS9(), new VariableByte()), + data, repeat, true); System.out.println(); - testCodec(new Composition(new OptPFDS16(), new VariableByte()), data, - repeat, false); - testCodec(new Composition(new OptPFDS16(), new VariableByte()), data, - repeat, false); - testCodec(new Composition(new OptPFDS16(), new VariableByte()), data, - repeat, true); + testCodec(new Composition(new OptPFDS16(), new VariableByte()), + data, repeat, false); + testCodec(new Composition(new OptPFDS16(), new VariableByte()), + data, repeat, false); + testCodec(new Composition(new OptPFDS16(), new VariableByte()), + data, repeat, true); System.out.println(); testCodec(new Composition(new FastPFOR(), new VariableByte()), - data, repeat, false); + data, repeat, false); testCodec(new Composition(new FastPFOR(), new VariableByte()), - data, repeat, false); + data, repeat, false); testCodec(new Composition(new FastPFOR(), new VariableByte()), - data, repeat, true); + data, repeat, true); System.out.println(); - testCodec(new Simple9(), data, repeat, false); - testCodec(new Simple9(), data, repeat, false); - testCodec(new Simple9(), data, repeat, true); + testCodec(new Simple9(), data, repeat, false); + testCodec(new Simple9(), data, repeat, false); + testCodec(new Simple9(), data, repeat, true); System.out.println(); } } From a343b26e361ac620b42d6b0199a26f8d778cd3f7 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 17 Sep 2013 12:27:42 +0900 Subject: [PATCH 070/412] refactor testCodec: add comments, fix logging logic --- .../lemire/integercompression/Benchmark.java | 48 ++++++++++++------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/Benchmark.java b/src/main/java/me/lemire/integercompression/Benchmark.java index 61cfdf5..eb0330b 100644 --- a/src/main/java/me/lemire/integercompression/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/Benchmark.java @@ -30,27 +30,31 @@ public class Benchmark { * @param repeat How many times to repeat the test * @param verbose whether to output result on screen */ - private static void testCodec(IntegerCODEC c, int[][] data, - int repeat, boolean verbose) { + private static void testCodec( + IntegerCODEC c, + int[][] data, + int repeat, boolean verbose) + { DecimalFormat df = new DecimalFormat("0.00"); DecimalFormat dfspeed = new DecimalFormat("0"); - if (verbose) + if (verbose) { System.out.println("# " + c.toString()); - if (verbose) System.out.println("# bits per int, compress speed (mis), decompression speed (mis) "); + } long bef, aft; - String line = ""; int N = data.length; int totalsize = 0; int maxlength = 0; for (int k = 0; k < N; ++k) { totalsize += data[k].length; - if (data[k].length > maxlength) + if (data[k].length > maxlength) { maxlength = data[k].length; + } } int[] buffer = new int[maxlength + 1024]; int[] dataout = new int[4 * maxlength + 1024]; - /* 4x + 1024 to account for the possibility of some negative compression */ + // 4x + 1024 to account for the possibility of some negative + // compression. int size = 0; int comptime = 0; long decomptime = 0; @@ -60,7 +64,8 @@ private static void testCodec(IntegerCODEC c, int[][] data, size = 0; for (int k = 0; k < N; ++k) { int[] backupdata = Arrays.copyOf(data[k], data[k].length); - // + + // compress data. bef = System.nanoTime() / 1000; inpos.set(1); outpos.set(0); @@ -70,11 +75,13 @@ private static void testCodec(IntegerCODEC c, int[][] data, c.compress(backupdata, inpos, backupdata.length - inpos.get(), dataout, outpos); aft = System.nanoTime() / 1000; - // + + // measure time of compression. comptime += aft - bef; final int thiscompsize = outpos.get() + 1; size += thiscompsize; - // + + // extract (uncompress) data bef = System.nanoTime() / 1000; inpos.set(0); outpos.set(1); @@ -83,27 +90,32 @@ private static void testCodec(IntegerCODEC c, int[][] data, if (!(c instanceof IntegratedIntegerCODEC)) Delta.fastinverseDelta(buffer); aft = System.nanoTime() / 1000; - // + + // measure time of extraction (uncompression). decomptime += aft - bef; if (outpos.get() != data[k].length) throw new RuntimeException("we have a bug (diff length) " + c + " expected " + data[k].length + " got " + outpos.get()); - for (int m = 0; m < outpos.get(); ++m) + + // verify: compare original array with compressed and + // uncompressed. + for (int m = 0; m < outpos.get(); ++m) { if (buffer[m] != data[k][m]) { throw new RuntimeException( "we have a bug (actual difference), expected " + data[k][m] + " found " + buffer[m] + " at " + m); } - + } } } - line += "\t" + df.format(size * 32.0 / totalsize); - line += "\t" + dfspeed.format(totalsize * repeat / (comptime)); - line += "\t" + dfspeed.format(totalsize * repeat / (decomptime)); - if (verbose) - System.out.println(line); + if (verbose) { + System.out.println(String.format("\t%1$.2f\t%2$d\t%3$d", + size * 32.0 / totalsize, + totalsize * repeat / (comptime), + totalsize * repeat / (decomptime))); + } } /** From d4962385aa6f419898e754acbcdcd823066a3554 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 17 Sep 2013 12:33:58 +0900 Subject: [PATCH 071/412] remove redundant objects --- src/main/java/me/lemire/integercompression/Benchmark.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/Benchmark.java b/src/main/java/me/lemire/integercompression/Benchmark.java index eb0330b..a2f86a9 100644 --- a/src/main/java/me/lemire/integercompression/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/Benchmark.java @@ -35,8 +35,6 @@ private static void testCodec( int[][] data, int repeat, boolean verbose) { - DecimalFormat df = new DecimalFormat("0.00"); - DecimalFormat dfspeed = new DecimalFormat("0"); if (verbose) { System.out.println("# " + c.toString()); System.out.println("# bits per int, compress speed (mis), decompression speed (mis) "); From 441a63e1fc47d9c929e688c390ad8aac544f85b5 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 17 Sep 2013 12:58:39 +0900 Subject: [PATCH 072/412] refactor variables in testCodec() method --- .../lemire/integercompression/Benchmark.java | 58 +++++++++++-------- 1 file changed, 33 insertions(+), 25 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/Benchmark.java b/src/main/java/me/lemire/integercompression/Benchmark.java index a2f86a9..74adc82 100644 --- a/src/main/java/me/lemire/integercompression/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/Benchmark.java @@ -39,58 +39,65 @@ private static void testCodec( System.out.println("# " + c.toString()); System.out.println("# bits per int, compress speed (mis), decompression speed (mis) "); } - long bef, aft; + int N = data.length; - int totalsize = 0; - int maxlength = 0; + + int totalSize = 0; + int maxLength = 0; for (int k = 0; k < N; ++k) { - totalsize += data[k].length; - if (data[k].length > maxlength) { - maxlength = data[k].length; + totalSize += data[k].length; + if (data[k].length > maxLength) { + maxLength = data[k].length; } } - int[] buffer = new int[maxlength + 1024]; - int[] dataout = new int[4 * maxlength + 1024]; + // 4x + 1024 to account for the possibility of some negative // compression. + int[] compressBuffer = new int[4 * maxLength + 1024]; + int[] decompressBuffer = new int[maxLength + 1024]; + + // These variables hold time in microseconds (10^-6). + long compressTime = 0; + long decompressTime = 0; + int size = 0; - int comptime = 0; - long decomptime = 0; IntWrapper inpos = new IntWrapper(); IntWrapper outpos = new IntWrapper(); + for (int r = 0; r < repeat; ++r) { size = 0; for (int k = 0; k < N; ++k) { int[] backupdata = Arrays.copyOf(data[k], data[k].length); // compress data. - bef = System.nanoTime() / 1000; + long beforeCompress = System.nanoTime() / 1000; inpos.set(1); outpos.set(0); if (!(c instanceof IntegratedIntegerCODEC)) { Delta.delta(backupdata); } c.compress(backupdata, inpos, backupdata.length - inpos.get(), - dataout, outpos); - aft = System.nanoTime() / 1000; + compressBuffer, outpos); + long afterCompress = System.nanoTime() / 1000; // measure time of compression. - comptime += aft - bef; + compressTime += afterCompress - beforeCompress; final int thiscompsize = outpos.get() + 1; size += thiscompsize; // extract (uncompress) data - bef = System.nanoTime() / 1000; + long beforeDecompress = System.nanoTime() / 1000; inpos.set(0); outpos.set(1); - buffer[0] = backupdata[0]; - c.uncompress(dataout, inpos, thiscompsize - 1, buffer, outpos); + decompressBuffer[0] = backupdata[0]; + c.uncompress(compressBuffer, inpos, thiscompsize - 1, + decompressBuffer, outpos); if (!(c instanceof IntegratedIntegerCODEC)) - Delta.fastinverseDelta(buffer); - aft = System.nanoTime() / 1000; + Delta.fastinverseDelta(decompressBuffer); + long afterDecompress = System.nanoTime() / 1000; // measure time of extraction (uncompression). - decomptime += aft - bef; + decompressTime += afterDecompress - beforeDecompress; if (outpos.get() != data[k].length) throw new RuntimeException("we have a bug (diff length) " + c + " expected " + data[k].length + " got " @@ -99,20 +106,21 @@ private static void testCodec( // verify: compare original array with compressed and // uncompressed. for (int m = 0; m < outpos.get(); ++m) { - if (buffer[m] != data[k][m]) { + if (decompressBuffer[m] != data[k][m]) { throw new RuntimeException( "we have a bug (actual difference), expected " - + data[k][m] + " found " + buffer[m] + + data[k][m] + " found " + decompressBuffer[m] + " at " + m); } } } } + if (verbose) { System.out.println(String.format("\t%1$.2f\t%2$d\t%3$d", - size * 32.0 / totalsize, - totalsize * repeat / (comptime), - totalsize * repeat / (decomptime))); + size * 32.0 / totalSize, + totalSize * repeat / (compressTime), + totalSize * repeat / (decompressTime))); } } From 44101f67194bea875dbbf322005268231bb948ce Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 17 Sep 2013 14:50:59 +0900 Subject: [PATCH 073/412] add spacing --- src/main/java/me/lemire/integercompression/Benchmark.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/me/lemire/integercompression/Benchmark.java b/src/main/java/me/lemire/integercompression/Benchmark.java index 74adc82..d90e8de 100644 --- a/src/main/java/me/lemire/integercompression/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/Benchmark.java @@ -263,6 +263,7 @@ private static void test(int N, int nbr, int repeat) { System.out.println("# generating random data..."); int[][] data = generateTestData(cdg, N, nbr, sparsity); System.out.println("# generating random data... ok."); + testKamikaze(data, repeat, false); testKamikaze(data, repeat, false); testKamikaze(data, repeat, true); From d5e01df91762e8c3371008afe68f7fd936f1a311 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 17 Sep 2013 16:32:19 +0900 Subject: [PATCH 074/412] show simple name in benchmark result --- .../java/me/lemire/integercompression/BinaryPacking.java | 4 ++++ .../lemire/integercompression/IntegratedBinaryPacking.java | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/me/lemire/integercompression/BinaryPacking.java b/src/main/java/me/lemire/integercompression/BinaryPacking.java index 98d93a1..804e0b5 100644 --- a/src/main/java/me/lemire/integercompression/BinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/BinaryPacking.java @@ -67,4 +67,8 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntW inpos.set(tmpinpos); } + @Override + public String toString() { + return this.getClass().getSimpleName(); + } } diff --git a/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java b/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java index 4b058ae..4f06b61 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java @@ -75,5 +75,8 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntW inpos.set(tmpinpos); } - + @Override + public String toString() { + return this.getClass().getSimpleName(); + } } From bb8509b1e765b6db9cf6701c25145d4f57fde010 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 17 Sep 2013 16:32:51 +0900 Subject: [PATCH 075/412] write benchmark results into a CSV file. --- .gitignore | 1 + .../lemire/integercompression/Benchmark.java | 122 +++++++++++------- 2 files changed, 76 insertions(+), 47 deletions(-) diff --git a/.gitignore b/.gitignore index 43d16bc..dd87c31 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ *.class +*.csv tags target/ tmp/ diff --git a/src/main/java/me/lemire/integercompression/Benchmark.java b/src/main/java/me/lemire/integercompression/Benchmark.java index d90e8de..eb78a0f 100644 --- a/src/main/java/me/lemire/integercompression/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/Benchmark.java @@ -10,9 +10,14 @@ import com.kamikaze.pfordelta.PForDelta; import me.lemire.integercompression.synth.ClusteredDataGenerator; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintWriter; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; +import java.io.FileNotFoundException; /** * @@ -25,15 +30,19 @@ public class Benchmark { /** * Standard benchmark * + * @param csvLog Writer for CSV log. * @param c the codec * @param data arrays of input data * @param repeat How many times to repeat the test * @param verbose whether to output result on screen */ private static void testCodec( + PrintWriter csvLog, + int sparsity, IntegerCODEC c, int[][] data, - int repeat, boolean verbose) + int repeat, + boolean verbose) { if (verbose) { System.out.println("# " + c.toString()); @@ -117,10 +126,14 @@ private static void testCodec( } if (verbose) { + double bitsPerInt = size * 32.0 / totalSize; + long compressSpeed = totalSize * repeat / (compressTime); + long decompressSpeed = totalSize * repeat / (decompressTime); System.out.println(String.format("\t%1$.2f\t%2$d\t%3$d", - size * 32.0 / totalSize, - totalSize * repeat / (compressTime), - totalSize * repeat / (decompressTime))); + bitsPerInt, compressSpeed, decompressSpeed)); + csvLog.format("\"%1$s\",%2$d,%3$.2f,%4$d,%5$d\n", c.toString(), + sparsity, bitsPerInt, compressSpeed, decompressSpeed); + csvLog.flush(); } } @@ -129,13 +142,26 @@ private static void testCodec( * * @param args command-line arguments */ - public static void main(String args[]) { + public static void main(String args[]) throws Exception + { System.out.println("# benchmark based on the ClusterData model from:"); System.out.println("# Vo Ngoc Anh and Alistair Moffat. "); System.out.println("# Index compression using 64-bit words.") ; System.out.println("# Softw. Pract. Exper.40, 2 (February 2010), 131-147. "); System.out.println(); - test(20, 18, 10); + + PrintWriter writer = null; + try { + File csvFile = new File(String.format( + "benchmark-%1$tY%1$tm%1$tdT%1$tH%1$tM%1$tS.csv", + System.currentTimeMillis())); + writer = new PrintWriter(csvFile); + test(writer, 20, 18, 10); + } finally { + if (writer != null) { + writer.close(); + } + } } /** @@ -251,13 +277,15 @@ private static int[][] generateTestData( /** * Generates data and calls other tests. * + * @param csvLog Writer for CSV log. * @param N How many input arrays to generate * @param nbr how big (in log2) should the arrays be * @param repeat How many times should we repeat tests. */ - private static void test(int N, int nbr, int repeat) { + private static void test(PrintWriter csvLog, int N, int nbr, int repeat) + { ClusteredDataGenerator cdg = new ClusteredDataGenerator(); - final int max_sparsity = 31 - nbr; + final int max_sparsity = 2; for (int sparsity = 1; sparsity < max_sparsity; ++sparsity) { System.out.println("# sparsity " + sparsity); System.out.println("# generating random data..."); @@ -269,96 +297,96 @@ private static void test(int N, int nbr, int repeat) { testKamikaze(data, repeat, true); System.out.println(); - testCodec(new IntegratedComposition(new IntegratedBinaryPacking(), + testCodec(csvLog, sparsity, new IntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte()), data, repeat, false); - testCodec(new IntegratedComposition(new IntegratedBinaryPacking(), + testCodec(csvLog, sparsity, new IntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte()), data, repeat, false); - testCodec(new IntegratedComposition(new IntegratedBinaryPacking(), + testCodec(csvLog, sparsity, new IntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte()), data, repeat, true); System.out.println(); - testCodec(new JustCopy(), data, repeat, false); - testCodec(new JustCopy(), data, repeat, false); - testCodec(new JustCopy(), data, repeat, true); + testCodec(csvLog, sparsity, new JustCopy(), data, repeat, false); + testCodec(csvLog, sparsity, new JustCopy(), data, repeat, false); + testCodec(csvLog, sparsity, new JustCopy(), data, repeat, true); System.out.println(); - testCodec(new VariableByte(), data, repeat, false); - testCodec(new VariableByte(), data, repeat, false); - testCodec(new VariableByte(), data, repeat, true); + testCodec(csvLog, sparsity, new VariableByte(), data, repeat, false); + testCodec(csvLog, sparsity, new VariableByte(), data, repeat, false); + testCodec(csvLog, sparsity, new VariableByte(), data, repeat, true); System.out.println(); - testCodec(new IntegratedVariableByte(), data, repeat, false); - testCodec(new IntegratedVariableByte(), data, repeat, false); - testCodec(new IntegratedVariableByte(), data, repeat, true); + testCodec(csvLog, sparsity, new IntegratedVariableByte(), data, repeat, false); + testCodec(csvLog, sparsity, new IntegratedVariableByte(), data, repeat, false); + testCodec(csvLog, sparsity, new IntegratedVariableByte(), data, repeat, true); System.out.println(); - testCodec(new Composition(new BinaryPacking(), new VariableByte()), + testCodec(csvLog, sparsity, new Composition(new BinaryPacking(), new VariableByte()), data, repeat, false); - testCodec(new Composition(new BinaryPacking(), new VariableByte()), + testCodec(csvLog, sparsity, new Composition(new BinaryPacking(), new VariableByte()), data, repeat, false); - testCodec(new Composition(new BinaryPacking(), new VariableByte()), + testCodec(csvLog, sparsity, new Composition(new BinaryPacking(), new VariableByte()), data, repeat, true); System.out.println(); - testCodec(new Composition(new NewPFD(), new VariableByte()), data, + testCodec(csvLog, sparsity, new Composition(new NewPFD(), new VariableByte()), data, repeat, false); - testCodec(new Composition(new NewPFD(), new VariableByte()), data, + testCodec(csvLog, sparsity, new Composition(new NewPFD(), new VariableByte()), data, repeat, false); - testCodec(new Composition(new NewPFD(), new VariableByte()), data, + testCodec(csvLog, sparsity, new Composition(new NewPFD(), new VariableByte()), data, repeat, true); System.out.println(); - testCodec(new Composition(new NewPFDS9(), new VariableByte()), + testCodec(csvLog, sparsity, new Composition(new NewPFDS9(), new VariableByte()), data, repeat, false); - testCodec(new Composition(new NewPFDS9(), new VariableByte()), + testCodec(csvLog, sparsity, new Composition(new NewPFDS9(), new VariableByte()), data, repeat, false); - testCodec(new Composition(new NewPFDS9(), new VariableByte()), + testCodec(csvLog, sparsity, new Composition(new NewPFDS9(), new VariableByte()), data, repeat, true); System.out.println(); - testCodec(new Composition(new NewPFDS16(), new VariableByte()), + testCodec(csvLog, sparsity, new Composition(new NewPFDS16(), new VariableByte()), data, repeat, false); - testCodec(new Composition(new NewPFDS16(), new VariableByte()), + testCodec(csvLog, sparsity, new Composition(new NewPFDS16(), new VariableByte()), data, repeat, false); - testCodec(new Composition(new NewPFDS16(), new VariableByte()), + testCodec(csvLog, sparsity, new Composition(new NewPFDS16(), new VariableByte()), data, repeat, true); System.out.println(); - testCodec(new Composition(new OptPFD(), new VariableByte()), data, + testCodec(csvLog, sparsity, new Composition(new OptPFD(), new VariableByte()), data, repeat, false); - testCodec(new Composition(new OptPFD(), new VariableByte()), data, + testCodec(csvLog, sparsity, new Composition(new OptPFD(), new VariableByte()), data, repeat, false); - testCodec(new Composition(new OptPFD(), new VariableByte()), data, + testCodec(csvLog, sparsity, new Composition(new OptPFD(), new VariableByte()), data, repeat, true); System.out.println(); - testCodec(new Composition(new OptPFDS9(), new VariableByte()), + testCodec(csvLog, sparsity, new Composition(new OptPFDS9(), new VariableByte()), data, repeat, false); - testCodec(new Composition(new OptPFDS9(), new VariableByte()), + testCodec(csvLog, sparsity, new Composition(new OptPFDS9(), new VariableByte()), data, repeat, false); - testCodec(new Composition(new OptPFDS9(), new VariableByte()), + testCodec(csvLog, sparsity, new Composition(new OptPFDS9(), new VariableByte()), data, repeat, true); System.out.println(); - testCodec(new Composition(new OptPFDS16(), new VariableByte()), + testCodec(csvLog, sparsity, new Composition(new OptPFDS16(), new VariableByte()), data, repeat, false); - testCodec(new Composition(new OptPFDS16(), new VariableByte()), + testCodec(csvLog, sparsity, new Composition(new OptPFDS16(), new VariableByte()), data, repeat, false); - testCodec(new Composition(new OptPFDS16(), new VariableByte()), + testCodec(csvLog, sparsity, new Composition(new OptPFDS16(), new VariableByte()), data, repeat, true); System.out.println(); - testCodec(new Composition(new FastPFOR(), new VariableByte()), + testCodec(csvLog, sparsity, new Composition(new FastPFOR(), new VariableByte()), data, repeat, false); - testCodec(new Composition(new FastPFOR(), new VariableByte()), + testCodec(csvLog, sparsity, new Composition(new FastPFOR(), new VariableByte()), data, repeat, false); - testCodec(new Composition(new FastPFOR(), new VariableByte()), + testCodec(csvLog, sparsity, new Composition(new FastPFOR(), new VariableByte()), data, repeat, true); System.out.println(); - testCodec(new Simple9(), data, repeat, false); - testCodec(new Simple9(), data, repeat, false); - testCodec(new Simple9(), data, repeat, true); + testCodec(csvLog, sparsity, new Simple9(), data, repeat, false); + testCodec(csvLog, sparsity, new Simple9(), data, repeat, false); + testCodec(csvLog, sparsity, new Simple9(), data, repeat, true); System.out.println(); } } From ab41b57426c15c481230263da25e740247ac1c45 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 17 Sep 2013 16:48:28 +0900 Subject: [PATCH 076/412] fix max sparsity --- src/main/java/me/lemire/integercompression/Benchmark.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/me/lemire/integercompression/Benchmark.java b/src/main/java/me/lemire/integercompression/Benchmark.java index eb78a0f..9ba3bfe 100644 --- a/src/main/java/me/lemire/integercompression/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/Benchmark.java @@ -285,7 +285,7 @@ private static int[][] generateTestData( private static void test(PrintWriter csvLog, int N, int nbr, int repeat) { ClusteredDataGenerator cdg = new ClusteredDataGenerator(); - final int max_sparsity = 2; + final int max_sparsity = 31 - nbr; for (int sparsity = 1; sparsity < max_sparsity; ++sparsity) { System.out.println("# sparsity " + sparsity); System.out.println("# generating random data..."); From a5a1f61c1e00594ad04e069d9dedc2b440d75386 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 17 Sep 2013 17:25:13 +0900 Subject: [PATCH 077/412] add CSV header and message for CVS file --- src/main/java/me/lemire/integercompression/Benchmark.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/me/lemire/integercompression/Benchmark.java b/src/main/java/me/lemire/integercompression/Benchmark.java index 9ba3bfe..b66ff69 100644 --- a/src/main/java/me/lemire/integercompression/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/Benchmark.java @@ -156,7 +156,13 @@ public static void main(String args[]) throws Exception "benchmark-%1$tY%1$tm%1$tdT%1$tH%1$tM%1$tS.csv", System.currentTimeMillis())); writer = new PrintWriter(csvFile); + System.out.println("# Results will be written into a CSV file: " + + csvFile.getName()); + System.out.println(); test(writer, 20, 18, 10); + System.out.println(); + System.out.println("Results were written into a CSV file: " + + csvFile.getName()); } finally { if (writer != null) { writer.close(); @@ -284,6 +290,7 @@ private static int[][] generateTestData( */ private static void test(PrintWriter csvLog, int N, int nbr, int repeat) { + csvLog.format("\"Algorithm\",\"Sparsity\",\"Bits per int\",\"Compress speed (MiS)\",\"Decompress speed (MiS)\"\n"); ClusteredDataGenerator cdg = new ClusteredDataGenerator(); final int max_sparsity = 31 - nbr; for (int sparsity = 1; sparsity < max_sparsity; ++sparsity) { From 54c80b0b21483ba6964ce7e8ead55084488ec9f5 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 17 Sep 2013 19:09:39 +0900 Subject: [PATCH 078/412] implement XorBinaryPacking (with ton of bugs) --- .../integercompression/XorBinaryPacking.java | 122 ++++++++++++++++++ .../lemire/integercompression/BasicTest.java | 25 ++++ 2 files changed, 147 insertions(+) create mode 100644 src/main/java/me/lemire/integercompression/XorBinaryPacking.java diff --git a/src/main/java/me/lemire/integercompression/XorBinaryPacking.java b/src/main/java/me/lemire/integercompression/XorBinaryPacking.java new file mode 100644 index 0000000..549c756 --- /dev/null +++ b/src/main/java/me/lemire/integercompression/XorBinaryPacking.java @@ -0,0 +1,122 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + */ +package me.lemire.integercompression; + +public final class XorBinaryPacking implements IntegratedIntegerCODEC { + + public static final int BLOCK_LENGTH = 128; + + public void compress( + int[] inBuf, IntWrapper inPos, int inLen, + int[] outBuf, IntWrapper outPos) + { + inLen = inLen - inLen % BLOCK_LENGTH; + if (inLen == 0) + return; + + outBuf[outPos.get()] = inLen; + outPos.increment(); + + int context = 0; + final int[] work = new int[32]; + + int op = outPos.get(); + int ip = inPos.get(); + final int inPosLast = ip + inLen; + for (; ip < inPosLast; ip += BLOCK_LENGTH) { + final int bits1 = xorMaxBits(inBuf, ip + 0, 32, context); + final int bits2 = xorMaxBits(inBuf, ip + 32, 32, inBuf[ip + 31]); + final int bits3 = xorMaxBits(inBuf, ip + 64, 32, inBuf[ip + 63]); + final int bits4 = xorMaxBits(inBuf, ip + 96, 32, inBuf[ip + 95]); + outBuf[op++] = (bits1 << 24) | (bits2 << 16) | + (bits3 << 8) | (bits4 << 0); + op += xorPack(inBuf, ip + 0, outBuf, op, bits1, 0, work); + op += xorPack(inBuf, ip + 32, outBuf, op, bits2, inBuf[ip + 31], + work); + op += xorPack(inBuf, ip + 64, outBuf, op, bits3, inBuf[ip + 63], + work); + op += xorPack(inBuf, ip + 96, outBuf, op, bits4, inBuf[ip + 95], + work); + context = inBuf[ip + 127]; + } + + inPos.add(inLen); + outPos.set(op); + } + + public void uncompress( + int[] inBuf, IntWrapper inPos, int inLen, + int[] outBuf, IntWrapper outPos) + { + if (inLen == 0) + return; + + final int outLen = inBuf[inPos.get()]; + inPos.increment(); + + int context = 0; + final int[] work = new int[32]; + + int ip = inPos.get(); + int op = outPos.get(); + final int outPosLast = op + outLen; + for (; op < outPosLast; op += BLOCK_LENGTH) { + final int bits1 = (inBuf[ip] >>> 24); + final int bits2 = (inBuf[ip] >>> 16) & 0xFF; + final int bits3 = (inBuf[ip] >>> 8) & 0xFF; + final int bits4 = (inBuf[ip] >>> 0) & 0xFF; + ++ip; + ip += xorUnpack(inBuf, ip, outBuf, op + 0, bits1, context, work); + ip += xorUnpack(inBuf, ip, outBuf, op + 32, bits2, outBuf[op + 31], + work); + ip += xorUnpack(inBuf, ip, outBuf, op + 64, bits3, outBuf[op + 63], + work); + ip += xorUnpack(inBuf, ip, outBuf, op + 96, bits4, outBuf[op + 95], + work); + context = outBuf[op + 127]; + } + + outPos.add(outLen); + inPos.set(ip); + } + + @Override + public String toString() { + return this.getClass().getSimpleName(); + } + + public static int xorMaxBits(int[] buf, int offset, int length, + int context) + { + int mask = buf[offset] ^ context; + final int M = offset + length; + for (int i = offset + 1, prev = offset; i < M; ++i, ++prev) { + mask |= buf[i] ^ buf[prev]; + } + return 32 - Integer.numberOfLeadingZeros(mask); + } + + public static int xorPack(int[] inBuf, int inOff, + int[] outBuf, int outOff, int validBits, int context, int[] work) + { + work[0] = inBuf[inOff] ^ context; + for (int i = 1; i < 32; ++i) { + work[i] = inBuf[i] ^ inBuf[i - 1]; + } + BitPacking.fastpackwithoutmask(work, 0, outBuf, outOff, validBits); + return validBits; + } + + public static int xorUnpack(int[] inBuf, int inOff, + int[] outBuf, int outOff, int validBits, int context, int[] work) + { + BitPacking.fastunpack(inBuf, inOff, work, 0, validBits); + outBuf[outOff] = work[0] ^ context; + for (int i = 1; i < 32; ++i) { + outBuf[i] = work[i] ^ work[i - 1]; + } + return validBits; + } +} diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 3e01554..95410a8 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -16,6 +16,19 @@ public class BasicTest { + @Test + public void checkXorBinaryPacking() { + testZeroInZeroOut(new XorBinaryPacking()); + testSpurious(new XorBinaryPacking()); + IntegerCODEC c = new IntegratedComposition(new XorBinaryPacking(), + new IntegratedVariableByte()); + testZeroInZeroOut(c); + testUnsorted(c); + test(c, 5, 10); + test(c, 5, 14); + test(c, 2, 18); + } + /** * Verify bitpacking. */ @@ -181,6 +194,18 @@ private static void testZeroInZeroOut(IntegerCODEC c) { assertEquals(0, outpos.intValue()); } + private static void test(IntegerCODEC c, int N, int nbr) { + ClusteredDataGenerator cdg = new ClusteredDataGenerator(); + for (int sparsity = 1; sparsity < 31 - nbr; sparsity += 4) { + int[][] data = new int[N][]; + int max = (1 << (nbr + sparsity)); + for (int k = 0; k < N; ++k) { + data[k] = cdg.generateClustered((1 << nbr), max); + } + testCodec(c, data, max); + } + } + private static void test(int N, int nbr) { ClusteredDataGenerator cdg = new ClusteredDataGenerator(); for (int sparsity = 1; sparsity < 31 - nbr; sparsity += 4) { From 3eb72e2c9649d1b7797006c75b87bb51fd5c29ae Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 17 Sep 2013 21:50:49 +0900 Subject: [PATCH 079/412] fix a bug of XorBinaryPacking --- .../integercompression/XorBinaryPacking.java | 2 +- .../lemire/integercompression/BasicTest.java | 19 ++++++ .../lemire/integercompression/TestUtils.java | 11 ++++ .../XorBinaryPackingTest.java | 65 +++++++++++++++++++ 4 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java diff --git a/src/main/java/me/lemire/integercompression/XorBinaryPacking.java b/src/main/java/me/lemire/integercompression/XorBinaryPacking.java index 549c756..6e77f1d 100644 --- a/src/main/java/me/lemire/integercompression/XorBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/XorBinaryPacking.java @@ -115,7 +115,7 @@ public static int xorUnpack(int[] inBuf, int inOff, BitPacking.fastunpack(inBuf, inOff, work, 0, validBits); outBuf[outOff] = work[0] ^ context; for (int i = 1; i < 32; ++i) { - outBuf[i] = work[i] ^ work[i - 1]; + outBuf[i] = work[i] ^ outBuf[i - 1]; } return validBits; } diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 95410a8..c9cdd7f 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -23,7 +23,26 @@ public void checkXorBinaryPacking() { IntegerCODEC c = new IntegratedComposition(new XorBinaryPacking(), new IntegratedVariableByte()); testZeroInZeroOut(c); + } + + @Test + public void checkXorBinaryPacking1() { + IntegerCODEC c = new IntegratedComposition(new XorBinaryPacking(), + new IntegratedVariableByte()); + testZeroInZeroOut(c); + } + + @Test + public void checkXorBinaryPacking2() { + IntegerCODEC c = new IntegratedComposition(new XorBinaryPacking(), + new IntegratedVariableByte()); testUnsorted(c); + } + + @Test + public void checkXorBinaryPacking3() { + IntegerCODEC c = new IntegratedComposition(new XorBinaryPacking(), + new IntegratedVariableByte()); test(c, 5, 10); test(c, 5, 14); test(c, 2, 18); diff --git a/src/test/java/me/lemire/integercompression/TestUtils.java b/src/test/java/me/lemire/integercompression/TestUtils.java index 217a6dd..bc2f925 100644 --- a/src/test/java/me/lemire/integercompression/TestUtils.java +++ b/src/test/java/me/lemire/integercompression/TestUtils.java @@ -9,6 +9,17 @@ */ public class TestUtils { + private static void dumpIntArray(int[] data, String label) { + System.out.println(label); + for (int i = 0; i < 32; ++i) { + System.out.format(" %1$11d", data[i]); + if ((i + 1) % 6 == 0) { + System.out.println(); + } + } + System.out.println(); + } + /** * Check that compress and uncompress keep original array. * diff --git a/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java b/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java new file mode 100644 index 0000000..5018650 --- /dev/null +++ b/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java @@ -0,0 +1,65 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + */ +package me.lemire.integercompression; + +import org.junit.Test; +import static org.junit.Assert.*; + +public final class XorBinaryPackingTest +{ + @Test + public void packAndUnpack() { + int[] data = new int[] { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + }; + checkPack(data, 6, 0); + } + + public void checkPack(int[] data, int validBits, int context) { + int[] work = new int[32]; + + int[] packBuf = new int[validBits]; + int packRetval = XorBinaryPacking.xorPack(data, 0, packBuf, 0, + validBits, context, work); + assertEquals(validBits, packRetval); + + int[] unpackBuf = new int[32]; + int unpackRetval = XorBinaryPacking.xorUnpack(packBuf, 0, unpackBuf, 0, + validBits, context, work); + assertEquals(validBits, unpackRetval); + + assertArrayEquals(data, unpackBuf); + } + + @Test + public void maxBits0() { + int[] data = { 0 }; + assertEquals(0, XorBinaryPacking.xorMaxBits(data, 0, data.length, 0)); + assertEquals(1, XorBinaryPacking.xorMaxBits(data, 0, data.length, 1)); + assertEquals(2, XorBinaryPacking.xorMaxBits(data, 0, data.length, 2)); + assertEquals(2, XorBinaryPacking.xorMaxBits(data, 0, data.length, 3)); + assertEquals(3, XorBinaryPacking.xorMaxBits(data, 0, data.length, 4)); + assertEquals(3, XorBinaryPacking.xorMaxBits(data, 0, data.length, 5)); + assertEquals(3, XorBinaryPacking.xorMaxBits(data, 0, data.length, 6)); + assertEquals(3, XorBinaryPacking.xorMaxBits(data, 0, data.length, 7)); + assertEquals(4, XorBinaryPacking.xorMaxBits(data, 0, data.length, 8)); + + for (int i = 5; i <= 32; ++i) { + assertEquals(i, XorBinaryPacking.xorMaxBits(data, 0, data.length, + 1 << (i - 1))); + } + } + + @Test + public void maxBits1() { + int[] data = { 0 }; + for (int i = 1; i <= 32; ++i) { + data[0] = 1 << (i - 1); + assertEquals(i, + XorBinaryPacking.xorMaxBits(data, 0, data.length, 0)); + } + } +} From b9143befb5192665e7b5c26a172d0863c96ac4c5 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 17 Sep 2013 22:34:34 +0900 Subject: [PATCH 080/412] dubugging XorBinaryPacking --- .../integercompression/XorBinaryPacking.java | 4 +- .../lemire/integercompression/TestUtils.java | 25 ++++++++-- .../XorBinaryPackingTest.java | 46 +++++++++++++++++++ 3 files changed, 68 insertions(+), 7 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/XorBinaryPacking.java b/src/main/java/me/lemire/integercompression/XorBinaryPacking.java index 6e77f1d..66c06a5 100644 --- a/src/main/java/me/lemire/integercompression/XorBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/XorBinaryPacking.java @@ -114,8 +114,8 @@ public static int xorUnpack(int[] inBuf, int inOff, { BitPacking.fastunpack(inBuf, inOff, work, 0, validBits); outBuf[outOff] = work[0] ^ context; - for (int i = 1; i < 32; ++i) { - outBuf[i] = work[i] ^ outBuf[i - 1]; + for (int i = 1, p = outOff + 1; i < 32; ++i, ++p) { + outBuf[p] = work[i] ^ outBuf[p - 1]; } return validBits; } diff --git a/src/test/java/me/lemire/integercompression/TestUtils.java b/src/test/java/me/lemire/integercompression/TestUtils.java index bc2f925..403e868 100644 --- a/src/test/java/me/lemire/integercompression/TestUtils.java +++ b/src/test/java/me/lemire/integercompression/TestUtils.java @@ -9,13 +9,13 @@ */ public class TestUtils { - private static void dumpIntArray(int[] data, String label) { - System.out.println(label); - for (int i = 0; i < 32; ++i) { - System.out.format(" %1$11d", data[i]); - if ((i + 1) % 6 == 0) { + public static void dumpIntArray(int[] data, String label) { + System.out.print(label); + for (int i = 0; i < data.length; ++i) { + if (i % 6 == 0) { System.out.println(); } + System.out.format(" %1$11d", data[i]); } System.out.println(); } @@ -55,4 +55,19 @@ public static void assertSymmetry(IntegerCODEC codec, int... orig) { assertArrayEquals(orig, target); } + public static int[] compress(IntegerCODEC codec, int[] data) { + int[] outBuf = new int[data.length * 4]; + IntWrapper inPos = new IntWrapper(); + IntWrapper outPos = new IntWrapper(); + codec.compress(data, inPos, data.length, outBuf, outPos); + return Arrays.copyOf(outBuf, outPos.get()); + } + + public static int[] uncompress(IntegerCODEC codec, int[] data, int len) { + int[] outBuf = new int[len + 1024]; + IntWrapper inPos = new IntWrapper(); + IntWrapper outPos = new IntWrapper(); + codec.uncompress(data, inPos, data.length, outBuf, outPos); + return Arrays.copyOf(outBuf, outPos.get()); + } } diff --git a/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java b/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java index 5018650..10d5e2b 100644 --- a/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java +++ b/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java @@ -4,6 +4,8 @@ */ package me.lemire.integercompression; +import java.util.Arrays; + import org.junit.Test; import static org.junit.Assert.*; @@ -62,4 +64,48 @@ public void maxBits1() { XorBinaryPacking.xorMaxBits(data, 0, data.length, 0)); } } + + @Test + public void compressAndUncompress0() { + int[] data = new int[128]; + Arrays.fill(data, 0, 31, 1); + Arrays.fill(data, 32, 63, 2); + Arrays.fill(data, 64, 95, 4); + Arrays.fill(data, 96, 127, 8); + + XorBinaryPacking codec = new XorBinaryPacking(); + int[] compBuf = TestUtils.compress(codec, data); + TestUtils.dumpIntArray(compBuf, "compBuf0"); + int[] decompBuf = TestUtils.uncompress(codec, compBuf, data.length); + TestUtils.dumpIntArray(decompBuf, "decompBuf0"); + assertArrayEquals(data, decompBuf); + } + + @Test + public void compressAndUncompress1() { + int[] data = new int[128]; + for (int i = 0; i < data.length; ++i) { + data[i] = i; + } + + XorBinaryPacking codec = new XorBinaryPacking(); + int[] compBuf = TestUtils.compress(codec, data); + TestUtils.dumpIntArray(compBuf, "compBuf1"); + int[] decompBuf = TestUtils.uncompress(codec, compBuf, data.length); + assertArrayEquals(data, decompBuf); + } + + @Test + public void compressAndUncompress2() { + int[] data = new int[128]; + for (int i = 0; i < data.length; ++i) { + data[i] = i * (i + 1) / 2; + } + + XorBinaryPacking codec = new XorBinaryPacking(); + int[] compBuf = TestUtils.compress(codec, data); + TestUtils.dumpIntArray(compBuf, "compBuf2"); + int[] decompBuf = TestUtils.uncompress(codec, compBuf, data.length); + assertArrayEquals(data, decompBuf); + } } From 19036cb599f370a1b6360129e295249e7f954b1c Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Wed, 18 Sep 2013 00:46:14 +0900 Subject: [PATCH 081/412] more debug --- .../integercompression/XorBinaryPacking.java | 2 ++ .../integercompression/XorBinaryPackingTest.java | 15 ++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/me/lemire/integercompression/XorBinaryPacking.java b/src/main/java/me/lemire/integercompression/XorBinaryPacking.java index 66c06a5..55f55f1 100644 --- a/src/main/java/me/lemire/integercompression/XorBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/XorBinaryPacking.java @@ -30,6 +30,7 @@ public void compress( final int bits2 = xorMaxBits(inBuf, ip + 32, 32, inBuf[ip + 31]); final int bits3 = xorMaxBits(inBuf, ip + 64, 32, inBuf[ip + 63]); final int bits4 = xorMaxBits(inBuf, ip + 96, 32, inBuf[ip + 95]); + //System.out.format("compress bits: %d %d %d %d\n", bits1, bits2, bits3, bits4); outBuf[op++] = (bits1 << 24) | (bits2 << 16) | (bits3 << 8) | (bits4 << 0); op += xorPack(inBuf, ip + 0, outBuf, op, bits1, 0, work); @@ -67,6 +68,7 @@ public void uncompress( final int bits2 = (inBuf[ip] >>> 16) & 0xFF; final int bits3 = (inBuf[ip] >>> 8) & 0xFF; final int bits4 = (inBuf[ip] >>> 0) & 0xFF; + //System.out.format("uncompress bits: %d %d %d %d\n", bits1, bits2, bits3, bits4); ++ip; ip += xorUnpack(inBuf, ip, outBuf, op + 0, bits1, context, work); ip += xorUnpack(inBuf, ip, outBuf, op + 32, bits2, outBuf[op + 31], diff --git a/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java b/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java index 10d5e2b..388dd79 100644 --- a/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java +++ b/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java @@ -12,7 +12,7 @@ public final class XorBinaryPackingTest { @Test - public void packAndUnpack() { + public void packAndUnpack0() { int[] data = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, @@ -20,6 +20,19 @@ public void packAndUnpack() { checkPack(data, 6, 0); } + @Test + public void packAndUnpack1() { + int[] data = new int[32]; + Arrays.fill(data, 1); + checkPack(data, 1, 0); + Arrays.fill(data, 2); + checkPack(data, 2, 1); + Arrays.fill(data, 4); + checkPack(data, 3, 2); + Arrays.fill(data, 8); + checkPack(data, 4, 4); + } + public void checkPack(int[] data, int validBits, int context) { int[] work = new int[32]; From 5f0d688e5a868d8cc97dfd929eae83062af414bc Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 17 Sep 2013 12:01:15 -0400 Subject: [PATCH 082/412] Minor reformatting --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index fb646d3..556f2d1 100644 --- a/README.md +++ b/README.md @@ -57,11 +57,11 @@ Authors ------- Main contributors -Daniel Lemire, http://lemire.me/en/ -Muraoka Taro, https://github.com/koron +* Daniel Lemire, http://lemire.me/en/ +* Muraoka Taro, https://github.com/koron with contributions by -Di Wu, http://www.facebook.com/diwu1989 +* Di Wu, http://www.facebook.com/diwu1989 How does it compare to the Kamikaze PForDelta library? From 65231d25639d71399ba008c9b9509a26a781e42e Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Wed, 18 Sep 2013 01:25:16 +0900 Subject: [PATCH 083/412] fix a bug --- .../integercompression/XorBinaryPacking.java | 12 +++++- .../lemire/integercompression/BasicTest.java | 3 -- .../lemire/integercompression/TestUtils.java | 11 +++++ .../XorBinaryPackingTest.java | 43 +++++++++++-------- 4 files changed, 46 insertions(+), 23 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/XorBinaryPacking.java b/src/main/java/me/lemire/integercompression/XorBinaryPacking.java index 55f55f1..f1e538a 100644 --- a/src/main/java/me/lemire/integercompression/XorBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/XorBinaryPacking.java @@ -104,21 +104,29 @@ public static int xorPack(int[] inBuf, int inOff, int[] outBuf, int outOff, int validBits, int context, int[] work) { work[0] = inBuf[inOff] ^ context; - for (int i = 1; i < 32; ++i) { - work[i] = inBuf[i] ^ inBuf[i - 1]; + for (int i = 1, p = inOff + 1; i < 32; ++i, ++p) { + work[i] = inBuf[p] ^ inBuf[p - 1]; } BitPacking.fastpackwithoutmask(work, 0, outBuf, outOff, validBits); return validBits; + //for (int i = 0; i < 32; ++i) { + // outBuf[outOff + i] = work[i]; + //} + //return 32; } public static int xorUnpack(int[] inBuf, int inOff, int[] outBuf, int outOff, int validBits, int context, int[] work) { BitPacking.fastunpack(inBuf, inOff, work, 0, validBits); + //for (int i = 0; i < 32; ++i) { + // work[i] = inBuf[inOff + i]; + //} outBuf[outOff] = work[0] ^ context; for (int i = 1, p = outOff + 1; i < 32; ++i, ++p) { outBuf[p] = work[i] ^ outBuf[p - 1]; } return validBits; + //return 32; } } diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index c9cdd7f..2ff17ec 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -20,9 +20,6 @@ public class BasicTest public void checkXorBinaryPacking() { testZeroInZeroOut(new XorBinaryPacking()); testSpurious(new XorBinaryPacking()); - IntegerCODEC c = new IntegratedComposition(new XorBinaryPacking(), - new IntegratedVariableByte()); - testZeroInZeroOut(c); } @Test diff --git a/src/test/java/me/lemire/integercompression/TestUtils.java b/src/test/java/me/lemire/integercompression/TestUtils.java index 403e868..2381add 100644 --- a/src/test/java/me/lemire/integercompression/TestUtils.java +++ b/src/test/java/me/lemire/integercompression/TestUtils.java @@ -20,6 +20,17 @@ public static void dumpIntArray(int[] data, String label) { System.out.println(); } + public static void dumpIntArrayAsHex(int[] data, String label) { + System.out.print(label); + for (int i = 0; i < data.length; ++i) { + if (i % 8 == 0) { + System.out.println(); + } + System.out.format(" %1$8X", data[i]); + } + System.out.println(); + } + /** * Check that compress and uncompress keep original array. * diff --git a/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java b/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java index 388dd79..2e4d05e 100644 --- a/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java +++ b/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java @@ -78,6 +78,13 @@ public void maxBits1() { } } + public static void checkCompressAndUncompress(String label, int[] data) { + XorBinaryPacking codec = new XorBinaryPacking(); + int[] compBuf = TestUtils.compress(codec, data); + int[] decompBuf = TestUtils.uncompress(codec, compBuf, data.length); + assertArrayEquals(data, decompBuf); + } + @Test public void compressAndUncompress0() { int[] data = new int[128]; @@ -85,13 +92,7 @@ public void compressAndUncompress0() { Arrays.fill(data, 32, 63, 2); Arrays.fill(data, 64, 95, 4); Arrays.fill(data, 96, 127, 8); - - XorBinaryPacking codec = new XorBinaryPacking(); - int[] compBuf = TestUtils.compress(codec, data); - TestUtils.dumpIntArray(compBuf, "compBuf0"); - int[] decompBuf = TestUtils.uncompress(codec, compBuf, data.length); - TestUtils.dumpIntArray(decompBuf, "decompBuf0"); - assertArrayEquals(data, decompBuf); + checkCompressAndUncompress("compressAndUncompress0", data); } @Test @@ -100,12 +101,7 @@ public void compressAndUncompress1() { for (int i = 0; i < data.length; ++i) { data[i] = i; } - - XorBinaryPacking codec = new XorBinaryPacking(); - int[] compBuf = TestUtils.compress(codec, data); - TestUtils.dumpIntArray(compBuf, "compBuf1"); - int[] decompBuf = TestUtils.uncompress(codec, compBuf, data.length); - assertArrayEquals(data, decompBuf); + checkCompressAndUncompress("compressAndUncompress1", data); } @Test @@ -114,11 +110,22 @@ public void compressAndUncompress2() { for (int i = 0; i < data.length; ++i) { data[i] = i * (i + 1) / 2; } + checkCompressAndUncompress("compressAndUncompress2", data); + } - XorBinaryPacking codec = new XorBinaryPacking(); - int[] compBuf = TestUtils.compress(codec, data); - TestUtils.dumpIntArray(compBuf, "compBuf2"); - int[] decompBuf = TestUtils.uncompress(codec, compBuf, data.length); - assertArrayEquals(data, decompBuf); + @Test + public void compressAndUncompress3() { + int[] data = new int[256]; + Arrays.fill(data, 0, 127, 2); + Arrays.fill(data, 128, 255, 3); + checkCompressAndUncompress("compressAndUncompress3", data); + } + + @Test + public void compressAndUncompress4() { + int[] data = new int[256]; + Arrays.fill(data, 0, 127, 3); + Arrays.fill(data, 128, 255, 2); + checkCompressAndUncompress("compressAndUncompress4", data); } } From 4ae77e816e50807d444e97fb3171fca946a4823c Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 17 Sep 2013 14:29:20 -0400 Subject: [PATCH 084/412] Adding one more scheme... plus some minor improvments to documentation. --- .../lemire/integercompression/Benchmark.java | 26 +- .../me/lemire/integercompression/Delta.java | 73 ++++- .../lemire/integercompression/FastPFOR.java | 4 +- .../IntegratedBinaryPacking.java | 5 + .../IntegratedFastPFOR.java | 277 ++++++++++++++++++ .../me/lemire/integercompression/NewPFD.java | 4 +- .../lemire/integercompression/NewPFDS16.java | 4 +- .../lemire/integercompression/NewPFDS9.java | 4 +- .../lemire/integercompression/OptPFDS9.java | 2 + .../synth/ClusteredDataGenerator.java | 13 +- .../synth/UniformDataGenerator.java | 1 - .../lemire/integercompression/BasicTest.java | 23 +- .../integercompression/BoundaryTest.java | 12 +- 13 files changed, 423 insertions(+), 25 deletions(-) create mode 100644 src/main/java/me/lemire/integercompression/IntegratedFastPFOR.java diff --git a/src/main/java/me/lemire/integercompression/Benchmark.java b/src/main/java/me/lemire/integercompression/Benchmark.java index 25c7bff..cecd8ce 100644 --- a/src/main/java/me/lemire/integercompression/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/Benchmark.java @@ -232,7 +232,7 @@ private static void test(int N, int nbr, int repeat) { testKamikaze(data, repeat, false); testKamikaze(data, repeat, true); System.out.println(); - + testCodec(new IntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte()), data, repeat, false); testCodec(new IntegratedComposition(new IntegratedBinaryPacking(), @@ -315,13 +315,23 @@ private static void test(int N, int nbr, int repeat) { repeat, true); System.out.println(); - testCodec(new Composition(new FastPFOR(), new VariableByte()), - data, repeat, false); - testCodec(new Composition(new FastPFOR(), new VariableByte()), - data, repeat, false); - testCodec(new Composition(new FastPFOR(), new VariableByte()), - data, repeat, true); - System.out.println(); + + testCodec(new IntegratedComposition(new IntegratedFastPFOR(), + new IntegratedVariableByte()), data, repeat, false); + testCodec(new IntegratedComposition(new IntegratedFastPFOR(), + new IntegratedVariableByte()), data, repeat, false); + testCodec(new IntegratedComposition(new IntegratedFastPFOR(), + new IntegratedVariableByte()), data, repeat, true); + System.out.println(); + + testCodec(new Composition(new FastPFOR(), new VariableByte()), + data, repeat, false); + testCodec(new Composition(new FastPFOR(), new VariableByte()), + data, repeat, false); + testCodec(new Composition(new FastPFOR(), new VariableByte()), + data, repeat, true); + System.out.println(); + testCodec(new Simple9(), data, repeat, false); testCodec(new Simple9(), data, repeat, false); diff --git a/src/main/java/me/lemire/integercompression/Delta.java b/src/main/java/me/lemire/integercompression/Delta.java index 372da82..877a817 100644 --- a/src/main/java/me/lemire/integercompression/Delta.java +++ b/src/main/java/me/lemire/integercompression/Delta.java @@ -13,7 +13,7 @@ * @author Daniel Lemire * */ -public class Delta { +public final class Delta { /** * Apply differential coding (in-place). @@ -25,7 +25,42 @@ public static void delta(int[] data) { data[i] -= data[i - 1]; } } + /** + * Apply differential coding (in-place) given an initial value. + * + * @param data data to be modified + * @param start starting index + * @param length number of integers to process + * @param init initial value + * @return next initial vale + */ + public static int delta(int[] data, int start, int length, int init) { + final int nextinit = data[start + length - 1]; + for (int i = length - 1; i > 0; --i) { + data[start + i] -= data[start + i - 1]; + } + data[start] -= init; + return nextinit; + } + /** + * Compute differential coding given an initial value. + * Output is written to a provided array: must have length "length" or better. + * + * @param data data to be modified + * @param start starting index + * @param length number of integers to process + * @param init initial value + * @param out output array + * @return next initial vale + */ + public static int delta(int[] data, int start, int length, int init, int[] out) { + for (int i = length - 1; i > 0; --i) { + out[i] = data[start + i] - data[start + i - 1]; + } + out[0] = data[start] - init; + return data[start + length - 1]; + } /** * Undo differential coding (in-place). Effectively * computes a prefix sum. @@ -39,6 +74,8 @@ public static void inverseDelta(int[] data) { } /** + * Undo differential coding (in-place). Effectively + * computes a prefix sum. * Like inverseDelta, only faster. * * @param data to be modified @@ -60,4 +97,38 @@ public static void fastinverseDelta(int[] data) { data[i] += data[i - 1]; } } + + + /** + * Undo differential coding (in-place). Effectively + * computes a prefix sum. + * Like inverseDelta, only faster. + * Uses an initial value. + * + * @param data to be modified + * @param start starting index + * @param length number of integers to process + * @param init initial value + * @return next initial value + */ + public static int fastinverseDelta(int[] data, int start, int length, int init) { + data[start] += init; + int sz0 = length / 4 * 4; + int i = 1; + if (sz0 >= 4) { + int a = data[start]; + for (; i < sz0 - 4; i += 4) { + a = data[start + i] += a; + a = data[start + i + 1] += a; + a = data[start + i + 2] += a; + a = data[start + i + 3] += a; + } + } + + for (; i != length; ++i) { + data[start + i] += data[start + i - 1]; + } + return data[start + length - 1]; + } + } diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index e0f7da1..2cfad7e 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -10,7 +10,7 @@ import java.util.Arrays; /** - * This is a new PFOR Scheme designed by D. Lemire called FastPFOR. + * This is a PFOR Scheme designed by D. Lemire called FastPFOR. *

* For details, please see *

@@ -21,6 +21,8 @@ *

* For sufficiently compressible arrays, it is faster and better than other PFOR * schemes. + * + * For multi-threaded applications, each thread should use its own FastPFOR object. * * @author Daniel Lemire */ diff --git a/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java b/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java index 4b058ae..21471c0 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java @@ -76,4 +76,9 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntW } + @Override + public String toString() { + return this.getClass().getSimpleName(); + } + } diff --git a/src/main/java/me/lemire/integercompression/IntegratedFastPFOR.java b/src/main/java/me/lemire/integercompression/IntegratedFastPFOR.java new file mode 100644 index 0000000..5fe0277 --- /dev/null +++ b/src/main/java/me/lemire/integercompression/IntegratedFastPFOR.java @@ -0,0 +1,277 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ +package me.lemire.integercompression; + +import java.nio.ByteBuffer; +import java.util.Arrays; + +/** + *

This is an integrated version of FastPFOR meaning that it computes differential coding + * as part of the compression.

+ * + *

For details, please see + *

+ *

+ * Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second through vectorization + * Software: Practice & Experience + * http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract + * http://arxiv.org/abs/1209.2137 + *

+ *

For multi-threaded applications, each thread should use its own IntegratedFastPFOR object.

+ * + * @author Daniel Lemire + */ +public final class IntegratedFastPFOR implements IntegratedIntegerCODEC { + final static int BLOCK_SIZE = 128; + final static int OVERHEAD_OF_EACH_EXCEPT = 8; + final static int DEFAULT_PAGE_SIZE = 65536; + + int pageSize; + final int[] buffer = new int[BLOCK_SIZE]; + final int[][] dataTobePacked = new int[32][]; + final ByteBuffer byteContainer; + + // Working area for compress and uncompress. + int[] dataPointers; + int[] freqs; + byte[] bestbbestcexceptmaxb; + + /** + * Construct the FastPFOR CODEC. + * @param pagesize the desired page size (for expert use) + */ + public IntegratedFastPFOR(int pagesize) { + pageSize = pagesize; + // Initiate arrrays. + byteContainer = ByteBuffer.allocateDirect(3 * pageSize / BLOCK_SIZE + + pageSize); + for (int k = 1; k < 32; ++k) + dataTobePacked[k] = new int[pageSize / 32 * 4]; // heuristic + } + + /** + * Construct the fastPFOR CODEC with default parameters. + */ + public IntegratedFastPFOR() { + this(DEFAULT_PAGE_SIZE); + } + + /** + * Compress data in blocks of 128 integers (if fewer than 128 integers are + * provided, nothing is done). + * + * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) + */ + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + inlength = Util.floorBy(inlength, 128); + if (inlength == 0) return; + + out[outpos.get()] = inlength; + outpos.increment(); + IntWrapper initoffset = new IntWrapper(0); + + + // Allocate memory for working area. + dataPointers = new int[33]; + freqs = new int[33]; + bestbbestcexceptmaxb = new byte[3]; + + final int finalinpos = inpos.get() + inlength; + while (inpos.get() != finalinpos) { + int thissize = Math.min(pageSize, finalinpos - inpos.get()); + encodePage(in, inpos, thissize, out, outpos,initoffset); + } + + dataPointers = null; + freqs = null; + bestbbestcexceptmaxb = null; + } + + private void getBestBFromData(int[] in, int pos) { + Arrays.fill(freqs, 0); + for (int k = pos, k_end = pos + BLOCK_SIZE; k < k_end; ++k) { + freqs[Util.bits(in[k])]++; + } + bestbbestcexceptmaxb[0] = 32; + while (freqs[bestbbestcexceptmaxb[0]] == 0) + bestbbestcexceptmaxb[0]--; + bestbbestcexceptmaxb[2] = bestbbestcexceptmaxb[0]; + int bestcost = bestbbestcexceptmaxb[0] * BLOCK_SIZE; + byte cexcept = 0; + bestbbestcexceptmaxb[1] = cexcept; + for (int b = bestbbestcexceptmaxb[0] - 1; b >= 0; --b) { + cexcept += freqs[b + 1]; + if (cexcept < 0) + break; + // the extra 8 is the cost of storing maxbits + int thiscost = cexcept * OVERHEAD_OF_EACH_EXCEPT + cexcept + * (bestbbestcexceptmaxb[2] - b) + b * BLOCK_SIZE + 8; + if (thiscost < bestcost) { + bestcost = thiscost; + bestbbestcexceptmaxb[0] = (byte) b; + bestbbestcexceptmaxb[1] = cexcept; + } + } + } + + private void encodePage(int[] constin, IntWrapper constinpos, int thissize, + int[] out, IntWrapper outpos,IntWrapper initoffset) { + final int headerpos = outpos.get(); + outpos.increment(); + int tmpoutpos = outpos.get(); + + // Clear working area. + Arrays.fill(dataPointers, 0); + //Arrays.fill(bestbbestcexceptmaxb, (byte)0);//DL:unncessary + byteContainer.clear(); + + int tmpconstinpos = constinpos.get(); + for (final int finalconstinpos = tmpconstinpos + thissize - BLOCK_SIZE; tmpconstinpos <= finalconstinpos; tmpconstinpos += BLOCK_SIZE) { + initoffset.set(Delta.delta(constin, tmpconstinpos, + BLOCK_SIZE, initoffset.intValue(), buffer)); + getBestBFromData(buffer, 0); + final int tmpbestb = bestbbestcexceptmaxb[0]; + byteContainer.put(bestbbestcexceptmaxb[0]); + byteContainer.put(bestbbestcexceptmaxb[1]); + + if (bestbbestcexceptmaxb[1] > 0) { + byteContainer.put(bestbbestcexceptmaxb[2]); + final int index = bestbbestcexceptmaxb[2] + - bestbbestcexceptmaxb[0]; + if (dataPointers[index] + bestbbestcexceptmaxb[1] >= dataTobePacked[index].length) { + int newsize = 2 * (dataPointers[index] + bestbbestcexceptmaxb[1]); + // make sure it is a multiple of 32 + newsize = Util.floorBy(newsize + 31, 32); + dataTobePacked[index] = Arrays.copyOf( + dataTobePacked[index], newsize); + } + for (int k = 0; k < BLOCK_SIZE; ++k) { + if ((buffer[k] >>> bestbbestcexceptmaxb[0]) != 0) { + // we have an exception + byteContainer.put((byte) k); + dataTobePacked[index][dataPointers[index]++] = buffer[k] >>> tmpbestb; + } + } + + } + for (int k = 0; k < 128; k += 32) { + BitPacking.fastpack(buffer, k, out, tmpoutpos, tmpbestb); + tmpoutpos += tmpbestb; + } + } + constinpos.set(tmpconstinpos); + out[headerpos] = tmpoutpos - headerpos; + while ((byteContainer.position() & 3) != 0) + byteContainer.put((byte) 0); + final int bytesize = byteContainer.position(); + out[tmpoutpos++] = bytesize; + final int howmanyints = bytesize / 4; + byteContainer.flip(); + byteContainer.asIntBuffer().get(out, tmpoutpos, howmanyints); + tmpoutpos += howmanyints; + int bitmap = 0; + for (int k = 1; k <= 32; ++k) { + if (dataPointers[k] != 0) + bitmap |= (1 << (k - 1)); + } + out[tmpoutpos++] = bitmap; + for (int k = 1; k <= 31; ++k) { + if (dataPointers[k] != 0) { + out[tmpoutpos++] = dataPointers[k];// size + for (int j = 0; j < dataPointers[k]; j += 32) { + BitPacking.fastpack(dataTobePacked[k], j, out, tmpoutpos, k); + tmpoutpos += k; + } + } + } + outpos.set(tmpoutpos); + } + + /** + * Uncompress data in blocks of 128 integers. In this + * particular case, the inlength parameter is ignored: + * it is deduced from the compressed data. + * + * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) + */ + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + if (inlength == 0) return; + + int mynvalue = in[inpos.get()]; + inpos.increment(); + + dataPointers = new int[33]; + IntWrapper initoffset = new IntWrapper(0); + + int finalout = outpos.get() + mynvalue; + while (outpos.get() != finalout) { + int thissize = Math.min(pageSize, finalout - outpos.get()); + decodePage(in, inpos, out, outpos, thissize,initoffset); + } + + dataPointers = null; + } + + private void decodePage(int[] in, IntWrapper inpos, int[] out, + IntWrapper outpos, int thissize,IntWrapper initoffset) { + final int initpos = inpos.get(); + final int wheremeta = in[inpos.get()]; + inpos.increment(); + int inexcept = initpos + wheremeta; + final int bytesize = in[inexcept++]; + byteContainer.clear(); + byteContainer.asIntBuffer().put(in, inexcept, bytesize / 4); + inexcept += bytesize / 4; + + final int bitmap = in[inexcept++]; + for (int k = 1; k <= 31; ++k) { + if ((bitmap & (1 << (k - 1))) != 0) { + int size = in[inexcept++]; + if (dataTobePacked[k].length < size) + dataTobePacked[k] = new int[Util.floorBy(size + 31, 32)]; + for (int j = 0; j < size; j += 32) { + BitPacking + .fastunpack(in, inexcept, dataTobePacked[k], j, k); + inexcept += k; + } + } + } + Arrays.fill(dataPointers, 0); + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); + + for (int run = 0, run_end = thissize / BLOCK_SIZE; run < run_end; ++run, tmpoutpos += BLOCK_SIZE) { + final byte b = byteContainer.get(); + final byte cexcept = byteContainer.get(); + for (int k = 0; k < 128; k += 32) { + BitPacking.fastunpack(in, tmpinpos, out, tmpoutpos + k, b); + tmpinpos += b; + } + if (cexcept > 0) { + final byte maxbits = byteContainer.get(); + final int index = maxbits - b; + for (int k = 0; k < cexcept; ++k) { + final byte pos = byteContainer.get(); + final int exceptvalue = dataTobePacked[index][dataPointers[index]++]; + out[pos + tmpoutpos] |= exceptvalue << b; + } + } + initoffset.set(Delta.fastinverseDelta(out,tmpoutpos,BLOCK_SIZE, initoffset.intValue())); + } + outpos.set(tmpoutpos); + inpos.set(inexcept); + } + + @Override + public String toString() { + return this.getClass().getSimpleName(); + } +} diff --git a/src/main/java/me/lemire/integercompression/NewPFD.java b/src/main/java/me/lemire/integercompression/NewPFD.java index d6cae1f..2dd9402 100644 --- a/src/main/java/me/lemire/integercompression/NewPFD.java +++ b/src/main/java/me/lemire/integercompression/NewPFD.java @@ -8,7 +8,7 @@ package me.lemire.integercompression; /** - * NewPFD/NewPFOR implemented by Daniel Lemire + * NewPFD/NewPFOR *

* Follows: *

@@ -16,6 +16,8 @@ * with optimized document ordering, in: WWW �09, 2009, pp. 401�410. *

* using Simple16 as the secondary coder. + * + * For multi-threaded applications, each thread should use its own NewPFD object. * * @author Daniel Lemire */ diff --git a/src/main/java/me/lemire/integercompression/NewPFDS16.java b/src/main/java/me/lemire/integercompression/NewPFDS16.java index 73f4e31..82ce7f5 100644 --- a/src/main/java/me/lemire/integercompression/NewPFDS16.java +++ b/src/main/java/me/lemire/integercompression/NewPFDS16.java @@ -8,7 +8,7 @@ package me.lemire.integercompression; /** - * NewPFD/NewPFOR implemented by Daniel Lemire + * NewPFD/NewPFOR *

* Follows: *

@@ -16,6 +16,8 @@ * with optimized document ordering, in: WWW 09, 2009, pp. 401-410. *

* using Simple16 as the secondary coder. + * + * For multi-threaded applications, each thread should use its own NewPFDS16 object. * * @author Daniel Lemire */ diff --git a/src/main/java/me/lemire/integercompression/NewPFDS9.java b/src/main/java/me/lemire/integercompression/NewPFDS9.java index 5465d27..00f0ae2 100644 --- a/src/main/java/me/lemire/integercompression/NewPFDS9.java +++ b/src/main/java/me/lemire/integercompression/NewPFDS9.java @@ -8,7 +8,7 @@ package me.lemire.integercompression; /** - * NewPFD/NewPFOR implemented by Daniel Lemire + * NewPFD/NewPFOR *

* Follows: *

@@ -16,6 +16,8 @@ * with optimized document ordering, in: WWW 09, 2009, pp. 401-410. *

* using Simple9 as the secondary coder. + * + * For multi-threaded applications, each thread should use its own NewPFDS9 object. * * @author Daniel Lemire */ diff --git a/src/main/java/me/lemire/integercompression/OptPFDS9.java b/src/main/java/me/lemire/integercompression/OptPFDS9.java index 22faf7e..e25aa5b 100644 --- a/src/main/java/me/lemire/integercompression/OptPFDS9.java +++ b/src/main/java/me/lemire/integercompression/OptPFDS9.java @@ -17,6 +17,8 @@ *

* using Simple9 as the secondary coder. * + * For multi-threaded applications, each thread should use its own OptPFDS9 object. + * * @author Daniel Lemire */ public final class OptPFDS9 implements IntegerCODEC { diff --git a/src/main/java/me/lemire/integercompression/synth/ClusteredDataGenerator.java b/src/main/java/me/lemire/integercompression/synth/ClusteredDataGenerator.java index c1293a5..1c48da9 100644 --- a/src/main/java/me/lemire/integercompression/synth/ClusteredDataGenerator.java +++ b/src/main/java/me/lemire/integercompression/synth/ClusteredDataGenerator.java @@ -19,6 +19,9 @@ public class ClusteredDataGenerator { UniformDataGenerator unidg = new UniformDataGenerator(); + /** + * Creating random array generator. + */ public ClusteredDataGenerator() { } @@ -56,6 +59,9 @@ void fillClustered(int[] array, int offset, int length, int Min, int Max) { /** * generates randomly N distinct integers from 0 to Max. + * @param N number of integers to generate + * @param Max maximal value of the integers + * @return array containing the integers */ public int[] generateClustered(int N, int Max) { int[] array = new int[N]; @@ -63,7 +69,12 @@ public int[] generateClustered(int N, int Max) { return array; } - public static void main(String[] args) { + /** + * Little test program. + * + * @param args arguments are ignored + */ + public static void main(final String[] args) { int[] example = (new ClusteredDataGenerator()).generateClustered(20, 1000); for (int k = 0; k < example.length; ++k) System.out.println(example[k]); diff --git a/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java b/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java index f93e2b5..5fde6f0 100644 --- a/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java +++ b/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java @@ -11,7 +11,6 @@ import java.util.HashSet; import java.util.Iterator; import java.util.Random; -import java.util.TreeSet; /** * This class will generate "uniform" lists of random integers. diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index afb47b3..b9d412b 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -15,12 +15,12 @@ * @author Daniel Lemire * */ +@SuppressWarnings({"static-method","javadoc"}) public class BasicTest { /** * Verify bitpacking */ - @SuppressWarnings("static-method") @Test public void verify() { System.out.println("Checking the code..."); @@ -48,7 +48,6 @@ public void verify() { /** * Verify bitpacking without mask */ - @SuppressWarnings("static-method") @Test public void verifyWithoutMask() { System.out.println("Checking the code..."); @@ -76,7 +75,6 @@ public void verifyWithoutMask() { /** * Verify bitpacking with exception */ - @SuppressWarnings("static-method") @Test public void verifyWithExceptions() { System.out.println("Checking the code..."); @@ -110,7 +108,6 @@ public void verifyWithExceptions() { /** * check that the codecs can be inverted. */ - @SuppressWarnings("static-method") @Test public void basictest() { test(5, 10); @@ -120,10 +117,10 @@ public void basictest() { /** * check that there is no spurious output. */ - @SuppressWarnings("static-method") @Test public void spuriousouttest() { testSpurious(new IntegratedBinaryPacking()); + testSpurious(new IntegratedFastPFOR()); testSpurious(new BinaryPacking()); testSpurious(new NewPFD()); testSpurious(new NewPFDS9()); @@ -138,11 +135,11 @@ public void spuriousouttest() { * check that an empty array generates an empty array * after compression. */ - @SuppressWarnings("static-method") @Test public void zeroinzerouttest() { testZeroInZeroOut(new IntegratedBinaryPacking()); testZeroInZeroOut(new IntegratedVariableByte()); + testZeroInZeroOut(new IntegratedFastPFOR()); testZeroInZeroOut(new BinaryPacking()); testZeroInZeroOut(new NewPFD()); testZeroInZeroOut(new NewPFDS9()); @@ -153,6 +150,7 @@ public void zeroinzerouttest() { testZeroInZeroOut(new FastPFOR()); testZeroInZeroOut(new VariableByte()); testZeroInZeroOut(new Composition(new IntegratedBinaryPacking(), new VariableByte())); + testZeroInZeroOut(new Composition(new IntegratedFastPFOR(), new VariableByte())); testZeroInZeroOut(new Composition(new BinaryPacking(), new VariableByte())); testZeroInZeroOut(new Composition(new NewPFD(), new VariableByte())); testZeroInZeroOut(new Composition(new NewPFDS9(), new VariableByte())); @@ -164,6 +162,8 @@ public void zeroinzerouttest() { testZeroInZeroOut(new IntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte())); + testZeroInZeroOut(new IntegratedComposition(new IntegratedFastPFOR(), + new IntegratedVariableByte())); } @@ -201,7 +201,8 @@ private static void test(int N, int nbr) { for (int k = 0; k < N; ++k) { data[k] = cdg.generateClustered((1 << nbr), Max); } - + testCodec(new IntegratedComposition(new IntegratedFastPFOR(), + new IntegratedVariableByte()), data, Max); testCodec(new IntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte()), data, Max); testCodec(new JustCopy(), data, Max); @@ -263,7 +264,9 @@ private static void testCodec(IntegerCODEC c, int[][] data, int Max) { + outpos.get()); for (int m = 0; m < outpos.get(); ++m) if (buffer[m] != data[k][m]) { - throw new RuntimeException( + System.out.println(Arrays.toString(buffer)); + System.out.println(Arrays.toString(data[k])); + throw new RuntimeException( "we have a bug (actual difference), expected " + data[k][m] + " found " + buffer[m] + " at " + m); @@ -275,7 +278,6 @@ private static void testCodec(IntegerCODEC c, int[][] data, int Max) { /** * Test */ - @SuppressWarnings("static-method") @Test public void testUnsortedExample() { @@ -293,6 +295,9 @@ public void testUnsortedExample() { testUnsorted(new IntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte())); testUnsorted(new Composition(new IntegratedBinaryPacking(), new VariableByte())); + testUnsorted(new IntegratedComposition(new IntegratedFastPFOR(), + new IntegratedVariableByte())); + testUnsorted(new Composition(new IntegratedFastPFOR(), new VariableByte())); } diff --git a/src/test/java/me/lemire/integercompression/BoundaryTest.java b/src/test/java/me/lemire/integercompression/BoundaryTest.java index f8539d8..f68ae36 100644 --- a/src/test/java/me/lemire/integercompression/BoundaryTest.java +++ b/src/test/java/me/lemire/integercompression/BoundaryTest.java @@ -5,6 +5,7 @@ import org.junit.Test; import static org.junit.Assert.*; +@SuppressWarnings({ "static-method", "javadoc" }) public class BoundaryTest { private static void compressAndUncompress(int length, IntegerCODEC c) { @@ -30,6 +31,11 @@ private static void compressAndUncompress(int length, IntegerCODEC c) { // Compare between uncompressed and original arrays. int[] target = Arrays.copyOf(uncompressed, u_outpos.get()); + if(!Arrays.equals(source, target)) { + System.out.println("problem with length = "+length+" and "+c); + System.out.println(Arrays.toString(source)); + System.out.println(Arrays.toString(target)); + } assertArrayEquals(source, target); } @@ -56,9 +62,13 @@ public void testIntegratedComposition() throws Exception { new IntegratedBinaryPacking(), new IntegratedVariableByte()); testBoundary(c); + IntegratedComposition c2 = new IntegratedComposition( + new IntegratedFastPFOR(), + new IntegratedVariableByte()); + testBoundary(c2); } - @Test + @Test public void testComposition() throws Exception { Composition c = new Composition( new BinaryPacking(), From 1c041a947c99dfa010a25c2fd352ffb17ccd966d Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Wed, 18 Sep 2013 09:48:31 +0900 Subject: [PATCH 085/412] fix almost bugs in XorBinaryPacking --- .../integercompression/XorBinaryPacking.java | 35 ++++++++++++------- .../lemire/integercompression/TestUtils.java | 2 +- .../XorBinaryPackingTest.java | 12 +++++++ 3 files changed, 36 insertions(+), 13 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/XorBinaryPacking.java b/src/main/java/me/lemire/integercompression/XorBinaryPacking.java index f1e538a..6e387fb 100644 --- a/src/main/java/me/lemire/integercompression/XorBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/XorBinaryPacking.java @@ -6,6 +6,9 @@ public final class XorBinaryPacking implements IntegratedIntegerCODEC { + /** A flag for debugging. */ + public static final boolean DEBUG_DISABLE_BITPACKING = false; + public static final int BLOCK_LENGTH = 128; public void compress( @@ -33,7 +36,7 @@ public void compress( //System.out.format("compress bits: %d %d %d %d\n", bits1, bits2, bits3, bits4); outBuf[op++] = (bits1 << 24) | (bits2 << 16) | (bits3 << 8) | (bits4 << 0); - op += xorPack(inBuf, ip + 0, outBuf, op, bits1, 0, work); + op += xorPack(inBuf, ip + 0, outBuf, op, bits1, context, work); op += xorPack(inBuf, ip + 32, outBuf, op, bits2, inBuf[ip + 31], work); op += xorPack(inBuf, ip + 64, outBuf, op, bits3, inBuf[ip + 63], @@ -97,7 +100,11 @@ public static int xorMaxBits(int[] buf, int offset, int length, for (int i = offset + 1, prev = offset; i < M; ++i, ++prev) { mask |= buf[i] ^ buf[prev]; } - return 32 - Integer.numberOfLeadingZeros(mask); + if (DEBUG_DISABLE_BITPACKING) { + return 32; + } else { + return 32 - Integer.numberOfLeadingZeros(mask); + } } public static int xorPack(int[] inBuf, int inOff, @@ -107,26 +114,30 @@ public static int xorPack(int[] inBuf, int inOff, for (int i = 1, p = inOff + 1; i < 32; ++i, ++p) { work[i] = inBuf[p] ^ inBuf[p - 1]; } - BitPacking.fastpackwithoutmask(work, 0, outBuf, outOff, validBits); + if (DEBUG_DISABLE_BITPACKING) { + for (int i = 0; i < 32; ++i) { + outBuf[outOff + i] = work[i]; + } + } else { + BitPacking.fastpackwithoutmask(work, 0, outBuf, outOff, validBits); + } return validBits; - //for (int i = 0; i < 32; ++i) { - // outBuf[outOff + i] = work[i]; - //} - //return 32; } public static int xorUnpack(int[] inBuf, int inOff, int[] outBuf, int outOff, int validBits, int context, int[] work) { - BitPacking.fastunpack(inBuf, inOff, work, 0, validBits); - //for (int i = 0; i < 32; ++i) { - // work[i] = inBuf[inOff + i]; - //} + if (DEBUG_DISABLE_BITPACKING) { + for (int i = 0; i < 32; ++i) { + work[i] = inBuf[inOff + i]; + } + } else { + BitPacking.fastunpack(inBuf, inOff, work, 0, validBits); + } outBuf[outOff] = work[0] ^ context; for (int i = 1, p = outOff + 1; i < 32; ++i, ++p) { outBuf[p] = work[i] ^ outBuf[p - 1]; } return validBits; - //return 32; } } diff --git a/src/test/java/me/lemire/integercompression/TestUtils.java b/src/test/java/me/lemire/integercompression/TestUtils.java index 2381add..7c2d7ee 100644 --- a/src/test/java/me/lemire/integercompression/TestUtils.java +++ b/src/test/java/me/lemire/integercompression/TestUtils.java @@ -26,7 +26,7 @@ public static void dumpIntArrayAsHex(int[] data, String label) { if (i % 8 == 0) { System.out.println(); } - System.out.format(" %1$8X", data[i]); + System.out.format(" %1$08X", data[i]); } System.out.println(); } diff --git a/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java b/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java index 2e4d05e..1348f0f 100644 --- a/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java +++ b/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java @@ -79,9 +79,12 @@ public void maxBits1() { } public static void checkCompressAndUncompress(String label, int[] data) { + //TestUtils.dumpIntArrayAsHex(data, label + " - original"); XorBinaryPacking codec = new XorBinaryPacking(); int[] compBuf = TestUtils.compress(codec, data); + //TestUtils.dumpIntArrayAsHex(compBuf, label + " - compBuf"); int[] decompBuf = TestUtils.uncompress(codec, compBuf, data.length); + //TestUtils.dumpIntArrayAsHex(decompBuf, label + " - decompBuf"); assertArrayEquals(data, decompBuf); } @@ -128,4 +131,13 @@ public void compressAndUncompress4() { Arrays.fill(data, 128, 255, 2); checkCompressAndUncompress("compressAndUncompress4", data); } + + @Test + public void compressAndUncompress5() { + int[] data = new int[256]; + for (int i = 0; i < data.length; ++i) { + data[i] = i; + } + checkCompressAndUncompress("compressAndUncompress5", data); + } } From 48244c5ba78b49e1bb4fa9d268c6fcefd02cdd87 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Wed, 18 Sep 2013 09:51:42 +0900 Subject: [PATCH 086/412] remove redundant comments --- .../java/me/lemire/integercompression/XorBinaryPacking.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/XorBinaryPacking.java b/src/main/java/me/lemire/integercompression/XorBinaryPacking.java index 6e387fb..07b42a2 100644 --- a/src/main/java/me/lemire/integercompression/XorBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/XorBinaryPacking.java @@ -33,7 +33,6 @@ public void compress( final int bits2 = xorMaxBits(inBuf, ip + 32, 32, inBuf[ip + 31]); final int bits3 = xorMaxBits(inBuf, ip + 64, 32, inBuf[ip + 63]); final int bits4 = xorMaxBits(inBuf, ip + 96, 32, inBuf[ip + 95]); - //System.out.format("compress bits: %d %d %d %d\n", bits1, bits2, bits3, bits4); outBuf[op++] = (bits1 << 24) | (bits2 << 16) | (bits3 << 8) | (bits4 << 0); op += xorPack(inBuf, ip + 0, outBuf, op, bits1, context, work); @@ -71,7 +70,6 @@ public void uncompress( final int bits2 = (inBuf[ip] >>> 16) & 0xFF; final int bits3 = (inBuf[ip] >>> 8) & 0xFF; final int bits4 = (inBuf[ip] >>> 0) & 0xFF; - //System.out.format("uncompress bits: %d %d %d %d\n", bits1, bits2, bits3, bits4); ++ip; ip += xorUnpack(inBuf, ip, outBuf, op + 0, bits1, context, work); ip += xorUnpack(inBuf, ip, outBuf, op + 32, bits2, outBuf[op + 31], From c7a4df8482d17df68dbc8777e64f329d388b97c2 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Wed, 18 Sep 2013 10:25:55 +0900 Subject: [PATCH 087/412] add benchmark for XorBinaryPacking, and disable other benchmarks not related with it --- .../lemire/integercompression/Benchmark.java | 182 ++++++++++-------- .../integercompression/Composition.java | 2 +- .../IntegratedComposition.java | 2 +- .../integercompression/XorBinaryPacking.java | 4 +- 4 files changed, 110 insertions(+), 80 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/Benchmark.java b/src/main/java/me/lemire/integercompression/Benchmark.java index b66ff69..9d23918 100644 --- a/src/main/java/me/lemire/integercompression/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/Benchmark.java @@ -299,10 +299,40 @@ private static void test(PrintWriter csvLog, int N, int nbr, int repeat) int[][] data = generateTestData(cdg, N, nbr, sparsity); System.out.println("# generating random data... ok."); - testKamikaze(data, repeat, false); - testKamikaze(data, repeat, false); - testKamikaze(data, repeat, true); - System.out.println(); + //testKamikaze(data, repeat, false); + //testKamikaze(data, repeat, false); + //testKamikaze(data, repeat, true); + //System.out.println(); + + { + IntegerCODEC c = new Composition( + new XorBinaryPacking(), + new VariableByte()); + testCodec(csvLog, sparsity, c, data, repeat, false); + testCodec(csvLog, sparsity, c, data, repeat, false); + testCodec(csvLog, sparsity, c, data, repeat, true); + System.out.println(); + } + + { + IntegerCODEC c = new IntegratedComposition( + new XorBinaryPacking(), + new IntegratedVariableByte()); + testCodec(csvLog, sparsity, c, data, repeat, false); + testCodec(csvLog, sparsity, c, data, repeat, false); + testCodec(csvLog, sparsity, c, data, repeat, true); + System.out.println(); + } + + { + IntegerCODEC c = new Composition( + new IntegratedBinaryPacking(), + new VariableByte()); + testCodec(csvLog, sparsity, c, data, repeat, false); + testCodec(csvLog, sparsity, c, data, repeat, false); + testCodec(csvLog, sparsity, c, data, repeat, true); + System.out.println(); + } testCodec(csvLog, sparsity, new IntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte()), data, repeat, false); @@ -312,20 +342,20 @@ private static void test(PrintWriter csvLog, int N, int nbr, int repeat) new IntegratedVariableByte()), data, repeat, true); System.out.println(); - testCodec(csvLog, sparsity, new JustCopy(), data, repeat, false); - testCodec(csvLog, sparsity, new JustCopy(), data, repeat, false); - testCodec(csvLog, sparsity, new JustCopy(), data, repeat, true); - System.out.println(); + //testCodec(csvLog, sparsity, new JustCopy(), data, repeat, false); + //testCodec(csvLog, sparsity, new JustCopy(), data, repeat, false); + //testCodec(csvLog, sparsity, new JustCopy(), data, repeat, true); + //System.out.println(); - testCodec(csvLog, sparsity, new VariableByte(), data, repeat, false); - testCodec(csvLog, sparsity, new VariableByte(), data, repeat, false); - testCodec(csvLog, sparsity, new VariableByte(), data, repeat, true); - System.out.println(); + //testCodec(csvLog, sparsity, new VariableByte(), data, repeat, false); + //testCodec(csvLog, sparsity, new VariableByte(), data, repeat, false); + //testCodec(csvLog, sparsity, new VariableByte(), data, repeat, true); + //System.out.println(); - testCodec(csvLog, sparsity, new IntegratedVariableByte(), data, repeat, false); - testCodec(csvLog, sparsity, new IntegratedVariableByte(), data, repeat, false); - testCodec(csvLog, sparsity, new IntegratedVariableByte(), data, repeat, true); - System.out.println(); + //testCodec(csvLog, sparsity, new IntegratedVariableByte(), data, repeat, false); + //testCodec(csvLog, sparsity, new IntegratedVariableByte(), data, repeat, false); + //testCodec(csvLog, sparsity, new IntegratedVariableByte(), data, repeat, true); + //System.out.println(); testCodec(csvLog, sparsity, new Composition(new BinaryPacking(), new VariableByte()), data, repeat, false); @@ -335,66 +365,66 @@ private static void test(PrintWriter csvLog, int N, int nbr, int repeat) data, repeat, true); System.out.println(); - testCodec(csvLog, sparsity, new Composition(new NewPFD(), new VariableByte()), data, - repeat, false); - testCodec(csvLog, sparsity, new Composition(new NewPFD(), new VariableByte()), data, - repeat, false); - testCodec(csvLog, sparsity, new Composition(new NewPFD(), new VariableByte()), data, - repeat, true); - System.out.println(); - - testCodec(csvLog, sparsity, new Composition(new NewPFDS9(), new VariableByte()), - data, repeat, false); - testCodec(csvLog, sparsity, new Composition(new NewPFDS9(), new VariableByte()), - data, repeat, false); - testCodec(csvLog, sparsity, new Composition(new NewPFDS9(), new VariableByte()), - data, repeat, true); - System.out.println(); - - testCodec(csvLog, sparsity, new Composition(new NewPFDS16(), new VariableByte()), - data, repeat, false); - testCodec(csvLog, sparsity, new Composition(new NewPFDS16(), new VariableByte()), - data, repeat, false); - testCodec(csvLog, sparsity, new Composition(new NewPFDS16(), new VariableByte()), - data, repeat, true); - System.out.println(); - - testCodec(csvLog, sparsity, new Composition(new OptPFD(), new VariableByte()), data, - repeat, false); - testCodec(csvLog, sparsity, new Composition(new OptPFD(), new VariableByte()), data, - repeat, false); - testCodec(csvLog, sparsity, new Composition(new OptPFD(), new VariableByte()), data, - repeat, true); - System.out.println(); - - testCodec(csvLog, sparsity, new Composition(new OptPFDS9(), new VariableByte()), - data, repeat, false); - testCodec(csvLog, sparsity, new Composition(new OptPFDS9(), new VariableByte()), - data, repeat, false); - testCodec(csvLog, sparsity, new Composition(new OptPFDS9(), new VariableByte()), - data, repeat, true); - System.out.println(); - - testCodec(csvLog, sparsity, new Composition(new OptPFDS16(), new VariableByte()), - data, repeat, false); - testCodec(csvLog, sparsity, new Composition(new OptPFDS16(), new VariableByte()), - data, repeat, false); - testCodec(csvLog, sparsity, new Composition(new OptPFDS16(), new VariableByte()), - data, repeat, true); - System.out.println(); - - testCodec(csvLog, sparsity, new Composition(new FastPFOR(), new VariableByte()), - data, repeat, false); - testCodec(csvLog, sparsity, new Composition(new FastPFOR(), new VariableByte()), - data, repeat, false); - testCodec(csvLog, sparsity, new Composition(new FastPFOR(), new VariableByte()), - data, repeat, true); - System.out.println(); - - testCodec(csvLog, sparsity, new Simple9(), data, repeat, false); - testCodec(csvLog, sparsity, new Simple9(), data, repeat, false); - testCodec(csvLog, sparsity, new Simple9(), data, repeat, true); - System.out.println(); + //testCodec(csvLog, sparsity, new Composition(new NewPFD(), new VariableByte()), data, + // repeat, false); + //testCodec(csvLog, sparsity, new Composition(new NewPFD(), new VariableByte()), data, + // repeat, false); + //testCodec(csvLog, sparsity, new Composition(new NewPFD(), new VariableByte()), data, + // repeat, true); + //System.out.println(); + + //testCodec(csvLog, sparsity, new Composition(new NewPFDS9(), new VariableByte()), + // data, repeat, false); + //testCodec(csvLog, sparsity, new Composition(new NewPFDS9(), new VariableByte()), + // data, repeat, false); + //testCodec(csvLog, sparsity, new Composition(new NewPFDS9(), new VariableByte()), + // data, repeat, true); + //System.out.println(); + + //testCodec(csvLog, sparsity, new Composition(new NewPFDS16(), new VariableByte()), + // data, repeat, false); + //testCodec(csvLog, sparsity, new Composition(new NewPFDS16(), new VariableByte()), + // data, repeat, false); + //testCodec(csvLog, sparsity, new Composition(new NewPFDS16(), new VariableByte()), + // data, repeat, true); + //System.out.println(); + + //testCodec(csvLog, sparsity, new Composition(new OptPFD(), new VariableByte()), data, + // repeat, false); + //testCodec(csvLog, sparsity, new Composition(new OptPFD(), new VariableByte()), data, + // repeat, false); + //testCodec(csvLog, sparsity, new Composition(new OptPFD(), new VariableByte()), data, + // repeat, true); + //System.out.println(); + + //testCodec(csvLog, sparsity, new Composition(new OptPFDS9(), new VariableByte()), + // data, repeat, false); + //testCodec(csvLog, sparsity, new Composition(new OptPFDS9(), new VariableByte()), + // data, repeat, false); + //testCodec(csvLog, sparsity, new Composition(new OptPFDS9(), new VariableByte()), + // data, repeat, true); + //System.out.println(); + + //testCodec(csvLog, sparsity, new Composition(new OptPFDS16(), new VariableByte()), + // data, repeat, false); + //testCodec(csvLog, sparsity, new Composition(new OptPFDS16(), new VariableByte()), + // data, repeat, false); + //testCodec(csvLog, sparsity, new Composition(new OptPFDS16(), new VariableByte()), + // data, repeat, true); + //System.out.println(); + + //testCodec(csvLog, sparsity, new Composition(new FastPFOR(), new VariableByte()), + // data, repeat, false); + //testCodec(csvLog, sparsity, new Composition(new FastPFOR(), new VariableByte()), + // data, repeat, false); + //testCodec(csvLog, sparsity, new Composition(new FastPFOR(), new VariableByte()), + // data, repeat, true); + //System.out.println(); + + //testCodec(csvLog, sparsity, new Simple9(), data, repeat, false); + //testCodec(csvLog, sparsity, new Simple9(), data, repeat, false); + //testCodec(csvLog, sparsity, new Simple9(), data, repeat, true); + //System.out.println(); } } } diff --git a/src/main/java/me/lemire/integercompression/Composition.java b/src/main/java/me/lemire/integercompression/Composition.java index df6f3a5..8282031 100644 --- a/src/main/java/me/lemire/integercompression/Composition.java +++ b/src/main/java/me/lemire/integercompression/Composition.java @@ -59,7 +59,7 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, @Override public String toString() { - return F1.toString() + "+" + F2.toString(); + return F1.toString() + " + " + F2.toString(); } } diff --git a/src/main/java/me/lemire/integercompression/IntegratedComposition.java b/src/main/java/me/lemire/integercompression/IntegratedComposition.java index d2bd59f..353515d 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedComposition.java +++ b/src/main/java/me/lemire/integercompression/IntegratedComposition.java @@ -57,7 +57,7 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, @Override public String toString() { - return F1.toString() + "+" + F2.toString(); + return F1.toString() + " + " + F2.toString() + " (Integrated)"; } } diff --git a/src/main/java/me/lemire/integercompression/XorBinaryPacking.java b/src/main/java/me/lemire/integercompression/XorBinaryPacking.java index 07b42a2..492e76a 100644 --- a/src/main/java/me/lemire/integercompression/XorBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/XorBinaryPacking.java @@ -132,9 +132,9 @@ public static int xorUnpack(int[] inBuf, int inOff, } else { BitPacking.fastunpack(inBuf, inOff, work, 0, validBits); } - outBuf[outOff] = work[0] ^ context; + outBuf[outOff] = context = work[0] ^ context; for (int i = 1, p = outOff + 1; i < 32; ++i, ++p) { - outBuf[p] = work[i] ^ outBuf[p - 1]; + outBuf[p] = context = work[i] ^ context; } return validBits; } From f91e298acd967fedb42a88ecbf465109b34138c4 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 24 Sep 2013 11:45:59 +0900 Subject: [PATCH 088/412] add skeleton for new benchmark --- pom.xml | 2 +- .../BenchmarkOffsettedSeries.java | 53 +++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java diff --git a/pom.xml b/pom.xml index 4901bf1..f69dfa0 100644 --- a/pom.xml +++ b/pom.xml @@ -82,7 +82,7 @@ exec-maven-plugin 1.1 - me.lemire.integercompression.Benchmark + me.lemire.integercompression.BenchmarkOffsettedSeries diff --git a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java new file mode 100644 index 0000000..a821c8e --- /dev/null +++ b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java @@ -0,0 +1,53 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + */ +package me.lemire.integercompression; + +import java.util.Random; + +public class BenchmarkOffsettedSeries +{ + public static final int DEFAULT_MEAN = 1 << 20; + public static final int DEFAULT_RANGE = 1 << 10; + + public BenchmarkOffsettedSeries() { + } + + /** + * Run benchmark. + * + * @param count Count of data chunks. + * @param length Length of a data chunk. + */ + public void run(int count, int length) { + int[][] data = generateDataChunks(0, count, length, + DEFAULT_MEAN, DEFAULT_RANGE); + // TODO: + } + + public static int[][] generateDataChunks( + long seed, + int count, + int length, + int mean, + int range) + { + int offset = mean - range / 2; + int[][] chunks = new int[count][]; + Random r = new Random(seed); + for (int i = 0; i < count; ++i) { + int[] chunk = chunks[i] = new int[length]; + for (int j = 0; j < length; ++j) { + chunk[j] = (r.nextInt() % range) + offset; + } + } + return chunks; + } + + public static void main(String[] args) { + BenchmarkOffsettedSeries b = new BenchmarkOffsettedSeries(); + b.run(1024, 1024); + System.out.println("Hello BenchmarkOffsettedSeries"); + } +} From 57d84667c71d7ea9b0ff351dc6875c042497ab8b Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 24 Sep 2013 11:53:25 +0900 Subject: [PATCH 089/412] fix EOL codes --- .../BenchmarkOffsettedSeries.java | 106 +++++++++--------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java index a821c8e..e033b43 100644 --- a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java +++ b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java @@ -1,53 +1,53 @@ -/** - * This code is released under the - * Apache License Version 2.0 http://www.apache.org/licenses/. - */ -package me.lemire.integercompression; - -import java.util.Random; - -public class BenchmarkOffsettedSeries -{ - public static final int DEFAULT_MEAN = 1 << 20; - public static final int DEFAULT_RANGE = 1 << 10; - - public BenchmarkOffsettedSeries() { - } - - /** - * Run benchmark. - * - * @param count Count of data chunks. - * @param length Length of a data chunk. - */ - public void run(int count, int length) { - int[][] data = generateDataChunks(0, count, length, - DEFAULT_MEAN, DEFAULT_RANGE); - // TODO: - } - - public static int[][] generateDataChunks( - long seed, - int count, - int length, - int mean, - int range) - { - int offset = mean - range / 2; - int[][] chunks = new int[count][]; - Random r = new Random(seed); - for (int i = 0; i < count; ++i) { - int[] chunk = chunks[i] = new int[length]; - for (int j = 0; j < length; ++j) { - chunk[j] = (r.nextInt() % range) + offset; - } - } - return chunks; - } - - public static void main(String[] args) { - BenchmarkOffsettedSeries b = new BenchmarkOffsettedSeries(); - b.run(1024, 1024); - System.out.println("Hello BenchmarkOffsettedSeries"); - } -} +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + */ +package me.lemire.integercompression; + +import java.util.Random; + +public class BenchmarkOffsettedSeries +{ + public static final int DEFAULT_MEAN = 1 << 20; + public static final int DEFAULT_RANGE = 1 << 10; + + public BenchmarkOffsettedSeries() { + } + + /** + * Run benchmark. + * + * @param count Count of data chunks. + * @param length Length of a data chunk. + */ + public void run(int count, int length) { + int[][] data = generateDataChunks(0, count, length, + DEFAULT_MEAN, DEFAULT_RANGE); + // TODO: + } + + public static int[][] generateDataChunks( + long seed, + int count, + int length, + int mean, + int range) + { + int offset = mean - range / 2; + int[][] chunks = new int[count][]; + Random r = new Random(seed); + for (int i = 0; i < count; ++i) { + int[] chunk = chunks[i] = new int[length]; + for (int j = 0; j < length; ++j) { + chunk[j] = (r.nextInt() % range) + offset; + } + } + return chunks; + } + + public static void main(String[] args) { + BenchmarkOffsettedSeries b = new BenchmarkOffsettedSeries(); + b.run(1024, 1024); + System.out.println("Hello BenchmarkOffsettedSeries"); + } +} From cbc75ac423698339ac8a0b24ce70f156fcde05da Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 24 Sep 2013 12:56:31 +0900 Subject: [PATCH 090/412] impl benchmark skeleton --- .../BenchmarkOffsettedSeries.java | 138 +++++++++++++++++- .../integercompression/PerformanceLogger.java | 63 ++++++++ 2 files changed, 195 insertions(+), 6 deletions(-) create mode 100644 src/main/java/me/lemire/integercompression/PerformanceLogger.java diff --git a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java index e033b43..33b4d7f 100644 --- a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java +++ b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java @@ -4,6 +4,9 @@ */ package me.lemire.integercompression; +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; import java.util.Random; public class BenchmarkOffsettedSeries @@ -17,13 +20,120 @@ public BenchmarkOffsettedSeries() { /** * Run benchmark. * + * @param csvWriter Write for results in CSV. * @param count Count of data chunks. * @param length Length of a data chunk. */ - public void run(int count, int length) { + public void run(PrintWriter csvWriter, int count, int length) + { int[][] data = generateDataChunks(0, count, length, DEFAULT_MEAN, DEFAULT_RANGE); - // TODO: + + IntegerCODEC[] codecs = { + new Composition(new XorBinaryPacking(), new VariableByte()), + new IntegratedComposition( + new XorBinaryPacking(), new IntegratedVariableByte()), + new Composition( + new IntegratedBinaryPacking(), new VariableByte()), + new IntegratedComposition( + new IntegratedBinaryPacking(), + new IntegratedVariableByte()), + }; + + csvWriter.format("\"Algorithm\",\"Bits per int\"," + + "\"Compress speed (MiS)\",\"Decompress speed (MiS)\"\n"); + for (IntegerCODEC codec : codecs) { + benchmark(csvWriter, codec.toString(), codec, data); + } + } + + private void benchmark( + PrintWriter csvWriter, + String label, + IntegerCODEC codec, + int[][] data) + { + PerformanceLogger logger = new PerformanceLogger(); + + int maxLen = getMaxLen(data); + int[] compressBuffer = new int[4 * maxLen + 1024]; + int[] decompressBuffer = new int[maxLen]; + + for (int[] array : data) { + int compSize = compress(logger, codec, array, compressBuffer); + int decompSize = decompress(logger, codec, compressBuffer, + compSize, decompressBuffer); + checkArray(array, decompressBuffer, decompSize, codec); + } + + if (csvWriter != null) { + csvWriter.format("\"%1$s\",%2$.2f,%3$.0f,%4$.0f\n", + label, logger.getBitPerInt(), logger.getCompressSpeed(), + logger.getDecompressSpeed()); + } + } + + private void checkArray( + int[] expected, + int[] actualArray, + int actualLen, + IntegerCODEC codec) + { + if (actualLen != expected.length) { + throw new RuntimeException("Length mismatch:" + + " expected=" + expected.length + " actual=" + actualLen + + " codec=" + codec.toString()); + } + for (int i = 0; i < expected.length; ++i) { + if (actualArray[i] != expected[i]) { + throw new RuntimeException("Value mismatch: " + + " where=" + i + " expected=" + expected[i] + + " actual=" + actualArray[i] + + " codec=" + codec.toString()); + } + } + } + + private int compress( + PerformanceLogger logger, + IntegerCODEC codec, + int[] src, + int[] dst) + { + IntWrapper inpos = new IntWrapper(); + IntWrapper outpos = new IntWrapper(); + logger.compressionTimer.start(); + codec.compress(src, inpos, src.length, dst, outpos); + logger.compressionTimer.end(); + int outSize = outpos.get(); + logger.addOriginalSize(src.length); + logger.addCompressedSize(outSize); + return outSize; + } + + private int decompress( + PerformanceLogger logger, + IntegerCODEC codec, + int[] src, + int srcLen, + int[] dst) + { + IntWrapper inpos = new IntWrapper(); + IntWrapper outpos = new IntWrapper(); + logger.decompressionTimer.start(); + codec.uncompress(src, inpos, srcLen, dst, outpos); + logger.decompressionTimer.end(); + return outpos.get(); + } + + public static int getMaxLen(int[][] data) { + int maxLen = 0; + for (int[] array : data) { + if (array.length > maxLen) { + maxLen = array.length; + } + } + return maxLen; } public static int[][] generateDataChunks( @@ -45,9 +155,25 @@ public static int[][] generateDataChunks( return chunks; } - public static void main(String[] args) { - BenchmarkOffsettedSeries b = new BenchmarkOffsettedSeries(); - b.run(1024, 1024); - System.out.println("Hello BenchmarkOffsettedSeries"); + public static void main(String[] args) throws Exception { + File csvFile = new File(String.format( + "benchmark-offsetted-%1$tY%1$tm%1$tdT%1$tH%1$tM%1$tS.csv", + System.currentTimeMillis())); + PrintWriter writer = null; + try { + writer = new PrintWriter(csvFile); + System.out.println("# Results will be written into a CSV file: " + + csvFile.getName()); + System.out.println(); + BenchmarkOffsettedSeries b = new BenchmarkOffsettedSeries(); + b.run(writer, 16 * 1024, 1024); + System.out.println(); + System.out.println("# Results were written into a CSV file: " + + csvFile.getName()); + } finally { + if (writer != null) { + writer.close(); + } + } } } diff --git a/src/main/java/me/lemire/integercompression/PerformanceLogger.java b/src/main/java/me/lemire/integercompression/PerformanceLogger.java new file mode 100644 index 0000000..fd309b4 --- /dev/null +++ b/src/main/java/me/lemire/integercompression/PerformanceLogger.java @@ -0,0 +1,63 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + */ +package me.lemire.integercompression; + +public final class PerformanceLogger +{ + public static class Timer { + private long startNano; + private long duration; + + public Timer() {} + + public void start() { + this.startNano = System.nanoTime(); + } + + public long end() { + return this.duration = System.nanoTime() - this.startNano; + } + + public long getDuration() { + return this.duration; + } + } + + public final Timer compressionTimer = new Timer(); + + public final Timer decompressionTimer = new Timer(); + + private long originalSize = 0; + + private long compressedSize = 0; + + public long addOriginalSize(long value) { + return this.originalSize += value; + } + + public long addCompressedSize(long value) { + return this.compressedSize += value; + } + + public long getOriginalSize() { + return this.originalSize; + } + + public long getCompressedSize() { + return this.compressedSize; + } + + public double getBitPerInt() { + return this.compressedSize * 32.0 / this.originalSize; + } + + public double getCompressSpeed() { + return originalSize * 1.0e3 / this.compressionTimer.getDuration(); + } + + public double getDecompressSpeed() { + return originalSize * 1.0e3 / this.decompressionTimer.getDuration(); + } +} From 21f6b4a3615e5498f3d67cba1347748d3e433d4e Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 24 Sep 2013 15:25:13 +0900 Subject: [PATCH 091/412] refactor offsetted series benchmark --- .../BenchmarkOffsettedSeries.java | 43 ++++++++++++++----- .../integercompression/PerformanceLogger.java | 12 ++++-- 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java index 33b4d7f..b5f0d1d 100644 --- a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java +++ b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java @@ -13,6 +13,8 @@ public class BenchmarkOffsettedSeries { public static final int DEFAULT_MEAN = 1 << 20; public static final int DEFAULT_RANGE = 1 << 10; + public static final int DEFAULT_REPEAT = 10; + public static final int DEFAULT_WARMUP = 2; public BenchmarkOffsettedSeries() { } @@ -26,9 +28,6 @@ public BenchmarkOffsettedSeries() { */ public void run(PrintWriter csvWriter, int count, int length) { - int[][] data = generateDataChunks(0, count, length, - DEFAULT_MEAN, DEFAULT_RANGE); - IntegerCODEC[] codecs = { new Composition(new XorBinaryPacking(), new VariableByte()), new IntegratedComposition( @@ -42,8 +41,27 @@ public void run(PrintWriter csvWriter, int count, int length) csvWriter.format("\"Algorithm\",\"Bits per int\"," + "\"Compress speed (MiS)\",\"Decompress speed (MiS)\"\n"); + + int[][] randData = generateDataChunks(0, count, length, + DEFAULT_MEAN, DEFAULT_RANGE); + benchmark(csvWriter, "Random (mean=2^20 range=2^10)", + codecs, randData, DEFAULT_REPEAT, DEFAULT_WARMUP); + } + + private void benchmark( + PrintWriter csvWriter, + String labelPrefix, + IntegerCODEC[] codecs, + int[][] data, + int repeat, + int warmup) + { for (IntegerCODEC codec : codecs) { - benchmark(csvWriter, codec.toString(), codec, data); + String label = labelPrefix + " - " + codec.toString(); + for (int i = 0; i < warmup; ++i) { + benchmark(null, label, codec, data, repeat); + } + benchmark(csvWriter, label, codec, data, repeat); } } @@ -51,7 +69,8 @@ private void benchmark( PrintWriter csvWriter, String label, IntegerCODEC codec, - int[][] data) + int[][] data, + int repeat) { PerformanceLogger logger = new PerformanceLogger(); @@ -59,11 +78,13 @@ private void benchmark( int[] compressBuffer = new int[4 * maxLen + 1024]; int[] decompressBuffer = new int[maxLen]; - for (int[] array : data) { - int compSize = compress(logger, codec, array, compressBuffer); - int decompSize = decompress(logger, codec, compressBuffer, - compSize, decompressBuffer); - checkArray(array, decompressBuffer, decompSize, codec); + for (int i = 0; i < repeat; ++i) { + for (int[] array : data) { + int compSize = compress(logger, codec, array, compressBuffer); + int decompSize = decompress(logger, codec, compressBuffer, + compSize, decompressBuffer); + checkArray(array, decompressBuffer, decompSize, codec); + } } if (csvWriter != null) { @@ -166,7 +187,7 @@ public static void main(String[] args) throws Exception { + csvFile.getName()); System.out.println(); BenchmarkOffsettedSeries b = new BenchmarkOffsettedSeries(); - b.run(writer, 16 * 1024, 1024); + b.run(writer, 16 * 1000, 1000); System.out.println(); System.out.println("# Results were written into a CSV file: " + csvFile.getName()); diff --git a/src/main/java/me/lemire/integercompression/PerformanceLogger.java b/src/main/java/me/lemire/integercompression/PerformanceLogger.java index fd309b4..9782e46 100644 --- a/src/main/java/me/lemire/integercompression/PerformanceLogger.java +++ b/src/main/java/me/lemire/integercompression/PerformanceLogger.java @@ -8,7 +8,7 @@ public final class PerformanceLogger { public static class Timer { private long startNano; - private long duration; + private long duration = 0; public Timer() {} @@ -17,7 +17,7 @@ public void start() { } public long end() { - return this.duration = System.nanoTime() - this.startNano; + return this.duration += System.nanoTime() - this.startNano; } public long getDuration() { @@ -53,11 +53,15 @@ public double getBitPerInt() { return this.compressedSize * 32.0 / this.originalSize; } + private static double getMiS(long size, long nanoTime) { + return (size * 1e-6) / (nanoTime * 1.0e-9); + } + public double getCompressSpeed() { - return originalSize * 1.0e3 / this.compressionTimer.getDuration(); + return getMiS(this.originalSize, this.compressionTimer.getDuration()); } public double getDecompressSpeed() { - return originalSize * 1.0e3 / this.decompressionTimer.getDuration(); + return getMiS(this.originalSize, this.decompressionTimer.getDuration()); } } From aadf30adc5f1b29637344ecb5d00ea1b2f2c1372 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 24 Sep 2013 16:07:33 +0900 Subject: [PATCH 092/412] more benchmark --- .../BenchmarkOffsettedSeries.java | 89 +++++++++++++++---- 1 file changed, 72 insertions(+), 17 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java index b5f0d1d..1470415 100644 --- a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java +++ b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java @@ -7,13 +7,14 @@ import java.io.File; import java.io.IOException; import java.io.PrintWriter; +import java.util.Arrays; import java.util.Random; public class BenchmarkOffsettedSeries { public static final int DEFAULT_MEAN = 1 << 20; public static final int DEFAULT_RANGE = 1 << 10; - public static final int DEFAULT_REPEAT = 10; + public static final int DEFAULT_REPEAT = 5; public static final int DEFAULT_WARMUP = 2; public BenchmarkOffsettedSeries() { @@ -29,45 +30,76 @@ public BenchmarkOffsettedSeries() { public void run(PrintWriter csvWriter, int count, int length) { IntegerCODEC[] codecs = { - new Composition(new XorBinaryPacking(), new VariableByte()), - new IntegratedComposition( - new XorBinaryPacking(), new IntegratedVariableByte()), + new Composition(new BinaryPacking(), new VariableByte()), + new Composition(new FastPFOR(), new VariableByte()), new Composition( new IntegratedBinaryPacking(), new VariableByte()), new IntegratedComposition( new IntegratedBinaryPacking(), new IntegratedVariableByte()), + new Composition(new XorBinaryPacking(), new VariableByte()), + new IntegratedComposition( + new XorBinaryPacking(), new IntegratedVariableByte()), }; - csvWriter.format("\"Algorithm\",\"Bits per int\"," + + csvWriter.format("\"Dataset\",\"CODEC\",\"Bits per int\"," + "\"Compress speed (MiS)\",\"Decompress speed (MiS)\"\n"); - int[][] randData = generateDataChunks(0, count, length, - DEFAULT_MEAN, DEFAULT_RANGE); - benchmark(csvWriter, "Random (mean=2^20 range=2^10)", + benchmark(csvWriter, codecs, count, length, DEFAULT_MEAN, + DEFAULT_RANGE); + benchmark(csvWriter, codecs, count, length, DEFAULT_MEAN >> 5, + DEFAULT_RANGE); + } + + private void benchmark( + PrintWriter csvWriter, + IntegerCODEC[] codecs, + int count, + int length, + int mean, + int range) + { + String dataProp = String.format("(mean=%1$d range=%2$d)", mean, + range); + + int[][] randData = generateDataChunks(0, count, length, mean, range); + int[][] deltaData = deltaDataChunks(randData); + int[][] sortedData = sortDataChunks(randData); + int[][] sortedDeltaData = deltaDataChunks(sortedData); + + benchmark(csvWriter, "Random " + dataProp, codecs, randData, DEFAULT_REPEAT, DEFAULT_WARMUP); + benchmark(csvWriter, "Random+delta " + dataProp, + codecs, deltaData, DEFAULT_REPEAT, DEFAULT_WARMUP); + benchmark(csvWriter, "Sorted " + dataProp, + codecs, sortedData, DEFAULT_REPEAT, DEFAULT_WARMUP); + benchmark(csvWriter, "Sorted+delta " + dataProp, + codecs, sortedDeltaData, DEFAULT_REPEAT, DEFAULT_WARMUP); } private void benchmark( PrintWriter csvWriter, - String labelPrefix, + String dataName, IntegerCODEC[] codecs, int[][] data, int repeat, int warmup) { + System.out.println("Processing: " + dataName); for (IntegerCODEC codec : codecs) { - String label = labelPrefix + " - " + codec.toString(); + String codecName = codec.toString(); for (int i = 0; i < warmup; ++i) { - benchmark(null, label, codec, data, repeat); + benchmark(null, null, null, codec, data, repeat); } - benchmark(csvWriter, label, codec, data, repeat); + benchmark(csvWriter, dataName, codecName, codec, data, + repeat); } } private void benchmark( PrintWriter csvWriter, - String label, + String dataName, + String codecName, IntegerCODEC codec, int[][] data, int repeat) @@ -88,9 +120,9 @@ private void benchmark( } if (csvWriter != null) { - csvWriter.format("\"%1$s\",%2$.2f,%3$.0f,%4$.0f\n", - label, logger.getBitPerInt(), logger.getCompressSpeed(), - logger.getDecompressSpeed()); + csvWriter.format("\"%1$s\",\"%2$s\",%3$.2f,%4$.0f,%5$.0f\n", + dataName, codecName, logger.getBitPerInt(), + logger.getCompressSpeed(), logger.getDecompressSpeed()); } } @@ -170,12 +202,35 @@ public static int[][] generateDataChunks( for (int i = 0; i < count; ++i) { int[] chunk = chunks[i] = new int[length]; for (int j = 0; j < length; ++j) { - chunk[j] = (r.nextInt() % range) + offset; + chunk[j] = r.nextInt(range) + offset; } } return chunks; } + public static int[][] deltaDataChunks(int[][] src) { + int[][] dst = new int[src.length][]; + for (int i = 0; i < src.length; ++i) { + int[] s = src[i]; + int[] d = dst[i] = new int[s.length]; + int prev = 0; + for (int j = 0; j < s.length; ++j) { + d[j] = s[j] - prev; + prev = s[j]; + } + } + return dst; + } + + public static int[][] sortDataChunks(int[][] src) { + int[][] dst = new int[src.length][]; + for (int i = 0; i < src.length; ++i) { + dst[i] = Arrays.copyOf(src[i], src[i].length); + Arrays.sort(dst[i]); + } + return dst; + } + public static void main(String[] args) throws Exception { File csvFile = new File(String.format( "benchmark-offsetted-%1$tY%1$tm%1$tdT%1$tH%1$tM%1$tS.csv", From d51512832fd714f62980856994d433fea52ecd77 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 24 Sep 2013 18:59:45 +0900 Subject: [PATCH 093/412] remove effect of variable byte family codecs --- .../me/lemire/integercompression/BenchmarkOffsettedSeries.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java index 1470415..3458555 100644 --- a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java +++ b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java @@ -242,7 +242,7 @@ public static void main(String[] args) throws Exception { + csvFile.getName()); System.out.println(); BenchmarkOffsettedSeries b = new BenchmarkOffsettedSeries(); - b.run(writer, 16 * 1000, 1000); + b.run(writer, 16 * 1024, 1024); System.out.println(); System.out.println("# Results were written into a CSV file: " + csvFile.getName()); From ef5fe35e78d128cb1ec1175fe958870eaaa44b02 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Fri, 27 Sep 2013 00:41:22 +0900 Subject: [PATCH 094/412] make benchmark simplify --- .../BenchmarkOffsettedSeries.java | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java index 3458555..eb27d55 100644 --- a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java +++ b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java @@ -30,16 +30,10 @@ public BenchmarkOffsettedSeries() { public void run(PrintWriter csvWriter, int count, int length) { IntegerCODEC[] codecs = { - new Composition(new BinaryPacking(), new VariableByte()), - new Composition(new FastPFOR(), new VariableByte()), - new Composition( - new IntegratedBinaryPacking(), new VariableByte()), - new IntegratedComposition( - new IntegratedBinaryPacking(), - new IntegratedVariableByte()), - new Composition(new XorBinaryPacking(), new VariableByte()), - new IntegratedComposition( - new XorBinaryPacking(), new IntegratedVariableByte()), + new BinaryPacking(), + new FastPFOR(), + new IntegratedBinaryPacking(), + new XorBinaryPacking(), }; csvWriter.format("\"Dataset\",\"CODEC\",\"Bits per int\"," + @@ -242,7 +236,7 @@ public static void main(String[] args) throws Exception { + csvFile.getName()); System.out.println(); BenchmarkOffsettedSeries b = new BenchmarkOffsettedSeries(); - b.run(writer, 16 * 1024, 1024); + b.run(writer, 8 * 1024, 1280); System.out.println(); System.out.println("# Results were written into a CSV file: " + csvFile.getName()); From f84fd2d776191fc5791474263ccac056bbc70566 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Fri, 27 Sep 2013 00:50:02 +0900 Subject: [PATCH 095/412] expand loop in Util#maxbits, as BinaryPacking2 --- .../BenchmarkOffsettedSeries.java | 1 + .../integercompression/BinaryPacking.java | 2 +- .../integercompression/BinaryPacking2.java | 38 +++++++++++++++++++ .../me/lemire/integercompression/Util.java | 36 ++++++++++++++++++ 4 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 src/main/java/me/lemire/integercompression/BinaryPacking2.java diff --git a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java index eb27d55..ef311df 100644 --- a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java +++ b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java @@ -31,6 +31,7 @@ public void run(PrintWriter csvWriter, int count, int length) { IntegerCODEC[] codecs = { new BinaryPacking(), + new BinaryPacking2(), new FastPFOR(), new IntegratedBinaryPacking(), new XorBinaryPacking(), diff --git a/src/main/java/me/lemire/integercompression/BinaryPacking.java b/src/main/java/me/lemire/integercompression/BinaryPacking.java index 804e0b5..5c896c8 100644 --- a/src/main/java/me/lemire/integercompression/BinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/BinaryPacking.java @@ -12,7 +12,7 @@ * * @author Daniel Lemire */ -public final class BinaryPacking implements IntegerCODEC { +public class BinaryPacking implements IntegerCODEC { @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { diff --git a/src/main/java/me/lemire/integercompression/BinaryPacking2.java b/src/main/java/me/lemire/integercompression/BinaryPacking2.java new file mode 100644 index 0000000..dc1a47a --- /dev/null +++ b/src/main/java/me/lemire/integercompression/BinaryPacking2.java @@ -0,0 +1,38 @@ +package me.lemire.integercompression; + +public final class BinaryPacking2 extends BinaryPacking { + + @Override + public void compress( + int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) + { + inlength = inlength - inlength % 128; + if (inlength == 0) { + return; + } + + out[outpos.get()] = inlength; + outpos.increment(); + int tmpoutpos = outpos.get(); + for (int s = inpos.get(); s < inpos.get() + inlength; s += 32 * 4) { + final int mbits1 = Util.maxbits32(in, s); + final int mbits2 = Util.maxbits32(in, s + 32); + final int mbits3 = Util.maxbits32(in, s + 2 * 32); + final int mbits4 = Util.maxbits32(in, s + 3 * 32); + out[tmpoutpos++] = (mbits1 << 24) | (mbits2 << 16) | (mbits3 << 8) + | (mbits4); + BitPacking.fastpackwithoutmask(in, s, out, tmpoutpos, mbits1); + tmpoutpos += mbits1; + BitPacking.fastpackwithoutmask(in, s + 32, out, tmpoutpos, mbits2); + tmpoutpos += mbits2; + BitPacking.fastpackwithoutmask(in, s + 2 * 32, out, tmpoutpos, mbits3); + tmpoutpos += mbits3; + BitPacking.fastpackwithoutmask(in, s + 3 * 32, out, tmpoutpos, mbits4); + tmpoutpos += mbits4; + } + inpos.add(inlength); + outpos.set(tmpoutpos); + } + +} diff --git a/src/main/java/me/lemire/integercompression/Util.java b/src/main/java/me/lemire/integercompression/Util.java index f55dfbd..a1b5677 100644 --- a/src/main/java/me/lemire/integercompression/Util.java +++ b/src/main/java/me/lemire/integercompression/Util.java @@ -20,6 +20,42 @@ protected static int maxbits(int[] i, int pos, int length) { return bits(mask); } + protected static int maxbits32(int[] i, int pos) { + int mask = i[pos]; + mask |= i[pos + 1]; + mask |= i[pos + 2]; + mask |= i[pos + 3]; + mask |= i[pos + 4]; + mask |= i[pos + 5]; + mask |= i[pos + 6]; + mask |= i[pos + 7]; + mask |= i[pos + 8]; + mask |= i[pos + 9]; + mask |= i[pos + 10]; + mask |= i[pos + 11]; + mask |= i[pos + 12]; + mask |= i[pos + 13]; + mask |= i[pos + 14]; + mask |= i[pos + 15]; + mask |= i[pos + 16]; + mask |= i[pos + 17]; + mask |= i[pos + 18]; + mask |= i[pos + 19]; + mask |= i[pos + 20]; + mask |= i[pos + 21]; + mask |= i[pos + 22]; + mask |= i[pos + 23]; + mask |= i[pos + 24]; + mask |= i[pos + 25]; + mask |= i[pos + 26]; + mask |= i[pos + 27]; + mask |= i[pos + 28]; + mask |= i[pos + 29]; + mask |= i[pos + 30]; + mask |= i[pos + 31]; + return bits(mask); + } + protected static int maxdiffbits(int initoffset, int[] i, int pos, int length) { int mask = 0; mask |= (i[pos] - initoffset); From 6e8e7306347570ac548789086a5a9bb5714f4520 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Fri, 27 Sep 2013 01:11:47 +0900 Subject: [PATCH 096/412] make chunk length of BinaryPacking 160 --- .../BenchmarkOffsettedSeries.java | 1 + .../integercompression/BinaryPacking160.java | 82 +++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 src/main/java/me/lemire/integercompression/BinaryPacking160.java diff --git a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java index ef311df..ae4bcc8 100644 --- a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java +++ b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java @@ -32,6 +32,7 @@ public void run(PrintWriter csvWriter, int count, int length) IntegerCODEC[] codecs = { new BinaryPacking(), new BinaryPacking2(), + new BinaryPacking160(), new FastPFOR(), new IntegratedBinaryPacking(), new XorBinaryPacking(), diff --git a/src/main/java/me/lemire/integercompression/BinaryPacking160.java b/src/main/java/me/lemire/integercompression/BinaryPacking160.java new file mode 100644 index 0000000..275978b --- /dev/null +++ b/src/main/java/me/lemire/integercompression/BinaryPacking160.java @@ -0,0 +1,82 @@ +package me.lemire.integercompression; + +public class BinaryPacking160 implements IntegerCODEC +{ + + @Override + public void compress( + int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) + { + inlength = inlength - inlength % 160; + if (inlength == 0) { + return; + } + + out[outpos.get()] = inlength; + outpos.increment(); + int tmpoutpos = outpos.get(); + for (int s = inpos.get(); s < inpos.get() + inlength; s += 32 * 5) { + final int mbits1 = Util.maxbits32(in, s + 0); + final int mbits2 = Util.maxbits32(in, s + 32); + final int mbits3 = Util.maxbits32(in, s + 64); + final int mbits4 = Util.maxbits32(in, s + 96); + final int mbits5 = Util.maxbits32(in, s + 128); + + out[tmpoutpos++] = (mbits1 << 24) | (mbits2 << 18) | (mbits3 << 12) + | (mbits4 << 6) | (mbits5 << 0); + + BitPacking.fastpackwithoutmask(in, s + 0, out, tmpoutpos, mbits1); + tmpoutpos += mbits1; + BitPacking.fastpackwithoutmask(in, s + 32, out, tmpoutpos, mbits2); + tmpoutpos += mbits2; + BitPacking.fastpackwithoutmask(in, s + 64, out, tmpoutpos, mbits3); + tmpoutpos += mbits3; + BitPacking.fastpackwithoutmask(in, s + 96, out, tmpoutpos, mbits4); + tmpoutpos += mbits4; + BitPacking.fastpackwithoutmask(in, s + 128, out, tmpoutpos, mbits5); + tmpoutpos += mbits5; + } + inpos.add(inlength); + outpos.set(tmpoutpos); + } + + + @Override + public void uncompress( + int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) + { + if (inlength == 0) { + return; + } + final int outlength = in[inpos.get()]; + inpos.increment(); + int tmpinpos = inpos.get(); + for (int s = outpos.get(); s < outpos.get() + outlength; s += 32 * 5) { + int head = in[tmpinpos++]; + final int mbits1 = (head >>> 24) & 0x3F; + final int mbits2 = (head >>> 18) & 0x3F; + final int mbits3 = (head >>> 12) & 0x3F; + final int mbits4 = (head >>> 6) & 0x3F; + final int mbits5 = (head >>> 0) & 0x3F; + BitPacking.fastunpack(in, tmpinpos, out, s + 0, mbits1); + tmpinpos += mbits1; + BitPacking.fastunpack(in, tmpinpos, out, s + 32, mbits2); + tmpinpos += mbits2; + BitPacking.fastunpack(in, tmpinpos, out, s + 64, mbits3); + tmpinpos += mbits3; + BitPacking.fastunpack(in, tmpinpos, out, s + 96, mbits4); + tmpinpos += mbits4; + BitPacking.fastunpack(in, tmpinpos, out, s + 128, mbits5); + tmpinpos += mbits5; + } + outpos.add(outlength); + inpos.set(tmpinpos); + } + + @Override + public String toString() { + return this.getClass().getSimpleName(); + } +} From ecad0358816e368e2c1e2caf2ea40e97a5b188a5 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Fri, 27 Sep 2013 01:41:35 +0900 Subject: [PATCH 097/412] performance tuning --- .../integercompression/BinaryPacking160.java | 63 ++++++++++--------- .../integercompression/BinaryPacking2.java | 4 ++ 2 files changed, 39 insertions(+), 28 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/BinaryPacking160.java b/src/main/java/me/lemire/integercompression/BinaryPacking160.java index 275978b..7fa71a2 100644 --- a/src/main/java/me/lemire/integercompression/BinaryPacking160.java +++ b/src/main/java/me/lemire/integercompression/BinaryPacking160.java @@ -1,44 +1,50 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + */ package me.lemire.integercompression; public class BinaryPacking160 implements IntegerCODEC { + public final static int CHUNK_SIZE = 160; @Override public void compress( int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = inlength - inlength % 160; + inlength = inlength - inlength % CHUNK_SIZE; if (inlength == 0) { return; } - out[outpos.get()] = inlength; - outpos.increment(); - int tmpoutpos = outpos.get(); - for (int s = inpos.get(); s < inpos.get() + inlength; s += 32 * 5) { - final int mbits1 = Util.maxbits32(in, s + 0); - final int mbits2 = Util.maxbits32(in, s + 32); - final int mbits3 = Util.maxbits32(in, s + 64); - final int mbits4 = Util.maxbits32(in, s + 96); - final int mbits5 = Util.maxbits32(in, s + 128); + int op = outpos.get(); + out[op++] = inlength; + for (int ip = inpos.get(); ip < inpos.get() + inlength; + ip += CHUNK_SIZE) + { + final int mbits1 = Util.maxbits32(in, ip + 0); + final int mbits2 = Util.maxbits32(in, ip + 32); + final int mbits3 = Util.maxbits32(in, ip + 64); + final int mbits4 = Util.maxbits32(in, ip + 96); + final int mbits5 = Util.maxbits32(in, ip + 128); - out[tmpoutpos++] = (mbits1 << 24) | (mbits2 << 18) | (mbits3 << 12) + out[op++] = (mbits1 << 24) | (mbits2 << 18) | (mbits3 << 12) | (mbits4 << 6) | (mbits5 << 0); - BitPacking.fastpackwithoutmask(in, s + 0, out, tmpoutpos, mbits1); - tmpoutpos += mbits1; - BitPacking.fastpackwithoutmask(in, s + 32, out, tmpoutpos, mbits2); - tmpoutpos += mbits2; - BitPacking.fastpackwithoutmask(in, s + 64, out, tmpoutpos, mbits3); - tmpoutpos += mbits3; - BitPacking.fastpackwithoutmask(in, s + 96, out, tmpoutpos, mbits4); - tmpoutpos += mbits4; - BitPacking.fastpackwithoutmask(in, s + 128, out, tmpoutpos, mbits5); - tmpoutpos += mbits5; + BitPacking.fastpackwithoutmask(in, ip + 0, out, op, mbits1); + op += mbits1; + BitPacking.fastpackwithoutmask(in, ip + 32, out, op, mbits2); + op += mbits2; + BitPacking.fastpackwithoutmask(in, ip + 64, out, op, mbits3); + op += mbits3; + BitPacking.fastpackwithoutmask(in, ip + 96, out, op, mbits4); + op += mbits4; + BitPacking.fastpackwithoutmask(in, ip + 128, out, op, mbits5); + op += mbits5; } inpos.add(inlength); - outpos.set(tmpoutpos); + outpos.set(op); } @@ -53,13 +59,14 @@ public void uncompress( final int outlength = in[inpos.get()]; inpos.increment(); int tmpinpos = inpos.get(); - for (int s = outpos.get(); s < outpos.get() + outlength; s += 32 * 5) { + for (int s = outpos.get(), e = s + outlength; s < e; s += CHUNK_SIZE) + { int head = in[tmpinpos++]; - final int mbits1 = (head >>> 24) & 0x3F; - final int mbits2 = (head >>> 18) & 0x3F; - final int mbits3 = (head >>> 12) & 0x3F; - final int mbits4 = (head >>> 6) & 0x3F; - final int mbits5 = (head >>> 0) & 0x3F; + final int mbits1 = (head >> 24) & 0x3F; + final int mbits2 = (head >> 18) & 0x3F; + final int mbits3 = (head >> 12) & 0x3F; + final int mbits4 = (head >> 6) & 0x3F; + final int mbits5 = (head >> 0) & 0x3F; BitPacking.fastunpack(in, tmpinpos, out, s + 0, mbits1); tmpinpos += mbits1; BitPacking.fastunpack(in, tmpinpos, out, s + 32, mbits2); diff --git a/src/main/java/me/lemire/integercompression/BinaryPacking2.java b/src/main/java/me/lemire/integercompression/BinaryPacking2.java index dc1a47a..a0e8c21 100644 --- a/src/main/java/me/lemire/integercompression/BinaryPacking2.java +++ b/src/main/java/me/lemire/integercompression/BinaryPacking2.java @@ -1,3 +1,7 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + */ package me.lemire.integercompression; public final class BinaryPacking2 extends BinaryPacking { From 1645ecf3fe57e805d72439d4a0eb7ce99d9d026f Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Fri, 27 Sep 2013 01:51:09 +0900 Subject: [PATCH 098/412] revert variable name --- .../integercompression/BinaryPacking160.java | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/BinaryPacking160.java b/src/main/java/me/lemire/integercompression/BinaryPacking160.java index 7fa71a2..6776589 100644 --- a/src/main/java/me/lemire/integercompression/BinaryPacking160.java +++ b/src/main/java/me/lemire/integercompression/BinaryPacking160.java @@ -20,27 +20,26 @@ public void compress( int op = outpos.get(); out[op++] = inlength; - for (int ip = inpos.get(); ip < inpos.get() + inlength; - ip += CHUNK_SIZE) + for (int s = inpos.get(); s < inpos.get() + inlength; s += CHUNK_SIZE) { - final int mbits1 = Util.maxbits32(in, ip + 0); - final int mbits2 = Util.maxbits32(in, ip + 32); - final int mbits3 = Util.maxbits32(in, ip + 64); - final int mbits4 = Util.maxbits32(in, ip + 96); - final int mbits5 = Util.maxbits32(in, ip + 128); + final int mbits1 = Util.maxbits32(in, s + 0); + final int mbits2 = Util.maxbits32(in, s + 32); + final int mbits3 = Util.maxbits32(in, s + 64); + final int mbits4 = Util.maxbits32(in, s + 96); + final int mbits5 = Util.maxbits32(in, s + 128); out[op++] = (mbits1 << 24) | (mbits2 << 18) | (mbits3 << 12) | (mbits4 << 6) | (mbits5 << 0); - BitPacking.fastpackwithoutmask(in, ip + 0, out, op, mbits1); + BitPacking.fastpackwithoutmask(in, s + 0, out, op, mbits1); op += mbits1; - BitPacking.fastpackwithoutmask(in, ip + 32, out, op, mbits2); + BitPacking.fastpackwithoutmask(in, s + 32, out, op, mbits2); op += mbits2; - BitPacking.fastpackwithoutmask(in, ip + 64, out, op, mbits3); + BitPacking.fastpackwithoutmask(in, s + 64, out, op, mbits3); op += mbits3; - BitPacking.fastpackwithoutmask(in, ip + 96, out, op, mbits4); + BitPacking.fastpackwithoutmask(in, s + 96, out, op, mbits4); op += mbits4; - BitPacking.fastpackwithoutmask(in, ip + 128, out, op, mbits5); + BitPacking.fastpackwithoutmask(in, s + 128, out, op, mbits5); op += mbits5; } inpos.add(inlength); From dadca964b1dc694f3a10aa3b5fb4b6caa9ed35bf Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Fri, 27 Sep 2013 15:45:06 +0900 Subject: [PATCH 099/412] implement Delta+Zigzag BinaryPacking --- .../BenchmarkOffsettedSeries.java | 3 +- .../DeltaZigzagBinaryPacking.java | 103 +++++++++++++++ .../DeltaZigzagEncoding.java | 122 ++++++++++++++++++ .../lemire/integercompression/BasicTest.java | 16 +++ .../DeltaZigzagEncodingTest.java | 79 ++++++++++++ 5 files changed, 322 insertions(+), 1 deletion(-) create mode 100644 src/main/java/me/lemire/integercompression/DeltaZigzagBinaryPacking.java create mode 100644 src/main/java/me/lemire/integercompression/DeltaZigzagEncoding.java create mode 100644 src/test/java/me/lemire/integercompression/DeltaZigzagEncodingTest.java diff --git a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java index ae4bcc8..9f44700 100644 --- a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java +++ b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java @@ -33,9 +33,10 @@ public void run(PrintWriter csvWriter, int count, int length) new BinaryPacking(), new BinaryPacking2(), new BinaryPacking160(), - new FastPFOR(), + new DeltaZigzagBinaryPacking(), new IntegratedBinaryPacking(), new XorBinaryPacking(), + new FastPFOR(), }; csvWriter.format("\"Dataset\",\"CODEC\",\"Bits per int\"," + diff --git a/src/main/java/me/lemire/integercompression/DeltaZigzagBinaryPacking.java b/src/main/java/me/lemire/integercompression/DeltaZigzagBinaryPacking.java new file mode 100644 index 0000000..33c6b20 --- /dev/null +++ b/src/main/java/me/lemire/integercompression/DeltaZigzagBinaryPacking.java @@ -0,0 +1,103 @@ +/* + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + */ + +package me.lemire.integercompression; + +public final class DeltaZigzagBinaryPacking implements IntegerCODEC { + + public static final int BLOCK_LENGTH = 128; + + @Override + public void compress( + int[] inBuf, IntWrapper inPos, int inLen, + int[] outBuf, IntWrapper outPos) + { + inLen = inLen - inLen % BLOCK_LENGTH; + if (inLen == 0) { + return; + } + + outBuf[outPos.get()] = inLen; + outPos.increment(); + + DeltaZigzagEncoding.Encoder ctx = new DeltaZigzagEncoding.Encoder(); + int[] work = new int[BLOCK_LENGTH]; + + int op = outPos.get(); + int ip = inPos.get(); + final int inPosLast = ip + inLen; + for (; ip < inPosLast; ip += BLOCK_LENGTH) { + ctx.encodeArray(inBuf, ip, BLOCK_LENGTH, work); + final int bits1 = Util.maxbits32(work, 0); + final int bits2 = Util.maxbits32(work, 32); + final int bits3 = Util.maxbits32(work, 64); + final int bits4 = Util.maxbits32(work, 96); + outBuf[op++] = (bits1 << 24) | (bits2 << 16) | + (bits3 << 8) | (bits4 << 0); + op += pack(work, 0, outBuf, op, bits1); + op += pack(work, 32, outBuf, op, bits2); + op += pack(work, 64, outBuf, op, bits3); + op += pack(work, 96, outBuf, op, bits4); + } + + inPos.add(inLen); + outPos.set(op); + } + + @Override + public void uncompress( + int[] inBuf, IntWrapper inPos, int inLen, + int[] outBuf, IntWrapper outPos) + { + if (inLen == 0) { + return; + } + + final int outLen = inBuf[inPos.get()]; + inPos.increment(); + + DeltaZigzagEncoding.Decoder ctx = new DeltaZigzagEncoding.Decoder(); + int[] work = new int[BLOCK_LENGTH]; + + int ip = inPos.get(); + int op = outPos.get(); + final int outPosLast = op + outLen; + for (; op < outPosLast; op += BLOCK_LENGTH) { + final int bits1 = (inBuf[ip] >>> 24); + final int bits2 = (inBuf[ip] >>> 16) & 0xFF; + final int bits3 = (inBuf[ip] >>> 8) & 0xFF; + final int bits4 = (inBuf[ip] >>> 0) & 0xFF; + ++ip; + ip += unpack(inBuf, ip, work, 0, bits1); + ip += unpack(inBuf, ip, work, 32, bits2); + ip += unpack(inBuf, ip, work, 64, bits3); + ip += unpack(inBuf, ip, work, 96, bits4); + ctx.decodeArray(work, 0, BLOCK_LENGTH, outBuf, op); + } + + outPos.add(outLen); + inPos.set(ip); + } + + private static int pack(int[] inBuf, int inOff, + int[] outBuf, int outOff, int validBits) + { + BitPacking.fastpackwithoutmask(inBuf, inOff, outBuf, outOff, + validBits); + return validBits; + } + + private static int unpack(int[] inBuf, int inOff, + int[] outBuf, int outOff, int validBits) + { + BitPacking.fastunpack(inBuf, inOff, outBuf, outOff, validBits); + return validBits; + } + + @Override + public String toString() { + return this.getClass().getSimpleName(); + } +} diff --git a/src/main/java/me/lemire/integercompression/DeltaZigzagEncoding.java b/src/main/java/me/lemire/integercompression/DeltaZigzagEncoding.java new file mode 100644 index 0000000..fcd272a --- /dev/null +++ b/src/main/java/me/lemire/integercompression/DeltaZigzagEncoding.java @@ -0,0 +1,122 @@ +/* + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + */ +package me.lemire.integercompression; + +public final class DeltaZigzagEncoding { + + public static class Context { + protected int contextValue; + + protected Context(int contextValue) { + this.contextValue = contextValue; + } + + public void setContextValue(int contextValue) { + this.contextValue = contextValue; + } + + public int getContextValue() { + return this.contextValue; + } + } + + public static class Encoder extends Context { + public Encoder(int contextValue) { + super(contextValue); + } + + public Encoder() { + super(0); + } + + public int encodeInt(int value) { + int n = value - this.contextValue; + this.contextValue = value; + return (n << 1) ^ (n >> 31); + } + + public int[] encodeArray(int[] src, int srcoff, int length, + int[] dst, int dstoff) + { + return encodeArray1(src, srcoff, length, dst, dstoff); + } + + public int[] encodeArray(int[] src, int srcoff, int length, + int[] dst) + { + return encodeArray(src, srcoff, length, dst, 0); + } + + public int[] encodeArray(int[] src, int offset, int length) { + return encodeArray(src, offset, length, new int[length], 0); + } + + public int[] encodeArray(int[] src) { + return encodeArray(src, 0, src.length, new int[src.length], 0); + } + + private int[] encodeArray1(int[] src, int srcoff, int length, + int[] dst, int dstoff) + { + for (int i = 0; i < length; ++i) { + dst[dstoff + i] = encodeInt(src[srcoff + i]); + } + return dst; + } + + private int[] encodeArray2(int[] src, int srcoff, int length, + int[] dst, int dstoff) + { + int ctx = this.contextValue; + for (int i = 0; i < length; ++i) { + int n = src[srcoff + i] - ctx; + ctx = src[srcoff + i]; + dst[dstoff + i] = (n << 1) ^ (n >> 31); + } + this.contextValue = ctx; + return dst; + } + } + + public static class Decoder extends Context { + public Decoder(int contextValue) { + super(contextValue); + } + + public Decoder() { + super(0); + } + + public int decodeInt(int value) { + int n = (value >> 1) ^ ((value & 1) * -1); + n += this.contextValue; + this.contextValue = n; + return n; + } + + public int[] decodeArray(int[] src, int srcoff, int length, + int[] dst, int dstoff) + { + for (int i = 0; i < length; ++i) { + dst[dstoff + i] = decodeInt(src[srcoff + i]); + } + return dst; + } + + public int[] decodeArray(int[] src, int srcoff, int length, + int[] dst) + { + return decodeArray(src, srcoff, length, dst, 0); + } + + public int[] decodeArray(int[] src, int offset, int length) { + return decodeArray(src, offset, length, new int[length], 0); + } + + public int[] decodeArray(int[] src) { + return decodeArray(src, 0, src.length); + } + } +} diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 2ff17ec..49e5a7f 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -16,6 +16,22 @@ public class BasicTest { + @Test + public void checkDeltaZigzagPacking() { + DeltaZigzagBinaryPacking codec = new DeltaZigzagBinaryPacking(); + testZeroInZeroOut(codec); + testSpurious(codec); + + IntegerCODEC compo = new Composition( + new DeltaZigzagBinaryPacking(), + new VariableByte()); + testZeroInZeroOut(compo); + testUnsorted(compo); + test(compo, 5, 10); + test(compo, 5, 14); + test(compo, 2, 18); + } + @Test public void checkXorBinaryPacking() { testZeroInZeroOut(new XorBinaryPacking()); diff --git a/src/test/java/me/lemire/integercompression/DeltaZigzagEncodingTest.java b/src/test/java/me/lemire/integercompression/DeltaZigzagEncodingTest.java new file mode 100644 index 0000000..c0aba58 --- /dev/null +++ b/src/test/java/me/lemire/integercompression/DeltaZigzagEncodingTest.java @@ -0,0 +1,79 @@ +/* + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + */ +package me.lemire.integercompression; + +import org.junit.Test; +import static org.junit.Assert.*; + +public class DeltaZigzagEncodingTest { + + public static int zigzagEncode(DeltaZigzagEncoding.Encoder e, int value) { + e.setContextValue(0); + return e.encodeInt(value); + } + + public static int zigzagDecode(DeltaZigzagEncoding.Decoder d, int value) { + d.setContextValue(0); + return d.decodeInt(value); + } + + public static void checkEncode( + DeltaZigzagEncoding.Encoder e, + int[] data, + int[] expected) + { + assertArrayEquals(expected, e.encodeArray(data)); + assertEquals(data[data.length - 1], e.getContextValue()); + } + + public static void checkDecode( + DeltaZigzagEncoding.Decoder d, + int[] data, + int[] expected) + { + int[] r = d.decodeArray(data); + assertArrayEquals(expected, r); + assertEquals(r[r.length - 1], d.getContextValue()); + } + + @Test + public void checkZigzagEncode() { + DeltaZigzagEncoding.Encoder e = new DeltaZigzagEncoding.Encoder(); + assertEquals(0, zigzagEncode(e, 0)); + assertEquals(2, zigzagEncode(e, 1)); + assertEquals(4, zigzagEncode(e, 2)); + assertEquals(6, zigzagEncode(e, 3)); + assertEquals(1, zigzagEncode(e, -1)); + assertEquals(3, zigzagEncode(e, -2)); + assertEquals(5, zigzagEncode(e, -3)); + } + + @Test + public void checkZigzagDecoder() { + DeltaZigzagEncoding.Decoder d = new DeltaZigzagEncoding.Decoder(); + assertEquals( 0, zigzagDecode(d, 0)); + assertEquals(-1, zigzagDecode(d, 1)); + assertEquals( 1, zigzagDecode(d, 2)); + assertEquals(-2, zigzagDecode(d, 3)); + assertEquals( 2, zigzagDecode(d, 4)); + assertEquals(-3, zigzagDecode(d, 5)); + } + + @Test + public void checkEncodeSimple() { + DeltaZigzagEncoding.Encoder e = new DeltaZigzagEncoding.Encoder(); + checkEncode(e, + new int[]{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, + new int[]{ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2 }); + } + + @Test + public void checkDecodeSimple() { + DeltaZigzagEncoding.Decoder d = new DeltaZigzagEncoding.Decoder(); + checkDecode(d, + new int[]{ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, + new int[]{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }); + } +} From 6fc27d83fc73c75b98a1095e8c120726b773fffc Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Fri, 27 Sep 2013 16:20:23 +0900 Subject: [PATCH 100/412] brush up --- .../DeltaZigzagBinaryPacking.java | 14 ++++------ .../DeltaZigzagEncoding.java | 27 +++---------------- 2 files changed, 9 insertions(+), 32 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/DeltaZigzagBinaryPacking.java b/src/main/java/me/lemire/integercompression/DeltaZigzagBinaryPacking.java index 33c6b20..6abfb61 100644 --- a/src/main/java/me/lemire/integercompression/DeltaZigzagBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/DeltaZigzagBinaryPacking.java @@ -65,15 +65,11 @@ public void uncompress( int op = outPos.get(); final int outPosLast = op + outLen; for (; op < outPosLast; op += BLOCK_LENGTH) { - final int bits1 = (inBuf[ip] >>> 24); - final int bits2 = (inBuf[ip] >>> 16) & 0xFF; - final int bits3 = (inBuf[ip] >>> 8) & 0xFF; - final int bits4 = (inBuf[ip] >>> 0) & 0xFF; - ++ip; - ip += unpack(inBuf, ip, work, 0, bits1); - ip += unpack(inBuf, ip, work, 32, bits2); - ip += unpack(inBuf, ip, work, 64, bits3); - ip += unpack(inBuf, ip, work, 96, bits4); + int n = inBuf[ip++]; + ip += unpack(inBuf, ip, work, 0, (n >> 24) & 0x3F); + ip += unpack(inBuf, ip, work, 32, (n >> 16) & 0x3F); + ip += unpack(inBuf, ip, work, 64, (n >> 8) & 0x3F); + ip += unpack(inBuf, ip, work, 96, (n >> 0) & 0x3F); ctx.decodeArray(work, 0, BLOCK_LENGTH, outBuf, op); } diff --git a/src/main/java/me/lemire/integercompression/DeltaZigzagEncoding.java b/src/main/java/me/lemire/integercompression/DeltaZigzagEncoding.java index fcd272a..9cf97e9 100644 --- a/src/main/java/me/lemire/integercompression/DeltaZigzagEncoding.java +++ b/src/main/java/me/lemire/integercompression/DeltaZigzagEncoding.java @@ -40,7 +40,10 @@ public int encodeInt(int value) { public int[] encodeArray(int[] src, int srcoff, int length, int[] dst, int dstoff) { - return encodeArray1(src, srcoff, length, dst, dstoff); + for (int i = 0; i < length; ++i) { + dst[dstoff + i] = encodeInt(src[srcoff + i]); + } + return dst; } public int[] encodeArray(int[] src, int srcoff, int length, @@ -56,28 +59,6 @@ public int[] encodeArray(int[] src, int offset, int length) { public int[] encodeArray(int[] src) { return encodeArray(src, 0, src.length, new int[src.length], 0); } - - private int[] encodeArray1(int[] src, int srcoff, int length, - int[] dst, int dstoff) - { - for (int i = 0; i < length; ++i) { - dst[dstoff + i] = encodeInt(src[srcoff + i]); - } - return dst; - } - - private int[] encodeArray2(int[] src, int srcoff, int length, - int[] dst, int dstoff) - { - int ctx = this.contextValue; - for (int i = 0; i < length; ++i) { - int n = src[srcoff + i] - ctx; - ctx = src[srcoff + i]; - dst[dstoff + i] = (n << 1) ^ (n >> 31); - } - this.contextValue = ctx; - return dst; - } } public static class Decoder extends Context { From 81e092925eb4f914c0fae1882d0d01bb0919e013 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 1 Oct 2013 17:42:12 +0900 Subject: [PATCH 101/412] add benchmark with sine wave data chunks --- .../BenchmarkOffsettedSeries.java | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java index 9f44700..6523cd0 100644 --- a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java +++ b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java @@ -46,6 +46,54 @@ public void run(PrintWriter csvWriter, int count, int length) DEFAULT_RANGE); benchmark(csvWriter, codecs, count, length, DEFAULT_MEAN >> 5, DEFAULT_RANGE); + + IntegerCODEC[] codecs2 = { + new BinaryPacking(), + new DeltaZigzagBinaryPacking(), + new IntegratedBinaryPacking(), + new XorBinaryPacking(), + new FastPFOR(), + }; + + int freq = length / 4; + benchmarkSine(csvWriter, codecs2, count, length, + DEFAULT_MEAN >> 0, DEFAULT_RANGE >> 0, freq); + benchmarkSine(csvWriter, codecs2, count, length, + DEFAULT_MEAN >> 5, DEFAULT_RANGE >> 0, freq); + benchmarkSine(csvWriter, codecs2, count, length, + DEFAULT_MEAN >> 10, DEFAULT_RANGE >> 0, freq); + benchmarkSine(csvWriter, codecs2, count, length, + DEFAULT_MEAN >> 0, DEFAULT_RANGE >> 2, freq); + benchmarkSine(csvWriter, codecs2, count, length, + DEFAULT_MEAN >> 5, DEFAULT_RANGE >> 2, freq); + benchmarkSine(csvWriter, codecs2, count, length, + DEFAULT_MEAN >> 10, DEFAULT_RANGE >> 2, freq); + benchmarkSine(csvWriter, codecs2, count, length, + DEFAULT_MEAN >> 0, DEFAULT_RANGE >> 4, freq); + benchmarkSine(csvWriter, codecs2, count, length, + DEFAULT_MEAN >> 5, DEFAULT_RANGE >> 4, freq); + benchmarkSine(csvWriter, codecs2, count, length, + DEFAULT_MEAN >> 10, DEFAULT_RANGE >> 4, freq); + } + + private void benchmarkSine( + PrintWriter csvWriter, + IntegerCODEC[] codecs, + int count, + int length, + int mean, + int range, + int freq) + { + String dataProp = String.format("(mean=%1$d range=%2$d freq=%2$d)", + mean, range, freq); + int[][] data = generateSineDataChunks(0, count, length, mean, range, + freq); + int[][] delta = deltaDataChunks(data); + benchmark(csvWriter, "Sine " + dataProp, + codecs, data, DEFAULT_REPEAT, DEFAULT_WARMUP); + benchmark(csvWriter, "Sine+delta " + dataProp, + codecs, data, DEFAULT_REPEAT, DEFAULT_WARMUP); } private void benchmark( @@ -186,6 +234,27 @@ public static int getMaxLen(int[][] data) { return maxLen; } + public static int[][] generateSineDataChunks( + long seed, + int count, + int length, + int mean, + int range, + int freq) + { + int[][] chunks = new int[count][]; + Random r = new Random(seed); + for (int i = 0; i < count; ++i) { + int[] chunk = chunks[i] = new int[length]; + int phase = r.nextInt(2 * freq); + for (int j = 0; j < length; ++j) { + double angle = 2.0 * Math.PI * (j + phase) / freq; + chunk[j] = (int)(mean + Math.sin(angle) * range); + } + } + return chunks; + } + public static int[][] generateDataChunks( long seed, int count, From 302e42c9be1db16aaf40e3f41d3ea4fe712cfacb Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 8 Oct 2013 11:33:33 +0900 Subject: [PATCH 102/412] Add JustCopy for comparison --- .../BenchmarkOffsettedSeries.java | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java index 6523cd0..fbd0e6c 100644 --- a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java +++ b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java @@ -30,13 +30,14 @@ public BenchmarkOffsettedSeries() { public void run(PrintWriter csvWriter, int count, int length) { IntegerCODEC[] codecs = { - new BinaryPacking(), - new BinaryPacking2(), - new BinaryPacking160(), - new DeltaZigzagBinaryPacking(), - new IntegratedBinaryPacking(), - new XorBinaryPacking(), - new FastPFOR(), + new JustCopy(), + new BinaryPacking(), + //new BinaryPacking2(), + //new BinaryPacking160(), + new DeltaZigzagBinaryPacking(), + new IntegratedBinaryPacking(), + new XorBinaryPacking(), + new FastPFOR(), }; csvWriter.format("\"Dataset\",\"CODEC\",\"Bits per int\"," + @@ -48,11 +49,12 @@ public void run(PrintWriter csvWriter, int count, int length) DEFAULT_RANGE); IntegerCODEC[] codecs2 = { - new BinaryPacking(), - new DeltaZigzagBinaryPacking(), - new IntegratedBinaryPacking(), - new XorBinaryPacking(), - new FastPFOR(), + new JustCopy(), + new BinaryPacking(), + new DeltaZigzagBinaryPacking(), + new IntegratedBinaryPacking(), + new XorBinaryPacking(), + new FastPFOR(), }; int freq = length / 4; From 53ef07a406bd8bb635be9be70b106964355e1719 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 8 Oct 2013 12:35:48 +0900 Subject: [PATCH 103/412] impl. DeltaZigzagVariableByte#compress --- .../DeltaZigzagVariableByte.java | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 src/main/java/me/lemire/integercompression/DeltaZigzagVariableByte.java diff --git a/src/main/java/me/lemire/integercompression/DeltaZigzagVariableByte.java b/src/main/java/me/lemire/integercompression/DeltaZigzagVariableByte.java new file mode 100644 index 0000000..e8cdead --- /dev/null +++ b/src/main/java/me/lemire/integercompression/DeltaZigzagVariableByte.java @@ -0,0 +1,100 @@ +/* + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + */ + +package me.lemire.integercompression; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +public final class DeltaZigzagVariableByte implements IntegerCODEC { + + @Override + public String toString() { + return DeltaZigzagVariableByte.class.getSimpleName(); + } + + @Override + public void compress( + int[] inBuf, IntWrapper inPos, int inLen, + int[] outBuf, IntWrapper outPos) + { + if (inLen == 0) { + return; + } + + ByteBuffer byteBuf = ByteBuffer.allocateDirect(inLen * 5); + DeltaZigzagEncoding.Encoder ctx = new DeltaZigzagEncoding.Encoder(); + + // Delta+Zigzag+VariableByte encoding. + int ip = inPos.get(); + final int inPosLast = ip + inLen; + for (; ip < inPosLast; ++ip) { + // Filter with delta+zigzag encoding. + int n = ctx.encodeInt(inBuf[ip]); + // Variable byte encoding. + switch (Integer.numberOfLeadingZeros(n)) { + case 0: case 1: case 2: case 3: + byteBuf.put((byte)(((n >>> 28) & 0x7F) | 0x80)); + // through. + case 4: case 5: case 6: case 7: case 8: case 9: case 10: + byteBuf.put((byte)(((n >>> 21) & 0x7F) | 0x80)); + // through. + case 11: case 12: case 13: case 14: case 15: case 16: case 17: + byteBuf.put((byte)(((n >>> 14) & 0x7F) | 0x80)); + // through. + case 18: case 19: case 20: case 21: case 22: case 23: case 24: + byteBuf.put((byte)(((n >>> 7) & 0x7F) | 0x80)); + // through. + default: + byteBuf.put((byte)(n & 0x7F)); + } + } + + // Padding buffer to considerable as IntBuffer. + for (int i = (4 - (byteBuf.position() % 4)) % 4; i > 0; ++i) { + byteBuf.put((byte)(0x80)); + } + + int outLen = byteBuf.position() / 4; + byteBuf.flip(); + IntBuffer intBuf = byteBuf.asIntBuffer(); + intBuf.get(outBuf, outPos.get(), outLen); + inPos.add(inLen); + outPos.add(outLen); + } + + @Override + public void uncompress( + int[] inBuf, IntWrapper inPos, int inLen, + int[] outBuf, IntWrapper outPos) + { + /* + if (inLen == 0) { + return; + } + + final int outLen = inBuf[inPos.get()]; + inPos.increment(); + + DeltaZigzagEncoding.Decoder ctx = new DeltaZigzagEncoding.Decoder(); + int[] work = new int[BLOCK_LENGTH]; + + int ip = inPos.get(); + int op = outPos.get(); + final int outPosLast = op + outLen; + for (; op < outPosLast; op += BLOCK_LENGTH) { + int n = inBuf[ip++]; + ip += unpack(inBuf, ip, work, 0, (n >> 24) & 0x3F); + ip += unpack(inBuf, ip, work, 32, (n >> 16) & 0x3F); + ip += unpack(inBuf, ip, work, 64, (n >> 8) & 0x3F); + ip += unpack(inBuf, ip, work, 96, (n >> 0) & 0x3F); + ctx.decodeArray(work, 0, BLOCK_LENGTH, outBuf, op); + } + + outPos.add(outLen); + inPos.set(ip); + */ + } +} From ff721ca26e9188f648076b9c9e5961a6113d1eb0 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 8 Oct 2013 13:11:41 +0900 Subject: [PATCH 104/412] impl. DeltaZigzagVariableByte#uncompress and test --- .../DeltaZigzagVariableByte.java | 49 ++++++++++--------- .../lemire/integercompression/BasicTest.java | 9 ++++ 2 files changed, 36 insertions(+), 22 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/DeltaZigzagVariableByte.java b/src/main/java/me/lemire/integercompression/DeltaZigzagVariableByte.java index e8cdead..eea1e96 100644 --- a/src/main/java/me/lemire/integercompression/DeltaZigzagVariableByte.java +++ b/src/main/java/me/lemire/integercompression/DeltaZigzagVariableByte.java @@ -24,7 +24,7 @@ public void compress( return; } - ByteBuffer byteBuf = ByteBuffer.allocateDirect(inLen * 5); + ByteBuffer byteBuf = ByteBuffer.allocateDirect(inLen * 5 + 3); DeltaZigzagEncoding.Encoder ctx = new DeltaZigzagEncoding.Encoder(); // Delta+Zigzag+VariableByte encoding. @@ -53,13 +53,19 @@ public void compress( } // Padding buffer to considerable as IntBuffer. - for (int i = (4 - (byteBuf.position() % 4)) % 4; i > 0; ++i) { + for (int i = (4 - (byteBuf.position() % 4)) % 4; i > 0; --i) { byteBuf.put((byte)(0x80)); } int outLen = byteBuf.position() / 4; byteBuf.flip(); IntBuffer intBuf = byteBuf.asIntBuffer(); + /* + System.out.println(String.format( + "inLen=%d pos=%d limit=%d outLen=%d outBuf.len=%d", + inLen, intBuf.position(), intBuf.limit(), outLen, + outBuf.length)); + */ intBuf.get(outBuf, outPos.get(), outLen); inPos.add(inLen); outPos.add(outLen); @@ -70,31 +76,30 @@ public void uncompress( int[] inBuf, IntWrapper inPos, int inLen, int[] outBuf, IntWrapper outPos) { - /* - if (inLen == 0) { - return; - } - - final int outLen = inBuf[inPos.get()]; - inPos.increment(); - DeltaZigzagEncoding.Decoder ctx = new DeltaZigzagEncoding.Decoder(); - int[] work = new int[BLOCK_LENGTH]; int ip = inPos.get(); int op = outPos.get(); - final int outPosLast = op + outLen; - for (; op < outPosLast; op += BLOCK_LENGTH) { - int n = inBuf[ip++]; - ip += unpack(inBuf, ip, work, 0, (n >> 24) & 0x3F); - ip += unpack(inBuf, ip, work, 32, (n >> 16) & 0x3F); - ip += unpack(inBuf, ip, work, 64, (n >> 8) & 0x3F); - ip += unpack(inBuf, ip, work, 96, (n >> 0) & 0x3F); - ctx.decodeArray(work, 0, BLOCK_LENGTH, outBuf, op); + int vbcNum = 0, vbcShift = 24; // Varialbe Byte Context. + final int inPosLast = ip + inLen; + while (ip < inPosLast) { + // Fetch a byte value. + int n = (inBuf[ip] >>> vbcShift) & 0xFF; + if (vbcShift > 0) { + vbcShift -= 8; + } else { + vbcShift = 24; + ip++; + } + // Decode variable byte and delta+zigzag. + vbcNum = (vbcNum << 7) + (n & 0x7F); + if ((n & 0x80) == 0) { + outBuf[op++] = ctx.decodeInt(vbcNum); + vbcNum = 0; + } } - outPos.add(outLen); - inPos.set(ip); - */ + outPos.set(op); + inPos.set(inPosLast); } } diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 49e5a7f..a641a4d 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -16,6 +16,15 @@ public class BasicTest { + @Test + public void checkDeltaZigzagVB() { + DeltaZigzagVariableByte codec = new DeltaZigzagVariableByte(); + testZeroInZeroOut(codec); + test(codec, 5, 10); + test(codec, 5, 14); + test(codec, 2, 18); + } + @Test public void checkDeltaZigzagPacking() { DeltaZigzagBinaryPacking codec = new DeltaZigzagBinaryPacking(); From 2cc41a26c713f4a9f6ace6f86cd2cb415f39470d Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Tue, 8 Oct 2013 14:40:57 +0900 Subject: [PATCH 105/412] benchmark Delta+Zigzag+VariableByte --- .../me/lemire/integercompression/BenchmarkOffsettedSeries.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java index fbd0e6c..6a8a174 100644 --- a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java +++ b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java @@ -35,6 +35,7 @@ public void run(PrintWriter csvWriter, int count, int length) //new BinaryPacking2(), //new BinaryPacking160(), new DeltaZigzagBinaryPacking(), + new DeltaZigzagVariableByte(), new IntegratedBinaryPacking(), new XorBinaryPacking(), new FastPFOR(), @@ -52,6 +53,7 @@ public void run(PrintWriter csvWriter, int count, int length) new JustCopy(), new BinaryPacking(), new DeltaZigzagBinaryPacking(), + new DeltaZigzagVariableByte(), new IntegratedBinaryPacking(), new XorBinaryPacking(), new FastPFOR(), From 13b23d6ed49431f0e641843e70a98883d442408c Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Fri, 11 Oct 2013 00:34:04 +0900 Subject: [PATCH 106/412] fixed delta zigzag decoding problem --- .../DeltaZigzagEncoding.java | 2 +- .../DeltaZigzagEncodingTest.java | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/main/java/me/lemire/integercompression/DeltaZigzagEncoding.java b/src/main/java/me/lemire/integercompression/DeltaZigzagEncoding.java index 9cf97e9..0e932f0 100644 --- a/src/main/java/me/lemire/integercompression/DeltaZigzagEncoding.java +++ b/src/main/java/me/lemire/integercompression/DeltaZigzagEncoding.java @@ -71,7 +71,7 @@ public Decoder() { } public int decodeInt(int value) { - int n = (value >> 1) ^ ((value & 1) * -1); + int n = (value >>> 1) ^ ((value << 31) >> 31); n += this.contextValue; this.contextValue = n; return n; diff --git a/src/test/java/me/lemire/integercompression/DeltaZigzagEncodingTest.java b/src/test/java/me/lemire/integercompression/DeltaZigzagEncodingTest.java index c0aba58..1429c94 100644 --- a/src/test/java/me/lemire/integercompression/DeltaZigzagEncodingTest.java +++ b/src/test/java/me/lemire/integercompression/DeltaZigzagEncodingTest.java @@ -76,4 +76,30 @@ public void checkDecodeSimple() { new int[]{ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, new int[]{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }); } + + public static class SpotChecker { + + private final static DeltaZigzagEncoding.Encoder encoder = + new DeltaZigzagEncoding.Encoder(); + + private final static DeltaZigzagEncoding.Decoder decoder = + new DeltaZigzagEncoding.Decoder(); + + public void check(int value) { + this.encoder.setContextValue(0); + this.decoder.setContextValue(0); + int value2 = this.decoder.decodeInt(this.encoder.encodeInt(value)); + assertEquals(value, value2); + } + } + + @Test + public void checkSpots() { + SpotChecker c = new SpotChecker(); + c.check(0); + c.check(1); + c.check(1375228800); + c.check(1 << 30); + c.check(1 << 31); + } } From 02da3e789d2ca5e6d45988f3757b3df6c60e1137 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Fri, 11 Oct 2013 01:15:16 +0900 Subject: [PATCH 107/412] prepare for merge --- pom.xml | 3 + .../lemire/integercompression/Benchmark.java | 152 +++++++++--------- .../BenchmarkOffsettedSeries.java | 2 - .../integercompression/BinaryPacking.java | 2 +- .../integercompression/BinaryPacking160.java | 88 ---------- .../integercompression/BinaryPacking2.java | 42 ----- .../DeltaZigzagBinaryPacking.java | 5 + .../DeltaZigzagEncoding.java | 5 + .../integercompression/PerformanceLogger.java | 5 + .../integercompression/XorBinaryPacking.java | 5 + 10 files changed, 100 insertions(+), 209 deletions(-) delete mode 100644 src/main/java/me/lemire/integercompression/BinaryPacking160.java delete mode 100644 src/main/java/me/lemire/integercompression/BinaryPacking2.java diff --git a/pom.xml b/pom.xml index f69dfa0..fa0bc6a 100644 --- a/pom.xml +++ b/pom.xml @@ -82,7 +82,10 @@ exec-maven-plugin 1.1 + me.lemire.integercompression.Benchmark + diff --git a/src/main/java/me/lemire/integercompression/Benchmark.java b/src/main/java/me/lemire/integercompression/Benchmark.java index 9d23918..f86e111 100644 --- a/src/main/java/me/lemire/integercompression/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/Benchmark.java @@ -299,10 +299,10 @@ private static void test(PrintWriter csvLog, int N, int nbr, int repeat) int[][] data = generateTestData(cdg, N, nbr, sparsity); System.out.println("# generating random data... ok."); - //testKamikaze(data, repeat, false); - //testKamikaze(data, repeat, false); - //testKamikaze(data, repeat, true); - //System.out.println(); + testKamikaze(data, repeat, false); + testKamikaze(data, repeat, false); + testKamikaze(data, repeat, true); + System.out.println(); { IntegerCODEC c = new Composition( @@ -342,20 +342,20 @@ private static void test(PrintWriter csvLog, int N, int nbr, int repeat) new IntegratedVariableByte()), data, repeat, true); System.out.println(); - //testCodec(csvLog, sparsity, new JustCopy(), data, repeat, false); - //testCodec(csvLog, sparsity, new JustCopy(), data, repeat, false); - //testCodec(csvLog, sparsity, new JustCopy(), data, repeat, true); - //System.out.println(); + testCodec(csvLog, sparsity, new JustCopy(), data, repeat, false); + testCodec(csvLog, sparsity, new JustCopy(), data, repeat, false); + testCodec(csvLog, sparsity, new JustCopy(), data, repeat, true); + System.out.println(); - //testCodec(csvLog, sparsity, new VariableByte(), data, repeat, false); - //testCodec(csvLog, sparsity, new VariableByte(), data, repeat, false); - //testCodec(csvLog, sparsity, new VariableByte(), data, repeat, true); - //System.out.println(); + testCodec(csvLog, sparsity, new VariableByte(), data, repeat, false); + testCodec(csvLog, sparsity, new VariableByte(), data, repeat, false); + testCodec(csvLog, sparsity, new VariableByte(), data, repeat, true); + System.out.println(); - //testCodec(csvLog, sparsity, new IntegratedVariableByte(), data, repeat, false); - //testCodec(csvLog, sparsity, new IntegratedVariableByte(), data, repeat, false); - //testCodec(csvLog, sparsity, new IntegratedVariableByte(), data, repeat, true); - //System.out.println(); + testCodec(csvLog, sparsity, new IntegratedVariableByte(), data, repeat, false); + testCodec(csvLog, sparsity, new IntegratedVariableByte(), data, repeat, false); + testCodec(csvLog, sparsity, new IntegratedVariableByte(), data, repeat, true); + System.out.println(); testCodec(csvLog, sparsity, new Composition(new BinaryPacking(), new VariableByte()), data, repeat, false); @@ -365,66 +365,66 @@ private static void test(PrintWriter csvLog, int N, int nbr, int repeat) data, repeat, true); System.out.println(); - //testCodec(csvLog, sparsity, new Composition(new NewPFD(), new VariableByte()), data, - // repeat, false); - //testCodec(csvLog, sparsity, new Composition(new NewPFD(), new VariableByte()), data, - // repeat, false); - //testCodec(csvLog, sparsity, new Composition(new NewPFD(), new VariableByte()), data, - // repeat, true); - //System.out.println(); - - //testCodec(csvLog, sparsity, new Composition(new NewPFDS9(), new VariableByte()), - // data, repeat, false); - //testCodec(csvLog, sparsity, new Composition(new NewPFDS9(), new VariableByte()), - // data, repeat, false); - //testCodec(csvLog, sparsity, new Composition(new NewPFDS9(), new VariableByte()), - // data, repeat, true); - //System.out.println(); - - //testCodec(csvLog, sparsity, new Composition(new NewPFDS16(), new VariableByte()), - // data, repeat, false); - //testCodec(csvLog, sparsity, new Composition(new NewPFDS16(), new VariableByte()), - // data, repeat, false); - //testCodec(csvLog, sparsity, new Composition(new NewPFDS16(), new VariableByte()), - // data, repeat, true); - //System.out.println(); - - //testCodec(csvLog, sparsity, new Composition(new OptPFD(), new VariableByte()), data, - // repeat, false); - //testCodec(csvLog, sparsity, new Composition(new OptPFD(), new VariableByte()), data, - // repeat, false); - //testCodec(csvLog, sparsity, new Composition(new OptPFD(), new VariableByte()), data, - // repeat, true); - //System.out.println(); - - //testCodec(csvLog, sparsity, new Composition(new OptPFDS9(), new VariableByte()), - // data, repeat, false); - //testCodec(csvLog, sparsity, new Composition(new OptPFDS9(), new VariableByte()), - // data, repeat, false); - //testCodec(csvLog, sparsity, new Composition(new OptPFDS9(), new VariableByte()), - // data, repeat, true); - //System.out.println(); - - //testCodec(csvLog, sparsity, new Composition(new OptPFDS16(), new VariableByte()), - // data, repeat, false); - //testCodec(csvLog, sparsity, new Composition(new OptPFDS16(), new VariableByte()), - // data, repeat, false); - //testCodec(csvLog, sparsity, new Composition(new OptPFDS16(), new VariableByte()), - // data, repeat, true); - //System.out.println(); - - //testCodec(csvLog, sparsity, new Composition(new FastPFOR(), new VariableByte()), - // data, repeat, false); - //testCodec(csvLog, sparsity, new Composition(new FastPFOR(), new VariableByte()), - // data, repeat, false); - //testCodec(csvLog, sparsity, new Composition(new FastPFOR(), new VariableByte()), - // data, repeat, true); - //System.out.println(); - - //testCodec(csvLog, sparsity, new Simple9(), data, repeat, false); - //testCodec(csvLog, sparsity, new Simple9(), data, repeat, false); - //testCodec(csvLog, sparsity, new Simple9(), data, repeat, true); - //System.out.println(); + testCodec(csvLog, sparsity, new Composition(new NewPFD(), new VariableByte()), data, + repeat, false); + testCodec(csvLog, sparsity, new Composition(new NewPFD(), new VariableByte()), data, + repeat, false); + testCodec(csvLog, sparsity, new Composition(new NewPFD(), new VariableByte()), data, + repeat, true); + System.out.println(); + + testCodec(csvLog, sparsity, new Composition(new NewPFDS9(), new VariableByte()), + data, repeat, false); + testCodec(csvLog, sparsity, new Composition(new NewPFDS9(), new VariableByte()), + data, repeat, false); + testCodec(csvLog, sparsity, new Composition(new NewPFDS9(), new VariableByte()), + data, repeat, true); + System.out.println(); + + testCodec(csvLog, sparsity, new Composition(new NewPFDS16(), new VariableByte()), + data, repeat, false); + testCodec(csvLog, sparsity, new Composition(new NewPFDS16(), new VariableByte()), + data, repeat, false); + testCodec(csvLog, sparsity, new Composition(new NewPFDS16(), new VariableByte()), + data, repeat, true); + System.out.println(); + + testCodec(csvLog, sparsity, new Composition(new OptPFD(), new VariableByte()), data, + repeat, false); + testCodec(csvLog, sparsity, new Composition(new OptPFD(), new VariableByte()), data, + repeat, false); + testCodec(csvLog, sparsity, new Composition(new OptPFD(), new VariableByte()), data, + repeat, true); + System.out.println(); + + testCodec(csvLog, sparsity, new Composition(new OptPFDS9(), new VariableByte()), + data, repeat, false); + testCodec(csvLog, sparsity, new Composition(new OptPFDS9(), new VariableByte()), + data, repeat, false); + testCodec(csvLog, sparsity, new Composition(new OptPFDS9(), new VariableByte()), + data, repeat, true); + System.out.println(); + + testCodec(csvLog, sparsity, new Composition(new OptPFDS16(), new VariableByte()), + data, repeat, false); + testCodec(csvLog, sparsity, new Composition(new OptPFDS16(), new VariableByte()), + data, repeat, false); + testCodec(csvLog, sparsity, new Composition(new OptPFDS16(), new VariableByte()), + data, repeat, true); + System.out.println(); + + testCodec(csvLog, sparsity, new Composition(new FastPFOR(), new VariableByte()), + data, repeat, false); + testCodec(csvLog, sparsity, new Composition(new FastPFOR(), new VariableByte()), + data, repeat, false); + testCodec(csvLog, sparsity, new Composition(new FastPFOR(), new VariableByte()), + data, repeat, true); + System.out.println(); + + testCodec(csvLog, sparsity, new Simple9(), data, repeat, false); + testCodec(csvLog, sparsity, new Simple9(), data, repeat, false); + testCodec(csvLog, sparsity, new Simple9(), data, repeat, true); + System.out.println(); } } } diff --git a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java index 6a8a174..2a632bb 100644 --- a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java +++ b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java @@ -32,8 +32,6 @@ public void run(PrintWriter csvWriter, int count, int length) IntegerCODEC[] codecs = { new JustCopy(), new BinaryPacking(), - //new BinaryPacking2(), - //new BinaryPacking160(), new DeltaZigzagBinaryPacking(), new DeltaZigzagVariableByte(), new IntegratedBinaryPacking(), diff --git a/src/main/java/me/lemire/integercompression/BinaryPacking.java b/src/main/java/me/lemire/integercompression/BinaryPacking.java index 5c896c8..804e0b5 100644 --- a/src/main/java/me/lemire/integercompression/BinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/BinaryPacking.java @@ -12,7 +12,7 @@ * * @author Daniel Lemire */ -public class BinaryPacking implements IntegerCODEC { +public final class BinaryPacking implements IntegerCODEC { @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { diff --git a/src/main/java/me/lemire/integercompression/BinaryPacking160.java b/src/main/java/me/lemire/integercompression/BinaryPacking160.java deleted file mode 100644 index 6776589..0000000 --- a/src/main/java/me/lemire/integercompression/BinaryPacking160.java +++ /dev/null @@ -1,88 +0,0 @@ -/** - * This code is released under the - * Apache License Version 2.0 http://www.apache.org/licenses/. - */ -package me.lemire.integercompression; - -public class BinaryPacking160 implements IntegerCODEC -{ - public final static int CHUNK_SIZE = 160; - - @Override - public void compress( - int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) - { - inlength = inlength - inlength % CHUNK_SIZE; - if (inlength == 0) { - return; - } - - int op = outpos.get(); - out[op++] = inlength; - for (int s = inpos.get(); s < inpos.get() + inlength; s += CHUNK_SIZE) - { - final int mbits1 = Util.maxbits32(in, s + 0); - final int mbits2 = Util.maxbits32(in, s + 32); - final int mbits3 = Util.maxbits32(in, s + 64); - final int mbits4 = Util.maxbits32(in, s + 96); - final int mbits5 = Util.maxbits32(in, s + 128); - - out[op++] = (mbits1 << 24) | (mbits2 << 18) | (mbits3 << 12) - | (mbits4 << 6) | (mbits5 << 0); - - BitPacking.fastpackwithoutmask(in, s + 0, out, op, mbits1); - op += mbits1; - BitPacking.fastpackwithoutmask(in, s + 32, out, op, mbits2); - op += mbits2; - BitPacking.fastpackwithoutmask(in, s + 64, out, op, mbits3); - op += mbits3; - BitPacking.fastpackwithoutmask(in, s + 96, out, op, mbits4); - op += mbits4; - BitPacking.fastpackwithoutmask(in, s + 128, out, op, mbits5); - op += mbits5; - } - inpos.add(inlength); - outpos.set(op); - } - - - @Override - public void uncompress( - int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) - { - if (inlength == 0) { - return; - } - final int outlength = in[inpos.get()]; - inpos.increment(); - int tmpinpos = inpos.get(); - for (int s = outpos.get(), e = s + outlength; s < e; s += CHUNK_SIZE) - { - int head = in[tmpinpos++]; - final int mbits1 = (head >> 24) & 0x3F; - final int mbits2 = (head >> 18) & 0x3F; - final int mbits3 = (head >> 12) & 0x3F; - final int mbits4 = (head >> 6) & 0x3F; - final int mbits5 = (head >> 0) & 0x3F; - BitPacking.fastunpack(in, tmpinpos, out, s + 0, mbits1); - tmpinpos += mbits1; - BitPacking.fastunpack(in, tmpinpos, out, s + 32, mbits2); - tmpinpos += mbits2; - BitPacking.fastunpack(in, tmpinpos, out, s + 64, mbits3); - tmpinpos += mbits3; - BitPacking.fastunpack(in, tmpinpos, out, s + 96, mbits4); - tmpinpos += mbits4; - BitPacking.fastunpack(in, tmpinpos, out, s + 128, mbits5); - tmpinpos += mbits5; - } - outpos.add(outlength); - inpos.set(tmpinpos); - } - - @Override - public String toString() { - return this.getClass().getSimpleName(); - } -} diff --git a/src/main/java/me/lemire/integercompression/BinaryPacking2.java b/src/main/java/me/lemire/integercompression/BinaryPacking2.java deleted file mode 100644 index a0e8c21..0000000 --- a/src/main/java/me/lemire/integercompression/BinaryPacking2.java +++ /dev/null @@ -1,42 +0,0 @@ -/** - * This code is released under the - * Apache License Version 2.0 http://www.apache.org/licenses/. - */ -package me.lemire.integercompression; - -public final class BinaryPacking2 extends BinaryPacking { - - @Override - public void compress( - int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) - { - inlength = inlength - inlength % 128; - if (inlength == 0) { - return; - } - - out[outpos.get()] = inlength; - outpos.increment(); - int tmpoutpos = outpos.get(); - for (int s = inpos.get(); s < inpos.get() + inlength; s += 32 * 4) { - final int mbits1 = Util.maxbits32(in, s); - final int mbits2 = Util.maxbits32(in, s + 32); - final int mbits3 = Util.maxbits32(in, s + 2 * 32); - final int mbits4 = Util.maxbits32(in, s + 3 * 32); - out[tmpoutpos++] = (mbits1 << 24) | (mbits2 << 16) | (mbits3 << 8) - | (mbits4); - BitPacking.fastpackwithoutmask(in, s, out, tmpoutpos, mbits1); - tmpoutpos += mbits1; - BitPacking.fastpackwithoutmask(in, s + 32, out, tmpoutpos, mbits2); - tmpoutpos += mbits2; - BitPacking.fastpackwithoutmask(in, s + 2 * 32, out, tmpoutpos, mbits3); - tmpoutpos += mbits3; - BitPacking.fastpackwithoutmask(in, s + 3 * 32, out, tmpoutpos, mbits4); - tmpoutpos += mbits4; - } - inpos.add(inlength); - outpos.set(tmpoutpos); - } - -} diff --git a/src/main/java/me/lemire/integercompression/DeltaZigzagBinaryPacking.java b/src/main/java/me/lemire/integercompression/DeltaZigzagBinaryPacking.java index 6abfb61..451ec97 100644 --- a/src/main/java/me/lemire/integercompression/DeltaZigzagBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/DeltaZigzagBinaryPacking.java @@ -5,6 +5,11 @@ package me.lemire.integercompression; +/** + * BinaryPacking with Delta+Zigzag Encoding. + * + * @author MURAOKA Taro http://github.com/koron + */ public final class DeltaZigzagBinaryPacking implements IntegerCODEC { public static final int BLOCK_LENGTH = 128; diff --git a/src/main/java/me/lemire/integercompression/DeltaZigzagEncoding.java b/src/main/java/me/lemire/integercompression/DeltaZigzagEncoding.java index 0e932f0..3402e6a 100644 --- a/src/main/java/me/lemire/integercompression/DeltaZigzagEncoding.java +++ b/src/main/java/me/lemire/integercompression/DeltaZigzagEncoding.java @@ -4,6 +4,11 @@ */ package me.lemire.integercompression; +/** + * Delta+Zigzag Encoding. + * + * @author MURAOKA Taro http://github.com/koron + */ public final class DeltaZigzagEncoding { public static class Context { diff --git a/src/main/java/me/lemire/integercompression/PerformanceLogger.java b/src/main/java/me/lemire/integercompression/PerformanceLogger.java index 9782e46..0f80917 100644 --- a/src/main/java/me/lemire/integercompression/PerformanceLogger.java +++ b/src/main/java/me/lemire/integercompression/PerformanceLogger.java @@ -4,6 +4,11 @@ */ package me.lemire.integercompression; +/** + * PerformanceLogger for IntegerCODEC. + * + * @author MURAOKA Taro http://github.com/koron + */ public final class PerformanceLogger { public static class Timer { diff --git a/src/main/java/me/lemire/integercompression/XorBinaryPacking.java b/src/main/java/me/lemire/integercompression/XorBinaryPacking.java index 492e76a..31f7556 100644 --- a/src/main/java/me/lemire/integercompression/XorBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/XorBinaryPacking.java @@ -4,6 +4,11 @@ */ package me.lemire.integercompression; +/** + * XOR + BinaryPacking. + * + * @author MURAOKA Taro http://github.com/koron + */ public final class XorBinaryPacking implements IntegratedIntegerCODEC { /** A flag for debugging. */ From 93285437986fec7f0351e16c17e66ec07e1dfacd Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Thu, 10 Oct 2013 14:41:47 -0400 Subject: [PATCH 108/412] Minor changes to comments --- src/main/java/me/lemire/integercompression/OptPFD.java | 4 +++- src/main/java/me/lemire/integercompression/OptPFDS16.java | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/OptPFD.java b/src/main/java/me/lemire/integercompression/OptPFD.java index 6696bf7..6867d4e 100644 --- a/src/main/java/me/lemire/integercompression/OptPFD.java +++ b/src/main/java/me/lemire/integercompression/OptPFD.java @@ -7,7 +7,7 @@ package me.lemire.integercompression; /** - * OptPFD implemented by Daniel Lemire + * OptPFD *

* Follows: *

@@ -16,6 +16,8 @@ *

* using Simple16 as the secondary coder. * + * For multi-threaded applications, each thread should use its own OptPFD object. + * * @author Daniel Lemire */ public final class OptPFD implements IntegerCODEC { diff --git a/src/main/java/me/lemire/integercompression/OptPFDS16.java b/src/main/java/me/lemire/integercompression/OptPFDS16.java index 4580f4b..3c9c58f 100644 --- a/src/main/java/me/lemire/integercompression/OptPFDS16.java +++ b/src/main/java/me/lemire/integercompression/OptPFDS16.java @@ -8,7 +8,7 @@ package me.lemire.integercompression; /** - * OptPFD implemented by Daniel Lemire + * OptPFD *

* Follows: *

@@ -17,6 +17,9 @@ *

* using Simple16 as the secondary coder. * + * + * For multi-threaded applications, each thread should use its own OptPFDS16 object. + * * @author Daniel Lemire */ public final class OptPFDS16 implements IntegerCODEC { From dfcd3a4f411fbbe8ca418eaeeb7fa7ce3ede7d78 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Thu, 10 Oct 2013 14:43:18 -0400 Subject: [PATCH 109/412] [maven-release-plugin] prepare release JavaFastPFOR-0.0.7 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fa0bc6a..feea18a 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.7-SNAPSHOT + 0.0.7 jar From 3268e47c1b93faf8289c6ade7394ee531bc111a3 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Thu, 10 Oct 2013 14:43:22 -0400 Subject: [PATCH 110/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index feea18a..cf3a290 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.7 + 0.0.8-SNAPSHOT jar From 86b8a533c9f479f67f1545270686a4171528bd6d Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Thu, 10 Oct 2013 14:47:18 -0400 Subject: [PATCH 111/412] Moving to version 0.0.7 --- README.md | 2 +- prebuiltbinaries/JavaFastPFOR-0.0.7.jar | Bin 0 -> 147151 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 prebuiltbinaries/JavaFastPFOR-0.0.7.jar diff --git a/README.md b/README.md index 556f2d1..588b764 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ the following code in your pom.xml file: me.lemire.integercompression JavaFastPFOR - 0.0.6 + 0.0.7 diff --git a/prebuiltbinaries/JavaFastPFOR-0.0.7.jar b/prebuiltbinaries/JavaFastPFOR-0.0.7.jar new file mode 100644 index 0000000000000000000000000000000000000000..35d02b859cf8c678ad4dc038b6d1ed375d7d2cc5 GIT binary patch literal 147151 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

eH2dSu6eaTR{fX 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Μ{6qUPw=r2FLOuf*{H>JVCiT@Pk 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ïgwXw+(^TX##tqMgL?y>c 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 Date: Thu, 31 Oct 2013 09:39:53 -0400 Subject: [PATCH 112/412] Link to C++ and Go versions --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 588b764..0765646 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,14 @@ your array use less than 32 bits. These sort of arrays often come up when using differential coding in databases and information retrieval (e.g., in inverted indexes or column stores). +This libary is used by ClueWeb Tools (https://github.com/lintool/clueweb). + +It is a java port of the fastpfor C++ library (https://github.com/lemire/FastPFor). +There is also a Go port (https://github.com/reducedb/encoding). The C++ +library is used by the zsearch engine (http://victorparmar.github.com/zsearch/) +as well as in GMAP and GSNAP (http://research-pub.gene.com/gmap/). + + Some CODECs ("integrated codecs") assume that the integers are in sorted orders. Most others do not. From 062e405ab3ad312bd2f5b521ba5956754eed88b6 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 11 Nov 2013 14:28:53 -0500 Subject: [PATCH 113/412] Minor cleaning plus a new benchmarking utility --- .../lemire/integercompression/Benchmark.java | 3 - .../BenchmarkOffsettedSeries.java | 1 - .../benchmarktools/BenchmarkCSV.java | 107 ++++++++++++++++++ 3 files changed, 107 insertions(+), 4 deletions(-) create mode 100644 src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java diff --git a/src/main/java/me/lemire/integercompression/Benchmark.java b/src/main/java/me/lemire/integercompression/Benchmark.java index c1206d9..31d65c3 100644 --- a/src/main/java/me/lemire/integercompression/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/Benchmark.java @@ -11,13 +11,10 @@ import me.lemire.integercompression.synth.ClusteredDataGenerator; import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; import java.io.PrintWriter; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; -import java.io.FileNotFoundException; /** * diff --git a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java index 2a632bb..6adc1e3 100644 --- a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java +++ b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java @@ -5,7 +5,6 @@ package me.lemire.integercompression; import java.io.File; -import java.io.IOException; import java.io.PrintWriter; import java.util.Arrays; import java.util.Random; diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java new file mode 100644 index 0000000..78f041f --- /dev/null +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java @@ -0,0 +1,107 @@ +package me.lemire.integercompression.benchmarktools; + +import me.lemire.integercompression.*; +import java.io.*; +import java.util.Arrays; + +/** + * This will run benchmarks using a set of posting lists stored as CSV files. + * + * @author lemire + * + */ +public class BenchmarkCSV { + static IntegratedIntegerCODEC codecs[] = { + new IntegratedComposition(new IntegratedFastPFOR(), + new IntegratedVariableByte()), + new IntegratedComposition(new IntegratedBinaryPacking(), + new IntegratedVariableByte()), + + new IntegratedVariableByte() }; + + public static int[] loadIntegers(String filename) throws IOException { + BufferedReader br = new BufferedReader(new FileReader(filename)); + String s = br.readLine(); + String[] numbers = s.split("[,;;]"); + int[] answer = new int[numbers.length]; + for (int k = 0; k < numbers.length; ++k) { + answer[k] = Integer.parseInt(numbers[k].trim()); + } + return answer; + } + + public static void main(String[] args) throws IOException { + int[][] data = new int[args.length][]; + for (int k = 0; k < args.length; ++k) + data[k] = loadIntegers(args[k]); + System.out.println("Loaded " + data.length + " arrays"); + bench(data, false); + bench(data, false); + bench(data, true); + + } + + public static void bench(int[][] postings, boolean verbose) { + int maxlength = 0; + for (int[] x : postings) + if (maxlength < x.length) + maxlength = x.length; + if (verbose) System.out.println("Max array length: " + maxlength); + int[] compbuffer = new int[maxlength + 1024]; + int[] decompbuffer = new int[maxlength]; + if(verbose) + System.out.println("Scheme -- bits/int -- speed (mis)"); + for (IntegratedIntegerCODEC c : codecs) { + long bef = 0; + long aft = 0; + long decomptime = 0; + long volumein = 0; + long volumeout = 0; + int[][] compdata = new int[postings.length][]; + for (int k = 0; k < postings.length; ++k) { + int[] in = postings[k]; + IntWrapper inpos = new IntWrapper(0); + IntWrapper outpos = new IntWrapper(0); + c.compress(in, inpos, in.length, compbuffer, + outpos); + int clength = outpos.get(); + inpos = new IntWrapper(0); + outpos = new IntWrapper(0); + c.uncompress(compbuffer, inpos, clength, + decompbuffer, outpos); + volumein += in.length; + volumeout += clength; + + if (outpos.get() != in.length) + throw new RuntimeException("bug"); + for (int z = 0; z < in.length; ++z) + if (in[z] != decompbuffer[z]) + throw new RuntimeException( + "bug"); + compdata[k] = Arrays + .copyOf(compbuffer, clength); + } + bef = System.nanoTime(); + for (int[] cin : compdata) { + IntWrapper inpos = new IntWrapper(0); + IntWrapper outpos = new IntWrapper(0); + c.uncompress(cin, inpos, cin.length, + decompbuffer, outpos); + if (inpos.get() != cin.length) + throw new RuntimeException("bug"); + } + aft = System.nanoTime(); + decomptime += (aft - bef); + double bitsPerInt = volumeout * 32.0 / volumein; + double decompressSpeed = volumein * 1000.0 + / (decomptime); + if (verbose) + System.out.println(c.toString() + + "\t" + + String.format("\t%1$.2f\t%2$.2f", + bitsPerInt, decompressSpeed)); + + } + } + +} From c4837fc712f4f25f5728fd0da0b4d1ae34f01b25 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 12 Nov 2013 10:48:35 -0500 Subject: [PATCH 114/412] More efficient variable byte --- .../lemire/integercompression/Benchmark.java | 122 +++++++++++++++++- .../integercompression/ByteIntegerCODEC.java | 49 +++++++ .../IntegratedByteIntegerCODEC.java | 20 +++ .../IntegratedVariableByte.java | 52 +++++++- .../integercompression/VariableByte.java | 45 ++++++- .../benchmarktools/BenchmarkCSV.java | 72 ++++++++++- 6 files changed, 349 insertions(+), 11 deletions(-) create mode 100644 src/main/java/me/lemire/integercompression/ByteIntegerCODEC.java create mode 100644 src/main/java/me/lemire/integercompression/IntegratedByteIntegerCODEC.java diff --git a/src/main/java/me/lemire/integercompression/Benchmark.java b/src/main/java/me/lemire/integercompression/Benchmark.java index 31d65c3..41e50da 100644 --- a/src/main/java/me/lemire/integercompression/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/Benchmark.java @@ -134,6 +134,114 @@ private static void testCodec( } } + /** + * Standard benchmark byte byte-aligned schemes + * + * @param csvLog Writer for CSV log. + * @param c the codec + * @param data arrays of input data + * @param repeat How many times to repeat the test + * @param verbose whether to output result on screen + */ + private static void testByteCodec( + PrintWriter csvLog, + int sparsity, + ByteIntegerCODEC c, + int[][] data, + int repeat, + boolean verbose) + { + if (verbose) { + System.out.println("# " + c.toString()); + System.out.println("# bits per int, compress speed (mis), decompression speed (mis) "); + } + + int N = data.length; + + int totalSize = 0; + int maxLength = 0; + for (int k = 0; k < N; ++k) { + totalSize += data[k].length; + if (data[k].length > maxLength) { + maxLength = data[k].length; + } + } + + byte[] compressBuffer = new byte[8 * maxLength + 1024]; + int[] decompressBuffer = new int[maxLength + 1024]; + + // These variables hold time in microseconds (10^-6). + long compressTime = 0; + long decompressTime = 0; + + int size = 0; + IntWrapper inpos = new IntWrapper(); + IntWrapper outpos = new IntWrapper(); + + for (int r = 0; r < repeat; ++r) { + size = 0; + for (int k = 0; k < N; ++k) { + int[] backupdata = Arrays.copyOf(data[k], data[k].length); + + // compress data. + long beforeCompress = System.nanoTime() / 1000; + inpos.set(1); + outpos.set(0); + if (!(c instanceof IntegratedByteIntegerCODEC)) { + Delta.delta(backupdata); + } + c.compress(backupdata, inpos, backupdata.length - inpos.get(), + compressBuffer, outpos); + long afterCompress = System.nanoTime() / 1000; + + // measure time of compression. + compressTime += afterCompress - beforeCompress; + final int thiscompsize = outpos.get() + 1; + size += thiscompsize; + + // extract (uncompress) data + long beforeDecompress = System.nanoTime() / 1000; + inpos.set(0); + outpos.set(1); + decompressBuffer[0] = backupdata[0]; + c.uncompress(compressBuffer, inpos, thiscompsize - 1, + decompressBuffer, outpos); + if (!(c instanceof IntegratedByteIntegerCODEC)) + Delta.fastinverseDelta(decompressBuffer); + long afterDecompress = System.nanoTime() / 1000; + + // measure time of extraction (uncompression). + decompressTime += afterDecompress - beforeDecompress; + if (outpos.get() != data[k].length) + throw new RuntimeException("we have a bug (diff length) " + + c + " expected " + data[k].length + " got " + + outpos.get()); + + // verify: compare original array with compressed and + // uncompressed. + for (int m = 0; m < outpos.get(); ++m) { + if (decompressBuffer[m] != data[k][m]) { + throw new RuntimeException( + "we have a bug (actual difference), expected " + + data[k][m] + " found " + decompressBuffer[m] + + " at " + m); + } + } + } + } + + if (verbose) { + double bitsPerInt = size * 8.0 / totalSize; + long compressSpeed = totalSize * repeat / (compressTime); + long decompressSpeed = totalSize * repeat / (decompressTime); + System.out.println(String.format("\t%1$.2f\t%2$d\t%3$d", + bitsPerInt, compressSpeed, decompressSpeed)); + csvLog.format("\"%1$s\",%2$d,%3$.2f,%4$d,%5$d\n", c.toString(), + sparsity, bitsPerInt, compressSpeed, decompressSpeed); + csvLog.flush(); + } + } + /** * Main method. * @@ -302,6 +410,8 @@ private static void test(PrintWriter csvLog, int N, int nbr, int repeat) testKamikaze(data, repeat, true); System.out.println(); + + testCodec(csvLog, sparsity, new IntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte()), data, repeat, false); testCodec(csvLog, sparsity, new IntegratedComposition(new IntegratedBinaryPacking(), @@ -315,14 +425,14 @@ private static void test(PrintWriter csvLog, int N, int nbr, int repeat) testCodec(csvLog, sparsity, new JustCopy(), data, repeat, true); System.out.println(); - testCodec(csvLog, sparsity, new VariableByte(), data, repeat, false); - testCodec(csvLog, sparsity, new VariableByte(), data, repeat, false); - testCodec(csvLog, sparsity, new VariableByte(), data, repeat, true); + testByteCodec(csvLog, sparsity, new VariableByte(), data, repeat, false); + testByteCodec(csvLog, sparsity, new VariableByte(), data, repeat, false); + testByteCodec(csvLog, sparsity, new VariableByte(), data, repeat, true); System.out.println(); - testCodec(csvLog, sparsity, new IntegratedVariableByte(), data, repeat, false); - testCodec(csvLog, sparsity, new IntegratedVariableByte(), data, repeat, false); - testCodec(csvLog, sparsity, new IntegratedVariableByte(), data, repeat, true); + testByteCodec(csvLog, sparsity, new IntegratedVariableByte(), data, repeat, false); + testByteCodec(csvLog, sparsity, new IntegratedVariableByte(), data, repeat, false); + testByteCodec(csvLog, sparsity, new IntegratedVariableByte(), data, repeat, true); System.out.println(); testCodec(csvLog, sparsity, new Composition(new BinaryPacking(), new VariableByte()), diff --git a/src/main/java/me/lemire/integercompression/ByteIntegerCODEC.java b/src/main/java/me/lemire/integercompression/ByteIntegerCODEC.java new file mode 100644 index 0000000..2c79089 --- /dev/null +++ b/src/main/java/me/lemire/integercompression/ByteIntegerCODEC.java @@ -0,0 +1,49 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + +package me.lemire.integercompression; + + +/** + * Interface describing a CODEC to compress integers to bytes. + * + * @author Daniel Lemire + * + */ +public interface ByteIntegerCODEC { + /** + * Compress data from an array to another array. + * + * Both inpos and outpos are modified to represent how much + * data was read and written to + * if 12 ints (inlength = 12) are compressed to 3 bytes, then + * inpos will be incremented by 12 while outpos will be + * incremented by 3 + * we use IntWrapper to pass the values by reference. + * @param in input array + * @param inpos location in the input array + * @param inlength how many integers to compress + * @param out output array + * @param outpos where to write in the output array + */ + public void compress(int[] in, IntWrapper inpos, int inlength, byte[] out, IntWrapper outpos); + + /** + * Uncompress data from an array to another array. + * + * Both inpos and outpos parameters are modified to indicate new positions after read/write. + * + * @param in array containing data in compressed form + * @param inpos where to start reading in the array + * @param inlength length of the compressed data (ignored by some schemes) + * @param out array where to write the compressed output + * @param outpos where to write the compressed output in out + */ + public void uncompress(byte[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos); + + +} diff --git a/src/main/java/me/lemire/integercompression/IntegratedByteIntegerCODEC.java b/src/main/java/me/lemire/integercompression/IntegratedByteIntegerCODEC.java new file mode 100644 index 0000000..fc86acf --- /dev/null +++ b/src/main/java/me/lemire/integercompression/IntegratedByteIntegerCODEC.java @@ -0,0 +1,20 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + +package me.lemire.integercompression; + + +/** + * Interface describing a CODEC to compress integers to bytes. + * + * "Integrated" means that it uses differential coding. + * + * @author Daniel Lemire + * + */ +public interface IntegratedByteIntegerCODEC extends ByteIntegerCODEC { +} \ No newline at end of file diff --git a/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java b/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java index f4aa11b..d979b39 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java +++ b/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java @@ -14,7 +14,7 @@ * @author Daniel Lemire * */ -public class IntegratedVariableByte implements IntegratedIntegerCODEC { +public class IntegratedVariableByte implements IntegratedIntegerCODEC, IntegratedByteIntegerCODEC { @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { @@ -43,6 +43,29 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, inpos.add(inlength); } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, byte[] out, + IntWrapper outpos) { + if(inlength == 0) return; + int outp = outpos.get(); + int initoffset = 0; + + for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { + int val = in[k] - initoffset; + initoffset = in[k]; + do { + int b = (val & 127); + val >>>= 7; + if (val != 0) { + b |= 128; + } + out[outp++]= (byte) b; + } while (val != 0); + } + outpos.set(outp); + inpos.add(inlength); + } + @Override public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { @@ -73,6 +96,33 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, inpos.add(inlength); } + @Override + public void uncompress(byte[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + int s = 0; + int p = inpos.get(); + int finalp = inpos.get() + inlength; + int tmpoutpos = outpos.get(); + int v = 0; + int shift = 0; + int initoffset = 0; + for (; p < finalp; ++p) { + byte c = in[p]; + v += ((c & 127) << shift); + if ((c & 128) == 0) { + out[tmpoutpos] = v + initoffset; + initoffset = out[tmpoutpos]; + v = 0; + ++tmpoutpos; + shift = 0; + } else + shift += 7; + } + outpos.set(tmpoutpos); + inpos.add(p); + } + + @Override public String toString() { return this.getClass().getSimpleName(); diff --git a/src/main/java/me/lemire/integercompression/VariableByte.java b/src/main/java/me/lemire/integercompression/VariableByte.java index f1de669..cfb373a 100644 --- a/src/main/java/me/lemire/integercompression/VariableByte.java +++ b/src/main/java/me/lemire/integercompression/VariableByte.java @@ -14,7 +14,7 @@ * * @author Daniel Lemire */ -public class VariableByte implements IntegerCODEC { +public class VariableByte implements IntegerCODEC, ByteIntegerCODEC { @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { @@ -41,6 +41,26 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, inpos.add(inlength); } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, byte[] out, + IntWrapper outpos) { + if(inlength == 0) return; + int outp = outpos.get(); + for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { + int val = in[k]; + do { + int b = (val & 127); + val >>>= 7; + if (val != 0) { + b |= 128; + } + out[outp++]= (byte) b; + } while (val != 0); + } + outpos.set(outp); + inpos.add(inlength); + } + @Override public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { @@ -66,7 +86,30 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, outpos.set(tmpoutpos); inpos.add(inlength); } + @Override + public void uncompress(byte[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + int s = 0; + int p = inpos.get(); + int finalp = inpos.get() + inlength; + int tmpoutpos = outpos.get(); + int v = 0; + int shift = 0; + for (; p < finalp; ++p) { + int c = in[p]; + v += ((c & 127) << shift); + if ((c & 128) == 0) { + out[tmpoutpos++] = v; + v = 0; + shift = 0; + } else + shift += 7; + } + outpos.set(tmpoutpos); + inpos.add(p); + } + @Override public String toString() { return this.getClass().getSimpleName(); diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java index 78f041f..a84ac0a 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java @@ -16,9 +16,10 @@ public class BenchmarkCSV { new IntegratedVariableByte()), new IntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte()), - new IntegratedVariableByte() }; - + static IntegratedByteIntegerCODEC bcodecs[]= { + new IntegratedVariableByte() + }; public static int[] loadIntegers(String filename) throws IOException { BufferedReader br = new BufferedReader(new FileReader(filename)); String s = br.readLine(); @@ -38,7 +39,9 @@ public static void main(String[] args) throws IOException { bench(data, false); bench(data, false); bench(data, true); - + bytebench(data, false); + bytebench(data, false); + bytebench(data, true); } public static void bench(int[][] postings, boolean verbose) { @@ -104,4 +107,67 @@ public static void bench(int[][] postings, boolean verbose) { } } + public static void bytebench(int[][] postings, boolean verbose) { + int maxlength = 0; + for (int[] x : postings) + if (maxlength < x.length) + maxlength = x.length; + if (verbose) System.out.println("Max array length: " + maxlength); + byte[] compbuffer = new byte[4*(maxlength + 1024)]; + int[] decompbuffer = new int[maxlength]; + if(verbose) + System.out.println("Scheme -- bits/int -- speed (mis)"); + for (IntegratedByteIntegerCODEC c : bcodecs) { + long bef = 0; + long aft = 0; + long decomptime = 0; + long volumein = 0; + long volumeout = 0; + byte[][] compdata = new byte[postings.length][]; + for (int k = 0; k < postings.length; ++k) { + int[] in = postings[k]; + IntWrapper inpos = new IntWrapper(0); + IntWrapper outpos = new IntWrapper(0); + c.compress(in, inpos, in.length, compbuffer, + outpos); + int clength = outpos.get(); + inpos = new IntWrapper(0); + outpos = new IntWrapper(0); + c.uncompress(compbuffer, inpos, clength, + decompbuffer, outpos); + volumein += in.length; + volumeout += clength; + + if (outpos.get() != in.length) + throw new RuntimeException("bug"); + for (int z = 0; z < in.length; ++z) + if (in[z] != decompbuffer[z]) + throw new RuntimeException( + "bug"); + compdata[k] = Arrays + .copyOf(compbuffer, clength); + } + bef = System.nanoTime(); + for (byte[] cin : compdata) { + IntWrapper inpos = new IntWrapper(0); + IntWrapper outpos = new IntWrapper(0); + c.uncompress(cin, inpos, cin.length, + decompbuffer, outpos); + if (inpos.get() != cin.length) + throw new RuntimeException("bug"); + } + aft = System.nanoTime(); + decomptime += (aft - bef); + double bitsPerInt = volumeout * 32.0 / volumein; + double decompressSpeed = volumein * 1000.0 + / (decomptime); + if (verbose) + System.out.println(c.toString() + + "\t" + + String.format("\t%1$.2f\t%2$.2f", + bitsPerInt, decompressSpeed)); + + } + } + } From 0d48686a17f8b57c1344261ffe8dd813ccc31f87 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 12 Nov 2013 11:10:12 -0500 Subject: [PATCH 115/412] Adding new benchmark --- ...benchmarkresults_icore7_12november2013.txt | 879 ++++++++++++++++++ 1 file changed, 879 insertions(+) create mode 100644 benchmarkresults/benchmarkresults_icore7_12november2013.txt diff --git a/benchmarkresults/benchmarkresults_icore7_12november2013.txt b/benchmarkresults/benchmarkresults_icore7_12november2013.txt new file mode 100644 index 0000000..07b11b3 --- /dev/null +++ b/benchmarkresults/benchmarkresults_icore7_12november2013.txt @@ -0,0 +1,879 @@ +[INFO] Scanning for projects... +[WARNING] POM for 'biz.aQute:bndlib:pom:1.50.0:runtime' is invalid. + +Its dependencies (if any) will NOT be available to the current build. +[INFO] ------------------------------------------------------------------------ +[INFO] Building JavaFastPFOR +[INFO] task-segment: [exec:java] +[INFO] ------------------------------------------------------------------------ +[INFO] Preparing exec:java +[INFO] [enforcer:enforce {execution: enforce-maven}] +[INFO] [exec:java {execution: default-cli}] +# benchmark based on the ClusterData model from: +# Vo Ngoc Anh and Alistair Moffat. +# Index compression using 64-bit words. +# Softw. Pract. Exper.40, 2 (February 2010), 131-147. + +# Results will be written into a CSV file: benchmark-20131112T105209.csv + +# sparsity 1 +# generating random data... +# generating random data... ok. +# kamikaze PForDelta +# bits per int, compress speed (mis), decompression speed (mis) + 3.28 48 218 + +# IntegratedBinaryPacking + IntegratedVariableByte (Integrated) +# bits per int, compress speed (mis), decompression speed (mis) + 3.03 623 1205 + +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1154 1331 + +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.00 508 554 + +# IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.00 592 709 + +# BinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.03 596 900 + +# NewPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 2.95 115 701 + +# NewPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 2.98 135 726 + +# NewPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 2.95 116 726 + +# OptPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 2.94 19 761 + +# OptPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 2.97 22 767 + +# OptPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 2.94 19 765 + +# IntegratedFastPFOR + IntegratedVariableByte (Integrated) +# bits per int, compress speed (mis), decompression speed (mis) + 2.71 219 797 + +# FastPFOR + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 2.71 217 813 + +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 2.90 254 599 + +# XorBinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 2.92 375 669 + +# DeltaZigzagBinaryPacking + DeltaZigzagVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.36 394 503 + +# sparsity 2 +# generating random data... +# generating random data... ok. +# kamikaze PForDelta +# bits per int, compress speed (mis), decompression speed (mis) + 4.09 47 254 + +# IntegratedBinaryPacking + IntegratedVariableByte (Integrated) +# bits per int, compress speed (mis), decompression speed (mis) + 3.84 636 1160 + +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1152 1264 + +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.01 510 551 + +# IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.01 594 704 + +# BinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.84 602 875 + +# NewPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.74 101 673 + +# NewPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.77 117 695 + +# NewPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.74 101 694 + +# OptPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.73 15 725 + +# OptPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.76 18 741 + +# OptPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.73 15 731 + +# IntegratedFastPFOR + IntegratedVariableByte (Integrated) +# bits per int, compress speed (mis), decompression speed (mis) + 3.48 215 782 + +# FastPFOR + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.48 212 789 + +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 3.72 190 530 + +# XorBinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.76 375 657 + +# DeltaZigzagBinaryPacking + DeltaZigzagVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.32 392 499 + +# sparsity 3 +# generating random data... +# generating random data... ok. +# kamikaze PForDelta +# bits per int, compress speed (mis), decompression speed (mis) + 5.03 42 250 + +# IntegratedBinaryPacking + IntegratedVariableByte (Integrated) +# bits per int, compress speed (mis), decompression speed (mis) + 4.77 643 1141 + +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1149 1337 + +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.02 506 547 + +# IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.02 590 698 + +# BinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.77 619 904 + +# NewPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.66 89 640 + +# NewPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.69 103 672 + +# NewPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.66 89 668 + +# OptPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.64 12 700 + +# OptPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.68 14 712 + +# OptPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.64 12 704 + +# IntegratedFastPFOR + IntegratedVariableByte (Integrated) +# bits per int, compress speed (mis), decompression speed (mis) + 4.39 212 762 + +# FastPFOR + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.39 209 763 + +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 4.81 146 480 + +# XorBinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.75 373 646 + +# DeltaZigzagBinaryPacking + DeltaZigzagVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.40 386 496 + +# sparsity 4 +# generating random data... +# generating random data... ok. +# kamikaze PForDelta +# bits per int, compress speed (mis), decompression speed (mis) + 5.77 39 245 + +# IntegratedBinaryPacking + IntegratedVariableByte (Integrated) +# bits per int, compress speed (mis), decompression speed (mis) + 5.53 629 1095 + +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1148 1332 + +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.11 482 522 + +# IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.11 557 655 + +# BinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.53 617 889 + +# NewPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.42 82 659 + +# NewPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.45 94 684 + +# NewPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.42 82 686 + +# OptPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.40 10 695 + +# OptPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.43 12 715 + +# OptPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.40 10 705 + +# IntegratedFastPFOR + IntegratedVariableByte (Integrated) +# bits per int, compress speed (mis), decompression speed (mis) + 5.16 214 776 + +# FastPFOR + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.16 211 780 + +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 5.66 128 457 + +# XorBinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.53 370 645 + +# DeltaZigzagBinaryPacking + DeltaZigzagVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.23 389 493 + +# sparsity 5 +# generating random data... +# generating random data... ok. +# kamikaze PForDelta +# bits per int, compress speed (mis), decompression speed (mis) + 6.57 37 248 + +# IntegratedBinaryPacking + IntegratedVariableByte (Integrated) +# bits per int, compress speed (mis), decompression speed (mis) + 6.32 640 1113 + +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1150 1349 + +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.41 416 456 + +# IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.41 473 548 + +# BinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.32 622 898 + +# NewPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.20 75 643 + +# NewPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.23 86 668 + +# NewPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.20 75 666 + +# OptPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.18 8 690 + +# OptPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.21 11 705 + +# OptPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.18 8 697 + +# IntegratedFastPFOR + IntegratedVariableByte (Integrated) +# bits per int, compress speed (mis), decompression speed (mis) + 5.93 211 741 + +# FastPFOR + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.93 208 772 + +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 6.51 118 426 + +# XorBinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.32 374 639 + +# DeltaZigzagBinaryPacking + DeltaZigzagVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 7.05 390 492 + +# sparsity 6 +# generating random data... +# generating random data... ok. +# kamikaze PForDelta +# bits per int, compress speed (mis), decompression speed (mis) + 7.73 35 242 + +# IntegratedBinaryPacking + IntegratedVariableByte (Integrated) +# bits per int, compress speed (mis), decompression speed (mis) + 7.48 630 1071 + +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1143 1350 + +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 9.04 328 365 + +# IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 9.04 365 415 + +# BinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 7.48 620 882 + +# NewPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 7.36 67 641 + +# NewPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 7.39 76 668 + +# NewPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 7.36 67 667 + +# OptPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 7.33 7 679 + +# OptPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 7.37 9 695 + +# OptPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 7.33 7 686 + +# IntegratedFastPFOR + IntegratedVariableByte (Integrated) +# bits per int, compress speed (mis), decompression speed (mis) + 7.09 211 749 + +# FastPFOR + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 7.09 208 764 + +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 7.88 101 383 + +# XorBinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 7.49 372 630 + +# DeltaZigzagBinaryPacking + DeltaZigzagVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.27 389 489 + +# sparsity 7 +# generating random data... +# generating random data... ok. +# kamikaze PForDelta +# bits per int, compress speed (mis), decompression speed (mis) + 8.46 33 244 + +# IntegratedBinaryPacking + IntegratedVariableByte (Integrated) +# bits per int, compress speed (mis), decompression speed (mis) + 8.21 628 1052 + +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1148 1334 + +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.01 257 290 + +# IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.01 284 315 + +# BinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.21 612 859 + +# NewPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.08 63 626 + +# NewPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.11 71 665 + +# NewPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.08 63 663 + +# OptPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.06 6 675 + +# OptPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.09 8 687 + +# OptPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.06 6 682 + +# IntegratedFastPFOR + IntegratedVariableByte (Integrated) +# bits per int, compress speed (mis), decompression speed (mis) + 7.81 210 756 + +# FastPFOR + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 7.81 207 759 + +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 8.85 92 353 + +# XorBinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.22 369 622 + +# DeltaZigzagBinaryPacking + DeltaZigzagVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 9.00 389 486 + +# sparsity 8 +# generating random data... +# generating random data... ok. +# kamikaze PForDelta +# bits per int, compress speed (mis), decompression speed (mis) + 9.41 32 234 + +# IntegratedBinaryPacking + IntegratedVariableByte (Integrated) +# bits per int, compress speed (mis), decompression speed (mis) + 9.16 636 1062 + +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1151 1326 + +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.08 231 269 + +# IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.08 259 288 + +# BinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 9.16 616 873 + +# NewPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 9.04 59 638 + +# NewPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 9.07 65 664 + +# NewPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 9.04 59 664 + +# OptPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 9.01 5 665 + +# OptPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 9.05 7 680 + +# OptPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 9.01 5 671 + +# IntegratedFastPFOR + IntegratedVariableByte (Integrated) +# bits per int, compress speed (mis), decompression speed (mis) + 8.77 209 746 + +# FastPFOR + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.77 207 738 + +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 10.25 81 324 + +# XorBinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 9.18 372 625 + +# DeltaZigzagBinaryPacking + DeltaZigzagVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 9.98 387 479 + +# sparsity 9 +# generating random data... +# generating random data... ok. +# kamikaze PForDelta +# bits per int, compress speed (mis), decompression speed (mis) + 10.41 31 238 + +# IntegratedBinaryPacking + IntegratedVariableByte (Integrated) +# bits per int, compress speed (mis), decompression speed (mis) + 10.15 637 1070 + +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1145 1413 + +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.15 221 267 + +# IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.15 252 284 + +# BinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.15 609 849 + +# NewPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.03 54 624 + +# NewPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.06 60 650 + +# NewPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.03 54 649 + +# OptPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.00 5 653 + +# OptPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.03 7 666 + +# OptPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.00 5 659 + +# IntegratedFastPFOR + IntegratedVariableByte (Integrated) +# bits per int, compress speed (mis), decompression speed (mis) + 9.75 207 739 + +# FastPFOR + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 9.75 206 743 + +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 11.72 73 313 + +# XorBinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.17 369 611 + +# DeltaZigzagBinaryPacking + DeltaZigzagVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.98 381 474 + +# sparsity 10 +# generating random data... +# generating random data... ok. +# kamikaze PForDelta +# bits per int, compress speed (mis), decompression speed (mis) + 11.57 29 236 + +# IntegratedBinaryPacking + IntegratedVariableByte (Integrated) +# bits per int, compress speed (mis), decompression speed (mis) + 11.28 626 1033 + +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1141 1328 + +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 13.18 219 276 + +# IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 13.18 254 294 + +# BinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.28 610 848 + +# NewPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.19 50 617 + +# NewPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.23 56 638 + +# NewPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.19 50 640 + +# OptPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.13 4 640 + +# OptPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.17 6 655 + +# OptPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.13 4 647 + +# IntegratedFastPFOR + IntegratedVariableByte (Integrated) +# bits per int, compress speed (mis), decompression speed (mis) + 10.87 207 736 + +# FastPFOR + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.87 204 734 + +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 13.19 68 311 + +# XorBinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.30 369 612 + +# DeltaZigzagBinaryPacking + DeltaZigzagVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.13 386 477 + +# sparsity 11 +# generating random data... +# generating random data... ok. +# kamikaze PForDelta +# bits per int, compress speed (mis), decompression speed (mis) + 12.41 29 229 + +# IntegratedBinaryPacking + IntegratedVariableByte (Integrated) +# bits per int, compress speed (mis), decompression speed (mis) + 12.01 634 1046 + +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1148 1365 + +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 13.84 208 261 + +# IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 13.84 241 277 + +# BinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.01 605 832 + +# NewPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.07 49 650 + +# NewPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.10 54 674 + +# NewPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.07 49 675 + +# OptPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.93 4 604 + +# OptPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.97 6 618 + +# OptPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.93 4 611 + +# IntegratedFastPFOR + IntegratedVariableByte (Integrated) +# bits per int, compress speed (mis), decompression speed (mis) + 11.60 206 724 + +# FastPFOR + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.60 203 724 + +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 13.98 66 291 + +# XorBinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.04 367 603 + +# DeltaZigzagBinaryPacking + DeltaZigzagVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.86 385 478 + +# sparsity 12 +# generating random data... +# generating random data... ok. +# kamikaze PForDelta +# bits per int, compress speed (mis), decompression speed (mis) + 13.48 28 236 + +# IntegratedBinaryPacking + IntegratedVariableByte (Integrated) +# bits per int, compress speed (mis), decompression speed (mis) + 12.96 634 1051 + +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1150 1307 + +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 14.69 202 258 + +# IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 14.69 235 272 + +# BinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.96 610 849 + +# NewPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 13.17 48 698 + +# NewPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 13.20 52 714 + +# NewPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 13.17 48 720 + +# OptPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.96 4 588 + +# OptPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 13.00 6 602 + +# OptPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.96 4 597 + +# IntegratedFastPFOR + IntegratedVariableByte (Integrated) +# bits per int, compress speed (mis), decompression speed (mis) + 12.55 206 726 + +# FastPFOR + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.55 203 725 + +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 15.40 63 269 + +# XorBinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.99 368 613 + +# DeltaZigzagBinaryPacking + DeltaZigzagVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 13.81 384 476 + + +Results were written into a CSV file: benchmark-20131112T105209.csv +[INFO] ------------------------------------------------------------------------ +[INFO] BUILD SUCCESSFUL +[INFO] ------------------------------------------------------------------------ +[INFO] Total time: 17 minutes 30 seconds +[INFO] Finished at: Tue Nov 12 11:09:38 EST 2013 +[INFO] Final Memory: 20M/230M +[INFO] ------------------------------------------------------------------------ From 8f75cfff167e2b8370ca57c38c4ddf8bf37f8b99 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 12 Nov 2013 11:13:44 -0500 Subject: [PATCH 116/412] Preparing new release --- CHANGELOG | 5 ++++- README.md | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index eb8d2f0..9144f82 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,7 @@ -upcoming +0.0.8 (Nov. 12th 2013) + - variable byte schemes can now be used without an unnecessary copy, if you have a byte[] output array + +0.0.7 - added two new (minor) codecs NewPFD16 and OptPFD16 0.0.6 (Sept. 4th 2013) diff --git a/README.md b/README.md index 0765646..acd1a7d 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ the following code in your pom.xml file: me.lemire.integercompression JavaFastPFOR - 0.0.7 + 0.0.8 From b51ff560885221e99c08534c2ae7a6997bca400a Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 12 Nov 2013 11:17:48 -0500 Subject: [PATCH 117/412] [maven-release-plugin] prepare release JavaFastPFOR-0.0.8 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cf3a290..9f58dad 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.8-SNAPSHOT + 0.0.8 jar From e3bf23c6485be5fdc1409167277a622969975aab Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 12 Nov 2013 11:17:51 -0500 Subject: [PATCH 118/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9f58dad..1cc2006 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.8 + 0.0.9-SNAPSHOT jar From dcdb3257b8f5af395c6a5ce0abed7b2c588584b4 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 12 Nov 2013 11:33:32 -0500 Subject: [PATCH 119/412] Fixed bad compression ratio reporting --- CHANGELOG | 3 +++ .../lemire/integercompression/benchmarktools/BenchmarkCSV.java | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 9144f82..77165b9 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +upcoming + - Fixed bad compression ratio reporting in BenchmarkCSV + 0.0.8 (Nov. 12th 2013) - variable byte schemes can now be used without an unnecessary copy, if you have a byte[] output array diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java index a84ac0a..c0ee146 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java @@ -158,7 +158,7 @@ public static void bytebench(int[][] postings, boolean verbose) { } aft = System.nanoTime(); decomptime += (aft - bef); - double bitsPerInt = volumeout * 32.0 / volumein; + double bitsPerInt = volumeout * 8.0 / volumein; double decompressSpeed = volumein * 1000.0 / (decomptime); if (verbose) From e348cc46e8f970c077057bbed19c92aafacfec4a Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 15 Nov 2013 10:13:16 -0500 Subject: [PATCH 120/412] Slightly better docs with smarter BenchmarkCSV --- .../integercompression/BinaryPacking.java | 5 +- .../lemire/integercompression/FastPFOR.java | 3 + .../IntegratedBinaryPacking.java | 5 + .../IntegratedVariableByte.java | 8 +- .../me/lemire/integercompression/NewPFD.java | 4 + .../lemire/integercompression/NewPFDS16.java | 3 + .../lemire/integercompression/NewPFDS9.java | 3 + .../me/lemire/integercompression/OptPFD.java | 4 + .../lemire/integercompression/OptPFDS16.java | 2 + .../lemire/integercompression/OptPFDS9.java | 4 + .../me/lemire/integercompression/S16.java | 1 + .../me/lemire/integercompression/Simple9.java | 5 + .../integercompression/VariableByte.java | 6 +- .../benchmarktools/BenchmarkCSV.java | 122 ++++++++++++++---- 14 files changed, 145 insertions(+), 30 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/BinaryPacking.java b/src/main/java/me/lemire/integercompression/BinaryPacking.java index 804e0b5..67d8e07 100644 --- a/src/main/java/me/lemire/integercompression/BinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/BinaryPacking.java @@ -8,7 +8,10 @@ /** - * Scheme designed by D. Lemire + * Scheme designed by D. Lemire based on a commonly used idea. + * + * Note that this does not use differential coding: if you are working on + * sorted lists, use IntegratedBinaryPacking instead. * * @author Daniel Lemire */ diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 2cfad7e..0cb2520 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -21,6 +21,9 @@ *

* For sufficiently compressible arrays, it is faster and better than other PFOR * schemes. + * + * Note that this does not use differential coding: if you are working on + * sorted lists, use IntegratedFastPFOR instead. * * For multi-threaded applications, each thread should use its own FastPFOR object. * diff --git a/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java b/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java index 4f06b61..4903fac 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java @@ -8,6 +8,11 @@ package me.lemire.integercompression; /** + * Scheme designed by D. Lemire based on a commonly used idea. + * + * You should only use this scheme on sorted arrays. Use BinaryPacking + * if you have unsorted arrays. + * * @author Daniel Lemire * */ diff --git a/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java b/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java index d979b39..010b782 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java +++ b/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java @@ -11,8 +11,14 @@ import java.nio.IntBuffer; /** - * @author Daniel Lemire + * Implementation of variable-byte with differential coding. For best performance, + * use it using the IntegratedByteIntegerCODEC interface. + * + * You should only use this scheme on sorted arrays. Use VariableByte + * if you have unsorted arrays. * + * + * @author Daniel Lemire */ public class IntegratedVariableByte implements IntegratedIntegerCODEC, IntegratedByteIntegerCODEC { @Override diff --git a/src/main/java/me/lemire/integercompression/NewPFD.java b/src/main/java/me/lemire/integercompression/NewPFD.java index 2dd9402..cca9093 100644 --- a/src/main/java/me/lemire/integercompression/NewPFD.java +++ b/src/main/java/me/lemire/integercompression/NewPFD.java @@ -17,6 +17,10 @@ *

* using Simple16 as the secondary coder. * + * Note that this does not use differential coding: if you are working on + * sorted lists, you must compute the deltas separately. (Yes, this is true even + * though the "D" at the end of the name probably stands for delta.) + * * For multi-threaded applications, each thread should use its own NewPFD object. * * @author Daniel Lemire diff --git a/src/main/java/me/lemire/integercompression/NewPFDS16.java b/src/main/java/me/lemire/integercompression/NewPFDS16.java index 82ce7f5..fd444ba 100644 --- a/src/main/java/me/lemire/integercompression/NewPFDS16.java +++ b/src/main/java/me/lemire/integercompression/NewPFDS16.java @@ -17,6 +17,9 @@ *

* using Simple16 as the secondary coder. * + * Note that this does not use differential coding: if you are working on + * sorted lists, you must compute the deltas separately. + * * For multi-threaded applications, each thread should use its own NewPFDS16 object. * * @author Daniel Lemire diff --git a/src/main/java/me/lemire/integercompression/NewPFDS9.java b/src/main/java/me/lemire/integercompression/NewPFDS9.java index 00f0ae2..f651e84 100644 --- a/src/main/java/me/lemire/integercompression/NewPFDS9.java +++ b/src/main/java/me/lemire/integercompression/NewPFDS9.java @@ -17,6 +17,9 @@ *

* using Simple9 as the secondary coder. * + * Note that this does not use differential coding: if you are working on + * sorted lists, you must compute the deltas separately. + * * For multi-threaded applications, each thread should use its own NewPFDS9 object. * * @author Daniel Lemire diff --git a/src/main/java/me/lemire/integercompression/OptPFD.java b/src/main/java/me/lemire/integercompression/OptPFD.java index 6867d4e..8e02ac7 100644 --- a/src/main/java/me/lemire/integercompression/OptPFD.java +++ b/src/main/java/me/lemire/integercompression/OptPFD.java @@ -16,6 +16,10 @@ *

* using Simple16 as the secondary coder. * + * Note that this does not use differential coding: if you are working on + * sorted lists, you must compute the deltas separately. (Yes, this is true even + * though the "D" at the end of the name probably stands for delta.) + * * For multi-threaded applications, each thread should use its own OptPFD object. * * @author Daniel Lemire diff --git a/src/main/java/me/lemire/integercompression/OptPFDS16.java b/src/main/java/me/lemire/integercompression/OptPFDS16.java index 3c9c58f..20e2727 100644 --- a/src/main/java/me/lemire/integercompression/OptPFDS16.java +++ b/src/main/java/me/lemire/integercompression/OptPFDS16.java @@ -17,6 +17,8 @@ *

* using Simple16 as the secondary coder. * + * Note that this does not use differential coding: if you are working on + * sorted lists, you must compute the deltas separately. * * For multi-threaded applications, each thread should use its own OptPFDS16 object. * diff --git a/src/main/java/me/lemire/integercompression/OptPFDS9.java b/src/main/java/me/lemire/integercompression/OptPFDS9.java index e25aa5b..0cbcf7a 100644 --- a/src/main/java/me/lemire/integercompression/OptPFDS9.java +++ b/src/main/java/me/lemire/integercompression/OptPFDS9.java @@ -17,6 +17,10 @@ *

* using Simple9 as the secondary coder. * + * + * Note that this does not use differential coding: if you are working on + * sorted lists, you must compute the deltas separately. + * * For multi-threaded applications, each thread should use its own OptPFDS9 object. * * @author Daniel Lemire diff --git a/src/main/java/me/lemire/integercompression/S16.java b/src/main/java/me/lemire/integercompression/S16.java index 8b51cf1..f4ca39c 100644 --- a/src/main/java/me/lemire/integercompression/S16.java +++ b/src/main/java/me/lemire/integercompression/S16.java @@ -11,6 +11,7 @@ * Version of Simple16 for NewPFD and OptPFD. *

* Adapted by D. Lemire from the Apache Lucene project. + * */ public final class S16 { diff --git a/src/main/java/me/lemire/integercompression/Simple9.java b/src/main/java/me/lemire/integercompression/Simple9.java index 7b8136a..280f20a 100644 --- a/src/main/java/me/lemire/integercompression/Simple9.java +++ b/src/main/java/me/lemire/integercompression/Simple9.java @@ -9,6 +9,11 @@ /** + * This is an implementation of the popular Simple9 scheme. + * + * Note that this does not use differential coding: if you are working on + * sorted lists, you must compute the deltas separately. + * * @author Daniel Lemire * */ diff --git a/src/main/java/me/lemire/integercompression/VariableByte.java b/src/main/java/me/lemire/integercompression/VariableByte.java index cfb373a..206ec53 100644 --- a/src/main/java/me/lemire/integercompression/VariableByte.java +++ b/src/main/java/me/lemire/integercompression/VariableByte.java @@ -10,7 +10,11 @@ import java.nio.IntBuffer; /** - * Implementation of variable-byte. Possibly inefficient. + * Implementation of variable-byte. For best performance, use it using the + * ByteIntegerCODEC interface. + * + * Note that this does not use differential coding: if you are working on + * sorted lists, you must compute the deltas separately. * * @author Daniel Lemire */ diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java index c0ee146..612eee0 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java @@ -2,6 +2,7 @@ import me.lemire.integercompression.*; import java.io.*; +import java.util.ArrayList; import java.util.Arrays; /** @@ -20,49 +21,116 @@ public class BenchmarkCSV { static IntegratedByteIntegerCODEC bcodecs[]= { new IntegratedVariableByte() }; - public static int[] loadIntegers(String filename) throws IOException { + static IntegerCODEC regcodecs[] = { + new Composition(new FastPFOR(), + new VariableByte()), + new Composition(new BinaryPacking(), + new VariableByte()), + new VariableByte() }; + static ByteIntegerCODEC regbcodecs[]= { + new VariableByte() + }; + + + public static ArrayList loadIntegers(String filename,Format f) throws IOException { + if(f== Format.ONEARRAYPERLINE) { + ArrayList answer = new ArrayList(); BufferedReader br = new BufferedReader(new FileReader(filename)); - String s = br.readLine(); - String[] numbers = s.split("[,;;]"); - int[] answer = new int[numbers.length]; - for (int k = 0; k < numbers.length; ++k) { - answer[k] = Integer.parseInt(numbers[k].trim()); - } + String s; + while((s = br.readLine())!= null) { + String[] numbers = s.split("[,;;]"); + int[] a = new int[numbers.length]; + for (int k = 0; k < numbers.length; ++k) { + a[k] = Integer.parseInt(numbers[k].trim()); + } + answer.add(a); + } return answer; + } else {//Format.ONEARRAYPERFILE + ArrayList answer = new ArrayList(); + BufferedReader br = new BufferedReader(new FileReader(filename)); + String s; + while((s = br.readLine())!= null) { + String[] numbers = s.split("[,;;]"); + for (int k = 0; k < numbers.length; ++k) { + answer.add(Integer.parseInt(numbers[k].trim())); + } + } + int[] actualanswer = new int[answer.size()]; + for(int i = 0; i < answer.size(); ++i) + actualanswer[i] = answer.get(i); + ArrayList wrap = new ArrayList(); + wrap.add(actualanswer); + return wrap; + } + } + public enum Format { + ONEARRAYPERLINE, ONEARRAYPERFILE } + public enum CompressionMode { + AS_IS, DELTA + } public static void main(String[] args) throws IOException { - int[][] data = new int[args.length][]; + Format myformat = Format.ONEARRAYPERLINE; + CompressionMode cm = CompressionMode.DELTA; + ArrayList files = new ArrayList(); + for(String s : args) { + if(s.startsWith("-")) {// it is a flag + if(s.equals("--onearrayperfile")) + myformat = Format.ONEARRAYPERFILE; + if(s.equals("--nodelta")) + cm = CompressionMode.AS_IS; + else throw new RuntimeException("I don't understand: "+s); + } else {// it is a filename + files.add(s); + } + } + if(myformat == Format.ONEARRAYPERFILE) + System.out.println("Treating each file as one array."); + else if(myformat == Format.ONEARRAYPERLINE) + System.out.println("Each line of each file is an array: use --onearrayperfile to change."); + if(cm == CompressionMode.AS_IS) + System.out.println("Compressing the integers 'as is' (no differential coding)"); + else + System.out.println("Using differential coding (arrays will be sorted): use --nodelta to prevent sorting"); + ArrayList data = new ArrayList(); for (int k = 0; k < args.length; ++k) - data[k] = loadIntegers(args[k]); - System.out.println("Loaded " + data.length + " arrays"); - bench(data, false); - bench(data, false); - bench(data, true); - bytebench(data, false); - bytebench(data, false); - bytebench(data, true); + for(int[] x: loadIntegers(args[k],myformat)) + data.add(x); + System.out.println("Loaded " + data.size() + " array(s)"); + if(cm == CompressionMode.DELTA) { + System.out.println("Sorting the arrray(s) because you are using differential coding"); + for(int[] x: data) + Arrays.sort(x); + } + bench(data, cm, false); + bench(data, cm, false); + bench(data, cm, true); + bytebench(data, cm, false); + bytebench(data, cm, false); + bytebench(data, cm, true); } - public static void bench(int[][] postings, boolean verbose) { + public static void bench(ArrayList postings, CompressionMode cm, boolean verbose) { int maxlength = 0; for (int[] x : postings) if (maxlength < x.length) maxlength = x.length; if (verbose) System.out.println("Max array length: " + maxlength); - int[] compbuffer = new int[maxlength + 1024]; + int[] compbuffer = new int[2*maxlength + 1024]; int[] decompbuffer = new int[maxlength]; if(verbose) System.out.println("Scheme -- bits/int -- speed (mis)"); - for (IntegratedIntegerCODEC c : codecs) { + for (IntegerCODEC c : (cm == CompressionMode.DELTA ? codecs: regcodecs)) { long bef = 0; long aft = 0; long decomptime = 0; long volumein = 0; long volumeout = 0; - int[][] compdata = new int[postings.length][]; - for (int k = 0; k < postings.length; ++k) { - int[] in = postings[k]; + int[][] compdata = new int[postings.size()][]; + for (int k = 0; k < postings.size(); ++k) { + int[] in = postings.get(k); IntWrapper inpos = new IntWrapper(0); IntWrapper outpos = new IntWrapper(0); c.compress(in, inpos, in.length, compbuffer, @@ -107,7 +175,7 @@ public static void bench(int[][] postings, boolean verbose) { } } - public static void bytebench(int[][] postings, boolean verbose) { + public static void bytebench(ArrayList postings, CompressionMode cm, boolean verbose) { int maxlength = 0; for (int[] x : postings) if (maxlength < x.length) @@ -117,15 +185,15 @@ public static void bytebench(int[][] postings, boolean verbose) { int[] decompbuffer = new int[maxlength]; if(verbose) System.out.println("Scheme -- bits/int -- speed (mis)"); - for (IntegratedByteIntegerCODEC c : bcodecs) { + for (ByteIntegerCODEC c : (cm == CompressionMode.DELTA ? bcodecs: regbcodecs)) { long bef = 0; long aft = 0; long decomptime = 0; long volumein = 0; long volumeout = 0; - byte[][] compdata = new byte[postings.length][]; - for (int k = 0; k < postings.length; ++k) { - int[] in = postings[k]; + byte[][] compdata = new byte[postings.size()][]; + for (int k = 0; k < postings.size(); ++k) { + int[] in = postings.get(k); IntWrapper inpos = new IntWrapper(0); IntWrapper outpos = new IntWrapper(0); c.compress(in, inpos, in.length, compbuffer, From 6124b7ecb31147a3b55019bf251a6cc98166ac48 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 15 Nov 2013 10:27:01 -0500 Subject: [PATCH 121/412] Fixing a few bugs --- .../integercompression/benchmarktools/BenchmarkCSV.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java index 612eee0..5b421c3 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java @@ -79,7 +79,7 @@ public static void main(String[] args) throws IOException { if(s.startsWith("-")) {// it is a flag if(s.equals("--onearrayperfile")) myformat = Format.ONEARRAYPERFILE; - if(s.equals("--nodelta")) + else if(s.equals("--nodelta")) cm = CompressionMode.AS_IS; else throw new RuntimeException("I don't understand: "+s); } else {// it is a filename @@ -95,8 +95,8 @@ else if(myformat == Format.ONEARRAYPERLINE) else System.out.println("Using differential coding (arrays will be sorted): use --nodelta to prevent sorting"); ArrayList data = new ArrayList(); - for (int k = 0; k < args.length; ++k) - for(int[] x: loadIntegers(args[k],myformat)) + for (String fn: files) + for(int[] x: loadIntegers(fn,myformat)) data.add(x); System.out.println("Loaded " + data.size() + " array(s)"); if(cm == CompressionMode.DELTA) { From 28bb5debb7447f312562f9d729c68e04e4ef2134 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 15 Nov 2013 10:36:21 -0500 Subject: [PATCH 122/412] Some optimization --- .../benchmarktools/BenchmarkCSV.java | 47 +++++++++++++------ 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java index 5b421c3..639e125 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java @@ -34,19 +34,19 @@ public class BenchmarkCSV { public static ArrayList loadIntegers(String filename,Format f) throws IOException { if(f== Format.ONEARRAYPERLINE) { - ArrayList answer = new ArrayList(); - BufferedReader br = new BufferedReader(new FileReader(filename)); - String s; - while((s = br.readLine())!= null) { - String[] numbers = s.split("[,;;]"); - int[] a = new int[numbers.length]; - for (int k = 0; k < numbers.length; ++k) { - a[k] = Integer.parseInt(numbers[k].trim()); - } - answer.add(a); - } - return answer; - } else {//Format.ONEARRAYPERFILE + ArrayList answer = new ArrayList(); + BufferedReader br = new BufferedReader(new FileReader(filename)); + String s; + while((s = br.readLine())!= null) { + String[] numbers = s.split("[,;;]"); // that's slow + int[] a = new int[numbers.length]; + for (int k = 0; k < numbers.length; ++k) { + a[k] = Integer.parseInt(numbers[k].trim()); + } + answer.add(a); + } + return answer; + } else if(f==Format.ONEARRAYPERFILE) { ArrayList answer = new ArrayList(); BufferedReader br = new BufferedReader(new FileReader(filename)); String s; @@ -62,10 +62,23 @@ public static ArrayList loadIntegers(String filename,Format f) throws IOE ArrayList wrap = new ArrayList(); wrap.add(actualanswer); return wrap; + } else { + ArrayList answer = new ArrayList(); + BufferedReader br = new BufferedReader(new FileReader(filename)); + String s; + while((s = br.readLine())!= null) { + answer.add(Integer.parseInt(s.trim())); + } + int[] actualanswer = new int[answer.size()]; + for(int i = 0; i < answer.size(); ++i) + actualanswer[i] = answer.get(i); + ArrayList wrap = new ArrayList(); + wrap.add(actualanswer); + return wrap; } } public enum Format { - ONEARRAYPERLINE, ONEARRAYPERFILE + ONEARRAYPERLINE, ONEARRAYPERFILE,ONEINTPERLINE } public enum CompressionMode { @@ -81,6 +94,8 @@ public static void main(String[] args) throws IOException { myformat = Format.ONEARRAYPERFILE; else if(s.equals("--nodelta")) cm = CompressionMode.AS_IS; + else if(s.equals("--oneintperline")) + myformat = Format.ONEINTPERLINE; else throw new RuntimeException("I don't understand: "+s); } else {// it is a filename files.add(s); @@ -89,7 +104,9 @@ else if(s.equals("--nodelta")) if(myformat == Format.ONEARRAYPERFILE) System.out.println("Treating each file as one array."); else if(myformat == Format.ONEARRAYPERLINE) - System.out.println("Each line of each file is an array: use --onearrayperfile to change."); + System.out.println("Each line of each file is an array: use --onearrayperfile or --oneintperline to change."); + else if(myformat == Format.ONEINTPERLINE) + System.out.println("Treating each file as one array, with one integer per line."); if(cm == CompressionMode.AS_IS) System.out.println("Compressing the integers 'as is' (no differential coding)"); else From 26dd16f76c6ed80cc007b8cbc1e6248a48fdbe16 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 15 Nov 2013 10:42:06 -0500 Subject: [PATCH 123/412] Removing unnecessary scheme --- .../integercompression/benchmarktools/BenchmarkCSV.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java index 639e125..74bf56c 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java @@ -16,8 +16,8 @@ public class BenchmarkCSV { new IntegratedComposition(new IntegratedFastPFOR(), new IntegratedVariableByte()), new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()), - new IntegratedVariableByte() }; + new IntegratedVariableByte()) + }; static IntegratedByteIntegerCODEC bcodecs[]= { new IntegratedVariableByte() }; @@ -25,8 +25,8 @@ public class BenchmarkCSV { new Composition(new FastPFOR(), new VariableByte()), new Composition(new BinaryPacking(), - new VariableByte()), - new VariableByte() }; + new VariableByte()) + }; static ByteIntegerCODEC regbcodecs[]= { new VariableByte() }; From de45d22c2f7bae6823221ac020636e6fb170e0b9 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 15 Nov 2013 13:34:04 -0500 Subject: [PATCH 124/412] Fixed a rarely occuring bug in FastPFOR and IntegratedFastPFOR (reported by zhenjl) --- CHANGELOG | 4 +- .../lemire/integercompression/FastPFOR.java | 4 +- .../IntegratedFastPFOR.java | 7 +- .../lemire/integercompression/BasicTest.java | 74 ++++++++++++++++++- 4 files changed, 83 insertions(+), 6 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 77165b9..f097b43 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,7 @@ upcoming - - Fixed bad compression ratio reporting in BenchmarkCSV + - Improved BenchmarkCVS + - Improved comments slightly + - Fix a rarely occuring bug in FastPFOR and IntegratedFastPFOR (reported by zhenjl) 0.0.8 (Nov. 12th 2013) - variable byte schemes can now be used without an unnecessary copy, if you have a byte[] output array diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 0cb2520..45f6a74 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -35,7 +35,7 @@ public final class FastPFOR implements IntegerCODEC { final static int DEFAULT_PAGE_SIZE = 65536; int pageSize; - final int[][] dataTobePacked = new int[32][]; + final int[][] dataTobePacked = new int[33][]; final ByteBuffer byteContainer; // Working area for compress and uncompress. @@ -52,7 +52,7 @@ public FastPFOR(int pagesize) { // Initiate arrrays. byteContainer = ByteBuffer.allocateDirect(3 * pageSize / BLOCK_SIZE + pageSize); - for (int k = 1; k < 32; ++k) + for (int k = 1; k < dataTobePacked.length; ++k) dataTobePacked[k] = new int[pageSize / 32 * 4]; // heuristic } diff --git a/src/main/java/me/lemire/integercompression/IntegratedFastPFOR.java b/src/main/java/me/lemire/integercompression/IntegratedFastPFOR.java index 5fe0277..eb0ceb4 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedFastPFOR.java +++ b/src/main/java/me/lemire/integercompression/IntegratedFastPFOR.java @@ -23,6 +23,9 @@ *

*

For multi-threaded applications, each thread should use its own IntegratedFastPFOR object.

* + * You should only use this scheme on sorted arrays. Use FastPFOR + * if you have unsorted arrays. + * * @author Daniel Lemire */ public final class IntegratedFastPFOR implements IntegratedIntegerCODEC { @@ -32,7 +35,7 @@ public final class IntegratedFastPFOR implements IntegratedIntegerCODEC { int pageSize; final int[] buffer = new int[BLOCK_SIZE]; - final int[][] dataTobePacked = new int[32][]; + final int[][] dataTobePacked = new int[33][]; final ByteBuffer byteContainer; // Working area for compress and uncompress. @@ -49,7 +52,7 @@ public IntegratedFastPFOR(int pagesize) { // Initiate arrrays. byteContainer = ByteBuffer.allocateDirect(3 * pageSize / BLOCK_SIZE + pageSize); - for (int k = 1; k < 32; ++k) + for (int k = 1; k < dataTobePacked.length; ++k) dataTobePacked[k] = new int[pageSize / 32 * 4]; // heuristic } diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 8a5caf6..6e80156 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -341,6 +341,42 @@ public void testUnsortedExample() { testUnsorted(new IntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte())); testUnsorted(new Composition(new IntegratedBinaryPacking(), new VariableByte())); + testUnsorted(new IntegratedComposition(new IntegratedFastPFOR(), + new IntegratedVariableByte())); + + testUnsorted2(new VariableByte()); + testUnsorted2(new IntegratedVariableByte()); + testUnsorted2(new Composition(new BinaryPacking(), new VariableByte())); + testUnsorted2(new Composition(new NewPFD(), new VariableByte())); + testUnsorted2(new Composition(new NewPFDS9(), new VariableByte())); + testUnsorted2(new Composition(new NewPFDS16(), new VariableByte())); + testUnsorted2(new Composition(new OptPFD(), new VariableByte())); + testUnsorted2(new Composition(new OptPFDS9(), new VariableByte())); + testUnsorted2(new Composition(new OptPFDS16(), new VariableByte())); + testUnsorted2(new Composition(new FastPFOR(), new VariableByte())); + + testUnsorted3(new IntegratedComposition(new IntegratedBinaryPacking(), + new IntegratedVariableByte())); + testUnsorted3(new Composition(new IntegratedBinaryPacking(), new VariableByte())); + testUnsorted3(new IntegratedComposition(new IntegratedFastPFOR(), + new IntegratedVariableByte())); + testUnsorted3(new VariableByte()); + testUnsorted3(new IntegratedVariableByte()); + testUnsorted3(new Composition(new BinaryPacking(), new VariableByte())); + testUnsorted3(new Composition(new NewPFD(), new VariableByte())); + testUnsorted3(new Composition(new NewPFDS9(), new VariableByte())); + testUnsorted3(new Composition(new NewPFDS16(), new VariableByte())); + testUnsorted3(new Composition(new OptPFD(), new VariableByte())); + testUnsorted3(new Composition(new OptPFDS9(), new VariableByte())); + testUnsorted3(new Composition(new OptPFDS16(), new VariableByte())); + testUnsorted3(new Composition(new FastPFOR(), new VariableByte())); + + testUnsorted2(new IntegratedComposition(new IntegratedBinaryPacking(), + new IntegratedVariableByte())); + testUnsorted2(new Composition(new IntegratedBinaryPacking(), new VariableByte())); + testUnsorted2(new IntegratedComposition(new IntegratedFastPFOR(), + new IntegratedVariableByte())); + } public void testUnsorted(IntegerCODEC codec) @@ -348,7 +384,7 @@ public void testUnsorted(IntegerCODEC codec) int[] lengths = { 133, 1333333 }; for (int N : lengths) { int[] data = new int[N]; - // initialize the data (most will be small + // initialize the data (most will be small) for (int k = 0; k < N; k += 1) data[k] = 3; // throw some larger values @@ -372,5 +408,41 @@ public void testUnsorted(IntegerCODEC codec) assertArrayEquals(data, recovered); } } + + public void testUnsorted2(IntegerCODEC codec) { + int[] data = new int[128]; + data[5] = -1; + int[] compressed = new int[1024]; + IntWrapper inputoffset = new IntWrapper(0); + IntWrapper outputoffset = new IntWrapper(0); + codec.compress(data, inputoffset, data.length, compressed, + outputoffset); + // we can repack the data: (optional) + compressed = Arrays.copyOf(compressed, outputoffset.intValue()); + + int[] recovered = new int[128]; + IntWrapper recoffset = new IntWrapper(0); + codec.uncompress(compressed, new IntWrapper(0), + compressed.length, recovered, recoffset); + assertArrayEquals(data, recovered); + } + + public void testUnsorted3(IntegerCODEC codec) { + int[] data = new int[128]; + data[127] = -1; + int[] compressed = new int[1024]; + IntWrapper inputoffset = new IntWrapper(0); + IntWrapper outputoffset = new IntWrapper(0); + codec.compress(data, inputoffset, data.length, compressed, + outputoffset); + // we can repack the data: (optional) + compressed = Arrays.copyOf(compressed, outputoffset.intValue()); + + int[] recovered = new int[128]; + IntWrapper recoffset = new IntWrapper(0); + codec.uncompress(compressed, new IntWrapper(0), + compressed.length, recovered, recoffset); + assertArrayEquals(data, recovered); + } } From e467ac0a5d42ea518558889ce87831bbbc902bee Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 15 Nov 2013 14:07:36 -0500 Subject: [PATCH 125/412] An even more robust BenchmarkCSV --- .../benchmarktools/BenchmarkCSV.java | 38 +++++++++++++++---- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java index 74bf56c..565fecd 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java @@ -33,7 +33,8 @@ public class BenchmarkCSV { public static ArrayList loadIntegers(String filename,Format f) throws IOException { - if(f== Format.ONEARRAYPERLINE) { + int misparsed = 0; + if(f== Format.ONEARRAYPERLINE) { ArrayList answer = new ArrayList(); BufferedReader br = new BufferedReader(new FileReader(filename)); String s; @@ -41,19 +42,32 @@ public static ArrayList loadIntegers(String filename,Format f) throws IOE String[] numbers = s.split("[,;;]"); // that's slow int[] a = new int[numbers.length]; for (int k = 0; k < numbers.length; ++k) { - a[k] = Integer.parseInt(numbers[k].trim()); - } + try { + a[k] = Integer.parseInt(numbers[k].trim()); + } catch(java.lang.NumberFormatException nfe) { + if(misparsed==0) + System.err.println(nfe); + ++misparsed; + } + } answer.add(a); - } + } + if(misparsed > 0) System.out.println("Failed to parse "+misparsed+" entries"); return answer; } else if(f==Format.ONEARRAYPERFILE) { ArrayList answer = new ArrayList(); BufferedReader br = new BufferedReader(new FileReader(filename)); String s; while((s = br.readLine())!= null) { - String[] numbers = s.split("[,;;]"); + String[] numbers = s.split("[,;;]");// that's slow for (int k = 0; k < numbers.length; ++k) { - answer.add(Integer.parseInt(numbers[k].trim())); + try { + answer.add(Integer.parseInt(numbers[k].trim())); + } catch(java.lang.NumberFormatException nfe) { + if(misparsed==0) + System.err.println(nfe); + ++misparsed; + } } } int[] actualanswer = new int[answer.size()]; @@ -61,19 +75,27 @@ public static ArrayList loadIntegers(String filename,Format f) throws IOE actualanswer[i] = answer.get(i); ArrayList wrap = new ArrayList(); wrap.add(actualanswer); + if(misparsed > 0) System.out.println("Failed to parse "+misparsed+" entries"); return wrap; } else { ArrayList answer = new ArrayList(); BufferedReader br = new BufferedReader(new FileReader(filename)); String s; while((s = br.readLine())!= null) { - answer.add(Integer.parseInt(s.trim())); + try { + answer.add(Integer.parseInt(s.trim())); + } catch(java.lang.NumberFormatException nfe) { + if(misparsed==0) + System.err.println(nfe); + ++misparsed; + } } int[] actualanswer = new int[answer.size()]; for(int i = 0; i < answer.size(); ++i) actualanswer[i] = answer.get(i); ArrayList wrap = new ArrayList(); wrap.add(actualanswer); + if(misparsed > 0) System.out.println("Failed to parse "+misparsed+" entries"); return wrap; } } @@ -198,7 +220,7 @@ public static void bytebench(ArrayList postings, CompressionMode cm, bool if (maxlength < x.length) maxlength = x.length; if (verbose) System.out.println("Max array length: " + maxlength); - byte[] compbuffer = new byte[4*(maxlength + 1024)]; + byte[] compbuffer = new byte[6*(maxlength + 1024)]; int[] decompbuffer = new int[maxlength]; if(verbose) System.out.println("Scheme -- bits/int -- speed (mis)"); From 2bfd93e3b4bbcfb6e30c8ab1660559bf0807b894 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 15 Nov 2013 14:08:09 -0500 Subject: [PATCH 126/412] Preparing new version --- CHANGELOG | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index f097b43..8852b88 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,7 +1,7 @@ upcoming - Improved BenchmarkCVS - Improved comments slightly - - Fix a rarely occuring bug in FastPFOR and IntegratedFastPFOR (reported by zhenjl) + - Fixed a rarely occuring bug in FastPFOR and IntegratedFastPFOR (reported by zhenjl) 0.0.8 (Nov. 12th 2013) - variable byte schemes can now be used without an unnecessary copy, if you have a byte[] output array diff --git a/README.md b/README.md index acd1a7d..4c46073 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ the following code in your pom.xml file: me.lemire.integercompression JavaFastPFOR - 0.0.8 + 0.0.9 From 3829309e01036af80657e2f45077965df20b2057 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 15 Nov 2013 14:18:08 -0500 Subject: [PATCH 127/412] [maven-release-plugin] prepare release JavaFastPFOR-0.0.9 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1cc2006..c3bba7e 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.9-SNAPSHOT + 0.0.9 jar From d990471ea6c545f1ff5edcd86c02f4dcd03b693f Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 15 Nov 2013 14:18:11 -0500 Subject: [PATCH 128/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c3bba7e..9ad6c75 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.9 + 0.0.10-SNAPSHOT jar From 38f8b91f9bad31d714ff7eef6a259299c9c558e5 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 25 Nov 2013 10:26:51 -0500 Subject: [PATCH 129/412] Adding another unit test --- .../lemire/integercompression/BasicTest.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 6e80156..ccf69b6 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -16,7 +16,53 @@ @SuppressWarnings({"static-method","javadoc"}) public class BasicTest { + IntegerCODEC[] codecs = { + new IntegratedComposition(new IntegratedBinaryPacking(), + new IntegratedVariableByte()), + new JustCopy(), + new VariableByte(), + new IntegratedVariableByte(), + new Composition(new BinaryPacking(), new VariableByte()), + new Composition(new NewPFD(), new VariableByte()), + new Composition(new NewPFDS16(), new VariableByte()), + new Composition(new OptPFDS9(), new VariableByte()), + new Composition(new OptPFDS16(), new VariableByte()), + new IntegratedComposition(new IntegratedFastPFOR(), + new IntegratedVariableByte()), + new Composition(new FastPFOR(), new VariableByte()), + new Simple9(), + new Composition(new XorBinaryPacking(), new VariableByte()), + new Composition(new DeltaZigzagBinaryPacking(), + new DeltaZigzagVariableByte()) }; + @Test + public void varyingLengthTest() { + int N = 4096; + int[] data = new int[N]; + for (int k = 0; k < N; ++k) + data[k] = k; + for (IntegerCODEC c : codecs) { + for (int L = 1; L <= 128; L++) { + int[] comp = TestUtils.compress(c, + Arrays.copyOf(data, L)); + int[] answer = TestUtils.uncompress(c, comp, L); + for (int k = 0; k < L; ++k) + if (answer[k] != data[k]) + throw new RuntimeException( + "bug"); + } + for (int L = 128; L <= N; L*=2) { + int[] comp = TestUtils.compress(c, + Arrays.copyOf(data, L)); + int[] answer = TestUtils.uncompress(c, comp, L); + for (int k = 0; k < L; ++k) + if (answer[k] != data[k]) + throw new RuntimeException( + "bug"); + } + } + } + @Test public void checkDeltaZigzagVB() { DeltaZigzagVariableByte codec = new DeltaZigzagVariableByte(); From eb5ce7c15faec20a89fb38805bff1babf7d243da Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 25 Nov 2013 11:27:06 -0500 Subject: [PATCH 130/412] Allocating more memory, to help avoid confusion --- example.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/example.java b/example.java index fd7430e..d96ddc4 100644 --- a/example.java +++ b/example.java @@ -27,7 +27,7 @@ public static void basicExample() { new IntegratedBinaryPacking(), new IntegratedVariableByte()); // output vector should be large enough... - int [] compressed = new int[data.length]; + int [] compressed = new int[data.length+1024]; // compressed might not be large enough in some cases // if you get java.lang.ArrayIndexOutOfBoundsException, try // allocating more memory @@ -74,7 +74,7 @@ public static void unsortedExample() { // throw some larger values for(int k = 0; k < N; k+=5) data[k] = 100; for(int k = 0; k < N; k+=533) data[k] = 10000; - int[] compressed = new int [N];// could need more + int[] compressed = new int [N+1024];// could need more IntegerCODEC codec = new Composition( new FastPFOR(), @@ -124,7 +124,7 @@ public static void advancedExample() { IntegratedIntegerCODEC lastcodec = new IntegratedComposition(regularcodec,ivb); // output vector should be large enough... - int [] compressed = new int[TotalSize]; + int [] compressed = new int[TotalSize+1024]; /** From e0278dbeb775de818c42e5a18f6f49e5735bfaa1 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 4 Dec 2013 10:52:53 -0500 Subject: [PATCH 131/412] Added a reference --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 4c46073..8a7c90c 100644 --- a/README.md +++ b/README.md @@ -133,4 +133,9 @@ Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second throu http://arxiv.org/abs/1209.2137 +Ikhtear Sharif wrote his M.Sc. thesis on this library: +Ikhtear Sharif, Performance Evaluation of Fast Integer Compression Techniques Over Tables, M.Sc. thesis, UNB 2013. +http://hdl.handle.net/1882/45703 + +He also posted his slides online: http://www.slideshare.net/ikhtearSharif/ikhtear-defense From 53582f6e428f282d9f2a5654fb6d8348df64fc7b Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Sat, 25 Jan 2014 20:25:05 -0500 Subject: [PATCH 132/412] Preparing new release --- CHANGELOG | 5 +- README.md | 2 +- .../com/kamikaze/pfordelta/LCPForDelta.java | 993 +- .../com/kamikaze/pfordelta/PForDelta.java | 715 +- .../pfordelta/PForDeltaUnpack128.java | 1782 +-- .../PForDeltaUnpack128WIthIntBuffer.java | 1748 +-- .../java/com/kamikaze/pfordelta/Simple16.java | 219 +- .../pfordelta/Simple16WithHardCodes.java | 1246 +- .../lemire/integercompression/Benchmark.java | 539 - .../BenchmarkBitPacking.java | 127 - .../BenchmarkOffsettedSeries.java | 322 - .../integercompression/BinaryPacking.java | 122 +- .../lemire/integercompression/BitPacking.java | 11373 ++++++---------- .../integercompression/ByteIntegerCODEC.java | 75 +- .../integercompression/Composition.java | 92 +- .../me/lemire/integercompression/Delta.java | 228 +- .../DeltaZigzagBinaryPacking.java | 158 +- .../DeltaZigzagEncoding.java | 174 +- .../DeltaZigzagVariableByte.java | 191 +- .../lemire/integercompression/FastPFOR.java | 452 +- .../lemire/integercompression/IntWrapper.java | 125 +- .../integercompression/IntegerCODEC.java | 73 +- .../IntegratedBinaryPacking.java | 148 +- .../IntegratedBitPacking.java | 8540 ++++++------ .../IntegratedByteIntegerCODEC.java | 5 +- .../IntegratedComposition.java | 93 +- .../IntegratedFastPFOR.java | 469 +- .../IntegratedIntegerCODEC.java | 8 +- .../IntegratedVariableByte.java | 223 +- .../lemire/integercompression/JustCopy.java | 43 +- .../me/lemire/integercompression/NewPFD.java | 261 +- .../lemire/integercompression/NewPFDS16.java | 259 +- .../lemire/integercompression/NewPFDS9.java | 257 +- .../me/lemire/integercompression/OptPFD.java | 291 +- .../lemire/integercompression/OptPFDS16.java | 287 +- .../lemire/integercompression/OptPFDS9.java | 289 +- .../integercompression/PerformanceLogger.java | 72 - .../me/lemire/integercompression/S16.java | 295 +- .../java/me/lemire/integercompression/S9.java | 310 +- .../me/lemire/integercompression/Simple9.java | 528 +- .../me/lemire/integercompression/Util.java | 111 +- .../integercompression/VariableByte.java | 187 +- .../integercompression/XorBinaryPacking.java | 237 +- .../benchmarktools/BenchmarkCSV.java | 226 +- .../synth/ClusteredDataGenerator.java | 125 +- .../synth/UniformDataGenerator.java | 24 +- .../lemire/integercompression/AdhocTest.java | 16 +- .../lemire/integercompression/BasicTest.java | 7 - .../DeltaZigzagEncodingTest.java | 19 +- .../lemire/integercompression/TestUtils.java | 1 + .../XorBinaryPackingTest.java | 65 +- 51 files changed, 15279 insertions(+), 18878 deletions(-) delete mode 100644 src/main/java/me/lemire/integercompression/Benchmark.java delete mode 100644 src/main/java/me/lemire/integercompression/BenchmarkBitPacking.java delete mode 100644 src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java delete mode 100644 src/main/java/me/lemire/integercompression/PerformanceLogger.java diff --git a/CHANGELOG b/CHANGELOG index 8852b88..e8b1651 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,7 @@ -upcoming +0.0.10 (Jan. 25th 2014) + - cleaning the code and improving the documentation + +0.0.9 (Nov. 15th 2013) - Improved BenchmarkCVS - Improved comments slightly - Fixed a rarely occuring bug in FastPFOR and IntegratedFastPFOR (reported by zhenjl) diff --git a/README.md b/README.md index 8a7c90c..2ec046a 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ See example.java for a simple demonstration. How fast is it? --------------- -Compile the code and execute me.lemire.integercompression.Benchmark. +Compile the code and execute me.lemire.integercompression.benchmarktools.Benchmark. I recommend running all the benchmarks with the "-server" flag on a desktop machine. diff --git a/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java b/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java index abf6c4f..ebed219 100644 --- a/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java +++ b/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java @@ -6,7 +6,6 @@ * JavaFastPFOR library for comparison purposes. As the original */ - /** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -28,484 +27,608 @@ import java.util.Arrays; /** - * Implementation of the optimized PForDelta algorithm for sorted integer arrays. The basic ideas are based on + * Implementation of the optimized PForDelta algorithm for sorted integer + * arrays. The basic ideas are based on * * 1. Original algorithm from * http://homepages.cwi.nl/~heman/downloads/msthesis.pdf * - * 2. Optimization and - * variation from http://www2008.org/papers/pdf/p387-zhangA.pdf + * 2. Optimization and variation from + * http://www2008.org/papers/pdf/p387-zhangA.pdf * - * 3. Further optimization - * http://www2009.org/proceedings/pdf/p401.pdf + * 3. Further optimization http://www2009.org/proceedings/pdf/p401.pdf * - * As a part of the PForDelta implementation, Simple16 is used to compress exceptions. - * The original Simple16 algorithm can also be found in the above literature. + * As a part of the PForDelta implementation, Simple16 is used to compress + * exceptions. The original Simple16 algorithm can also be found in the above + * literature. * - * This implementation overcomes the problem that Simple16 cannot deal with >2^28 numbers. + * This implementation overcomes the problem that Simple16 cannot deal with + * >2^28 numbers. + * + * This implementation is almost same as PForDelta in the same package, except + * that it is tuned especially for Lucene-4.0 Codec to achieve the best + * performance in Lucene-4.0. * - * This implementation is almost same as PForDelta in the same package, except that it is tuned especially for Lucene-4.0 Codec to achieve - * the best performance in Lucene-4.0. - * * @author hao yan, hyan2008@gmail.com */ @SuppressWarnings("javadoc") public class LCPForDelta { - // NOTE: we expect the blockSize is always < (1<<(31-POSSIBLE_B_BITS)). For example, in the current default settings, - // the blockSize < (1<<(31-5)), that is, < 2^27 - - //All possible values of b in the PForDelta algorithm - private static final int[] POSSIBLE_B = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 20, 28}; - - // POSSIBLE_B.length < (1<>> 5)]; - - int[] expPosBuffer = new int[blockSize]; - int[] expHighBitsBuffer = new int[blockSize]; - - // compress the b-bit slots - for (int i = 0; i < blockSize; ++i) { - int value = inputBlock[i]; - if (value < expUpperBound) { - writeBits(tmpCompBuffer, value, outputOffset, bits); - } else // exp - { - // store the lower bits-bits of the exception - writeBits(tmpCompBuffer, value & MASK[bits], outputOffset, bits); - // write the position of exception - expPosBuffer[expNum] = i; - // write the higher 32-bits bits of the exception - expHighBitsBuffer[expNum] = (value >>> bits) & MASK[32 - bits]; - expNum++; - } - outputOffset += bits; + public void setCompBuffer(int[] buffer) { + compBuffer = buffer; } - tmpCompBuffer[0] = ((bits & MASK[POSSIBLE_B_BITS]) << (31 - POSSIBLE_B_BITS)) | (expNum & MASK[31 - POSSIBLE_B_BITS]); - - // compress exceptions - if (expNum > 0) { - int compressedBitSize; + /** + * Compress one block of blockSize integers using PForDelta with the + * optimal parameter b + * + * @param inBlock + * the block to be compressed + * @param blockSize + * the block size + * @return the compressed block + */ + public int compress(int[] inBlock, int blockSize) { + // find the best b that can lead to the smallest overall + // compressed size + int currentB = POSSIBLE_B[0]; + int tmpB = currentB; + boolean hasBigNum = checkBigNumbers(inBlock, blockSize, + POSSIBLE_B[POSSIBLE_B.length - 1]); + if (hasBigNum) { + currentB = 4; + } else { + int optSize = estimateCompressedSize(inBlock, + blockSize, tmpB); + for (int i = 1; i < POSSIBLE_B.length; ++i) { + tmpB = POSSIBLE_B[i]; + int curSize = estimateCompressedSize(inBlock, + blockSize, tmpB); + if (curSize < optSize) { + currentB = tmpB; + optSize = curSize; + } + } + } - compressedBitSize = compressBlockByS16(tmpCompBuffer, outputOffset, expPosBuffer, expNum, blockSize, inputBlock); - outputOffset += compressedBitSize; + // compress the block using the above best b + int compressedSizeInInts = compressOneBlockCore(inBlock, + blockSize, currentB); - compressedBitSize = compressBlockByS16(tmpCompBuffer, outputOffset, expHighBitsBuffer, expNum, blockSize, inputBlock); - outputOffset += compressedBitSize; + return compressedSizeInInts; } - // discard the redundant parts in the tmpCompressedBlock - int compressedSizeInInts = (outputOffset + 31) >>> 5; - - compBuffer = tmpCompBuffer; - return compressedSizeInInts; - } - - public int compressOneBlockCore2(int[] inputBlock, int blockSize, int bits) throws IllegalArgumentException { - int outputOffset = HEADER_SIZE; - int expUpperBound = 1 << bits; - int expNum = 0; - int maxCompBitSize = HEADER_SIZE + blockSize * (MAX_BITS + MAX_BITS + MAX_BITS) + 32; - int[] tmpCompBuffer = new int[(maxCompBitSize >>> 5)]; - - int[] expPosBuffer = new int[blockSize]; - int[] expHighBitsBuffer = new int[blockSize]; - - // compress the b-bit slots - for (int i = 0; i < blockSize; ++i) { - int value = inputBlock[i]; - if (value < expUpperBound) { - writeBits(tmpCompBuffer, value, outputOffset, bits); - } else // exp - { - // store the lower bits-bits of the exception - writeBits(tmpCompBuffer, value & MASK[bits], outputOffset, bits); - // write the position of exception - expPosBuffer[expNum] = i; - // write the higher 32-bits bits of the exception - expHighBitsBuffer[expNum] = (value >>> bits) & MASK[32 - bits]; - expNum++; - } - outputOffset += bits; - } + /** + * The core implementation of compressing a block with blockSize + * integers using PForDelta with the given parameter b + * + * @param inputBlock + * the block to be compressed + * @param blockSize + * the block size + * @param bits + * the the value of the parameter b + * @return the size of the compressed block (the number of ints) + * @throws IllegalArgumentException + */ + public int compressOneBlockCore(int[] inputBlock, int blockSize, + int bits) throws IllegalArgumentException { + int outputOffset = HEADER_SIZE; + int expUpperBound = 1 << bits; + int expNum = 0; + int maxCompBitSize = HEADER_SIZE + blockSize + * (MAX_BITS + MAX_BITS + MAX_BITS) + 32; + int[] tmpCompBuffer = new int[(maxCompBitSize >>> 5)]; + + int[] expPosBuffer = new int[blockSize]; + int[] expHighBitsBuffer = new int[blockSize]; + + // compress the b-bit slots + for (int i = 0; i < blockSize; ++i) { + int value = inputBlock[i]; + if (value < expUpperBound) { + writeBits(tmpCompBuffer, value, outputOffset, + bits); + } else // exp + { + // store the lower bits-bits of the exception + writeBits(tmpCompBuffer, value & MASK[bits], + outputOffset, bits); + // write the position of exception + expPosBuffer[expNum] = i; + // write the higher 32-bits bits of the + // exception + expHighBitsBuffer[expNum] = (value >>> bits) + & MASK[32 - bits]; + expNum++; + } + outputOffset += bits; + } + + tmpCompBuffer[0] = ((bits & MASK[POSSIBLE_B_BITS]) << (31 - POSSIBLE_B_BITS)) + | (expNum & MASK[31 - POSSIBLE_B_BITS]); - tmpCompBuffer[0] = ((bits & MASK[POSSIBLE_B_BITS]) << (31 - POSSIBLE_B_BITS)) | (expNum & MASK[31 - POSSIBLE_B_BITS]); + // compress exceptions + if (expNum > 0) { + int compressedBitSize; - // compress exceptions - if (expNum > 0) { - int compressedBitSize; + compressedBitSize = compressBlockByS16(tmpCompBuffer, + outputOffset, expPosBuffer, expNum, blockSize, + inputBlock); + outputOffset += compressedBitSize; + + compressedBitSize = compressBlockByS16(tmpCompBuffer, + outputOffset, expHighBitsBuffer, expNum, + blockSize, inputBlock); + outputOffset += compressedBitSize; + } - int[] expBuffer = new int[expNum * 2]; - System.arraycopy(expPosBuffer, 0, expBuffer, 0, expNum); - System.arraycopy(expHighBitsBuffer, 0, expBuffer, expNum, expNum); + // discard the redundant parts in the tmpCompressedBlock + int compressedSizeInInts = (outputOffset + 31) >>> 5; - compressedBitSize = compressBlockByS16(tmpCompBuffer, outputOffset, expBuffer, expNum * 2, blockSize, inputBlock); - outputOffset += compressedBitSize; + compBuffer = tmpCompBuffer; + return compressedSizeInInts; } - // discard the redundant parts in the tmpCompressedBlock - int compressedSizeInInts = (outputOffset + 31) >>> 5; - - compBuffer = tmpCompBuffer; - return compressedSizeInInts; - } - - /** - * Decompress one block using PForDelta - * - * @param decompBlock the block that was decompressed - * @param inBlock the block to be decompressed - * @param blockSize the number of elements in the decompressed block - */ - public static void decompressOneBlock(int[] decompBlock, int[] inBlock, int blockSize) { - int expNum = inBlock[0] & MASK[31 - POSSIBLE_B_BITS]; - int bits = (inBlock[0] >>> (31 - POSSIBLE_B_BITS)) & (0x1f); - - int[] expPosBuffer = new int[blockSize]; - int[] expHighBitsBuffer = new int[blockSize]; - - // decompress the b-bit slots - int offset = HEADER_SIZE; - int compressedBits = 0; - if (bits == 0) { - Arrays.fill(decompBlock, 0); - } else { - compressedBits = decompressBBitSlots(decompBlock, inBlock, blockSize, bits); - //compressedBits = decompressBBitSlotsWithHardCodes(decompBlock, inBlock, blockSize, bits); + public int compressOneBlockCore2(int[] inputBlock, int blockSize, + int bits) throws IllegalArgumentException { + int outputOffset = HEADER_SIZE; + int expUpperBound = 1 << bits; + int expNum = 0; + int maxCompBitSize = HEADER_SIZE + blockSize + * (MAX_BITS + MAX_BITS + MAX_BITS) + 32; + int[] tmpCompBuffer = new int[(maxCompBitSize >>> 5)]; + + int[] expPosBuffer = new int[blockSize]; + int[] expHighBitsBuffer = new int[blockSize]; + + // compress the b-bit slots + for (int i = 0; i < blockSize; ++i) { + int value = inputBlock[i]; + if (value < expUpperBound) { + writeBits(tmpCompBuffer, value, outputOffset, + bits); + } else // exp + { + // store the lower bits-bits of the exception + writeBits(tmpCompBuffer, value & MASK[bits], + outputOffset, bits); + // write the position of exception + expPosBuffer[expNum] = i; + // write the higher 32-bits bits of the + // exception + expHighBitsBuffer[expNum] = (value >>> bits) + & MASK[32 - bits]; + expNum++; + } + outputOffset += bits; + } + + tmpCompBuffer[0] = ((bits & MASK[POSSIBLE_B_BITS]) << (31 - POSSIBLE_B_BITS)) + | (expNum & MASK[31 - POSSIBLE_B_BITS]); + + // compress exceptions + if (expNum > 0) { + int compressedBitSize; + + int[] expBuffer = new int[expNum * 2]; + System.arraycopy(expPosBuffer, 0, expBuffer, 0, expNum); + System.arraycopy(expHighBitsBuffer, 0, expBuffer, + expNum, expNum); + + compressedBitSize = compressBlockByS16(tmpCompBuffer, + outputOffset, expBuffer, expNum * 2, blockSize, + inputBlock); + outputOffset += compressedBitSize; + } + + // discard the redundant parts in the tmpCompressedBlock + int compressedSizeInInts = (outputOffset + 31) >>> 5; + + compBuffer = tmpCompBuffer; + return compressedSizeInInts; } - offset += compressedBits; - - // decompress exceptions - if (expNum > 0) { - compressedBits = decompressBlockByS16(expPosBuffer, inBlock, offset, expNum); - offset += compressedBits; - compressedBits = decompressBlockByS16(expHighBitsBuffer, inBlock, offset, expNum); - offset += compressedBits; - - for (int i = 0; i < expNum; i++) { - int curExpPos = expPosBuffer[i]; - int curHighBits = expHighBitsBuffer[i]; - decompBlock[curExpPos] = (decompBlock[curExpPos] & MASK[bits]) | ((curHighBits & MASK[32 - bits]) << bits); - } + + /** + * Decompress one block using PForDelta + * + * @param decompBlock + * the block that was decompressed + * @param inBlock + * the block to be decompressed + * @param blockSize + * the number of elements in the decompressed block + */ + public static void decompressOneBlock(int[] decompBlock, int[] inBlock, + int blockSize) { + int expNum = inBlock[0] & MASK[31 - POSSIBLE_B_BITS]; + int bits = (inBlock[0] >>> (31 - POSSIBLE_B_BITS)) & (0x1f); + + int[] expPosBuffer = new int[blockSize]; + int[] expHighBitsBuffer = new int[blockSize]; + + // decompress the b-bit slots + int offset = HEADER_SIZE; + int compressedBits = 0; + if (bits == 0) { + Arrays.fill(decompBlock, 0); + } else { + compressedBits = decompressBBitSlots(decompBlock, + inBlock, blockSize, bits); + // compressedBits = + // decompressBBitSlotsWithHardCodes(decompBlock, + // inBlock, blockSize, bits); + } + offset += compressedBits; + + // decompress exceptions + if (expNum > 0) { + compressedBits = decompressBlockByS16(expPosBuffer, + inBlock, offset, expNum); + offset += compressedBits; + compressedBits = decompressBlockByS16( + expHighBitsBuffer, inBlock, offset, expNum); + offset += compressedBits; + + for (int i = 0; i < expNum; i++) { + int curExpPos = expPosBuffer[i]; + int curHighBits = expHighBitsBuffer[i]; + decompBlock[curExpPos] = (decompBlock[curExpPos] & MASK[bits]) + | ((curHighBits & MASK[32 - bits]) << bits); + } + } } - } - - public static void decompressOneBlockWithSize(int[] decompBlock, int[] inBlock, int blockSize, int[] expPosBuffer, int[] expHighBitsBuffer, int inBlockLen) { - int expNum = inBlock[0] & MASK[31 - POSSIBLE_B_BITS]; - int bits = (inBlock[0] >>> (31 - POSSIBLE_B_BITS)) & (0x1f); - - // decompress the b-bit slots - int offset = HEADER_SIZE; - int compressedBits = 0; - if (bits == 0) { - Arrays.fill(decompBlock, 0, inBlockLen, 0); - } else { - //compressedBits = decompressBBitSlotsWithHardCodes(decompBlock, inBlock, blockSize, bits); - compressedBits = decompressBBitSlots(decompBlock, inBlock, blockSize, bits); + + public static void decompressOneBlockWithSize(int[] decompBlock, + int[] inBlock, int blockSize, int[] expPosBuffer, + int[] expHighBitsBuffer, int inBlockLen) { + int expNum = inBlock[0] & MASK[31 - POSSIBLE_B_BITS]; + int bits = (inBlock[0] >>> (31 - POSSIBLE_B_BITS)) & (0x1f); + + // decompress the b-bit slots + int offset = HEADER_SIZE; + int compressedBits = 0; + if (bits == 0) { + Arrays.fill(decompBlock, 0, inBlockLen, 0); + } else { + // compressedBits = + // decompressBBitSlotsWithHardCodes(decompBlock, + // inBlock, blockSize, bits); + compressedBits = decompressBBitSlots(decompBlock, + inBlock, blockSize, bits); + } + offset += compressedBits; + + // decompress exceptions + if (expNum > 0) { + compressedBits = decompressBlockByS16(expPosBuffer, + inBlock, offset, expNum); + offset += compressedBits; + compressedBits = decompressBlockByS16( + expHighBitsBuffer, inBlock, offset, expNum); + offset += compressedBits; + + for (int i = 0; i < expNum; i++) { + int curExpPos = expPosBuffer[i]; + int curHighBits = expHighBitsBuffer[i]; + decompBlock[curExpPos] = (decompBlock[curExpPos] & MASK[bits]) + | ((curHighBits & MASK[32 - bits]) << bits); + } + } } - offset += compressedBits; - - // decompress exceptions - if (expNum > 0) { - compressedBits = decompressBlockByS16(expPosBuffer, inBlock, offset, expNum); - offset += compressedBits; - compressedBits = decompressBlockByS16(expHighBitsBuffer, inBlock, offset, expNum); - offset += compressedBits; - - for (int i = 0; i < expNum; i++) { - int curExpPos = expPosBuffer[i]; - int curHighBits = expHighBitsBuffer[i]; - decompBlock[curExpPos] = (decompBlock[curExpPos] & MASK[bits]) | ((curHighBits & MASK[32 - bits]) << bits); - } + + public static void decompressOneBlockWithSizeWithIntBuffer( + final int[] decompBlock, final IntBuffer inBlock, + final int blockSize, final int[] expPosBuffer, + final int[] expHighBitsBuffer, final int inBlockLen) { + final int flag = inBlock.get(); + final int expNum = flag & MASK[31 - POSSIBLE_B_BITS]; + final int bits = (flag >>> (31 - POSSIBLE_B_BITS)) & (0x1f); + if (bits == 0) { + Arrays.fill(decompBlock, 0, inBlockLen, 0); + } else { + PForDeltaUnpack128WIthIntBuffer.unpack(decompBlock, + inBlock, bits); + } + + if (expNum > 0) { + // decompress expPos + int num, outOffset = 0, numLeft; + for (numLeft = expNum; numLeft > 0; numLeft -= num) { + num = Simple16WithHardCodes + .s16DecompressWithIntBufferWithHardCodes( + expPosBuffer, outOffset, + inBlock.get(), numLeft); + outOffset += num; + } + + // decompress expHighBits and decompBlock at the same + // time + for (outOffset = 0, numLeft = expNum; numLeft > 0; numLeft -= num) { + num = Simple16WithHardCodes + .s16DecompressWithIntBufferIntegrated2( + decompBlock, outOffset, + inBlock.get(), numLeft, + expPosBuffer, bits); + outOffset += num; + } + } } - } - - public static void decompressOneBlockWithSizeWithIntBuffer(final int[] decompBlock, final IntBuffer inBlock, final int blockSize, final int[] expPosBuffer, final int[] expHighBitsBuffer, final int inBlockLen) { - final int flag = inBlock.get(); - final int expNum = flag & MASK[31 - POSSIBLE_B_BITS]; - final int bits = (flag >>> (31 - POSSIBLE_B_BITS)) & (0x1f); - if (bits == 0) { - Arrays.fill(decompBlock, 0, inBlockLen, 0); - } else { - PForDeltaUnpack128WIthIntBuffer.unpack(decompBlock, inBlock, bits); + + /** + * Estimate the compressed size in ints of a block + * + * @param inputBlock + * the block to be compressed + * @param bits + * the value of the parameter b + * @param blockSize + * the block size + * @return the compressed size in ints + * @throws IllegalArgumentException + */ + public static int estimateCompressedSize(int[] inputBlock, + int blockSize, int bits) throws IllegalArgumentException { + int maxNoExp = (1 << bits) - 1; + // Size of the header and the bits-bit slots + int outputOffset = HEADER_SIZE + bits * blockSize; + int expNum = 0; + + for (int i = 0; i < blockSize; ++i) { + if (inputBlock[i] > maxNoExp) { + expNum++; + } + } + outputOffset += (expNum << 5); + + return outputOffset; } - if (expNum > 0) { - // decompress expPos - int num, outOffset = 0, numLeft; - for (numLeft = expNum; numLeft > 0; numLeft -= num) { - num = Simple16WithHardCodes.s16DecompressWithIntBufferWithHardCodes(expPosBuffer, outOffset, inBlock.get(), numLeft); - outOffset += num; - } - - // decompress expHighBits and decompBlock at the same time - for (outOffset = 0, numLeft = expNum; numLeft > 0; numLeft -= num) { - num = Simple16WithHardCodes.s16DecompressWithIntBufferIntegrated2(decompBlock, outOffset, inBlock.get(), numLeft, expPosBuffer, bits); - outOffset += num; - } + /** + * Check if the block contains big numbers that is greater than ((1<< + * bits)-1) + * + * @param inputBlock + * the block to be compressed + * @param bits + * the numbers of bits to decide whether a number is a + * big number + * @param blockSize + * the block size + * @return true if there is any big numbers in the block + * @throws IllegalArgumentException + */ + public static boolean checkBigNumbers(int[] inputBlock, int blockSize, + int bits) throws IllegalArgumentException { + int maxNoExp = (1 << bits) - 1; + for (int i = 0; i < blockSize; ++i) { + if (inputBlock[i] > maxNoExp) + return true; + } + return false; } - } - - - /** - * Estimate the compressed size in ints of a block - * - * @param inputBlock the block to be compressed - * @param bits the value of the parameter b - * @param blockSize the block size - * @return the compressed size in ints - * @throws IllegalArgumentException - */ - public static int estimateCompressedSize(int[] inputBlock, int blockSize, int bits) throws IllegalArgumentException { - int maxNoExp = (1 << bits) - 1; - // Size of the header and the bits-bit slots - int outputOffset = HEADER_SIZE + bits * blockSize; - int expNum = 0; - - for (int i = 0; i < blockSize; ++i) { - if (inputBlock[i] > maxNoExp) { - expNum++; - } + + /** + * Decompress b-bit slots + * + * @param outDecompSlots + * decompressed block which is the output + * @param inCompBlock + * the compressed block which is the input + * @param blockSize + * the block size + * @param bits + * the value of the parameter b + * @return the compressed size in bits of the data that has been + * decompressed + */ + public static int decompressBBitSlots(int[] outDecompSlots, + int[] inCompBlock, int blockSize, int bits) { + int compressedBitSize = 0; + int offset = HEADER_SIZE; + for (int i = 0; i < blockSize; i++) { + outDecompSlots[i] = readBits(inCompBlock, offset, bits); + offset += bits; + } + compressedBitSize = bits * blockSize; + + return compressedBitSize; } - outputOffset += (expNum << 5); - - return outputOffset; - } - - /** - * Check if the block contains big numbers that is greater than ((1<< bits)-1) - * - * @param inputBlock the block to be compressed - * @param bits the numbers of bits to decide whether a number is a big number - * @param blockSize the block size - * @return true if there is any big numbers in the block - * @throws IllegalArgumentException - */ - public static boolean checkBigNumbers(int[] inputBlock, int blockSize, int bits) throws IllegalArgumentException { - int maxNoExp = (1 << bits) - 1; - for (int i = 0; i < blockSize; ++i) { - if (inputBlock[i] > maxNoExp) return true; + + public static int decompressBBitSlotsWithHardCodes( + final int[] outDecompSlots, final int[] inCompBlock, + final int blockSize, final int bits) { + int compressedBitSize = 0; + PForDeltaUnpack128.unpack(outDecompSlots, inCompBlock, bits); + compressedBitSize = bits * blockSize; + return compressedBitSize; } - return false; - } - - - /** - * Decompress b-bit slots - * - * @param outDecompSlots decompressed block which is the output - * @param inCompBlock the compressed block which is the input - * @param blockSize the block size - * @param bits the value of the parameter b - * @return the compressed size in bits of the data that has been decompressed - */ - public static int decompressBBitSlots(int[] outDecompSlots, int[] inCompBlock, int blockSize, int bits) { - int compressedBitSize = 0; - int offset = HEADER_SIZE; - for (int i = 0; i < blockSize; i++) { - outDecompSlots[i] = readBits(inCompBlock, offset, bits); - offset += bits; + + public static int decompressBBitSlotsWithHardCodesWithIntBuffer( + final int[] outDecompSlots, final IntBuffer inCompBlock, + final int blockSize, final int bits) { + PForDeltaUnpack128WIthIntBuffer.unpack(outDecompSlots, + inCompBlock, bits); + return bits * blockSize; } - compressedBitSize = bits * blockSize; - - return compressedBitSize; - } - - - public static int decompressBBitSlotsWithHardCodes(final int[] outDecompSlots, final int[] inCompBlock, final int blockSize, final int bits) { - int compressedBitSize = 0; - PForDeltaUnpack128.unpack(outDecompSlots, inCompBlock, bits); - compressedBitSize = bits * blockSize; - return compressedBitSize; - } - - public static int decompressBBitSlotsWithHardCodesWithIntBuffer(final int[] outDecompSlots, final IntBuffer inCompBlock, final int blockSize, final int bits) { - PForDeltaUnpack128WIthIntBuffer.unpack(outDecompSlots, inCompBlock, bits); - return bits * blockSize; - } - - - /** - * Compress a block of blockSize integers using Simple16 algorithm - * - * @param outCompBlock the compressed block which is the output - * @param outStartOffsetInBits the start offset in bits of the compressed block - * @param inBlock the block to be compressed - * @param blockSize the block size - * @return the compressed size in bits - */ - private static int compressBlockByS16(int[] outCompBlock, int outStartOffsetInBits, int[] inBlock, int blockSize, int oriBlockSize, int[] oriInputBlock) { - int outOffset = (outStartOffsetInBits + 31) >>> 5; - int num, inOffset = 0, numLeft; - for (numLeft = blockSize; numLeft > 0; numLeft -= num) { - num = Simple16WithHardCodes.s16Compress(outCompBlock, outOffset, inBlock, inOffset, numLeft, blockSize, oriBlockSize, oriInputBlock); - outOffset++; - inOffset += num; + + /** + * Compress a block of blockSize integers using Simple16 algorithm + * + * @param outCompBlock + * the compressed block which is the output + * @param outStartOffsetInBits + * the start offset in bits of the compressed block + * @param inBlock + * the block to be compressed + * @param blockSize + * the block size + * @return the compressed size in bits + */ + private static int compressBlockByS16(int[] outCompBlock, + int outStartOffsetInBits, int[] inBlock, int blockSize, + int oriBlockSize, int[] oriInputBlock) { + int outOffset = (outStartOffsetInBits + 31) >>> 5; + int num, inOffset = 0, numLeft; + for (numLeft = blockSize; numLeft > 0; numLeft -= num) { + num = Simple16WithHardCodes.s16Compress(outCompBlock, + outOffset, inBlock, inOffset, numLeft, + blockSize, oriBlockSize, oriInputBlock); + outOffset++; + inOffset += num; + } + int compressedBitSize = (outOffset << 5) - outStartOffsetInBits; + return compressedBitSize; } - int compressedBitSize = (outOffset << 5) - outStartOffsetInBits; - return compressedBitSize; - } - - /** - * Decompress a block of blockSize integers using Simple16 algorithm - * - * @param outDecompBlock the decompressed block which is the output - * @param inCompBlock the compressed block which is the input - * @param blockSize the block size - * @param inStartOffsetInBits the start offset in bits of the compressed block - * @return the compressed size in bits of the data that has been decompressed - */ - public static int decompressBlockByS16(int[] outDecompBlock, int[] inCompBlock, int inStartOffsetInBits, int blockSize) { - int inOffset = (inStartOffsetInBits + 31) >>> 5; - int num, outOffset = 0, numLeft; - for (numLeft = blockSize; numLeft > 0; numLeft -= num) { - num = Simple16.s16Decompress(outDecompBlock, outOffset, inCompBlock, inOffset, numLeft); - outOffset += num; - inOffset++; + + /** + * Decompress a block of blockSize integers using Simple16 algorithm + * + * @param outDecompBlock + * the decompressed block which is the output + * @param inCompBlock + * the compressed block which is the input + * @param blockSize + * the block size + * @param inStartOffsetInBits + * the start offset in bits of the compressed block + * @return the compressed size in bits of the data that has been + * decompressed + */ + public static int decompressBlockByS16(int[] outDecompBlock, + int[] inCompBlock, int inStartOffsetInBits, int blockSize) { + int inOffset = (inStartOffsetInBits + 31) >>> 5; + int num, outOffset = 0, numLeft; + for (numLeft = blockSize; numLeft > 0; numLeft -= num) { + num = Simple16.s16Decompress(outDecompBlock, outOffset, + inCompBlock, inOffset, numLeft); + outOffset += num; + inOffset++; + } + int compressedBitSize = (inOffset << 5) - inStartOffsetInBits; + return compressedBitSize; } - int compressedBitSize = (inOffset << 5) - inStartOffsetInBits; - return compressedBitSize; - } - - public static void decompressBlockByS16WithIntBuffer(final int[] outDecompBlock, final IntBuffer inCompBlock, final int blockSize) { - int num, outOffset = 0, numLeft; - for (numLeft = blockSize; numLeft > 0; numLeft -= num) { - num = Simple16WithHardCodes.s16DecompressWithIntBuffer(outDecompBlock, outOffset, inCompBlock.get(), numLeft); - outOffset += num; + + public static void decompressBlockByS16WithIntBuffer( + final int[] outDecompBlock, final IntBuffer inCompBlock, + final int blockSize) { + int num, outOffset = 0, numLeft; + for (numLeft = blockSize; numLeft > 0; numLeft -= num) { + num = Simple16WithHardCodes.s16DecompressWithIntBuffer( + outDecompBlock, outOffset, inCompBlock.get(), + numLeft); + outOffset += num; + } } - } - public static void decompressBlockByS16WithIntBufferIntegrated(final int[] outDecompBlock, final IntBuffer inCompBlock, final int blockSize, int[] expPosBuffer, int oribits) { - int num, outOffset = 0, numLeft; - for (numLeft = blockSize; numLeft > 0; numLeft -= num) { - num = Simple16WithHardCodes.s16DecompressWithIntBufferIntegrated(outDecompBlock, outOffset, inCompBlock.get(), numLeft, expPosBuffer, oribits); - outOffset += num; + public static void decompressBlockByS16WithIntBufferIntegrated( + final int[] outDecompBlock, final IntBuffer inCompBlock, + final int blockSize, int[] expPosBuffer, int oribits) { + int num, outOffset = 0, numLeft; + for (numLeft = blockSize; numLeft > 0; numLeft -= num) { + num = Simple16WithHardCodes + .s16DecompressWithIntBufferIntegrated( + outDecompBlock, outOffset, + inCompBlock.get(), numLeft, + expPosBuffer, oribits); + outOffset += num; + } } - } - - - /** - * Write a certain number of bits of an integer into an integer array starting from the given start offset - * - * @param out the output array - * @param val the integer to be written - * @param outOffset the start offset in bits in the output array - * @param bits the number of bits to be written (bits>=0) - */ - public static final void writeBits(int[] out, int val, int outOffset, int bits) { - if (bits == 0) - return; - final int index = outOffset >>> 5; - final int skip = outOffset & 0x1f; - val &= (0xffffffff >>> (32 - bits)); - out[index] |= (val << skip); - if (32 - skip < bits) { - out[index + 1] |= (val >>> (32 - skip)); + + /** + * Write a certain number of bits of an integer into an integer array + * starting from the given start offset + * + * @param out + * the output array + * @param val + * the integer to be written + * @param outOffset + * the start offset in bits in the output array + * @param bits + * the number of bits to be written (bits>=0) + */ + public static final void writeBits(int[] out, int val, int outOffset, + int bits) { + if (bits == 0) + return; + final int index = outOffset >>> 5; + final int skip = outOffset & 0x1f; + val &= (0xffffffff >>> (32 - bits)); + out[index] |= (val << skip); + if (32 - skip < bits) { + out[index + 1] |= (val >>> (32 - skip)); + } } - } - - /** - * Read a certain number of bits of an integer into an integer array starting from the given start offset - * - * @param in the input array - * @param inOffset the start offset in bits in the input array - * @param bits the number of bits to be read, unlike writeBits(), readBits() does not deal with bits==0 and thus bits must > 0. When bits ==0, the calling functions will just skip the entire bits-bit slots without decoding them - * @return the bits bits of the input - */ - public static final int readBits(int[] in, final int inOffset, final int bits) { - final int index = inOffset >>> 5; - final int skip = inOffset & 0x1f; - int val = in[index] >>> skip; - if (32 - skip < bits) { - val |= (in[index + 1] << (32 - skip)); + + /** + * Read a certain number of bits of an integer into an integer array + * starting from the given start offset + * + * @param in + * the input array + * @param inOffset + * the start offset in bits in the input array + * @param bits + * the number of bits to be read, unlike writeBits(), + * readBits() does not deal with bits==0 and thus bits + * must > 0. When bits ==0, the calling functions will + * just skip the entire bits-bit slots without decoding + * them + * @return the bits bits of the input + */ + public static final int readBits(int[] in, final int inOffset, + final int bits) { + final int index = inOffset >>> 5; + final int skip = inOffset & 0x1f; + int val = in[index] >>> skip; + if (32 - skip < bits) { + val |= (in[index + 1] << (32 - skip)); + } + return val & (0xffffffff >>> (32 - bits)); } - return val & (0xffffffff >>> (32 - bits)); - } - - public static final int readBitsWithBuffer(int[] in, final int inOffset, final int bits) { - final int index = inOffset >>> 5; - final int skip = inOffset & 0x1f; - int val = in[index] >>> skip; - if (32 - skip < bits) { - val |= (in[index + 1] << (32 - skip)); + + public static final int readBitsWithBuffer(int[] in, + final int inOffset, final int bits) { + final int index = inOffset >>> 5; + final int skip = inOffset & 0x1f; + int val = in[index] >>> skip; + if (32 - skip < bits) { + val |= (in[index + 1] << (32 - skip)); + } + return val & (0xffffffff >>> (32 - bits)); } - return val & (0xffffffff >>> (32 - bits)); - } } - - diff --git a/src/main/java/com/kamikaze/pfordelta/PForDelta.java b/src/main/java/com/kamikaze/pfordelta/PForDelta.java index 69bb56f..6f59700 100644 --- a/src/main/java/com/kamikaze/pfordelta/PForDelta.java +++ b/src/main/java/com/kamikaze/pfordelta/PForDelta.java @@ -1,6 +1,5 @@ package com.kamikaze.pfordelta; - import java.util.Arrays; /** @@ -10,347 +9,437 @@ */ /** - * Implementation of the optimized PForDelta algorithm for sorted integer arrays. The basic ideas are based on + * Implementation of the optimized PForDelta algorithm for sorted integer + * arrays. The basic ideas are based on * * 1. Original algorithm from * http://homepages.cwi.nl/~heman/downloads/msthesis.pdf * - * 2. Optimization and - * variation from http://www2008.org/papers/pdf/p387-zhangA.pdf + * 2. Optimization and variation from + * http://www2008.org/papers/pdf/p387-zhangA.pdf * - * 3. Further optimization - * http://www2009.org/proceedings/pdf/p401.pdf + * 3. Further optimization http://www2009.org/proceedings/pdf/p401.pdf * - * As a part of the PForDelta implementation, Simple16 is used to compress exceptions. The original Simple16 algorithm can also be found in the above literatures. + * As a part of the PForDelta implementation, Simple16 is used to compress + * exceptions. The original Simple16 algorithm can also be found in the above + * literatures. * - * This implementation overcomes the problem that Simple16 cannot deal with >2^28 numbers. + * This implementation overcomes the problem that Simple16 cannot deal with + * >2^28 numbers. * * Author: hao yan hyan2008@gmail.com */ public class PForDelta { - // NOTE: we expect the blockSize is always < (1<<(31-POSSIBLE_B_BITS)). For example, in the current default settings, - // the blockSize < (1<<(31-5)), that is, < 2^27, the commonly used block size is 128 or 256. - - //All possible values of b in the PForDelta algorithm - private static final int[] POSSIBLE_B = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 20, 28}; - - // Max number of bits to store an uncompressed value - private static final int MAX_BITS = 32; - // Header records the value of b and the number of exceptions in the block - private static final int HEADER_NUM = 2; - // Header size in bits - private static final int HEADER_SIZE = MAX_BITS * HEADER_NUM; - - private static final int[] MASK = {0x00000000, - 0x00000001, 0x00000003, 0x00000007, 0x0000000f, 0x0000001f, 0x0000003f, - 0x0000007f, 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff, - 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff, 0x0001ffff, 0x0003ffff, - 0x0007ffff, 0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff, 0x00ffffff, - 0x01ffffff, 0x03ffffff, 0x07ffffff, 0x0fffffff, 0x1fffffff, 0x3fffffff, - 0x7fffffff, 0xffffffff}; - - /** - * Compress one block of blockSize integers using PForDelta with the optimal parameter b - * - * @param inBlock the block to be compressed - * @param blockSize the block size - * @return the compressed block - */ - public static int[] compressOneBlockOpt(final int[] inBlock, int blockSize) { - // find the best b that may lead to the smallest overall compressed size - int currentB = POSSIBLE_B[0]; - int[] outBlock = null; - int tmpB = currentB; - // deal with the large exception cases - boolean hasBigNum = checkBigNumbers(inBlock, POSSIBLE_B[POSSIBLE_B.length - 1], blockSize); - if (hasBigNum) { - currentB = 4; - System.out.println("has big num and the currentB is: " + currentB); - } else { - int optSize = estimateCompressedSize(inBlock, tmpB, blockSize); - for (int i = 1; i < POSSIBLE_B.length; ++i) { - tmpB = POSSIBLE_B[i]; - int curSize = estimateCompressedSize(inBlock, tmpB, blockSize); - if (curSize < optSize) { - currentB = tmpB; - optSize = curSize; + // NOTE: we expect the blockSize is always < (1<<(31-POSSIBLE_B_BITS)). + // For example, in the current default settings, + // the blockSize < (1<<(31-5)), that is, < 2^27, the commonly used block + // size is 128 or 256. + + // All possible values of b in the PForDelta algorithm + private static final int[] POSSIBLE_B = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 16, 20, 28 }; + + // Max number of bits to store an uncompressed value + private static final int MAX_BITS = 32; + // Header records the value of b and the number of exceptions in the + // block + private static final int HEADER_NUM = 2; + // Header size in bits + private static final int HEADER_SIZE = MAX_BITS * HEADER_NUM; + + private static final int[] MASK = { 0x00000000, 0x00000001, 0x00000003, + 0x00000007, 0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f, + 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff, + 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff, 0x0001ffff, + 0x0003ffff, 0x0007ffff, 0x000fffff, 0x001fffff, 0x003fffff, + 0x007fffff, 0x00ffffff, 0x01ffffff, 0x03ffffff, 0x07ffffff, + 0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff }; + + /** + * Compress one block of blockSize integers using PForDelta with the + * optimal parameter b + * + * @param inBlock + * the block to be compressed + * @param blockSize + * the block size + * @return the compressed block + */ + public static int[] compressOneBlockOpt(final int[] inBlock, + int blockSize) { + // find the best b that may lead to the smallest overall + // compressed size + int currentB = POSSIBLE_B[0]; + int[] outBlock = null; + int tmpB = currentB; + // deal with the large exception cases + boolean hasBigNum = checkBigNumbers(inBlock, + POSSIBLE_B[POSSIBLE_B.length - 1], blockSize); + if (hasBigNum) { + currentB = 4; + System.out.println("has big num and the currentB is: " + + currentB); + } else { + int optSize = estimateCompressedSize(inBlock, tmpB, + blockSize); + for (int i = 1; i < POSSIBLE_B.length; ++i) { + tmpB = POSSIBLE_B[i]; + int curSize = estimateCompressedSize(inBlock, + tmpB, blockSize); + if (curSize < optSize) { + currentB = tmpB; + optSize = curSize; + } + } } - } - } - // compress the block using the above best b - outBlock = compressOneBlock(inBlock, currentB, blockSize); - - return outBlock; - } - - /** - * Decompress one block using PForDelta - * - * @param outBlock the block that was decompressed - * @param inBlock the block to be decompressed - * @param blockSize the number of elements in the decompressed block - * @return the compressed size in bits - */ - public static int decompressOneBlock(int[] outBlock, int[] inBlock, int blockSize) { - int[] expAux = new int[blockSize * 2]; - - int expNum = inBlock[0] & 0x3ff; - int bits = (inBlock[0] >>> 10) & (0x1f); - - // decompress the b-bit slots - int offset = HEADER_SIZE; - int compressedBits = 0; - if (bits == 0) { - Arrays.fill(outBlock, 0); - } else { - compressedBits = decompressBBitSlots(outBlock, inBlock, blockSize, bits); - // Note that blocksize must be ==128 in order to use decompressBBitSlotsWithHardCodes - //compressedBits = decompressBBitSlotsWithHardCodes(outBlock, inBlock, blockSize, bits); - } - offset += compressedBits; - - // decompress exceptions - if (expNum > 0) { - compressedBits = decompressBlockByS16(expAux, inBlock, offset, expNum * 2); - offset += compressedBits; - - for (int i = 0; i < expNum; i++) { - int curExpPos = expAux[i]; - int curHighBits = expAux[i + expNum]; - outBlock[curExpPos] = (outBlock[curExpPos] & MASK[bits]) | ((curHighBits & MASK[32 - bits]) << bits); - } + // compress the block using the above best b + outBlock = compressOneBlock(inBlock, currentB, blockSize); + + return outBlock; } - return offset; - } - - /** - * Estimate the compressed size in ints of a block - * - * @param inputBlock the block to be compressed - * @param bits the value of the parameter b - * @param blockSize the block size - * @return the compressed size in ints - * @throws IllegalArgumentException - */ - public static int estimateCompressedSize(int[] inputBlock, int bits, int blockSize) throws IllegalArgumentException { - int maxNoExp = (1 << bits) - 1; - // Size of the header and the bits-bit slots - int outputOffset = HEADER_SIZE + bits * blockSize; - int expNum = 0; - - for (int i = 0; i < blockSize; ++i) { - if (inputBlock[i] > maxNoExp) { - expNum++; - } + + /** + * Decompress one block using PForDelta + * + * @param outBlock + * the block that was decompressed + * @param inBlock + * the block to be decompressed + * @param blockSize + * the number of elements in the decompressed block + * @return the compressed size in bits + */ + public static int decompressOneBlock(int[] outBlock, int[] inBlock, + int blockSize) { + int[] expAux = new int[blockSize * 2]; + + int expNum = inBlock[0] & 0x3ff; + int bits = (inBlock[0] >>> 10) & (0x1f); + + // decompress the b-bit slots + int offset = HEADER_SIZE; + int compressedBits = 0; + if (bits == 0) { + Arrays.fill(outBlock, 0); + } else { + compressedBits = decompressBBitSlots(outBlock, inBlock, + blockSize, bits); + // Note that blocksize must be ==128 in order to use + // decompressBBitSlotsWithHardCodes + // compressedBits = + // decompressBBitSlotsWithHardCodes(outBlock, inBlock, + // blockSize, bits); + } + offset += compressedBits; + + // decompress exceptions + if (expNum > 0) { + compressedBits = decompressBlockByS16(expAux, inBlock, + offset, expNum * 2); + offset += compressedBits; + + for (int i = 0; i < expNum; i++) { + int curExpPos = expAux[i]; + int curHighBits = expAux[i + expNum]; + outBlock[curExpPos] = (outBlock[curExpPos] & MASK[bits]) + | ((curHighBits & MASK[32 - bits]) << bits); + } + } + return offset; } - outputOffset += (expNum << 5); - - return outputOffset; - } - - /** - * Check if the block contains big numbers that is greater than ((1<< bits)-1) - * - * @param inputBlock the block to be compressed - * @param bits the numbers of bits to decide whether a number is a big number - * @param blockSize the block size - * @return true if there is any big numbers in the block - * @throws IllegalArgumentException - */ - public static boolean checkBigNumbers(int[] inputBlock, int bits, int blockSize) throws IllegalArgumentException { - int maxNoExp = (1 << bits) - 1; - for (int i = 0; i < blockSize; ++i) { - if (inputBlock[i] > maxNoExp) return true; + + /** + * Estimate the compressed size in ints of a block + * + * @param inputBlock + * the block to be compressed + * @param bits + * the value of the parameter b + * @param blockSize + * the block size + * @return the compressed size in ints + * @throws IllegalArgumentException + */ + public static int estimateCompressedSize(int[] inputBlock, int bits, + int blockSize) throws IllegalArgumentException { + int maxNoExp = (1 << bits) - 1; + // Size of the header and the bits-bit slots + int outputOffset = HEADER_SIZE + bits * blockSize; + int expNum = 0; + + for (int i = 0; i < blockSize; ++i) { + if (inputBlock[i] > maxNoExp) { + expNum++; + } + } + outputOffset += (expNum << 5); + + return outputOffset; } - return false; - } - - /** - * The core implementation of compressing a block with blockSize integers using PForDelta with the given parameter b - * - * @param inputBlock the block to be compressed - * @param bits the the value of the parameter b - * @param blockSize the block size - * @return the compressed block - * @throws IllegalArgumentException - */ - public static int[] compressOneBlock(int[] inputBlock, int bits, int blockSize) throws IllegalArgumentException { - - int[] expAux = new int[blockSize * 2]; - - int maxCompBitSize = HEADER_SIZE + blockSize * (MAX_BITS + MAX_BITS + MAX_BITS) + 32; - int[] tmpCompressedBlock = new int[(maxCompBitSize >>> 5)]; - - int outputOffset = HEADER_SIZE; - int expUpperBound = 1 << bits; - int expNum = 0; - - for (int elem : inputBlock) { - if (elem >= expUpperBound) { - expNum++; - } + + /** + * Check if the block contains big numbers that is greater than ((1<< + * bits)-1) + * + * @param inputBlock + * the block to be compressed + * @param bits + * the numbers of bits to decide whether a number is a + * big number + * @param blockSize + * the block size + * @return true if there is any big numbers in the block + * @throws IllegalArgumentException + */ + public static boolean checkBigNumbers(int[] inputBlock, int bits, + int blockSize) throws IllegalArgumentException { + int maxNoExp = (1 << bits) - 1; + for (int i = 0; i < blockSize; ++i) { + if (inputBlock[i] > maxNoExp) + return true; + } + return false; } - int expIndex = 0; - // compress the b-bit slots - for (int i = 0; i < blockSize; ++i) { - if (inputBlock[i] < expUpperBound) { - writeBits(tmpCompressedBlock, inputBlock[i], outputOffset, bits); - } else // exp - { - // store the lower bits-bits of the exception - writeBits(tmpCompressedBlock, inputBlock[i] & MASK[bits], outputOffset, bits); - // write the position of exception - expAux[expIndex] = i; - // write the higher 32-bits bits of the exception - expAux[expIndex + expNum] = (inputBlock[i] >>> bits) & MASK[32 - bits]; - expIndex++; - } - outputOffset += bits; + /** + * The core implementation of compressing a block with blockSize + * integers using PForDelta with the given parameter b + * + * @param inputBlock + * the block to be compressed + * @param bits + * the the value of the parameter b + * @param blockSize + * the block size + * @return the compressed block + * @throws IllegalArgumentException + */ + public static int[] compressOneBlock(int[] inputBlock, int bits, + int blockSize) throws IllegalArgumentException { + + int[] expAux = new int[blockSize * 2]; + + int maxCompBitSize = HEADER_SIZE + blockSize + * (MAX_BITS + MAX_BITS + MAX_BITS) + 32; + int[] tmpCompressedBlock = new int[(maxCompBitSize >>> 5)]; + + int outputOffset = HEADER_SIZE; + int expUpperBound = 1 << bits; + int expNum = 0; + + for (int elem : inputBlock) { + if (elem >= expUpperBound) { + expNum++; + } + } + + int expIndex = 0; + // compress the b-bit slots + for (int i = 0; i < blockSize; ++i) { + if (inputBlock[i] < expUpperBound) { + writeBits(tmpCompressedBlock, inputBlock[i], + outputOffset, bits); + } else // exp + { + // store the lower bits-bits of the exception + writeBits(tmpCompressedBlock, inputBlock[i] + & MASK[bits], outputOffset, bits); + // write the position of exception + expAux[expIndex] = i; + // write the higher 32-bits bits of the + // exception + expAux[expIndex + expNum] = (inputBlock[i] >>> bits) + & MASK[32 - bits]; + expIndex++; + } + outputOffset += bits; + } + + // the first int in the compressed block stores the value of b + // and the number of exceptions + // tmpCompressedBlock[0] = ((bits & MASK[POSSIBLE_B_BITS]) << + // (31-POSSIBLE_B_BITS)) | (expNum & MASK[31-POSSIBLE_B_BITS]); + tmpCompressedBlock[0] = ((bits & MASK[10]) << 10) + | (expNum & 0x3ff); + tmpCompressedBlock[1] = inputBlock[blockSize - 1]; + + // compress exceptions + if (expNum > 0) { + int compressedBitSize = compressBlockByS16( + tmpCompressedBlock, outputOffset, expAux, + expNum * 2); + outputOffset += compressedBitSize; + } + + // discard the redundant parts in the tmpCompressedBlock + int compressedSizeInInts = (outputOffset + 31) >>> 5; + int[] compBlock; + compBlock = new int[compressedSizeInInts]; + System.arraycopy(tmpCompressedBlock, 0, compBlock, 0, + compressedSizeInInts); + + return compBlock; } - // the first int in the compressed block stores the value of b and the number of exceptions - //tmpCompressedBlock[0] = ((bits & MASK[POSSIBLE_B_BITS]) << (31-POSSIBLE_B_BITS)) | (expNum & MASK[31-POSSIBLE_B_BITS]); - tmpCompressedBlock[0] = ((bits & MASK[10]) << 10) | (expNum & 0x3ff); - tmpCompressedBlock[1] = inputBlock[blockSize - 1]; + /** + * Decompress b-bit slots + * + * @param outDecompSlots + * decompressed block which is the output + * @param inCompBlock + * the compressed block which is the input + * @param blockSize + * the block size + * @param bits + * the value of the parameter b + * @return the compressed size in bits of the data that has been + * decompressed + */ + public static int decompressBBitSlots(int[] outDecompSlots, + int[] inCompBlock, int blockSize, int bits) { + int compressedBitSize = 0; + int offset = HEADER_SIZE; + for (int i = 0; i < blockSize; i++) { + outDecompSlots[i] = readBits(inCompBlock, offset, bits); + offset += bits; + } + compressedBitSize = bits * blockSize; - // compress exceptions - if (expNum > 0) { - int compressedBitSize = compressBlockByS16(tmpCompressedBlock, outputOffset, expAux, expNum * 2); - outputOffset += compressedBitSize; + return compressedBitSize; } - // discard the redundant parts in the tmpCompressedBlock - int compressedSizeInInts = (outputOffset + 31) >>> 5; - int[] compBlock; - compBlock = new int[compressedSizeInInts]; - System.arraycopy(tmpCompressedBlock, 0, compBlock, 0, compressedSizeInInts); - - return compBlock; - } - - /** - * Decompress b-bit slots - * - * @param outDecompSlots decompressed block which is the output - * @param inCompBlock the compressed block which is the input - * @param blockSize the block size - * @param bits the value of the parameter b - * @return the compressed size in bits of the data that has been decompressed - */ - public static int decompressBBitSlots(int[] outDecompSlots, int[] inCompBlock, int blockSize, int bits) { - int compressedBitSize = 0; - int offset = HEADER_SIZE; - for (int i = 0; i < blockSize; i++) { - outDecompSlots[i] = readBits(inCompBlock, offset, bits); - offset += bits; + /** + * Compress a block of blockSize integers using Simple16 algorithm + * + * @param outCompBlock + * the compressed block which is the output + * @param outStartOffsetInBits + * the start offset in bits of the compressed block + * @param inBlock + * the block to be compressed + * @param blockSize + * the block size + * @return the compressed size in bits + */ + private static int compressBlockByS16(int[] outCompBlock, + int outStartOffsetInBits, int[] inBlock, int blockSize) { + int outOffset = (outStartOffsetInBits + 31) >>> 5; + int num, inOffset = 0, numLeft; + for (numLeft = blockSize; numLeft > 0; numLeft -= num) { + num = Simple16.s16Compress(outCompBlock, outOffset, + inBlock, inOffset, numLeft, blockSize); + outOffset++; + inOffset += num; + } + int compressedBitSize = (outOffset << 5) - outStartOffsetInBits; + return compressedBitSize; } - compressedBitSize = bits * blockSize; - - return compressedBitSize; - } - - - /** - * Compress a block of blockSize integers using Simple16 algorithm - * - * @param outCompBlock the compressed block which is the output - * @param outStartOffsetInBits the start offset in bits of the compressed block - * @param inBlock the block to be compressed - * @param blockSize the block size - * @return the compressed size in bits - */ - private static int compressBlockByS16(int[] outCompBlock, int outStartOffsetInBits, int[] inBlock, int blockSize) { - int outOffset = (outStartOffsetInBits + 31) >>> 5; - int num, inOffset = 0, numLeft; - for (numLeft = blockSize; numLeft > 0; numLeft -= num) { - num = Simple16.s16Compress(outCompBlock, outOffset, inBlock, inOffset, numLeft, blockSize); - outOffset++; - inOffset += num; + + /** + * Decompress a block of blockSize integers using Simple16 algorithm + * + * @param outDecompBlock + * the decompressed block which is the output + * @param inCompBlock + * the compressed block which is the input + * @param blockSize + * the block size + * @param inStartOffsetInBits + * the start offset in bits of the compressed block + * @return the compressed size in bits of the data that has been + * decompressed + */ + public static int decompressBlockByS16(int[] outDecompBlock, + int[] inCompBlock, int inStartOffsetInBits, int blockSize) { + int inOffset = (inStartOffsetInBits + 31) >>> 5; + int num, outOffset = 0, numLeft; + for (numLeft = blockSize; numLeft > 0; numLeft -= num) { + num = Simple16.s16Decompress(outDecompBlock, outOffset, + inCompBlock, inOffset, numLeft); + outOffset += num; + inOffset++; + } + int compressedBitSize = (inOffset << 5) - inStartOffsetInBits; + return compressedBitSize; } - int compressedBitSize = (outOffset << 5) - outStartOffsetInBits; - return compressedBitSize; - } - - /** - * Decompress a block of blockSize integers using Simple16 algorithm - * - * @param outDecompBlock the decompressed block which is the output - * @param inCompBlock the compressed block which is the input - * @param blockSize the block size - * @param inStartOffsetInBits the start offset in bits of the compressed block - * @return the compressed size in bits of the data that has been decompressed - */ - public static int decompressBlockByS16(int[] outDecompBlock, int[] inCompBlock, int inStartOffsetInBits, int blockSize) { - int inOffset = (inStartOffsetInBits + 31) >>> 5; - int num, outOffset = 0, numLeft; - for (numLeft = blockSize; numLeft > 0; numLeft -= num) { - num = Simple16.s16Decompress(outDecompBlock, outOffset, inCompBlock, inOffset, numLeft); - outOffset += num; - inOffset++; + + /** + * Write a certain number of bits of an integer into an integer array + * starting from the given start offset + * + * @param out + * the output array + * @param val + * the integer to be written + * @param outOffset + * the start offset in bits in the output array + * @param bits + * the number of bits to be written (bits>=0) + */ + public static final void writeBits(int[] out, int val, int outOffset, + int bits) { + if (bits == 0) + return; + final int index = outOffset >>> 5; + final int skip = outOffset & 0x1f; + val &= (0xffffffff >>> (32 - bits)); + out[index] |= (val << skip); + if (32 - skip < bits) { + out[index + 1] |= (val >>> (32 - skip)); + } } - int compressedBitSize = (inOffset << 5) - inStartOffsetInBits; - return compressedBitSize; - } - - - /** - * Write a certain number of bits of an integer into an integer array starting from the given start offset - * - * @param out the output array - * @param val the integer to be written - * @param outOffset the start offset in bits in the output array - * @param bits the number of bits to be written (bits>=0) - */ - public static final void writeBits(int[] out, int val, int outOffset, int bits) { - if (bits == 0) - return; - final int index = outOffset >>> 5; - final int skip = outOffset & 0x1f; - val &= (0xffffffff >>> (32 - bits)); - out[index] |= (val << skip); - if (32 - skip < bits) { - out[index + 1] |= (val >>> (32 - skip)); + + /** + * Decompress the b-bit slots using hardcoded unpack methods + * + * @param decompressedSlots + * the decompressed output + * @param compBlock + * the compressed input block + * @param blockSize + * the block size which is 256 by default + * @param bits + * the value of b + * @return the processed data size (the number of bits in the compressed + * form) + */ + static int decompressBBitSlotsWithHardCodes(int[] decompressedSlots, + int[] compBlock, int blockSize, int bits) { + int compressedBitSize = 0; + PForDeltaUnpack128.unpack(decompressedSlots, compBlock, bits); + compressedBitSize = bits * blockSize; + + return compressedBitSize; } - } - - /** - * Decompress the b-bit slots using hardcoded unpack methods - * - * @param decompressedSlots the decompressed output - * @param compBlock the compressed input block - * @param blockSize the block size which is 256 by default - * @param bits the value of b - * @return the processed data size (the number of bits in the compressed form) - */ - static int decompressBBitSlotsWithHardCodes(int[] decompressedSlots, int[] compBlock, int blockSize, int bits) { - int compressedBitSize = 0; - PForDeltaUnpack128.unpack(decompressedSlots, compBlock, bits); - compressedBitSize = bits * blockSize; - - return compressedBitSize; - } - - /** - * Read a certain number of bits of an integer into an integer array starting from the given start offset - * - * @param in the input array - * @param inOffset the start offset in bits in the input array - * @param bits the number of bits to be read, unlike writeBits(), readBits() does not deal with bits==0 and thus bits must > 0. When bits ==0, the calling functions will just skip the entire bits-bit slots without decoding them - * @return the bits bits of the input - */ - public static final int readBits(int[] in, final int inOffset, final int bits) { - final int index = inOffset >>> 5; - final int skip = inOffset & 0x1f; - int val = in[index] >>> skip; - if (32 - skip < bits) { - val |= (in[index + 1] << (32 - skip)); + + /** + * Read a certain number of bits of an integer into an integer array + * starting from the given start offset + * + * @param in + * the input array + * @param inOffset + * the start offset in bits in the input array + * @param bits + * the number of bits to be read, unlike writeBits(), + * readBits() does not deal with bits==0 and thus bits + * must > 0. When bits ==0, the calling functions will + * just skip the entire bits-bit slots without decoding + * them + * @return the bits bits of the input + */ + public static final int readBits(int[] in, final int inOffset, + final int bits) { + final int index = inOffset >>> 5; + final int skip = inOffset & 0x1f; + int val = in[index] >>> skip; + if (32 - skip < bits) { + val |= (in[index + 1] << (32 - skip)); + } + return val & (0xffffffff >>> (32 - bits)); } - return val & (0xffffffff >>> (32 - bits)); - } } - diff --git a/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128.java b/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128.java index 82d9f30..4da7a61 100644 --- a/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128.java +++ b/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128.java @@ -1,882 +1,984 @@ package com.kamikaze.pfordelta; /** - * This is a version of the kamikaze PForDelta library that - * was slightly cleaned up by D. Lemire. It is included in the - * JavaFastPFOR library for comparison purposes. As the original + * This is a version of the kamikaze PForDelta library that was slightly cleaned + * up by D. Lemire. It is included in the JavaFastPFOR library for comparison + * purposes. As the original */ @SuppressWarnings("javadoc") public class PForDeltaUnpack128 { - static public void unpack(int[] out, int[] in, int bits) { - switch (bits) { - case 0: - unpack0(out, in); - break; - case 1: - unpack1(out, in); - break; - case 2: - unpack2(out, in); - break; - case 3: - unpack3(out, in); - break; - case 4: - unpack4(out, in); - break; - case 5: - unpack5(out, in); - break; - case 6: - unpack6(out, in); - break; - case 7: - unpack7(out, in); - break; - case 8: - unpack8(out, in); - break; - case 9: - unpack9(out, in); - break; - case 10: - unpack10(out, in); - break; - case 11: - unpack11(out, in); - break; - case 12: - unpack12(out, in); - break; - case 13: - unpack13(out, in); - break; - case 16: - unpack16(out, in); - break; - case 20: - unpack20(out, in); - break; - case 28: - unpack28(out, in); - break; - default: - break; + static public void unpack(int[] out, int[] in, int bits) { + switch (bits) { + case 0: + unpack0(out, in); + break; + case 1: + unpack1(out, in); + break; + case 2: + unpack2(out, in); + break; + case 3: + unpack3(out, in); + break; + case 4: + unpack4(out, in); + break; + case 5: + unpack5(out, in); + break; + case 6: + unpack6(out, in); + break; + case 7: + unpack7(out, in); + break; + case 8: + unpack8(out, in); + break; + case 9: + unpack9(out, in); + break; + case 10: + unpack10(out, in); + break; + case 11: + unpack11(out, in); + break; + case 12: + unpack12(out, in); + break; + case 13: + unpack13(out, in); + break; + case 16: + unpack16(out, in); + break; + case 20: + unpack20(out, in); + break; + case 28: + unpack28(out, in); + break; + default: + break; + } } - } - static private void unpack0(int[] out, int[] in) { - } + static private void unpack0(int[] out, int[] in) { + } - static private void unpack1(int[] out, int[] in) { - int i, w; - int outOffset = 0; - final int mask = 1; - for (i = 0, w = 1; i < 4; ++i, w += 1) { - int curInputValue0 = in[w]; - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = (curInputValue0 >>> 1) & mask; - out[2 + outOffset] = (curInputValue0 >>> 2) & mask; - out[3 + outOffset] = (curInputValue0 >>> 3) & mask; - out[4 + outOffset] = (curInputValue0 >>> 4) & mask; - out[5 + outOffset] = (curInputValue0 >>> 5) & mask; - out[6 + outOffset] = (curInputValue0 >>> 6) & mask; - out[7 + outOffset] = (curInputValue0 >>> 7) & mask; - out[8 + outOffset] = (curInputValue0 >>> 8) & mask; - out[9 + outOffset] = (curInputValue0 >>> 9) & mask; - out[10 + outOffset] = (curInputValue0 >>> 10) & mask; - out[11 + outOffset] = (curInputValue0 >>> 11) & mask; - out[12 + outOffset] = (curInputValue0 >>> 12) & mask; - out[13 + outOffset] = (curInputValue0 >>> 13) & mask; - out[14 + outOffset] = (curInputValue0 >>> 14) & mask; - out[15 + outOffset] = (curInputValue0 >>> 15) & mask; - out[16 + outOffset] = (curInputValue0 >>> 16) & mask; - out[17 + outOffset] = (curInputValue0 >>> 17) & mask; - out[18 + outOffset] = (curInputValue0 >>> 18) & mask; - out[19 + outOffset] = (curInputValue0 >>> 19) & mask; - out[20 + outOffset] = (curInputValue0 >>> 20) & mask; - out[21 + outOffset] = (curInputValue0 >>> 21) & mask; - out[22 + outOffset] = (curInputValue0 >>> 22) & mask; - out[23 + outOffset] = (curInputValue0 >>> 23) & mask; - out[24 + outOffset] = (curInputValue0 >>> 24) & mask; - out[25 + outOffset] = (curInputValue0 >>> 25) & mask; - out[26 + outOffset] = (curInputValue0 >>> 26) & mask; - out[27 + outOffset] = (curInputValue0 >>> 27) & mask; - out[28 + outOffset] = (curInputValue0 >>> 28) & mask; - out[29 + outOffset] = (curInputValue0 >>> 29) & mask; - out[30 + outOffset] = (curInputValue0 >>> 30) & mask; - out[31 + outOffset] = curInputValue0 >>> 31; - outOffset += 32; + static private void unpack1(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 1; + for (i = 0, w = 1; i < 4; ++i, w += 1) { + int curInputValue0 = in[w]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 1) & mask; + out[2 + outOffset] = (curInputValue0 >>> 2) & mask; + out[3 + outOffset] = (curInputValue0 >>> 3) & mask; + out[4 + outOffset] = (curInputValue0 >>> 4) & mask; + out[5 + outOffset] = (curInputValue0 >>> 5) & mask; + out[6 + outOffset] = (curInputValue0 >>> 6) & mask; + out[7 + outOffset] = (curInputValue0 >>> 7) & mask; + out[8 + outOffset] = (curInputValue0 >>> 8) & mask; + out[9 + outOffset] = (curInputValue0 >>> 9) & mask; + out[10 + outOffset] = (curInputValue0 >>> 10) & mask; + out[11 + outOffset] = (curInputValue0 >>> 11) & mask; + out[12 + outOffset] = (curInputValue0 >>> 12) & mask; + out[13 + outOffset] = (curInputValue0 >>> 13) & mask; + out[14 + outOffset] = (curInputValue0 >>> 14) & mask; + out[15 + outOffset] = (curInputValue0 >>> 15) & mask; + out[16 + outOffset] = (curInputValue0 >>> 16) & mask; + out[17 + outOffset] = (curInputValue0 >>> 17) & mask; + out[18 + outOffset] = (curInputValue0 >>> 18) & mask; + out[19 + outOffset] = (curInputValue0 >>> 19) & mask; + out[20 + outOffset] = (curInputValue0 >>> 20) & mask; + out[21 + outOffset] = (curInputValue0 >>> 21) & mask; + out[22 + outOffset] = (curInputValue0 >>> 22) & mask; + out[23 + outOffset] = (curInputValue0 >>> 23) & mask; + out[24 + outOffset] = (curInputValue0 >>> 24) & mask; + out[25 + outOffset] = (curInputValue0 >>> 25) & mask; + out[26 + outOffset] = (curInputValue0 >>> 26) & mask; + out[27 + outOffset] = (curInputValue0 >>> 27) & mask; + out[28 + outOffset] = (curInputValue0 >>> 28) & mask; + out[29 + outOffset] = (curInputValue0 >>> 29) & mask; + out[30 + outOffset] = (curInputValue0 >>> 30) & mask; + out[31 + outOffset] = curInputValue0 >>> 31; + outOffset += 32; + } } - } - static private void unpack2(int[] out, int[] in) { - int i, w; - int outOffset = 0; - final int mask = 3; - for (i = 0, w = 1; i < 4; ++i, w += 2) { - int curInputValue0 = in[w]; - int curInputValue1 = in[w + 1]; - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = (curInputValue0 >>> 2) & mask; - out[2 + outOffset] = (curInputValue0 >>> 4) & mask; - out[3 + outOffset] = (curInputValue0 >>> 6) & mask; - out[4 + outOffset] = (curInputValue0 >>> 8) & mask; - out[5 + outOffset] = (curInputValue0 >>> 10) & mask; - out[6 + outOffset] = (curInputValue0 >>> 12) & mask; - out[7 + outOffset] = (curInputValue0 >>> 14) & mask; - out[8 + outOffset] = (curInputValue0 >>> 16) & mask; - out[9 + outOffset] = (curInputValue0 >>> 18) & mask; - out[10 + outOffset] = (curInputValue0 >>> 20) & mask; - out[11 + outOffset] = (curInputValue0 >>> 22) & mask; - out[12 + outOffset] = (curInputValue0 >>> 24) & mask; - out[13 + outOffset] = (curInputValue0 >>> 26) & mask; - out[14 + outOffset] = (curInputValue0 >>> 28) & mask; - out[15 + outOffset] = curInputValue0 >>> 30; - out[16 + outOffset] = curInputValue1 & mask; - out[17 + outOffset] = (curInputValue1 >>> 2) & mask; - out[18 + outOffset] = (curInputValue1 >>> 4) & mask; - out[19 + outOffset] = (curInputValue1 >>> 6) & mask; - out[20 + outOffset] = (curInputValue1 >>> 8) & mask; - out[21 + outOffset] = (curInputValue1 >>> 10) & mask; - out[22 + outOffset] = (curInputValue1 >>> 12) & mask; - out[23 + outOffset] = (curInputValue1 >>> 14) & mask; - out[24 + outOffset] = (curInputValue1 >>> 16) & mask; - out[25 + outOffset] = (curInputValue1 >>> 18) & mask; - out[26 + outOffset] = (curInputValue1 >>> 20) & mask; - out[27 + outOffset] = (curInputValue1 >>> 22) & mask; - out[28 + outOffset] = (curInputValue1 >>> 24) & mask; - out[29 + outOffset] = (curInputValue1 >>> 26) & mask; - out[30 + outOffset] = (curInputValue1 >>> 28) & mask; - out[31 + outOffset] = curInputValue1 >>> 30; - outOffset += 32; + static private void unpack2(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 3; + for (i = 0, w = 1; i < 4; ++i, w += 2) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 2) & mask; + out[2 + outOffset] = (curInputValue0 >>> 4) & mask; + out[3 + outOffset] = (curInputValue0 >>> 6) & mask; + out[4 + outOffset] = (curInputValue0 >>> 8) & mask; + out[5 + outOffset] = (curInputValue0 >>> 10) & mask; + out[6 + outOffset] = (curInputValue0 >>> 12) & mask; + out[7 + outOffset] = (curInputValue0 >>> 14) & mask; + out[8 + outOffset] = (curInputValue0 >>> 16) & mask; + out[9 + outOffset] = (curInputValue0 >>> 18) & mask; + out[10 + outOffset] = (curInputValue0 >>> 20) & mask; + out[11 + outOffset] = (curInputValue0 >>> 22) & mask; + out[12 + outOffset] = (curInputValue0 >>> 24) & mask; + out[13 + outOffset] = (curInputValue0 >>> 26) & mask; + out[14 + outOffset] = (curInputValue0 >>> 28) & mask; + out[15 + outOffset] = curInputValue0 >>> 30; + out[16 + outOffset] = curInputValue1 & mask; + out[17 + outOffset] = (curInputValue1 >>> 2) & mask; + out[18 + outOffset] = (curInputValue1 >>> 4) & mask; + out[19 + outOffset] = (curInputValue1 >>> 6) & mask; + out[20 + outOffset] = (curInputValue1 >>> 8) & mask; + out[21 + outOffset] = (curInputValue1 >>> 10) & mask; + out[22 + outOffset] = (curInputValue1 >>> 12) & mask; + out[23 + outOffset] = (curInputValue1 >>> 14) & mask; + out[24 + outOffset] = (curInputValue1 >>> 16) & mask; + out[25 + outOffset] = (curInputValue1 >>> 18) & mask; + out[26 + outOffset] = (curInputValue1 >>> 20) & mask; + out[27 + outOffset] = (curInputValue1 >>> 22) & mask; + out[28 + outOffset] = (curInputValue1 >>> 24) & mask; + out[29 + outOffset] = (curInputValue1 >>> 26) & mask; + out[30 + outOffset] = (curInputValue1 >>> 28) & mask; + out[31 + outOffset] = curInputValue1 >>> 30; + outOffset += 32; + } } - } - static private void unpack3(int[] out, int[] in) { - int i, w; - int outOffset = 0; - final int mask = 7; - for (i = 0, w = 1; i < 4; ++i, w += 3) { - int curInputValue0 = in[w]; - int curInputValue1 = in[w + 1]; - int curInputValue2 = in[w + 2]; - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = (curInputValue0 >>> 3) & mask; - out[2 + outOffset] = (curInputValue0 >>> 6) & mask; - out[3 + outOffset] = (curInputValue0 >>> 9) & mask; - out[4 + outOffset] = (curInputValue0 >>> 12) & mask; - out[5 + outOffset] = (curInputValue0 >>> 15) & mask; - out[6 + outOffset] = (curInputValue0 >>> 18) & mask; - out[7 + outOffset] = (curInputValue0 >>> 21) & mask; - out[8 + outOffset] = (curInputValue0 >>> 24) & mask; - out[9 + outOffset] = (curInputValue0 >>> 27) & mask; - out[10 + outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) & mask; - out[11 + outOffset] = (curInputValue1 >>> 1) & mask; - out[12 + outOffset] = (curInputValue1 >>> 4) & mask; - out[13 + outOffset] = (curInputValue1 >>> 7) & mask; - out[14 + outOffset] = (curInputValue1 >>> 10) & mask; - out[15 + outOffset] = (curInputValue1 >>> 13) & mask; - out[16 + outOffset] = (curInputValue1 >>> 16) & mask; - out[17 + outOffset] = (curInputValue1 >>> 19) & mask; - out[18 + outOffset] = (curInputValue1 >>> 22) & mask; - out[19 + outOffset] = (curInputValue1 >>> 25) & mask; - out[20 + outOffset] = (curInputValue1 >>> 28) & mask; - out[21 + outOffset] = ((curInputValue1 >>> 31) | (curInputValue2 << 1)) & mask; - out[22 + outOffset] = (curInputValue2 >>> 2) & mask; - out[23 + outOffset] = (curInputValue2 >>> 5) & mask; - out[24 + outOffset] = (curInputValue2 >>> 8) & mask; - out[25 + outOffset] = (curInputValue2 >>> 11) & mask; - out[26 + outOffset] = (curInputValue2 >>> 14) & mask; - out[27 + outOffset] = (curInputValue2 >>> 17) & mask; - out[28 + outOffset] = (curInputValue2 >>> 20) & mask; - out[29 + outOffset] = (curInputValue2 >>> 23) & mask; - out[30 + outOffset] = (curInputValue2 >>> 26) & mask; - out[31 + outOffset] = curInputValue2 >>> 29; - outOffset += 32; + static private void unpack3(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 7; + for (i = 0, w = 1; i < 4; ++i, w += 3) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + int curInputValue2 = in[w + 2]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 3) & mask; + out[2 + outOffset] = (curInputValue0 >>> 6) & mask; + out[3 + outOffset] = (curInputValue0 >>> 9) & mask; + out[4 + outOffset] = (curInputValue0 >>> 12) & mask; + out[5 + outOffset] = (curInputValue0 >>> 15) & mask; + out[6 + outOffset] = (curInputValue0 >>> 18) & mask; + out[7 + outOffset] = (curInputValue0 >>> 21) & mask; + out[8 + outOffset] = (curInputValue0 >>> 24) & mask; + out[9 + outOffset] = (curInputValue0 >>> 27) & mask; + out[10 + outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) + & mask; + out[11 + outOffset] = (curInputValue1 >>> 1) & mask; + out[12 + outOffset] = (curInputValue1 >>> 4) & mask; + out[13 + outOffset] = (curInputValue1 >>> 7) & mask; + out[14 + outOffset] = (curInputValue1 >>> 10) & mask; + out[15 + outOffset] = (curInputValue1 >>> 13) & mask; + out[16 + outOffset] = (curInputValue1 >>> 16) & mask; + out[17 + outOffset] = (curInputValue1 >>> 19) & mask; + out[18 + outOffset] = (curInputValue1 >>> 22) & mask; + out[19 + outOffset] = (curInputValue1 >>> 25) & mask; + out[20 + outOffset] = (curInputValue1 >>> 28) & mask; + out[21 + outOffset] = ((curInputValue1 >>> 31) | (curInputValue2 << 1)) + & mask; + out[22 + outOffset] = (curInputValue2 >>> 2) & mask; + out[23 + outOffset] = (curInputValue2 >>> 5) & mask; + out[24 + outOffset] = (curInputValue2 >>> 8) & mask; + out[25 + outOffset] = (curInputValue2 >>> 11) & mask; + out[26 + outOffset] = (curInputValue2 >>> 14) & mask; + out[27 + outOffset] = (curInputValue2 >>> 17) & mask; + out[28 + outOffset] = (curInputValue2 >>> 20) & mask; + out[29 + outOffset] = (curInputValue2 >>> 23) & mask; + out[30 + outOffset] = (curInputValue2 >>> 26) & mask; + out[31 + outOffset] = curInputValue2 >>> 29; + outOffset += 32; + } } - } - static private void unpack4(int[] out, int[] in) { - int i, w; - int outOffset = 0; - final int mask = 15; - for (i = 0, w = 1; i < 4; ++i, w += 4) { - int curInputValue0 = in[w]; - int curInputValue1 = in[w + 1]; - int curInputValue2 = in[w + 2]; - int curInputValue3 = in[w + 3]; - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = (curInputValue0 >>> 4) & mask; - out[2 + outOffset] = (curInputValue0 >>> 8) & mask; - out[3 + outOffset] = (curInputValue0 >>> 12) & mask; - out[4 + outOffset] = (curInputValue0 >>> 16) & mask; - out[5 + outOffset] = (curInputValue0 >>> 20) & mask; - out[6 + outOffset] = (curInputValue0 >>> 24) & mask; - out[7 + outOffset] = curInputValue0 >>> 28; - out[8 + outOffset] = curInputValue1 & mask; - out[9 + outOffset] = (curInputValue1 >>> 4) & mask; - out[10 + outOffset] = (curInputValue1 >>> 8) & mask; - out[11 + outOffset] = (curInputValue1 >>> 12) & mask; - out[12 + outOffset] = (curInputValue1 >>> 16) & mask; - out[13 + outOffset] = (curInputValue1 >>> 20) & mask; - out[14 + outOffset] = (curInputValue1 >>> 24) & mask; - out[15 + outOffset] = curInputValue1 >>> 28; - out[16 + outOffset] = curInputValue2 & mask; - out[17 + outOffset] = (curInputValue2 >>> 4) & mask; - out[18 + outOffset] = (curInputValue2 >>> 8) & mask; - out[19 + outOffset] = (curInputValue2 >>> 12) & mask; - out[20 + outOffset] = (curInputValue2 >>> 16) & mask; - out[21 + outOffset] = (curInputValue2 >>> 20) & mask; - out[22 + outOffset] = (curInputValue2 >>> 24) & mask; - out[23 + outOffset] = curInputValue2 >>> 28; - out[24 + outOffset] = curInputValue3 & mask; - out[25 + outOffset] = (curInputValue3 >>> 4) & mask; - out[26 + outOffset] = (curInputValue3 >>> 8) & mask; - out[27 + outOffset] = (curInputValue3 >>> 12) & mask; - out[28 + outOffset] = (curInputValue3 >>> 16) & mask; - out[29 + outOffset] = (curInputValue3 >>> 20) & mask; - out[30 + outOffset] = (curInputValue3 >>> 24) & mask; - out[31 + outOffset] = curInputValue3 >>> 28; - outOffset += 32; + static private void unpack4(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 15; + for (i = 0, w = 1; i < 4; ++i, w += 4) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + int curInputValue2 = in[w + 2]; + int curInputValue3 = in[w + 3]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 4) & mask; + out[2 + outOffset] = (curInputValue0 >>> 8) & mask; + out[3 + outOffset] = (curInputValue0 >>> 12) & mask; + out[4 + outOffset] = (curInputValue0 >>> 16) & mask; + out[5 + outOffset] = (curInputValue0 >>> 20) & mask; + out[6 + outOffset] = (curInputValue0 >>> 24) & mask; + out[7 + outOffset] = curInputValue0 >>> 28; + out[8 + outOffset] = curInputValue1 & mask; + out[9 + outOffset] = (curInputValue1 >>> 4) & mask; + out[10 + outOffset] = (curInputValue1 >>> 8) & mask; + out[11 + outOffset] = (curInputValue1 >>> 12) & mask; + out[12 + outOffset] = (curInputValue1 >>> 16) & mask; + out[13 + outOffset] = (curInputValue1 >>> 20) & mask; + out[14 + outOffset] = (curInputValue1 >>> 24) & mask; + out[15 + outOffset] = curInputValue1 >>> 28; + out[16 + outOffset] = curInputValue2 & mask; + out[17 + outOffset] = (curInputValue2 >>> 4) & mask; + out[18 + outOffset] = (curInputValue2 >>> 8) & mask; + out[19 + outOffset] = (curInputValue2 >>> 12) & mask; + out[20 + outOffset] = (curInputValue2 >>> 16) & mask; + out[21 + outOffset] = (curInputValue2 >>> 20) & mask; + out[22 + outOffset] = (curInputValue2 >>> 24) & mask; + out[23 + outOffset] = curInputValue2 >>> 28; + out[24 + outOffset] = curInputValue3 & mask; + out[25 + outOffset] = (curInputValue3 >>> 4) & mask; + out[26 + outOffset] = (curInputValue3 >>> 8) & mask; + out[27 + outOffset] = (curInputValue3 >>> 12) & mask; + out[28 + outOffset] = (curInputValue3 >>> 16) & mask; + out[29 + outOffset] = (curInputValue3 >>> 20) & mask; + out[30 + outOffset] = (curInputValue3 >>> 24) & mask; + out[31 + outOffset] = curInputValue3 >>> 28; + outOffset += 32; + } } - } - static private void unpack5(int[] out, int[] in) { - int i, w; - int outOffset = 0; - final int mask = 31; - for (i = 0, w = 1; i < 4; ++i, w += 5) { - int curInputValue0 = in[w]; - int curInputValue1 = in[w + 1]; - int curInputValue2 = in[w + 2]; - int curInputValue3 = in[w + 3]; - int curInputValue4 = in[w + 4]; - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = (curInputValue0 >>> 5) & mask; - out[2 + outOffset] = (curInputValue0 >>> 10) & mask; - out[3 + outOffset] = (curInputValue0 >>> 15) & mask; - out[4 + outOffset] = (curInputValue0 >>> 20) & mask; - out[5 + outOffset] = (curInputValue0 >>> 25) & mask; - out[6 + outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) & mask; - out[7 + outOffset] = (curInputValue1 >>> 3) & mask; - out[8 + outOffset] = (curInputValue1 >>> 8) & mask; - out[9 + outOffset] = (curInputValue1 >>> 13) & mask; - out[10 + outOffset] = (curInputValue1 >>> 18) & mask; - out[11 + outOffset] = (curInputValue1 >>> 23) & mask; - out[12 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; - out[13 + outOffset] = (curInputValue2 >>> 1) & mask; - out[14 + outOffset] = (curInputValue2 >>> 6) & mask; - out[15 + outOffset] = (curInputValue2 >>> 11) & mask; - out[16 + outOffset] = (curInputValue2 >>> 16) & mask; - out[17 + outOffset] = (curInputValue2 >>> 21) & mask; - out[18 + outOffset] = (curInputValue2 >>> 26) & mask; - out[19 + outOffset] = ((curInputValue2 >>> 31) | (curInputValue3 << 1)) & mask; - out[20 + outOffset] = (curInputValue3 >>> 4) & mask; - out[21 + outOffset] = (curInputValue3 >>> 9) & mask; - out[22 + outOffset] = (curInputValue3 >>> 14) & mask; - out[23 + outOffset] = (curInputValue3 >>> 19) & mask; - out[24 + outOffset] = (curInputValue3 >>> 24) & mask; - out[25 + outOffset] = ((curInputValue3 >>> 29) | (curInputValue4 << 3)) & mask; - out[26 + outOffset] = (curInputValue4 >>> 2) & mask; - out[27 + outOffset] = (curInputValue4 >>> 7) & mask; - out[28 + outOffset] = (curInputValue4 >>> 12) & mask; - out[29 + outOffset] = (curInputValue4 >>> 17) & mask; - out[30 + outOffset] = (curInputValue4 >>> 22) & mask; - out[31 + outOffset] = curInputValue4 >>> 27; - outOffset += 32; + static private void unpack5(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 31; + for (i = 0, w = 1; i < 4; ++i, w += 5) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + int curInputValue2 = in[w + 2]; + int curInputValue3 = in[w + 3]; + int curInputValue4 = in[w + 4]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 5) & mask; + out[2 + outOffset] = (curInputValue0 >>> 10) & mask; + out[3 + outOffset] = (curInputValue0 >>> 15) & mask; + out[4 + outOffset] = (curInputValue0 >>> 20) & mask; + out[5 + outOffset] = (curInputValue0 >>> 25) & mask; + out[6 + outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) + & mask; + out[7 + outOffset] = (curInputValue1 >>> 3) & mask; + out[8 + outOffset] = (curInputValue1 >>> 8) & mask; + out[9 + outOffset] = (curInputValue1 >>> 13) & mask; + out[10 + outOffset] = (curInputValue1 >>> 18) & mask; + out[11 + outOffset] = (curInputValue1 >>> 23) & mask; + out[12 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) + & mask; + out[13 + outOffset] = (curInputValue2 >>> 1) & mask; + out[14 + outOffset] = (curInputValue2 >>> 6) & mask; + out[15 + outOffset] = (curInputValue2 >>> 11) & mask; + out[16 + outOffset] = (curInputValue2 >>> 16) & mask; + out[17 + outOffset] = (curInputValue2 >>> 21) & mask; + out[18 + outOffset] = (curInputValue2 >>> 26) & mask; + out[19 + outOffset] = ((curInputValue2 >>> 31) | (curInputValue3 << 1)) + & mask; + out[20 + outOffset] = (curInputValue3 >>> 4) & mask; + out[21 + outOffset] = (curInputValue3 >>> 9) & mask; + out[22 + outOffset] = (curInputValue3 >>> 14) & mask; + out[23 + outOffset] = (curInputValue3 >>> 19) & mask; + out[24 + outOffset] = (curInputValue3 >>> 24) & mask; + out[25 + outOffset] = ((curInputValue3 >>> 29) | (curInputValue4 << 3)) + & mask; + out[26 + outOffset] = (curInputValue4 >>> 2) & mask; + out[27 + outOffset] = (curInputValue4 >>> 7) & mask; + out[28 + outOffset] = (curInputValue4 >>> 12) & mask; + out[29 + outOffset] = (curInputValue4 >>> 17) & mask; + out[30 + outOffset] = (curInputValue4 >>> 22) & mask; + out[31 + outOffset] = curInputValue4 >>> 27; + outOffset += 32; + } } - } - static private void unpack6(int[] out, int[] in) { - int i, w; - int outOffset = 0; - final int mask = 63; - for (i = 0, w = 1; i < 4; ++i, w += 6) { - int curInputValue0 = in[w]; - int curInputValue1 = in[w + 1]; - int curInputValue2 = in[w + 2]; - int curInputValue3 = in[w + 3]; - int curInputValue4 = in[w + 4]; - int curInputValue5 = in[w + 5]; - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = (curInputValue0 >>> 6) & mask; - out[2 + outOffset] = (curInputValue0 >>> 12) & mask; - out[3 + outOffset] = (curInputValue0 >>> 18) & mask; - out[4 + outOffset] = (curInputValue0 >>> 24) & mask; - out[5 + outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) & mask; - out[6 + outOffset] = (curInputValue1 >>> 4) & mask; - out[7 + outOffset] = (curInputValue1 >>> 10) & mask; - out[8 + outOffset] = (curInputValue1 >>> 16) & mask; - out[9 + outOffset] = (curInputValue1 >>> 22) & mask; - out[10 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; - out[11 + outOffset] = (curInputValue2 >>> 2) & mask; - out[12 + outOffset] = (curInputValue2 >>> 8) & mask; - out[13 + outOffset] = (curInputValue2 >>> 14) & mask; - out[14 + outOffset] = (curInputValue2 >>> 20) & mask; - out[15 + outOffset] = curInputValue2 >>> 26; - out[16 + outOffset] = curInputValue3 & mask; - out[17 + outOffset] = (curInputValue3 >>> 6) & mask; - out[18 + outOffset] = (curInputValue3 >>> 12) & mask; - out[19 + outOffset] = (curInputValue3 >>> 18) & mask; - out[20 + outOffset] = (curInputValue3 >>> 24) & mask; - out[21 + outOffset] = ((curInputValue3 >>> 30) | (curInputValue4 << 2)) & mask; - out[22 + outOffset] = (curInputValue4 >>> 4) & mask; - out[23 + outOffset] = (curInputValue4 >>> 10) & mask; - out[24 + outOffset] = (curInputValue4 >>> 16) & mask; - out[25 + outOffset] = (curInputValue4 >>> 22) & mask; - out[26 + outOffset] = ((curInputValue4 >>> 28) | (curInputValue5 << 4)) & mask; - out[27 + outOffset] = (curInputValue5 >>> 2) & mask; - out[28 + outOffset] = (curInputValue5 >>> 8) & mask; - out[29 + outOffset] = (curInputValue5 >>> 14) & mask; - out[30 + outOffset] = (curInputValue5 >>> 20) & mask; - out[31 + outOffset] = curInputValue5 >>> 26; - outOffset += 32; + static private void unpack6(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 63; + for (i = 0, w = 1; i < 4; ++i, w += 6) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + int curInputValue2 = in[w + 2]; + int curInputValue3 = in[w + 3]; + int curInputValue4 = in[w + 4]; + int curInputValue5 = in[w + 5]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 6) & mask; + out[2 + outOffset] = (curInputValue0 >>> 12) & mask; + out[3 + outOffset] = (curInputValue0 >>> 18) & mask; + out[4 + outOffset] = (curInputValue0 >>> 24) & mask; + out[5 + outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) + & mask; + out[6 + outOffset] = (curInputValue1 >>> 4) & mask; + out[7 + outOffset] = (curInputValue1 >>> 10) & mask; + out[8 + outOffset] = (curInputValue1 >>> 16) & mask; + out[9 + outOffset] = (curInputValue1 >>> 22) & mask; + out[10 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) + & mask; + out[11 + outOffset] = (curInputValue2 >>> 2) & mask; + out[12 + outOffset] = (curInputValue2 >>> 8) & mask; + out[13 + outOffset] = (curInputValue2 >>> 14) & mask; + out[14 + outOffset] = (curInputValue2 >>> 20) & mask; + out[15 + outOffset] = curInputValue2 >>> 26; + out[16 + outOffset] = curInputValue3 & mask; + out[17 + outOffset] = (curInputValue3 >>> 6) & mask; + out[18 + outOffset] = (curInputValue3 >>> 12) & mask; + out[19 + outOffset] = (curInputValue3 >>> 18) & mask; + out[20 + outOffset] = (curInputValue3 >>> 24) & mask; + out[21 + outOffset] = ((curInputValue3 >>> 30) | (curInputValue4 << 2)) + & mask; + out[22 + outOffset] = (curInputValue4 >>> 4) & mask; + out[23 + outOffset] = (curInputValue4 >>> 10) & mask; + out[24 + outOffset] = (curInputValue4 >>> 16) & mask; + out[25 + outOffset] = (curInputValue4 >>> 22) & mask; + out[26 + outOffset] = ((curInputValue4 >>> 28) | (curInputValue5 << 4)) + & mask; + out[27 + outOffset] = (curInputValue5 >>> 2) & mask; + out[28 + outOffset] = (curInputValue5 >>> 8) & mask; + out[29 + outOffset] = (curInputValue5 >>> 14) & mask; + out[30 + outOffset] = (curInputValue5 >>> 20) & mask; + out[31 + outOffset] = curInputValue5 >>> 26; + outOffset += 32; + } } - } - static private void unpack7(int[] out, int[] in) { - int i, w; - int outOffset = 0; - final int mask = 127; - for (i = 0, w = 1; i < 4; ++i, w += 7) { - int curInputValue0 = in[w]; - int curInputValue1 = in[w + 1]; - int curInputValue2 = in[w + 2]; - int curInputValue3 = in[w + 3]; - int curInputValue4 = in[w + 4]; - int curInputValue5 = in[w + 5]; - int curInputValue6 = in[w + 6]; - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = (curInputValue0 >>> 7) & mask; - out[2 + outOffset] = (curInputValue0 >>> 14) & mask; - out[3 + outOffset] = (curInputValue0 >>> 21) & mask; - out[4 + outOffset] = ((curInputValue0 >>> 28) | (curInputValue1 << 4)) & mask; - out[5 + outOffset] = (curInputValue1 >>> 3) & mask; - out[6 + outOffset] = (curInputValue1 >>> 10) & mask; - out[7 + outOffset] = (curInputValue1 >>> 17) & mask; - out[8 + outOffset] = (curInputValue1 >>> 24) & mask; - out[9 + outOffset] = ((curInputValue1 >>> 31) | (curInputValue2 << 1)) & mask; - out[10 + outOffset] = (curInputValue2 >>> 6) & mask; - out[11 + outOffset] = (curInputValue2 >>> 13) & mask; - out[12 + outOffset] = (curInputValue2 >>> 20) & mask; - out[13 + outOffset] = ((curInputValue2 >>> 27) | (curInputValue3 << 5)) & mask; - out[14 + outOffset] = (curInputValue3 >>> 2) & mask; - out[15 + outOffset] = (curInputValue3 >>> 9) & mask; - out[16 + outOffset] = (curInputValue3 >>> 16) & mask; - out[17 + outOffset] = (curInputValue3 >>> 23) & mask; - out[18 + outOffset] = ((curInputValue3 >>> 30) | (curInputValue4 << 2)) & mask; - out[19 + outOffset] = (curInputValue4 >>> 5) & mask; - out[20 + outOffset] = (curInputValue4 >>> 12) & mask; - out[21 + outOffset] = (curInputValue4 >>> 19) & mask; - out[22 + outOffset] = ((curInputValue4 >>> 26) | (curInputValue5 << 6)) & mask; - out[23 + outOffset] = (curInputValue5 >>> 1) & mask; - out[24 + outOffset] = (curInputValue5 >>> 8) & mask; - out[25 + outOffset] = (curInputValue5 >>> 15) & mask; - out[26 + outOffset] = (curInputValue5 >>> 22) & mask; - out[27 + outOffset] = ((curInputValue5 >>> 29) | (curInputValue6 << 3)) & mask; - out[28 + outOffset] = (curInputValue6 >>> 4) & mask; - out[29 + outOffset] = (curInputValue6 >>> 11) & mask; - out[30 + outOffset] = (curInputValue6 >>> 18) & mask; - out[31 + outOffset] = curInputValue6 >>> 25; - outOffset += 32; + static private void unpack7(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 127; + for (i = 0, w = 1; i < 4; ++i, w += 7) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + int curInputValue2 = in[w + 2]; + int curInputValue3 = in[w + 3]; + int curInputValue4 = in[w + 4]; + int curInputValue5 = in[w + 5]; + int curInputValue6 = in[w + 6]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 7) & mask; + out[2 + outOffset] = (curInputValue0 >>> 14) & mask; + out[3 + outOffset] = (curInputValue0 >>> 21) & mask; + out[4 + outOffset] = ((curInputValue0 >>> 28) | (curInputValue1 << 4)) + & mask; + out[5 + outOffset] = (curInputValue1 >>> 3) & mask; + out[6 + outOffset] = (curInputValue1 >>> 10) & mask; + out[7 + outOffset] = (curInputValue1 >>> 17) & mask; + out[8 + outOffset] = (curInputValue1 >>> 24) & mask; + out[9 + outOffset] = ((curInputValue1 >>> 31) | (curInputValue2 << 1)) + & mask; + out[10 + outOffset] = (curInputValue2 >>> 6) & mask; + out[11 + outOffset] = (curInputValue2 >>> 13) & mask; + out[12 + outOffset] = (curInputValue2 >>> 20) & mask; + out[13 + outOffset] = ((curInputValue2 >>> 27) | (curInputValue3 << 5)) + & mask; + out[14 + outOffset] = (curInputValue3 >>> 2) & mask; + out[15 + outOffset] = (curInputValue3 >>> 9) & mask; + out[16 + outOffset] = (curInputValue3 >>> 16) & mask; + out[17 + outOffset] = (curInputValue3 >>> 23) & mask; + out[18 + outOffset] = ((curInputValue3 >>> 30) | (curInputValue4 << 2)) + & mask; + out[19 + outOffset] = (curInputValue4 >>> 5) & mask; + out[20 + outOffset] = (curInputValue4 >>> 12) & mask; + out[21 + outOffset] = (curInputValue4 >>> 19) & mask; + out[22 + outOffset] = ((curInputValue4 >>> 26) | (curInputValue5 << 6)) + & mask; + out[23 + outOffset] = (curInputValue5 >>> 1) & mask; + out[24 + outOffset] = (curInputValue5 >>> 8) & mask; + out[25 + outOffset] = (curInputValue5 >>> 15) & mask; + out[26 + outOffset] = (curInputValue5 >>> 22) & mask; + out[27 + outOffset] = ((curInputValue5 >>> 29) | (curInputValue6 << 3)) + & mask; + out[28 + outOffset] = (curInputValue6 >>> 4) & mask; + out[29 + outOffset] = (curInputValue6 >>> 11) & mask; + out[30 + outOffset] = (curInputValue6 >>> 18) & mask; + out[31 + outOffset] = curInputValue6 >>> 25; + outOffset += 32; + } } - } - static private void unpack8(int[] out, int[] in) { - int i, w; - int outOffset = 0; - final int mask = 255; - for (i = 0, w = 1; i < 4; ++i, w += 8) { - int curInputValue0 = in[w]; - int curInputValue1 = in[w + 1]; - int curInputValue2 = in[w + 2]; - int curInputValue3 = in[w + 3]; - int curInputValue4 = in[w + 4]; - int curInputValue5 = in[w + 5]; - int curInputValue6 = in[w + 6]; - int curInputValue7 = in[w + 7]; - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = (curInputValue0 >>> 8) & mask; - out[2 + outOffset] = (curInputValue0 >>> 16) & mask; - out[3 + outOffset] = curInputValue0 >>> 24; - out[4 + outOffset] = curInputValue1 & mask; - out[5 + outOffset] = (curInputValue1 >>> 8) & mask; - out[6 + outOffset] = (curInputValue1 >>> 16) & mask; - out[7 + outOffset] = curInputValue1 >>> 24; - out[8 + outOffset] = curInputValue2 & mask; - out[9 + outOffset] = (curInputValue2 >>> 8) & mask; - out[10 + outOffset] = (curInputValue2 >>> 16) & mask; - out[11 + outOffset] = curInputValue2 >>> 24; - out[12 + outOffset] = curInputValue3 & mask; - out[13 + outOffset] = (curInputValue3 >>> 8) & mask; - out[14 + outOffset] = (curInputValue3 >>> 16) & mask; - out[15 + outOffset] = curInputValue3 >>> 24; - out[16 + outOffset] = curInputValue4 & mask; - out[17 + outOffset] = (curInputValue4 >>> 8) & mask; - out[18 + outOffset] = (curInputValue4 >>> 16) & mask; - out[19 + outOffset] = curInputValue4 >>> 24; - out[20 + outOffset] = curInputValue5 & mask; - out[21 + outOffset] = (curInputValue5 >>> 8) & mask; - out[22 + outOffset] = (curInputValue5 >>> 16) & mask; - out[23 + outOffset] = curInputValue5 >>> 24; - out[24 + outOffset] = curInputValue6 & mask; - out[25 + outOffset] = (curInputValue6 >>> 8) & mask; - out[26 + outOffset] = (curInputValue6 >>> 16) & mask; - out[27 + outOffset] = curInputValue6 >>> 24; - out[28 + outOffset] = curInputValue7 & mask; - out[29 + outOffset] = (curInputValue7 >>> 8) & mask; - out[30 + outOffset] = (curInputValue7 >>> 16) & mask; - out[31 + outOffset] = curInputValue7 >>> 24; - outOffset += 32; + static private void unpack8(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 255; + for (i = 0, w = 1; i < 4; ++i, w += 8) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + int curInputValue2 = in[w + 2]; + int curInputValue3 = in[w + 3]; + int curInputValue4 = in[w + 4]; + int curInputValue5 = in[w + 5]; + int curInputValue6 = in[w + 6]; + int curInputValue7 = in[w + 7]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 8) & mask; + out[2 + outOffset] = (curInputValue0 >>> 16) & mask; + out[3 + outOffset] = curInputValue0 >>> 24; + out[4 + outOffset] = curInputValue1 & mask; + out[5 + outOffset] = (curInputValue1 >>> 8) & mask; + out[6 + outOffset] = (curInputValue1 >>> 16) & mask; + out[7 + outOffset] = curInputValue1 >>> 24; + out[8 + outOffset] = curInputValue2 & mask; + out[9 + outOffset] = (curInputValue2 >>> 8) & mask; + out[10 + outOffset] = (curInputValue2 >>> 16) & mask; + out[11 + outOffset] = curInputValue2 >>> 24; + out[12 + outOffset] = curInputValue3 & mask; + out[13 + outOffset] = (curInputValue3 >>> 8) & mask; + out[14 + outOffset] = (curInputValue3 >>> 16) & mask; + out[15 + outOffset] = curInputValue3 >>> 24; + out[16 + outOffset] = curInputValue4 & mask; + out[17 + outOffset] = (curInputValue4 >>> 8) & mask; + out[18 + outOffset] = (curInputValue4 >>> 16) & mask; + out[19 + outOffset] = curInputValue4 >>> 24; + out[20 + outOffset] = curInputValue5 & mask; + out[21 + outOffset] = (curInputValue5 >>> 8) & mask; + out[22 + outOffset] = (curInputValue5 >>> 16) & mask; + out[23 + outOffset] = curInputValue5 >>> 24; + out[24 + outOffset] = curInputValue6 & mask; + out[25 + outOffset] = (curInputValue6 >>> 8) & mask; + out[26 + outOffset] = (curInputValue6 >>> 16) & mask; + out[27 + outOffset] = curInputValue6 >>> 24; + out[28 + outOffset] = curInputValue7 & mask; + out[29 + outOffset] = (curInputValue7 >>> 8) & mask; + out[30 + outOffset] = (curInputValue7 >>> 16) & mask; + out[31 + outOffset] = curInputValue7 >>> 24; + outOffset += 32; + } } - } - static private void unpack9(int[] out, int[] in) { - int i, w; - int outOffset = 0; - final int mask = 511; - for (i = 0, w = 1; i < 4; ++i, w += 9) { - int curInputValue0 = in[w]; - int curInputValue1 = in[w + 1]; - int curInputValue2 = in[w + 2]; - int curInputValue3 = in[w + 3]; - int curInputValue4 = in[w + 4]; - int curInputValue5 = in[w + 5]; - int curInputValue6 = in[w + 6]; - int curInputValue7 = in[w + 7]; - int curInputValue8 = in[w + 8]; - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = (curInputValue0 >>> 9) & mask; - out[2 + outOffset] = (curInputValue0 >>> 18) & mask; - out[3 + outOffset] = ((curInputValue0 >>> 27) | (curInputValue1 << 5)) & mask; - out[4 + outOffset] = (curInputValue1 >>> 4) & mask; - out[5 + outOffset] = (curInputValue1 >>> 13) & mask; - out[6 + outOffset] = (curInputValue1 >>> 22) & mask; - out[7 + outOffset] = ((curInputValue1 >>> 31) | (curInputValue2 << 1)) & mask; - out[8 + outOffset] = (curInputValue2 >>> 8) & mask; - out[9 + outOffset] = (curInputValue2 >>> 17) & mask; - out[10 + outOffset] = ((curInputValue2 >>> 26) | (curInputValue3 << 6)) & mask; - out[11 + outOffset] = (curInputValue3 >>> 3) & mask; - out[12 + outOffset] = (curInputValue3 >>> 12) & mask; - out[13 + outOffset] = (curInputValue3 >>> 21) & mask; - out[14 + outOffset] = ((curInputValue3 >>> 30) | (curInputValue4 << 2)) & mask; - out[15 + outOffset] = (curInputValue4 >>> 7) & mask; - out[16 + outOffset] = (curInputValue4 >>> 16) & mask; - out[17 + outOffset] = ((curInputValue4 >>> 25) | (curInputValue5 << 7)) & mask; - out[18 + outOffset] = (curInputValue5 >>> 2) & mask; - out[19 + outOffset] = (curInputValue5 >>> 11) & mask; - out[20 + outOffset] = (curInputValue5 >>> 20) & mask; - out[21 + outOffset] = ((curInputValue5 >>> 29) | (curInputValue6 << 3)) & mask; - out[22 + outOffset] = (curInputValue6 >>> 6) & mask; - out[23 + outOffset] = (curInputValue6 >>> 15) & mask; - out[24 + outOffset] = ((curInputValue6 >>> 24) | (curInputValue7 << 8)) & mask; - out[25 + outOffset] = (curInputValue7 >>> 1) & mask; - out[26 + outOffset] = (curInputValue7 >>> 10) & mask; - out[27 + outOffset] = (curInputValue7 >>> 19) & mask; - out[28 + outOffset] = ((curInputValue7 >>> 28) | (curInputValue8 << 4)) & mask; - out[29 + outOffset] = (curInputValue8 >>> 5) & mask; - out[30 + outOffset] = (curInputValue8 >>> 14) & mask; - out[31 + outOffset] = curInputValue8 >>> 23; - outOffset += 32; + static private void unpack9(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 511; + for (i = 0, w = 1; i < 4; ++i, w += 9) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + int curInputValue2 = in[w + 2]; + int curInputValue3 = in[w + 3]; + int curInputValue4 = in[w + 4]; + int curInputValue5 = in[w + 5]; + int curInputValue6 = in[w + 6]; + int curInputValue7 = in[w + 7]; + int curInputValue8 = in[w + 8]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 9) & mask; + out[2 + outOffset] = (curInputValue0 >>> 18) & mask; + out[3 + outOffset] = ((curInputValue0 >>> 27) | (curInputValue1 << 5)) + & mask; + out[4 + outOffset] = (curInputValue1 >>> 4) & mask; + out[5 + outOffset] = (curInputValue1 >>> 13) & mask; + out[6 + outOffset] = (curInputValue1 >>> 22) & mask; + out[7 + outOffset] = ((curInputValue1 >>> 31) | (curInputValue2 << 1)) + & mask; + out[8 + outOffset] = (curInputValue2 >>> 8) & mask; + out[9 + outOffset] = (curInputValue2 >>> 17) & mask; + out[10 + outOffset] = ((curInputValue2 >>> 26) | (curInputValue3 << 6)) + & mask; + out[11 + outOffset] = (curInputValue3 >>> 3) & mask; + out[12 + outOffset] = (curInputValue3 >>> 12) & mask; + out[13 + outOffset] = (curInputValue3 >>> 21) & mask; + out[14 + outOffset] = ((curInputValue3 >>> 30) | (curInputValue4 << 2)) + & mask; + out[15 + outOffset] = (curInputValue4 >>> 7) & mask; + out[16 + outOffset] = (curInputValue4 >>> 16) & mask; + out[17 + outOffset] = ((curInputValue4 >>> 25) | (curInputValue5 << 7)) + & mask; + out[18 + outOffset] = (curInputValue5 >>> 2) & mask; + out[19 + outOffset] = (curInputValue5 >>> 11) & mask; + out[20 + outOffset] = (curInputValue5 >>> 20) & mask; + out[21 + outOffset] = ((curInputValue5 >>> 29) | (curInputValue6 << 3)) + & mask; + out[22 + outOffset] = (curInputValue6 >>> 6) & mask; + out[23 + outOffset] = (curInputValue6 >>> 15) & mask; + out[24 + outOffset] = ((curInputValue6 >>> 24) | (curInputValue7 << 8)) + & mask; + out[25 + outOffset] = (curInputValue7 >>> 1) & mask; + out[26 + outOffset] = (curInputValue7 >>> 10) & mask; + out[27 + outOffset] = (curInputValue7 >>> 19) & mask; + out[28 + outOffset] = ((curInputValue7 >>> 28) | (curInputValue8 << 4)) + & mask; + out[29 + outOffset] = (curInputValue8 >>> 5) & mask; + out[30 + outOffset] = (curInputValue8 >>> 14) & mask; + out[31 + outOffset] = curInputValue8 >>> 23; + outOffset += 32; + } } - } - static private void unpack10(int[] out, int[] in) { - int i, w; - int outOffset = 0; - final int mask = 1023; - for (i = 0, w = 1; i < 4; ++i, w += 10) { - int curInputValue0 = in[w]; - int curInputValue1 = in[w + 1]; - int curInputValue2 = in[w + 2]; - int curInputValue3 = in[w + 3]; - int curInputValue4 = in[w + 4]; - int curInputValue5 = in[w + 5]; - int curInputValue6 = in[w + 6]; - int curInputValue7 = in[w + 7]; - int curInputValue8 = in[w + 8]; - int curInputValue9 = in[w + 9]; - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = (curInputValue0 >>> 10) & mask; - out[2 + outOffset] = (curInputValue0 >>> 20) & mask; - out[3 + outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) & mask; - out[4 + outOffset] = (curInputValue1 >>> 8) & mask; - out[5 + outOffset] = (curInputValue1 >>> 18) & mask; - out[6 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; - out[7 + outOffset] = (curInputValue2 >>> 6) & mask; - out[8 + outOffset] = (curInputValue2 >>> 16) & mask; - out[9 + outOffset] = ((curInputValue2 >>> 26) | (curInputValue3 << 6)) & mask; - out[10 + outOffset] = (curInputValue3 >>> 4) & mask; - out[11 + outOffset] = (curInputValue3 >>> 14) & mask; - out[12 + outOffset] = ((curInputValue3 >>> 24) | (curInputValue4 << 8)) & mask; - out[13 + outOffset] = (curInputValue4 >>> 2) & mask; - out[14 + outOffset] = (curInputValue4 >>> 12) & mask; - out[15 + outOffset] = curInputValue4 >>> 22; - out[16 + outOffset] = curInputValue5 & mask; - out[17 + outOffset] = (curInputValue5 >>> 10) & mask; - out[18 + outOffset] = (curInputValue5 >>> 20) & mask; - out[19 + outOffset] = ((curInputValue5 >>> 30) | (curInputValue6 << 2)) & mask; - out[20 + outOffset] = (curInputValue6 >>> 8) & mask; - out[21 + outOffset] = (curInputValue6 >>> 18) & mask; - out[22 + outOffset] = ((curInputValue6 >>> 28) | (curInputValue7 << 4)) & mask; - out[23 + outOffset] = (curInputValue7 >>> 6) & mask; - out[24 + outOffset] = (curInputValue7 >>> 16) & mask; - out[25 + outOffset] = ((curInputValue7 >>> 26) | (curInputValue8 << 6)) & mask; - out[26 + outOffset] = (curInputValue8 >>> 4) & mask; - out[27 + outOffset] = (curInputValue8 >>> 14) & mask; - out[28 + outOffset] = ((curInputValue8 >>> 24) | (curInputValue9 << 8)) & mask; - out[29 + outOffset] = (curInputValue9 >>> 2) & mask; - out[30 + outOffset] = (curInputValue9 >>> 12) & mask; - out[31 + outOffset] = curInputValue9 >>> 22; - outOffset += 32; + static private void unpack10(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 1023; + for (i = 0, w = 1; i < 4; ++i, w += 10) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + int curInputValue2 = in[w + 2]; + int curInputValue3 = in[w + 3]; + int curInputValue4 = in[w + 4]; + int curInputValue5 = in[w + 5]; + int curInputValue6 = in[w + 6]; + int curInputValue7 = in[w + 7]; + int curInputValue8 = in[w + 8]; + int curInputValue9 = in[w + 9]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 10) & mask; + out[2 + outOffset] = (curInputValue0 >>> 20) & mask; + out[3 + outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) + & mask; + out[4 + outOffset] = (curInputValue1 >>> 8) & mask; + out[5 + outOffset] = (curInputValue1 >>> 18) & mask; + out[6 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) + & mask; + out[7 + outOffset] = (curInputValue2 >>> 6) & mask; + out[8 + outOffset] = (curInputValue2 >>> 16) & mask; + out[9 + outOffset] = ((curInputValue2 >>> 26) | (curInputValue3 << 6)) + & mask; + out[10 + outOffset] = (curInputValue3 >>> 4) & mask; + out[11 + outOffset] = (curInputValue3 >>> 14) & mask; + out[12 + outOffset] = ((curInputValue3 >>> 24) | (curInputValue4 << 8)) + & mask; + out[13 + outOffset] = (curInputValue4 >>> 2) & mask; + out[14 + outOffset] = (curInputValue4 >>> 12) & mask; + out[15 + outOffset] = curInputValue4 >>> 22; + out[16 + outOffset] = curInputValue5 & mask; + out[17 + outOffset] = (curInputValue5 >>> 10) & mask; + out[18 + outOffset] = (curInputValue5 >>> 20) & mask; + out[19 + outOffset] = ((curInputValue5 >>> 30) | (curInputValue6 << 2)) + & mask; + out[20 + outOffset] = (curInputValue6 >>> 8) & mask; + out[21 + outOffset] = (curInputValue6 >>> 18) & mask; + out[22 + outOffset] = ((curInputValue6 >>> 28) | (curInputValue7 << 4)) + & mask; + out[23 + outOffset] = (curInputValue7 >>> 6) & mask; + out[24 + outOffset] = (curInputValue7 >>> 16) & mask; + out[25 + outOffset] = ((curInputValue7 >>> 26) | (curInputValue8 << 6)) + & mask; + out[26 + outOffset] = (curInputValue8 >>> 4) & mask; + out[27 + outOffset] = (curInputValue8 >>> 14) & mask; + out[28 + outOffset] = ((curInputValue8 >>> 24) | (curInputValue9 << 8)) + & mask; + out[29 + outOffset] = (curInputValue9 >>> 2) & mask; + out[30 + outOffset] = (curInputValue9 >>> 12) & mask; + out[31 + outOffset] = curInputValue9 >>> 22; + outOffset += 32; + } } - } - static private void unpack11(int[] out, int[] in) { - int i, w; - int outOffset = 0; - final int mask = 2047; - for (i = 0, w = 1; i < 4; ++i, w += 11) { - int curInputValue0 = in[w]; - int curInputValue1 = in[w + 1]; - int curInputValue2 = in[w + 2]; - int curInputValue3 = in[w + 3]; - int curInputValue4 = in[w + 4]; - int curInputValue5 = in[w + 5]; - int curInputValue6 = in[w + 6]; - int curInputValue7 = in[w + 7]; - int curInputValue8 = in[w + 8]; - int curInputValue9 = in[w + 9]; - int curInputValue10 = in[w + 10]; - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = (curInputValue0 >>> 11) & mask; - out[2 + outOffset] = ((curInputValue0 >>> 22) | (curInputValue1 << 10)) & mask; - out[3 + outOffset] = (curInputValue1 >>> 1) & mask; - out[4 + outOffset] = (curInputValue1 >>> 12) & mask; - out[5 + outOffset] = ((curInputValue1 >>> 23) | (curInputValue2 << 9)) & mask; - out[6 + outOffset] = (curInputValue2 >>> 2) & mask; - out[7 + outOffset] = (curInputValue2 >>> 13) & mask; - out[8 + outOffset] = ((curInputValue2 >>> 24) | (curInputValue3 << 8)) & mask; - out[9 + outOffset] = (curInputValue3 >>> 3) & mask; - out[10 + outOffset] = (curInputValue3 >>> 14) & mask; - out[11 + outOffset] = ((curInputValue3 >>> 25) | (curInputValue4 << 7)) & mask; - out[12 + outOffset] = (curInputValue4 >>> 4) & mask; - out[13 + outOffset] = (curInputValue4 >>> 15) & mask; - out[14 + outOffset] = ((curInputValue4 >>> 26) | (curInputValue5 << 6)) & mask; - out[15 + outOffset] = (curInputValue5 >>> 5) & mask; - out[16 + outOffset] = (curInputValue5 >>> 16) & mask; - out[17 + outOffset] = ((curInputValue5 >>> 27) | (curInputValue6 << 5)) & mask; - out[18 + outOffset] = (curInputValue6 >>> 6) & mask; - out[19 + outOffset] = (curInputValue6 >>> 17) & mask; - out[20 + outOffset] = ((curInputValue6 >>> 28) | (curInputValue7 << 4)) & mask; - out[21 + outOffset] = (curInputValue7 >>> 7) & mask; - out[22 + outOffset] = (curInputValue7 >>> 18) & mask; - out[23 + outOffset] = ((curInputValue7 >>> 29) | (curInputValue8 << 3)) & mask; - out[24 + outOffset] = (curInputValue8 >>> 8) & mask; - out[25 + outOffset] = (curInputValue8 >>> 19) & mask; - out[26 + outOffset] = ((curInputValue8 >>> 30) | (curInputValue9 << 2)) & mask; - out[27 + outOffset] = (curInputValue9 >>> 9) & mask; - out[28 + outOffset] = (curInputValue9 >>> 20) & mask; - out[29 + outOffset] = ((curInputValue9 >>> 31) | (curInputValue10 << 1)) & mask; - out[30 + outOffset] = (curInputValue10 >>> 10) & mask; - out[31 + outOffset] = curInputValue10 >>> 21; - outOffset += 32; + static private void unpack11(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 2047; + for (i = 0, w = 1; i < 4; ++i, w += 11) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + int curInputValue2 = in[w + 2]; + int curInputValue3 = in[w + 3]; + int curInputValue4 = in[w + 4]; + int curInputValue5 = in[w + 5]; + int curInputValue6 = in[w + 6]; + int curInputValue7 = in[w + 7]; + int curInputValue8 = in[w + 8]; + int curInputValue9 = in[w + 9]; + int curInputValue10 = in[w + 10]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 11) & mask; + out[2 + outOffset] = ((curInputValue0 >>> 22) | (curInputValue1 << 10)) + & mask; + out[3 + outOffset] = (curInputValue1 >>> 1) & mask; + out[4 + outOffset] = (curInputValue1 >>> 12) & mask; + out[5 + outOffset] = ((curInputValue1 >>> 23) | (curInputValue2 << 9)) + & mask; + out[6 + outOffset] = (curInputValue2 >>> 2) & mask; + out[7 + outOffset] = (curInputValue2 >>> 13) & mask; + out[8 + outOffset] = ((curInputValue2 >>> 24) | (curInputValue3 << 8)) + & mask; + out[9 + outOffset] = (curInputValue3 >>> 3) & mask; + out[10 + outOffset] = (curInputValue3 >>> 14) & mask; + out[11 + outOffset] = ((curInputValue3 >>> 25) | (curInputValue4 << 7)) + & mask; + out[12 + outOffset] = (curInputValue4 >>> 4) & mask; + out[13 + outOffset] = (curInputValue4 >>> 15) & mask; + out[14 + outOffset] = ((curInputValue4 >>> 26) | (curInputValue5 << 6)) + & mask; + out[15 + outOffset] = (curInputValue5 >>> 5) & mask; + out[16 + outOffset] = (curInputValue5 >>> 16) & mask; + out[17 + outOffset] = ((curInputValue5 >>> 27) | (curInputValue6 << 5)) + & mask; + out[18 + outOffset] = (curInputValue6 >>> 6) & mask; + out[19 + outOffset] = (curInputValue6 >>> 17) & mask; + out[20 + outOffset] = ((curInputValue6 >>> 28) | (curInputValue7 << 4)) + & mask; + out[21 + outOffset] = (curInputValue7 >>> 7) & mask; + out[22 + outOffset] = (curInputValue7 >>> 18) & mask; + out[23 + outOffset] = ((curInputValue7 >>> 29) | (curInputValue8 << 3)) + & mask; + out[24 + outOffset] = (curInputValue8 >>> 8) & mask; + out[25 + outOffset] = (curInputValue8 >>> 19) & mask; + out[26 + outOffset] = ((curInputValue8 >>> 30) | (curInputValue9 << 2)) + & mask; + out[27 + outOffset] = (curInputValue9 >>> 9) & mask; + out[28 + outOffset] = (curInputValue9 >>> 20) & mask; + out[29 + outOffset] = ((curInputValue9 >>> 31) | (curInputValue10 << 1)) + & mask; + out[30 + outOffset] = (curInputValue10 >>> 10) & mask; + out[31 + outOffset] = curInputValue10 >>> 21; + outOffset += 32; + } } - } - static private void unpack12(int[] out, int[] in) { - int i, w; - int outOffset = 0; - final int mask = 4095; - for (i = 0, w = 1; i < 4; ++i, w += 12) { - int curInputValue0 = in[w]; - int curInputValue1 = in[w + 1]; - int curInputValue2 = in[w + 2]; - int curInputValue3 = in[w + 3]; - int curInputValue4 = in[w + 4]; - int curInputValue5 = in[w + 5]; - int curInputValue6 = in[w + 6]; - int curInputValue7 = in[w + 7]; - int curInputValue8 = in[w + 8]; - int curInputValue9 = in[w + 9]; - int curInputValue10 = in[w + 10]; - int curInputValue11 = in[w + 11]; - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = (curInputValue0 >>> 12) & mask; - out[2 + outOffset] = ((curInputValue0 >>> 24) | (curInputValue1 << 8)) & mask; - out[3 + outOffset] = (curInputValue1 >>> 4) & mask; - out[4 + outOffset] = (curInputValue1 >>> 16) & mask; - out[5 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; - out[6 + outOffset] = (curInputValue2 >>> 8) & mask; - out[7 + outOffset] = curInputValue2 >>> 20; - out[8 + outOffset] = curInputValue3 & mask; - out[9 + outOffset] = (curInputValue3 >>> 12) & mask; - out[10 + outOffset] = ((curInputValue3 >>> 24) | (curInputValue4 << 8)) & mask; - out[11 + outOffset] = (curInputValue4 >>> 4) & mask; - out[12 + outOffset] = (curInputValue4 >>> 16) & mask; - out[13 + outOffset] = ((curInputValue4 >>> 28) | (curInputValue5 << 4)) & mask; - out[14 + outOffset] = (curInputValue5 >>> 8) & mask; - out[15 + outOffset] = curInputValue5 >>> 20; - out[16 + outOffset] = curInputValue6 & mask; - out[17 + outOffset] = (curInputValue6 >>> 12) & mask; - out[18 + outOffset] = ((curInputValue6 >>> 24) | (curInputValue7 << 8)) & mask; - out[19 + outOffset] = (curInputValue7 >>> 4) & mask; - out[20 + outOffset] = (curInputValue7 >>> 16) & mask; - out[21 + outOffset] = ((curInputValue7 >>> 28) | (curInputValue8 << 4)) & mask; - out[22 + outOffset] = (curInputValue8 >>> 8) & mask; - out[23 + outOffset] = curInputValue8 >>> 20; - out[24 + outOffset] = curInputValue9 & mask; - out[25 + outOffset] = (curInputValue9 >>> 12) & mask; - out[26 + outOffset] = ((curInputValue9 >>> 24) | (curInputValue10 << 8)) & mask; - out[27 + outOffset] = (curInputValue10 >>> 4) & mask; - out[28 + outOffset] = (curInputValue10 >>> 16) & mask; - out[29 + outOffset] = ((curInputValue10 >>> 28) | (curInputValue11 << 4)) & mask; - out[30 + outOffset] = (curInputValue11 >>> 8) & mask; - out[31 + outOffset] = curInputValue11 >>> 20; - outOffset += 32; + static private void unpack12(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 4095; + for (i = 0, w = 1; i < 4; ++i, w += 12) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + int curInputValue2 = in[w + 2]; + int curInputValue3 = in[w + 3]; + int curInputValue4 = in[w + 4]; + int curInputValue5 = in[w + 5]; + int curInputValue6 = in[w + 6]; + int curInputValue7 = in[w + 7]; + int curInputValue8 = in[w + 8]; + int curInputValue9 = in[w + 9]; + int curInputValue10 = in[w + 10]; + int curInputValue11 = in[w + 11]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 12) & mask; + out[2 + outOffset] = ((curInputValue0 >>> 24) | (curInputValue1 << 8)) + & mask; + out[3 + outOffset] = (curInputValue1 >>> 4) & mask; + out[4 + outOffset] = (curInputValue1 >>> 16) & mask; + out[5 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) + & mask; + out[6 + outOffset] = (curInputValue2 >>> 8) & mask; + out[7 + outOffset] = curInputValue2 >>> 20; + out[8 + outOffset] = curInputValue3 & mask; + out[9 + outOffset] = (curInputValue3 >>> 12) & mask; + out[10 + outOffset] = ((curInputValue3 >>> 24) | (curInputValue4 << 8)) + & mask; + out[11 + outOffset] = (curInputValue4 >>> 4) & mask; + out[12 + outOffset] = (curInputValue4 >>> 16) & mask; + out[13 + outOffset] = ((curInputValue4 >>> 28) | (curInputValue5 << 4)) + & mask; + out[14 + outOffset] = (curInputValue5 >>> 8) & mask; + out[15 + outOffset] = curInputValue5 >>> 20; + out[16 + outOffset] = curInputValue6 & mask; + out[17 + outOffset] = (curInputValue6 >>> 12) & mask; + out[18 + outOffset] = ((curInputValue6 >>> 24) | (curInputValue7 << 8)) + & mask; + out[19 + outOffset] = (curInputValue7 >>> 4) & mask; + out[20 + outOffset] = (curInputValue7 >>> 16) & mask; + out[21 + outOffset] = ((curInputValue7 >>> 28) | (curInputValue8 << 4)) + & mask; + out[22 + outOffset] = (curInputValue8 >>> 8) & mask; + out[23 + outOffset] = curInputValue8 >>> 20; + out[24 + outOffset] = curInputValue9 & mask; + out[25 + outOffset] = (curInputValue9 >>> 12) & mask; + out[26 + outOffset] = ((curInputValue9 >>> 24) | (curInputValue10 << 8)) + & mask; + out[27 + outOffset] = (curInputValue10 >>> 4) & mask; + out[28 + outOffset] = (curInputValue10 >>> 16) & mask; + out[29 + outOffset] = ((curInputValue10 >>> 28) | (curInputValue11 << 4)) + & mask; + out[30 + outOffset] = (curInputValue11 >>> 8) & mask; + out[31 + outOffset] = curInputValue11 >>> 20; + outOffset += 32; + } } - } - static private void unpack13(int[] out, int[] in) { - int i, w; - int outOffset = 0; - final int mask = 8191; - for (i = 0, w = 1; i < 4; ++i, w += 13) { - int curInputValue0 = in[w]; - int curInputValue1 = in[w + 1]; - int curInputValue2 = in[w + 2]; - int curInputValue3 = in[w + 3]; - int curInputValue4 = in[w + 4]; - int curInputValue5 = in[w + 5]; - int curInputValue6 = in[w + 6]; - int curInputValue7 = in[w + 7]; - int curInputValue8 = in[w + 8]; - int curInputValue9 = in[w + 9]; - int curInputValue10 = in[w + 10]; - int curInputValue11 = in[w + 11]; - int curInputValue12 = in[w + 12]; - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = (curInputValue0 >>> 13) & mask; - out[2 + outOffset] = ((curInputValue0 >>> 26) | (curInputValue1 << 6)) & mask; - out[3 + outOffset] = (curInputValue1 >>> 7) & mask; - out[4 + outOffset] = ((curInputValue1 >>> 20) | (curInputValue2 << 12)) & mask; - out[5 + outOffset] = (curInputValue2 >>> 1) & mask; - out[6 + outOffset] = (curInputValue2 >>> 14) & mask; - out[7 + outOffset] = ((curInputValue2 >>> 27) | (curInputValue3 << 5)) & mask; - out[8 + outOffset] = (curInputValue3 >>> 8) & mask; - out[9 + outOffset] = ((curInputValue3 >>> 21) | (curInputValue4 << 11)) & mask; - out[10 + outOffset] = (curInputValue4 >>> 2) & mask; - out[11 + outOffset] = (curInputValue4 >>> 15) & mask; - out[12 + outOffset] = ((curInputValue4 >>> 28) | (curInputValue5 << 4)) & mask; - out[13 + outOffset] = (curInputValue5 >>> 9) & mask; - out[14 + outOffset] = ((curInputValue5 >>> 22) | (curInputValue6 << 10)) & mask; - out[15 + outOffset] = (curInputValue6 >>> 3) & mask; - out[16 + outOffset] = (curInputValue6 >>> 16) & mask; - out[17 + outOffset] = ((curInputValue6 >>> 29) | (curInputValue7 << 3)) & mask; - out[18 + outOffset] = (curInputValue7 >>> 10) & mask; - out[19 + outOffset] = ((curInputValue7 >>> 23) | (curInputValue8 << 9)) & mask; - out[20 + outOffset] = (curInputValue8 >>> 4) & mask; - out[21 + outOffset] = (curInputValue8 >>> 17) & mask; - out[22 + outOffset] = ((curInputValue8 >>> 30) | (curInputValue9 << 2)) & mask; - out[23 + outOffset] = (curInputValue9 >>> 11) & mask; - out[24 + outOffset] = ((curInputValue9 >>> 24) | (curInputValue10 << 8)) & mask; - out[25 + outOffset] = (curInputValue10 >>> 5) & mask; - out[26 + outOffset] = (curInputValue10 >>> 18) & mask; - out[27 + outOffset] = ((curInputValue10 >>> 31) | (curInputValue11 << 1)) & mask; - out[28 + outOffset] = (curInputValue11 >>> 12) & mask; - out[29 + outOffset] = ((curInputValue11 >>> 25) | (curInputValue12 << 7)) & mask; - out[30 + outOffset] = (curInputValue12 >>> 6) & mask; - out[31 + outOffset] = curInputValue12 >>> 19; - outOffset += 32; + static private void unpack13(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 8191; + for (i = 0, w = 1; i < 4; ++i, w += 13) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + int curInputValue2 = in[w + 2]; + int curInputValue3 = in[w + 3]; + int curInputValue4 = in[w + 4]; + int curInputValue5 = in[w + 5]; + int curInputValue6 = in[w + 6]; + int curInputValue7 = in[w + 7]; + int curInputValue8 = in[w + 8]; + int curInputValue9 = in[w + 9]; + int curInputValue10 = in[w + 10]; + int curInputValue11 = in[w + 11]; + int curInputValue12 = in[w + 12]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 13) & mask; + out[2 + outOffset] = ((curInputValue0 >>> 26) | (curInputValue1 << 6)) + & mask; + out[3 + outOffset] = (curInputValue1 >>> 7) & mask; + out[4 + outOffset] = ((curInputValue1 >>> 20) | (curInputValue2 << 12)) + & mask; + out[5 + outOffset] = (curInputValue2 >>> 1) & mask; + out[6 + outOffset] = (curInputValue2 >>> 14) & mask; + out[7 + outOffset] = ((curInputValue2 >>> 27) | (curInputValue3 << 5)) + & mask; + out[8 + outOffset] = (curInputValue3 >>> 8) & mask; + out[9 + outOffset] = ((curInputValue3 >>> 21) | (curInputValue4 << 11)) + & mask; + out[10 + outOffset] = (curInputValue4 >>> 2) & mask; + out[11 + outOffset] = (curInputValue4 >>> 15) & mask; + out[12 + outOffset] = ((curInputValue4 >>> 28) | (curInputValue5 << 4)) + & mask; + out[13 + outOffset] = (curInputValue5 >>> 9) & mask; + out[14 + outOffset] = ((curInputValue5 >>> 22) | (curInputValue6 << 10)) + & mask; + out[15 + outOffset] = (curInputValue6 >>> 3) & mask; + out[16 + outOffset] = (curInputValue6 >>> 16) & mask; + out[17 + outOffset] = ((curInputValue6 >>> 29) | (curInputValue7 << 3)) + & mask; + out[18 + outOffset] = (curInputValue7 >>> 10) & mask; + out[19 + outOffset] = ((curInputValue7 >>> 23) | (curInputValue8 << 9)) + & mask; + out[20 + outOffset] = (curInputValue8 >>> 4) & mask; + out[21 + outOffset] = (curInputValue8 >>> 17) & mask; + out[22 + outOffset] = ((curInputValue8 >>> 30) | (curInputValue9 << 2)) + & mask; + out[23 + outOffset] = (curInputValue9 >>> 11) & mask; + out[24 + outOffset] = ((curInputValue9 >>> 24) | (curInputValue10 << 8)) + & mask; + out[25 + outOffset] = (curInputValue10 >>> 5) & mask; + out[26 + outOffset] = (curInputValue10 >>> 18) & mask; + out[27 + outOffset] = ((curInputValue10 >>> 31) | (curInputValue11 << 1)) + & mask; + out[28 + outOffset] = (curInputValue11 >>> 12) & mask; + out[29 + outOffset] = ((curInputValue11 >>> 25) | (curInputValue12 << 7)) + & mask; + out[30 + outOffset] = (curInputValue12 >>> 6) & mask; + out[31 + outOffset] = curInputValue12 >>> 19; + outOffset += 32; + } } - } - static private void unpack16(int[] out, int[] in) { - int i, w; - int outOffset = 0; - final int mask = 65535; - for (i = 0, w = 1; i < 4; ++i, w += 16) { - int curInputValue0 = in[w]; - int curInputValue1 = in[w + 1]; - int curInputValue2 = in[w + 2]; - int curInputValue3 = in[w + 3]; - int curInputValue4 = in[w + 4]; - int curInputValue5 = in[w + 5]; - int curInputValue6 = in[w + 6]; - int curInputValue7 = in[w + 7]; - int curInputValue8 = in[w + 8]; - int curInputValue9 = in[w + 9]; - int curInputValue10 = in[w + 10]; - int curInputValue11 = in[w + 11]; - int curInputValue12 = in[w + 12]; - int curInputValue13 = in[w + 13]; - int curInputValue14 = in[w + 14]; - int curInputValue15 = in[w + 15]; - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = curInputValue0 >>> 16; - out[2 + outOffset] = curInputValue1 & mask; - out[3 + outOffset] = curInputValue1 >>> 16; - out[4 + outOffset] = curInputValue2 & mask; - out[5 + outOffset] = curInputValue2 >>> 16; - out[6 + outOffset] = curInputValue3 & mask; - out[7 + outOffset] = curInputValue3 >>> 16; - out[8 + outOffset] = curInputValue4 & mask; - out[9 + outOffset] = curInputValue4 >>> 16; - out[10 + outOffset] = curInputValue5 & mask; - out[11 + outOffset] = curInputValue5 >>> 16; - out[12 + outOffset] = curInputValue6 & mask; - out[13 + outOffset] = curInputValue6 >>> 16; - out[14 + outOffset] = curInputValue7 & mask; - out[15 + outOffset] = curInputValue7 >>> 16; - out[16 + outOffset] = curInputValue8 & mask; - out[17 + outOffset] = curInputValue8 >>> 16; - out[18 + outOffset] = curInputValue9 & mask; - out[19 + outOffset] = curInputValue9 >>> 16; - out[20 + outOffset] = curInputValue10 & mask; - out[21 + outOffset] = curInputValue10 >>> 16; - out[22 + outOffset] = curInputValue11 & mask; - out[23 + outOffset] = curInputValue11 >>> 16; - out[24 + outOffset] = curInputValue12 & mask; - out[25 + outOffset] = curInputValue12 >>> 16; - out[26 + outOffset] = curInputValue13 & mask; - out[27 + outOffset] = curInputValue13 >>> 16; - out[28 + outOffset] = curInputValue14 & mask; - out[29 + outOffset] = curInputValue14 >>> 16; - out[30 + outOffset] = curInputValue15 & mask; - out[31 + outOffset] = curInputValue15 >>> 16; - outOffset += 32; + static private void unpack16(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 65535; + for (i = 0, w = 1; i < 4; ++i, w += 16) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + int curInputValue2 = in[w + 2]; + int curInputValue3 = in[w + 3]; + int curInputValue4 = in[w + 4]; + int curInputValue5 = in[w + 5]; + int curInputValue6 = in[w + 6]; + int curInputValue7 = in[w + 7]; + int curInputValue8 = in[w + 8]; + int curInputValue9 = in[w + 9]; + int curInputValue10 = in[w + 10]; + int curInputValue11 = in[w + 11]; + int curInputValue12 = in[w + 12]; + int curInputValue13 = in[w + 13]; + int curInputValue14 = in[w + 14]; + int curInputValue15 = in[w + 15]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = curInputValue0 >>> 16; + out[2 + outOffset] = curInputValue1 & mask; + out[3 + outOffset] = curInputValue1 >>> 16; + out[4 + outOffset] = curInputValue2 & mask; + out[5 + outOffset] = curInputValue2 >>> 16; + out[6 + outOffset] = curInputValue3 & mask; + out[7 + outOffset] = curInputValue3 >>> 16; + out[8 + outOffset] = curInputValue4 & mask; + out[9 + outOffset] = curInputValue4 >>> 16; + out[10 + outOffset] = curInputValue5 & mask; + out[11 + outOffset] = curInputValue5 >>> 16; + out[12 + outOffset] = curInputValue6 & mask; + out[13 + outOffset] = curInputValue6 >>> 16; + out[14 + outOffset] = curInputValue7 & mask; + out[15 + outOffset] = curInputValue7 >>> 16; + out[16 + outOffset] = curInputValue8 & mask; + out[17 + outOffset] = curInputValue8 >>> 16; + out[18 + outOffset] = curInputValue9 & mask; + out[19 + outOffset] = curInputValue9 >>> 16; + out[20 + outOffset] = curInputValue10 & mask; + out[21 + outOffset] = curInputValue10 >>> 16; + out[22 + outOffset] = curInputValue11 & mask; + out[23 + outOffset] = curInputValue11 >>> 16; + out[24 + outOffset] = curInputValue12 & mask; + out[25 + outOffset] = curInputValue12 >>> 16; + out[26 + outOffset] = curInputValue13 & mask; + out[27 + outOffset] = curInputValue13 >>> 16; + out[28 + outOffset] = curInputValue14 & mask; + out[29 + outOffset] = curInputValue14 >>> 16; + out[30 + outOffset] = curInputValue15 & mask; + out[31 + outOffset] = curInputValue15 >>> 16; + outOffset += 32; + } } - } - static private void unpack20(int[] out, int[] in) { - int i, w; - int outOffset = 0; - final int mask = 1048575; - for (i = 0, w = 1; i < 4; ++i, w += 20) { - int curInputValue0 = in[w]; - int curInputValue1 = in[w + 1]; - int curInputValue2 = in[w + 2]; - int curInputValue3 = in[w + 3]; - int curInputValue4 = in[w + 4]; - int curInputValue5 = in[w + 5]; - int curInputValue6 = in[w + 6]; - int curInputValue7 = in[w + 7]; - int curInputValue8 = in[w + 8]; - int curInputValue9 = in[w + 9]; - int curInputValue10 = in[w + 10]; - int curInputValue11 = in[w + 11]; - int curInputValue12 = in[w + 12]; - int curInputValue13 = in[w + 13]; - int curInputValue14 = in[w + 14]; - int curInputValue15 = in[w + 15]; - int curInputValue16 = in[w + 16]; - int curInputValue17 = in[w + 17]; - int curInputValue18 = in[w + 18]; - int curInputValue19 = in[w + 19]; - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = ((curInputValue0 >>> 20) | (curInputValue1 << 12)) & mask; - out[2 + outOffset] = (curInputValue1 >>> 8) & mask; - out[3 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; - out[4 + outOffset] = ((curInputValue2 >>> 16) | (curInputValue3 << 16)) & mask; - out[5 + outOffset] = (curInputValue3 >>> 4) & mask; - out[6 + outOffset] = ((curInputValue3 >>> 24) | (curInputValue4 << 8)) & mask; - out[7 + outOffset] = curInputValue4 >>> 12; - out[8 + outOffset] = curInputValue5 & mask; - out[9 + outOffset] = ((curInputValue5 >>> 20) | (curInputValue6 << 12)) & mask; - out[10 + outOffset] = (curInputValue6 >>> 8) & mask; - out[11 + outOffset] = ((curInputValue6 >>> 28) | (curInputValue7 << 4)) & mask; - out[12 + outOffset] = ((curInputValue7 >>> 16) | (curInputValue8 << 16)) & mask; - out[13 + outOffset] = (curInputValue8 >>> 4) & mask; - out[14 + outOffset] = ((curInputValue8 >>> 24) | (curInputValue9 << 8)) & mask; - out[15 + outOffset] = curInputValue9 >>> 12; - out[16 + outOffset] = curInputValue10 & mask; - out[17 + outOffset] = ((curInputValue10 >>> 20) | (curInputValue11 << 12)) & mask; - out[18 + outOffset] = (curInputValue11 >>> 8) & mask; - out[19 + outOffset] = ((curInputValue11 >>> 28) | (curInputValue12 << 4)) & mask; - out[20 + outOffset] = ((curInputValue12 >>> 16) | (curInputValue13 << 16)) & mask; - out[21 + outOffset] = (curInputValue13 >>> 4) & mask; - out[22 + outOffset] = ((curInputValue13 >>> 24) | (curInputValue14 << 8)) & mask; - out[23 + outOffset] = curInputValue14 >>> 12; - out[24 + outOffset] = curInputValue15 & mask; - out[25 + outOffset] = ((curInputValue15 >>> 20) | (curInputValue16 << 12)) & mask; - out[26 + outOffset] = (curInputValue16 >>> 8) & mask; - out[27 + outOffset] = ((curInputValue16 >>> 28) | (curInputValue17 << 4)) & mask; - out[28 + outOffset] = ((curInputValue17 >>> 16) | (curInputValue18 << 16)) & mask; - out[29 + outOffset] = (curInputValue18 >>> 4) & mask; - out[30 + outOffset] = ((curInputValue18 >>> 24) | (curInputValue19 << 8)) & mask; - out[31 + outOffset] = curInputValue19 >>> 12; - outOffset += 32; + static private void unpack20(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 1048575; + for (i = 0, w = 1; i < 4; ++i, w += 20) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + int curInputValue2 = in[w + 2]; + int curInputValue3 = in[w + 3]; + int curInputValue4 = in[w + 4]; + int curInputValue5 = in[w + 5]; + int curInputValue6 = in[w + 6]; + int curInputValue7 = in[w + 7]; + int curInputValue8 = in[w + 8]; + int curInputValue9 = in[w + 9]; + int curInputValue10 = in[w + 10]; + int curInputValue11 = in[w + 11]; + int curInputValue12 = in[w + 12]; + int curInputValue13 = in[w + 13]; + int curInputValue14 = in[w + 14]; + int curInputValue15 = in[w + 15]; + int curInputValue16 = in[w + 16]; + int curInputValue17 = in[w + 17]; + int curInputValue18 = in[w + 18]; + int curInputValue19 = in[w + 19]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = ((curInputValue0 >>> 20) | (curInputValue1 << 12)) + & mask; + out[2 + outOffset] = (curInputValue1 >>> 8) & mask; + out[3 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) + & mask; + out[4 + outOffset] = ((curInputValue2 >>> 16) | (curInputValue3 << 16)) + & mask; + out[5 + outOffset] = (curInputValue3 >>> 4) & mask; + out[6 + outOffset] = ((curInputValue3 >>> 24) | (curInputValue4 << 8)) + & mask; + out[7 + outOffset] = curInputValue4 >>> 12; + out[8 + outOffset] = curInputValue5 & mask; + out[9 + outOffset] = ((curInputValue5 >>> 20) | (curInputValue6 << 12)) + & mask; + out[10 + outOffset] = (curInputValue6 >>> 8) & mask; + out[11 + outOffset] = ((curInputValue6 >>> 28) | (curInputValue7 << 4)) + & mask; + out[12 + outOffset] = ((curInputValue7 >>> 16) | (curInputValue8 << 16)) + & mask; + out[13 + outOffset] = (curInputValue8 >>> 4) & mask; + out[14 + outOffset] = ((curInputValue8 >>> 24) | (curInputValue9 << 8)) + & mask; + out[15 + outOffset] = curInputValue9 >>> 12; + out[16 + outOffset] = curInputValue10 & mask; + out[17 + outOffset] = ((curInputValue10 >>> 20) | (curInputValue11 << 12)) + & mask; + out[18 + outOffset] = (curInputValue11 >>> 8) & mask; + out[19 + outOffset] = ((curInputValue11 >>> 28) | (curInputValue12 << 4)) + & mask; + out[20 + outOffset] = ((curInputValue12 >>> 16) | (curInputValue13 << 16)) + & mask; + out[21 + outOffset] = (curInputValue13 >>> 4) & mask; + out[22 + outOffset] = ((curInputValue13 >>> 24) | (curInputValue14 << 8)) + & mask; + out[23 + outOffset] = curInputValue14 >>> 12; + out[24 + outOffset] = curInputValue15 & mask; + out[25 + outOffset] = ((curInputValue15 >>> 20) | (curInputValue16 << 12)) + & mask; + out[26 + outOffset] = (curInputValue16 >>> 8) & mask; + out[27 + outOffset] = ((curInputValue16 >>> 28) | (curInputValue17 << 4)) + & mask; + out[28 + outOffset] = ((curInputValue17 >>> 16) | (curInputValue18 << 16)) + & mask; + out[29 + outOffset] = (curInputValue18 >>> 4) & mask; + out[30 + outOffset] = ((curInputValue18 >>> 24) | (curInputValue19 << 8)) + & mask; + out[31 + outOffset] = curInputValue19 >>> 12; + outOffset += 32; + } } - } - static private void unpack28(int[] out, int[] in) { - int i, w; - int outOffset = 0; - final int mask = 268435455; - for (i = 0, w = 1; i < 4; ++i, w += 28) { - int curInputValue0 = in[w]; - int curInputValue1 = in[w + 1]; - int curInputValue2 = in[w + 2]; - int curInputValue3 = in[w + 3]; - int curInputValue4 = in[w + 4]; - int curInputValue5 = in[w + 5]; - int curInputValue6 = in[w + 6]; - int curInputValue7 = in[w + 7]; - int curInputValue8 = in[w + 8]; - int curInputValue9 = in[w + 9]; - int curInputValue10 = in[w + 10]; - int curInputValue11 = in[w + 11]; - int curInputValue12 = in[w + 12]; - int curInputValue13 = in[w + 13]; - int curInputValue14 = in[w + 14]; - int curInputValue15 = in[w + 15]; - int curInputValue16 = in[w + 16]; - int curInputValue17 = in[w + 17]; - int curInputValue18 = in[w + 18]; - int curInputValue19 = in[w + 19]; - int curInputValue20 = in[w + 20]; - int curInputValue21 = in[w + 21]; - int curInputValue22 = in[w + 22]; - int curInputValue23 = in[w + 23]; - int curInputValue24 = in[w + 24]; - int curInputValue25 = in[w + 25]; - int curInputValue26 = in[w + 26]; - int curInputValue27 = in[w + 27]; - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = ((curInputValue0 >>> 28) | (curInputValue1 << 4)) & mask; - out[2 + outOffset] = ((curInputValue1 >>> 24) | (curInputValue2 << 8)) & mask; - out[3 + outOffset] = ((curInputValue2 >>> 20) | (curInputValue3 << 12)) & mask; - out[4 + outOffset] = ((curInputValue3 >>> 16) | (curInputValue4 << 16)) & mask; - out[5 + outOffset] = ((curInputValue4 >>> 12) | (curInputValue5 << 20)) & mask; - out[6 + outOffset] = ((curInputValue5 >>> 8) | (curInputValue6 << 24)) & mask; - out[7 + outOffset] = curInputValue6 >>> 4; - out[8 + outOffset] = curInputValue7 & mask; - out[9 + outOffset] = ((curInputValue7 >>> 28) | (curInputValue8 << 4)) & mask; - out[10 + outOffset] = ((curInputValue8 >>> 24) | (curInputValue9 << 8)) & mask; - out[11 + outOffset] = ((curInputValue9 >>> 20) | (curInputValue10 << 12)) & mask; - out[12 + outOffset] = ((curInputValue10 >>> 16) | (curInputValue11 << 16)) & mask; - out[13 + outOffset] = ((curInputValue11 >>> 12) | (curInputValue12 << 20)) & mask; - out[14 + outOffset] = ((curInputValue12 >>> 8) | (curInputValue13 << 24)) & mask; - out[15 + outOffset] = curInputValue13 >>> 4; - out[16 + outOffset] = curInputValue14 & mask; - out[17 + outOffset] = ((curInputValue14 >>> 28) | (curInputValue15 << 4)) & mask; - out[18 + outOffset] = ((curInputValue15 >>> 24) | (curInputValue16 << 8)) & mask; - out[19 + outOffset] = ((curInputValue16 >>> 20) | (curInputValue17 << 12)) & mask; - out[20 + outOffset] = ((curInputValue17 >>> 16) | (curInputValue18 << 16)) & mask; - out[21 + outOffset] = ((curInputValue18 >>> 12) | (curInputValue19 << 20)) & mask; - out[22 + outOffset] = ((curInputValue19 >>> 8) | (curInputValue20 << 24)) & mask; - out[23 + outOffset] = curInputValue20 >>> 4; - out[24 + outOffset] = curInputValue21 & mask; - out[25 + outOffset] = ((curInputValue21 >>> 28) | (curInputValue22 << 4)) & mask; - out[26 + outOffset] = ((curInputValue22 >>> 24) | (curInputValue23 << 8)) & mask; - out[27 + outOffset] = ((curInputValue23 >>> 20) | (curInputValue24 << 12)) & mask; - out[28 + outOffset] = ((curInputValue24 >>> 16) | (curInputValue25 << 16)) & mask; - out[29 + outOffset] = ((curInputValue25 >>> 12) | (curInputValue26 << 20)) & mask; - out[30 + outOffset] = ((curInputValue26 >>> 8) | (curInputValue27 << 24)) & mask; - out[31 + outOffset] = curInputValue27 >>> 4; - outOffset += 32; + static private void unpack28(int[] out, int[] in) { + int i, w; + int outOffset = 0; + final int mask = 268435455; + for (i = 0, w = 1; i < 4; ++i, w += 28) { + int curInputValue0 = in[w]; + int curInputValue1 = in[w + 1]; + int curInputValue2 = in[w + 2]; + int curInputValue3 = in[w + 3]; + int curInputValue4 = in[w + 4]; + int curInputValue5 = in[w + 5]; + int curInputValue6 = in[w + 6]; + int curInputValue7 = in[w + 7]; + int curInputValue8 = in[w + 8]; + int curInputValue9 = in[w + 9]; + int curInputValue10 = in[w + 10]; + int curInputValue11 = in[w + 11]; + int curInputValue12 = in[w + 12]; + int curInputValue13 = in[w + 13]; + int curInputValue14 = in[w + 14]; + int curInputValue15 = in[w + 15]; + int curInputValue16 = in[w + 16]; + int curInputValue17 = in[w + 17]; + int curInputValue18 = in[w + 18]; + int curInputValue19 = in[w + 19]; + int curInputValue20 = in[w + 20]; + int curInputValue21 = in[w + 21]; + int curInputValue22 = in[w + 22]; + int curInputValue23 = in[w + 23]; + int curInputValue24 = in[w + 24]; + int curInputValue25 = in[w + 25]; + int curInputValue26 = in[w + 26]; + int curInputValue27 = in[w + 27]; + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = ((curInputValue0 >>> 28) | (curInputValue1 << 4)) + & mask; + out[2 + outOffset] = ((curInputValue1 >>> 24) | (curInputValue2 << 8)) + & mask; + out[3 + outOffset] = ((curInputValue2 >>> 20) | (curInputValue3 << 12)) + & mask; + out[4 + outOffset] = ((curInputValue3 >>> 16) | (curInputValue4 << 16)) + & mask; + out[5 + outOffset] = ((curInputValue4 >>> 12) | (curInputValue5 << 20)) + & mask; + out[6 + outOffset] = ((curInputValue5 >>> 8) | (curInputValue6 << 24)) + & mask; + out[7 + outOffset] = curInputValue6 >>> 4; + out[8 + outOffset] = curInputValue7 & mask; + out[9 + outOffset] = ((curInputValue7 >>> 28) | (curInputValue8 << 4)) + & mask; + out[10 + outOffset] = ((curInputValue8 >>> 24) | (curInputValue9 << 8)) + & mask; + out[11 + outOffset] = ((curInputValue9 >>> 20) | (curInputValue10 << 12)) + & mask; + out[12 + outOffset] = ((curInputValue10 >>> 16) | (curInputValue11 << 16)) + & mask; + out[13 + outOffset] = ((curInputValue11 >>> 12) | (curInputValue12 << 20)) + & mask; + out[14 + outOffset] = ((curInputValue12 >>> 8) | (curInputValue13 << 24)) + & mask; + out[15 + outOffset] = curInputValue13 >>> 4; + out[16 + outOffset] = curInputValue14 & mask; + out[17 + outOffset] = ((curInputValue14 >>> 28) | (curInputValue15 << 4)) + & mask; + out[18 + outOffset] = ((curInputValue15 >>> 24) | (curInputValue16 << 8)) + & mask; + out[19 + outOffset] = ((curInputValue16 >>> 20) | (curInputValue17 << 12)) + & mask; + out[20 + outOffset] = ((curInputValue17 >>> 16) | (curInputValue18 << 16)) + & mask; + out[21 + outOffset] = ((curInputValue18 >>> 12) | (curInputValue19 << 20)) + & mask; + out[22 + outOffset] = ((curInputValue19 >>> 8) | (curInputValue20 << 24)) + & mask; + out[23 + outOffset] = curInputValue20 >>> 4; + out[24 + outOffset] = curInputValue21 & mask; + out[25 + outOffset] = ((curInputValue21 >>> 28) | (curInputValue22 << 4)) + & mask; + out[26 + outOffset] = ((curInputValue22 >>> 24) | (curInputValue23 << 8)) + & mask; + out[27 + outOffset] = ((curInputValue23 >>> 20) | (curInputValue24 << 12)) + & mask; + out[28 + outOffset] = ((curInputValue24 >>> 16) | (curInputValue25 << 16)) + & mask; + out[29 + outOffset] = ((curInputValue25 >>> 12) | (curInputValue26 << 20)) + & mask; + out[30 + outOffset] = ((curInputValue26 >>> 8) | (curInputValue27 << 24)) + & mask; + out[31 + outOffset] = curInputValue27 >>> 4; + outOffset += 32; + } } - } } diff --git a/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128WIthIntBuffer.java b/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128WIthIntBuffer.java index 1d1cebb..5596517 100644 --- a/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128WIthIntBuffer.java +++ b/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128WIthIntBuffer.java @@ -1,6 +1,5 @@ package com.kamikaze.pfordelta; - /** * This is a version of the kamikaze PForDelta library that * was slightly cleaned up by D. Lemire. It is included in the @@ -10,864 +9,967 @@ import java.nio.IntBuffer; /** - * PForDeltaUnpack128WIthIntBuffer is almost the same as PForDeltaUnpack128, except that it use IntBuffer as input instead of int[]. + * PForDeltaUnpack128WIthIntBuffer is almost the same as PForDeltaUnpack128, + * except that it use IntBuffer as input instead of int[]. */ @SuppressWarnings("javadoc") public class PForDeltaUnpack128WIthIntBuffer { - static public void unpack(int[] out, IntBuffer in, int bits) { - switch (bits) { - case 0: - unpack0(out, in); - break; - case 1: - unpack1(out, in); - break; - case 2: - unpack2(out, in); - break; - case 3: - unpack3(out, in); - break; - case 4: - unpack4(out, in); - break; - case 5: - unpack5(out, in); - break; - case 6: - unpack6(out, in); - break; - case 7: - unpack7(out, in); - break; - case 8: - unpack8(out, in); - break; - case 9: - unpack9(out, in); - break; - case 10: - unpack10(out, in); - break; - case 11: - unpack11(out, in); - break; - case 12: - unpack12(out, in); - break; - case 13: - unpack13(out, in); - break; - case 16: - unpack16(out, in); - break; - case 20: - unpack20(out, in); - break; - case 28: - unpack28(out, in); - break; - default: - break; + static public void unpack(int[] out, IntBuffer in, int bits) { + switch (bits) { + case 0: + unpack0(out, in); + break; + case 1: + unpack1(out, in); + break; + case 2: + unpack2(out, in); + break; + case 3: + unpack3(out, in); + break; + case 4: + unpack4(out, in); + break; + case 5: + unpack5(out, in); + break; + case 6: + unpack6(out, in); + break; + case 7: + unpack7(out, in); + break; + case 8: + unpack8(out, in); + break; + case 9: + unpack9(out, in); + break; + case 10: + unpack10(out, in); + break; + case 11: + unpack11(out, in); + break; + case 12: + unpack12(out, in); + break; + case 13: + unpack13(out, in); + break; + case 16: + unpack16(out, in); + break; + case 20: + unpack20(out, in); + break; + case 28: + unpack28(out, in); + break; + default: + break; + } } - } - static private void unpack0(int[] out, IntBuffer in) { - } + static private void unpack0(int[] out, IntBuffer in) { + } - static private void unpack1(int[] out, IntBuffer in) { - int outOffset = 0; - final int mask = 1; - for (int i = 0; i < 4; ++i) { - int curInputValue0 = in.get(); - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = (curInputValue0 >>> 1) & mask; - out[2 + outOffset] = (curInputValue0 >>> 2) & mask; - out[3 + outOffset] = (curInputValue0 >>> 3) & mask; - out[4 + outOffset] = (curInputValue0 >>> 4) & mask; - out[5 + outOffset] = (curInputValue0 >>> 5) & mask; - out[6 + outOffset] = (curInputValue0 >>> 6) & mask; - out[7 + outOffset] = (curInputValue0 >>> 7) & mask; - out[8 + outOffset] = (curInputValue0 >>> 8) & mask; - out[9 + outOffset] = (curInputValue0 >>> 9) & mask; - out[10 + outOffset] = (curInputValue0 >>> 10) & mask; - out[11 + outOffset] = (curInputValue0 >>> 11) & mask; - out[12 + outOffset] = (curInputValue0 >>> 12) & mask; - out[13 + outOffset] = (curInputValue0 >>> 13) & mask; - out[14 + outOffset] = (curInputValue0 >>> 14) & mask; - out[15 + outOffset] = (curInputValue0 >>> 15) & mask; - out[16 + outOffset] = (curInputValue0 >>> 16) & mask; - out[17 + outOffset] = (curInputValue0 >>> 17) & mask; - out[18 + outOffset] = (curInputValue0 >>> 18) & mask; - out[19 + outOffset] = (curInputValue0 >>> 19) & mask; - out[20 + outOffset] = (curInputValue0 >>> 20) & mask; - out[21 + outOffset] = (curInputValue0 >>> 21) & mask; - out[22 + outOffset] = (curInputValue0 >>> 22) & mask; - out[23 + outOffset] = (curInputValue0 >>> 23) & mask; - out[24 + outOffset] = (curInputValue0 >>> 24) & mask; - out[25 + outOffset] = (curInputValue0 >>> 25) & mask; - out[26 + outOffset] = (curInputValue0 >>> 26) & mask; - out[27 + outOffset] = (curInputValue0 >>> 27) & mask; - out[28 + outOffset] = (curInputValue0 >>> 28) & mask; - out[29 + outOffset] = (curInputValue0 >>> 29) & mask; - out[30 + outOffset] = (curInputValue0 >>> 30) & mask; - out[31 + outOffset] = curInputValue0 >>> 31; - outOffset += 32; + static private void unpack1(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 1; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 1) & mask; + out[2 + outOffset] = (curInputValue0 >>> 2) & mask; + out[3 + outOffset] = (curInputValue0 >>> 3) & mask; + out[4 + outOffset] = (curInputValue0 >>> 4) & mask; + out[5 + outOffset] = (curInputValue0 >>> 5) & mask; + out[6 + outOffset] = (curInputValue0 >>> 6) & mask; + out[7 + outOffset] = (curInputValue0 >>> 7) & mask; + out[8 + outOffset] = (curInputValue0 >>> 8) & mask; + out[9 + outOffset] = (curInputValue0 >>> 9) & mask; + out[10 + outOffset] = (curInputValue0 >>> 10) & mask; + out[11 + outOffset] = (curInputValue0 >>> 11) & mask; + out[12 + outOffset] = (curInputValue0 >>> 12) & mask; + out[13 + outOffset] = (curInputValue0 >>> 13) & mask; + out[14 + outOffset] = (curInputValue0 >>> 14) & mask; + out[15 + outOffset] = (curInputValue0 >>> 15) & mask; + out[16 + outOffset] = (curInputValue0 >>> 16) & mask; + out[17 + outOffset] = (curInputValue0 >>> 17) & mask; + out[18 + outOffset] = (curInputValue0 >>> 18) & mask; + out[19 + outOffset] = (curInputValue0 >>> 19) & mask; + out[20 + outOffset] = (curInputValue0 >>> 20) & mask; + out[21 + outOffset] = (curInputValue0 >>> 21) & mask; + out[22 + outOffset] = (curInputValue0 >>> 22) & mask; + out[23 + outOffset] = (curInputValue0 >>> 23) & mask; + out[24 + outOffset] = (curInputValue0 >>> 24) & mask; + out[25 + outOffset] = (curInputValue0 >>> 25) & mask; + out[26 + outOffset] = (curInputValue0 >>> 26) & mask; + out[27 + outOffset] = (curInputValue0 >>> 27) & mask; + out[28 + outOffset] = (curInputValue0 >>> 28) & mask; + out[29 + outOffset] = (curInputValue0 >>> 29) & mask; + out[30 + outOffset] = (curInputValue0 >>> 30) & mask; + out[31 + outOffset] = curInputValue0 >>> 31; + outOffset += 32; + } } - } - static private void unpack2(int[] out, IntBuffer in) { - int outOffset = 0; - final int mask = 3; - for (int i = 0; i < 4; ++i) { - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = (curInputValue0 >>> 2) & mask; - out[2 + outOffset] = (curInputValue0 >>> 4) & mask; - out[3 + outOffset] = (curInputValue0 >>> 6) & mask; - out[4 + outOffset] = (curInputValue0 >>> 8) & mask; - out[5 + outOffset] = (curInputValue0 >>> 10) & mask; - out[6 + outOffset] = (curInputValue0 >>> 12) & mask; - out[7 + outOffset] = (curInputValue0 >>> 14) & mask; - out[8 + outOffset] = (curInputValue0 >>> 16) & mask; - out[9 + outOffset] = (curInputValue0 >>> 18) & mask; - out[10 + outOffset] = (curInputValue0 >>> 20) & mask; - out[11 + outOffset] = (curInputValue0 >>> 22) & mask; - out[12 + outOffset] = (curInputValue0 >>> 24) & mask; - out[13 + outOffset] = (curInputValue0 >>> 26) & mask; - out[14 + outOffset] = (curInputValue0 >>> 28) & mask; - out[15 + outOffset] = curInputValue0 >>> 30; - out[16 + outOffset] = curInputValue1 & mask; - out[17 + outOffset] = (curInputValue1 >>> 2) & mask; - out[18 + outOffset] = (curInputValue1 >>> 4) & mask; - out[19 + outOffset] = (curInputValue1 >>> 6) & mask; - out[20 + outOffset] = (curInputValue1 >>> 8) & mask; - out[21 + outOffset] = (curInputValue1 >>> 10) & mask; - out[22 + outOffset] = (curInputValue1 >>> 12) & mask; - out[23 + outOffset] = (curInputValue1 >>> 14) & mask; - out[24 + outOffset] = (curInputValue1 >>> 16) & mask; - out[25 + outOffset] = (curInputValue1 >>> 18) & mask; - out[26 + outOffset] = (curInputValue1 >>> 20) & mask; - out[27 + outOffset] = (curInputValue1 >>> 22) & mask; - out[28 + outOffset] = (curInputValue1 >>> 24) & mask; - out[29 + outOffset] = (curInputValue1 >>> 26) & mask; - out[30 + outOffset] = (curInputValue1 >>> 28) & mask; - out[31 + outOffset] = curInputValue1 >>> 30; - outOffset += 32; + static private void unpack2(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 3; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 2) & mask; + out[2 + outOffset] = (curInputValue0 >>> 4) & mask; + out[3 + outOffset] = (curInputValue0 >>> 6) & mask; + out[4 + outOffset] = (curInputValue0 >>> 8) & mask; + out[5 + outOffset] = (curInputValue0 >>> 10) & mask; + out[6 + outOffset] = (curInputValue0 >>> 12) & mask; + out[7 + outOffset] = (curInputValue0 >>> 14) & mask; + out[8 + outOffset] = (curInputValue0 >>> 16) & mask; + out[9 + outOffset] = (curInputValue0 >>> 18) & mask; + out[10 + outOffset] = (curInputValue0 >>> 20) & mask; + out[11 + outOffset] = (curInputValue0 >>> 22) & mask; + out[12 + outOffset] = (curInputValue0 >>> 24) & mask; + out[13 + outOffset] = (curInputValue0 >>> 26) & mask; + out[14 + outOffset] = (curInputValue0 >>> 28) & mask; + out[15 + outOffset] = curInputValue0 >>> 30; + out[16 + outOffset] = curInputValue1 & mask; + out[17 + outOffset] = (curInputValue1 >>> 2) & mask; + out[18 + outOffset] = (curInputValue1 >>> 4) & mask; + out[19 + outOffset] = (curInputValue1 >>> 6) & mask; + out[20 + outOffset] = (curInputValue1 >>> 8) & mask; + out[21 + outOffset] = (curInputValue1 >>> 10) & mask; + out[22 + outOffset] = (curInputValue1 >>> 12) & mask; + out[23 + outOffset] = (curInputValue1 >>> 14) & mask; + out[24 + outOffset] = (curInputValue1 >>> 16) & mask; + out[25 + outOffset] = (curInputValue1 >>> 18) & mask; + out[26 + outOffset] = (curInputValue1 >>> 20) & mask; + out[27 + outOffset] = (curInputValue1 >>> 22) & mask; + out[28 + outOffset] = (curInputValue1 >>> 24) & mask; + out[29 + outOffset] = (curInputValue1 >>> 26) & mask; + out[30 + outOffset] = (curInputValue1 >>> 28) & mask; + out[31 + outOffset] = curInputValue1 >>> 30; + outOffset += 32; + } } - } - static private void unpack3(int[] out, IntBuffer in) { - int outOffset = 0; - final int mask = 7; - for (int i = 0; i < 4; ++i) { - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - int curInputValue2 = in.get(); - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = (curInputValue0 >>> 3) & mask; - out[2 + outOffset] = (curInputValue0 >>> 6) & mask; - out[3 + outOffset] = (curInputValue0 >>> 9) & mask; - out[4 + outOffset] = (curInputValue0 >>> 12) & mask; - out[5 + outOffset] = (curInputValue0 >>> 15) & mask; - out[6 + outOffset] = (curInputValue0 >>> 18) & mask; - out[7 + outOffset] = (curInputValue0 >>> 21) & mask; - out[8 + outOffset] = (curInputValue0 >>> 24) & mask; - out[9 + outOffset] = (curInputValue0 >>> 27) & mask; - out[10 + outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) & mask; - out[11 + outOffset] = (curInputValue1 >>> 1) & mask; - out[12 + outOffset] = (curInputValue1 >>> 4) & mask; - out[13 + outOffset] = (curInputValue1 >>> 7) & mask; - out[14 + outOffset] = (curInputValue1 >>> 10) & mask; - out[15 + outOffset] = (curInputValue1 >>> 13) & mask; - out[16 + outOffset] = (curInputValue1 >>> 16) & mask; - out[17 + outOffset] = (curInputValue1 >>> 19) & mask; - out[18 + outOffset] = (curInputValue1 >>> 22) & mask; - out[19 + outOffset] = (curInputValue1 >>> 25) & mask; - out[20 + outOffset] = (curInputValue1 >>> 28) & mask; - out[21 + outOffset] = ((curInputValue1 >>> 31) | (curInputValue2 << 1)) & mask; - out[22 + outOffset] = (curInputValue2 >>> 2) & mask; - out[23 + outOffset] = (curInputValue2 >>> 5) & mask; - out[24 + outOffset] = (curInputValue2 >>> 8) & mask; - out[25 + outOffset] = (curInputValue2 >>> 11) & mask; - out[26 + outOffset] = (curInputValue2 >>> 14) & mask; - out[27 + outOffset] = (curInputValue2 >>> 17) & mask; - out[28 + outOffset] = (curInputValue2 >>> 20) & mask; - out[29 + outOffset] = (curInputValue2 >>> 23) & mask; - out[30 + outOffset] = (curInputValue2 >>> 26) & mask; - out[31 + outOffset] = curInputValue2 >>> 29; - outOffset += 32; + static private void unpack3(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 7; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + int curInputValue2 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 3) & mask; + out[2 + outOffset] = (curInputValue0 >>> 6) & mask; + out[3 + outOffset] = (curInputValue0 >>> 9) & mask; + out[4 + outOffset] = (curInputValue0 >>> 12) & mask; + out[5 + outOffset] = (curInputValue0 >>> 15) & mask; + out[6 + outOffset] = (curInputValue0 >>> 18) & mask; + out[7 + outOffset] = (curInputValue0 >>> 21) & mask; + out[8 + outOffset] = (curInputValue0 >>> 24) & mask; + out[9 + outOffset] = (curInputValue0 >>> 27) & mask; + out[10 + outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) + & mask; + out[11 + outOffset] = (curInputValue1 >>> 1) & mask; + out[12 + outOffset] = (curInputValue1 >>> 4) & mask; + out[13 + outOffset] = (curInputValue1 >>> 7) & mask; + out[14 + outOffset] = (curInputValue1 >>> 10) & mask; + out[15 + outOffset] = (curInputValue1 >>> 13) & mask; + out[16 + outOffset] = (curInputValue1 >>> 16) & mask; + out[17 + outOffset] = (curInputValue1 >>> 19) & mask; + out[18 + outOffset] = (curInputValue1 >>> 22) & mask; + out[19 + outOffset] = (curInputValue1 >>> 25) & mask; + out[20 + outOffset] = (curInputValue1 >>> 28) & mask; + out[21 + outOffset] = ((curInputValue1 >>> 31) | (curInputValue2 << 1)) + & mask; + out[22 + outOffset] = (curInputValue2 >>> 2) & mask; + out[23 + outOffset] = (curInputValue2 >>> 5) & mask; + out[24 + outOffset] = (curInputValue2 >>> 8) & mask; + out[25 + outOffset] = (curInputValue2 >>> 11) & mask; + out[26 + outOffset] = (curInputValue2 >>> 14) & mask; + out[27 + outOffset] = (curInputValue2 >>> 17) & mask; + out[28 + outOffset] = (curInputValue2 >>> 20) & mask; + out[29 + outOffset] = (curInputValue2 >>> 23) & mask; + out[30 + outOffset] = (curInputValue2 >>> 26) & mask; + out[31 + outOffset] = curInputValue2 >>> 29; + outOffset += 32; + } } - } - static private void unpack4(int[] out, IntBuffer in) { - int outOffset = 0; - final int mask = 15; - for (int i = 0; i < 4; ++i) { - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - int curInputValue2 = in.get(); - int curInputValue3 = in.get(); - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = (curInputValue0 >>> 4) & mask; - out[2 + outOffset] = (curInputValue0 >>> 8) & mask; - out[3 + outOffset] = (curInputValue0 >>> 12) & mask; - out[4 + outOffset] = (curInputValue0 >>> 16) & mask; - out[5 + outOffset] = (curInputValue0 >>> 20) & mask; - out[6 + outOffset] = (curInputValue0 >>> 24) & mask; - out[7 + outOffset] = curInputValue0 >>> 28; - out[8 + outOffset] = curInputValue1 & mask; - out[9 + outOffset] = (curInputValue1 >>> 4) & mask; - out[10 + outOffset] = (curInputValue1 >>> 8) & mask; - out[11 + outOffset] = (curInputValue1 >>> 12) & mask; - out[12 + outOffset] = (curInputValue1 >>> 16) & mask; - out[13 + outOffset] = (curInputValue1 >>> 20) & mask; - out[14 + outOffset] = (curInputValue1 >>> 24) & mask; - out[15 + outOffset] = curInputValue1 >>> 28; - out[16 + outOffset] = curInputValue2 & mask; - out[17 + outOffset] = (curInputValue2 >>> 4) & mask; - out[18 + outOffset] = (curInputValue2 >>> 8) & mask; - out[19 + outOffset] = (curInputValue2 >>> 12) & mask; - out[20 + outOffset] = (curInputValue2 >>> 16) & mask; - out[21 + outOffset] = (curInputValue2 >>> 20) & mask; - out[22 + outOffset] = (curInputValue2 >>> 24) & mask; - out[23 + outOffset] = curInputValue2 >>> 28; - out[24 + outOffset] = curInputValue3 & mask; - out[25 + outOffset] = (curInputValue3 >>> 4) & mask; - out[26 + outOffset] = (curInputValue3 >>> 8) & mask; - out[27 + outOffset] = (curInputValue3 >>> 12) & mask; - out[28 + outOffset] = (curInputValue3 >>> 16) & mask; - out[29 + outOffset] = (curInputValue3 >>> 20) & mask; - out[30 + outOffset] = (curInputValue3 >>> 24) & mask; - out[31 + outOffset] = curInputValue3 >>> 28; - outOffset += 32; + static private void unpack4(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 15; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + int curInputValue2 = in.get(); + int curInputValue3 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 4) & mask; + out[2 + outOffset] = (curInputValue0 >>> 8) & mask; + out[3 + outOffset] = (curInputValue0 >>> 12) & mask; + out[4 + outOffset] = (curInputValue0 >>> 16) & mask; + out[5 + outOffset] = (curInputValue0 >>> 20) & mask; + out[6 + outOffset] = (curInputValue0 >>> 24) & mask; + out[7 + outOffset] = curInputValue0 >>> 28; + out[8 + outOffset] = curInputValue1 & mask; + out[9 + outOffset] = (curInputValue1 >>> 4) & mask; + out[10 + outOffset] = (curInputValue1 >>> 8) & mask; + out[11 + outOffset] = (curInputValue1 >>> 12) & mask; + out[12 + outOffset] = (curInputValue1 >>> 16) & mask; + out[13 + outOffset] = (curInputValue1 >>> 20) & mask; + out[14 + outOffset] = (curInputValue1 >>> 24) & mask; + out[15 + outOffset] = curInputValue1 >>> 28; + out[16 + outOffset] = curInputValue2 & mask; + out[17 + outOffset] = (curInputValue2 >>> 4) & mask; + out[18 + outOffset] = (curInputValue2 >>> 8) & mask; + out[19 + outOffset] = (curInputValue2 >>> 12) & mask; + out[20 + outOffset] = (curInputValue2 >>> 16) & mask; + out[21 + outOffset] = (curInputValue2 >>> 20) & mask; + out[22 + outOffset] = (curInputValue2 >>> 24) & mask; + out[23 + outOffset] = curInputValue2 >>> 28; + out[24 + outOffset] = curInputValue3 & mask; + out[25 + outOffset] = (curInputValue3 >>> 4) & mask; + out[26 + outOffset] = (curInputValue3 >>> 8) & mask; + out[27 + outOffset] = (curInputValue3 >>> 12) & mask; + out[28 + outOffset] = (curInputValue3 >>> 16) & mask; + out[29 + outOffset] = (curInputValue3 >>> 20) & mask; + out[30 + outOffset] = (curInputValue3 >>> 24) & mask; + out[31 + outOffset] = curInputValue3 >>> 28; + outOffset += 32; + } } - } - static private void unpack5(int[] out, IntBuffer in) { - int outOffset = 0; - final int mask = 31; - for (int i = 0; i < 4; ++i) { - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - int curInputValue2 = in.get(); - int curInputValue3 = in.get(); - int curInputValue4 = in.get(); - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = (curInputValue0 >>> 5) & mask; - out[2 + outOffset] = (curInputValue0 >>> 10) & mask; - out[3 + outOffset] = (curInputValue0 >>> 15) & mask; - out[4 + outOffset] = (curInputValue0 >>> 20) & mask; - out[5 + outOffset] = (curInputValue0 >>> 25) & mask; - out[6 + outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) & mask; - out[7 + outOffset] = (curInputValue1 >>> 3) & mask; - out[8 + outOffset] = (curInputValue1 >>> 8) & mask; - out[9 + outOffset] = (curInputValue1 >>> 13) & mask; - out[10 + outOffset] = (curInputValue1 >>> 18) & mask; - out[11 + outOffset] = (curInputValue1 >>> 23) & mask; - out[12 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; - out[13 + outOffset] = (curInputValue2 >>> 1) & mask; - out[14 + outOffset] = (curInputValue2 >>> 6) & mask; - out[15 + outOffset] = (curInputValue2 >>> 11) & mask; - out[16 + outOffset] = (curInputValue2 >>> 16) & mask; - out[17 + outOffset] = (curInputValue2 >>> 21) & mask; - out[18 + outOffset] = (curInputValue2 >>> 26) & mask; - out[19 + outOffset] = ((curInputValue2 >>> 31) | (curInputValue3 << 1)) & mask; - out[20 + outOffset] = (curInputValue3 >>> 4) & mask; - out[21 + outOffset] = (curInputValue3 >>> 9) & mask; - out[22 + outOffset] = (curInputValue3 >>> 14) & mask; - out[23 + outOffset] = (curInputValue3 >>> 19) & mask; - out[24 + outOffset] = (curInputValue3 >>> 24) & mask; - out[25 + outOffset] = ((curInputValue3 >>> 29) | (curInputValue4 << 3)) & mask; - out[26 + outOffset] = (curInputValue4 >>> 2) & mask; - out[27 + outOffset] = (curInputValue4 >>> 7) & mask; - out[28 + outOffset] = (curInputValue4 >>> 12) & mask; - out[29 + outOffset] = (curInputValue4 >>> 17) & mask; - out[30 + outOffset] = (curInputValue4 >>> 22) & mask; - out[31 + outOffset] = curInputValue4 >>> 27; - outOffset += 32; + static private void unpack5(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 31; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + int curInputValue2 = in.get(); + int curInputValue3 = in.get(); + int curInputValue4 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 5) & mask; + out[2 + outOffset] = (curInputValue0 >>> 10) & mask; + out[3 + outOffset] = (curInputValue0 >>> 15) & mask; + out[4 + outOffset] = (curInputValue0 >>> 20) & mask; + out[5 + outOffset] = (curInputValue0 >>> 25) & mask; + out[6 + outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) + & mask; + out[7 + outOffset] = (curInputValue1 >>> 3) & mask; + out[8 + outOffset] = (curInputValue1 >>> 8) & mask; + out[9 + outOffset] = (curInputValue1 >>> 13) & mask; + out[10 + outOffset] = (curInputValue1 >>> 18) & mask; + out[11 + outOffset] = (curInputValue1 >>> 23) & mask; + out[12 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) + & mask; + out[13 + outOffset] = (curInputValue2 >>> 1) & mask; + out[14 + outOffset] = (curInputValue2 >>> 6) & mask; + out[15 + outOffset] = (curInputValue2 >>> 11) & mask; + out[16 + outOffset] = (curInputValue2 >>> 16) & mask; + out[17 + outOffset] = (curInputValue2 >>> 21) & mask; + out[18 + outOffset] = (curInputValue2 >>> 26) & mask; + out[19 + outOffset] = ((curInputValue2 >>> 31) | (curInputValue3 << 1)) + & mask; + out[20 + outOffset] = (curInputValue3 >>> 4) & mask; + out[21 + outOffset] = (curInputValue3 >>> 9) & mask; + out[22 + outOffset] = (curInputValue3 >>> 14) & mask; + out[23 + outOffset] = (curInputValue3 >>> 19) & mask; + out[24 + outOffset] = (curInputValue3 >>> 24) & mask; + out[25 + outOffset] = ((curInputValue3 >>> 29) | (curInputValue4 << 3)) + & mask; + out[26 + outOffset] = (curInputValue4 >>> 2) & mask; + out[27 + outOffset] = (curInputValue4 >>> 7) & mask; + out[28 + outOffset] = (curInputValue4 >>> 12) & mask; + out[29 + outOffset] = (curInputValue4 >>> 17) & mask; + out[30 + outOffset] = (curInputValue4 >>> 22) & mask; + out[31 + outOffset] = curInputValue4 >>> 27; + outOffset += 32; + } } - } - static private void unpack6(int[] out, IntBuffer in) { - int outOffset = 0; - final int mask = 63; - for (int i = 0; i < 4; ++i) { - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - int curInputValue2 = in.get(); - int curInputValue3 = in.get(); - int curInputValue4 = in.get(); - int curInputValue5 = in.get(); - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = (curInputValue0 >>> 6) & mask; - out[2 + outOffset] = (curInputValue0 >>> 12) & mask; - out[3 + outOffset] = (curInputValue0 >>> 18) & mask; - out[4 + outOffset] = (curInputValue0 >>> 24) & mask; - out[5 + outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) & mask; - out[6 + outOffset] = (curInputValue1 >>> 4) & mask; - out[7 + outOffset] = (curInputValue1 >>> 10) & mask; - out[8 + outOffset] = (curInputValue1 >>> 16) & mask; - out[9 + outOffset] = (curInputValue1 >>> 22) & mask; - out[10 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; - out[11 + outOffset] = (curInputValue2 >>> 2) & mask; - out[12 + outOffset] = (curInputValue2 >>> 8) & mask; - out[13 + outOffset] = (curInputValue2 >>> 14) & mask; - out[14 + outOffset] = (curInputValue2 >>> 20) & mask; - out[15 + outOffset] = curInputValue2 >>> 26; - out[16 + outOffset] = curInputValue3 & mask; - out[17 + outOffset] = (curInputValue3 >>> 6) & mask; - out[18 + outOffset] = (curInputValue3 >>> 12) & mask; - out[19 + outOffset] = (curInputValue3 >>> 18) & mask; - out[20 + outOffset] = (curInputValue3 >>> 24) & mask; - out[21 + outOffset] = ((curInputValue3 >>> 30) | (curInputValue4 << 2)) & mask; - out[22 + outOffset] = (curInputValue4 >>> 4) & mask; - out[23 + outOffset] = (curInputValue4 >>> 10) & mask; - out[24 + outOffset] = (curInputValue4 >>> 16) & mask; - out[25 + outOffset] = (curInputValue4 >>> 22) & mask; - out[26 + outOffset] = ((curInputValue4 >>> 28) | (curInputValue5 << 4)) & mask; - out[27 + outOffset] = (curInputValue5 >>> 2) & mask; - out[28 + outOffset] = (curInputValue5 >>> 8) & mask; - out[29 + outOffset] = (curInputValue5 >>> 14) & mask; - out[30 + outOffset] = (curInputValue5 >>> 20) & mask; - out[31 + outOffset] = curInputValue5 >>> 26; - outOffset += 32; + static private void unpack6(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 63; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + int curInputValue2 = in.get(); + int curInputValue3 = in.get(); + int curInputValue4 = in.get(); + int curInputValue5 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 6) & mask; + out[2 + outOffset] = (curInputValue0 >>> 12) & mask; + out[3 + outOffset] = (curInputValue0 >>> 18) & mask; + out[4 + outOffset] = (curInputValue0 >>> 24) & mask; + out[5 + outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) + & mask; + out[6 + outOffset] = (curInputValue1 >>> 4) & mask; + out[7 + outOffset] = (curInputValue1 >>> 10) & mask; + out[8 + outOffset] = (curInputValue1 >>> 16) & mask; + out[9 + outOffset] = (curInputValue1 >>> 22) & mask; + out[10 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) + & mask; + out[11 + outOffset] = (curInputValue2 >>> 2) & mask; + out[12 + outOffset] = (curInputValue2 >>> 8) & mask; + out[13 + outOffset] = (curInputValue2 >>> 14) & mask; + out[14 + outOffset] = (curInputValue2 >>> 20) & mask; + out[15 + outOffset] = curInputValue2 >>> 26; + out[16 + outOffset] = curInputValue3 & mask; + out[17 + outOffset] = (curInputValue3 >>> 6) & mask; + out[18 + outOffset] = (curInputValue3 >>> 12) & mask; + out[19 + outOffset] = (curInputValue3 >>> 18) & mask; + out[20 + outOffset] = (curInputValue3 >>> 24) & mask; + out[21 + outOffset] = ((curInputValue3 >>> 30) | (curInputValue4 << 2)) + & mask; + out[22 + outOffset] = (curInputValue4 >>> 4) & mask; + out[23 + outOffset] = (curInputValue4 >>> 10) & mask; + out[24 + outOffset] = (curInputValue4 >>> 16) & mask; + out[25 + outOffset] = (curInputValue4 >>> 22) & mask; + out[26 + outOffset] = ((curInputValue4 >>> 28) | (curInputValue5 << 4)) + & mask; + out[27 + outOffset] = (curInputValue5 >>> 2) & mask; + out[28 + outOffset] = (curInputValue5 >>> 8) & mask; + out[29 + outOffset] = (curInputValue5 >>> 14) & mask; + out[30 + outOffset] = (curInputValue5 >>> 20) & mask; + out[31 + outOffset] = curInputValue5 >>> 26; + outOffset += 32; + } } - } - static private void unpack7(int[] out, IntBuffer in) { - int outOffset = 0; - final int mask = 127; - for (int i = 0; i < 4; ++i) { - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - int curInputValue2 = in.get(); - int curInputValue3 = in.get(); - int curInputValue4 = in.get(); - int curInputValue5 = in.get(); - int curInputValue6 = in.get(); - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = (curInputValue0 >>> 7) & mask; - out[2 + outOffset] = (curInputValue0 >>> 14) & mask; - out[3 + outOffset] = (curInputValue0 >>> 21) & mask; - out[4 + outOffset] = ((curInputValue0 >>> 28) | (curInputValue1 << 4)) & mask; - out[5 + outOffset] = (curInputValue1 >>> 3) & mask; - out[6 + outOffset] = (curInputValue1 >>> 10) & mask; - out[7 + outOffset] = (curInputValue1 >>> 17) & mask; - out[8 + outOffset] = (curInputValue1 >>> 24) & mask; - out[9 + outOffset] = ((curInputValue1 >>> 31) | (curInputValue2 << 1)) & mask; - out[10 + outOffset] = (curInputValue2 >>> 6) & mask; - out[11 + outOffset] = (curInputValue2 >>> 13) & mask; - out[12 + outOffset] = (curInputValue2 >>> 20) & mask; - out[13 + outOffset] = ((curInputValue2 >>> 27) | (curInputValue3 << 5)) & mask; - out[14 + outOffset] = (curInputValue3 >>> 2) & mask; - out[15 + outOffset] = (curInputValue3 >>> 9) & mask; - out[16 + outOffset] = (curInputValue3 >>> 16) & mask; - out[17 + outOffset] = (curInputValue3 >>> 23) & mask; - out[18 + outOffset] = ((curInputValue3 >>> 30) | (curInputValue4 << 2)) & mask; - out[19 + outOffset] = (curInputValue4 >>> 5) & mask; - out[20 + outOffset] = (curInputValue4 >>> 12) & mask; - out[21 + outOffset] = (curInputValue4 >>> 19) & mask; - out[22 + outOffset] = ((curInputValue4 >>> 26) | (curInputValue5 << 6)) & mask; - out[23 + outOffset] = (curInputValue5 >>> 1) & mask; - out[24 + outOffset] = (curInputValue5 >>> 8) & mask; - out[25 + outOffset] = (curInputValue5 >>> 15) & mask; - out[26 + outOffset] = (curInputValue5 >>> 22) & mask; - out[27 + outOffset] = ((curInputValue5 >>> 29) | (curInputValue6 << 3)) & mask; - out[28 + outOffset] = (curInputValue6 >>> 4) & mask; - out[29 + outOffset] = (curInputValue6 >>> 11) & mask; - out[30 + outOffset] = (curInputValue6 >>> 18) & mask; - out[31 + outOffset] = curInputValue6 >>> 25; - outOffset += 32; + static private void unpack7(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 127; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + int curInputValue2 = in.get(); + int curInputValue3 = in.get(); + int curInputValue4 = in.get(); + int curInputValue5 = in.get(); + int curInputValue6 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 7) & mask; + out[2 + outOffset] = (curInputValue0 >>> 14) & mask; + out[3 + outOffset] = (curInputValue0 >>> 21) & mask; + out[4 + outOffset] = ((curInputValue0 >>> 28) | (curInputValue1 << 4)) + & mask; + out[5 + outOffset] = (curInputValue1 >>> 3) & mask; + out[6 + outOffset] = (curInputValue1 >>> 10) & mask; + out[7 + outOffset] = (curInputValue1 >>> 17) & mask; + out[8 + outOffset] = (curInputValue1 >>> 24) & mask; + out[9 + outOffset] = ((curInputValue1 >>> 31) | (curInputValue2 << 1)) + & mask; + out[10 + outOffset] = (curInputValue2 >>> 6) & mask; + out[11 + outOffset] = (curInputValue2 >>> 13) & mask; + out[12 + outOffset] = (curInputValue2 >>> 20) & mask; + out[13 + outOffset] = ((curInputValue2 >>> 27) | (curInputValue3 << 5)) + & mask; + out[14 + outOffset] = (curInputValue3 >>> 2) & mask; + out[15 + outOffset] = (curInputValue3 >>> 9) & mask; + out[16 + outOffset] = (curInputValue3 >>> 16) & mask; + out[17 + outOffset] = (curInputValue3 >>> 23) & mask; + out[18 + outOffset] = ((curInputValue3 >>> 30) | (curInputValue4 << 2)) + & mask; + out[19 + outOffset] = (curInputValue4 >>> 5) & mask; + out[20 + outOffset] = (curInputValue4 >>> 12) & mask; + out[21 + outOffset] = (curInputValue4 >>> 19) & mask; + out[22 + outOffset] = ((curInputValue4 >>> 26) | (curInputValue5 << 6)) + & mask; + out[23 + outOffset] = (curInputValue5 >>> 1) & mask; + out[24 + outOffset] = (curInputValue5 >>> 8) & mask; + out[25 + outOffset] = (curInputValue5 >>> 15) & mask; + out[26 + outOffset] = (curInputValue5 >>> 22) & mask; + out[27 + outOffset] = ((curInputValue5 >>> 29) | (curInputValue6 << 3)) + & mask; + out[28 + outOffset] = (curInputValue6 >>> 4) & mask; + out[29 + outOffset] = (curInputValue6 >>> 11) & mask; + out[30 + outOffset] = (curInputValue6 >>> 18) & mask; + out[31 + outOffset] = curInputValue6 >>> 25; + outOffset += 32; + } } - } - static private void unpack8(int[] out, IntBuffer in) { - int outOffset = 0; - final int mask = 255; - for (int i = 0; i < 4; ++i) { - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - int curInputValue2 = in.get(); - int curInputValue3 = in.get(); - int curInputValue4 = in.get(); - int curInputValue5 = in.get(); - int curInputValue6 = in.get(); - int curInputValue7 = in.get(); - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = (curInputValue0 >>> 8) & mask; - out[2 + outOffset] = (curInputValue0 >>> 16) & mask; - out[3 + outOffset] = curInputValue0 >>> 24; - out[4 + outOffset] = curInputValue1 & mask; - out[5 + outOffset] = (curInputValue1 >>> 8) & mask; - out[6 + outOffset] = (curInputValue1 >>> 16) & mask; - out[7 + outOffset] = curInputValue1 >>> 24; - out[8 + outOffset] = curInputValue2 & mask; - out[9 + outOffset] = (curInputValue2 >>> 8) & mask; - out[10 + outOffset] = (curInputValue2 >>> 16) & mask; - out[11 + outOffset] = curInputValue2 >>> 24; - out[12 + outOffset] = curInputValue3 & mask; - out[13 + outOffset] = (curInputValue3 >>> 8) & mask; - out[14 + outOffset] = (curInputValue3 >>> 16) & mask; - out[15 + outOffset] = curInputValue3 >>> 24; - out[16 + outOffset] = curInputValue4 & mask; - out[17 + outOffset] = (curInputValue4 >>> 8) & mask; - out[18 + outOffset] = (curInputValue4 >>> 16) & mask; - out[19 + outOffset] = curInputValue4 >>> 24; - out[20 + outOffset] = curInputValue5 & mask; - out[21 + outOffset] = (curInputValue5 >>> 8) & mask; - out[22 + outOffset] = (curInputValue5 >>> 16) & mask; - out[23 + outOffset] = curInputValue5 >>> 24; - out[24 + outOffset] = curInputValue6 & mask; - out[25 + outOffset] = (curInputValue6 >>> 8) & mask; - out[26 + outOffset] = (curInputValue6 >>> 16) & mask; - out[27 + outOffset] = curInputValue6 >>> 24; - out[28 + outOffset] = curInputValue7 & mask; - out[29 + outOffset] = (curInputValue7 >>> 8) & mask; - out[30 + outOffset] = (curInputValue7 >>> 16) & mask; - out[31 + outOffset] = curInputValue7 >>> 24; - outOffset += 32; + static private void unpack8(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 255; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + int curInputValue2 = in.get(); + int curInputValue3 = in.get(); + int curInputValue4 = in.get(); + int curInputValue5 = in.get(); + int curInputValue6 = in.get(); + int curInputValue7 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 8) & mask; + out[2 + outOffset] = (curInputValue0 >>> 16) & mask; + out[3 + outOffset] = curInputValue0 >>> 24; + out[4 + outOffset] = curInputValue1 & mask; + out[5 + outOffset] = (curInputValue1 >>> 8) & mask; + out[6 + outOffset] = (curInputValue1 >>> 16) & mask; + out[7 + outOffset] = curInputValue1 >>> 24; + out[8 + outOffset] = curInputValue2 & mask; + out[9 + outOffset] = (curInputValue2 >>> 8) & mask; + out[10 + outOffset] = (curInputValue2 >>> 16) & mask; + out[11 + outOffset] = curInputValue2 >>> 24; + out[12 + outOffset] = curInputValue3 & mask; + out[13 + outOffset] = (curInputValue3 >>> 8) & mask; + out[14 + outOffset] = (curInputValue3 >>> 16) & mask; + out[15 + outOffset] = curInputValue3 >>> 24; + out[16 + outOffset] = curInputValue4 & mask; + out[17 + outOffset] = (curInputValue4 >>> 8) & mask; + out[18 + outOffset] = (curInputValue4 >>> 16) & mask; + out[19 + outOffset] = curInputValue4 >>> 24; + out[20 + outOffset] = curInputValue5 & mask; + out[21 + outOffset] = (curInputValue5 >>> 8) & mask; + out[22 + outOffset] = (curInputValue5 >>> 16) & mask; + out[23 + outOffset] = curInputValue5 >>> 24; + out[24 + outOffset] = curInputValue6 & mask; + out[25 + outOffset] = (curInputValue6 >>> 8) & mask; + out[26 + outOffset] = (curInputValue6 >>> 16) & mask; + out[27 + outOffset] = curInputValue6 >>> 24; + out[28 + outOffset] = curInputValue7 & mask; + out[29 + outOffset] = (curInputValue7 >>> 8) & mask; + out[30 + outOffset] = (curInputValue7 >>> 16) & mask; + out[31 + outOffset] = curInputValue7 >>> 24; + outOffset += 32; + } } - } - static private void unpack9(int[] out, IntBuffer in) { - int outOffset = 0; - final int mask = 511; - for (int i = 0; i < 4; ++i) { - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - int curInputValue2 = in.get(); - int curInputValue3 = in.get(); - int curInputValue4 = in.get(); - int curInputValue5 = in.get(); - int curInputValue6 = in.get(); - int curInputValue7 = in.get(); - int curInputValue8 = in.get(); - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = (curInputValue0 >>> 9) & mask; - out[2 + outOffset] = (curInputValue0 >>> 18) & mask; - out[3 + outOffset] = ((curInputValue0 >>> 27) | (curInputValue1 << 5)) & mask; - out[4 + outOffset] = (curInputValue1 >>> 4) & mask; - out[5 + outOffset] = (curInputValue1 >>> 13) & mask; - out[6 + outOffset] = (curInputValue1 >>> 22) & mask; - out[7 + outOffset] = ((curInputValue1 >>> 31) | (curInputValue2 << 1)) & mask; - out[8 + outOffset] = (curInputValue2 >>> 8) & mask; - out[9 + outOffset] = (curInputValue2 >>> 17) & mask; - out[10 + outOffset] = ((curInputValue2 >>> 26) | (curInputValue3 << 6)) & mask; - out[11 + outOffset] = (curInputValue3 >>> 3) & mask; - out[12 + outOffset] = (curInputValue3 >>> 12) & mask; - out[13 + outOffset] = (curInputValue3 >>> 21) & mask; - out[14 + outOffset] = ((curInputValue3 >>> 30) | (curInputValue4 << 2)) & mask; - out[15 + outOffset] = (curInputValue4 >>> 7) & mask; - out[16 + outOffset] = (curInputValue4 >>> 16) & mask; - out[17 + outOffset] = ((curInputValue4 >>> 25) | (curInputValue5 << 7)) & mask; - out[18 + outOffset] = (curInputValue5 >>> 2) & mask; - out[19 + outOffset] = (curInputValue5 >>> 11) & mask; - out[20 + outOffset] = (curInputValue5 >>> 20) & mask; - out[21 + outOffset] = ((curInputValue5 >>> 29) | (curInputValue6 << 3)) & mask; - out[22 + outOffset] = (curInputValue6 >>> 6) & mask; - out[23 + outOffset] = (curInputValue6 >>> 15) & mask; - out[24 + outOffset] = ((curInputValue6 >>> 24) | (curInputValue7 << 8)) & mask; - out[25 + outOffset] = (curInputValue7 >>> 1) & mask; - out[26 + outOffset] = (curInputValue7 >>> 10) & mask; - out[27 + outOffset] = (curInputValue7 >>> 19) & mask; - out[28 + outOffset] = ((curInputValue7 >>> 28) | (curInputValue8 << 4)) & mask; - out[29 + outOffset] = (curInputValue8 >>> 5) & mask; - out[30 + outOffset] = (curInputValue8 >>> 14) & mask; - out[31 + outOffset] = curInputValue8 >>> 23; - outOffset += 32; + static private void unpack9(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 511; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + int curInputValue2 = in.get(); + int curInputValue3 = in.get(); + int curInputValue4 = in.get(); + int curInputValue5 = in.get(); + int curInputValue6 = in.get(); + int curInputValue7 = in.get(); + int curInputValue8 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 9) & mask; + out[2 + outOffset] = (curInputValue0 >>> 18) & mask; + out[3 + outOffset] = ((curInputValue0 >>> 27) | (curInputValue1 << 5)) + & mask; + out[4 + outOffset] = (curInputValue1 >>> 4) & mask; + out[5 + outOffset] = (curInputValue1 >>> 13) & mask; + out[6 + outOffset] = (curInputValue1 >>> 22) & mask; + out[7 + outOffset] = ((curInputValue1 >>> 31) | (curInputValue2 << 1)) + & mask; + out[8 + outOffset] = (curInputValue2 >>> 8) & mask; + out[9 + outOffset] = (curInputValue2 >>> 17) & mask; + out[10 + outOffset] = ((curInputValue2 >>> 26) | (curInputValue3 << 6)) + & mask; + out[11 + outOffset] = (curInputValue3 >>> 3) & mask; + out[12 + outOffset] = (curInputValue3 >>> 12) & mask; + out[13 + outOffset] = (curInputValue3 >>> 21) & mask; + out[14 + outOffset] = ((curInputValue3 >>> 30) | (curInputValue4 << 2)) + & mask; + out[15 + outOffset] = (curInputValue4 >>> 7) & mask; + out[16 + outOffset] = (curInputValue4 >>> 16) & mask; + out[17 + outOffset] = ((curInputValue4 >>> 25) | (curInputValue5 << 7)) + & mask; + out[18 + outOffset] = (curInputValue5 >>> 2) & mask; + out[19 + outOffset] = (curInputValue5 >>> 11) & mask; + out[20 + outOffset] = (curInputValue5 >>> 20) & mask; + out[21 + outOffset] = ((curInputValue5 >>> 29) | (curInputValue6 << 3)) + & mask; + out[22 + outOffset] = (curInputValue6 >>> 6) & mask; + out[23 + outOffset] = (curInputValue6 >>> 15) & mask; + out[24 + outOffset] = ((curInputValue6 >>> 24) | (curInputValue7 << 8)) + & mask; + out[25 + outOffset] = (curInputValue7 >>> 1) & mask; + out[26 + outOffset] = (curInputValue7 >>> 10) & mask; + out[27 + outOffset] = (curInputValue7 >>> 19) & mask; + out[28 + outOffset] = ((curInputValue7 >>> 28) | (curInputValue8 << 4)) + & mask; + out[29 + outOffset] = (curInputValue8 >>> 5) & mask; + out[30 + outOffset] = (curInputValue8 >>> 14) & mask; + out[31 + outOffset] = curInputValue8 >>> 23; + outOffset += 32; + } } - } - static private void unpack10(int[] out, IntBuffer in) { - int outOffset = 0; - final int mask = 1023; - for (int i = 0; i < 4; ++i) { - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - int curInputValue2 = in.get(); - int curInputValue3 = in.get(); - int curInputValue4 = in.get(); - int curInputValue5 = in.get(); - int curInputValue6 = in.get(); - int curInputValue7 = in.get(); - int curInputValue8 = in.get(); - int curInputValue9 = in.get(); - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = (curInputValue0 >>> 10) & mask; - out[2 + outOffset] = (curInputValue0 >>> 20) & mask; - out[3 + outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) & mask; - out[4 + outOffset] = (curInputValue1 >>> 8) & mask; - out[5 + outOffset] = (curInputValue1 >>> 18) & mask; - out[6 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; - out[7 + outOffset] = (curInputValue2 >>> 6) & mask; - out[8 + outOffset] = (curInputValue2 >>> 16) & mask; - out[9 + outOffset] = ((curInputValue2 >>> 26) | (curInputValue3 << 6)) & mask; - out[10 + outOffset] = (curInputValue3 >>> 4) & mask; - out[11 + outOffset] = (curInputValue3 >>> 14) & mask; - out[12 + outOffset] = ((curInputValue3 >>> 24) | (curInputValue4 << 8)) & mask; - out[13 + outOffset] = (curInputValue4 >>> 2) & mask; - out[14 + outOffset] = (curInputValue4 >>> 12) & mask; - out[15 + outOffset] = curInputValue4 >>> 22; - out[16 + outOffset] = curInputValue5 & mask; - out[17 + outOffset] = (curInputValue5 >>> 10) & mask; - out[18 + outOffset] = (curInputValue5 >>> 20) & mask; - out[19 + outOffset] = ((curInputValue5 >>> 30) | (curInputValue6 << 2)) & mask; - out[20 + outOffset] = (curInputValue6 >>> 8) & mask; - out[21 + outOffset] = (curInputValue6 >>> 18) & mask; - out[22 + outOffset] = ((curInputValue6 >>> 28) | (curInputValue7 << 4)) & mask; - out[23 + outOffset] = (curInputValue7 >>> 6) & mask; - out[24 + outOffset] = (curInputValue7 >>> 16) & mask; - out[25 + outOffset] = ((curInputValue7 >>> 26) | (curInputValue8 << 6)) & mask; - out[26 + outOffset] = (curInputValue8 >>> 4) & mask; - out[27 + outOffset] = (curInputValue8 >>> 14) & mask; - out[28 + outOffset] = ((curInputValue8 >>> 24) | (curInputValue9 << 8)) & mask; - out[29 + outOffset] = (curInputValue9 >>> 2) & mask; - out[30 + outOffset] = (curInputValue9 >>> 12) & mask; - out[31 + outOffset] = curInputValue9 >>> 22; - outOffset += 32; + static private void unpack10(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 1023; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + int curInputValue2 = in.get(); + int curInputValue3 = in.get(); + int curInputValue4 = in.get(); + int curInputValue5 = in.get(); + int curInputValue6 = in.get(); + int curInputValue7 = in.get(); + int curInputValue8 = in.get(); + int curInputValue9 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 10) & mask; + out[2 + outOffset] = (curInputValue0 >>> 20) & mask; + out[3 + outOffset] = ((curInputValue0 >>> 30) | (curInputValue1 << 2)) + & mask; + out[4 + outOffset] = (curInputValue1 >>> 8) & mask; + out[5 + outOffset] = (curInputValue1 >>> 18) & mask; + out[6 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) + & mask; + out[7 + outOffset] = (curInputValue2 >>> 6) & mask; + out[8 + outOffset] = (curInputValue2 >>> 16) & mask; + out[9 + outOffset] = ((curInputValue2 >>> 26) | (curInputValue3 << 6)) + & mask; + out[10 + outOffset] = (curInputValue3 >>> 4) & mask; + out[11 + outOffset] = (curInputValue3 >>> 14) & mask; + out[12 + outOffset] = ((curInputValue3 >>> 24) | (curInputValue4 << 8)) + & mask; + out[13 + outOffset] = (curInputValue4 >>> 2) & mask; + out[14 + outOffset] = (curInputValue4 >>> 12) & mask; + out[15 + outOffset] = curInputValue4 >>> 22; + out[16 + outOffset] = curInputValue5 & mask; + out[17 + outOffset] = (curInputValue5 >>> 10) & mask; + out[18 + outOffset] = (curInputValue5 >>> 20) & mask; + out[19 + outOffset] = ((curInputValue5 >>> 30) | (curInputValue6 << 2)) + & mask; + out[20 + outOffset] = (curInputValue6 >>> 8) & mask; + out[21 + outOffset] = (curInputValue6 >>> 18) & mask; + out[22 + outOffset] = ((curInputValue6 >>> 28) | (curInputValue7 << 4)) + & mask; + out[23 + outOffset] = (curInputValue7 >>> 6) & mask; + out[24 + outOffset] = (curInputValue7 >>> 16) & mask; + out[25 + outOffset] = ((curInputValue7 >>> 26) | (curInputValue8 << 6)) + & mask; + out[26 + outOffset] = (curInputValue8 >>> 4) & mask; + out[27 + outOffset] = (curInputValue8 >>> 14) & mask; + out[28 + outOffset] = ((curInputValue8 >>> 24) | (curInputValue9 << 8)) + & mask; + out[29 + outOffset] = (curInputValue9 >>> 2) & mask; + out[30 + outOffset] = (curInputValue9 >>> 12) & mask; + out[31 + outOffset] = curInputValue9 >>> 22; + outOffset += 32; + } } - } - static private void unpack11(int[] out, IntBuffer in) { - int outOffset = 0; - final int mask = 2047; - for (int i = 0; i < 4; ++i) { - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - int curInputValue2 = in.get(); - int curInputValue3 = in.get(); - int curInputValue4 = in.get(); - int curInputValue5 = in.get(); - int curInputValue6 = in.get(); - int curInputValue7 = in.get(); - int curInputValue8 = in.get(); - int curInputValue9 = in.get(); - int curInputValue10 = in.get(); - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = (curInputValue0 >>> 11) & mask; - out[2 + outOffset] = ((curInputValue0 >>> 22) | (curInputValue1 << 10)) & mask; - out[3 + outOffset] = (curInputValue1 >>> 1) & mask; - out[4 + outOffset] = (curInputValue1 >>> 12) & mask; - out[5 + outOffset] = ((curInputValue1 >>> 23) | (curInputValue2 << 9)) & mask; - out[6 + outOffset] = (curInputValue2 >>> 2) & mask; - out[7 + outOffset] = (curInputValue2 >>> 13) & mask; - out[8 + outOffset] = ((curInputValue2 >>> 24) | (curInputValue3 << 8)) & mask; - out[9 + outOffset] = (curInputValue3 >>> 3) & mask; - out[10 + outOffset] = (curInputValue3 >>> 14) & mask; - out[11 + outOffset] = ((curInputValue3 >>> 25) | (curInputValue4 << 7)) & mask; - out[12 + outOffset] = (curInputValue4 >>> 4) & mask; - out[13 + outOffset] = (curInputValue4 >>> 15) & mask; - out[14 + outOffset] = ((curInputValue4 >>> 26) | (curInputValue5 << 6)) & mask; - out[15 + outOffset] = (curInputValue5 >>> 5) & mask; - out[16 + outOffset] = (curInputValue5 >>> 16) & mask; - out[17 + outOffset] = ((curInputValue5 >>> 27) | (curInputValue6 << 5)) & mask; - out[18 + outOffset] = (curInputValue6 >>> 6) & mask; - out[19 + outOffset] = (curInputValue6 >>> 17) & mask; - out[20 + outOffset] = ((curInputValue6 >>> 28) | (curInputValue7 << 4)) & mask; - out[21 + outOffset] = (curInputValue7 >>> 7) & mask; - out[22 + outOffset] = (curInputValue7 >>> 18) & mask; - out[23 + outOffset] = ((curInputValue7 >>> 29) | (curInputValue8 << 3)) & mask; - out[24 + outOffset] = (curInputValue8 >>> 8) & mask; - out[25 + outOffset] = (curInputValue8 >>> 19) & mask; - out[26 + outOffset] = ((curInputValue8 >>> 30) | (curInputValue9 << 2)) & mask; - out[27 + outOffset] = (curInputValue9 >>> 9) & mask; - out[28 + outOffset] = (curInputValue9 >>> 20) & mask; - out[29 + outOffset] = ((curInputValue9 >>> 31) | (curInputValue10 << 1)) & mask; - out[30 + outOffset] = (curInputValue10 >>> 10) & mask; - out[31 + outOffset] = curInputValue10 >>> 21; - outOffset += 32; + static private void unpack11(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 2047; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + int curInputValue2 = in.get(); + int curInputValue3 = in.get(); + int curInputValue4 = in.get(); + int curInputValue5 = in.get(); + int curInputValue6 = in.get(); + int curInputValue7 = in.get(); + int curInputValue8 = in.get(); + int curInputValue9 = in.get(); + int curInputValue10 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 11) & mask; + out[2 + outOffset] = ((curInputValue0 >>> 22) | (curInputValue1 << 10)) + & mask; + out[3 + outOffset] = (curInputValue1 >>> 1) & mask; + out[4 + outOffset] = (curInputValue1 >>> 12) & mask; + out[5 + outOffset] = ((curInputValue1 >>> 23) | (curInputValue2 << 9)) + & mask; + out[6 + outOffset] = (curInputValue2 >>> 2) & mask; + out[7 + outOffset] = (curInputValue2 >>> 13) & mask; + out[8 + outOffset] = ((curInputValue2 >>> 24) | (curInputValue3 << 8)) + & mask; + out[9 + outOffset] = (curInputValue3 >>> 3) & mask; + out[10 + outOffset] = (curInputValue3 >>> 14) & mask; + out[11 + outOffset] = ((curInputValue3 >>> 25) | (curInputValue4 << 7)) + & mask; + out[12 + outOffset] = (curInputValue4 >>> 4) & mask; + out[13 + outOffset] = (curInputValue4 >>> 15) & mask; + out[14 + outOffset] = ((curInputValue4 >>> 26) | (curInputValue5 << 6)) + & mask; + out[15 + outOffset] = (curInputValue5 >>> 5) & mask; + out[16 + outOffset] = (curInputValue5 >>> 16) & mask; + out[17 + outOffset] = ((curInputValue5 >>> 27) | (curInputValue6 << 5)) + & mask; + out[18 + outOffset] = (curInputValue6 >>> 6) & mask; + out[19 + outOffset] = (curInputValue6 >>> 17) & mask; + out[20 + outOffset] = ((curInputValue6 >>> 28) | (curInputValue7 << 4)) + & mask; + out[21 + outOffset] = (curInputValue7 >>> 7) & mask; + out[22 + outOffset] = (curInputValue7 >>> 18) & mask; + out[23 + outOffset] = ((curInputValue7 >>> 29) | (curInputValue8 << 3)) + & mask; + out[24 + outOffset] = (curInputValue8 >>> 8) & mask; + out[25 + outOffset] = (curInputValue8 >>> 19) & mask; + out[26 + outOffset] = ((curInputValue8 >>> 30) | (curInputValue9 << 2)) + & mask; + out[27 + outOffset] = (curInputValue9 >>> 9) & mask; + out[28 + outOffset] = (curInputValue9 >>> 20) & mask; + out[29 + outOffset] = ((curInputValue9 >>> 31) | (curInputValue10 << 1)) + & mask; + out[30 + outOffset] = (curInputValue10 >>> 10) & mask; + out[31 + outOffset] = curInputValue10 >>> 21; + outOffset += 32; + } } - } - static private void unpack12(int[] out, IntBuffer in) { - int outOffset = 0; - final int mask = 4095; - for (int i = 0; i < 4; ++i) { - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - int curInputValue2 = in.get(); - int curInputValue3 = in.get(); - int curInputValue4 = in.get(); - int curInputValue5 = in.get(); - int curInputValue6 = in.get(); - int curInputValue7 = in.get(); - int curInputValue8 = in.get(); - int curInputValue9 = in.get(); - int curInputValue10 = in.get(); - int curInputValue11 = in.get(); - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = (curInputValue0 >>> 12) & mask; - out[2 + outOffset] = ((curInputValue0 >>> 24) | (curInputValue1 << 8)) & mask; - out[3 + outOffset] = (curInputValue1 >>> 4) & mask; - out[4 + outOffset] = (curInputValue1 >>> 16) & mask; - out[5 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; - out[6 + outOffset] = (curInputValue2 >>> 8) & mask; - out[7 + outOffset] = curInputValue2 >>> 20; - out[8 + outOffset] = curInputValue3 & mask; - out[9 + outOffset] = (curInputValue3 >>> 12) & mask; - out[10 + outOffset] = ((curInputValue3 >>> 24) | (curInputValue4 << 8)) & mask; - out[11 + outOffset] = (curInputValue4 >>> 4) & mask; - out[12 + outOffset] = (curInputValue4 >>> 16) & mask; - out[13 + outOffset] = ((curInputValue4 >>> 28) | (curInputValue5 << 4)) & mask; - out[14 + outOffset] = (curInputValue5 >>> 8) & mask; - out[15 + outOffset] = curInputValue5 >>> 20; - out[16 + outOffset] = curInputValue6 & mask; - out[17 + outOffset] = (curInputValue6 >>> 12) & mask; - out[18 + outOffset] = ((curInputValue6 >>> 24) | (curInputValue7 << 8)) & mask; - out[19 + outOffset] = (curInputValue7 >>> 4) & mask; - out[20 + outOffset] = (curInputValue7 >>> 16) & mask; - out[21 + outOffset] = ((curInputValue7 >>> 28) | (curInputValue8 << 4)) & mask; - out[22 + outOffset] = (curInputValue8 >>> 8) & mask; - out[23 + outOffset] = curInputValue8 >>> 20; - out[24 + outOffset] = curInputValue9 & mask; - out[25 + outOffset] = (curInputValue9 >>> 12) & mask; - out[26 + outOffset] = ((curInputValue9 >>> 24) | (curInputValue10 << 8)) & mask; - out[27 + outOffset] = (curInputValue10 >>> 4) & mask; - out[28 + outOffset] = (curInputValue10 >>> 16) & mask; - out[29 + outOffset] = ((curInputValue10 >>> 28) | (curInputValue11 << 4)) & mask; - out[30 + outOffset] = (curInputValue11 >>> 8) & mask; - out[31 + outOffset] = curInputValue11 >>> 20; - outOffset += 32; + static private void unpack12(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 4095; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + int curInputValue2 = in.get(); + int curInputValue3 = in.get(); + int curInputValue4 = in.get(); + int curInputValue5 = in.get(); + int curInputValue6 = in.get(); + int curInputValue7 = in.get(); + int curInputValue8 = in.get(); + int curInputValue9 = in.get(); + int curInputValue10 = in.get(); + int curInputValue11 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 12) & mask; + out[2 + outOffset] = ((curInputValue0 >>> 24) | (curInputValue1 << 8)) + & mask; + out[3 + outOffset] = (curInputValue1 >>> 4) & mask; + out[4 + outOffset] = (curInputValue1 >>> 16) & mask; + out[5 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) + & mask; + out[6 + outOffset] = (curInputValue2 >>> 8) & mask; + out[7 + outOffset] = curInputValue2 >>> 20; + out[8 + outOffset] = curInputValue3 & mask; + out[9 + outOffset] = (curInputValue3 >>> 12) & mask; + out[10 + outOffset] = ((curInputValue3 >>> 24) | (curInputValue4 << 8)) + & mask; + out[11 + outOffset] = (curInputValue4 >>> 4) & mask; + out[12 + outOffset] = (curInputValue4 >>> 16) & mask; + out[13 + outOffset] = ((curInputValue4 >>> 28) | (curInputValue5 << 4)) + & mask; + out[14 + outOffset] = (curInputValue5 >>> 8) & mask; + out[15 + outOffset] = curInputValue5 >>> 20; + out[16 + outOffset] = curInputValue6 & mask; + out[17 + outOffset] = (curInputValue6 >>> 12) & mask; + out[18 + outOffset] = ((curInputValue6 >>> 24) | (curInputValue7 << 8)) + & mask; + out[19 + outOffset] = (curInputValue7 >>> 4) & mask; + out[20 + outOffset] = (curInputValue7 >>> 16) & mask; + out[21 + outOffset] = ((curInputValue7 >>> 28) | (curInputValue8 << 4)) + & mask; + out[22 + outOffset] = (curInputValue8 >>> 8) & mask; + out[23 + outOffset] = curInputValue8 >>> 20; + out[24 + outOffset] = curInputValue9 & mask; + out[25 + outOffset] = (curInputValue9 >>> 12) & mask; + out[26 + outOffset] = ((curInputValue9 >>> 24) | (curInputValue10 << 8)) + & mask; + out[27 + outOffset] = (curInputValue10 >>> 4) & mask; + out[28 + outOffset] = (curInputValue10 >>> 16) & mask; + out[29 + outOffset] = ((curInputValue10 >>> 28) | (curInputValue11 << 4)) + & mask; + out[30 + outOffset] = (curInputValue11 >>> 8) & mask; + out[31 + outOffset] = curInputValue11 >>> 20; + outOffset += 32; + } } - } - static private void unpack13(int[] out, IntBuffer in) { - int outOffset = 0; - final int mask = 8191; - for (int i = 0; i < 4; ++i) { - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - int curInputValue2 = in.get(); - int curInputValue3 = in.get(); - int curInputValue4 = in.get(); - int curInputValue5 = in.get(); - int curInputValue6 = in.get(); - int curInputValue7 = in.get(); - int curInputValue8 = in.get(); - int curInputValue9 = in.get(); - int curInputValue10 = in.get(); - int curInputValue11 = in.get(); - int curInputValue12 = in.get(); - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = (curInputValue0 >>> 13) & mask; - out[2 + outOffset] = ((curInputValue0 >>> 26) | (curInputValue1 << 6)) & mask; - out[3 + outOffset] = (curInputValue1 >>> 7) & mask; - out[4 + outOffset] = ((curInputValue1 >>> 20) | (curInputValue2 << 12)) & mask; - out[5 + outOffset] = (curInputValue2 >>> 1) & mask; - out[6 + outOffset] = (curInputValue2 >>> 14) & mask; - out[7 + outOffset] = ((curInputValue2 >>> 27) | (curInputValue3 << 5)) & mask; - out[8 + outOffset] = (curInputValue3 >>> 8) & mask; - out[9 + outOffset] = ((curInputValue3 >>> 21) | (curInputValue4 << 11)) & mask; - out[10 + outOffset] = (curInputValue4 >>> 2) & mask; - out[11 + outOffset] = (curInputValue4 >>> 15) & mask; - out[12 + outOffset] = ((curInputValue4 >>> 28) | (curInputValue5 << 4)) & mask; - out[13 + outOffset] = (curInputValue5 >>> 9) & mask; - out[14 + outOffset] = ((curInputValue5 >>> 22) | (curInputValue6 << 10)) & mask; - out[15 + outOffset] = (curInputValue6 >>> 3) & mask; - out[16 + outOffset] = (curInputValue6 >>> 16) & mask; - out[17 + outOffset] = ((curInputValue6 >>> 29) | (curInputValue7 << 3)) & mask; - out[18 + outOffset] = (curInputValue7 >>> 10) & mask; - out[19 + outOffset] = ((curInputValue7 >>> 23) | (curInputValue8 << 9)) & mask; - out[20 + outOffset] = (curInputValue8 >>> 4) & mask; - out[21 + outOffset] = (curInputValue8 >>> 17) & mask; - out[22 + outOffset] = ((curInputValue8 >>> 30) | (curInputValue9 << 2)) & mask; - out[23 + outOffset] = (curInputValue9 >>> 11) & mask; - out[24 + outOffset] = ((curInputValue9 >>> 24) | (curInputValue10 << 8)) & mask; - out[25 + outOffset] = (curInputValue10 >>> 5) & mask; - out[26 + outOffset] = (curInputValue10 >>> 18) & mask; - out[27 + outOffset] = ((curInputValue10 >>> 31) | (curInputValue11 << 1)) & mask; - out[28 + outOffset] = (curInputValue11 >>> 12) & mask; - out[29 + outOffset] = ((curInputValue11 >>> 25) | (curInputValue12 << 7)) & mask; - out[30 + outOffset] = (curInputValue12 >>> 6) & mask; - out[31 + outOffset] = curInputValue12 >>> 19; - outOffset += 32; + static private void unpack13(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 8191; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + int curInputValue2 = in.get(); + int curInputValue3 = in.get(); + int curInputValue4 = in.get(); + int curInputValue5 = in.get(); + int curInputValue6 = in.get(); + int curInputValue7 = in.get(); + int curInputValue8 = in.get(); + int curInputValue9 = in.get(); + int curInputValue10 = in.get(); + int curInputValue11 = in.get(); + int curInputValue12 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = (curInputValue0 >>> 13) & mask; + out[2 + outOffset] = ((curInputValue0 >>> 26) | (curInputValue1 << 6)) + & mask; + out[3 + outOffset] = (curInputValue1 >>> 7) & mask; + out[4 + outOffset] = ((curInputValue1 >>> 20) | (curInputValue2 << 12)) + & mask; + out[5 + outOffset] = (curInputValue2 >>> 1) & mask; + out[6 + outOffset] = (curInputValue2 >>> 14) & mask; + out[7 + outOffset] = ((curInputValue2 >>> 27) | (curInputValue3 << 5)) + & mask; + out[8 + outOffset] = (curInputValue3 >>> 8) & mask; + out[9 + outOffset] = ((curInputValue3 >>> 21) | (curInputValue4 << 11)) + & mask; + out[10 + outOffset] = (curInputValue4 >>> 2) & mask; + out[11 + outOffset] = (curInputValue4 >>> 15) & mask; + out[12 + outOffset] = ((curInputValue4 >>> 28) | (curInputValue5 << 4)) + & mask; + out[13 + outOffset] = (curInputValue5 >>> 9) & mask; + out[14 + outOffset] = ((curInputValue5 >>> 22) | (curInputValue6 << 10)) + & mask; + out[15 + outOffset] = (curInputValue6 >>> 3) & mask; + out[16 + outOffset] = (curInputValue6 >>> 16) & mask; + out[17 + outOffset] = ((curInputValue6 >>> 29) | (curInputValue7 << 3)) + & mask; + out[18 + outOffset] = (curInputValue7 >>> 10) & mask; + out[19 + outOffset] = ((curInputValue7 >>> 23) | (curInputValue8 << 9)) + & mask; + out[20 + outOffset] = (curInputValue8 >>> 4) & mask; + out[21 + outOffset] = (curInputValue8 >>> 17) & mask; + out[22 + outOffset] = ((curInputValue8 >>> 30) | (curInputValue9 << 2)) + & mask; + out[23 + outOffset] = (curInputValue9 >>> 11) & mask; + out[24 + outOffset] = ((curInputValue9 >>> 24) | (curInputValue10 << 8)) + & mask; + out[25 + outOffset] = (curInputValue10 >>> 5) & mask; + out[26 + outOffset] = (curInputValue10 >>> 18) & mask; + out[27 + outOffset] = ((curInputValue10 >>> 31) | (curInputValue11 << 1)) + & mask; + out[28 + outOffset] = (curInputValue11 >>> 12) & mask; + out[29 + outOffset] = ((curInputValue11 >>> 25) | (curInputValue12 << 7)) + & mask; + out[30 + outOffset] = (curInputValue12 >>> 6) & mask; + out[31 + outOffset] = curInputValue12 >>> 19; + outOffset += 32; + } } - } - static private void unpack16(int[] out, IntBuffer in) { - int outOffset = 0; - final int mask = 65535; - for (int i = 0; i < 4; ++i) { - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - int curInputValue2 = in.get(); - int curInputValue3 = in.get(); - int curInputValue4 = in.get(); - int curInputValue5 = in.get(); - int curInputValue6 = in.get(); - int curInputValue7 = in.get(); - int curInputValue8 = in.get(); - int curInputValue9 = in.get(); - int curInputValue10 = in.get(); - int curInputValue11 = in.get(); - int curInputValue12 = in.get(); - int curInputValue13 = in.get(); - int curInputValue14 = in.get(); - int curInputValue15 = in.get(); - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = curInputValue0 >>> 16; - out[2 + outOffset] = curInputValue1 & mask; - out[3 + outOffset] = curInputValue1 >>> 16; - out[4 + outOffset] = curInputValue2 & mask; - out[5 + outOffset] = curInputValue2 >>> 16; - out[6 + outOffset] = curInputValue3 & mask; - out[7 + outOffset] = curInputValue3 >>> 16; - out[8 + outOffset] = curInputValue4 & mask; - out[9 + outOffset] = curInputValue4 >>> 16; - out[10 + outOffset] = curInputValue5 & mask; - out[11 + outOffset] = curInputValue5 >>> 16; - out[12 + outOffset] = curInputValue6 & mask; - out[13 + outOffset] = curInputValue6 >>> 16; - out[14 + outOffset] = curInputValue7 & mask; - out[15 + outOffset] = curInputValue7 >>> 16; - out[16 + outOffset] = curInputValue8 & mask; - out[17 + outOffset] = curInputValue8 >>> 16; - out[18 + outOffset] = curInputValue9 & mask; - out[19 + outOffset] = curInputValue9 >>> 16; - out[20 + outOffset] = curInputValue10 & mask; - out[21 + outOffset] = curInputValue10 >>> 16; - out[22 + outOffset] = curInputValue11 & mask; - out[23 + outOffset] = curInputValue11 >>> 16; - out[24 + outOffset] = curInputValue12 & mask; - out[25 + outOffset] = curInputValue12 >>> 16; - out[26 + outOffset] = curInputValue13 & mask; - out[27 + outOffset] = curInputValue13 >>> 16; - out[28 + outOffset] = curInputValue14 & mask; - out[29 + outOffset] = curInputValue14 >>> 16; - out[30 + outOffset] = curInputValue15 & mask; - out[31 + outOffset] = curInputValue15 >>> 16; - outOffset += 32; + static private void unpack16(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 65535; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + int curInputValue2 = in.get(); + int curInputValue3 = in.get(); + int curInputValue4 = in.get(); + int curInputValue5 = in.get(); + int curInputValue6 = in.get(); + int curInputValue7 = in.get(); + int curInputValue8 = in.get(); + int curInputValue9 = in.get(); + int curInputValue10 = in.get(); + int curInputValue11 = in.get(); + int curInputValue12 = in.get(); + int curInputValue13 = in.get(); + int curInputValue14 = in.get(); + int curInputValue15 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = curInputValue0 >>> 16; + out[2 + outOffset] = curInputValue1 & mask; + out[3 + outOffset] = curInputValue1 >>> 16; + out[4 + outOffset] = curInputValue2 & mask; + out[5 + outOffset] = curInputValue2 >>> 16; + out[6 + outOffset] = curInputValue3 & mask; + out[7 + outOffset] = curInputValue3 >>> 16; + out[8 + outOffset] = curInputValue4 & mask; + out[9 + outOffset] = curInputValue4 >>> 16; + out[10 + outOffset] = curInputValue5 & mask; + out[11 + outOffset] = curInputValue5 >>> 16; + out[12 + outOffset] = curInputValue6 & mask; + out[13 + outOffset] = curInputValue6 >>> 16; + out[14 + outOffset] = curInputValue7 & mask; + out[15 + outOffset] = curInputValue7 >>> 16; + out[16 + outOffset] = curInputValue8 & mask; + out[17 + outOffset] = curInputValue8 >>> 16; + out[18 + outOffset] = curInputValue9 & mask; + out[19 + outOffset] = curInputValue9 >>> 16; + out[20 + outOffset] = curInputValue10 & mask; + out[21 + outOffset] = curInputValue10 >>> 16; + out[22 + outOffset] = curInputValue11 & mask; + out[23 + outOffset] = curInputValue11 >>> 16; + out[24 + outOffset] = curInputValue12 & mask; + out[25 + outOffset] = curInputValue12 >>> 16; + out[26 + outOffset] = curInputValue13 & mask; + out[27 + outOffset] = curInputValue13 >>> 16; + out[28 + outOffset] = curInputValue14 & mask; + out[29 + outOffset] = curInputValue14 >>> 16; + out[30 + outOffset] = curInputValue15 & mask; + out[31 + outOffset] = curInputValue15 >>> 16; + outOffset += 32; + } } - } - static private void unpack20(int[] out, IntBuffer in) { - int outOffset = 0; - final int mask = 1048575; - for (int i = 0; i < 4; ++i) { - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - int curInputValue2 = in.get(); - int curInputValue3 = in.get(); - int curInputValue4 = in.get(); - int curInputValue5 = in.get(); - int curInputValue6 = in.get(); - int curInputValue7 = in.get(); - int curInputValue8 = in.get(); - int curInputValue9 = in.get(); - int curInputValue10 = in.get(); - int curInputValue11 = in.get(); - int curInputValue12 = in.get(); - int curInputValue13 = in.get(); - int curInputValue14 = in.get(); - int curInputValue15 = in.get(); - int curInputValue16 = in.get(); - int curInputValue17 = in.get(); - int curInputValue18 = in.get(); - int curInputValue19 = in.get(); - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = ((curInputValue0 >>> 20) | (curInputValue1 << 12)) & mask; - out[2 + outOffset] = (curInputValue1 >>> 8) & mask; - out[3 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) & mask; - out[4 + outOffset] = ((curInputValue2 >>> 16) | (curInputValue3 << 16)) & mask; - out[5 + outOffset] = (curInputValue3 >>> 4) & mask; - out[6 + outOffset] = ((curInputValue3 >>> 24) | (curInputValue4 << 8)) & mask; - out[7 + outOffset] = curInputValue4 >>> 12; - out[8 + outOffset] = curInputValue5 & mask; - out[9 + outOffset] = ((curInputValue5 >>> 20) | (curInputValue6 << 12)) & mask; - out[10 + outOffset] = (curInputValue6 >>> 8) & mask; - out[11 + outOffset] = ((curInputValue6 >>> 28) | (curInputValue7 << 4)) & mask; - out[12 + outOffset] = ((curInputValue7 >>> 16) | (curInputValue8 << 16)) & mask; - out[13 + outOffset] = (curInputValue8 >>> 4) & mask; - out[14 + outOffset] = ((curInputValue8 >>> 24) | (curInputValue9 << 8)) & mask; - out[15 + outOffset] = curInputValue9 >>> 12; - out[16 + outOffset] = curInputValue10 & mask; - out[17 + outOffset] = ((curInputValue10 >>> 20) | (curInputValue11 << 12)) & mask; - out[18 + outOffset] = (curInputValue11 >>> 8) & mask; - out[19 + outOffset] = ((curInputValue11 >>> 28) | (curInputValue12 << 4)) & mask; - out[20 + outOffset] = ((curInputValue12 >>> 16) | (curInputValue13 << 16)) & mask; - out[21 + outOffset] = (curInputValue13 >>> 4) & mask; - out[22 + outOffset] = ((curInputValue13 >>> 24) | (curInputValue14 << 8)) & mask; - out[23 + outOffset] = curInputValue14 >>> 12; - out[24 + outOffset] = curInputValue15 & mask; - out[25 + outOffset] = ((curInputValue15 >>> 20) | (curInputValue16 << 12)) & mask; - out[26 + outOffset] = (curInputValue16 >>> 8) & mask; - out[27 + outOffset] = ((curInputValue16 >>> 28) | (curInputValue17 << 4)) & mask; - out[28 + outOffset] = ((curInputValue17 >>> 16) | (curInputValue18 << 16)) & mask; - out[29 + outOffset] = (curInputValue18 >>> 4) & mask; - out[30 + outOffset] = ((curInputValue18 >>> 24) | (curInputValue19 << 8)) & mask; - out[31 + outOffset] = curInputValue19 >>> 12; - outOffset += 32; + static private void unpack20(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 1048575; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + int curInputValue2 = in.get(); + int curInputValue3 = in.get(); + int curInputValue4 = in.get(); + int curInputValue5 = in.get(); + int curInputValue6 = in.get(); + int curInputValue7 = in.get(); + int curInputValue8 = in.get(); + int curInputValue9 = in.get(); + int curInputValue10 = in.get(); + int curInputValue11 = in.get(); + int curInputValue12 = in.get(); + int curInputValue13 = in.get(); + int curInputValue14 = in.get(); + int curInputValue15 = in.get(); + int curInputValue16 = in.get(); + int curInputValue17 = in.get(); + int curInputValue18 = in.get(); + int curInputValue19 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = ((curInputValue0 >>> 20) | (curInputValue1 << 12)) + & mask; + out[2 + outOffset] = (curInputValue1 >>> 8) & mask; + out[3 + outOffset] = ((curInputValue1 >>> 28) | (curInputValue2 << 4)) + & mask; + out[4 + outOffset] = ((curInputValue2 >>> 16) | (curInputValue3 << 16)) + & mask; + out[5 + outOffset] = (curInputValue3 >>> 4) & mask; + out[6 + outOffset] = ((curInputValue3 >>> 24) | (curInputValue4 << 8)) + & mask; + out[7 + outOffset] = curInputValue4 >>> 12; + out[8 + outOffset] = curInputValue5 & mask; + out[9 + outOffset] = ((curInputValue5 >>> 20) | (curInputValue6 << 12)) + & mask; + out[10 + outOffset] = (curInputValue6 >>> 8) & mask; + out[11 + outOffset] = ((curInputValue6 >>> 28) | (curInputValue7 << 4)) + & mask; + out[12 + outOffset] = ((curInputValue7 >>> 16) | (curInputValue8 << 16)) + & mask; + out[13 + outOffset] = (curInputValue8 >>> 4) & mask; + out[14 + outOffset] = ((curInputValue8 >>> 24) | (curInputValue9 << 8)) + & mask; + out[15 + outOffset] = curInputValue9 >>> 12; + out[16 + outOffset] = curInputValue10 & mask; + out[17 + outOffset] = ((curInputValue10 >>> 20) | (curInputValue11 << 12)) + & mask; + out[18 + outOffset] = (curInputValue11 >>> 8) & mask; + out[19 + outOffset] = ((curInputValue11 >>> 28) | (curInputValue12 << 4)) + & mask; + out[20 + outOffset] = ((curInputValue12 >>> 16) | (curInputValue13 << 16)) + & mask; + out[21 + outOffset] = (curInputValue13 >>> 4) & mask; + out[22 + outOffset] = ((curInputValue13 >>> 24) | (curInputValue14 << 8)) + & mask; + out[23 + outOffset] = curInputValue14 >>> 12; + out[24 + outOffset] = curInputValue15 & mask; + out[25 + outOffset] = ((curInputValue15 >>> 20) | (curInputValue16 << 12)) + & mask; + out[26 + outOffset] = (curInputValue16 >>> 8) & mask; + out[27 + outOffset] = ((curInputValue16 >>> 28) | (curInputValue17 << 4)) + & mask; + out[28 + outOffset] = ((curInputValue17 >>> 16) | (curInputValue18 << 16)) + & mask; + out[29 + outOffset] = (curInputValue18 >>> 4) & mask; + out[30 + outOffset] = ((curInputValue18 >>> 24) | (curInputValue19 << 8)) + & mask; + out[31 + outOffset] = curInputValue19 >>> 12; + outOffset += 32; + } } - } - static private void unpack28(int[] out, IntBuffer in) { - int outOffset = 0; - final int mask = 268435455; - for (int i = 0; i < 4; ++i) { - int curInputValue0 = in.get(); - int curInputValue1 = in.get(); - int curInputValue2 = in.get(); - int curInputValue3 = in.get(); - int curInputValue4 = in.get(); - int curInputValue5 = in.get(); - int curInputValue6 = in.get(); - int curInputValue7 = in.get(); - int curInputValue8 = in.get(); - int curInputValue9 = in.get(); - int curInputValue10 = in.get(); - int curInputValue11 = in.get(); - int curInputValue12 = in.get(); - int curInputValue13 = in.get(); - int curInputValue14 = in.get(); - int curInputValue15 = in.get(); - int curInputValue16 = in.get(); - int curInputValue17 = in.get(); - int curInputValue18 = in.get(); - int curInputValue19 = in.get(); - int curInputValue20 = in.get(); - int curInputValue21 = in.get(); - int curInputValue22 = in.get(); - int curInputValue23 = in.get(); - int curInputValue24 = in.get(); - int curInputValue25 = in.get(); - int curInputValue26 = in.get(); - int curInputValue27 = in.get(); - out[0 + outOffset] = curInputValue0 & mask; - out[1 + outOffset] = ((curInputValue0 >>> 28) | (curInputValue1 << 4)) & mask; - out[2 + outOffset] = ((curInputValue1 >>> 24) | (curInputValue2 << 8)) & mask; - out[3 + outOffset] = ((curInputValue2 >>> 20) | (curInputValue3 << 12)) & mask; - out[4 + outOffset] = ((curInputValue3 >>> 16) | (curInputValue4 << 16)) & mask; - out[5 + outOffset] = ((curInputValue4 >>> 12) | (curInputValue5 << 20)) & mask; - out[6 + outOffset] = ((curInputValue5 >>> 8) | (curInputValue6 << 24)) & mask; - out[7 + outOffset] = curInputValue6 >>> 4; - out[8 + outOffset] = curInputValue7 & mask; - out[9 + outOffset] = ((curInputValue7 >>> 28) | (curInputValue8 << 4)) & mask; - out[10 + outOffset] = ((curInputValue8 >>> 24) | (curInputValue9 << 8)) & mask; - out[11 + outOffset] = ((curInputValue9 >>> 20) | (curInputValue10 << 12)) & mask; - out[12 + outOffset] = ((curInputValue10 >>> 16) | (curInputValue11 << 16)) & mask; - out[13 + outOffset] = ((curInputValue11 >>> 12) | (curInputValue12 << 20)) & mask; - out[14 + outOffset] = ((curInputValue12 >>> 8) | (curInputValue13 << 24)) & mask; - out[15 + outOffset] = curInputValue13 >>> 4; - out[16 + outOffset] = curInputValue14 & mask; - out[17 + outOffset] = ((curInputValue14 >>> 28) | (curInputValue15 << 4)) & mask; - out[18 + outOffset] = ((curInputValue15 >>> 24) | (curInputValue16 << 8)) & mask; - out[19 + outOffset] = ((curInputValue16 >>> 20) | (curInputValue17 << 12)) & mask; - out[20 + outOffset] = ((curInputValue17 >>> 16) | (curInputValue18 << 16)) & mask; - out[21 + outOffset] = ((curInputValue18 >>> 12) | (curInputValue19 << 20)) & mask; - out[22 + outOffset] = ((curInputValue19 >>> 8) | (curInputValue20 << 24)) & mask; - out[23 + outOffset] = curInputValue20 >>> 4; - out[24 + outOffset] = curInputValue21 & mask; - out[25 + outOffset] = ((curInputValue21 >>> 28) | (curInputValue22 << 4)) & mask; - out[26 + outOffset] = ((curInputValue22 >>> 24) | (curInputValue23 << 8)) & mask; - out[27 + outOffset] = ((curInputValue23 >>> 20) | (curInputValue24 << 12)) & mask; - out[28 + outOffset] = ((curInputValue24 >>> 16) | (curInputValue25 << 16)) & mask; - out[29 + outOffset] = ((curInputValue25 >>> 12) | (curInputValue26 << 20)) & mask; - out[30 + outOffset] = ((curInputValue26 >>> 8) | (curInputValue27 << 24)) & mask; - out[31 + outOffset] = curInputValue27 >>> 4; - outOffset += 32; + static private void unpack28(int[] out, IntBuffer in) { + int outOffset = 0; + final int mask = 268435455; + for (int i = 0; i < 4; ++i) { + int curInputValue0 = in.get(); + int curInputValue1 = in.get(); + int curInputValue2 = in.get(); + int curInputValue3 = in.get(); + int curInputValue4 = in.get(); + int curInputValue5 = in.get(); + int curInputValue6 = in.get(); + int curInputValue7 = in.get(); + int curInputValue8 = in.get(); + int curInputValue9 = in.get(); + int curInputValue10 = in.get(); + int curInputValue11 = in.get(); + int curInputValue12 = in.get(); + int curInputValue13 = in.get(); + int curInputValue14 = in.get(); + int curInputValue15 = in.get(); + int curInputValue16 = in.get(); + int curInputValue17 = in.get(); + int curInputValue18 = in.get(); + int curInputValue19 = in.get(); + int curInputValue20 = in.get(); + int curInputValue21 = in.get(); + int curInputValue22 = in.get(); + int curInputValue23 = in.get(); + int curInputValue24 = in.get(); + int curInputValue25 = in.get(); + int curInputValue26 = in.get(); + int curInputValue27 = in.get(); + out[0 + outOffset] = curInputValue0 & mask; + out[1 + outOffset] = ((curInputValue0 >>> 28) | (curInputValue1 << 4)) + & mask; + out[2 + outOffset] = ((curInputValue1 >>> 24) | (curInputValue2 << 8)) + & mask; + out[3 + outOffset] = ((curInputValue2 >>> 20) | (curInputValue3 << 12)) + & mask; + out[4 + outOffset] = ((curInputValue3 >>> 16) | (curInputValue4 << 16)) + & mask; + out[5 + outOffset] = ((curInputValue4 >>> 12) | (curInputValue5 << 20)) + & mask; + out[6 + outOffset] = ((curInputValue5 >>> 8) | (curInputValue6 << 24)) + & mask; + out[7 + outOffset] = curInputValue6 >>> 4; + out[8 + outOffset] = curInputValue7 & mask; + out[9 + outOffset] = ((curInputValue7 >>> 28) | (curInputValue8 << 4)) + & mask; + out[10 + outOffset] = ((curInputValue8 >>> 24) | (curInputValue9 << 8)) + & mask; + out[11 + outOffset] = ((curInputValue9 >>> 20) | (curInputValue10 << 12)) + & mask; + out[12 + outOffset] = ((curInputValue10 >>> 16) | (curInputValue11 << 16)) + & mask; + out[13 + outOffset] = ((curInputValue11 >>> 12) | (curInputValue12 << 20)) + & mask; + out[14 + outOffset] = ((curInputValue12 >>> 8) | (curInputValue13 << 24)) + & mask; + out[15 + outOffset] = curInputValue13 >>> 4; + out[16 + outOffset] = curInputValue14 & mask; + out[17 + outOffset] = ((curInputValue14 >>> 28) | (curInputValue15 << 4)) + & mask; + out[18 + outOffset] = ((curInputValue15 >>> 24) | (curInputValue16 << 8)) + & mask; + out[19 + outOffset] = ((curInputValue16 >>> 20) | (curInputValue17 << 12)) + & mask; + out[20 + outOffset] = ((curInputValue17 >>> 16) | (curInputValue18 << 16)) + & mask; + out[21 + outOffset] = ((curInputValue18 >>> 12) | (curInputValue19 << 20)) + & mask; + out[22 + outOffset] = ((curInputValue19 >>> 8) | (curInputValue20 << 24)) + & mask; + out[23 + outOffset] = curInputValue20 >>> 4; + out[24 + outOffset] = curInputValue21 & mask; + out[25 + outOffset] = ((curInputValue21 >>> 28) | (curInputValue22 << 4)) + & mask; + out[26 + outOffset] = ((curInputValue22 >>> 24) | (curInputValue23 << 8)) + & mask; + out[27 + outOffset] = ((curInputValue23 >>> 20) | (curInputValue24 << 12)) + & mask; + out[28 + outOffset] = ((curInputValue24 >>> 16) | (curInputValue25 << 16)) + & mask; + out[29 + outOffset] = ((curInputValue25 >>> 12) | (curInputValue26 << 20)) + & mask; + out[30 + outOffset] = ((curInputValue26 >>> 8) | (curInputValue27 << 24)) + & mask; + out[31 + outOffset] = curInputValue27 >>> 4; + outOffset += 32; + } } - } } diff --git a/src/main/java/com/kamikaze/pfordelta/Simple16.java b/src/main/java/com/kamikaze/pfordelta/Simple16.java index b615818..8b77355 100644 --- a/src/main/java/com/kamikaze/pfordelta/Simple16.java +++ b/src/main/java/com/kamikaze/pfordelta/Simple16.java @@ -7,112 +7,153 @@ */ /** - * Implementation of the Simple16 algorithm for sorted integer arrays. The basic ideas are based on papers from + * Implementation of the Simple16 algorithm for sorted integer arrays. The basic + * ideas are based on papers from * * 1. http://www2008.org/papers/pdf/p387-zhangA.pdf * * 2. http://www2009.org/proceedings/pdf/p401.pdf * - * The maximum possible integer value Simple16 can encode is < 2^28 (this is dertermined by the Simple16 algorithm itself). - * Therefore, in order to use Simple16, the application must write their own code to encode numbers in the range of [2^28, 2^32). - * A simple way is just write those numbers as 32-bit integers (that is, no compression for very big numbers). + * The maximum possible integer value Simple16 can encode is < 2^28 (this is + * dertermined by the Simple16 algorithm itself). Therefore, in order to use + * Simple16, the application must write their own code to encode numbers in the + * range of [2^28, 2^32). A simple way is just write those numbers as 32-bit + * integers (that is, no compression for very big numbers). */ @SuppressWarnings("javadoc") public class Simple16 { - private static final int S16_NUMSIZE = 16; - private static final int S16_BITSSIZE = 28; + private static final int S16_NUMSIZE = 16; + private static final int S16_BITSSIZE = 28; - //the possible number of compressed numbers hold in a single 32-bit integer - private static final int[] S16_NUM = {28, 21, 21, 21, 14, 9, 8, 7, 6, 6, 5, 5, 4, 3, 2, 1}; + // the possible number of compressed numbers hold in a single 32-bit + // integer + private static final int[] S16_NUM = { 28, 21, 21, 21, 14, 9, 8, 7, 6, + 6, 5, 5, 4, 3, 2, 1 }; - //the possible number of bits used to compress one number - private static final int[][] S16_BITS = {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}, - {1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0}, - {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {4, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {3, 4, 4, 4, 4, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {5, 5, 5, 5, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {4, 4, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {6, 6, 6, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {5, 5, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {10, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; + // the possible number of bits used to compress one number + private static final int[][] S16_BITS = { + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1 }, + { 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0 }, + { 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, + 2, 0, 0, 0, 0, 0, 0, 0 }, + { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }, + { 4, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }, + { 3, 4, 4, 4, 4, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }, + { 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }, + { 5, 5, 5, 5, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }, + { 4, 4, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 6, 6, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }, + { 5, 5, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }, + { 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }, + { 10, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }, + { 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }, + { 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 } }; - /** - * Compress an integer array using Simple16 - * - * @param out the compressed output - * @param outOffset the offset of the output in the number of integers - * @param in the integer input array - * @param inOffset the offset of the input in the number of integers - * @param n the number of elements to be compressed - * @return the number of compressed integers - */ - public static final int s16Compress(int[] out, int outOffset, int[] in, int inOffset, int n, int blockSize) { - int numIdx = 0, j = 0, num = 0, bits = 0; - try { - for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { - out[outOffset] = numIdx << S16_BITSSIZE; - num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; + /** + * Compress an integer array using Simple16 + * + * @param out + * the compressed output + * @param outOffset + * the offset of the output in the number of integers + * @param in + * the integer input array + * @param inOffset + * the offset of the input in the number of integers + * @param n + * the number of elements to be compressed + * @return the number of compressed integers + */ + public static final int s16Compress(int[] out, int outOffset, int[] in, + int inOffset, int n, int blockSize) { + int numIdx = 0, j = 0, num = 0, bits = 0; + try { + for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { + out[outOffset] = numIdx << S16_BITSSIZE; + num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] + : n; - for (j = 0, bits = 0; (j < num) && in[inOffset + j] < (1 << S16_BITS[numIdx][j]); ) { - out[outOffset] |= (in[inOffset + j] << bits); - bits += S16_BITS[numIdx][j]; - j++; - } + for (j = 0, bits = 0; (j < num) + && in[inOffset + j] < (1 << S16_BITS[numIdx][j]);) { + out[outOffset] |= (in[inOffset + j] << bits); + bits += S16_BITS[numIdx][j]; + j++; + } - if (j == num) { - return num; + if (j == num) { + return num; + } + } + } catch (Exception e) { + System.out.println("s16Compress: " + "numIdx:" + numIdx + + ",j:" + j + ",num:" + num + ",bits: " + bits); + e.printStackTrace(); } - } - } catch (Exception e) { - System.out.println("s16Compress: " + "numIdx:" + numIdx + ",j:" + j + ",num:" + num + ",bits: " + bits); - e.printStackTrace(); - } - return -1; - } - - /** - * Decompress an integer array using Simple16 - * - * @param out the decompressed output - * @param outOffset the offset of the output in the number of integers - * @param in the compressed input array - * @param inOffset the offset of the input in the number of integers - * @param n the number of elements to be compressed - * @return the number of processed integers - */ - public static final int s16Decompress(int[] out, int outOffset, int[] in, int inOffset, int n) { - int numIdx, j = 0, bits = 0; - numIdx = in[inOffset] >>> S16_BITSSIZE; - int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; - for (j = 0, bits = 0; j < num; j++) { - out[outOffset + j] = readBitsForS16(in, inOffset, bits, S16_BITS[numIdx][j]); - bits += S16_BITS[numIdx][j]; + return -1; } - return num; - } + /** + * Decompress an integer array using Simple16 + * + * @param out + * the decompressed output + * @param outOffset + * the offset of the output in the number of integers + * @param in + * the compressed input array + * @param inOffset + * the offset of the input in the number of integers + * @param n + * the number of elements to be compressed + * @return the number of processed integers + */ + public static final int s16Decompress(int[] out, int outOffset, + int[] in, int inOffset, int n) { + int numIdx, j = 0, bits = 0; + numIdx = in[inOffset] >>> S16_BITSSIZE; + int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; + for (j = 0, bits = 0; j < num; j++) { + out[outOffset + j] = readBitsForS16(in, inOffset, bits, + S16_BITS[numIdx][j]); + bits += S16_BITS[numIdx][j]; + } + return num; + } - /** - * Read a certain number of bits of a integer on the input array - * - * @param in the input array - * @param inIntOffset the start offset in ints in the input array - * @param inWithIntOffset the start offset within a int in the input array - * @param bits the number of bits to be read - * @return the bits bits of the input - */ - static private int readBitsForS16(int[] in, final int inIntOffset, final int inWithIntOffset, final int bits) { - final int val = (in[inIntOffset] >>> inWithIntOffset); - return val & (0xffffffff >>> (32 - bits)); - } + /** + * Read a certain number of bits of a integer on the input array + * + * @param in + * the input array + * @param inIntOffset + * the start offset in ints in the input array + * @param inWithIntOffset + * the start offset within a int in the input array + * @param bits + * the number of bits to be read + * @return the bits bits of the input + */ + static private int readBitsForS16(int[] in, final int inIntOffset, + final int inWithIntOffset, final int bits) { + final int val = (in[inIntOffset] >>> inWithIntOffset); + return val & (0xffffffff >>> (32 - bits)); + } } - diff --git a/src/main/java/com/kamikaze/pfordelta/Simple16WithHardCodes.java b/src/main/java/com/kamikaze/pfordelta/Simple16WithHardCodes.java index 6965176..9ea0bff 100644 --- a/src/main/java/com/kamikaze/pfordelta/Simple16WithHardCodes.java +++ b/src/main/java/com/kamikaze/pfordelta/Simple16WithHardCodes.java @@ -7,635 +7,693 @@ */ /** - * Implementation of the Simple16 algorithm for sorted integer arrays. The basic ideas are based on papers from + * Implementation of the Simple16 algorithm for sorted integer arrays. The basic + * ideas are based on papers from * * 1. http://www2008.org/papers/pdf/p387-zhangA.pdf * * 2. http://www2009.org/proceedings/pdf/p401.pdf * - * The maximum possible integer value Simple16 can encode is < 2^28 (this is dertermined by the Simple16 algorithm itself). - * Therefore, in order to use Simple16, the application must write their own code to encode numbers in the range of [2^28, 2^32). - * A simple way is just write those numbers as 32-bit integers (that is, no compression for very big numbers). + * The maximum possible integer value Simple16 can encode is < 2^28 (this is + * dertermined by the Simple16 algorithm itself). Therefore, in order to use + * Simple16, the application must write their own code to encode numbers in the + * range of [2^28, 2^32). A simple way is just write those numbers as 32-bit + * integers (that is, no compression for very big numbers). * - * Compared to Simple16, Simple16WithHardCodes will decompress each compressed integer using hardwired codes, - * resulting in faster decompression speed. However, it will sacrifice with slightly larger index size. + * Compared to Simple16, Simple16WithHardCodes will decompress each compressed + * integer using hardwired codes, resulting in faster decompression speed. + * However, it will sacrifice with slightly larger index size. * * Author: Hao Yan, hyan2008@gmail.com */ @SuppressWarnings("javadoc") public class Simple16WithHardCodes { - private static final int S16_NUMSIZE = 16; - private static final int S16_BITSSIZE = 28; + private static final int S16_NUMSIZE = 16; + private static final int S16_BITSSIZE = 28; + + // the possible number of compressed numbers hold in a single 32-bit + // integer + private static final int[] S16_NUM = { 28, 21, 21, 21, 14, 9, 8, 7, 6, + 6, 5, 5, 4, 3, 2, 1 }; + + // the possible number of bits used to compress one number + private static final int[][] S16_BITS = { + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1 }, + { 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0 }, + { 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, + 2, 0, 0, 0, 0, 0, 0, 0 }, + { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }, + { 4, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }, + { 3, 4, 4, 4, 4, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }, + { 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }, + { 5, 5, 5, 5, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }, + { 4, 4, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 6, 6, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }, + { 5, 5, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }, + { 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }, + { 10, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }, + { 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }, + { 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 } }; + + /** + * Compress an integer array using Simple16 + * + * @param out + * the compressed output + * @param outOffset + * the offset of the output in the number of integers + * @param in + * the integer input array + * @param inOffset + * the offset of the input in the number of integers + * @param n + * the number of elements to be compressed + * @return the number of compressed integers + */ + public static final int s16Compress(int[] out, int outOffset, int[] in, + int inOffset, int n, int blockSize, int oriBlockSize, + int[] oriInputBlock) { + int numIdx, j, num, bits; + for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { + out[outOffset] = numIdx << S16_BITSSIZE; + // num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; + + if (S16_NUM[numIdx] > n) + continue; + num = S16_NUM[numIdx]; + + for (j = 0, bits = 0; (j < num) + && in[inOffset + j] < (1 << S16_BITS[numIdx][j]);) { + out[outOffset] |= (in[inOffset + j] << bits); + bits += S16_BITS[numIdx][j]; + j++; + } + + if (j == num) { + return num; + } + } - //the possible number of compressed numbers hold in a single 32-bit integer - private static final int[] S16_NUM = {28, 21, 21, 21, 14, 9, 8, 7, 6, 6, 5, 5, 4, 3, 2, 1}; - - //the possible number of bits used to compress one number - private static final int[][] S16_BITS = {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}, - {1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0}, - {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {4, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {3, 4, 4, 4, 4, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {5, 5, 5, 5, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {4, 4, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {6, 6, 6, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {5, 5, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {10, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; - - /** - * Compress an integer array using Simple16 - * - * @param out the compressed output - * @param outOffset the offset of the output in the number of integers - * @param in the integer input array - * @param inOffset the offset of the input in the number of integers - * @param n the number of elements to be compressed - * @return the number of compressed integers - */ - public static final int s16Compress(int[] out, int outOffset, int[] in, int inOffset, int n, int blockSize, int oriBlockSize, int[] oriInputBlock) { - int numIdx, j, num, bits; - for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { - out[outOffset] = numIdx << S16_BITSSIZE; - //num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; + return -1; + } - if (S16_NUM[numIdx] > n) continue; - num = S16_NUM[numIdx]; + public static final int s16CompressBackup(int[] out, int outOffset, + int[] in, int inOffset, int n, int blockSize, int oriBlockSize, + int[] oriInputBlock) { + int numIdx, j, num, bits; + for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { + out[outOffset] = numIdx << S16_BITSSIZE; + num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; + + for (j = 0, bits = 0; (j < num) + && in[inOffset + j] < (1 << S16_BITS[numIdx][j]);) { + out[outOffset] |= (in[inOffset + j] << bits); + bits += S16_BITS[numIdx][j]; + j++; + } + + if (j == num) { + return num; + } + } - for (j = 0, bits = 0; (j < num) && in[inOffset + j] < (1 << S16_BITS[numIdx][j]); ) { - out[outOffset] |= (in[inOffset + j] << bits); - bits += S16_BITS[numIdx][j]; - j++; - } + return -1; + } - if (j == num) { + /** + * Decompress an integer array using Simple16 + * + * @param out + * the decompressed output + * @param outOffset + * the offset of the output in the number of integers + * @param in + * the compressed input array + * @param inOffset + * the offset of the input in the number of integers + * @param n + * the number of elements to be compressed + * @return the number of processed integers + */ + public static final int s16Decompress(int[] out, int outOffset, + int[] in, int inOffset, int n) { + int numIdx, j = 0, bits = 0; + numIdx = in[inOffset] >>> S16_BITSSIZE; + int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; + for (j = 0, bits = 0; j < num; j++) { + out[outOffset + j] = readBitsForS16(in, inOffset, bits, + S16_BITS[numIdx][j]); + bits += S16_BITS[numIdx][j]; + } return num; - } } - return -1; - } - - public static final int s16CompressBackup(int[] out, int outOffset, int[] in, int inOffset, int n, int blockSize, int oriBlockSize, int[] oriInputBlock) { - int numIdx, j, num, bits; - for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { - out[outOffset] = numIdx << S16_BITSSIZE; - num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; - - for (j = 0, bits = 0; (j < num) && in[inOffset + j] < (1 << S16_BITS[numIdx][j]); ) { - out[outOffset] |= (in[inOffset + j] << bits); - bits += S16_BITS[numIdx][j]; - j++; - } - - if (j == num) { + public static final int s16DecompressWithIntBufferBackup( + final int[] out, int outOffset, final int value, final int n) { + int j = 0, shift; + final int numIdx = value >>> S16_BITSSIZE; + final int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; + int s16Bits; + for (shift = 0; j < num; ++j) { + s16Bits = S16_BITS[numIdx][j]; + out[outOffset++] = (value >>> shift) + & (0xffffffff >>> (32 - s16Bits)); + shift += s16Bits; + } return num; - } } - return -1; - } - - /** - * Decompress an integer array using Simple16 - * - * @param out the decompressed output - * @param outOffset the offset of the output in the number of integers - * @param in the compressed input array - * @param inOffset the offset of the input in the number of integers - * @param n the number of elements to be compressed - * @return the number of processed integers - */ - public static final int s16Decompress(int[] out, int outOffset, int[] in, int inOffset, int n) { - int numIdx, j = 0, bits = 0; - numIdx = in[inOffset] >>> S16_BITSSIZE; - int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; - for (j = 0, bits = 0; j < num; j++) { - out[outOffset + j] = readBitsForS16(in, inOffset, bits, S16_BITS[numIdx][j]); - bits += S16_BITS[numIdx][j]; + public static final int s16DecompressWithIntBuffer(final int[] out, + int outOffset, final int value, final int n) { + int j = 0, shift; + final int numIdx = value >>> S16_BITSSIZE; + + final int num = S16_NUM[numIdx]; + int s16Bits; + for (shift = 0; j < num; ++j) { + s16Bits = S16_BITS[numIdx][j]; + out[outOffset++] = (value >>> shift) + & (0xffffffff >>> (32 - s16Bits)); + shift += s16Bits; + } + return num; } - return num; - } - public static final int s16DecompressWithIntBufferBackup(final int[] out, int outOffset, final int value, final int n) { - int j = 0, shift; - final int numIdx = value >>> S16_BITSSIZE; - final int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; - int s16Bits; - for (shift = 0; j < num; ++j) { - s16Bits = S16_BITS[numIdx][j]; - out[outOffset++] = (value >>> shift) & (0xffffffff >>> (32 - s16Bits)); - shift += s16Bits; + public static final int s16DecompressWithIntBufferWithHardCodes( + final int[] out, int outOffset, final int value, final int n) { + final int numIdx = value >>> S16_BITSSIZE; + return s16DecompressOneNumberWithHardCodes(out, outOffset, + value, numIdx); } - return num; - } - - public static final int s16DecompressWithIntBuffer(final int[] out, int outOffset, final int value, final int n) { - int j = 0, shift; - final int numIdx = value >>> S16_BITSSIZE; - final int num = S16_NUM[numIdx]; - int s16Bits; - for (shift = 0; j < num; ++j) { - s16Bits = S16_BITS[numIdx][j]; - out[outOffset++] = (value >>> shift) & (0xffffffff >>> (32 - s16Bits)); - shift += s16Bits; + public static final int s16DecompressWithIntBufferIntegrated( + final int[] out, int outOffset, final int value, final int n, + int[] expPos, int oribits) { + int j = 0, shift = 0; + final int numIdx = value >>> S16_BITSSIZE; + + final int num = S16_NUM[numIdx]; + int s16Bits; + for (; j < num; ++j) { + s16Bits = S16_BITS[numIdx][j]; + out[expPos[outOffset + j]] |= (((value >>> shift) & (0xffffffff >>> (32 - s16Bits))) << oribits); + shift += s16Bits; + } + return num; } - return num; - } - - public static final int s16DecompressWithIntBufferWithHardCodes(final int[] out, int outOffset, final int value, final int n) { - final int numIdx = value >>> S16_BITSSIZE; - return s16DecompressOneNumberWithHardCodes(out, outOffset, value, numIdx); - } - - public static final int s16DecompressWithIntBufferIntegrated(final int[] out, int outOffset, final int value, final int n, int[] expPos, int oribits) { - int j = 0, shift = 0; - final int numIdx = value >>> S16_BITSSIZE; - - final int num = S16_NUM[numIdx]; - int s16Bits; - for (; j < num; ++j) { - s16Bits = S16_BITS[numIdx][j]; - out[expPos[outOffset + j]] |= (((value >>> shift) & (0xffffffff >>> (32 - s16Bits))) << oribits); - shift += s16Bits; + public static final int s16DecompressWithIntBufferIntegrated2( + final int[] out, int outOffset, final int value, final int n, + int[] expPos, int oribits) { + final int numIdx = value >>> S16_BITSSIZE; + return s16DecompressOneNumberWithHardCodesIntegrated(out, + outOffset, value, numIdx, oribits, expPos); } - return num; - } - public static final int s16DecompressWithIntBufferIntegrated2(final int[] out, int outOffset, final int value, final int n, int[] expPos, int oribits) { - final int numIdx = value >>> S16_BITSSIZE; - return s16DecompressOneNumberWithHardCodesIntegrated(out, outOffset, value, numIdx, oribits, expPos); - } - - - public static final int s16DecompressWithIntBufferIntegratedBackup(final int[] out, int outOffset, final int value, final int n, int[] expPos, int oribits) { - int j = 0, shift = 0; - final int numIdx = value >>> S16_BITSSIZE; - final int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; - int s16Bits; - for (; j < num; ++j, ++outOffset) { - s16Bits = S16_BITS[numIdx][j]; - out[expPos[outOffset]] |= (((value >>> shift) & (0xffffffff >>> (32 - s16Bits))) << oribits); - shift += s16Bits; + public static final int s16DecompressWithIntBufferIntegratedBackup( + final int[] out, int outOffset, final int value, final int n, + int[] expPos, int oribits) { + int j = 0, shift = 0; + final int numIdx = value >>> S16_BITSSIZE; + final int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; + int s16Bits; + for (; j < num; ++j, ++outOffset) { + s16Bits = S16_BITS[numIdx][j]; + out[expPos[outOffset]] |= (((value >>> shift) & (0xffffffff >>> (32 - s16Bits))) << oribits); + shift += s16Bits; + } + return num; } - return num; - } - public static int s16DecompressOneNumberWithHardCodes(int[] out, int outOffset, int value, int numIdx) { - switch (numIdx) { - case 0: { - out[outOffset] = value & 0x00000001; - out[outOffset + 1] = (value >>> 1) & 0x00000001; - out[outOffset + 2] = (value >>> 2) & 0x00000001; - out[outOffset + 3] = (value >>> 3) & 0x00000001; - out[outOffset + 4] = (value >>> 4) & 0x00000001; - out[outOffset + 5] = (value >>> 5) & 0x00000001; - out[outOffset + 6] = (value >>> 6) & 0x00000001; - out[outOffset + 7] = (value >>> 7) & 0x00000001; - out[outOffset + 8] = (value >>> 8) & 0x00000001; - out[outOffset + 9] = (value >>> 9) & 0x00000001; - out[outOffset + 10] = (value >>> 10) & 0x00000001; - out[outOffset + 11] = (value >>> 11) & 0x00000001; - out[outOffset + 12] = (value >>> 12) & 0x00000001; - out[outOffset + 13] = (value >>> 13) & 0x00000001; - out[outOffset + 14] = (value >>> 14) & 0x00000001; - out[outOffset + 15] = (value >>> 15) & 0x00000001; - out[outOffset + 16] = (value >>> 16) & 0x00000001; - out[outOffset + 17] = (value >>> 17) & 0x00000001; - out[outOffset + 18] = (value >>> 18) & 0x00000001; - out[outOffset + 19] = (value >>> 19) & 0x00000001; - out[outOffset + 20] = (value >>> 20) & 0x00000001; - out[outOffset + 21] = (value >>> 21) & 0x00000001; - out[outOffset + 22] = (value >>> 22) & 0x00000001; - out[outOffset + 23] = (value >>> 23) & 0x00000001; - out[outOffset + 24] = (value >>> 24) & 0x00000001; - out[outOffset + 25] = (value >>> 25) & 0x00000001; - out[outOffset + 26] = (value >>> 26) & 0x00000001; - out[outOffset + 27] = (value >>> 27) & 0x00000001; - return 28; - } - case 1: { - out[outOffset] = value & 0x00000003; - out[outOffset + 1] = (value >>> 2) & 0x00000003; - out[outOffset + 2] = (value >>> 4) & 0x00000003; - out[outOffset + 3] = (value >>> 6) & 0x00000003; - out[outOffset + 4] = (value >>> 8) & 0x00000003; - out[outOffset + 5] = (value >>> 10) & 0x00000003; - out[outOffset + 6] = (value >>> 12) & 0x00000003; - out[outOffset + 7] = (value >>> 14) & 0x00000001; - out[outOffset + 8] = (value >>> 15) & 0x00000001; - out[outOffset + 9] = (value >>> 16) & 0x00000001; - out[outOffset + 10] = (value >>> 17) & 0x00000001; - out[outOffset + 11] = (value >>> 18) & 0x00000001; - out[outOffset + 12] = (value >>> 19) & 0x00000001; - out[outOffset + 13] = (value >>> 20) & 0x00000001; - out[outOffset + 14] = (value >>> 21) & 0x00000001; - out[outOffset + 15] = (value >>> 22) & 0x00000001; - out[outOffset + 16] = (value >>> 23) & 0x00000001; - out[outOffset + 17] = (value >>> 24) & 0x00000001; - out[outOffset + 18] = (value >>> 25) & 0x00000001; - out[outOffset + 19] = (value >>> 26) & 0x00000001; - out[outOffset + 20] = (value >>> 27) & 0x00000001; - return 21; - } - case 2: { - out[outOffset] = value & 0x00000001; - out[outOffset + 1] = (value >>> 1) & 0x00000001; - out[outOffset + 2] = (value >>> 2) & 0x00000001; - out[outOffset + 3] = (value >>> 3) & 0x00000001; - out[outOffset + 4] = (value >>> 4) & 0x00000001; - out[outOffset + 5] = (value >>> 5) & 0x00000001; - out[outOffset + 6] = (value >>> 6) & 0x00000001; - out[outOffset + 7] = (value >>> 7) & 0x00000003; - out[outOffset + 8] = (value >>> 9) & 0x00000003; - out[outOffset + 9] = (value >>> 11) & 0x00000003; - out[outOffset + 10] = (value >>> 13) & 0x00000003; - out[outOffset + 11] = (value >>> 15) & 0x00000003; - out[outOffset + 12] = (value >>> 17) & 0x00000003; - out[outOffset + 13] = (value >>> 19) & 0x00000003; - out[outOffset + 14] = (value >>> 21) & 0x00000001; - out[outOffset + 15] = (value >>> 22) & 0x00000001; - out[outOffset + 16] = (value >>> 23) & 0x00000001; - out[outOffset + 17] = (value >>> 24) & 0x00000001; - out[outOffset + 18] = (value >>> 25) & 0x00000001; - out[outOffset + 19] = (value >>> 26) & 0x00000001; - out[outOffset + 20] = (value >>> 27) & 0x00000001; - return 21; - } - case 3: { - out[outOffset] = value & 0x00000001; - out[outOffset + 1] = (value >>> 1) & 0x00000001; - out[outOffset + 2] = (value >>> 2) & 0x00000001; - out[outOffset + 3] = (value >>> 3) & 0x00000001; - out[outOffset + 4] = (value >>> 4) & 0x00000001; - out[outOffset + 5] = (value >>> 5) & 0x00000001; - out[outOffset + 6] = (value >>> 6) & 0x00000001; - out[outOffset + 7] = (value >>> 7) & 0x00000001; - out[outOffset + 8] = (value >>> 8) & 0x00000001; - out[outOffset + 9] = (value >>> 9) & 0x00000001; - out[outOffset + 10] = (value >>> 10) & 0x00000001; - out[outOffset + 11] = (value >>> 11) & 0x00000001; - out[outOffset + 12] = (value >>> 12) & 0x00000001; - out[outOffset + 13] = (value >>> 13) & 0x00000001; - out[outOffset + 14] = (value >>> 14) & 0x00000003; - out[outOffset + 15] = (value >>> 16) & 0x00000003; - out[outOffset + 16] = (value >>> 18) & 0x00000003; - out[outOffset + 17] = (value >>> 20) & 0x00000003; - out[outOffset + 18] = (value >>> 22) & 0x00000003; - out[outOffset + 19] = (value >>> 24) & 0x00000003; - out[outOffset + 20] = (value >>> 26) & 0x00000003; - return 21; - } - case 4: { - out[outOffset] = value & 0x00000003; - out[outOffset + 1] = (value >>> 2) & 0x00000003; - out[outOffset + 2] = (value >>> 4) & 0x00000003; - out[outOffset + 3] = (value >>> 6) & 0x00000003; - out[outOffset + 4] = (value >>> 8) & 0x00000003; - out[outOffset + 5] = (value >>> 10) & 0x00000003; - out[outOffset + 6] = (value >>> 12) & 0x00000003; - out[outOffset + 7] = (value >>> 14) & 0x00000003; - out[outOffset + 8] = (value >>> 16) & 0x00000003; - out[outOffset + 9] = (value >>> 18) & 0x00000003; - out[outOffset + 10] = (value >>> 20) & 0x00000003; - out[outOffset + 11] = (value >>> 22) & 0x00000003; - out[outOffset + 12] = (value >>> 24) & 0x00000003; - out[outOffset + 13] = (value >>> 26) & 0x00000003; - return 14; - } - case 5: { - out[outOffset] = value & 0x0000000f; - out[outOffset + 1] = (value >>> 4) & 0x00000007; - out[outOffset + 2] = (value >>> 7) & 0x00000007; - out[outOffset + 3] = (value >>> 10) & 0x00000007; - out[outOffset + 4] = (value >>> 13) & 0x00000007; - out[outOffset + 5] = (value >>> 16) & 0x00000007; - out[outOffset + 6] = (value >>> 19) & 0x00000007; - out[outOffset + 7] = (value >>> 22) & 0x00000007; - out[outOffset + 8] = (value >>> 25) & 0x00000007; - return 9; - } - case 6: { - out[outOffset] = value & 0x00000007; - out[outOffset + 1] = (value >>> 3) & 0x0000000f; - out[outOffset + 2] = (value >>> 7) & 0x0000000f; - out[outOffset + 3] = (value >>> 11) & 0x0000000f; - out[outOffset + 4] = (value >>> 15) & 0x0000000f; - out[outOffset + 5] = (value >>> 19) & 0x00000007; - out[outOffset + 6] = (value >>> 22) & 0x00000007; - out[outOffset + 7] = (value >>> 25) & 0x00000007; - return 8; - } - case 7: { - out[outOffset] = value & 0x0000000f; - out[outOffset + 1] = (value >>> 4) & 0x0000000f; - out[outOffset + 2] = (value >>> 8) & 0x0000000f; - out[outOffset + 3] = (value >>> 12) & 0x0000000f; - out[outOffset + 4] = (value >>> 16) & 0x0000000f; - out[outOffset + 5] = (value >>> 20) & 0x0000000f; - out[outOffset + 6] = (value >>> 24) & 0x0000000f; - return 7; - } - case 8: { - out[outOffset] = value & 0x0000001f; - out[outOffset + 1] = (value >>> 5) & 0x0000001f; - out[outOffset + 2] = (value >>> 10) & 0x0000001f; - out[outOffset + 3] = (value >>> 15) & 0x0000001f; - out[outOffset + 4] = (value >>> 20) & 0x0000000f; - out[outOffset + 5] = (value >>> 24) & 0x0000000f; - return 6; - } - case 9: { - out[outOffset] = value & 0x0000000f; - out[outOffset + 1] = (value >>> 4) & 0x0000000f; - out[outOffset + 2] = (value >>> 8) & 0x0000001f; - out[outOffset + 3] = (value >>> 13) & 0x0000001f; - out[outOffset + 4] = (value >>> 18) & 0x0000001f; - out[outOffset + 5] = (value >>> 23) & 0x0000001f; - return 6; - } - case 10: { - out[outOffset] = value & 0x0000003f; - out[outOffset + 1] = (value >>> 6) & 0x0000003f; - out[outOffset + 2] = (value >>> 12) & 0x0000003f; - out[outOffset + 3] = (value >>> 18) & 0x0000001f; - out[outOffset + 4] = (value >>> 23) & 0x0000001f; - return 5; - } - case 11: { - out[outOffset] = value & 0x0000001f; - out[outOffset + 1] = (value >>> 5) & 0x0000001f; - out[outOffset + 2] = (value >>> 10) & 0x0000003f; - out[outOffset + 3] = (value >>> 16) & 0x0000003f; - out[outOffset + 4] = (value >>> 22) & 0x0000003f; - return 5; - } - case 12: { - out[outOffset] = value & 0x0000007f; - out[outOffset + 1] = (value >>> 7) & 0x0000007f; - out[outOffset + 2] = (value >>> 14) & 0x0000007f; - out[outOffset + 3] = (value >>> 21) & 0x0000007f; - return 4; - } - case 13: { - out[outOffset] = value & 0x000003ff; - out[outOffset + 1] = (value >>> 10) & 0x000001ff; - out[outOffset + 2] = (value >>> 19) & 0x000001ff; - return 3; - } - case 14: { - out[outOffset] = value & 0x00003fff; - out[outOffset + 1] = (value >>> 14) & 0x00003fff; - return 2; - } - case 15: { - out[outOffset] = value & 0x0fffffff; - return 1; - } - default: - return -1; + public static int s16DecompressOneNumberWithHardCodes(int[] out, + int outOffset, int value, int numIdx) { + switch (numIdx) { + case 0: { + out[outOffset] = value & 0x00000001; + out[outOffset + 1] = (value >>> 1) & 0x00000001; + out[outOffset + 2] = (value >>> 2) & 0x00000001; + out[outOffset + 3] = (value >>> 3) & 0x00000001; + out[outOffset + 4] = (value >>> 4) & 0x00000001; + out[outOffset + 5] = (value >>> 5) & 0x00000001; + out[outOffset + 6] = (value >>> 6) & 0x00000001; + out[outOffset + 7] = (value >>> 7) & 0x00000001; + out[outOffset + 8] = (value >>> 8) & 0x00000001; + out[outOffset + 9] = (value >>> 9) & 0x00000001; + out[outOffset + 10] = (value >>> 10) & 0x00000001; + out[outOffset + 11] = (value >>> 11) & 0x00000001; + out[outOffset + 12] = (value >>> 12) & 0x00000001; + out[outOffset + 13] = (value >>> 13) & 0x00000001; + out[outOffset + 14] = (value >>> 14) & 0x00000001; + out[outOffset + 15] = (value >>> 15) & 0x00000001; + out[outOffset + 16] = (value >>> 16) & 0x00000001; + out[outOffset + 17] = (value >>> 17) & 0x00000001; + out[outOffset + 18] = (value >>> 18) & 0x00000001; + out[outOffset + 19] = (value >>> 19) & 0x00000001; + out[outOffset + 20] = (value >>> 20) & 0x00000001; + out[outOffset + 21] = (value >>> 21) & 0x00000001; + out[outOffset + 22] = (value >>> 22) & 0x00000001; + out[outOffset + 23] = (value >>> 23) & 0x00000001; + out[outOffset + 24] = (value >>> 24) & 0x00000001; + out[outOffset + 25] = (value >>> 25) & 0x00000001; + out[outOffset + 26] = (value >>> 26) & 0x00000001; + out[outOffset + 27] = (value >>> 27) & 0x00000001; + return 28; + } + case 1: { + out[outOffset] = value & 0x00000003; + out[outOffset + 1] = (value >>> 2) & 0x00000003; + out[outOffset + 2] = (value >>> 4) & 0x00000003; + out[outOffset + 3] = (value >>> 6) & 0x00000003; + out[outOffset + 4] = (value >>> 8) & 0x00000003; + out[outOffset + 5] = (value >>> 10) & 0x00000003; + out[outOffset + 6] = (value >>> 12) & 0x00000003; + out[outOffset + 7] = (value >>> 14) & 0x00000001; + out[outOffset + 8] = (value >>> 15) & 0x00000001; + out[outOffset + 9] = (value >>> 16) & 0x00000001; + out[outOffset + 10] = (value >>> 17) & 0x00000001; + out[outOffset + 11] = (value >>> 18) & 0x00000001; + out[outOffset + 12] = (value >>> 19) & 0x00000001; + out[outOffset + 13] = (value >>> 20) & 0x00000001; + out[outOffset + 14] = (value >>> 21) & 0x00000001; + out[outOffset + 15] = (value >>> 22) & 0x00000001; + out[outOffset + 16] = (value >>> 23) & 0x00000001; + out[outOffset + 17] = (value >>> 24) & 0x00000001; + out[outOffset + 18] = (value >>> 25) & 0x00000001; + out[outOffset + 19] = (value >>> 26) & 0x00000001; + out[outOffset + 20] = (value >>> 27) & 0x00000001; + return 21; + } + case 2: { + out[outOffset] = value & 0x00000001; + out[outOffset + 1] = (value >>> 1) & 0x00000001; + out[outOffset + 2] = (value >>> 2) & 0x00000001; + out[outOffset + 3] = (value >>> 3) & 0x00000001; + out[outOffset + 4] = (value >>> 4) & 0x00000001; + out[outOffset + 5] = (value >>> 5) & 0x00000001; + out[outOffset + 6] = (value >>> 6) & 0x00000001; + out[outOffset + 7] = (value >>> 7) & 0x00000003; + out[outOffset + 8] = (value >>> 9) & 0x00000003; + out[outOffset + 9] = (value >>> 11) & 0x00000003; + out[outOffset + 10] = (value >>> 13) & 0x00000003; + out[outOffset + 11] = (value >>> 15) & 0x00000003; + out[outOffset + 12] = (value >>> 17) & 0x00000003; + out[outOffset + 13] = (value >>> 19) & 0x00000003; + out[outOffset + 14] = (value >>> 21) & 0x00000001; + out[outOffset + 15] = (value >>> 22) & 0x00000001; + out[outOffset + 16] = (value >>> 23) & 0x00000001; + out[outOffset + 17] = (value >>> 24) & 0x00000001; + out[outOffset + 18] = (value >>> 25) & 0x00000001; + out[outOffset + 19] = (value >>> 26) & 0x00000001; + out[outOffset + 20] = (value >>> 27) & 0x00000001; + return 21; + } + case 3: { + out[outOffset] = value & 0x00000001; + out[outOffset + 1] = (value >>> 1) & 0x00000001; + out[outOffset + 2] = (value >>> 2) & 0x00000001; + out[outOffset + 3] = (value >>> 3) & 0x00000001; + out[outOffset + 4] = (value >>> 4) & 0x00000001; + out[outOffset + 5] = (value >>> 5) & 0x00000001; + out[outOffset + 6] = (value >>> 6) & 0x00000001; + out[outOffset + 7] = (value >>> 7) & 0x00000001; + out[outOffset + 8] = (value >>> 8) & 0x00000001; + out[outOffset + 9] = (value >>> 9) & 0x00000001; + out[outOffset + 10] = (value >>> 10) & 0x00000001; + out[outOffset + 11] = (value >>> 11) & 0x00000001; + out[outOffset + 12] = (value >>> 12) & 0x00000001; + out[outOffset + 13] = (value >>> 13) & 0x00000001; + out[outOffset + 14] = (value >>> 14) & 0x00000003; + out[outOffset + 15] = (value >>> 16) & 0x00000003; + out[outOffset + 16] = (value >>> 18) & 0x00000003; + out[outOffset + 17] = (value >>> 20) & 0x00000003; + out[outOffset + 18] = (value >>> 22) & 0x00000003; + out[outOffset + 19] = (value >>> 24) & 0x00000003; + out[outOffset + 20] = (value >>> 26) & 0x00000003; + return 21; + } + case 4: { + out[outOffset] = value & 0x00000003; + out[outOffset + 1] = (value >>> 2) & 0x00000003; + out[outOffset + 2] = (value >>> 4) & 0x00000003; + out[outOffset + 3] = (value >>> 6) & 0x00000003; + out[outOffset + 4] = (value >>> 8) & 0x00000003; + out[outOffset + 5] = (value >>> 10) & 0x00000003; + out[outOffset + 6] = (value >>> 12) & 0x00000003; + out[outOffset + 7] = (value >>> 14) & 0x00000003; + out[outOffset + 8] = (value >>> 16) & 0x00000003; + out[outOffset + 9] = (value >>> 18) & 0x00000003; + out[outOffset + 10] = (value >>> 20) & 0x00000003; + out[outOffset + 11] = (value >>> 22) & 0x00000003; + out[outOffset + 12] = (value >>> 24) & 0x00000003; + out[outOffset + 13] = (value >>> 26) & 0x00000003; + return 14; + } + case 5: { + out[outOffset] = value & 0x0000000f; + out[outOffset + 1] = (value >>> 4) & 0x00000007; + out[outOffset + 2] = (value >>> 7) & 0x00000007; + out[outOffset + 3] = (value >>> 10) & 0x00000007; + out[outOffset + 4] = (value >>> 13) & 0x00000007; + out[outOffset + 5] = (value >>> 16) & 0x00000007; + out[outOffset + 6] = (value >>> 19) & 0x00000007; + out[outOffset + 7] = (value >>> 22) & 0x00000007; + out[outOffset + 8] = (value >>> 25) & 0x00000007; + return 9; + } + case 6: { + out[outOffset] = value & 0x00000007; + out[outOffset + 1] = (value >>> 3) & 0x0000000f; + out[outOffset + 2] = (value >>> 7) & 0x0000000f; + out[outOffset + 3] = (value >>> 11) & 0x0000000f; + out[outOffset + 4] = (value >>> 15) & 0x0000000f; + out[outOffset + 5] = (value >>> 19) & 0x00000007; + out[outOffset + 6] = (value >>> 22) & 0x00000007; + out[outOffset + 7] = (value >>> 25) & 0x00000007; + return 8; + } + case 7: { + out[outOffset] = value & 0x0000000f; + out[outOffset + 1] = (value >>> 4) & 0x0000000f; + out[outOffset + 2] = (value >>> 8) & 0x0000000f; + out[outOffset + 3] = (value >>> 12) & 0x0000000f; + out[outOffset + 4] = (value >>> 16) & 0x0000000f; + out[outOffset + 5] = (value >>> 20) & 0x0000000f; + out[outOffset + 6] = (value >>> 24) & 0x0000000f; + return 7; + } + case 8: { + out[outOffset] = value & 0x0000001f; + out[outOffset + 1] = (value >>> 5) & 0x0000001f; + out[outOffset + 2] = (value >>> 10) & 0x0000001f; + out[outOffset + 3] = (value >>> 15) & 0x0000001f; + out[outOffset + 4] = (value >>> 20) & 0x0000000f; + out[outOffset + 5] = (value >>> 24) & 0x0000000f; + return 6; + } + case 9: { + out[outOffset] = value & 0x0000000f; + out[outOffset + 1] = (value >>> 4) & 0x0000000f; + out[outOffset + 2] = (value >>> 8) & 0x0000001f; + out[outOffset + 3] = (value >>> 13) & 0x0000001f; + out[outOffset + 4] = (value >>> 18) & 0x0000001f; + out[outOffset + 5] = (value >>> 23) & 0x0000001f; + return 6; + } + case 10: { + out[outOffset] = value & 0x0000003f; + out[outOffset + 1] = (value >>> 6) & 0x0000003f; + out[outOffset + 2] = (value >>> 12) & 0x0000003f; + out[outOffset + 3] = (value >>> 18) & 0x0000001f; + out[outOffset + 4] = (value >>> 23) & 0x0000001f; + return 5; + } + case 11: { + out[outOffset] = value & 0x0000001f; + out[outOffset + 1] = (value >>> 5) & 0x0000001f; + out[outOffset + 2] = (value >>> 10) & 0x0000003f; + out[outOffset + 3] = (value >>> 16) & 0x0000003f; + out[outOffset + 4] = (value >>> 22) & 0x0000003f; + return 5; + } + case 12: { + out[outOffset] = value & 0x0000007f; + out[outOffset + 1] = (value >>> 7) & 0x0000007f; + out[outOffset + 2] = (value >>> 14) & 0x0000007f; + out[outOffset + 3] = (value >>> 21) & 0x0000007f; + return 4; + } + case 13: { + out[outOffset] = value & 0x000003ff; + out[outOffset + 1] = (value >>> 10) & 0x000001ff; + out[outOffset + 2] = (value >>> 19) & 0x000001ff; + return 3; + } + case 14: { + out[outOffset] = value & 0x00003fff; + out[outOffset + 1] = (value >>> 14) & 0x00003fff; + return 2; + } + case 15: { + out[outOffset] = value & 0x0fffffff; + return 1; + } + default: + return -1; + } } - } - - public static int s16DecompressOneNumberWithHardCodesIntegrated(int[] out, int outOffset, int value, int numIdx, int oribits, int[] expPos) { - switch (numIdx) { - case 0: { - out[expPos[outOffset]] |= ((value & 0x00000001) << oribits); - out[expPos[outOffset + 1]] |= (((value >>> 1) & 0x00000001) << oribits); - out[expPos[outOffset + 2]] |= (((value >>> 2) & 0x00000001) << oribits); - out[expPos[outOffset + 3]] |= (((value >>> 3) & 0x00000001) << oribits); - out[expPos[outOffset + 4]] |= (((value >>> 4) & 0x00000001) << oribits); - out[expPos[outOffset + 5]] |= (((value >>> 5) & 0x00000001) << oribits); - out[expPos[outOffset + 6]] |= (((value >>> 6) & 0x00000001) << oribits); - out[expPos[outOffset + 7]] |= (((value >>> 7) & 0x00000001) << oribits); - out[expPos[outOffset + 8]] |= (((value >>> 8) & 0x00000001) << oribits); - out[expPos[outOffset + 9]] |= (((value >>> 9) & 0x00000001) << oribits); - out[expPos[outOffset + 10]] |= (((value >>> 10) & 0x00000001) << oribits); - out[expPos[outOffset + 11]] |= (((value >>> 11) & 0x00000001) << oribits); - out[expPos[outOffset + 12]] |= (((value >>> 12) & 0x00000001) << oribits); - out[expPos[outOffset + 13]] |= (((value >>> 13) & 0x00000001) << oribits); - out[expPos[outOffset + 14]] |= (((value >>> 14) & 0x00000001) << oribits); - out[expPos[outOffset + 15]] |= (((value >>> 15) & 0x00000001) << oribits); - out[expPos[outOffset + 16]] |= (((value >>> 16) & 0x00000001) << oribits); - out[expPos[outOffset + 17]] |= (((value >>> 17) & 0x00000001) << oribits); - out[expPos[outOffset + 18]] |= (((value >>> 18) & 0x00000001) << oribits); - out[expPos[outOffset + 19]] |= (((value >>> 19) & 0x00000001) << oribits); - out[expPos[outOffset + 20]] |= (((value >>> 20) & 0x00000001) << oribits); - out[expPos[outOffset + 21]] |= (((value >>> 21) & 0x00000001) << oribits); - out[expPos[outOffset + 22]] |= (((value >>> 22) & 0x00000001) << oribits); - out[expPos[outOffset + 23]] |= (((value >>> 23) & 0x00000001) << oribits); - out[expPos[outOffset + 24]] |= (((value >>> 24) & 0x00000001) << oribits); - out[expPos[outOffset + 25]] |= (((value >>> 25) & 0x00000001) << oribits); - out[expPos[outOffset + 26]] |= (((value >>> 26) & 0x00000001) << oribits); - out[expPos[outOffset + 27]] |= (((value >>> 27) & 0x00000001) << oribits); - return 28; - } - case 1: { - out[expPos[outOffset]] |= ((value & 0x00000003) << oribits); - out[expPos[outOffset + 1]] |= (((value >>> 2) & 0x00000003) << oribits); - out[expPos[outOffset + 2]] |= (((value >>> 4) & 0x00000003) << oribits); - out[expPos[outOffset + 3]] |= (((value >>> 6) & 0x00000003) << oribits); - out[expPos[outOffset + 4]] |= (((value >>> 8) & 0x00000003) << oribits); - out[expPos[outOffset + 5]] |= (((value >>> 10) & 0x00000003) << oribits); - out[expPos[outOffset + 6]] |= (((value >>> 12) & 0x00000003) << oribits); - out[expPos[outOffset + 7]] |= (((value >>> 14) & 0x00000001) << oribits); - out[expPos[outOffset + 8]] |= (((value >>> 15) & 0x00000001) << oribits); - out[expPos[outOffset + 9]] |= (((value >>> 16) & 0x00000001) << oribits); - out[expPos[outOffset + 10]] |= (((value >>> 17) & 0x00000001) << oribits); - out[expPos[outOffset + 11]] |= (((value >>> 18) & 0x00000001) << oribits); - out[expPos[outOffset + 12]] |= (((value >>> 19) & 0x00000001) << oribits); - out[expPos[outOffset + 13]] |= (((value >>> 20) & 0x00000001) << oribits); - out[expPos[outOffset + 14]] |= (((value >>> 21) & 0x00000001) << oribits); - out[expPos[outOffset + 15]] |= (((value >>> 22) & 0x00000001) << oribits); - out[expPos[outOffset + 16]] |= (((value >>> 23) & 0x00000001) << oribits); - out[expPos[outOffset + 17]] |= (((value >>> 24) & 0x00000001) << oribits); - out[expPos[outOffset + 18]] |= (((value >>> 25) & 0x00000001) << oribits); - out[expPos[outOffset + 19]] |= (((value >>> 26) & 0x00000001) << oribits); - out[expPos[outOffset + 20]] |= (((value >>> 27) & 0x00000001) << oribits); - return 21; - } - case 2: { - out[expPos[outOffset]] |= ((value & 0x00000001) << oribits); - out[expPos[outOffset + 1]] |= (((value >>> 1) & 0x00000001) << oribits); - out[expPos[outOffset + 2]] |= (((value >>> 2) & 0x00000001) << oribits); - out[expPos[outOffset + 3]] |= (((value >>> 3) & 0x00000001) << oribits); - out[expPos[outOffset + 4]] |= (((value >>> 4) & 0x00000001) << oribits); - out[expPos[outOffset + 5]] |= (((value >>> 5) & 0x00000001) << oribits); - out[expPos[outOffset + 6]] |= (((value >>> 6) & 0x00000001) << oribits); - out[expPos[outOffset + 7]] |= (((value >>> 7) & 0x00000003) << oribits); - out[expPos[outOffset + 8]] |= (((value >>> 9) & 0x00000003) << oribits); - out[expPos[outOffset + 9]] |= (((value >>> 11) & 0x00000003) << oribits); - out[expPos[outOffset + 10]] |= (((value >>> 13) & 0x00000003) << oribits); - out[expPos[outOffset + 11]] |= (((value >>> 15) & 0x00000003) << oribits); - out[expPos[outOffset + 12]] |= (((value >>> 17) & 0x00000003) << oribits); - out[expPos[outOffset + 13]] |= (((value >>> 19) & 0x00000003) << oribits); - out[expPos[outOffset + 14]] |= (((value >>> 21) & 0x00000001) << oribits); - out[expPos[outOffset + 15]] |= (((value >>> 22) & 0x00000001) << oribits); - out[expPos[outOffset + 16]] |= (((value >>> 23) & 0x00000001) << oribits); - out[expPos[outOffset + 17]] |= (((value >>> 24) & 0x00000001) << oribits); - out[expPos[outOffset + 18]] |= (((value >>> 25) & 0x00000001) << oribits); - out[expPos[outOffset + 19]] |= (((value >>> 26) & 0x00000001) << oribits); - out[expPos[outOffset + 20]] |= (((value >>> 27) & 0x00000001) << oribits); - return 21; - } - case 3: { - out[expPos[outOffset]] |= ((value & 0x00000001) << oribits); - out[expPos[outOffset + 1]] |= (((value >>> 1) & 0x00000001) << oribits); - out[expPos[outOffset + 2]] |= (((value >>> 2) & 0x00000001) << oribits); - out[expPos[outOffset + 3]] |= (((value >>> 3) & 0x00000001) << oribits); - out[expPos[outOffset + 4]] |= (((value >>> 4) & 0x00000001) << oribits); - out[expPos[outOffset + 5]] |= (((value >>> 5) & 0x00000001) << oribits); - out[expPos[outOffset + 6]] |= (((value >>> 6) & 0x00000001) << oribits); - out[expPos[outOffset + 7]] |= (((value >>> 7) & 0x00000001) << oribits); - out[expPos[outOffset + 8]] |= (((value >>> 8) & 0x00000001) << oribits); - out[expPos[outOffset + 9]] |= (((value >>> 9) & 0x00000001) << oribits); - out[expPos[outOffset + 10]] |= (((value >>> 10) & 0x00000001) << oribits); - out[expPos[outOffset + 11]] |= (((value >>> 11) & 0x00000001) << oribits); - out[expPos[outOffset + 12]] |= (((value >>> 12) & 0x00000001) << oribits); - out[expPos[outOffset + 13]] |= (((value >>> 13) & 0x00000001) << oribits); - out[expPos[outOffset + 14]] |= (((value >>> 14) & 0x00000003) << oribits); - out[expPos[outOffset + 15]] |= (((value >>> 16) & 0x00000003) << oribits); - out[expPos[outOffset + 16]] |= (((value >>> 18) & 0x00000003) << oribits); - out[expPos[outOffset + 17]] |= (((value >>> 20) & 0x00000003) << oribits); - out[expPos[outOffset + 18]] |= (((value >>> 22) & 0x00000003) << oribits); - out[expPos[outOffset + 19]] |= (((value >>> 24) & 0x00000003) << oribits); - out[expPos[outOffset + 20]] |= (((value >>> 26) & 0x00000003) << oribits); - return 21; - } - case 4: { - out[expPos[outOffset]] |= ((value & 0x00000003) << oribits); - out[expPos[outOffset + 1]] |= (((value >>> 2) & 0x00000003) << oribits); - out[expPos[outOffset + 2]] |= (((value >>> 4) & 0x00000003) << oribits); - out[expPos[outOffset + 3]] |= (((value >>> 6) & 0x00000003) << oribits); - out[expPos[outOffset + 4]] |= (((value >>> 8) & 0x00000003) << oribits); - out[expPos[outOffset + 5]] |= (((value >>> 10) & 0x00000003) << oribits); - out[expPos[outOffset + 6]] |= (((value >>> 12) & 0x00000003) << oribits); - out[expPos[outOffset + 7]] |= (((value >>> 14) & 0x00000003) << oribits); - out[expPos[outOffset + 8]] |= (((value >>> 16) & 0x00000003) << oribits); - out[expPos[outOffset + 9]] |= (((value >>> 18) & 0x00000003) << oribits); - out[expPos[outOffset + 10]] |= (((value >>> 20) & 0x00000003) << oribits); - out[expPos[outOffset + 11]] |= (((value >>> 22) & 0x00000003) << oribits); - out[expPos[outOffset + 12]] |= (((value >>> 24) & 0x00000003) << oribits); - out[expPos[outOffset + 13]] |= (((value >>> 26) & 0x00000003) << oribits); - return 14; - } - case 5: { - out[expPos[outOffset]] |= ((value & 0x0000000f) << oribits); - out[expPos[outOffset + 1]] |= (((value >>> 4) & 0x00000007) << oribits); - out[expPos[outOffset + 2]] |= (((value >>> 7) & 0x00000007) << oribits); - out[expPos[outOffset + 3]] |= (((value >>> 10) & 0x00000007) << oribits); - out[expPos[outOffset + 4]] |= (((value >>> 13) & 0x00000007) << oribits); - out[expPos[outOffset + 5]] |= (((value >>> 16) & 0x00000007) << oribits); - out[expPos[outOffset + 6]] |= (((value >>> 19) & 0x00000007) << oribits); - out[expPos[outOffset + 7]] |= (((value >>> 22) & 0x00000007) << oribits); - out[expPos[outOffset + 8]] |= (((value >>> 25) & 0x00000007) << oribits); - return 9; - } - case 6: { - out[expPos[outOffset]] |= ((value & 0x00000007) << oribits); - out[expPos[outOffset + 1]] |= (((value >>> 3) & 0x0000000f) << oribits); - out[expPos[outOffset + 2]] |= (((value >>> 7) & 0x0000000f) << oribits); - out[expPos[outOffset + 3]] |= (((value >>> 11) & 0x0000000f) << oribits); - out[expPos[outOffset + 4]] |= (((value >>> 15) & 0x0000000f) << oribits); - out[expPos[outOffset + 5]] |= (((value >>> 19) & 0x00000007) << oribits); - out[expPos[outOffset + 6]] |= (((value >>> 22) & 0x00000007) << oribits); - out[expPos[outOffset + 7]] |= (((value >>> 25) & 0x00000007) << oribits); - return 8; - } - case 7: { - out[expPos[outOffset]] |= ((value & 0x0000000f) << oribits); - out[expPos[outOffset + 1]] |= (((value >>> 4) & 0x0000000f) << oribits); - out[expPos[outOffset + 2]] |= (((value >>> 8) & 0x0000000f) << oribits); - out[expPos[outOffset + 3]] |= (((value >>> 12) & 0x0000000f) << oribits); - out[expPos[outOffset + 4]] |= (((value >>> 16) & 0x0000000f) << oribits); - out[expPos[outOffset + 5]] |= (((value >>> 20) & 0x0000000f) << oribits); - out[expPos[outOffset + 6]] |= (((value >>> 24) & 0x0000000f) << oribits); - return 7; - } - case 8: { - out[expPos[outOffset]] |= ((value & 0x0000001f) << oribits); - out[expPos[outOffset + 1]] |= (((value >>> 5) & 0x0000001f) << oribits); - out[expPos[outOffset + 2]] |= (((value >>> 10) & 0x0000001f) << oribits); - out[expPos[outOffset + 3]] |= (((value >>> 15) & 0x0000001f) << oribits); - out[expPos[outOffset + 4]] |= (((value >>> 20) & 0x0000000f) << oribits); - out[expPos[outOffset + 5]] |= (((value >>> 24) & 0x0000000f) << oribits); - return 6; - } - case 9: { - out[expPos[outOffset]] |= ((value & 0x0000000f) << oribits); - out[expPos[outOffset + 1]] |= (((value >>> 4) & 0x0000000f) << oribits); - out[expPos[outOffset + 2]] |= (((value >>> 8) & 0x0000001f) << oribits); - out[expPos[outOffset + 3]] |= (((value >>> 13) & 0x0000001f) << oribits); - out[expPos[outOffset + 4]] |= (((value >>> 18) & 0x0000001f) << oribits); - out[expPos[outOffset + 5]] |= (((value >>> 23) & 0x0000001f) << oribits); - return 6; - } - case 10: { - out[expPos[outOffset]] |= ((value & 0x0000003f) << oribits); - out[expPos[outOffset + 1]] |= (((value >>> 6) & 0x0000003f) << oribits); - out[expPos[outOffset + 2]] |= (((value >>> 12) & 0x0000003f) << oribits); - out[expPos[outOffset + 3]] |= (((value >>> 18) & 0x0000001f) << oribits); - out[expPos[outOffset + 4]] |= (((value >>> 23) & 0x0000001f) << oribits); - return 5; - } - case 11: { - out[expPos[outOffset]] |= ((value & 0x0000001f) << oribits); - out[expPos[outOffset + 1]] |= (((value >>> 5) & 0x0000001f) << oribits); - out[expPos[outOffset + 2]] |= (((value >>> 10) & 0x0000003f) << oribits); - out[expPos[outOffset + 3]] |= (((value >>> 16) & 0x0000003f) << oribits); - out[expPos[outOffset + 4]] |= (((value >>> 22) & 0x0000003f) << oribits); - return 5; - } - case 12: { - out[expPos[outOffset]] |= ((value & 0x0000007f) << oribits); - out[expPos[outOffset + 1]] |= (((value >>> 7) & 0x0000007f) << oribits); - out[expPos[outOffset + 2]] |= (((value >>> 14) & 0x0000007f) << oribits); - out[expPos[outOffset + 3]] |= (((value >>> 21) & 0x0000007f) << oribits); - return 4; - } - case 13: { - out[expPos[outOffset]] |= ((value & 0x000003ff) << oribits); - out[expPos[outOffset + 1]] |= (((value >>> 10) & 0x000001ff) << oribits); - out[expPos[outOffset + 2]] |= (((value >>> 19) & 0x000001ff) << oribits); - return 3; - } - case 14: { - out[expPos[outOffset]] |= ((value & 0x00003fff) << oribits); - out[expPos[outOffset + 1]] |= (((value >>> 14) & 0x00003fff) << oribits); - return 2; - } - case 15: { - out[expPos[outOffset]] |= ((value & 0x0fffffff) << oribits); - return 1; - } - default: - return -1; + public static int s16DecompressOneNumberWithHardCodesIntegrated( + int[] out, int outOffset, int value, int numIdx, int oribits, + int[] expPos) { + switch (numIdx) { + case 0: { + out[expPos[outOffset]] |= ((value & 0x00000001) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 1) & 0x00000001) << oribits); + out[expPos[outOffset + 2]] |= (((value >>> 2) & 0x00000001) << oribits); + out[expPos[outOffset + 3]] |= (((value >>> 3) & 0x00000001) << oribits); + out[expPos[outOffset + 4]] |= (((value >>> 4) & 0x00000001) << oribits); + out[expPos[outOffset + 5]] |= (((value >>> 5) & 0x00000001) << oribits); + out[expPos[outOffset + 6]] |= (((value >>> 6) & 0x00000001) << oribits); + out[expPos[outOffset + 7]] |= (((value >>> 7) & 0x00000001) << oribits); + out[expPos[outOffset + 8]] |= (((value >>> 8) & 0x00000001) << oribits); + out[expPos[outOffset + 9]] |= (((value >>> 9) & 0x00000001) << oribits); + out[expPos[outOffset + 10]] |= (((value >>> 10) & 0x00000001) << oribits); + out[expPos[outOffset + 11]] |= (((value >>> 11) & 0x00000001) << oribits); + out[expPos[outOffset + 12]] |= (((value >>> 12) & 0x00000001) << oribits); + out[expPos[outOffset + 13]] |= (((value >>> 13) & 0x00000001) << oribits); + out[expPos[outOffset + 14]] |= (((value >>> 14) & 0x00000001) << oribits); + out[expPos[outOffset + 15]] |= (((value >>> 15) & 0x00000001) << oribits); + out[expPos[outOffset + 16]] |= (((value >>> 16) & 0x00000001) << oribits); + out[expPos[outOffset + 17]] |= (((value >>> 17) & 0x00000001) << oribits); + out[expPos[outOffset + 18]] |= (((value >>> 18) & 0x00000001) << oribits); + out[expPos[outOffset + 19]] |= (((value >>> 19) & 0x00000001) << oribits); + out[expPos[outOffset + 20]] |= (((value >>> 20) & 0x00000001) << oribits); + out[expPos[outOffset + 21]] |= (((value >>> 21) & 0x00000001) << oribits); + out[expPos[outOffset + 22]] |= (((value >>> 22) & 0x00000001) << oribits); + out[expPos[outOffset + 23]] |= (((value >>> 23) & 0x00000001) << oribits); + out[expPos[outOffset + 24]] |= (((value >>> 24) & 0x00000001) << oribits); + out[expPos[outOffset + 25]] |= (((value >>> 25) & 0x00000001) << oribits); + out[expPos[outOffset + 26]] |= (((value >>> 26) & 0x00000001) << oribits); + out[expPos[outOffset + 27]] |= (((value >>> 27) & 0x00000001) << oribits); + return 28; + } + case 1: { + out[expPos[outOffset]] |= ((value & 0x00000003) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 2) & 0x00000003) << oribits); + out[expPos[outOffset + 2]] |= (((value >>> 4) & 0x00000003) << oribits); + out[expPos[outOffset + 3]] |= (((value >>> 6) & 0x00000003) << oribits); + out[expPos[outOffset + 4]] |= (((value >>> 8) & 0x00000003) << oribits); + out[expPos[outOffset + 5]] |= (((value >>> 10) & 0x00000003) << oribits); + out[expPos[outOffset + 6]] |= (((value >>> 12) & 0x00000003) << oribits); + out[expPos[outOffset + 7]] |= (((value >>> 14) & 0x00000001) << oribits); + out[expPos[outOffset + 8]] |= (((value >>> 15) & 0x00000001) << oribits); + out[expPos[outOffset + 9]] |= (((value >>> 16) & 0x00000001) << oribits); + out[expPos[outOffset + 10]] |= (((value >>> 17) & 0x00000001) << oribits); + out[expPos[outOffset + 11]] |= (((value >>> 18) & 0x00000001) << oribits); + out[expPos[outOffset + 12]] |= (((value >>> 19) & 0x00000001) << oribits); + out[expPos[outOffset + 13]] |= (((value >>> 20) & 0x00000001) << oribits); + out[expPos[outOffset + 14]] |= (((value >>> 21) & 0x00000001) << oribits); + out[expPos[outOffset + 15]] |= (((value >>> 22) & 0x00000001) << oribits); + out[expPos[outOffset + 16]] |= (((value >>> 23) & 0x00000001) << oribits); + out[expPos[outOffset + 17]] |= (((value >>> 24) & 0x00000001) << oribits); + out[expPos[outOffset + 18]] |= (((value >>> 25) & 0x00000001) << oribits); + out[expPos[outOffset + 19]] |= (((value >>> 26) & 0x00000001) << oribits); + out[expPos[outOffset + 20]] |= (((value >>> 27) & 0x00000001) << oribits); + return 21; + } + case 2: { + out[expPos[outOffset]] |= ((value & 0x00000001) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 1) & 0x00000001) << oribits); + out[expPos[outOffset + 2]] |= (((value >>> 2) & 0x00000001) << oribits); + out[expPos[outOffset + 3]] |= (((value >>> 3) & 0x00000001) << oribits); + out[expPos[outOffset + 4]] |= (((value >>> 4) & 0x00000001) << oribits); + out[expPos[outOffset + 5]] |= (((value >>> 5) & 0x00000001) << oribits); + out[expPos[outOffset + 6]] |= (((value >>> 6) & 0x00000001) << oribits); + out[expPos[outOffset + 7]] |= (((value >>> 7) & 0x00000003) << oribits); + out[expPos[outOffset + 8]] |= (((value >>> 9) & 0x00000003) << oribits); + out[expPos[outOffset + 9]] |= (((value >>> 11) & 0x00000003) << oribits); + out[expPos[outOffset + 10]] |= (((value >>> 13) & 0x00000003) << oribits); + out[expPos[outOffset + 11]] |= (((value >>> 15) & 0x00000003) << oribits); + out[expPos[outOffset + 12]] |= (((value >>> 17) & 0x00000003) << oribits); + out[expPos[outOffset + 13]] |= (((value >>> 19) & 0x00000003) << oribits); + out[expPos[outOffset + 14]] |= (((value >>> 21) & 0x00000001) << oribits); + out[expPos[outOffset + 15]] |= (((value >>> 22) & 0x00000001) << oribits); + out[expPos[outOffset + 16]] |= (((value >>> 23) & 0x00000001) << oribits); + out[expPos[outOffset + 17]] |= (((value >>> 24) & 0x00000001) << oribits); + out[expPos[outOffset + 18]] |= (((value >>> 25) & 0x00000001) << oribits); + out[expPos[outOffset + 19]] |= (((value >>> 26) & 0x00000001) << oribits); + out[expPos[outOffset + 20]] |= (((value >>> 27) & 0x00000001) << oribits); + return 21; + } + case 3: { + out[expPos[outOffset]] |= ((value & 0x00000001) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 1) & 0x00000001) << oribits); + out[expPos[outOffset + 2]] |= (((value >>> 2) & 0x00000001) << oribits); + out[expPos[outOffset + 3]] |= (((value >>> 3) & 0x00000001) << oribits); + out[expPos[outOffset + 4]] |= (((value >>> 4) & 0x00000001) << oribits); + out[expPos[outOffset + 5]] |= (((value >>> 5) & 0x00000001) << oribits); + out[expPos[outOffset + 6]] |= (((value >>> 6) & 0x00000001) << oribits); + out[expPos[outOffset + 7]] |= (((value >>> 7) & 0x00000001) << oribits); + out[expPos[outOffset + 8]] |= (((value >>> 8) & 0x00000001) << oribits); + out[expPos[outOffset + 9]] |= (((value >>> 9) & 0x00000001) << oribits); + out[expPos[outOffset + 10]] |= (((value >>> 10) & 0x00000001) << oribits); + out[expPos[outOffset + 11]] |= (((value >>> 11) & 0x00000001) << oribits); + out[expPos[outOffset + 12]] |= (((value >>> 12) & 0x00000001) << oribits); + out[expPos[outOffset + 13]] |= (((value >>> 13) & 0x00000001) << oribits); + out[expPos[outOffset + 14]] |= (((value >>> 14) & 0x00000003) << oribits); + out[expPos[outOffset + 15]] |= (((value >>> 16) & 0x00000003) << oribits); + out[expPos[outOffset + 16]] |= (((value >>> 18) & 0x00000003) << oribits); + out[expPos[outOffset + 17]] |= (((value >>> 20) & 0x00000003) << oribits); + out[expPos[outOffset + 18]] |= (((value >>> 22) & 0x00000003) << oribits); + out[expPos[outOffset + 19]] |= (((value >>> 24) & 0x00000003) << oribits); + out[expPos[outOffset + 20]] |= (((value >>> 26) & 0x00000003) << oribits); + return 21; + } + case 4: { + out[expPos[outOffset]] |= ((value & 0x00000003) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 2) & 0x00000003) << oribits); + out[expPos[outOffset + 2]] |= (((value >>> 4) & 0x00000003) << oribits); + out[expPos[outOffset + 3]] |= (((value >>> 6) & 0x00000003) << oribits); + out[expPos[outOffset + 4]] |= (((value >>> 8) & 0x00000003) << oribits); + out[expPos[outOffset + 5]] |= (((value >>> 10) & 0x00000003) << oribits); + out[expPos[outOffset + 6]] |= (((value >>> 12) & 0x00000003) << oribits); + out[expPos[outOffset + 7]] |= (((value >>> 14) & 0x00000003) << oribits); + out[expPos[outOffset + 8]] |= (((value >>> 16) & 0x00000003) << oribits); + out[expPos[outOffset + 9]] |= (((value >>> 18) & 0x00000003) << oribits); + out[expPos[outOffset + 10]] |= (((value >>> 20) & 0x00000003) << oribits); + out[expPos[outOffset + 11]] |= (((value >>> 22) & 0x00000003) << oribits); + out[expPos[outOffset + 12]] |= (((value >>> 24) & 0x00000003) << oribits); + out[expPos[outOffset + 13]] |= (((value >>> 26) & 0x00000003) << oribits); + return 14; + } + case 5: { + out[expPos[outOffset]] |= ((value & 0x0000000f) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 4) & 0x00000007) << oribits); + out[expPos[outOffset + 2]] |= (((value >>> 7) & 0x00000007) << oribits); + out[expPos[outOffset + 3]] |= (((value >>> 10) & 0x00000007) << oribits); + out[expPos[outOffset + 4]] |= (((value >>> 13) & 0x00000007) << oribits); + out[expPos[outOffset + 5]] |= (((value >>> 16) & 0x00000007) << oribits); + out[expPos[outOffset + 6]] |= (((value >>> 19) & 0x00000007) << oribits); + out[expPos[outOffset + 7]] |= (((value >>> 22) & 0x00000007) << oribits); + out[expPos[outOffset + 8]] |= (((value >>> 25) & 0x00000007) << oribits); + return 9; + } + case 6: { + out[expPos[outOffset]] |= ((value & 0x00000007) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 3) & 0x0000000f) << oribits); + out[expPos[outOffset + 2]] |= (((value >>> 7) & 0x0000000f) << oribits); + out[expPos[outOffset + 3]] |= (((value >>> 11) & 0x0000000f) << oribits); + out[expPos[outOffset + 4]] |= (((value >>> 15) & 0x0000000f) << oribits); + out[expPos[outOffset + 5]] |= (((value >>> 19) & 0x00000007) << oribits); + out[expPos[outOffset + 6]] |= (((value >>> 22) & 0x00000007) << oribits); + out[expPos[outOffset + 7]] |= (((value >>> 25) & 0x00000007) << oribits); + return 8; + } + case 7: { + out[expPos[outOffset]] |= ((value & 0x0000000f) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 4) & 0x0000000f) << oribits); + out[expPos[outOffset + 2]] |= (((value >>> 8) & 0x0000000f) << oribits); + out[expPos[outOffset + 3]] |= (((value >>> 12) & 0x0000000f) << oribits); + out[expPos[outOffset + 4]] |= (((value >>> 16) & 0x0000000f) << oribits); + out[expPos[outOffset + 5]] |= (((value >>> 20) & 0x0000000f) << oribits); + out[expPos[outOffset + 6]] |= (((value >>> 24) & 0x0000000f) << oribits); + return 7; + } + case 8: { + out[expPos[outOffset]] |= ((value & 0x0000001f) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 5) & 0x0000001f) << oribits); + out[expPos[outOffset + 2]] |= (((value >>> 10) & 0x0000001f) << oribits); + out[expPos[outOffset + 3]] |= (((value >>> 15) & 0x0000001f) << oribits); + out[expPos[outOffset + 4]] |= (((value >>> 20) & 0x0000000f) << oribits); + out[expPos[outOffset + 5]] |= (((value >>> 24) & 0x0000000f) << oribits); + return 6; + } + case 9: { + out[expPos[outOffset]] |= ((value & 0x0000000f) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 4) & 0x0000000f) << oribits); + out[expPos[outOffset + 2]] |= (((value >>> 8) & 0x0000001f) << oribits); + out[expPos[outOffset + 3]] |= (((value >>> 13) & 0x0000001f) << oribits); + out[expPos[outOffset + 4]] |= (((value >>> 18) & 0x0000001f) << oribits); + out[expPos[outOffset + 5]] |= (((value >>> 23) & 0x0000001f) << oribits); + return 6; + } + case 10: { + out[expPos[outOffset]] |= ((value & 0x0000003f) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 6) & 0x0000003f) << oribits); + out[expPos[outOffset + 2]] |= (((value >>> 12) & 0x0000003f) << oribits); + out[expPos[outOffset + 3]] |= (((value >>> 18) & 0x0000001f) << oribits); + out[expPos[outOffset + 4]] |= (((value >>> 23) & 0x0000001f) << oribits); + return 5; + } + case 11: { + out[expPos[outOffset]] |= ((value & 0x0000001f) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 5) & 0x0000001f) << oribits); + out[expPos[outOffset + 2]] |= (((value >>> 10) & 0x0000003f) << oribits); + out[expPos[outOffset + 3]] |= (((value >>> 16) & 0x0000003f) << oribits); + out[expPos[outOffset + 4]] |= (((value >>> 22) & 0x0000003f) << oribits); + return 5; + } + case 12: { + out[expPos[outOffset]] |= ((value & 0x0000007f) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 7) & 0x0000007f) << oribits); + out[expPos[outOffset + 2]] |= (((value >>> 14) & 0x0000007f) << oribits); + out[expPos[outOffset + 3]] |= (((value >>> 21) & 0x0000007f) << oribits); + return 4; + } + case 13: { + out[expPos[outOffset]] |= ((value & 0x000003ff) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 10) & 0x000001ff) << oribits); + out[expPos[outOffset + 2]] |= (((value >>> 19) & 0x000001ff) << oribits); + return 3; + } + case 14: { + out[expPos[outOffset]] |= ((value & 0x00003fff) << oribits); + out[expPos[outOffset + 1]] |= (((value >>> 14) & 0x00003fff) << oribits); + return 2; + } + case 15: { + out[expPos[outOffset]] |= ((value & 0x0fffffff) << oribits); + return 1; + } + default: + return -1; + } } - } - /** - * Read a certain number of bits of a integer on the input array - * - * @param in the input array - * @param inIntOffset the start offset in ints in the input array - * @param inWithIntOffset the start offset within a int in the input array - * @param bits the number of bits to be read - * @return the bits bits of the input - */ - static private int readBitsForS16(int[] in, final int inIntOffset, final int inWithIntOffset, final int bits) { - final int val = (in[inIntOffset] >>> inWithIntOffset); - return val & (0xffffffff >>> (32 - bits)); - } + /** + * Read a certain number of bits of a integer on the input array + * + * @param in + * the input array + * @param inIntOffset + * the start offset in ints in the input array + * @param inWithIntOffset + * the start offset within a int in the input array + * @param bits + * the number of bits to be read + * @return the bits bits of the input + */ + static private int readBitsForS16(int[] in, final int inIntOffset, + final int inWithIntOffset, final int bits) { + final int val = (in[inIntOffset] >>> inWithIntOffset); + return val & (0xffffffff >>> (32 - bits)); + } } - - diff --git a/src/main/java/me/lemire/integercompression/Benchmark.java b/src/main/java/me/lemire/integercompression/Benchmark.java deleted file mode 100644 index 41e50da..0000000 --- a/src/main/java/me/lemire/integercompression/Benchmark.java +++ /dev/null @@ -1,539 +0,0 @@ -/** - * This code is released under the - * Apache License Version 2.0 http://www.apache.org/licenses/. - * - * (c) Daniel Lemire, http://lemire.me/en/ - */ -package me.lemire.integercompression; - - -import com.kamikaze.pfordelta.PForDelta; -import me.lemire.integercompression.synth.ClusteredDataGenerator; - -import java.io.File; -import java.io.PrintWriter; -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.Arrays; - -/** - * - * Simple class meant to compare the speed of different schemes. - * @author Daniel Lemire - * - */ -public class Benchmark { - - /** - * Standard benchmark - * - * @param csvLog Writer for CSV log. - * @param c the codec - * @param data arrays of input data - * @param repeat How many times to repeat the test - * @param verbose whether to output result on screen - */ - private static void testCodec( - PrintWriter csvLog, - int sparsity, - IntegerCODEC c, - int[][] data, - int repeat, - boolean verbose) - { - if (verbose) { - System.out.println("# " + c.toString()); - System.out.println("# bits per int, compress speed (mis), decompression speed (mis) "); - } - - int N = data.length; - - int totalSize = 0; - int maxLength = 0; - for (int k = 0; k < N; ++k) { - totalSize += data[k].length; - if (data[k].length > maxLength) { - maxLength = data[k].length; - } - } - - // 4x + 1024 to account for the possibility of some negative - // compression. - int[] compressBuffer = new int[4 * maxLength + 1024]; - int[] decompressBuffer = new int[maxLength + 1024]; - - // These variables hold time in microseconds (10^-6). - long compressTime = 0; - long decompressTime = 0; - - int size = 0; - IntWrapper inpos = new IntWrapper(); - IntWrapper outpos = new IntWrapper(); - - for (int r = 0; r < repeat; ++r) { - size = 0; - for (int k = 0; k < N; ++k) { - int[] backupdata = Arrays.copyOf(data[k], data[k].length); - - // compress data. - long beforeCompress = System.nanoTime() / 1000; - inpos.set(1); - outpos.set(0); - if (!(c instanceof IntegratedIntegerCODEC)) { - Delta.delta(backupdata); - } - c.compress(backupdata, inpos, backupdata.length - inpos.get(), - compressBuffer, outpos); - long afterCompress = System.nanoTime() / 1000; - - // measure time of compression. - compressTime += afterCompress - beforeCompress; - final int thiscompsize = outpos.get() + 1; - size += thiscompsize; - - // extract (uncompress) data - long beforeDecompress = System.nanoTime() / 1000; - inpos.set(0); - outpos.set(1); - decompressBuffer[0] = backupdata[0]; - c.uncompress(compressBuffer, inpos, thiscompsize - 1, - decompressBuffer, outpos); - if (!(c instanceof IntegratedIntegerCODEC)) - Delta.fastinverseDelta(decompressBuffer); - long afterDecompress = System.nanoTime() / 1000; - - // measure time of extraction (uncompression). - decompressTime += afterDecompress - beforeDecompress; - if (outpos.get() != data[k].length) - throw new RuntimeException("we have a bug (diff length) " - + c + " expected " + data[k].length + " got " - + outpos.get()); - - // verify: compare original array with compressed and - // uncompressed. - for (int m = 0; m < outpos.get(); ++m) { - if (decompressBuffer[m] != data[k][m]) { - throw new RuntimeException( - "we have a bug (actual difference), expected " - + data[k][m] + " found " + decompressBuffer[m] - + " at " + m); - } - } - } - } - - if (verbose) { - double bitsPerInt = size * 32.0 / totalSize; - long compressSpeed = totalSize * repeat / (compressTime); - long decompressSpeed = totalSize * repeat / (decompressTime); - System.out.println(String.format("\t%1$.2f\t%2$d\t%3$d", - bitsPerInt, compressSpeed, decompressSpeed)); - csvLog.format("\"%1$s\",%2$d,%3$.2f,%4$d,%5$d\n", c.toString(), - sparsity, bitsPerInt, compressSpeed, decompressSpeed); - csvLog.flush(); - } - } - - /** - * Standard benchmark byte byte-aligned schemes - * - * @param csvLog Writer for CSV log. - * @param c the codec - * @param data arrays of input data - * @param repeat How many times to repeat the test - * @param verbose whether to output result on screen - */ - private static void testByteCodec( - PrintWriter csvLog, - int sparsity, - ByteIntegerCODEC c, - int[][] data, - int repeat, - boolean verbose) - { - if (verbose) { - System.out.println("# " + c.toString()); - System.out.println("# bits per int, compress speed (mis), decompression speed (mis) "); - } - - int N = data.length; - - int totalSize = 0; - int maxLength = 0; - for (int k = 0; k < N; ++k) { - totalSize += data[k].length; - if (data[k].length > maxLength) { - maxLength = data[k].length; - } - } - - byte[] compressBuffer = new byte[8 * maxLength + 1024]; - int[] decompressBuffer = new int[maxLength + 1024]; - - // These variables hold time in microseconds (10^-6). - long compressTime = 0; - long decompressTime = 0; - - int size = 0; - IntWrapper inpos = new IntWrapper(); - IntWrapper outpos = new IntWrapper(); - - for (int r = 0; r < repeat; ++r) { - size = 0; - for (int k = 0; k < N; ++k) { - int[] backupdata = Arrays.copyOf(data[k], data[k].length); - - // compress data. - long beforeCompress = System.nanoTime() / 1000; - inpos.set(1); - outpos.set(0); - if (!(c instanceof IntegratedByteIntegerCODEC)) { - Delta.delta(backupdata); - } - c.compress(backupdata, inpos, backupdata.length - inpos.get(), - compressBuffer, outpos); - long afterCompress = System.nanoTime() / 1000; - - // measure time of compression. - compressTime += afterCompress - beforeCompress; - final int thiscompsize = outpos.get() + 1; - size += thiscompsize; - - // extract (uncompress) data - long beforeDecompress = System.nanoTime() / 1000; - inpos.set(0); - outpos.set(1); - decompressBuffer[0] = backupdata[0]; - c.uncompress(compressBuffer, inpos, thiscompsize - 1, - decompressBuffer, outpos); - if (!(c instanceof IntegratedByteIntegerCODEC)) - Delta.fastinverseDelta(decompressBuffer); - long afterDecompress = System.nanoTime() / 1000; - - // measure time of extraction (uncompression). - decompressTime += afterDecompress - beforeDecompress; - if (outpos.get() != data[k].length) - throw new RuntimeException("we have a bug (diff length) " - + c + " expected " + data[k].length + " got " - + outpos.get()); - - // verify: compare original array with compressed and - // uncompressed. - for (int m = 0; m < outpos.get(); ++m) { - if (decompressBuffer[m] != data[k][m]) { - throw new RuntimeException( - "we have a bug (actual difference), expected " - + data[k][m] + " found " + decompressBuffer[m] - + " at " + m); - } - } - } - } - - if (verbose) { - double bitsPerInt = size * 8.0 / totalSize; - long compressSpeed = totalSize * repeat / (compressTime); - long decompressSpeed = totalSize * repeat / (decompressTime); - System.out.println(String.format("\t%1$.2f\t%2$d\t%3$d", - bitsPerInt, compressSpeed, decompressSpeed)); - csvLog.format("\"%1$s\",%2$d,%3$.2f,%4$d,%5$d\n", c.toString(), - sparsity, bitsPerInt, compressSpeed, decompressSpeed); - csvLog.flush(); - } - } - - /** - * Main method. - * - * @param args command-line arguments - */ - public static void main(String args[]) throws Exception - { - System.out.println("# benchmark based on the ClusterData model from:"); - System.out.println("# Vo Ngoc Anh and Alistair Moffat. "); - System.out.println("# Index compression using 64-bit words.") ; - System.out.println("# Softw. Pract. Exper.40, 2 (February 2010), 131-147. "); - System.out.println(); - - PrintWriter writer = null; - try { - File csvFile = new File(String.format( - "benchmark-%1$tY%1$tm%1$tdT%1$tH%1$tM%1$tS.csv", - System.currentTimeMillis())); - writer = new PrintWriter(csvFile); - System.out.println("# Results will be written into a CSV file: " - + csvFile.getName()); - System.out.println(); - test(writer, 20, 18, 10); - System.out.println(); - System.out.println("Results were written into a CSV file: " - + csvFile.getName()); - } finally { - if (writer != null) { - writer.close(); - } - } - } - - /** - * Standard test for the Kamikaze library - * - * @param data input data - * @param repeat how many times to repeat - * @param verbose whether to output data on screen - */ - public static void testKamikaze(int[][] data, - int repeat, boolean verbose) { - DecimalFormat df = new DecimalFormat("0.00"); - DecimalFormat dfspeed = new DecimalFormat("0"); - if (verbose) - System.out.println("# kamikaze PForDelta"); - if (verbose) - System.out - .println("# bits per int, compress speed (mis), decompression speed (mis) "); - long bef, aft; - String line = ""; - int N = data.length; - int totalsize = 0; - int maxlength = 0; - for (int k = 0; k < N; ++k) { - totalsize += data[k].length; - if (data[k].length > maxlength) - maxlength = data[k].length; - } - int[] buffer = new int[maxlength + 1024]; - /* 4x + 1024 to account for the possibility of some negative compression */ - int size = 0; - int comptime = 0; - long decomptime = 0; - for (int r = 0; r < repeat; ++r) { - size = 0; - for (int k = 0; k < N; ++k) { - int outpos = 0; - int[] backupdata = Arrays.copyOf(data[k], data[k].length); - // - bef = System.nanoTime() / 1000; - Delta.delta(backupdata); - ArrayList dataout = new ArrayList(data[k].length / 128); - for (int K = 0; K < data[k].length; K += 128) { - final int[] compressedbuf = PForDelta.compressOneBlockOpt(Arrays.copyOfRange(backupdata, K, K + 128), 128); - dataout.add(compressedbuf); - outpos += compressedbuf.length; - } - aft = System.nanoTime() / 1000; - // - comptime += aft - bef; - final int thiscompsize = outpos; - size += thiscompsize; - // - bef = System.nanoTime() / 1000; - //buffer[0] = backupdata[0]; - ArrayList datauncomp = new ArrayList(dataout.size()); - int deltaoffset = 0; - - for (int[] compbuf : dataout) { - int[] tmpbuf = new int[128]; - PForDelta.decompressOneBlock(tmpbuf, compbuf, 128); - tmpbuf[0] += deltaoffset; - Delta.fastinverseDelta(tmpbuf); - deltaoffset = tmpbuf[127]; - datauncomp.add(tmpbuf); - } - aft = System.nanoTime() / 1000; - // - decomptime += aft - bef; - if (datauncomp.size() * 128 != data[k].length) - throw new RuntimeException("we have a bug (diff length) " - + " expected " + data[k].length + " got " - + datauncomp.size() * 128); - for (int m = 0; m < data[k].length; ++m) - if (datauncomp.get(m / 128)[m % 128] != data[k][m]) { - throw new RuntimeException( - "we have a bug (actual difference), expected " - + data[k][m] + " found " + buffer[m] - + " at " + m); - } - - } - } - - line += "\t" + df.format(size * 32.0 / totalsize); - line += "\t" + dfspeed.format(totalsize * repeat / (comptime)); - line += "\t" + dfspeed.format(totalsize * repeat / (decomptime)); - if (verbose) - System.out.println(line); - } - - /** - * Generate test data. - * - * @param N How many input arrays to generate - * @param nbr How big (in log2) should the arrays be - * @param sparsity How sparse test data generated - */ - private static int[][] generateTestData( - ClusteredDataGenerator dataGen, - int N, - int nbr, - int sparsity) - { - final int[][] data = new int[N][]; - final int dataSize = (1 << (nbr + sparsity)); - for (int i = 0; i < N; ++i) { - data[i] = dataGen.generateClustered((1 << nbr), dataSize); - } - return data; - } - - /** - * Generates data and calls other tests. - * - * @param csvLog Writer for CSV log. - * @param N How many input arrays to generate - * @param nbr how big (in log2) should the arrays be - * @param repeat How many times should we repeat tests. - */ - private static void test(PrintWriter csvLog, int N, int nbr, int repeat) - { - csvLog.format("\"Algorithm\",\"Sparsity\",\"Bits per int\",\"Compress speed (MiS)\",\"Decompress speed (MiS)\"\n"); - ClusteredDataGenerator cdg = new ClusteredDataGenerator(); - final int max_sparsity = 31 - nbr; - for (int sparsity = 1; sparsity < max_sparsity; ++sparsity) { - System.out.println("# sparsity " + sparsity); - System.out.println("# generating random data..."); - int[][] data = generateTestData(cdg, N, nbr, sparsity); - System.out.println("# generating random data... ok."); - - // TODO: support CSV log output. - testKamikaze(data, repeat, false); - testKamikaze(data, repeat, false); - testKamikaze(data, repeat, true); - System.out.println(); - - - - testCodec(csvLog, sparsity, new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()), data, repeat, false); - testCodec(csvLog, sparsity, new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()), data, repeat, false); - testCodec(csvLog, sparsity, new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()), data, repeat, true); - System.out.println(); - - testCodec(csvLog, sparsity, new JustCopy(), data, repeat, false); - testCodec(csvLog, sparsity, new JustCopy(), data, repeat, false); - testCodec(csvLog, sparsity, new JustCopy(), data, repeat, true); - System.out.println(); - - testByteCodec(csvLog, sparsity, new VariableByte(), data, repeat, false); - testByteCodec(csvLog, sparsity, new VariableByte(), data, repeat, false); - testByteCodec(csvLog, sparsity, new VariableByte(), data, repeat, true); - System.out.println(); - - testByteCodec(csvLog, sparsity, new IntegratedVariableByte(), data, repeat, false); - testByteCodec(csvLog, sparsity, new IntegratedVariableByte(), data, repeat, false); - testByteCodec(csvLog, sparsity, new IntegratedVariableByte(), data, repeat, true); - System.out.println(); - - testCodec(csvLog, sparsity, new Composition(new BinaryPacking(), new VariableByte()), - data, repeat, false); - testCodec(csvLog, sparsity, new Composition(new BinaryPacking(), new VariableByte()), - data, repeat, false); - testCodec(csvLog, sparsity, new Composition(new BinaryPacking(), new VariableByte()), - data, repeat, true); - System.out.println(); - - testCodec(csvLog, sparsity, new Composition(new NewPFD(), new VariableByte()), data, - repeat, false); - testCodec(csvLog, sparsity, new Composition(new NewPFD(), new VariableByte()), data, - repeat, false); - testCodec(csvLog, sparsity, new Composition(new NewPFD(), new VariableByte()), data, - repeat, true); - System.out.println(); - - testCodec(csvLog, sparsity, new Composition(new NewPFDS9(), new VariableByte()), - data, repeat, false); - testCodec(csvLog, sparsity, new Composition(new NewPFDS9(), new VariableByte()), - data, repeat, false); - testCodec(csvLog, sparsity, new Composition(new NewPFDS9(), new VariableByte()), - data, repeat, true); - System.out.println(); - - testCodec(csvLog, sparsity, new Composition(new NewPFDS16(), new VariableByte()), - data, repeat, false); - testCodec(csvLog, sparsity, new Composition(new NewPFDS16(), new VariableByte()), - data, repeat, false); - testCodec(csvLog, sparsity, new Composition(new NewPFDS16(), new VariableByte()), - data, repeat, true); - System.out.println(); - - testCodec(csvLog, sparsity, new Composition(new OptPFD(), new VariableByte()), data, - repeat, false); - testCodec(csvLog, sparsity, new Composition(new OptPFD(), new VariableByte()), data, - repeat, false); - testCodec(csvLog, sparsity, new Composition(new OptPFD(), new VariableByte()), data, - repeat, true); - System.out.println(); - - testCodec(csvLog, sparsity, new Composition(new OptPFDS9(), new VariableByte()), - data, repeat, false); - testCodec(csvLog, sparsity, new Composition(new OptPFDS9(), new VariableByte()), - data, repeat, false); - testCodec(csvLog, sparsity, new Composition(new OptPFDS9(), new VariableByte()), - data, repeat, true); - System.out.println(); - - testCodec(csvLog, sparsity, new Composition(new OptPFDS16(), new VariableByte()), - data, repeat, false); - testCodec(csvLog, sparsity, new Composition(new OptPFDS16(), new VariableByte()), - data, repeat, false); - testCodec(csvLog, sparsity, new Composition(new OptPFDS16(), new VariableByte()), - data, repeat, true); - System.out.println(); - - { - IntegerCODEC c = new IntegratedComposition( - new IntegratedFastPFOR(), - new IntegratedVariableByte()); - testCodec(csvLog, sparsity, c, data, repeat, false); - testCodec(csvLog, sparsity, c, data, repeat, false); - testCodec(csvLog, sparsity, c, data, repeat, true); - System.out.println(); - } - - testCodec(csvLog, sparsity, new Composition(new FastPFOR(), new VariableByte()), - data, repeat, false); - testCodec(csvLog, sparsity, new Composition(new FastPFOR(), new VariableByte()), - data, repeat, false); - testCodec(csvLog, sparsity, new Composition(new FastPFOR(), new VariableByte()), - data, repeat, true); - System.out.println(); - - testCodec(csvLog, sparsity, new Simple9(), data, repeat, false); - testCodec(csvLog, sparsity, new Simple9(), data, repeat, false); - testCodec(csvLog, sparsity, new Simple9(), data, repeat, true); - System.out.println(); - - { - IntegerCODEC c = new Composition( - new XorBinaryPacking(), - new VariableByte()); - testCodec(csvLog, sparsity, c, data, repeat, false); - testCodec(csvLog, sparsity, c, data, repeat, false); - testCodec(csvLog, sparsity, c, data, repeat, true); - System.out.println(); - } - - { - IntegerCODEC c = new Composition( - new DeltaZigzagBinaryPacking(), - new DeltaZigzagVariableByte()); - testCodec(csvLog, sparsity, c, data, repeat, false); - testCodec(csvLog, sparsity, c, data, repeat, false); - testCodec(csvLog, sparsity, c, data, repeat, true); - System.out.println(); - } - - } - } -} diff --git a/src/main/java/me/lemire/integercompression/BenchmarkBitPacking.java b/src/main/java/me/lemire/integercompression/BenchmarkBitPacking.java deleted file mode 100644 index 88ec99c..0000000 --- a/src/main/java/me/lemire/integercompression/BenchmarkBitPacking.java +++ /dev/null @@ -1,127 +0,0 @@ -/** - * This code is released under the - * Apache License Version 2.0 http://www.apache.org/licenses/. - * - * (c) Daniel Lemire, http://lemire.me/en/ - */ -package me.lemire.integercompression; - -import java.text.DecimalFormat; -import java.util.Arrays; -import java.util.Random; - -/** - * Class used to benchmark the speed of bit packing. (For - * expert use.) - * - * @author Daniel Lemire - * - */ -public class BenchmarkBitPacking { - - private static void test(boolean verbose) { - DecimalFormat dfspeed = new DecimalFormat("0"); - final int N = 32; - final int times = 100000; - Random r = new Random(0); - int[] data = new int[N]; - int[] compressed = new int[N]; - int[] uncompressed = new int[N]; - for (int bit = 0; bit < 31; ++bit) { - long comp = 0; - long compwm = 0; - long decomp = 0; - for (int t = 0; t < times; ++t) { - for (int k = 0; k < N; ++k) { - data[k] = r.nextInt(1 << bit); - } - long time1 = System.nanoTime(); - BitPacking.fastpack(data, 0, compressed, 0, bit); - long time2 = System.nanoTime(); - BitPacking.fastpackwithoutmask(data, 0, compressed, 0, bit); - long time3 = System.nanoTime(); - BitPacking.fastunpack(compressed, 0, uncompressed, 0, bit); - long time4 = System.nanoTime(); - comp += time2 - time1; - compwm += time3 - time2; - decomp += time4 - time3; - } - if (verbose) - System.out.println("bit = " + bit + " comp. speed = " - + dfspeed.format(N * times * 1000.0 / (comp)) - + " comp. speed wm = " - + dfspeed.format(N * times * 1000.0 / (compwm)) - + " decomp. speed = " - + dfspeed.format(N * times * 1000.0 / (decomp))); - } - } - - private static void testWithDeltas(boolean verbose) { - DecimalFormat dfspeed = new DecimalFormat("0"); - final int N = 32; - final int times = 100000; - Random r = new Random(0); - int[] data = new int[N]; - int[] compressed = new int[N]; - int[] icompressed = new int[N]; - int[] uncompressed = new int[N]; - for (int bit = 1; bit < 31; ++bit) { - long comp = 0; - long decomp = 0; - long icomp = 0; - long idecomp = 0; - for (int t = 0; t < times; ++t) { - data[0] = r.nextInt(1 << bit); - for (int k = 1; k < N; ++k) { - data[k] = r.nextInt(1 << bit) + data[k - 1]; - } - int[] tmpdata = Arrays.copyOf(data, data.length); - long time1 = System.nanoTime(); - Delta.delta(tmpdata); - BitPacking.fastpackwithoutmask(tmpdata, 0, compressed, 0, bit); - long time2 = System.nanoTime(); - BitPacking.fastunpack(compressed, 0, uncompressed, 0, bit); - Delta.fastinverseDelta(uncompressed); - long time3 = System.nanoTime(); - if (!Arrays.equals(data, uncompressed)) throw new RuntimeException("bug"); - comp += time2 - time1; - decomp += time3 - time2; - tmpdata = Arrays.copyOf(data, data.length); - time1 = System.nanoTime(); - IntegratedBitPacking.integratedpack(0, tmpdata, 0, icompressed, 0, bit); - time2 = System.nanoTime(); - IntegratedBitPacking.integratedunpack(0, icompressed, 0, uncompressed, 0, bit); - time3 = System.nanoTime(); - if (!Arrays.equals(icompressed, compressed)) throw new RuntimeException("ibug " + bit); - if (!Arrays.equals(data, uncompressed)) throw new RuntimeException("bug " + bit); - icomp += time2 - time1; - idecomp += time3 - time2; - } - if (verbose) - System.out.println("bit = " + bit + " comp. speed = " - + dfspeed.format(N * times * 1000.0 / (comp)) - + " decomp. speed = " - + dfspeed.format(N * times * 1000.0 / (decomp)) - + " icomp. speed = " - + dfspeed.format(N * times * 1000.0 / (icomp)) - + " idecomp. speed = " - + dfspeed.format(N * times * 1000.0 / (idecomp)) - ); - } - } - - /** - * Main method - * - * @param args command-line arguments - */ - public static void main(String[] args) { - System.out.println("Testing packing and delta "); - testWithDeltas(false); - testWithDeltas(true); - System.out.println("Testing packing alone "); - test(false); - test(true); - } - -} diff --git a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java b/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java deleted file mode 100644 index 6adc1e3..0000000 --- a/src/main/java/me/lemire/integercompression/BenchmarkOffsettedSeries.java +++ /dev/null @@ -1,322 +0,0 @@ -/** - * This code is released under the - * Apache License Version 2.0 http://www.apache.org/licenses/. - */ -package me.lemire.integercompression; - -import java.io.File; -import java.io.PrintWriter; -import java.util.Arrays; -import java.util.Random; - -public class BenchmarkOffsettedSeries -{ - public static final int DEFAULT_MEAN = 1 << 20; - public static final int DEFAULT_RANGE = 1 << 10; - public static final int DEFAULT_REPEAT = 5; - public static final int DEFAULT_WARMUP = 2; - - public BenchmarkOffsettedSeries() { - } - - /** - * Run benchmark. - * - * @param csvWriter Write for results in CSV. - * @param count Count of data chunks. - * @param length Length of a data chunk. - */ - public void run(PrintWriter csvWriter, int count, int length) - { - IntegerCODEC[] codecs = { - new JustCopy(), - new BinaryPacking(), - new DeltaZigzagBinaryPacking(), - new DeltaZigzagVariableByte(), - new IntegratedBinaryPacking(), - new XorBinaryPacking(), - new FastPFOR(), - }; - - csvWriter.format("\"Dataset\",\"CODEC\",\"Bits per int\"," + - "\"Compress speed (MiS)\",\"Decompress speed (MiS)\"\n"); - - benchmark(csvWriter, codecs, count, length, DEFAULT_MEAN, - DEFAULT_RANGE); - benchmark(csvWriter, codecs, count, length, DEFAULT_MEAN >> 5, - DEFAULT_RANGE); - - IntegerCODEC[] codecs2 = { - new JustCopy(), - new BinaryPacking(), - new DeltaZigzagBinaryPacking(), - new DeltaZigzagVariableByte(), - new IntegratedBinaryPacking(), - new XorBinaryPacking(), - new FastPFOR(), - }; - - int freq = length / 4; - benchmarkSine(csvWriter, codecs2, count, length, - DEFAULT_MEAN >> 0, DEFAULT_RANGE >> 0, freq); - benchmarkSine(csvWriter, codecs2, count, length, - DEFAULT_MEAN >> 5, DEFAULT_RANGE >> 0, freq); - benchmarkSine(csvWriter, codecs2, count, length, - DEFAULT_MEAN >> 10, DEFAULT_RANGE >> 0, freq); - benchmarkSine(csvWriter, codecs2, count, length, - DEFAULT_MEAN >> 0, DEFAULT_RANGE >> 2, freq); - benchmarkSine(csvWriter, codecs2, count, length, - DEFAULT_MEAN >> 5, DEFAULT_RANGE >> 2, freq); - benchmarkSine(csvWriter, codecs2, count, length, - DEFAULT_MEAN >> 10, DEFAULT_RANGE >> 2, freq); - benchmarkSine(csvWriter, codecs2, count, length, - DEFAULT_MEAN >> 0, DEFAULT_RANGE >> 4, freq); - benchmarkSine(csvWriter, codecs2, count, length, - DEFAULT_MEAN >> 5, DEFAULT_RANGE >> 4, freq); - benchmarkSine(csvWriter, codecs2, count, length, - DEFAULT_MEAN >> 10, DEFAULT_RANGE >> 4, freq); - } - - private void benchmarkSine( - PrintWriter csvWriter, - IntegerCODEC[] codecs, - int count, - int length, - int mean, - int range, - int freq) - { - String dataProp = String.format("(mean=%1$d range=%2$d freq=%2$d)", - mean, range, freq); - int[][] data = generateSineDataChunks(0, count, length, mean, range, - freq); - int[][] delta = deltaDataChunks(data); - benchmark(csvWriter, "Sine " + dataProp, - codecs, data, DEFAULT_REPEAT, DEFAULT_WARMUP); - benchmark(csvWriter, "Sine+delta " + dataProp, - codecs, data, DEFAULT_REPEAT, DEFAULT_WARMUP); - } - - private void benchmark( - PrintWriter csvWriter, - IntegerCODEC[] codecs, - int count, - int length, - int mean, - int range) - { - String dataProp = String.format("(mean=%1$d range=%2$d)", mean, - range); - - int[][] randData = generateDataChunks(0, count, length, mean, range); - int[][] deltaData = deltaDataChunks(randData); - int[][] sortedData = sortDataChunks(randData); - int[][] sortedDeltaData = deltaDataChunks(sortedData); - - benchmark(csvWriter, "Random " + dataProp, - codecs, randData, DEFAULT_REPEAT, DEFAULT_WARMUP); - benchmark(csvWriter, "Random+delta " + dataProp, - codecs, deltaData, DEFAULT_REPEAT, DEFAULT_WARMUP); - benchmark(csvWriter, "Sorted " + dataProp, - codecs, sortedData, DEFAULT_REPEAT, DEFAULT_WARMUP); - benchmark(csvWriter, "Sorted+delta " + dataProp, - codecs, sortedDeltaData, DEFAULT_REPEAT, DEFAULT_WARMUP); - } - - private void benchmark( - PrintWriter csvWriter, - String dataName, - IntegerCODEC[] codecs, - int[][] data, - int repeat, - int warmup) - { - System.out.println("Processing: " + dataName); - for (IntegerCODEC codec : codecs) { - String codecName = codec.toString(); - for (int i = 0; i < warmup; ++i) { - benchmark(null, null, null, codec, data, repeat); - } - benchmark(csvWriter, dataName, codecName, codec, data, - repeat); - } - } - - private void benchmark( - PrintWriter csvWriter, - String dataName, - String codecName, - IntegerCODEC codec, - int[][] data, - int repeat) - { - PerformanceLogger logger = new PerformanceLogger(); - - int maxLen = getMaxLen(data); - int[] compressBuffer = new int[4 * maxLen + 1024]; - int[] decompressBuffer = new int[maxLen]; - - for (int i = 0; i < repeat; ++i) { - for (int[] array : data) { - int compSize = compress(logger, codec, array, compressBuffer); - int decompSize = decompress(logger, codec, compressBuffer, - compSize, decompressBuffer); - checkArray(array, decompressBuffer, decompSize, codec); - } - } - - if (csvWriter != null) { - csvWriter.format("\"%1$s\",\"%2$s\",%3$.2f,%4$.0f,%5$.0f\n", - dataName, codecName, logger.getBitPerInt(), - logger.getCompressSpeed(), logger.getDecompressSpeed()); - } - } - - private void checkArray( - int[] expected, - int[] actualArray, - int actualLen, - IntegerCODEC codec) - { - if (actualLen != expected.length) { - throw new RuntimeException("Length mismatch:" + - " expected=" + expected.length + " actual=" + actualLen + - " codec=" + codec.toString()); - } - for (int i = 0; i < expected.length; ++i) { - if (actualArray[i] != expected[i]) { - throw new RuntimeException("Value mismatch: " + - " where=" + i + " expected=" + expected[i] + - " actual=" + actualArray[i] + - " codec=" + codec.toString()); - } - } - } - - private int compress( - PerformanceLogger logger, - IntegerCODEC codec, - int[] src, - int[] dst) - { - IntWrapper inpos = new IntWrapper(); - IntWrapper outpos = new IntWrapper(); - logger.compressionTimer.start(); - codec.compress(src, inpos, src.length, dst, outpos); - logger.compressionTimer.end(); - int outSize = outpos.get(); - logger.addOriginalSize(src.length); - logger.addCompressedSize(outSize); - return outSize; - } - - private int decompress( - PerformanceLogger logger, - IntegerCODEC codec, - int[] src, - int srcLen, - int[] dst) - { - IntWrapper inpos = new IntWrapper(); - IntWrapper outpos = new IntWrapper(); - logger.decompressionTimer.start(); - codec.uncompress(src, inpos, srcLen, dst, outpos); - logger.decompressionTimer.end(); - return outpos.get(); - } - - public static int getMaxLen(int[][] data) { - int maxLen = 0; - for (int[] array : data) { - if (array.length > maxLen) { - maxLen = array.length; - } - } - return maxLen; - } - - public static int[][] generateSineDataChunks( - long seed, - int count, - int length, - int mean, - int range, - int freq) - { - int[][] chunks = new int[count][]; - Random r = new Random(seed); - for (int i = 0; i < count; ++i) { - int[] chunk = chunks[i] = new int[length]; - int phase = r.nextInt(2 * freq); - for (int j = 0; j < length; ++j) { - double angle = 2.0 * Math.PI * (j + phase) / freq; - chunk[j] = (int)(mean + Math.sin(angle) * range); - } - } - return chunks; - } - - public static int[][] generateDataChunks( - long seed, - int count, - int length, - int mean, - int range) - { - int offset = mean - range / 2; - int[][] chunks = new int[count][]; - Random r = new Random(seed); - for (int i = 0; i < count; ++i) { - int[] chunk = chunks[i] = new int[length]; - for (int j = 0; j < length; ++j) { - chunk[j] = r.nextInt(range) + offset; - } - } - return chunks; - } - - public static int[][] deltaDataChunks(int[][] src) { - int[][] dst = new int[src.length][]; - for (int i = 0; i < src.length; ++i) { - int[] s = src[i]; - int[] d = dst[i] = new int[s.length]; - int prev = 0; - for (int j = 0; j < s.length; ++j) { - d[j] = s[j] - prev; - prev = s[j]; - } - } - return dst; - } - - public static int[][] sortDataChunks(int[][] src) { - int[][] dst = new int[src.length][]; - for (int i = 0; i < src.length; ++i) { - dst[i] = Arrays.copyOf(src[i], src[i].length); - Arrays.sort(dst[i]); - } - return dst; - } - - public static void main(String[] args) throws Exception { - File csvFile = new File(String.format( - "benchmark-offsetted-%1$tY%1$tm%1$tdT%1$tH%1$tM%1$tS.csv", - System.currentTimeMillis())); - PrintWriter writer = null; - try { - writer = new PrintWriter(csvFile); - System.out.println("# Results will be written into a CSV file: " - + csvFile.getName()); - System.out.println(); - BenchmarkOffsettedSeries b = new BenchmarkOffsettedSeries(); - b.run(writer, 8 * 1024, 1280); - System.out.println(); - System.out.println("# Results were written into a CSV file: " - + csvFile.getName()); - } finally { - if (writer != null) { - writer.close(); - } - } - } -} diff --git a/src/main/java/me/lemire/integercompression/BinaryPacking.java b/src/main/java/me/lemire/integercompression/BinaryPacking.java index 67d8e07..c6b491c 100644 --- a/src/main/java/me/lemire/integercompression/BinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/BinaryPacking.java @@ -6,72 +6,82 @@ */ package me.lemire.integercompression; - /** * Scheme designed by D. Lemire based on a commonly used idea. * - * Note that this does not use differential coding: if you are working on - * sorted lists, use IntegratedBinaryPacking instead. - * + * Note that this does not use differential coding: if you are working on sorted + * lists, use IntegratedBinaryPacking instead. + * * @author Daniel Lemire */ public final class BinaryPacking implements IntegerCODEC { - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = inlength / 128 * 128; - if(inlength == 0) return; + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + inlength = inlength / 128 * 128; + if (inlength == 0) + return; - out[outpos.get()] = inlength; - outpos.increment(); - int tmpoutpos = outpos.get(); - for (int s = inpos.get(); s < inpos.get() + inlength; s += 32 * 4) { - final int mbits1 = Util.maxbits(in, s, 32); - final int mbits2 = Util.maxbits(in, s + 32, 32); - final int mbits3 = Util.maxbits(in, s + 2 * 32, 32); - final int mbits4 = Util.maxbits(in, s + 3 * 32, 32); - out[tmpoutpos++] = (mbits1 << 24) | (mbits2 << 16) | (mbits3 << 8) - | (mbits4); - BitPacking.fastpackwithoutmask(in, s, out, tmpoutpos, mbits1); - tmpoutpos += mbits1; - BitPacking.fastpackwithoutmask(in, s + 32, out, tmpoutpos, mbits2); - tmpoutpos += mbits2; - BitPacking.fastpackwithoutmask(in, s + 2 * 32, out, tmpoutpos, mbits3); - tmpoutpos += mbits3; - BitPacking.fastpackwithoutmask(in, s + 3 * 32, out, tmpoutpos, mbits4); - tmpoutpos += mbits4; + out[outpos.get()] = inlength; + outpos.increment(); + int tmpoutpos = outpos.get(); + for (int s = inpos.get(); s < inpos.get() + inlength; s += 32 * 4) { + final int mbits1 = Util.maxbits(in, s, 32); + final int mbits2 = Util.maxbits(in, s + 32, 32); + final int mbits3 = Util.maxbits(in, s + 2 * 32, 32); + final int mbits4 = Util.maxbits(in, s + 3 * 32, 32); + out[tmpoutpos++] = (mbits1 << 24) | (mbits2 << 16) + | (mbits3 << 8) | (mbits4); + BitPacking.fastpackwithoutmask(in, s, out, tmpoutpos, + mbits1); + tmpoutpos += mbits1; + BitPacking.fastpackwithoutmask(in, s + 32, out, + tmpoutpos, mbits2); + tmpoutpos += mbits2; + BitPacking.fastpackwithoutmask(in, s + 2 * 32, out, + tmpoutpos, mbits3); + tmpoutpos += mbits3; + BitPacking.fastpackwithoutmask(in, s + 3 * 32, out, + tmpoutpos, mbits4); + tmpoutpos += mbits4; + } + inpos.add(inlength); + outpos.set(tmpoutpos); } - inpos.add(inlength); - outpos.set(tmpoutpos); - } - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - if(inlength == 0) return; - final int outlength = in[inpos.get()]; - inpos.increment(); - int tmpinpos = inpos.get(); - for (int s = outpos.get(); s < outpos.get() + outlength; s += 32 * 4) { - final int mbits1 = (in[tmpinpos] >>> 24); - final int mbits2 = (in[tmpinpos] >>> 16) & 0xFF; - final int mbits3 = (in[tmpinpos] >>> 8) & 0xFF; - final int mbits4 = (in[tmpinpos]) & 0xFF; - ++tmpinpos; - BitPacking.fastunpack(in, tmpinpos, out, s, mbits1); - tmpinpos += mbits1; - BitPacking.fastunpack(in, tmpinpos, out, s + 32, mbits2); - tmpinpos += mbits2; - BitPacking.fastunpack(in, tmpinpos, out, s + 2 * 32, mbits3); - tmpinpos += mbits3; - BitPacking.fastunpack(in, tmpinpos, out, s + 3 * 32, mbits4); - tmpinpos += mbits4; + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + if (inlength == 0) + return; + final int outlength = in[inpos.get()]; + inpos.increment(); + int tmpinpos = inpos.get(); + for (int s = outpos.get(); s < outpos.get() + outlength; s += 32 * 4) { + final int mbits1 = (in[tmpinpos] >>> 24); + final int mbits2 = (in[tmpinpos] >>> 16) & 0xFF; + final int mbits3 = (in[tmpinpos] >>> 8) & 0xFF; + final int mbits4 = (in[tmpinpos]) & 0xFF; + ++tmpinpos; + BitPacking.fastunpack(in, tmpinpos, out, s, mbits1); + tmpinpos += mbits1; + BitPacking + .fastunpack(in, tmpinpos, out, s + 32, mbits2); + tmpinpos += mbits2; + BitPacking.fastunpack(in, tmpinpos, out, s + 2 * 32, + mbits3); + tmpinpos += mbits3; + BitPacking.fastunpack(in, tmpinpos, out, s + 3 * 32, + mbits4); + tmpinpos += mbits4; + } + outpos.add(outlength); + inpos.set(tmpinpos); } - outpos.add(outlength); - inpos.set(tmpinpos); - } - @Override - public String toString() { - return this.getClass().getSimpleName(); - } + @Override + public String toString() { + return this.getClass().getSimpleName(); + } } diff --git a/src/main/java/me/lemire/integercompression/BitPacking.java b/src/main/java/me/lemire/integercompression/BitPacking.java index 8af38b5..490d971 100644 --- a/src/main/java/me/lemire/integercompression/BitPacking.java +++ b/src/main/java/me/lemire/integercompression/BitPacking.java @@ -13,6939 +13,4658 @@ * Bitpacking routines * * @author Daniel Lemire - * + * */ public final class BitPacking { + protected static void fastpackwithoutmask1(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 1) + | ((in[2 + inpos]) << 2) | ((in[3 + inpos]) << 3) + | ((in[4 + inpos]) << 4) | ((in[5 + inpos]) << 5) + | ((in[6 + inpos]) << 6) | ((in[7 + inpos]) << 7) + | ((in[8 + inpos]) << 8) | ((in[9 + inpos]) << 9) + | ((in[10 + inpos]) << 10) | ((in[11 + inpos]) << 11) + | ((in[12 + inpos]) << 12) | ((in[13 + inpos]) << 13) + | ((in[14 + inpos]) << 14) | ((in[15 + inpos]) << 15) + | ((in[16 + inpos]) << 16) | ((in[17 + inpos]) << 17) + | ((in[18 + inpos]) << 18) | ((in[19 + inpos]) << 19) + | ((in[20 + inpos]) << 20) | ((in[21 + inpos]) << 21) + | ((in[22 + inpos]) << 22) | ((in[23 + inpos]) << 23) + | ((in[24 + inpos]) << 24) | ((in[25 + inpos]) << 25) + | ((in[26 + inpos]) << 26) | ((in[27 + inpos]) << 27) + | ((in[28 + inpos]) << 28) | ((in[29 + inpos]) << 29) + | ((in[30 + inpos]) << 30) | ((in[31 + inpos]) << 31); + } - protected static void fastpackwithoutmask1(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 1) - | ((in[2 + inpos]) << 2) - | ((in[3 + inpos]) << 3) - | ((in[4 + inpos]) << 4) - | ((in[5 + inpos]) << 5) - | ((in[6 + inpos]) << 6) - | ((in[7 + inpos]) << 7) - | ((in[8 + inpos]) << 8) - | ((in[9 + inpos]) << 9) - | ((in[10 + inpos]) << 10) - | ((in[11 + inpos]) << 11) - | ((in[12 + inpos]) << 12) - | ((in[13 + inpos]) << 13) - | ((in[14 + inpos]) << 14) - | ((in[15 + inpos]) << 15) - | ((in[16 + inpos]) << 16) - | ((in[17 + inpos]) << 17) - | ((in[18 + inpos]) << 18) - | ((in[19 + inpos]) << 19) - | ((in[20 + inpos]) << 20) - | ((in[21 + inpos]) << 21) - | ((in[22 + inpos]) << 22) - | ((in[23 + inpos]) << 23) - | ((in[24 + inpos]) << 24) - | ((in[25 + inpos]) << 25) - | ((in[26 + inpos]) << 26) - | ((in[27 + inpos]) << 27) - | ((in[28 + inpos]) << 28) - | ((in[29 + inpos]) << 29) - | ((in[30 + inpos]) << 30) - | ((in[31 + inpos]) << 31) - ; - } - - - protected static void fastpackwithoutmask2(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 2) - | ((in[2 + inpos]) << 4) - | ((in[3 + inpos]) << 6) - | ((in[4 + inpos]) << 8) - | ((in[5 + inpos]) << 10) - | ((in[6 + inpos]) << 12) - | ((in[7 + inpos]) << 14) - | ((in[8 + inpos]) << 16) - | ((in[9 + inpos]) << 18) - | ((in[10 + inpos]) << 20) - | ((in[11 + inpos]) << 22) - | ((in[12 + inpos]) << 24) - | ((in[13 + inpos]) << 26) - | ((in[14 + inpos]) << 28) - | ((in[15 + inpos]) << 30) - ; - out[1 + outpos] = in[16 + inpos] - | ((in[17 + inpos]) << 2) - | ((in[18 + inpos]) << 4) - | ((in[19 + inpos]) << 6) - | ((in[20 + inpos]) << 8) - | ((in[21 + inpos]) << 10) - | ((in[22 + inpos]) << 12) - | ((in[23 + inpos]) << 14) - | ((in[24 + inpos]) << 16) - | ((in[25 + inpos]) << 18) - | ((in[26 + inpos]) << 20) - | ((in[27 + inpos]) << 22) - | ((in[28 + inpos]) << 24) - | ((in[29 + inpos]) << 26) - | ((in[30 + inpos]) << 28) - | ((in[31 + inpos]) << 30) - ; - } - - - protected static void fastpackwithoutmask3(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 3) - | ((in[2 + inpos]) << 6) - | ((in[3 + inpos]) << 9) - | ((in[4 + inpos]) << 12) - | ((in[5 + inpos]) << 15) - | ((in[6 + inpos]) << 18) - | ((in[7 + inpos]) << 21) - | ((in[8 + inpos]) << 24) - | ((in[9 + inpos]) << 27) - | ((in[10 + inpos]) << 30) - ; - out[1 + outpos] = ((in[10 + inpos]) >>> (3 - 1)) - | ((in[11 + inpos]) << 1) - | ((in[12 + inpos]) << 4) - | ((in[13 + inpos]) << 7) - | ((in[14 + inpos]) << 10) - | ((in[15 + inpos]) << 13) - | ((in[16 + inpos]) << 16) - | ((in[17 + inpos]) << 19) - | ((in[18 + inpos]) << 22) - | ((in[19 + inpos]) << 25) - | ((in[20 + inpos]) << 28) - | ((in[21 + inpos]) << 31) - ; - out[2 + outpos] = ((in[21 + inpos]) >>> (3 - 2)) - | ((in[22 + inpos]) << 2) - | ((in[23 + inpos]) << 5) - | ((in[24 + inpos]) << 8) - | ((in[25 + inpos]) << 11) - | ((in[26 + inpos]) << 14) - | ((in[27 + inpos]) << 17) - | ((in[28 + inpos]) << 20) - | ((in[29 + inpos]) << 23) - | ((in[30 + inpos]) << 26) - | ((in[31 + inpos]) << 29) - ; - } - - - protected static void fastpackwithoutmask4(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 4) - | ((in[2 + inpos]) << 8) - | ((in[3 + inpos]) << 12) - | ((in[4 + inpos]) << 16) - | ((in[5 + inpos]) << 20) - | ((in[6 + inpos]) << 24) - | ((in[7 + inpos]) << 28) - ; - out[1 + outpos] = in[8 + inpos] - | ((in[9 + inpos]) << 4) - | ((in[10 + inpos]) << 8) - | ((in[11 + inpos]) << 12) - | ((in[12 + inpos]) << 16) - | ((in[13 + inpos]) << 20) - | ((in[14 + inpos]) << 24) - | ((in[15 + inpos]) << 28) - ; - out[2 + outpos] = in[16 + inpos] - | ((in[17 + inpos]) << 4) - | ((in[18 + inpos]) << 8) - | ((in[19 + inpos]) << 12) - | ((in[20 + inpos]) << 16) - | ((in[21 + inpos]) << 20) - | ((in[22 + inpos]) << 24) - | ((in[23 + inpos]) << 28) - ; - out[3 + outpos] = in[24 + inpos] - | ((in[25 + inpos]) << 4) - | ((in[26 + inpos]) << 8) - | ((in[27 + inpos]) << 12) - | ((in[28 + inpos]) << 16) - | ((in[29 + inpos]) << 20) - | ((in[30 + inpos]) << 24) - | ((in[31 + inpos]) << 28) - ; - } - - - protected static void fastpackwithoutmask5(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 5) - | ((in[2 + inpos]) << 10) - | ((in[3 + inpos]) << 15) - | ((in[4 + inpos]) << 20) - | ((in[5 + inpos]) << 25) - | ((in[6 + inpos]) << 30) - ; - out[1 + outpos] = ((in[6 + inpos]) >>> (5 - 3)) - | ((in[7 + inpos]) << 3) - | ((in[8 + inpos]) << 8) - | ((in[9 + inpos]) << 13) - | ((in[10 + inpos]) << 18) - | ((in[11 + inpos]) << 23) - | ((in[12 + inpos]) << 28) - ; - out[2 + outpos] = ((in[12 + inpos]) >>> (5 - 1)) - | ((in[13 + inpos]) << 1) - | ((in[14 + inpos]) << 6) - | ((in[15 + inpos]) << 11) - | ((in[16 + inpos]) << 16) - | ((in[17 + inpos]) << 21) - | ((in[18 + inpos]) << 26) - | ((in[19 + inpos]) << 31) - ; - out[3 + outpos] = ((in[19 + inpos]) >>> (5 - 4)) - | ((in[20 + inpos]) << 4) - | ((in[21 + inpos]) << 9) - | ((in[22 + inpos]) << 14) - | ((in[23 + inpos]) << 19) - | ((in[24 + inpos]) << 24) - | ((in[25 + inpos]) << 29) - ; - out[4 + outpos] = ((in[25 + inpos]) >>> (5 - 2)) - | ((in[26 + inpos]) << 2) - | ((in[27 + inpos]) << 7) - | ((in[28 + inpos]) << 12) - | ((in[29 + inpos]) << 17) - | ((in[30 + inpos]) << 22) - | ((in[31 + inpos]) << 27) - ; - } - - - protected static void fastpackwithoutmask6(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 6) - | ((in[2 + inpos]) << 12) - | ((in[3 + inpos]) << 18) - | ((in[4 + inpos]) << 24) - | ((in[5 + inpos]) << 30) - ; - out[1 + outpos] = ((in[5 + inpos]) >>> (6 - 4)) - | ((in[6 + inpos]) << 4) - | ((in[7 + inpos]) << 10) - | ((in[8 + inpos]) << 16) - | ((in[9 + inpos]) << 22) - | ((in[10 + inpos]) << 28) - ; - out[2 + outpos] = ((in[10 + inpos]) >>> (6 - 2)) - | ((in[11 + inpos]) << 2) - | ((in[12 + inpos]) << 8) - | ((in[13 + inpos]) << 14) - | ((in[14 + inpos]) << 20) - | ((in[15 + inpos]) << 26) - ; - out[3 + outpos] = in[16 + inpos] - | ((in[17 + inpos]) << 6) - | ((in[18 + inpos]) << 12) - | ((in[19 + inpos]) << 18) - | ((in[20 + inpos]) << 24) - | ((in[21 + inpos]) << 30) - ; - out[4 + outpos] = ((in[21 + inpos]) >>> (6 - 4)) - | ((in[22 + inpos]) << 4) - | ((in[23 + inpos]) << 10) - | ((in[24 + inpos]) << 16) - | ((in[25 + inpos]) << 22) - | ((in[26 + inpos]) << 28) - ; - out[5 + outpos] = ((in[26 + inpos]) >>> (6 - 2)) - | ((in[27 + inpos]) << 2) - | ((in[28 + inpos]) << 8) - | ((in[29 + inpos]) << 14) - | ((in[30 + inpos]) << 20) - | ((in[31 + inpos]) << 26) - ; - } - - - protected static void fastpackwithoutmask7(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 7) - | ((in[2 + inpos]) << 14) - | ((in[3 + inpos]) << 21) - | ((in[4 + inpos]) << 28) - ; - out[1 + outpos] = ((in[4 + inpos]) >>> (7 - 3)) - | ((in[5 + inpos]) << 3) - | ((in[6 + inpos]) << 10) - | ((in[7 + inpos]) << 17) - | ((in[8 + inpos]) << 24) - | ((in[9 + inpos]) << 31) - ; - out[2 + outpos] = ((in[9 + inpos]) >>> (7 - 6)) - | ((in[10 + inpos]) << 6) - | ((in[11 + inpos]) << 13) - | ((in[12 + inpos]) << 20) - | ((in[13 + inpos]) << 27) - ; - out[3 + outpos] = ((in[13 + inpos]) >>> (7 - 2)) - | ((in[14 + inpos]) << 2) - | ((in[15 + inpos]) << 9) - | ((in[16 + inpos]) << 16) - | ((in[17 + inpos]) << 23) - | ((in[18 + inpos]) << 30) - ; - out[4 + outpos] = ((in[18 + inpos]) >>> (7 - 5)) - | ((in[19 + inpos]) << 5) - | ((in[20 + inpos]) << 12) - | ((in[21 + inpos]) << 19) - | ((in[22 + inpos]) << 26) - ; - out[5 + outpos] = ((in[22 + inpos]) >>> (7 - 1)) - | ((in[23 + inpos]) << 1) - | ((in[24 + inpos]) << 8) - | ((in[25 + inpos]) << 15) - | ((in[26 + inpos]) << 22) - | ((in[27 + inpos]) << 29) - ; - out[6 + outpos] = ((in[27 + inpos]) >>> (7 - 4)) - | ((in[28 + inpos]) << 4) - | ((in[29 + inpos]) << 11) - | ((in[30 + inpos]) << 18) - | ((in[31 + inpos]) << 25) - ; - } - - - protected static void fastpackwithoutmask8(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 8) - | ((in[2 + inpos]) << 16) - | ((in[3 + inpos]) << 24) - ; - out[1 + outpos] = in[4 + inpos] - | ((in[5 + inpos]) << 8) - | ((in[6 + inpos]) << 16) - | ((in[7 + inpos]) << 24) - ; - out[2 + outpos] = in[8 + inpos] - | ((in[9 + inpos]) << 8) - | ((in[10 + inpos]) << 16) - | ((in[11 + inpos]) << 24) - ; - out[3 + outpos] = in[12 + inpos] - | ((in[13 + inpos]) << 8) - | ((in[14 + inpos]) << 16) - | ((in[15 + inpos]) << 24) - ; - out[4 + outpos] = in[16 + inpos] - | ((in[17 + inpos]) << 8) - | ((in[18 + inpos]) << 16) - | ((in[19 + inpos]) << 24) - ; - out[5 + outpos] = in[20 + inpos] - | ((in[21 + inpos]) << 8) - | ((in[22 + inpos]) << 16) - | ((in[23 + inpos]) << 24) - ; - out[6 + outpos] = in[24 + inpos] - | ((in[25 + inpos]) << 8) - | ((in[26 + inpos]) << 16) - | ((in[27 + inpos]) << 24) - ; - out[7 + outpos] = in[28 + inpos] - | ((in[29 + inpos]) << 8) - | ((in[30 + inpos]) << 16) - | ((in[31 + inpos]) << 24) - ; - } - - - protected static void fastpackwithoutmask9(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 9) - | ((in[2 + inpos]) << 18) - | ((in[3 + inpos]) << 27) - ; - out[1 + outpos] = ((in[3 + inpos]) >>> (9 - 4)) - | ((in[4 + inpos]) << 4) - | ((in[5 + inpos]) << 13) - | ((in[6 + inpos]) << 22) - | ((in[7 + inpos]) << 31) - ; - out[2 + outpos] = ((in[7 + inpos]) >>> (9 - 8)) - | ((in[8 + inpos]) << 8) - | ((in[9 + inpos]) << 17) - | ((in[10 + inpos]) << 26) - ; - out[3 + outpos] = ((in[10 + inpos]) >>> (9 - 3)) - | ((in[11 + inpos]) << 3) - | ((in[12 + inpos]) << 12) - | ((in[13 + inpos]) << 21) - | ((in[14 + inpos]) << 30) - ; - out[4 + outpos] = ((in[14 + inpos]) >>> (9 - 7)) - | ((in[15 + inpos]) << 7) - | ((in[16 + inpos]) << 16) - | ((in[17 + inpos]) << 25) - ; - out[5 + outpos] = ((in[17 + inpos]) >>> (9 - 2)) - | ((in[18 + inpos]) << 2) - | ((in[19 + inpos]) << 11) - | ((in[20 + inpos]) << 20) - | ((in[21 + inpos]) << 29) - ; - out[6 + outpos] = ((in[21 + inpos]) >>> (9 - 6)) - | ((in[22 + inpos]) << 6) - | ((in[23 + inpos]) << 15) - | ((in[24 + inpos]) << 24) - ; - out[7 + outpos] = ((in[24 + inpos]) >>> (9 - 1)) - | ((in[25 + inpos]) << 1) - | ((in[26 + inpos]) << 10) - | ((in[27 + inpos]) << 19) - | ((in[28 + inpos]) << 28) - ; - out[8 + outpos] = ((in[28 + inpos]) >>> (9 - 5)) - | ((in[29 + inpos]) << 5) - | ((in[30 + inpos]) << 14) - | ((in[31 + inpos]) << 23) - ; - } - - - protected static void fastpackwithoutmask10(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 10) - | ((in[2 + inpos]) << 20) - | ((in[3 + inpos]) << 30) - ; - out[1 + outpos] = ((in[3 + inpos]) >>> (10 - 8)) - | ((in[4 + inpos]) << 8) - | ((in[5 + inpos]) << 18) - | ((in[6 + inpos]) << 28) - ; - out[2 + outpos] = ((in[6 + inpos]) >>> (10 - 6)) - | ((in[7 + inpos]) << 6) - | ((in[8 + inpos]) << 16) - | ((in[9 + inpos]) << 26) - ; - out[3 + outpos] = ((in[9 + inpos]) >>> (10 - 4)) - | ((in[10 + inpos]) << 4) - | ((in[11 + inpos]) << 14) - | ((in[12 + inpos]) << 24) - ; - out[4 + outpos] = ((in[12 + inpos]) >>> (10 - 2)) - | ((in[13 + inpos]) << 2) - | ((in[14 + inpos]) << 12) - | ((in[15 + inpos]) << 22) - ; - out[5 + outpos] = in[16 + inpos] - | ((in[17 + inpos]) << 10) - | ((in[18 + inpos]) << 20) - | ((in[19 + inpos]) << 30) - ; - out[6 + outpos] = ((in[19 + inpos]) >>> (10 - 8)) - | ((in[20 + inpos]) << 8) - | ((in[21 + inpos]) << 18) - | ((in[22 + inpos]) << 28) - ; - out[7 + outpos] = ((in[22 + inpos]) >>> (10 - 6)) - | ((in[23 + inpos]) << 6) - | ((in[24 + inpos]) << 16) - | ((in[25 + inpos]) << 26) - ; - out[8 + outpos] = ((in[25 + inpos]) >>> (10 - 4)) - | ((in[26 + inpos]) << 4) - | ((in[27 + inpos]) << 14) - | ((in[28 + inpos]) << 24) - ; - out[9 + outpos] = ((in[28 + inpos]) >>> (10 - 2)) - | ((in[29 + inpos]) << 2) - | ((in[30 + inpos]) << 12) - | ((in[31 + inpos]) << 22) - ; - } - - - protected static void fastpackwithoutmask11(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 11) - | ((in[2 + inpos]) << 22) - ; - out[1 + outpos] = ((in[2 + inpos]) >>> (11 - 1)) - | ((in[3 + inpos]) << 1) - | ((in[4 + inpos]) << 12) - | ((in[5 + inpos]) << 23) - ; - out[2 + outpos] = ((in[5 + inpos]) >>> (11 - 2)) - | ((in[6 + inpos]) << 2) - | ((in[7 + inpos]) << 13) - | ((in[8 + inpos]) << 24) - ; - out[3 + outpos] = ((in[8 + inpos]) >>> (11 - 3)) - | ((in[9 + inpos]) << 3) - | ((in[10 + inpos]) << 14) - | ((in[11 + inpos]) << 25) - ; - out[4 + outpos] = ((in[11 + inpos]) >>> (11 - 4)) - | ((in[12 + inpos]) << 4) - | ((in[13 + inpos]) << 15) - | ((in[14 + inpos]) << 26) - ; - out[5 + outpos] = ((in[14 + inpos]) >>> (11 - 5)) - | ((in[15 + inpos]) << 5) - | ((in[16 + inpos]) << 16) - | ((in[17 + inpos]) << 27) - ; - out[6 + outpos] = ((in[17 + inpos]) >>> (11 - 6)) - | ((in[18 + inpos]) << 6) - | ((in[19 + inpos]) << 17) - | ((in[20 + inpos]) << 28) - ; - out[7 + outpos] = ((in[20 + inpos]) >>> (11 - 7)) - | ((in[21 + inpos]) << 7) - | ((in[22 + inpos]) << 18) - | ((in[23 + inpos]) << 29) - ; - out[8 + outpos] = ((in[23 + inpos]) >>> (11 - 8)) - | ((in[24 + inpos]) << 8) - | ((in[25 + inpos]) << 19) - | ((in[26 + inpos]) << 30) - ; - out[9 + outpos] = ((in[26 + inpos]) >>> (11 - 9)) - | ((in[27 + inpos]) << 9) - | ((in[28 + inpos]) << 20) - | ((in[29 + inpos]) << 31) - ; - out[10 + outpos] = ((in[29 + inpos]) >>> (11 - 10)) - | ((in[30 + inpos]) << 10) - | ((in[31 + inpos]) << 21) - ; - } - - - protected static void fastpackwithoutmask12(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 12) - | ((in[2 + inpos]) << 24) - ; - out[1 + outpos] = ((in[2 + inpos]) >>> (12 - 4)) - | ((in[3 + inpos]) << 4) - | ((in[4 + inpos]) << 16) - | ((in[5 + inpos]) << 28) - ; - out[2 + outpos] = ((in[5 + inpos]) >>> (12 - 8)) - | ((in[6 + inpos]) << 8) - | ((in[7 + inpos]) << 20) - ; - out[3 + outpos] = in[8 + inpos] - | ((in[9 + inpos]) << 12) - | ((in[10 + inpos]) << 24) - ; - out[4 + outpos] = ((in[10 + inpos]) >>> (12 - 4)) - | ((in[11 + inpos]) << 4) - | ((in[12 + inpos]) << 16) - | ((in[13 + inpos]) << 28) - ; - out[5 + outpos] = ((in[13 + inpos]) >>> (12 - 8)) - | ((in[14 + inpos]) << 8) - | ((in[15 + inpos]) << 20) - ; - out[6 + outpos] = in[16 + inpos] - | ((in[17 + inpos]) << 12) - | ((in[18 + inpos]) << 24) - ; - out[7 + outpos] = ((in[18 + inpos]) >>> (12 - 4)) - | ((in[19 + inpos]) << 4) - | ((in[20 + inpos]) << 16) - | ((in[21 + inpos]) << 28) - ; - out[8 + outpos] = ((in[21 + inpos]) >>> (12 - 8)) - | ((in[22 + inpos]) << 8) - | ((in[23 + inpos]) << 20) - ; - out[9 + outpos] = in[24 + inpos] - | ((in[25 + inpos]) << 12) - | ((in[26 + inpos]) << 24) - ; - out[10 + outpos] = ((in[26 + inpos]) >>> (12 - 4)) - | ((in[27 + inpos]) << 4) - | ((in[28 + inpos]) << 16) - | ((in[29 + inpos]) << 28) - ; - out[11 + outpos] = ((in[29 + inpos]) >>> (12 - 8)) - | ((in[30 + inpos]) << 8) - | ((in[31 + inpos]) << 20) - ; - } - - - protected static void fastpackwithoutmask13(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 13) - | ((in[2 + inpos]) << 26) - ; - out[1 + outpos] = ((in[2 + inpos]) >>> (13 - 7)) - | ((in[3 + inpos]) << 7) - | ((in[4 + inpos]) << 20) - ; - out[2 + outpos] = ((in[4 + inpos]) >>> (13 - 1)) - | ((in[5 + inpos]) << 1) - | ((in[6 + inpos]) << 14) - | ((in[7 + inpos]) << 27) - ; - out[3 + outpos] = ((in[7 + inpos]) >>> (13 - 8)) - | ((in[8 + inpos]) << 8) - | ((in[9 + inpos]) << 21) - ; - out[4 + outpos] = ((in[9 + inpos]) >>> (13 - 2)) - | ((in[10 + inpos]) << 2) - | ((in[11 + inpos]) << 15) - | ((in[12 + inpos]) << 28) - ; - out[5 + outpos] = ((in[12 + inpos]) >>> (13 - 9)) - | ((in[13 + inpos]) << 9) - | ((in[14 + inpos]) << 22) - ; - out[6 + outpos] = ((in[14 + inpos]) >>> (13 - 3)) - | ((in[15 + inpos]) << 3) - | ((in[16 + inpos]) << 16) - | ((in[17 + inpos]) << 29) - ; - out[7 + outpos] = ((in[17 + inpos]) >>> (13 - 10)) - | ((in[18 + inpos]) << 10) - | ((in[19 + inpos]) << 23) - ; - out[8 + outpos] = ((in[19 + inpos]) >>> (13 - 4)) - | ((in[20 + inpos]) << 4) - | ((in[21 + inpos]) << 17) - | ((in[22 + inpos]) << 30) - ; - out[9 + outpos] = ((in[22 + inpos]) >>> (13 - 11)) - | ((in[23 + inpos]) << 11) - | ((in[24 + inpos]) << 24) - ; - out[10 + outpos] = ((in[24 + inpos]) >>> (13 - 5)) - | ((in[25 + inpos]) << 5) - | ((in[26 + inpos]) << 18) - | ((in[27 + inpos]) << 31) - ; - out[11 + outpos] = ((in[27 + inpos]) >>> (13 - 12)) - | ((in[28 + inpos]) << 12) - | ((in[29 + inpos]) << 25) - ; - out[12 + outpos] = ((in[29 + inpos]) >>> (13 - 6)) - | ((in[30 + inpos]) << 6) - | ((in[31 + inpos]) << 19) - ; - } - - - protected static void fastpackwithoutmask14(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 14) - | ((in[2 + inpos]) << 28) - ; - out[1 + outpos] = ((in[2 + inpos]) >>> (14 - 10)) - | ((in[3 + inpos]) << 10) - | ((in[4 + inpos]) << 24) - ; - out[2 + outpos] = ((in[4 + inpos]) >>> (14 - 6)) - | ((in[5 + inpos]) << 6) - | ((in[6 + inpos]) << 20) - ; - out[3 + outpos] = ((in[6 + inpos]) >>> (14 - 2)) - | ((in[7 + inpos]) << 2) - | ((in[8 + inpos]) << 16) - | ((in[9 + inpos]) << 30) - ; - out[4 + outpos] = ((in[9 + inpos]) >>> (14 - 12)) - | ((in[10 + inpos]) << 12) - | ((in[11 + inpos]) << 26) - ; - out[5 + outpos] = ((in[11 + inpos]) >>> (14 - 8)) - | ((in[12 + inpos]) << 8) - | ((in[13 + inpos]) << 22) - ; - out[6 + outpos] = ((in[13 + inpos]) >>> (14 - 4)) - | ((in[14 + inpos]) << 4) - | ((in[15 + inpos]) << 18) - ; - out[7 + outpos] = in[16 + inpos] - | ((in[17 + inpos]) << 14) - | ((in[18 + inpos]) << 28) - ; - out[8 + outpos] = ((in[18 + inpos]) >>> (14 - 10)) - | ((in[19 + inpos]) << 10) - | ((in[20 + inpos]) << 24) - ; - out[9 + outpos] = ((in[20 + inpos]) >>> (14 - 6)) - | ((in[21 + inpos]) << 6) - | ((in[22 + inpos]) << 20) - ; - out[10 + outpos] = ((in[22 + inpos]) >>> (14 - 2)) - | ((in[23 + inpos]) << 2) - | ((in[24 + inpos]) << 16) - | ((in[25 + inpos]) << 30) - ; - out[11 + outpos] = ((in[25 + inpos]) >>> (14 - 12)) - | ((in[26 + inpos]) << 12) - | ((in[27 + inpos]) << 26) - ; - out[12 + outpos] = ((in[27 + inpos]) >>> (14 - 8)) - | ((in[28 + inpos]) << 8) - | ((in[29 + inpos]) << 22) - ; - out[13 + outpos] = ((in[29 + inpos]) >>> (14 - 4)) - | ((in[30 + inpos]) << 4) - | ((in[31 + inpos]) << 18) - ; - } - - - protected static void fastpackwithoutmask15(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 15) - | ((in[2 + inpos]) << 30) - ; - out[1 + outpos] = ((in[2 + inpos]) >>> (15 - 13)) - | ((in[3 + inpos]) << 13) - | ((in[4 + inpos]) << 28) - ; - out[2 + outpos] = ((in[4 + inpos]) >>> (15 - 11)) - | ((in[5 + inpos]) << 11) - | ((in[6 + inpos]) << 26) - ; - out[3 + outpos] = ((in[6 + inpos]) >>> (15 - 9)) - | ((in[7 + inpos]) << 9) - | ((in[8 + inpos]) << 24) - ; - out[4 + outpos] = ((in[8 + inpos]) >>> (15 - 7)) - | ((in[9 + inpos]) << 7) - | ((in[10 + inpos]) << 22) - ; - out[5 + outpos] = ((in[10 + inpos]) >>> (15 - 5)) - | ((in[11 + inpos]) << 5) - | ((in[12 + inpos]) << 20) - ; - out[6 + outpos] = ((in[12 + inpos]) >>> (15 - 3)) - | ((in[13 + inpos]) << 3) - | ((in[14 + inpos]) << 18) - ; - out[7 + outpos] = ((in[14 + inpos]) >>> (15 - 1)) - | ((in[15 + inpos]) << 1) - | ((in[16 + inpos]) << 16) - | ((in[17 + inpos]) << 31) - ; - out[8 + outpos] = ((in[17 + inpos]) >>> (15 - 14)) - | ((in[18 + inpos]) << 14) - | ((in[19 + inpos]) << 29) - ; - out[9 + outpos] = ((in[19 + inpos]) >>> (15 - 12)) - | ((in[20 + inpos]) << 12) - | ((in[21 + inpos]) << 27) - ; - out[10 + outpos] = ((in[21 + inpos]) >>> (15 - 10)) - | ((in[22 + inpos]) << 10) - | ((in[23 + inpos]) << 25) - ; - out[11 + outpos] = ((in[23 + inpos]) >>> (15 - 8)) - | ((in[24 + inpos]) << 8) - | ((in[25 + inpos]) << 23) - ; - out[12 + outpos] = ((in[25 + inpos]) >>> (15 - 6)) - | ((in[26 + inpos]) << 6) - | ((in[27 + inpos]) << 21) - ; - out[13 + outpos] = ((in[27 + inpos]) >>> (15 - 4)) - | ((in[28 + inpos]) << 4) - | ((in[29 + inpos]) << 19) - ; - out[14 + outpos] = ((in[29 + inpos]) >>> (15 - 2)) - | ((in[30 + inpos]) << 2) - | ((in[31 + inpos]) << 17) - ; - } - - - protected static void fastpackwithoutmask16(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 16) - ; - out[1 + outpos] = in[2 + inpos] - | ((in[3 + inpos]) << 16) - ; - out[2 + outpos] = in[4 + inpos] - | ((in[5 + inpos]) << 16) - ; - out[3 + outpos] = in[6 + inpos] - | ((in[7 + inpos]) << 16) - ; - out[4 + outpos] = in[8 + inpos] - | ((in[9 + inpos]) << 16) - ; - out[5 + outpos] = in[10 + inpos] - | ((in[11 + inpos]) << 16) - ; - out[6 + outpos] = in[12 + inpos] - | ((in[13 + inpos]) << 16) - ; - out[7 + outpos] = in[14 + inpos] - | ((in[15 + inpos]) << 16) - ; - out[8 + outpos] = in[16 + inpos] - | ((in[17 + inpos]) << 16) - ; - out[9 + outpos] = in[18 + inpos] - | ((in[19 + inpos]) << 16) - ; - out[10 + outpos] = in[20 + inpos] - | ((in[21 + inpos]) << 16) - ; - out[11 + outpos] = in[22 + inpos] - | ((in[23 + inpos]) << 16) - ; - out[12 + outpos] = in[24 + inpos] - | ((in[25 + inpos]) << 16) - ; - out[13 + outpos] = in[26 + inpos] - | ((in[27 + inpos]) << 16) - ; - out[14 + outpos] = in[28 + inpos] - | ((in[29 + inpos]) << 16) - ; - out[15 + outpos] = in[30 + inpos] - | ((in[31 + inpos]) << 16) - ; - } - - - protected static void fastpackwithoutmask17(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 17) - ; - out[1 + outpos] = ((in[1 + inpos]) >>> (17 - 2)) - | ((in[2 + inpos]) << 2) - | ((in[3 + inpos]) << 19) - ; - out[2 + outpos] = ((in[3 + inpos]) >>> (17 - 4)) - | ((in[4 + inpos]) << 4) - | ((in[5 + inpos]) << 21) - ; - out[3 + outpos] = ((in[5 + inpos]) >>> (17 - 6)) - | ((in[6 + inpos]) << 6) - | ((in[7 + inpos]) << 23) - ; - out[4 + outpos] = ((in[7 + inpos]) >>> (17 - 8)) - | ((in[8 + inpos]) << 8) - | ((in[9 + inpos]) << 25) - ; - out[5 + outpos] = ((in[9 + inpos]) >>> (17 - 10)) - | ((in[10 + inpos]) << 10) - | ((in[11 + inpos]) << 27) - ; - out[6 + outpos] = ((in[11 + inpos]) >>> (17 - 12)) - | ((in[12 + inpos]) << 12) - | ((in[13 + inpos]) << 29) - ; - out[7 + outpos] = ((in[13 + inpos]) >>> (17 - 14)) - | ((in[14 + inpos]) << 14) - | ((in[15 + inpos]) << 31) - ; - out[8 + outpos] = ((in[15 + inpos]) >>> (17 - 16)) - | ((in[16 + inpos]) << 16) - ; - out[9 + outpos] = ((in[16 + inpos]) >>> (17 - 1)) - | ((in[17 + inpos]) << 1) - | ((in[18 + inpos]) << 18) - ; - out[10 + outpos] = ((in[18 + inpos]) >>> (17 - 3)) - | ((in[19 + inpos]) << 3) - | ((in[20 + inpos]) << 20) - ; - out[11 + outpos] = ((in[20 + inpos]) >>> (17 - 5)) - | ((in[21 + inpos]) << 5) - | ((in[22 + inpos]) << 22) - ; - out[12 + outpos] = ((in[22 + inpos]) >>> (17 - 7)) - | ((in[23 + inpos]) << 7) - | ((in[24 + inpos]) << 24) - ; - out[13 + outpos] = ((in[24 + inpos]) >>> (17 - 9)) - | ((in[25 + inpos]) << 9) - | ((in[26 + inpos]) << 26) - ; - out[14 + outpos] = ((in[26 + inpos]) >>> (17 - 11)) - | ((in[27 + inpos]) << 11) - | ((in[28 + inpos]) << 28) - ; - out[15 + outpos] = ((in[28 + inpos]) >>> (17 - 13)) - | ((in[29 + inpos]) << 13) - | ((in[30 + inpos]) << 30) - ; - out[16 + outpos] = ((in[30 + inpos]) >>> (17 - 15)) - | ((in[31 + inpos]) << 15) - ; - } - - - protected static void fastpackwithoutmask18(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 18) - ; - out[1 + outpos] = ((in[1 + inpos]) >>> (18 - 4)) - | ((in[2 + inpos]) << 4) - | ((in[3 + inpos]) << 22) - ; - out[2 + outpos] = ((in[3 + inpos]) >>> (18 - 8)) - | ((in[4 + inpos]) << 8) - | ((in[5 + inpos]) << 26) - ; - out[3 + outpos] = ((in[5 + inpos]) >>> (18 - 12)) - | ((in[6 + inpos]) << 12) - | ((in[7 + inpos]) << 30) - ; - out[4 + outpos] = ((in[7 + inpos]) >>> (18 - 16)) - | ((in[8 + inpos]) << 16) - ; - out[5 + outpos] = ((in[8 + inpos]) >>> (18 - 2)) - | ((in[9 + inpos]) << 2) - | ((in[10 + inpos]) << 20) - ; - out[6 + outpos] = ((in[10 + inpos]) >>> (18 - 6)) - | ((in[11 + inpos]) << 6) - | ((in[12 + inpos]) << 24) - ; - out[7 + outpos] = ((in[12 + inpos]) >>> (18 - 10)) - | ((in[13 + inpos]) << 10) - | ((in[14 + inpos]) << 28) - ; - out[8 + outpos] = ((in[14 + inpos]) >>> (18 - 14)) - | ((in[15 + inpos]) << 14) - ; - out[9 + outpos] = in[16 + inpos] - | ((in[17 + inpos]) << 18) - ; - out[10 + outpos] = ((in[17 + inpos]) >>> (18 - 4)) - | ((in[18 + inpos]) << 4) - | ((in[19 + inpos]) << 22) - ; - out[11 + outpos] = ((in[19 + inpos]) >>> (18 - 8)) - | ((in[20 + inpos]) << 8) - | ((in[21 + inpos]) << 26) - ; - out[12 + outpos] = ((in[21 + inpos]) >>> (18 - 12)) - | ((in[22 + inpos]) << 12) - | ((in[23 + inpos]) << 30) - ; - out[13 + outpos] = ((in[23 + inpos]) >>> (18 - 16)) - | ((in[24 + inpos]) << 16) - ; - out[14 + outpos] = ((in[24 + inpos]) >>> (18 - 2)) - | ((in[25 + inpos]) << 2) - | ((in[26 + inpos]) << 20) - ; - out[15 + outpos] = ((in[26 + inpos]) >>> (18 - 6)) - | ((in[27 + inpos]) << 6) - | ((in[28 + inpos]) << 24) - ; - out[16 + outpos] = ((in[28 + inpos]) >>> (18 - 10)) - | ((in[29 + inpos]) << 10) - | ((in[30 + inpos]) << 28) - ; - out[17 + outpos] = ((in[30 + inpos]) >>> (18 - 14)) - | ((in[31 + inpos]) << 14) - ; - } - - - protected static void fastpackwithoutmask19(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 19) - ; - out[1 + outpos] = ((in[1 + inpos]) >>> (19 - 6)) - | ((in[2 + inpos]) << 6) - | ((in[3 + inpos]) << 25) - ; - out[2 + outpos] = ((in[3 + inpos]) >>> (19 - 12)) - | ((in[4 + inpos]) << 12) - | ((in[5 + inpos]) << 31) - ; - out[3 + outpos] = ((in[5 + inpos]) >>> (19 - 18)) - | ((in[6 + inpos]) << 18) - ; - out[4 + outpos] = ((in[6 + inpos]) >>> (19 - 5)) - | ((in[7 + inpos]) << 5) - | ((in[8 + inpos]) << 24) - ; - out[5 + outpos] = ((in[8 + inpos]) >>> (19 - 11)) - | ((in[9 + inpos]) << 11) - | ((in[10 + inpos]) << 30) - ; - out[6 + outpos] = ((in[10 + inpos]) >>> (19 - 17)) - | ((in[11 + inpos]) << 17) - ; - out[7 + outpos] = ((in[11 + inpos]) >>> (19 - 4)) - | ((in[12 + inpos]) << 4) - | ((in[13 + inpos]) << 23) - ; - out[8 + outpos] = ((in[13 + inpos]) >>> (19 - 10)) - | ((in[14 + inpos]) << 10) - | ((in[15 + inpos]) << 29) - ; - out[9 + outpos] = ((in[15 + inpos]) >>> (19 - 16)) - | ((in[16 + inpos]) << 16) - ; - out[10 + outpos] = ((in[16 + inpos]) >>> (19 - 3)) - | ((in[17 + inpos]) << 3) - | ((in[18 + inpos]) << 22) - ; - out[11 + outpos] = ((in[18 + inpos]) >>> (19 - 9)) - | ((in[19 + inpos]) << 9) - | ((in[20 + inpos]) << 28) - ; - out[12 + outpos] = ((in[20 + inpos]) >>> (19 - 15)) - | ((in[21 + inpos]) << 15) - ; - out[13 + outpos] = ((in[21 + inpos]) >>> (19 - 2)) - | ((in[22 + inpos]) << 2) - | ((in[23 + inpos]) << 21) - ; - out[14 + outpos] = ((in[23 + inpos]) >>> (19 - 8)) - | ((in[24 + inpos]) << 8) - | ((in[25 + inpos]) << 27) - ; - out[15 + outpos] = ((in[25 + inpos]) >>> (19 - 14)) - | ((in[26 + inpos]) << 14) - ; - out[16 + outpos] = ((in[26 + inpos]) >>> (19 - 1)) - | ((in[27 + inpos]) << 1) - | ((in[28 + inpos]) << 20) - ; - out[17 + outpos] = ((in[28 + inpos]) >>> (19 - 7)) - | ((in[29 + inpos]) << 7) - | ((in[30 + inpos]) << 26) - ; - out[18 + outpos] = ((in[30 + inpos]) >>> (19 - 13)) - | ((in[31 + inpos]) << 13) - ; - } - - - protected static void fastpackwithoutmask20(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 20) - ; - out[1 + outpos] = ((in[1 + inpos]) >>> (20 - 8)) - | ((in[2 + inpos]) << 8) - | ((in[3 + inpos]) << 28) - ; - out[2 + outpos] = ((in[3 + inpos]) >>> (20 - 16)) - | ((in[4 + inpos]) << 16) - ; - out[3 + outpos] = ((in[4 + inpos]) >>> (20 - 4)) - | ((in[5 + inpos]) << 4) - | ((in[6 + inpos]) << 24) - ; - out[4 + outpos] = ((in[6 + inpos]) >>> (20 - 12)) - | ((in[7 + inpos]) << 12) - ; - out[5 + outpos] = in[8 + inpos] - | ((in[9 + inpos]) << 20) - ; - out[6 + outpos] = ((in[9 + inpos]) >>> (20 - 8)) - | ((in[10 + inpos]) << 8) - | ((in[11 + inpos]) << 28) - ; - out[7 + outpos] = ((in[11 + inpos]) >>> (20 - 16)) - | ((in[12 + inpos]) << 16) - ; - out[8 + outpos] = ((in[12 + inpos]) >>> (20 - 4)) - | ((in[13 + inpos]) << 4) - | ((in[14 + inpos]) << 24) - ; - out[9 + outpos] = ((in[14 + inpos]) >>> (20 - 12)) - | ((in[15 + inpos]) << 12) - ; - out[10 + outpos] = in[16 + inpos] - | ((in[17 + inpos]) << 20) - ; - out[11 + outpos] = ((in[17 + inpos]) >>> (20 - 8)) - | ((in[18 + inpos]) << 8) - | ((in[19 + inpos]) << 28) - ; - out[12 + outpos] = ((in[19 + inpos]) >>> (20 - 16)) - | ((in[20 + inpos]) << 16) - ; - out[13 + outpos] = ((in[20 + inpos]) >>> (20 - 4)) - | ((in[21 + inpos]) << 4) - | ((in[22 + inpos]) << 24) - ; - out[14 + outpos] = ((in[22 + inpos]) >>> (20 - 12)) - | ((in[23 + inpos]) << 12) - ; - out[15 + outpos] = in[24 + inpos] - | ((in[25 + inpos]) << 20) - ; - out[16 + outpos] = ((in[25 + inpos]) >>> (20 - 8)) - | ((in[26 + inpos]) << 8) - | ((in[27 + inpos]) << 28) - ; - out[17 + outpos] = ((in[27 + inpos]) >>> (20 - 16)) - | ((in[28 + inpos]) << 16) - ; - out[18 + outpos] = ((in[28 + inpos]) >>> (20 - 4)) - | ((in[29 + inpos]) << 4) - | ((in[30 + inpos]) << 24) - ; - out[19 + outpos] = ((in[30 + inpos]) >>> (20 - 12)) - | ((in[31 + inpos]) << 12) - ; - } - - - protected static void fastpackwithoutmask21(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 21) - ; - out[1 + outpos] = ((in[1 + inpos]) >>> (21 - 10)) - | ((in[2 + inpos]) << 10) - | ((in[3 + inpos]) << 31) - ; - out[2 + outpos] = ((in[3 + inpos]) >>> (21 - 20)) - | ((in[4 + inpos]) << 20) - ; - out[3 + outpos] = ((in[4 + inpos]) >>> (21 - 9)) - | ((in[5 + inpos]) << 9) - | ((in[6 + inpos]) << 30) - ; - out[4 + outpos] = ((in[6 + inpos]) >>> (21 - 19)) - | ((in[7 + inpos]) << 19) - ; - out[5 + outpos] = ((in[7 + inpos]) >>> (21 - 8)) - | ((in[8 + inpos]) << 8) - | ((in[9 + inpos]) << 29) - ; - out[6 + outpos] = ((in[9 + inpos]) >>> (21 - 18)) - | ((in[10 + inpos]) << 18) - ; - out[7 + outpos] = ((in[10 + inpos]) >>> (21 - 7)) - | ((in[11 + inpos]) << 7) - | ((in[12 + inpos]) << 28) - ; - out[8 + outpos] = ((in[12 + inpos]) >>> (21 - 17)) - | ((in[13 + inpos]) << 17) - ; - out[9 + outpos] = ((in[13 + inpos]) >>> (21 - 6)) - | ((in[14 + inpos]) << 6) - | ((in[15 + inpos]) << 27) - ; - out[10 + outpos] = ((in[15 + inpos]) >>> (21 - 16)) - | ((in[16 + inpos]) << 16) - ; - out[11 + outpos] = ((in[16 + inpos]) >>> (21 - 5)) - | ((in[17 + inpos]) << 5) - | ((in[18 + inpos]) << 26) - ; - out[12 + outpos] = ((in[18 + inpos]) >>> (21 - 15)) - | ((in[19 + inpos]) << 15) - ; - out[13 + outpos] = ((in[19 + inpos]) >>> (21 - 4)) - | ((in[20 + inpos]) << 4) - | ((in[21 + inpos]) << 25) - ; - out[14 + outpos] = ((in[21 + inpos]) >>> (21 - 14)) - | ((in[22 + inpos]) << 14) - ; - out[15 + outpos] = ((in[22 + inpos]) >>> (21 - 3)) - | ((in[23 + inpos]) << 3) - | ((in[24 + inpos]) << 24) - ; - out[16 + outpos] = ((in[24 + inpos]) >>> (21 - 13)) - | ((in[25 + inpos]) << 13) - ; - out[17 + outpos] = ((in[25 + inpos]) >>> (21 - 2)) - | ((in[26 + inpos]) << 2) - | ((in[27 + inpos]) << 23) - ; - out[18 + outpos] = ((in[27 + inpos]) >>> (21 - 12)) - | ((in[28 + inpos]) << 12) - ; - out[19 + outpos] = ((in[28 + inpos]) >>> (21 - 1)) - | ((in[29 + inpos]) << 1) - | ((in[30 + inpos]) << 22) - ; - out[20 + outpos] = ((in[30 + inpos]) >>> (21 - 11)) - | ((in[31 + inpos]) << 11) - ; - } - - - protected static void fastpackwithoutmask22(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 22) - ; - out[1 + outpos] = ((in[1 + inpos]) >>> (22 - 12)) - | ((in[2 + inpos]) << 12) - ; - out[2 + outpos] = ((in[2 + inpos]) >>> (22 - 2)) - | ((in[3 + inpos]) << 2) - | ((in[4 + inpos]) << 24) - ; - out[3 + outpos] = ((in[4 + inpos]) >>> (22 - 14)) - | ((in[5 + inpos]) << 14) - ; - out[4 + outpos] = ((in[5 + inpos]) >>> (22 - 4)) - | ((in[6 + inpos]) << 4) - | ((in[7 + inpos]) << 26) - ; - out[5 + outpos] = ((in[7 + inpos]) >>> (22 - 16)) - | ((in[8 + inpos]) << 16) - ; - out[6 + outpos] = ((in[8 + inpos]) >>> (22 - 6)) - | ((in[9 + inpos]) << 6) - | ((in[10 + inpos]) << 28) - ; - out[7 + outpos] = ((in[10 + inpos]) >>> (22 - 18)) - | ((in[11 + inpos]) << 18) - ; - out[8 + outpos] = ((in[11 + inpos]) >>> (22 - 8)) - | ((in[12 + inpos]) << 8) - | ((in[13 + inpos]) << 30) - ; - out[9 + outpos] = ((in[13 + inpos]) >>> (22 - 20)) - | ((in[14 + inpos]) << 20) - ; - out[10 + outpos] = ((in[14 + inpos]) >>> (22 - 10)) - | ((in[15 + inpos]) << 10) - ; - out[11 + outpos] = in[16 + inpos] - | ((in[17 + inpos]) << 22) - ; - out[12 + outpos] = ((in[17 + inpos]) >>> (22 - 12)) - | ((in[18 + inpos]) << 12) - ; - out[13 + outpos] = ((in[18 + inpos]) >>> (22 - 2)) - | ((in[19 + inpos]) << 2) - | ((in[20 + inpos]) << 24) - ; - out[14 + outpos] = ((in[20 + inpos]) >>> (22 - 14)) - | ((in[21 + inpos]) << 14) - ; - out[15 + outpos] = ((in[21 + inpos]) >>> (22 - 4)) - | ((in[22 + inpos]) << 4) - | ((in[23 + inpos]) << 26) - ; - out[16 + outpos] = ((in[23 + inpos]) >>> (22 - 16)) - | ((in[24 + inpos]) << 16) - ; - out[17 + outpos] = ((in[24 + inpos]) >>> (22 - 6)) - | ((in[25 + inpos]) << 6) - | ((in[26 + inpos]) << 28) - ; - out[18 + outpos] = ((in[26 + inpos]) >>> (22 - 18)) - | ((in[27 + inpos]) << 18) - ; - out[19 + outpos] = ((in[27 + inpos]) >>> (22 - 8)) - | ((in[28 + inpos]) << 8) - | ((in[29 + inpos]) << 30) - ; - out[20 + outpos] = ((in[29 + inpos]) >>> (22 - 20)) - | ((in[30 + inpos]) << 20) - ; - out[21 + outpos] = ((in[30 + inpos]) >>> (22 - 10)) - | ((in[31 + inpos]) << 10) - ; - } - - - protected static void fastpackwithoutmask23(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 23) - ; - out[1 + outpos] = ((in[1 + inpos]) >>> (23 - 14)) - | ((in[2 + inpos]) << 14) - ; - out[2 + outpos] = ((in[2 + inpos]) >>> (23 - 5)) - | ((in[3 + inpos]) << 5) - | ((in[4 + inpos]) << 28) - ; - out[3 + outpos] = ((in[4 + inpos]) >>> (23 - 19)) - | ((in[5 + inpos]) << 19) - ; - out[4 + outpos] = ((in[5 + inpos]) >>> (23 - 10)) - | ((in[6 + inpos]) << 10) - ; - out[5 + outpos] = ((in[6 + inpos]) >>> (23 - 1)) - | ((in[7 + inpos]) << 1) - | ((in[8 + inpos]) << 24) - ; - out[6 + outpos] = ((in[8 + inpos]) >>> (23 - 15)) - | ((in[9 + inpos]) << 15) - ; - out[7 + outpos] = ((in[9 + inpos]) >>> (23 - 6)) - | ((in[10 + inpos]) << 6) - | ((in[11 + inpos]) << 29) - ; - out[8 + outpos] = ((in[11 + inpos]) >>> (23 - 20)) - | ((in[12 + inpos]) << 20) - ; - out[9 + outpos] = ((in[12 + inpos]) >>> (23 - 11)) - | ((in[13 + inpos]) << 11) - ; - out[10 + outpos] = ((in[13 + inpos]) >>> (23 - 2)) - | ((in[14 + inpos]) << 2) - | ((in[15 + inpos]) << 25) - ; - out[11 + outpos] = ((in[15 + inpos]) >>> (23 - 16)) - | ((in[16 + inpos]) << 16) - ; - out[12 + outpos] = ((in[16 + inpos]) >>> (23 - 7)) - | ((in[17 + inpos]) << 7) - | ((in[18 + inpos]) << 30) - ; - out[13 + outpos] = ((in[18 + inpos]) >>> (23 - 21)) - | ((in[19 + inpos]) << 21) - ; - out[14 + outpos] = ((in[19 + inpos]) >>> (23 - 12)) - | ((in[20 + inpos]) << 12) - ; - out[15 + outpos] = ((in[20 + inpos]) >>> (23 - 3)) - | ((in[21 + inpos]) << 3) - | ((in[22 + inpos]) << 26) - ; - out[16 + outpos] = ((in[22 + inpos]) >>> (23 - 17)) - | ((in[23 + inpos]) << 17) - ; - out[17 + outpos] = ((in[23 + inpos]) >>> (23 - 8)) - | ((in[24 + inpos]) << 8) - | ((in[25 + inpos]) << 31) - ; - out[18 + outpos] = ((in[25 + inpos]) >>> (23 - 22)) - | ((in[26 + inpos]) << 22) - ; - out[19 + outpos] = ((in[26 + inpos]) >>> (23 - 13)) - | ((in[27 + inpos]) << 13) - ; - out[20 + outpos] = ((in[27 + inpos]) >>> (23 - 4)) - | ((in[28 + inpos]) << 4) - | ((in[29 + inpos]) << 27) - ; - out[21 + outpos] = ((in[29 + inpos]) >>> (23 - 18)) - | ((in[30 + inpos]) << 18) - ; - out[22 + outpos] = ((in[30 + inpos]) >>> (23 - 9)) - | ((in[31 + inpos]) << 9) - ; - } - - - protected static void fastpackwithoutmask24(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 24) - ; - out[1 + outpos] = ((in[1 + inpos]) >>> (24 - 16)) - | ((in[2 + inpos]) << 16) - ; - out[2 + outpos] = ((in[2 + inpos]) >>> (24 - 8)) - | ((in[3 + inpos]) << 8) - ; - out[3 + outpos] = in[4 + inpos] - | ((in[5 + inpos]) << 24) - ; - out[4 + outpos] = ((in[5 + inpos]) >>> (24 - 16)) - | ((in[6 + inpos]) << 16) - ; - out[5 + outpos] = ((in[6 + inpos]) >>> (24 - 8)) - | ((in[7 + inpos]) << 8) - ; - out[6 + outpos] = in[8 + inpos] - | ((in[9 + inpos]) << 24) - ; - out[7 + outpos] = ((in[9 + inpos]) >>> (24 - 16)) - | ((in[10 + inpos]) << 16) - ; - out[8 + outpos] = ((in[10 + inpos]) >>> (24 - 8)) - | ((in[11 + inpos]) << 8) - ; - out[9 + outpos] = in[12 + inpos] - | ((in[13 + inpos]) << 24) - ; - out[10 + outpos] = ((in[13 + inpos]) >>> (24 - 16)) - | ((in[14 + inpos]) << 16) - ; - out[11 + outpos] = ((in[14 + inpos]) >>> (24 - 8)) - | ((in[15 + inpos]) << 8) - ; - out[12 + outpos] = in[16 + inpos] - | ((in[17 + inpos]) << 24) - ; - out[13 + outpos] = ((in[17 + inpos]) >>> (24 - 16)) - | ((in[18 + inpos]) << 16) - ; - out[14 + outpos] = ((in[18 + inpos]) >>> (24 - 8)) - | ((in[19 + inpos]) << 8) - ; - out[15 + outpos] = in[20 + inpos] - | ((in[21 + inpos]) << 24) - ; - out[16 + outpos] = ((in[21 + inpos]) >>> (24 - 16)) - | ((in[22 + inpos]) << 16) - ; - out[17 + outpos] = ((in[22 + inpos]) >>> (24 - 8)) - | ((in[23 + inpos]) << 8) - ; - out[18 + outpos] = in[24 + inpos] - | ((in[25 + inpos]) << 24) - ; - out[19 + outpos] = ((in[25 + inpos]) >>> (24 - 16)) - | ((in[26 + inpos]) << 16) - ; - out[20 + outpos] = ((in[26 + inpos]) >>> (24 - 8)) - | ((in[27 + inpos]) << 8) - ; - out[21 + outpos] = in[28 + inpos] - | ((in[29 + inpos]) << 24) - ; - out[22 + outpos] = ((in[29 + inpos]) >>> (24 - 16)) - | ((in[30 + inpos]) << 16) - ; - out[23 + outpos] = ((in[30 + inpos]) >>> (24 - 8)) - | ((in[31 + inpos]) << 8) - ; - } - - - protected static void fastpackwithoutmask25(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 25) - ; - out[1 + outpos] = ((in[1 + inpos]) >>> (25 - 18)) - | ((in[2 + inpos]) << 18) - ; - out[2 + outpos] = ((in[2 + inpos]) >>> (25 - 11)) - | ((in[3 + inpos]) << 11) - ; - out[3 + outpos] = ((in[3 + inpos]) >>> (25 - 4)) - | ((in[4 + inpos]) << 4) - | ((in[5 + inpos]) << 29) - ; - out[4 + outpos] = ((in[5 + inpos]) >>> (25 - 22)) - | ((in[6 + inpos]) << 22) - ; - out[5 + outpos] = ((in[6 + inpos]) >>> (25 - 15)) - | ((in[7 + inpos]) << 15) - ; - out[6 + outpos] = ((in[7 + inpos]) >>> (25 - 8)) - | ((in[8 + inpos]) << 8) - ; - out[7 + outpos] = ((in[8 + inpos]) >>> (25 - 1)) - | ((in[9 + inpos]) << 1) - | ((in[10 + inpos]) << 26) - ; - out[8 + outpos] = ((in[10 + inpos]) >>> (25 - 19)) - | ((in[11 + inpos]) << 19) - ; - out[9 + outpos] = ((in[11 + inpos]) >>> (25 - 12)) - | ((in[12 + inpos]) << 12) - ; - out[10 + outpos] = ((in[12 + inpos]) >>> (25 - 5)) - | ((in[13 + inpos]) << 5) - | ((in[14 + inpos]) << 30) - ; - out[11 + outpos] = ((in[14 + inpos]) >>> (25 - 23)) - | ((in[15 + inpos]) << 23) - ; - out[12 + outpos] = ((in[15 + inpos]) >>> (25 - 16)) - | ((in[16 + inpos]) << 16) - ; - out[13 + outpos] = ((in[16 + inpos]) >>> (25 - 9)) - | ((in[17 + inpos]) << 9) - ; - out[14 + outpos] = ((in[17 + inpos]) >>> (25 - 2)) - | ((in[18 + inpos]) << 2) - | ((in[19 + inpos]) << 27) - ; - out[15 + outpos] = ((in[19 + inpos]) >>> (25 - 20)) - | ((in[20 + inpos]) << 20) - ; - out[16 + outpos] = ((in[20 + inpos]) >>> (25 - 13)) - | ((in[21 + inpos]) << 13) - ; - out[17 + outpos] = ((in[21 + inpos]) >>> (25 - 6)) - | ((in[22 + inpos]) << 6) - | ((in[23 + inpos]) << 31) - ; - out[18 + outpos] = ((in[23 + inpos]) >>> (25 - 24)) - | ((in[24 + inpos]) << 24) - ; - out[19 + outpos] = ((in[24 + inpos]) >>> (25 - 17)) - | ((in[25 + inpos]) << 17) - ; - out[20 + outpos] = ((in[25 + inpos]) >>> (25 - 10)) - | ((in[26 + inpos]) << 10) - ; - out[21 + outpos] = ((in[26 + inpos]) >>> (25 - 3)) - | ((in[27 + inpos]) << 3) - | ((in[28 + inpos]) << 28) - ; - out[22 + outpos] = ((in[28 + inpos]) >>> (25 - 21)) - | ((in[29 + inpos]) << 21) - ; - out[23 + outpos] = ((in[29 + inpos]) >>> (25 - 14)) - | ((in[30 + inpos]) << 14) - ; - out[24 + outpos] = ((in[30 + inpos]) >>> (25 - 7)) - | ((in[31 + inpos]) << 7) - ; - } - - - protected static void fastpackwithoutmask26(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 26) - ; - out[1 + outpos] = ((in[1 + inpos]) >>> (26 - 20)) - | ((in[2 + inpos]) << 20) - ; - out[2 + outpos] = ((in[2 + inpos]) >>> (26 - 14)) - | ((in[3 + inpos]) << 14) - ; - out[3 + outpos] = ((in[3 + inpos]) >>> (26 - 8)) - | ((in[4 + inpos]) << 8) - ; - out[4 + outpos] = ((in[4 + inpos]) >>> (26 - 2)) - | ((in[5 + inpos]) << 2) - | ((in[6 + inpos]) << 28) - ; - out[5 + outpos] = ((in[6 + inpos]) >>> (26 - 22)) - | ((in[7 + inpos]) << 22) - ; - out[6 + outpos] = ((in[7 + inpos]) >>> (26 - 16)) - | ((in[8 + inpos]) << 16) - ; - out[7 + outpos] = ((in[8 + inpos]) >>> (26 - 10)) - | ((in[9 + inpos]) << 10) - ; - out[8 + outpos] = ((in[9 + inpos]) >>> (26 - 4)) - | ((in[10 + inpos]) << 4) - | ((in[11 + inpos]) << 30) - ; - out[9 + outpos] = ((in[11 + inpos]) >>> (26 - 24)) - | ((in[12 + inpos]) << 24) - ; - out[10 + outpos] = ((in[12 + inpos]) >>> (26 - 18)) - | ((in[13 + inpos]) << 18) - ; - out[11 + outpos] = ((in[13 + inpos]) >>> (26 - 12)) - | ((in[14 + inpos]) << 12) - ; - out[12 + outpos] = ((in[14 + inpos]) >>> (26 - 6)) - | ((in[15 + inpos]) << 6) - ; - out[13 + outpos] = in[16 + inpos] - | ((in[17 + inpos]) << 26) - ; - out[14 + outpos] = ((in[17 + inpos]) >>> (26 - 20)) - | ((in[18 + inpos]) << 20) - ; - out[15 + outpos] = ((in[18 + inpos]) >>> (26 - 14)) - | ((in[19 + inpos]) << 14) - ; - out[16 + outpos] = ((in[19 + inpos]) >>> (26 - 8)) - | ((in[20 + inpos]) << 8) - ; - out[17 + outpos] = ((in[20 + inpos]) >>> (26 - 2)) - | ((in[21 + inpos]) << 2) - | ((in[22 + inpos]) << 28) - ; - out[18 + outpos] = ((in[22 + inpos]) >>> (26 - 22)) - | ((in[23 + inpos]) << 22) - ; - out[19 + outpos] = ((in[23 + inpos]) >>> (26 - 16)) - | ((in[24 + inpos]) << 16) - ; - out[20 + outpos] = ((in[24 + inpos]) >>> (26 - 10)) - | ((in[25 + inpos]) << 10) - ; - out[21 + outpos] = ((in[25 + inpos]) >>> (26 - 4)) - | ((in[26 + inpos]) << 4) - | ((in[27 + inpos]) << 30) - ; - out[22 + outpos] = ((in[27 + inpos]) >>> (26 - 24)) - | ((in[28 + inpos]) << 24) - ; - out[23 + outpos] = ((in[28 + inpos]) >>> (26 - 18)) - | ((in[29 + inpos]) << 18) - ; - out[24 + outpos] = ((in[29 + inpos]) >>> (26 - 12)) - | ((in[30 + inpos]) << 12) - ; - out[25 + outpos] = ((in[30 + inpos]) >>> (26 - 6)) - | ((in[31 + inpos]) << 6) - ; - } - - - protected static void fastpackwithoutmask27(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 27) - ; - out[1 + outpos] = ((in[1 + inpos]) >>> (27 - 22)) - | ((in[2 + inpos]) << 22) - ; - out[2 + outpos] = ((in[2 + inpos]) >>> (27 - 17)) - | ((in[3 + inpos]) << 17) - ; - out[3 + outpos] = ((in[3 + inpos]) >>> (27 - 12)) - | ((in[4 + inpos]) << 12) - ; - out[4 + outpos] = ((in[4 + inpos]) >>> (27 - 7)) - | ((in[5 + inpos]) << 7) - ; - out[5 + outpos] = ((in[5 + inpos]) >>> (27 - 2)) - | ((in[6 + inpos]) << 2) - | ((in[7 + inpos]) << 29) - ; - out[6 + outpos] = ((in[7 + inpos]) >>> (27 - 24)) - | ((in[8 + inpos]) << 24) - ; - out[7 + outpos] = ((in[8 + inpos]) >>> (27 - 19)) - | ((in[9 + inpos]) << 19) - ; - out[8 + outpos] = ((in[9 + inpos]) >>> (27 - 14)) - | ((in[10 + inpos]) << 14) - ; - out[9 + outpos] = ((in[10 + inpos]) >>> (27 - 9)) - | ((in[11 + inpos]) << 9) - ; - out[10 + outpos] = ((in[11 + inpos]) >>> (27 - 4)) - | ((in[12 + inpos]) << 4) - | ((in[13 + inpos]) << 31) - ; - out[11 + outpos] = ((in[13 + inpos]) >>> (27 - 26)) - | ((in[14 + inpos]) << 26) - ; - out[12 + outpos] = ((in[14 + inpos]) >>> (27 - 21)) - | ((in[15 + inpos]) << 21) - ; - out[13 + outpos] = ((in[15 + inpos]) >>> (27 - 16)) - | ((in[16 + inpos]) << 16) - ; - out[14 + outpos] = ((in[16 + inpos]) >>> (27 - 11)) - | ((in[17 + inpos]) << 11) - ; - out[15 + outpos] = ((in[17 + inpos]) >>> (27 - 6)) - | ((in[18 + inpos]) << 6) - ; - out[16 + outpos] = ((in[18 + inpos]) >>> (27 - 1)) - | ((in[19 + inpos]) << 1) - | ((in[20 + inpos]) << 28) - ; - out[17 + outpos] = ((in[20 + inpos]) >>> (27 - 23)) - | ((in[21 + inpos]) << 23) - ; - out[18 + outpos] = ((in[21 + inpos]) >>> (27 - 18)) - | ((in[22 + inpos]) << 18) - ; - out[19 + outpos] = ((in[22 + inpos]) >>> (27 - 13)) - | ((in[23 + inpos]) << 13) - ; - out[20 + outpos] = ((in[23 + inpos]) >>> (27 - 8)) - | ((in[24 + inpos]) << 8) - ; - out[21 + outpos] = ((in[24 + inpos]) >>> (27 - 3)) - | ((in[25 + inpos]) << 3) - | ((in[26 + inpos]) << 30) - ; - out[22 + outpos] = ((in[26 + inpos]) >>> (27 - 25)) - | ((in[27 + inpos]) << 25) - ; - out[23 + outpos] = ((in[27 + inpos]) >>> (27 - 20)) - | ((in[28 + inpos]) << 20) - ; - out[24 + outpos] = ((in[28 + inpos]) >>> (27 - 15)) - | ((in[29 + inpos]) << 15) - ; - out[25 + outpos] = ((in[29 + inpos]) >>> (27 - 10)) - | ((in[30 + inpos]) << 10) - ; - out[26 + outpos] = ((in[30 + inpos]) >>> (27 - 5)) - | ((in[31 + inpos]) << 5) - ; - } - - - protected static void fastpackwithoutmask28(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 28) - ; - out[1 + outpos] = ((in[1 + inpos]) >>> (28 - 24)) - | ((in[2 + inpos]) << 24) - ; - out[2 + outpos] = ((in[2 + inpos]) >>> (28 - 20)) - | ((in[3 + inpos]) << 20) - ; - out[3 + outpos] = ((in[3 + inpos]) >>> (28 - 16)) - | ((in[4 + inpos]) << 16) - ; - out[4 + outpos] = ((in[4 + inpos]) >>> (28 - 12)) - | ((in[5 + inpos]) << 12) - ; - out[5 + outpos] = ((in[5 + inpos]) >>> (28 - 8)) - | ((in[6 + inpos]) << 8) - ; - out[6 + outpos] = ((in[6 + inpos]) >>> (28 - 4)) - | ((in[7 + inpos]) << 4) - ; - out[7 + outpos] = in[8 + inpos] - | ((in[9 + inpos]) << 28) - ; - out[8 + outpos] = ((in[9 + inpos]) >>> (28 - 24)) - | ((in[10 + inpos]) << 24) - ; - out[9 + outpos] = ((in[10 + inpos]) >>> (28 - 20)) - | ((in[11 + inpos]) << 20) - ; - out[10 + outpos] = ((in[11 + inpos]) >>> (28 - 16)) - | ((in[12 + inpos]) << 16) - ; - out[11 + outpos] = ((in[12 + inpos]) >>> (28 - 12)) - | ((in[13 + inpos]) << 12) - ; - out[12 + outpos] = ((in[13 + inpos]) >>> (28 - 8)) - | ((in[14 + inpos]) << 8) - ; - out[13 + outpos] = ((in[14 + inpos]) >>> (28 - 4)) - | ((in[15 + inpos]) << 4) - ; - out[14 + outpos] = in[16 + inpos] - | ((in[17 + inpos]) << 28) - ; - out[15 + outpos] = ((in[17 + inpos]) >>> (28 - 24)) - | ((in[18 + inpos]) << 24) - ; - out[16 + outpos] = ((in[18 + inpos]) >>> (28 - 20)) - | ((in[19 + inpos]) << 20) - ; - out[17 + outpos] = ((in[19 + inpos]) >>> (28 - 16)) - | ((in[20 + inpos]) << 16) - ; - out[18 + outpos] = ((in[20 + inpos]) >>> (28 - 12)) - | ((in[21 + inpos]) << 12) - ; - out[19 + outpos] = ((in[21 + inpos]) >>> (28 - 8)) - | ((in[22 + inpos]) << 8) - ; - out[20 + outpos] = ((in[22 + inpos]) >>> (28 - 4)) - | ((in[23 + inpos]) << 4) - ; - out[21 + outpos] = in[24 + inpos] - | ((in[25 + inpos]) << 28) - ; - out[22 + outpos] = ((in[25 + inpos]) >>> (28 - 24)) - | ((in[26 + inpos]) << 24) - ; - out[23 + outpos] = ((in[26 + inpos]) >>> (28 - 20)) - | ((in[27 + inpos]) << 20) - ; - out[24 + outpos] = ((in[27 + inpos]) >>> (28 - 16)) - | ((in[28 + inpos]) << 16) - ; - out[25 + outpos] = ((in[28 + inpos]) >>> (28 - 12)) - | ((in[29 + inpos]) << 12) - ; - out[26 + outpos] = ((in[29 + inpos]) >>> (28 - 8)) - | ((in[30 + inpos]) << 8) - ; - out[27 + outpos] = ((in[30 + inpos]) >>> (28 - 4)) - | ((in[31 + inpos]) << 4) - ; - } - - - protected static void fastpackwithoutmask29(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 29) - ; - out[1 + outpos] = ((in[1 + inpos]) >>> (29 - 26)) - | ((in[2 + inpos]) << 26) - ; - out[2 + outpos] = ((in[2 + inpos]) >>> (29 - 23)) - | ((in[3 + inpos]) << 23) - ; - out[3 + outpos] = ((in[3 + inpos]) >>> (29 - 20)) - | ((in[4 + inpos]) << 20) - ; - out[4 + outpos] = ((in[4 + inpos]) >>> (29 - 17)) - | ((in[5 + inpos]) << 17) - ; - out[5 + outpos] = ((in[5 + inpos]) >>> (29 - 14)) - | ((in[6 + inpos]) << 14) - ; - out[6 + outpos] = ((in[6 + inpos]) >>> (29 - 11)) - | ((in[7 + inpos]) << 11) - ; - out[7 + outpos] = ((in[7 + inpos]) >>> (29 - 8)) - | ((in[8 + inpos]) << 8) - ; - out[8 + outpos] = ((in[8 + inpos]) >>> (29 - 5)) - | ((in[9 + inpos]) << 5) - ; - out[9 + outpos] = ((in[9 + inpos]) >>> (29 - 2)) - | ((in[10 + inpos]) << 2) - | ((in[11 + inpos]) << 31) - ; - out[10 + outpos] = ((in[11 + inpos]) >>> (29 - 28)) - | ((in[12 + inpos]) << 28) - ; - out[11 + outpos] = ((in[12 + inpos]) >>> (29 - 25)) - | ((in[13 + inpos]) << 25) - ; - out[12 + outpos] = ((in[13 + inpos]) >>> (29 - 22)) - | ((in[14 + inpos]) << 22) - ; - out[13 + outpos] = ((in[14 + inpos]) >>> (29 - 19)) - | ((in[15 + inpos]) << 19) - ; - out[14 + outpos] = ((in[15 + inpos]) >>> (29 - 16)) - | ((in[16 + inpos]) << 16) - ; - out[15 + outpos] = ((in[16 + inpos]) >>> (29 - 13)) - | ((in[17 + inpos]) << 13) - ; - out[16 + outpos] = ((in[17 + inpos]) >>> (29 - 10)) - | ((in[18 + inpos]) << 10) - ; - out[17 + outpos] = ((in[18 + inpos]) >>> (29 - 7)) - | ((in[19 + inpos]) << 7) - ; - out[18 + outpos] = ((in[19 + inpos]) >>> (29 - 4)) - | ((in[20 + inpos]) << 4) - ; - out[19 + outpos] = ((in[20 + inpos]) >>> (29 - 1)) - | ((in[21 + inpos]) << 1) - | ((in[22 + inpos]) << 30) - ; - out[20 + outpos] = ((in[22 + inpos]) >>> (29 - 27)) - | ((in[23 + inpos]) << 27) - ; - out[21 + outpos] = ((in[23 + inpos]) >>> (29 - 24)) - | ((in[24 + inpos]) << 24) - ; - out[22 + outpos] = ((in[24 + inpos]) >>> (29 - 21)) - | ((in[25 + inpos]) << 21) - ; - out[23 + outpos] = ((in[25 + inpos]) >>> (29 - 18)) - | ((in[26 + inpos]) << 18) - ; - out[24 + outpos] = ((in[26 + inpos]) >>> (29 - 15)) - | ((in[27 + inpos]) << 15) - ; - out[25 + outpos] = ((in[27 + inpos]) >>> (29 - 12)) - | ((in[28 + inpos]) << 12) - ; - out[26 + outpos] = ((in[28 + inpos]) >>> (29 - 9)) - | ((in[29 + inpos]) << 9) - ; - out[27 + outpos] = ((in[29 + inpos]) >>> (29 - 6)) - | ((in[30 + inpos]) << 6) - ; - out[28 + outpos] = ((in[30 + inpos]) >>> (29 - 3)) - | ((in[31 + inpos]) << 3) - ; - } - - - protected static void fastpackwithoutmask30(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 30) - ; - out[1 + outpos] = ((in[1 + inpos]) >>> (30 - 28)) - | ((in[2 + inpos]) << 28) - ; - out[2 + outpos] = ((in[2 + inpos]) >>> (30 - 26)) - | ((in[3 + inpos]) << 26) - ; - out[3 + outpos] = ((in[3 + inpos]) >>> (30 - 24)) - | ((in[4 + inpos]) << 24) - ; - out[4 + outpos] = ((in[4 + inpos]) >>> (30 - 22)) - | ((in[5 + inpos]) << 22) - ; - out[5 + outpos] = ((in[5 + inpos]) >>> (30 - 20)) - | ((in[6 + inpos]) << 20) - ; - out[6 + outpos] = ((in[6 + inpos]) >>> (30 - 18)) - | ((in[7 + inpos]) << 18) - ; - out[7 + outpos] = ((in[7 + inpos]) >>> (30 - 16)) - | ((in[8 + inpos]) << 16) - ; - out[8 + outpos] = ((in[8 + inpos]) >>> (30 - 14)) - | ((in[9 + inpos]) << 14) - ; - out[9 + outpos] = ((in[9 + inpos]) >>> (30 - 12)) - | ((in[10 + inpos]) << 12) - ; - out[10 + outpos] = ((in[10 + inpos]) >>> (30 - 10)) - | ((in[11 + inpos]) << 10) - ; - out[11 + outpos] = ((in[11 + inpos]) >>> (30 - 8)) - | ((in[12 + inpos]) << 8) - ; - out[12 + outpos] = ((in[12 + inpos]) >>> (30 - 6)) - | ((in[13 + inpos]) << 6) - ; - out[13 + outpos] = ((in[13 + inpos]) >>> (30 - 4)) - | ((in[14 + inpos]) << 4) - ; - out[14 + outpos] = ((in[14 + inpos]) >>> (30 - 2)) - | ((in[15 + inpos]) << 2) - ; - out[15 + outpos] = in[16 + inpos] - | ((in[17 + inpos]) << 30) - ; - out[16 + outpos] = ((in[17 + inpos]) >>> (30 - 28)) - | ((in[18 + inpos]) << 28) - ; - out[17 + outpos] = ((in[18 + inpos]) >>> (30 - 26)) - | ((in[19 + inpos]) << 26) - ; - out[18 + outpos] = ((in[19 + inpos]) >>> (30 - 24)) - | ((in[20 + inpos]) << 24) - ; - out[19 + outpos] = ((in[20 + inpos]) >>> (30 - 22)) - | ((in[21 + inpos]) << 22) - ; - out[20 + outpos] = ((in[21 + inpos]) >>> (30 - 20)) - | ((in[22 + inpos]) << 20) - ; - out[21 + outpos] = ((in[22 + inpos]) >>> (30 - 18)) - | ((in[23 + inpos]) << 18) - ; - out[22 + outpos] = ((in[23 + inpos]) >>> (30 - 16)) - | ((in[24 + inpos]) << 16) - ; - out[23 + outpos] = ((in[24 + inpos]) >>> (30 - 14)) - | ((in[25 + inpos]) << 14) - ; - out[24 + outpos] = ((in[25 + inpos]) >>> (30 - 12)) - | ((in[26 + inpos]) << 12) - ; - out[25 + outpos] = ((in[26 + inpos]) >>> (30 - 10)) - | ((in[27 + inpos]) << 10) - ; - out[26 + outpos] = ((in[27 + inpos]) >>> (30 - 8)) - | ((in[28 + inpos]) << 8) - ; - out[27 + outpos] = ((in[28 + inpos]) >>> (30 - 6)) - | ((in[29 + inpos]) << 6) - ; - out[28 + outpos] = ((in[29 + inpos]) >>> (30 - 4)) - | ((in[30 + inpos]) << 4) - ; - out[29 + outpos] = ((in[30 + inpos]) >>> (30 - 2)) - | ((in[31 + inpos]) << 2) - ; - } - - - protected static void fastpackwithoutmask31(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] - | ((in[1 + inpos]) << 31) - ; - out[1 + outpos] = ((in[1 + inpos]) >>> (31 - 30)) - | ((in[2 + inpos]) << 30) - ; - out[2 + outpos] = ((in[2 + inpos]) >>> (31 - 29)) - | ((in[3 + inpos]) << 29) - ; - out[3 + outpos] = ((in[3 + inpos]) >>> (31 - 28)) - | ((in[4 + inpos]) << 28) - ; - out[4 + outpos] = ((in[4 + inpos]) >>> (31 - 27)) - | ((in[5 + inpos]) << 27) - ; - out[5 + outpos] = ((in[5 + inpos]) >>> (31 - 26)) - | ((in[6 + inpos]) << 26) - ; - out[6 + outpos] = ((in[6 + inpos]) >>> (31 - 25)) - | ((in[7 + inpos]) << 25) - ; - out[7 + outpos] = ((in[7 + inpos]) >>> (31 - 24)) - | ((in[8 + inpos]) << 24) - ; - out[8 + outpos] = ((in[8 + inpos]) >>> (31 - 23)) - | ((in[9 + inpos]) << 23) - ; - out[9 + outpos] = ((in[9 + inpos]) >>> (31 - 22)) - | ((in[10 + inpos]) << 22) - ; - out[10 + outpos] = ((in[10 + inpos]) >>> (31 - 21)) - | ((in[11 + inpos]) << 21) - ; - out[11 + outpos] = ((in[11 + inpos]) >>> (31 - 20)) - | ((in[12 + inpos]) << 20) - ; - out[12 + outpos] = ((in[12 + inpos]) >>> (31 - 19)) - | ((in[13 + inpos]) << 19) - ; - out[13 + outpos] = ((in[13 + inpos]) >>> (31 - 18)) - | ((in[14 + inpos]) << 18) - ; - out[14 + outpos] = ((in[14 + inpos]) >>> (31 - 17)) - | ((in[15 + inpos]) << 17) - ; - out[15 + outpos] = ((in[15 + inpos]) >>> (31 - 16)) - | ((in[16 + inpos]) << 16) - ; - out[16 + outpos] = ((in[16 + inpos]) >>> (31 - 15)) - | ((in[17 + inpos]) << 15) - ; - out[17 + outpos] = ((in[17 + inpos]) >>> (31 - 14)) - | ((in[18 + inpos]) << 14) - ; - out[18 + outpos] = ((in[18 + inpos]) >>> (31 - 13)) - | ((in[19 + inpos]) << 13) - ; - out[19 + outpos] = ((in[19 + inpos]) >>> (31 - 12)) - | ((in[20 + inpos]) << 12) - ; - out[20 + outpos] = ((in[20 + inpos]) >>> (31 - 11)) - | ((in[21 + inpos]) << 11) - ; - out[21 + outpos] = ((in[21 + inpos]) >>> (31 - 10)) - | ((in[22 + inpos]) << 10) - ; - out[22 + outpos] = ((in[22 + inpos]) >>> (31 - 9)) - | ((in[23 + inpos]) << 9) - ; - out[23 + outpos] = ((in[23 + inpos]) >>> (31 - 8)) - | ((in[24 + inpos]) << 8) - ; - out[24 + outpos] = ((in[24 + inpos]) >>> (31 - 7)) - | ((in[25 + inpos]) << 7) - ; - out[25 + outpos] = ((in[25 + inpos]) >>> (31 - 6)) - | ((in[26 + inpos]) << 6) - ; - out[26 + outpos] = ((in[26 + inpos]) >>> (31 - 5)) - | ((in[27 + inpos]) << 5) - ; - out[27 + outpos] = ((in[27 + inpos]) >>> (31 - 4)) - | ((in[28 + inpos]) << 4) - ; - out[28 + outpos] = ((in[28 + inpos]) >>> (31 - 3)) - | ((in[29 + inpos]) << 3) - ; - out[29 + outpos] = ((in[29 + inpos]) >>> (31 - 2)) - | ((in[30 + inpos]) << 2) - ; - out[30 + outpos] = ((in[30 + inpos]) >>> (31 - 1)) - | ((in[31 + inpos]) << 1) - ; - } - - - protected static void fastpack1(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 1) - | ((in[1 + inpos] & 1) << 1) - | ((in[2 + inpos] & 1) << 2) - | ((in[3 + inpos] & 1) << 3) - | ((in[4 + inpos] & 1) << 4) - | ((in[5 + inpos] & 1) << 5) - | ((in[6 + inpos] & 1) << 6) - | ((in[7 + inpos] & 1) << 7) - | ((in[8 + inpos] & 1) << 8) - | ((in[9 + inpos] & 1) << 9) - | ((in[10 + inpos] & 1) << 10) - | ((in[11 + inpos] & 1) << 11) - | ((in[12 + inpos] & 1) << 12) - | ((in[13 + inpos] & 1) << 13) - | ((in[14 + inpos] & 1) << 14) - | ((in[15 + inpos] & 1) << 15) - | ((in[16 + inpos] & 1) << 16) - | ((in[17 + inpos] & 1) << 17) - | ((in[18 + inpos] & 1) << 18) - | ((in[19 + inpos] & 1) << 19) - | ((in[20 + inpos] & 1) << 20) - | ((in[21 + inpos] & 1) << 21) - | ((in[22 + inpos] & 1) << 22) - | ((in[23 + inpos] & 1) << 23) - | ((in[24 + inpos] & 1) << 24) - | ((in[25 + inpos] & 1) << 25) - | ((in[26 + inpos] & 1) << 26) - | ((in[27 + inpos] & 1) << 27) - | ((in[28 + inpos] & 1) << 28) - | ((in[29 + inpos] & 1) << 29) - | ((in[30 + inpos] & 1) << 30) - | ((in[31 + inpos]) << 31) - ; - } - - - protected static void fastpack2(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 3) - | ((in[1 + inpos] & 3) << 2) - | ((in[2 + inpos] & 3) << 4) - | ((in[3 + inpos] & 3) << 6) - | ((in[4 + inpos] & 3) << 8) - | ((in[5 + inpos] & 3) << 10) - | ((in[6 + inpos] & 3) << 12) - | ((in[7 + inpos] & 3) << 14) - | ((in[8 + inpos] & 3) << 16) - | ((in[9 + inpos] & 3) << 18) - | ((in[10 + inpos] & 3) << 20) - | ((in[11 + inpos] & 3) << 22) - | ((in[12 + inpos] & 3) << 24) - | ((in[13 + inpos] & 3) << 26) - | ((in[14 + inpos] & 3) << 28) - | ((in[15 + inpos]) << 30) - ; - out[1 + outpos] = (in[16 + inpos] & 3) - | ((in[17 + inpos] & 3) << 2) - | ((in[18 + inpos] & 3) << 4) - | ((in[19 + inpos] & 3) << 6) - | ((in[20 + inpos] & 3) << 8) - | ((in[21 + inpos] & 3) << 10) - | ((in[22 + inpos] & 3) << 12) - | ((in[23 + inpos] & 3) << 14) - | ((in[24 + inpos] & 3) << 16) - | ((in[25 + inpos] & 3) << 18) - | ((in[26 + inpos] & 3) << 20) - | ((in[27 + inpos] & 3) << 22) - | ((in[28 + inpos] & 3) << 24) - | ((in[29 + inpos] & 3) << 26) - | ((in[30 + inpos] & 3) << 28) - | ((in[31 + inpos]) << 30) - ; - } - - - protected static void fastpack3(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 7) - | ((in[1 + inpos] & 7) << 3) - | ((in[2 + inpos] & 7) << 6) - | ((in[3 + inpos] & 7) << 9) - | ((in[4 + inpos] & 7) << 12) - | ((in[5 + inpos] & 7) << 15) - | ((in[6 + inpos] & 7) << 18) - | ((in[7 + inpos] & 7) << 21) - | ((in[8 + inpos] & 7) << 24) - | ((in[9 + inpos] & 7) << 27) - | ((in[10 + inpos]) << 30) - ; - out[1 + outpos] = ((in[10 + inpos] & 7) >>> (3 - 1)) - | ((in[11 + inpos] & 7) << 1) - | ((in[12 + inpos] & 7) << 4) - | ((in[13 + inpos] & 7) << 7) - | ((in[14 + inpos] & 7) << 10) - | ((in[15 + inpos] & 7) << 13) - | ((in[16 + inpos] & 7) << 16) - | ((in[17 + inpos] & 7) << 19) - | ((in[18 + inpos] & 7) << 22) - | ((in[19 + inpos] & 7) << 25) - | ((in[20 + inpos] & 7) << 28) - | ((in[21 + inpos]) << 31) - ; - out[2 + outpos] = ((in[21 + inpos] & 7) >>> (3 - 2)) - | ((in[22 + inpos] & 7) << 2) - | ((in[23 + inpos] & 7) << 5) - | ((in[24 + inpos] & 7) << 8) - | ((in[25 + inpos] & 7) << 11) - | ((in[26 + inpos] & 7) << 14) - | ((in[27 + inpos] & 7) << 17) - | ((in[28 + inpos] & 7) << 20) - | ((in[29 + inpos] & 7) << 23) - | ((in[30 + inpos] & 7) << 26) - | ((in[31 + inpos]) << 29) - ; - } - - - protected static void fastpack4(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 15) - | ((in[1 + inpos] & 15) << 4) - | ((in[2 + inpos] & 15) << 8) - | ((in[3 + inpos] & 15) << 12) - | ((in[4 + inpos] & 15) << 16) - | ((in[5 + inpos] & 15) << 20) - | ((in[6 + inpos] & 15) << 24) - | ((in[7 + inpos]) << 28) - ; - out[1 + outpos] = (in[8 + inpos] & 15) - | ((in[9 + inpos] & 15) << 4) - | ((in[10 + inpos] & 15) << 8) - | ((in[11 + inpos] & 15) << 12) - | ((in[12 + inpos] & 15) << 16) - | ((in[13 + inpos] & 15) << 20) - | ((in[14 + inpos] & 15) << 24) - | ((in[15 + inpos]) << 28) - ; - out[2 + outpos] = (in[16 + inpos] & 15) - | ((in[17 + inpos] & 15) << 4) - | ((in[18 + inpos] & 15) << 8) - | ((in[19 + inpos] & 15) << 12) - | ((in[20 + inpos] & 15) << 16) - | ((in[21 + inpos] & 15) << 20) - | ((in[22 + inpos] & 15) << 24) - | ((in[23 + inpos]) << 28) - ; - out[3 + outpos] = (in[24 + inpos] & 15) - | ((in[25 + inpos] & 15) << 4) - | ((in[26 + inpos] & 15) << 8) - | ((in[27 + inpos] & 15) << 12) - | ((in[28 + inpos] & 15) << 16) - | ((in[29 + inpos] & 15) << 20) - | ((in[30 + inpos] & 15) << 24) - | ((in[31 + inpos]) << 28) - ; - } - - - protected static void fastpack5(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 31) - | ((in[1 + inpos] & 31) << 5) - | ((in[2 + inpos] & 31) << 10) - | ((in[3 + inpos] & 31) << 15) - | ((in[4 + inpos] & 31) << 20) - | ((in[5 + inpos] & 31) << 25) - | ((in[6 + inpos]) << 30) - ; - out[1 + outpos] = ((in[6 + inpos] & 31) >>> (5 - 3)) - | ((in[7 + inpos] & 31) << 3) - | ((in[8 + inpos] & 31) << 8) - | ((in[9 + inpos] & 31) << 13) - | ((in[10 + inpos] & 31) << 18) - | ((in[11 + inpos] & 31) << 23) - | ((in[12 + inpos]) << 28) - ; - out[2 + outpos] = ((in[12 + inpos] & 31) >>> (5 - 1)) - | ((in[13 + inpos] & 31) << 1) - | ((in[14 + inpos] & 31) << 6) - | ((in[15 + inpos] & 31) << 11) - | ((in[16 + inpos] & 31) << 16) - | ((in[17 + inpos] & 31) << 21) - | ((in[18 + inpos] & 31) << 26) - | ((in[19 + inpos]) << 31) - ; - out[3 + outpos] = ((in[19 + inpos] & 31) >>> (5 - 4)) - | ((in[20 + inpos] & 31) << 4) - | ((in[21 + inpos] & 31) << 9) - | ((in[22 + inpos] & 31) << 14) - | ((in[23 + inpos] & 31) << 19) - | ((in[24 + inpos] & 31) << 24) - | ((in[25 + inpos]) << 29) - ; - out[4 + outpos] = ((in[25 + inpos] & 31) >>> (5 - 2)) - | ((in[26 + inpos] & 31) << 2) - | ((in[27 + inpos] & 31) << 7) - | ((in[28 + inpos] & 31) << 12) - | ((in[29 + inpos] & 31) << 17) - | ((in[30 + inpos] & 31) << 22) - | ((in[31 + inpos]) << 27) - ; - } - - - protected static void fastpack6(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 63) - | ((in[1 + inpos] & 63) << 6) - | ((in[2 + inpos] & 63) << 12) - | ((in[3 + inpos] & 63) << 18) - | ((in[4 + inpos] & 63) << 24) - | ((in[5 + inpos]) << 30) - ; - out[1 + outpos] = ((in[5 + inpos] & 63) >>> (6 - 4)) - | ((in[6 + inpos] & 63) << 4) - | ((in[7 + inpos] & 63) << 10) - | ((in[8 + inpos] & 63) << 16) - | ((in[9 + inpos] & 63) << 22) - | ((in[10 + inpos]) << 28) - ; - out[2 + outpos] = ((in[10 + inpos] & 63) >>> (6 - 2)) - | ((in[11 + inpos] & 63) << 2) - | ((in[12 + inpos] & 63) << 8) - | ((in[13 + inpos] & 63) << 14) - | ((in[14 + inpos] & 63) << 20) - | ((in[15 + inpos]) << 26) - ; - out[3 + outpos] = (in[16 + inpos] & 63) - | ((in[17 + inpos] & 63) << 6) - | ((in[18 + inpos] & 63) << 12) - | ((in[19 + inpos] & 63) << 18) - | ((in[20 + inpos] & 63) << 24) - | ((in[21 + inpos]) << 30) - ; - out[4 + outpos] = ((in[21 + inpos] & 63) >>> (6 - 4)) - | ((in[22 + inpos] & 63) << 4) - | ((in[23 + inpos] & 63) << 10) - | ((in[24 + inpos] & 63) << 16) - | ((in[25 + inpos] & 63) << 22) - | ((in[26 + inpos]) << 28) - ; - out[5 + outpos] = ((in[26 + inpos] & 63) >>> (6 - 2)) - | ((in[27 + inpos] & 63) << 2) - | ((in[28 + inpos] & 63) << 8) - | ((in[29 + inpos] & 63) << 14) - | ((in[30 + inpos] & 63) << 20) - | ((in[31 + inpos]) << 26) - ; - } - - - protected static void fastpack7(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 127) - | ((in[1 + inpos] & 127) << 7) - | ((in[2 + inpos] & 127) << 14) - | ((in[3 + inpos] & 127) << 21) - | ((in[4 + inpos]) << 28) - ; - out[1 + outpos] = ((in[4 + inpos] & 127) >>> (7 - 3)) - | ((in[5 + inpos] & 127) << 3) - | ((in[6 + inpos] & 127) << 10) - | ((in[7 + inpos] & 127) << 17) - | ((in[8 + inpos] & 127) << 24) - | ((in[9 + inpos]) << 31) - ; - out[2 + outpos] = ((in[9 + inpos] & 127) >>> (7 - 6)) - | ((in[10 + inpos] & 127) << 6) - | ((in[11 + inpos] & 127) << 13) - | ((in[12 + inpos] & 127) << 20) - | ((in[13 + inpos]) << 27) - ; - out[3 + outpos] = ((in[13 + inpos] & 127) >>> (7 - 2)) - | ((in[14 + inpos] & 127) << 2) - | ((in[15 + inpos] & 127) << 9) - | ((in[16 + inpos] & 127) << 16) - | ((in[17 + inpos] & 127) << 23) - | ((in[18 + inpos]) << 30) - ; - out[4 + outpos] = ((in[18 + inpos] & 127) >>> (7 - 5)) - | ((in[19 + inpos] & 127) << 5) - | ((in[20 + inpos] & 127) << 12) - | ((in[21 + inpos] & 127) << 19) - | ((in[22 + inpos]) << 26) - ; - out[5 + outpos] = ((in[22 + inpos] & 127) >>> (7 - 1)) - | ((in[23 + inpos] & 127) << 1) - | ((in[24 + inpos] & 127) << 8) - | ((in[25 + inpos] & 127) << 15) - | ((in[26 + inpos] & 127) << 22) - | ((in[27 + inpos]) << 29) - ; - out[6 + outpos] = ((in[27 + inpos] & 127) >>> (7 - 4)) - | ((in[28 + inpos] & 127) << 4) - | ((in[29 + inpos] & 127) << 11) - | ((in[30 + inpos] & 127) << 18) - | ((in[31 + inpos]) << 25) - ; - } - - - protected static void fastpack8(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 255) - | ((in[1 + inpos] & 255) << 8) - | ((in[2 + inpos] & 255) << 16) - | ((in[3 + inpos]) << 24) - ; - out[1 + outpos] = (in[4 + inpos] & 255) - | ((in[5 + inpos] & 255) << 8) - | ((in[6 + inpos] & 255) << 16) - | ((in[7 + inpos]) << 24) - ; - out[2 + outpos] = (in[8 + inpos] & 255) - | ((in[9 + inpos] & 255) << 8) - | ((in[10 + inpos] & 255) << 16) - | ((in[11 + inpos]) << 24) - ; - out[3 + outpos] = (in[12 + inpos] & 255) - | ((in[13 + inpos] & 255) << 8) - | ((in[14 + inpos] & 255) << 16) - | ((in[15 + inpos]) << 24) - ; - out[4 + outpos] = (in[16 + inpos] & 255) - | ((in[17 + inpos] & 255) << 8) - | ((in[18 + inpos] & 255) << 16) - | ((in[19 + inpos]) << 24) - ; - out[5 + outpos] = (in[20 + inpos] & 255) - | ((in[21 + inpos] & 255) << 8) - | ((in[22 + inpos] & 255) << 16) - | ((in[23 + inpos]) << 24) - ; - out[6 + outpos] = (in[24 + inpos] & 255) - | ((in[25 + inpos] & 255) << 8) - | ((in[26 + inpos] & 255) << 16) - | ((in[27 + inpos]) << 24) - ; - out[7 + outpos] = (in[28 + inpos] & 255) - | ((in[29 + inpos] & 255) << 8) - | ((in[30 + inpos] & 255) << 16) - | ((in[31 + inpos]) << 24) - ; - } - - - protected static void fastpack9(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 511) - | ((in[1 + inpos] & 511) << 9) - | ((in[2 + inpos] & 511) << 18) - | ((in[3 + inpos]) << 27) - ; - out[1 + outpos] = ((in[3 + inpos] & 511) >>> (9 - 4)) - | ((in[4 + inpos] & 511) << 4) - | ((in[5 + inpos] & 511) << 13) - | ((in[6 + inpos] & 511) << 22) - | ((in[7 + inpos]) << 31) - ; - out[2 + outpos] = ((in[7 + inpos] & 511) >>> (9 - 8)) - | ((in[8 + inpos] & 511) << 8) - | ((in[9 + inpos] & 511) << 17) - | ((in[10 + inpos]) << 26) - ; - out[3 + outpos] = ((in[10 + inpos] & 511) >>> (9 - 3)) - | ((in[11 + inpos] & 511) << 3) - | ((in[12 + inpos] & 511) << 12) - | ((in[13 + inpos] & 511) << 21) - | ((in[14 + inpos]) << 30) - ; - out[4 + outpos] = ((in[14 + inpos] & 511) >>> (9 - 7)) - | ((in[15 + inpos] & 511) << 7) - | ((in[16 + inpos] & 511) << 16) - | ((in[17 + inpos]) << 25) - ; - out[5 + outpos] = ((in[17 + inpos] & 511) >>> (9 - 2)) - | ((in[18 + inpos] & 511) << 2) - | ((in[19 + inpos] & 511) << 11) - | ((in[20 + inpos] & 511) << 20) - | ((in[21 + inpos]) << 29) - ; - out[6 + outpos] = ((in[21 + inpos] & 511) >>> (9 - 6)) - | ((in[22 + inpos] & 511) << 6) - | ((in[23 + inpos] & 511) << 15) - | ((in[24 + inpos]) << 24) - ; - out[7 + outpos] = ((in[24 + inpos] & 511) >>> (9 - 1)) - | ((in[25 + inpos] & 511) << 1) - | ((in[26 + inpos] & 511) << 10) - | ((in[27 + inpos] & 511) << 19) - | ((in[28 + inpos]) << 28) - ; - out[8 + outpos] = ((in[28 + inpos] & 511) >>> (9 - 5)) - | ((in[29 + inpos] & 511) << 5) - | ((in[30 + inpos] & 511) << 14) - | ((in[31 + inpos]) << 23) - ; - } - - - protected static void fastpack10(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 1023) - | ((in[1 + inpos] & 1023) << 10) - | ((in[2 + inpos] & 1023) << 20) - | ((in[3 + inpos]) << 30) - ; - out[1 + outpos] = ((in[3 + inpos] & 1023) >>> (10 - 8)) - | ((in[4 + inpos] & 1023) << 8) - | ((in[5 + inpos] & 1023) << 18) - | ((in[6 + inpos]) << 28) - ; - out[2 + outpos] = ((in[6 + inpos] & 1023) >>> (10 - 6)) - | ((in[7 + inpos] & 1023) << 6) - | ((in[8 + inpos] & 1023) << 16) - | ((in[9 + inpos]) << 26) - ; - out[3 + outpos] = ((in[9 + inpos] & 1023) >>> (10 - 4)) - | ((in[10 + inpos] & 1023) << 4) - | ((in[11 + inpos] & 1023) << 14) - | ((in[12 + inpos]) << 24) - ; - out[4 + outpos] = ((in[12 + inpos] & 1023) >>> (10 - 2)) - | ((in[13 + inpos] & 1023) << 2) - | ((in[14 + inpos] & 1023) << 12) - | ((in[15 + inpos]) << 22) - ; - out[5 + outpos] = (in[16 + inpos] & 1023) - | ((in[17 + inpos] & 1023) << 10) - | ((in[18 + inpos] & 1023) << 20) - | ((in[19 + inpos]) << 30) - ; - out[6 + outpos] = ((in[19 + inpos] & 1023) >>> (10 - 8)) - | ((in[20 + inpos] & 1023) << 8) - | ((in[21 + inpos] & 1023) << 18) - | ((in[22 + inpos]) << 28) - ; - out[7 + outpos] = ((in[22 + inpos] & 1023) >>> (10 - 6)) - | ((in[23 + inpos] & 1023) << 6) - | ((in[24 + inpos] & 1023) << 16) - | ((in[25 + inpos]) << 26) - ; - out[8 + outpos] = ((in[25 + inpos] & 1023) >>> (10 - 4)) - | ((in[26 + inpos] & 1023) << 4) - | ((in[27 + inpos] & 1023) << 14) - | ((in[28 + inpos]) << 24) - ; - out[9 + outpos] = ((in[28 + inpos] & 1023) >>> (10 - 2)) - | ((in[29 + inpos] & 1023) << 2) - | ((in[30 + inpos] & 1023) << 12) - | ((in[31 + inpos]) << 22) - ; - } - - - protected static void fastpack11(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 2047) - | ((in[1 + inpos] & 2047) << 11) - | ((in[2 + inpos]) << 22) - ; - out[1 + outpos] = ((in[2 + inpos] & 2047) >>> (11 - 1)) - | ((in[3 + inpos] & 2047) << 1) - | ((in[4 + inpos] & 2047) << 12) - | ((in[5 + inpos]) << 23) - ; - out[2 + outpos] = ((in[5 + inpos] & 2047) >>> (11 - 2)) - | ((in[6 + inpos] & 2047) << 2) - | ((in[7 + inpos] & 2047) << 13) - | ((in[8 + inpos]) << 24) - ; - out[3 + outpos] = ((in[8 + inpos] & 2047) >>> (11 - 3)) - | ((in[9 + inpos] & 2047) << 3) - | ((in[10 + inpos] & 2047) << 14) - | ((in[11 + inpos]) << 25) - ; - out[4 + outpos] = ((in[11 + inpos] & 2047) >>> (11 - 4)) - | ((in[12 + inpos] & 2047) << 4) - | ((in[13 + inpos] & 2047) << 15) - | ((in[14 + inpos]) << 26) - ; - out[5 + outpos] = ((in[14 + inpos] & 2047) >>> (11 - 5)) - | ((in[15 + inpos] & 2047) << 5) - | ((in[16 + inpos] & 2047) << 16) - | ((in[17 + inpos]) << 27) - ; - out[6 + outpos] = ((in[17 + inpos] & 2047) >>> (11 - 6)) - | ((in[18 + inpos] & 2047) << 6) - | ((in[19 + inpos] & 2047) << 17) - | ((in[20 + inpos]) << 28) - ; - out[7 + outpos] = ((in[20 + inpos] & 2047) >>> (11 - 7)) - | ((in[21 + inpos] & 2047) << 7) - | ((in[22 + inpos] & 2047) << 18) - | ((in[23 + inpos]) << 29) - ; - out[8 + outpos] = ((in[23 + inpos] & 2047) >>> (11 - 8)) - | ((in[24 + inpos] & 2047) << 8) - | ((in[25 + inpos] & 2047) << 19) - | ((in[26 + inpos]) << 30) - ; - out[9 + outpos] = ((in[26 + inpos] & 2047) >>> (11 - 9)) - | ((in[27 + inpos] & 2047) << 9) - | ((in[28 + inpos] & 2047) << 20) - | ((in[29 + inpos]) << 31) - ; - out[10 + outpos] = ((in[29 + inpos] & 2047) >>> (11 - 10)) - | ((in[30 + inpos] & 2047) << 10) - | ((in[31 + inpos]) << 21) - ; - } - - - protected static void fastpack12(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 4095) - | ((in[1 + inpos] & 4095) << 12) - | ((in[2 + inpos]) << 24) - ; - out[1 + outpos] = ((in[2 + inpos] & 4095) >>> (12 - 4)) - | ((in[3 + inpos] & 4095) << 4) - | ((in[4 + inpos] & 4095) << 16) - | ((in[5 + inpos]) << 28) - ; - out[2 + outpos] = ((in[5 + inpos] & 4095) >>> (12 - 8)) - | ((in[6 + inpos] & 4095) << 8) - | ((in[7 + inpos]) << 20) - ; - out[3 + outpos] = (in[8 + inpos] & 4095) - | ((in[9 + inpos] & 4095) << 12) - | ((in[10 + inpos]) << 24) - ; - out[4 + outpos] = ((in[10 + inpos] & 4095) >>> (12 - 4)) - | ((in[11 + inpos] & 4095) << 4) - | ((in[12 + inpos] & 4095) << 16) - | ((in[13 + inpos]) << 28) - ; - out[5 + outpos] = ((in[13 + inpos] & 4095) >>> (12 - 8)) - | ((in[14 + inpos] & 4095) << 8) - | ((in[15 + inpos]) << 20) - ; - out[6 + outpos] = (in[16 + inpos] & 4095) - | ((in[17 + inpos] & 4095) << 12) - | ((in[18 + inpos]) << 24) - ; - out[7 + outpos] = ((in[18 + inpos] & 4095) >>> (12 - 4)) - | ((in[19 + inpos] & 4095) << 4) - | ((in[20 + inpos] & 4095) << 16) - | ((in[21 + inpos]) << 28) - ; - out[8 + outpos] = ((in[21 + inpos] & 4095) >>> (12 - 8)) - | ((in[22 + inpos] & 4095) << 8) - | ((in[23 + inpos]) << 20) - ; - out[9 + outpos] = (in[24 + inpos] & 4095) - | ((in[25 + inpos] & 4095) << 12) - | ((in[26 + inpos]) << 24) - ; - out[10 + outpos] = ((in[26 + inpos] & 4095) >>> (12 - 4)) - | ((in[27 + inpos] & 4095) << 4) - | ((in[28 + inpos] & 4095) << 16) - | ((in[29 + inpos]) << 28) - ; - out[11 + outpos] = ((in[29 + inpos] & 4095) >>> (12 - 8)) - | ((in[30 + inpos] & 4095) << 8) - | ((in[31 + inpos]) << 20) - ; - } - - - protected static void fastpack13(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 8191) - | ((in[1 + inpos] & 8191) << 13) - | ((in[2 + inpos]) << 26) - ; - out[1 + outpos] = ((in[2 + inpos] & 8191) >>> (13 - 7)) - | ((in[3 + inpos] & 8191) << 7) - | ((in[4 + inpos]) << 20) - ; - out[2 + outpos] = ((in[4 + inpos] & 8191) >>> (13 - 1)) - | ((in[5 + inpos] & 8191) << 1) - | ((in[6 + inpos] & 8191) << 14) - | ((in[7 + inpos]) << 27) - ; - out[3 + outpos] = ((in[7 + inpos] & 8191) >>> (13 - 8)) - | ((in[8 + inpos] & 8191) << 8) - | ((in[9 + inpos]) << 21) - ; - out[4 + outpos] = ((in[9 + inpos] & 8191) >>> (13 - 2)) - | ((in[10 + inpos] & 8191) << 2) - | ((in[11 + inpos] & 8191) << 15) - | ((in[12 + inpos]) << 28) - ; - out[5 + outpos] = ((in[12 + inpos] & 8191) >>> (13 - 9)) - | ((in[13 + inpos] & 8191) << 9) - | ((in[14 + inpos]) << 22) - ; - out[6 + outpos] = ((in[14 + inpos] & 8191) >>> (13 - 3)) - | ((in[15 + inpos] & 8191) << 3) - | ((in[16 + inpos] & 8191) << 16) - | ((in[17 + inpos]) << 29) - ; - out[7 + outpos] = ((in[17 + inpos] & 8191) >>> (13 - 10)) - | ((in[18 + inpos] & 8191) << 10) - | ((in[19 + inpos]) << 23) - ; - out[8 + outpos] = ((in[19 + inpos] & 8191) >>> (13 - 4)) - | ((in[20 + inpos] & 8191) << 4) - | ((in[21 + inpos] & 8191) << 17) - | ((in[22 + inpos]) << 30) - ; - out[9 + outpos] = ((in[22 + inpos] & 8191) >>> (13 - 11)) - | ((in[23 + inpos] & 8191) << 11) - | ((in[24 + inpos]) << 24) - ; - out[10 + outpos] = ((in[24 + inpos] & 8191) >>> (13 - 5)) - | ((in[25 + inpos] & 8191) << 5) - | ((in[26 + inpos] & 8191) << 18) - | ((in[27 + inpos]) << 31) - ; - out[11 + outpos] = ((in[27 + inpos] & 8191) >>> (13 - 12)) - | ((in[28 + inpos] & 8191) << 12) - | ((in[29 + inpos]) << 25) - ; - out[12 + outpos] = ((in[29 + inpos] & 8191) >>> (13 - 6)) - | ((in[30 + inpos] & 8191) << 6) - | ((in[31 + inpos]) << 19) - ; - } - - - protected static void fastpack14(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 16383) - | ((in[1 + inpos] & 16383) << 14) - | ((in[2 + inpos]) << 28) - ; - out[1 + outpos] = ((in[2 + inpos] & 16383) >>> (14 - 10)) - | ((in[3 + inpos] & 16383) << 10) - | ((in[4 + inpos]) << 24) - ; - out[2 + outpos] = ((in[4 + inpos] & 16383) >>> (14 - 6)) - | ((in[5 + inpos] & 16383) << 6) - | ((in[6 + inpos]) << 20) - ; - out[3 + outpos] = ((in[6 + inpos] & 16383) >>> (14 - 2)) - | ((in[7 + inpos] & 16383) << 2) - | ((in[8 + inpos] & 16383) << 16) - | ((in[9 + inpos]) << 30) - ; - out[4 + outpos] = ((in[9 + inpos] & 16383) >>> (14 - 12)) - | ((in[10 + inpos] & 16383) << 12) - | ((in[11 + inpos]) << 26) - ; - out[5 + outpos] = ((in[11 + inpos] & 16383) >>> (14 - 8)) - | ((in[12 + inpos] & 16383) << 8) - | ((in[13 + inpos]) << 22) - ; - out[6 + outpos] = ((in[13 + inpos] & 16383) >>> (14 - 4)) - | ((in[14 + inpos] & 16383) << 4) - | ((in[15 + inpos]) << 18) - ; - out[7 + outpos] = (in[16 + inpos] & 16383) - | ((in[17 + inpos] & 16383) << 14) - | ((in[18 + inpos]) << 28) - ; - out[8 + outpos] = ((in[18 + inpos] & 16383) >>> (14 - 10)) - | ((in[19 + inpos] & 16383) << 10) - | ((in[20 + inpos]) << 24) - ; - out[9 + outpos] = ((in[20 + inpos] & 16383) >>> (14 - 6)) - | ((in[21 + inpos] & 16383) << 6) - | ((in[22 + inpos]) << 20) - ; - out[10 + outpos] = ((in[22 + inpos] & 16383) >>> (14 - 2)) - | ((in[23 + inpos] & 16383) << 2) - | ((in[24 + inpos] & 16383) << 16) - | ((in[25 + inpos]) << 30) - ; - out[11 + outpos] = ((in[25 + inpos] & 16383) >>> (14 - 12)) - | ((in[26 + inpos] & 16383) << 12) - | ((in[27 + inpos]) << 26) - ; - out[12 + outpos] = ((in[27 + inpos] & 16383) >>> (14 - 8)) - | ((in[28 + inpos] & 16383) << 8) - | ((in[29 + inpos]) << 22) - ; - out[13 + outpos] = ((in[29 + inpos] & 16383) >>> (14 - 4)) - | ((in[30 + inpos] & 16383) << 4) - | ((in[31 + inpos]) << 18) - ; - } - - - protected static void fastpack15(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 32767) - | ((in[1 + inpos] & 32767) << 15) - | ((in[2 + inpos]) << 30) - ; - out[1 + outpos] = ((in[2 + inpos] & 32767) >>> (15 - 13)) - | ((in[3 + inpos] & 32767) << 13) - | ((in[4 + inpos]) << 28) - ; - out[2 + outpos] = ((in[4 + inpos] & 32767) >>> (15 - 11)) - | ((in[5 + inpos] & 32767) << 11) - | ((in[6 + inpos]) << 26) - ; - out[3 + outpos] = ((in[6 + inpos] & 32767) >>> (15 - 9)) - | ((in[7 + inpos] & 32767) << 9) - | ((in[8 + inpos]) << 24) - ; - out[4 + outpos] = ((in[8 + inpos] & 32767) >>> (15 - 7)) - | ((in[9 + inpos] & 32767) << 7) - | ((in[10 + inpos]) << 22) - ; - out[5 + outpos] = ((in[10 + inpos] & 32767) >>> (15 - 5)) - | ((in[11 + inpos] & 32767) << 5) - | ((in[12 + inpos]) << 20) - ; - out[6 + outpos] = ((in[12 + inpos] & 32767) >>> (15 - 3)) - | ((in[13 + inpos] & 32767) << 3) - | ((in[14 + inpos]) << 18) - ; - out[7 + outpos] = ((in[14 + inpos] & 32767) >>> (15 - 1)) - | ((in[15 + inpos] & 32767) << 1) - | ((in[16 + inpos] & 32767) << 16) - | ((in[17 + inpos]) << 31) - ; - out[8 + outpos] = ((in[17 + inpos] & 32767) >>> (15 - 14)) - | ((in[18 + inpos] & 32767) << 14) - | ((in[19 + inpos]) << 29) - ; - out[9 + outpos] = ((in[19 + inpos] & 32767) >>> (15 - 12)) - | ((in[20 + inpos] & 32767) << 12) - | ((in[21 + inpos]) << 27) - ; - out[10 + outpos] = ((in[21 + inpos] & 32767) >>> (15 - 10)) - | ((in[22 + inpos] & 32767) << 10) - | ((in[23 + inpos]) << 25) - ; - out[11 + outpos] = ((in[23 + inpos] & 32767) >>> (15 - 8)) - | ((in[24 + inpos] & 32767) << 8) - | ((in[25 + inpos]) << 23) - ; - out[12 + outpos] = ((in[25 + inpos] & 32767) >>> (15 - 6)) - | ((in[26 + inpos] & 32767) << 6) - | ((in[27 + inpos]) << 21) - ; - out[13 + outpos] = ((in[27 + inpos] & 32767) >>> (15 - 4)) - | ((in[28 + inpos] & 32767) << 4) - | ((in[29 + inpos]) << 19) - ; - out[14 + outpos] = ((in[29 + inpos] & 32767) >>> (15 - 2)) - | ((in[30 + inpos] & 32767) << 2) - | ((in[31 + inpos]) << 17) - ; - } - - - protected static void fastpack16(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 65535) - | ((in[1 + inpos]) << 16) - ; - out[1 + outpos] = (in[2 + inpos] & 65535) - | ((in[3 + inpos]) << 16) - ; - out[2 + outpos] = (in[4 + inpos] & 65535) - | ((in[5 + inpos]) << 16) - ; - out[3 + outpos] = (in[6 + inpos] & 65535) - | ((in[7 + inpos]) << 16) - ; - out[4 + outpos] = (in[8 + inpos] & 65535) - | ((in[9 + inpos]) << 16) - ; - out[5 + outpos] = (in[10 + inpos] & 65535) - | ((in[11 + inpos]) << 16) - ; - out[6 + outpos] = (in[12 + inpos] & 65535) - | ((in[13 + inpos]) << 16) - ; - out[7 + outpos] = (in[14 + inpos] & 65535) - | ((in[15 + inpos]) << 16) - ; - out[8 + outpos] = (in[16 + inpos] & 65535) - | ((in[17 + inpos]) << 16) - ; - out[9 + outpos] = (in[18 + inpos] & 65535) - | ((in[19 + inpos]) << 16) - ; - out[10 + outpos] = (in[20 + inpos] & 65535) - | ((in[21 + inpos]) << 16) - ; - out[11 + outpos] = (in[22 + inpos] & 65535) - | ((in[23 + inpos]) << 16) - ; - out[12 + outpos] = (in[24 + inpos] & 65535) - | ((in[25 + inpos]) << 16) - ; - out[13 + outpos] = (in[26 + inpos] & 65535) - | ((in[27 + inpos]) << 16) - ; - out[14 + outpos] = (in[28 + inpos] & 65535) - | ((in[29 + inpos]) << 16) - ; - out[15 + outpos] = (in[30 + inpos] & 65535) - | ((in[31 + inpos]) << 16) - ; - } - - - protected static void fastpack17(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 131071) - | ((in[1 + inpos]) << 17) - ; - out[1 + outpos] = ((in[1 + inpos] & 131071) >>> (17 - 2)) - | ((in[2 + inpos] & 131071) << 2) - | ((in[3 + inpos]) << 19) - ; - out[2 + outpos] = ((in[3 + inpos] & 131071) >>> (17 - 4)) - | ((in[4 + inpos] & 131071) << 4) - | ((in[5 + inpos]) << 21) - ; - out[3 + outpos] = ((in[5 + inpos] & 131071) >>> (17 - 6)) - | ((in[6 + inpos] & 131071) << 6) - | ((in[7 + inpos]) << 23) - ; - out[4 + outpos] = ((in[7 + inpos] & 131071) >>> (17 - 8)) - | ((in[8 + inpos] & 131071) << 8) - | ((in[9 + inpos]) << 25) - ; - out[5 + outpos] = ((in[9 + inpos] & 131071) >>> (17 - 10)) - | ((in[10 + inpos] & 131071) << 10) - | ((in[11 + inpos]) << 27) - ; - out[6 + outpos] = ((in[11 + inpos] & 131071) >>> (17 - 12)) - | ((in[12 + inpos] & 131071) << 12) - | ((in[13 + inpos]) << 29) - ; - out[7 + outpos] = ((in[13 + inpos] & 131071) >>> (17 - 14)) - | ((in[14 + inpos] & 131071) << 14) - | ((in[15 + inpos]) << 31) - ; - out[8 + outpos] = ((in[15 + inpos] & 131071) >>> (17 - 16)) - | ((in[16 + inpos]) << 16) - ; - out[9 + outpos] = ((in[16 + inpos] & 131071) >>> (17 - 1)) - | ((in[17 + inpos] & 131071) << 1) - | ((in[18 + inpos]) << 18) - ; - out[10 + outpos] = ((in[18 + inpos] & 131071) >>> (17 - 3)) - | ((in[19 + inpos] & 131071) << 3) - | ((in[20 + inpos]) << 20) - ; - out[11 + outpos] = ((in[20 + inpos] & 131071) >>> (17 - 5)) - | ((in[21 + inpos] & 131071) << 5) - | ((in[22 + inpos]) << 22) - ; - out[12 + outpos] = ((in[22 + inpos] & 131071) >>> (17 - 7)) - | ((in[23 + inpos] & 131071) << 7) - | ((in[24 + inpos]) << 24) - ; - out[13 + outpos] = ((in[24 + inpos] & 131071) >>> (17 - 9)) - | ((in[25 + inpos] & 131071) << 9) - | ((in[26 + inpos]) << 26) - ; - out[14 + outpos] = ((in[26 + inpos] & 131071) >>> (17 - 11)) - | ((in[27 + inpos] & 131071) << 11) - | ((in[28 + inpos]) << 28) - ; - out[15 + outpos] = ((in[28 + inpos] & 131071) >>> (17 - 13)) - | ((in[29 + inpos] & 131071) << 13) - | ((in[30 + inpos]) << 30) - ; - out[16 + outpos] = ((in[30 + inpos] & 131071) >>> (17 - 15)) - | ((in[31 + inpos]) << 15) - ; - } - - - protected static void fastpack18(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 262143) - | ((in[1 + inpos]) << 18) - ; - out[1 + outpos] = ((in[1 + inpos] & 262143) >>> (18 - 4)) - | ((in[2 + inpos] & 262143) << 4) - | ((in[3 + inpos]) << 22) - ; - out[2 + outpos] = ((in[3 + inpos] & 262143) >>> (18 - 8)) - | ((in[4 + inpos] & 262143) << 8) - | ((in[5 + inpos]) << 26) - ; - out[3 + outpos] = ((in[5 + inpos] & 262143) >>> (18 - 12)) - | ((in[6 + inpos] & 262143) << 12) - | ((in[7 + inpos]) << 30) - ; - out[4 + outpos] = ((in[7 + inpos] & 262143) >>> (18 - 16)) - | ((in[8 + inpos]) << 16) - ; - out[5 + outpos] = ((in[8 + inpos] & 262143) >>> (18 - 2)) - | ((in[9 + inpos] & 262143) << 2) - | ((in[10 + inpos]) << 20) - ; - out[6 + outpos] = ((in[10 + inpos] & 262143) >>> (18 - 6)) - | ((in[11 + inpos] & 262143) << 6) - | ((in[12 + inpos]) << 24) - ; - out[7 + outpos] = ((in[12 + inpos] & 262143) >>> (18 - 10)) - | ((in[13 + inpos] & 262143) << 10) - | ((in[14 + inpos]) << 28) - ; - out[8 + outpos] = ((in[14 + inpos] & 262143) >>> (18 - 14)) - | ((in[15 + inpos]) << 14) - ; - out[9 + outpos] = (in[16 + inpos] & 262143) - | ((in[17 + inpos]) << 18) - ; - out[10 + outpos] = ((in[17 + inpos] & 262143) >>> (18 - 4)) - | ((in[18 + inpos] & 262143) << 4) - | ((in[19 + inpos]) << 22) - ; - out[11 + outpos] = ((in[19 + inpos] & 262143) >>> (18 - 8)) - | ((in[20 + inpos] & 262143) << 8) - | ((in[21 + inpos]) << 26) - ; - out[12 + outpos] = ((in[21 + inpos] & 262143) >>> (18 - 12)) - | ((in[22 + inpos] & 262143) << 12) - | ((in[23 + inpos]) << 30) - ; - out[13 + outpos] = ((in[23 + inpos] & 262143) >>> (18 - 16)) - | ((in[24 + inpos]) << 16) - ; - out[14 + outpos] = ((in[24 + inpos] & 262143) >>> (18 - 2)) - | ((in[25 + inpos] & 262143) << 2) - | ((in[26 + inpos]) << 20) - ; - out[15 + outpos] = ((in[26 + inpos] & 262143) >>> (18 - 6)) - | ((in[27 + inpos] & 262143) << 6) - | ((in[28 + inpos]) << 24) - ; - out[16 + outpos] = ((in[28 + inpos] & 262143) >>> (18 - 10)) - | ((in[29 + inpos] & 262143) << 10) - | ((in[30 + inpos]) << 28) - ; - out[17 + outpos] = ((in[30 + inpos] & 262143) >>> (18 - 14)) - | ((in[31 + inpos]) << 14) - ; - } - - - protected static void fastpack19(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 524287) - | ((in[1 + inpos]) << 19) - ; - out[1 + outpos] = ((in[1 + inpos] & 524287) >>> (19 - 6)) - | ((in[2 + inpos] & 524287) << 6) - | ((in[3 + inpos]) << 25) - ; - out[2 + outpos] = ((in[3 + inpos] & 524287) >>> (19 - 12)) - | ((in[4 + inpos] & 524287) << 12) - | ((in[5 + inpos]) << 31) - ; - out[3 + outpos] = ((in[5 + inpos] & 524287) >>> (19 - 18)) - | ((in[6 + inpos]) << 18) - ; - out[4 + outpos] = ((in[6 + inpos] & 524287) >>> (19 - 5)) - | ((in[7 + inpos] & 524287) << 5) - | ((in[8 + inpos]) << 24) - ; - out[5 + outpos] = ((in[8 + inpos] & 524287) >>> (19 - 11)) - | ((in[9 + inpos] & 524287) << 11) - | ((in[10 + inpos]) << 30) - ; - out[6 + outpos] = ((in[10 + inpos] & 524287) >>> (19 - 17)) - | ((in[11 + inpos]) << 17) - ; - out[7 + outpos] = ((in[11 + inpos] & 524287) >>> (19 - 4)) - | ((in[12 + inpos] & 524287) << 4) - | ((in[13 + inpos]) << 23) - ; - out[8 + outpos] = ((in[13 + inpos] & 524287) >>> (19 - 10)) - | ((in[14 + inpos] & 524287) << 10) - | ((in[15 + inpos]) << 29) - ; - out[9 + outpos] = ((in[15 + inpos] & 524287) >>> (19 - 16)) - | ((in[16 + inpos]) << 16) - ; - out[10 + outpos] = ((in[16 + inpos] & 524287) >>> (19 - 3)) - | ((in[17 + inpos] & 524287) << 3) - | ((in[18 + inpos]) << 22) - ; - out[11 + outpos] = ((in[18 + inpos] & 524287) >>> (19 - 9)) - | ((in[19 + inpos] & 524287) << 9) - | ((in[20 + inpos]) << 28) - ; - out[12 + outpos] = ((in[20 + inpos] & 524287) >>> (19 - 15)) - | ((in[21 + inpos]) << 15) - ; - out[13 + outpos] = ((in[21 + inpos] & 524287) >>> (19 - 2)) - | ((in[22 + inpos] & 524287) << 2) - | ((in[23 + inpos]) << 21) - ; - out[14 + outpos] = ((in[23 + inpos] & 524287) >>> (19 - 8)) - | ((in[24 + inpos] & 524287) << 8) - | ((in[25 + inpos]) << 27) - ; - out[15 + outpos] = ((in[25 + inpos] & 524287) >>> (19 - 14)) - | ((in[26 + inpos]) << 14) - ; - out[16 + outpos] = ((in[26 + inpos] & 524287) >>> (19 - 1)) - | ((in[27 + inpos] & 524287) << 1) - | ((in[28 + inpos]) << 20) - ; - out[17 + outpos] = ((in[28 + inpos] & 524287) >>> (19 - 7)) - | ((in[29 + inpos] & 524287) << 7) - | ((in[30 + inpos]) << 26) - ; - out[18 + outpos] = ((in[30 + inpos] & 524287) >>> (19 - 13)) - | ((in[31 + inpos]) << 13) - ; - } - - - protected static void fastpack20(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 1048575) - | ((in[1 + inpos]) << 20) - ; - out[1 + outpos] = ((in[1 + inpos] & 1048575) >>> (20 - 8)) - | ((in[2 + inpos] & 1048575) << 8) - | ((in[3 + inpos]) << 28) - ; - out[2 + outpos] = ((in[3 + inpos] & 1048575) >>> (20 - 16)) - | ((in[4 + inpos]) << 16) - ; - out[3 + outpos] = ((in[4 + inpos] & 1048575) >>> (20 - 4)) - | ((in[5 + inpos] & 1048575) << 4) - | ((in[6 + inpos]) << 24) - ; - out[4 + outpos] = ((in[6 + inpos] & 1048575) >>> (20 - 12)) - | ((in[7 + inpos]) << 12) - ; - out[5 + outpos] = (in[8 + inpos] & 1048575) - | ((in[9 + inpos]) << 20) - ; - out[6 + outpos] = ((in[9 + inpos] & 1048575) >>> (20 - 8)) - | ((in[10 + inpos] & 1048575) << 8) - | ((in[11 + inpos]) << 28) - ; - out[7 + outpos] = ((in[11 + inpos] & 1048575) >>> (20 - 16)) - | ((in[12 + inpos]) << 16) - ; - out[8 + outpos] = ((in[12 + inpos] & 1048575) >>> (20 - 4)) - | ((in[13 + inpos] & 1048575) << 4) - | ((in[14 + inpos]) << 24) - ; - out[9 + outpos] = ((in[14 + inpos] & 1048575) >>> (20 - 12)) - | ((in[15 + inpos]) << 12) - ; - out[10 + outpos] = (in[16 + inpos] & 1048575) - | ((in[17 + inpos]) << 20) - ; - out[11 + outpos] = ((in[17 + inpos] & 1048575) >>> (20 - 8)) - | ((in[18 + inpos] & 1048575) << 8) - | ((in[19 + inpos]) << 28) - ; - out[12 + outpos] = ((in[19 + inpos] & 1048575) >>> (20 - 16)) - | ((in[20 + inpos]) << 16) - ; - out[13 + outpos] = ((in[20 + inpos] & 1048575) >>> (20 - 4)) - | ((in[21 + inpos] & 1048575) << 4) - | ((in[22 + inpos]) << 24) - ; - out[14 + outpos] = ((in[22 + inpos] & 1048575) >>> (20 - 12)) - | ((in[23 + inpos]) << 12) - ; - out[15 + outpos] = (in[24 + inpos] & 1048575) - | ((in[25 + inpos]) << 20) - ; - out[16 + outpos] = ((in[25 + inpos] & 1048575) >>> (20 - 8)) - | ((in[26 + inpos] & 1048575) << 8) - | ((in[27 + inpos]) << 28) - ; - out[17 + outpos] = ((in[27 + inpos] & 1048575) >>> (20 - 16)) - | ((in[28 + inpos]) << 16) - ; - out[18 + outpos] = ((in[28 + inpos] & 1048575) >>> (20 - 4)) - | ((in[29 + inpos] & 1048575) << 4) - | ((in[30 + inpos]) << 24) - ; - out[19 + outpos] = ((in[30 + inpos] & 1048575) >>> (20 - 12)) - | ((in[31 + inpos]) << 12) - ; - } - - - protected static void fastpack21(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 2097151) - | ((in[1 + inpos]) << 21) - ; - out[1 + outpos] = ((in[1 + inpos] & 2097151) >>> (21 - 10)) - | ((in[2 + inpos] & 2097151) << 10) - | ((in[3 + inpos]) << 31) - ; - out[2 + outpos] = ((in[3 + inpos] & 2097151) >>> (21 - 20)) - | ((in[4 + inpos]) << 20) - ; - out[3 + outpos] = ((in[4 + inpos] & 2097151) >>> (21 - 9)) - | ((in[5 + inpos] & 2097151) << 9) - | ((in[6 + inpos]) << 30) - ; - out[4 + outpos] = ((in[6 + inpos] & 2097151) >>> (21 - 19)) - | ((in[7 + inpos]) << 19) - ; - out[5 + outpos] = ((in[7 + inpos] & 2097151) >>> (21 - 8)) - | ((in[8 + inpos] & 2097151) << 8) - | ((in[9 + inpos]) << 29) - ; - out[6 + outpos] = ((in[9 + inpos] & 2097151) >>> (21 - 18)) - | ((in[10 + inpos]) << 18) - ; - out[7 + outpos] = ((in[10 + inpos] & 2097151) >>> (21 - 7)) - | ((in[11 + inpos] & 2097151) << 7) - | ((in[12 + inpos]) << 28) - ; - out[8 + outpos] = ((in[12 + inpos] & 2097151) >>> (21 - 17)) - | ((in[13 + inpos]) << 17) - ; - out[9 + outpos] = ((in[13 + inpos] & 2097151) >>> (21 - 6)) - | ((in[14 + inpos] & 2097151) << 6) - | ((in[15 + inpos]) << 27) - ; - out[10 + outpos] = ((in[15 + inpos] & 2097151) >>> (21 - 16)) - | ((in[16 + inpos]) << 16) - ; - out[11 + outpos] = ((in[16 + inpos] & 2097151) >>> (21 - 5)) - | ((in[17 + inpos] & 2097151) << 5) - | ((in[18 + inpos]) << 26) - ; - out[12 + outpos] = ((in[18 + inpos] & 2097151) >>> (21 - 15)) - | ((in[19 + inpos]) << 15) - ; - out[13 + outpos] = ((in[19 + inpos] & 2097151) >>> (21 - 4)) - | ((in[20 + inpos] & 2097151) << 4) - | ((in[21 + inpos]) << 25) - ; - out[14 + outpos] = ((in[21 + inpos] & 2097151) >>> (21 - 14)) - | ((in[22 + inpos]) << 14) - ; - out[15 + outpos] = ((in[22 + inpos] & 2097151) >>> (21 - 3)) - | ((in[23 + inpos] & 2097151) << 3) - | ((in[24 + inpos]) << 24) - ; - out[16 + outpos] = ((in[24 + inpos] & 2097151) >>> (21 - 13)) - | ((in[25 + inpos]) << 13) - ; - out[17 + outpos] = ((in[25 + inpos] & 2097151) >>> (21 - 2)) - | ((in[26 + inpos] & 2097151) << 2) - | ((in[27 + inpos]) << 23) - ; - out[18 + outpos] = ((in[27 + inpos] & 2097151) >>> (21 - 12)) - | ((in[28 + inpos]) << 12) - ; - out[19 + outpos] = ((in[28 + inpos] & 2097151) >>> (21 - 1)) - | ((in[29 + inpos] & 2097151) << 1) - | ((in[30 + inpos]) << 22) - ; - out[20 + outpos] = ((in[30 + inpos] & 2097151) >>> (21 - 11)) - | ((in[31 + inpos]) << 11) - ; - } + protected static void fastpackwithoutmask2(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 2) + | ((in[2 + inpos]) << 4) | ((in[3 + inpos]) << 6) + | ((in[4 + inpos]) << 8) | ((in[5 + inpos]) << 10) + | ((in[6 + inpos]) << 12) | ((in[7 + inpos]) << 14) + | ((in[8 + inpos]) << 16) | ((in[9 + inpos]) << 18) + | ((in[10 + inpos]) << 20) | ((in[11 + inpos]) << 22) + | ((in[12 + inpos]) << 24) | ((in[13 + inpos]) << 26) + | ((in[14 + inpos]) << 28) | ((in[15 + inpos]) << 30); + out[1 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 2) + | ((in[18 + inpos]) << 4) | ((in[19 + inpos]) << 6) + | ((in[20 + inpos]) << 8) | ((in[21 + inpos]) << 10) + | ((in[22 + inpos]) << 12) | ((in[23 + inpos]) << 14) + | ((in[24 + inpos]) << 16) | ((in[25 + inpos]) << 18) + | ((in[26 + inpos]) << 20) | ((in[27 + inpos]) << 22) + | ((in[28 + inpos]) << 24) | ((in[29 + inpos]) << 26) + | ((in[30 + inpos]) << 28) | ((in[31 + inpos]) << 30); + } + protected static void fastpackwithoutmask3(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 3) + | ((in[2 + inpos]) << 6) | ((in[3 + inpos]) << 9) + | ((in[4 + inpos]) << 12) | ((in[5 + inpos]) << 15) + | ((in[6 + inpos]) << 18) | ((in[7 + inpos]) << 21) + | ((in[8 + inpos]) << 24) | ((in[9 + inpos]) << 27) + | ((in[10 + inpos]) << 30); + out[1 + outpos] = ((in[10 + inpos]) >>> (3 - 1)) + | ((in[11 + inpos]) << 1) | ((in[12 + inpos]) << 4) + | ((in[13 + inpos]) << 7) | ((in[14 + inpos]) << 10) + | ((in[15 + inpos]) << 13) | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 19) | ((in[18 + inpos]) << 22) + | ((in[19 + inpos]) << 25) | ((in[20 + inpos]) << 28) + | ((in[21 + inpos]) << 31); + out[2 + outpos] = ((in[21 + inpos]) >>> (3 - 2)) + | ((in[22 + inpos]) << 2) | ((in[23 + inpos]) << 5) + | ((in[24 + inpos]) << 8) | ((in[25 + inpos]) << 11) + | ((in[26 + inpos]) << 14) | ((in[27 + inpos]) << 17) + | ((in[28 + inpos]) << 20) | ((in[29 + inpos]) << 23) + | ((in[30 + inpos]) << 26) | ((in[31 + inpos]) << 29); + } - protected static void fastpack22(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 4194303) - | ((in[1 + inpos]) << 22) - ; - out[1 + outpos] = ((in[1 + inpos] & 4194303) >>> (22 - 12)) - | ((in[2 + inpos]) << 12) - ; - out[2 + outpos] = ((in[2 + inpos] & 4194303) >>> (22 - 2)) - | ((in[3 + inpos] & 4194303) << 2) - | ((in[4 + inpos]) << 24) - ; - out[3 + outpos] = ((in[4 + inpos] & 4194303) >>> (22 - 14)) - | ((in[5 + inpos]) << 14) - ; - out[4 + outpos] = ((in[5 + inpos] & 4194303) >>> (22 - 4)) - | ((in[6 + inpos] & 4194303) << 4) - | ((in[7 + inpos]) << 26) - ; - out[5 + outpos] = ((in[7 + inpos] & 4194303) >>> (22 - 16)) - | ((in[8 + inpos]) << 16) - ; - out[6 + outpos] = ((in[8 + inpos] & 4194303) >>> (22 - 6)) - | ((in[9 + inpos] & 4194303) << 6) - | ((in[10 + inpos]) << 28) - ; - out[7 + outpos] = ((in[10 + inpos] & 4194303) >>> (22 - 18)) - | ((in[11 + inpos]) << 18) - ; - out[8 + outpos] = ((in[11 + inpos] & 4194303) >>> (22 - 8)) - | ((in[12 + inpos] & 4194303) << 8) - | ((in[13 + inpos]) << 30) - ; - out[9 + outpos] = ((in[13 + inpos] & 4194303) >>> (22 - 20)) - | ((in[14 + inpos]) << 20) - ; - out[10 + outpos] = ((in[14 + inpos] & 4194303) >>> (22 - 10)) - | ((in[15 + inpos]) << 10) - ; - out[11 + outpos] = (in[16 + inpos] & 4194303) - | ((in[17 + inpos]) << 22) - ; - out[12 + outpos] = ((in[17 + inpos] & 4194303) >>> (22 - 12)) - | ((in[18 + inpos]) << 12) - ; - out[13 + outpos] = ((in[18 + inpos] & 4194303) >>> (22 - 2)) - | ((in[19 + inpos] & 4194303) << 2) - | ((in[20 + inpos]) << 24) - ; - out[14 + outpos] = ((in[20 + inpos] & 4194303) >>> (22 - 14)) - | ((in[21 + inpos]) << 14) - ; - out[15 + outpos] = ((in[21 + inpos] & 4194303) >>> (22 - 4)) - | ((in[22 + inpos] & 4194303) << 4) - | ((in[23 + inpos]) << 26) - ; - out[16 + outpos] = ((in[23 + inpos] & 4194303) >>> (22 - 16)) - | ((in[24 + inpos]) << 16) - ; - out[17 + outpos] = ((in[24 + inpos] & 4194303) >>> (22 - 6)) - | ((in[25 + inpos] & 4194303) << 6) - | ((in[26 + inpos]) << 28) - ; - out[18 + outpos] = ((in[26 + inpos] & 4194303) >>> (22 - 18)) - | ((in[27 + inpos]) << 18) - ; - out[19 + outpos] = ((in[27 + inpos] & 4194303) >>> (22 - 8)) - | ((in[28 + inpos] & 4194303) << 8) - | ((in[29 + inpos]) << 30) - ; - out[20 + outpos] = ((in[29 + inpos] & 4194303) >>> (22 - 20)) - | ((in[30 + inpos]) << 20) - ; - out[21 + outpos] = ((in[30 + inpos] & 4194303) >>> (22 - 10)) - | ((in[31 + inpos]) << 10) - ; - } + protected static void fastpackwithoutmask4(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 4) + | ((in[2 + inpos]) << 8) | ((in[3 + inpos]) << 12) + | ((in[4 + inpos]) << 16) | ((in[5 + inpos]) << 20) + | ((in[6 + inpos]) << 24) | ((in[7 + inpos]) << 28); + out[1 + outpos] = in[8 + inpos] | ((in[9 + inpos]) << 4) + | ((in[10 + inpos]) << 8) | ((in[11 + inpos]) << 12) + | ((in[12 + inpos]) << 16) | ((in[13 + inpos]) << 20) + | ((in[14 + inpos]) << 24) | ((in[15 + inpos]) << 28); + out[2 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 4) + | ((in[18 + inpos]) << 8) | ((in[19 + inpos]) << 12) + | ((in[20 + inpos]) << 16) | ((in[21 + inpos]) << 20) + | ((in[22 + inpos]) << 24) | ((in[23 + inpos]) << 28); + out[3 + outpos] = in[24 + inpos] | ((in[25 + inpos]) << 4) + | ((in[26 + inpos]) << 8) | ((in[27 + inpos]) << 12) + | ((in[28 + inpos]) << 16) | ((in[29 + inpos]) << 20) + | ((in[30 + inpos]) << 24) | ((in[31 + inpos]) << 28); + } + protected static void fastpackwithoutmask5(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 5) + | ((in[2 + inpos]) << 10) | ((in[3 + inpos]) << 15) + | ((in[4 + inpos]) << 20) | ((in[5 + inpos]) << 25) + | ((in[6 + inpos]) << 30); + out[1 + outpos] = ((in[6 + inpos]) >>> (5 - 3)) + | ((in[7 + inpos]) << 3) | ((in[8 + inpos]) << 8) + | ((in[9 + inpos]) << 13) | ((in[10 + inpos]) << 18) + | ((in[11 + inpos]) << 23) | ((in[12 + inpos]) << 28); + out[2 + outpos] = ((in[12 + inpos]) >>> (5 - 1)) + | ((in[13 + inpos]) << 1) | ((in[14 + inpos]) << 6) + | ((in[15 + inpos]) << 11) | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 21) | ((in[18 + inpos]) << 26) + | ((in[19 + inpos]) << 31); + out[3 + outpos] = ((in[19 + inpos]) >>> (5 - 4)) + | ((in[20 + inpos]) << 4) | ((in[21 + inpos]) << 9) + | ((in[22 + inpos]) << 14) | ((in[23 + inpos]) << 19) + | ((in[24 + inpos]) << 24) | ((in[25 + inpos]) << 29); + out[4 + outpos] = ((in[25 + inpos]) >>> (5 - 2)) + | ((in[26 + inpos]) << 2) | ((in[27 + inpos]) << 7) + | ((in[28 + inpos]) << 12) | ((in[29 + inpos]) << 17) + | ((in[30 + inpos]) << 22) | ((in[31 + inpos]) << 27); + } - protected static void fastpack23(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 8388607) - | ((in[1 + inpos]) << 23) - ; - out[1 + outpos] = ((in[1 + inpos] & 8388607) >>> (23 - 14)) - | ((in[2 + inpos]) << 14) - ; - out[2 + outpos] = ((in[2 + inpos] & 8388607) >>> (23 - 5)) - | ((in[3 + inpos] & 8388607) << 5) - | ((in[4 + inpos]) << 28) - ; - out[3 + outpos] = ((in[4 + inpos] & 8388607) >>> (23 - 19)) - | ((in[5 + inpos]) << 19) - ; - out[4 + outpos] = ((in[5 + inpos] & 8388607) >>> (23 - 10)) - | ((in[6 + inpos]) << 10) - ; - out[5 + outpos] = ((in[6 + inpos] & 8388607) >>> (23 - 1)) - | ((in[7 + inpos] & 8388607) << 1) - | ((in[8 + inpos]) << 24) - ; - out[6 + outpos] = ((in[8 + inpos] & 8388607) >>> (23 - 15)) - | ((in[9 + inpos]) << 15) - ; - out[7 + outpos] = ((in[9 + inpos] & 8388607) >>> (23 - 6)) - | ((in[10 + inpos] & 8388607) << 6) - | ((in[11 + inpos]) << 29) - ; - out[8 + outpos] = ((in[11 + inpos] & 8388607) >>> (23 - 20)) - | ((in[12 + inpos]) << 20) - ; - out[9 + outpos] = ((in[12 + inpos] & 8388607) >>> (23 - 11)) - | ((in[13 + inpos]) << 11) - ; - out[10 + outpos] = ((in[13 + inpos] & 8388607) >>> (23 - 2)) - | ((in[14 + inpos] & 8388607) << 2) - | ((in[15 + inpos]) << 25) - ; - out[11 + outpos] = ((in[15 + inpos] & 8388607) >>> (23 - 16)) - | ((in[16 + inpos]) << 16) - ; - out[12 + outpos] = ((in[16 + inpos] & 8388607) >>> (23 - 7)) - | ((in[17 + inpos] & 8388607) << 7) - | ((in[18 + inpos]) << 30) - ; - out[13 + outpos] = ((in[18 + inpos] & 8388607) >>> (23 - 21)) - | ((in[19 + inpos]) << 21) - ; - out[14 + outpos] = ((in[19 + inpos] & 8388607) >>> (23 - 12)) - | ((in[20 + inpos]) << 12) - ; - out[15 + outpos] = ((in[20 + inpos] & 8388607) >>> (23 - 3)) - | ((in[21 + inpos] & 8388607) << 3) - | ((in[22 + inpos]) << 26) - ; - out[16 + outpos] = ((in[22 + inpos] & 8388607) >>> (23 - 17)) - | ((in[23 + inpos]) << 17) - ; - out[17 + outpos] = ((in[23 + inpos] & 8388607) >>> (23 - 8)) - | ((in[24 + inpos] & 8388607) << 8) - | ((in[25 + inpos]) << 31) - ; - out[18 + outpos] = ((in[25 + inpos] & 8388607) >>> (23 - 22)) - | ((in[26 + inpos]) << 22) - ; - out[19 + outpos] = ((in[26 + inpos] & 8388607) >>> (23 - 13)) - | ((in[27 + inpos]) << 13) - ; - out[20 + outpos] = ((in[27 + inpos] & 8388607) >>> (23 - 4)) - | ((in[28 + inpos] & 8388607) << 4) - | ((in[29 + inpos]) << 27) - ; - out[21 + outpos] = ((in[29 + inpos] & 8388607) >>> (23 - 18)) - | ((in[30 + inpos]) << 18) - ; - out[22 + outpos] = ((in[30 + inpos] & 8388607) >>> (23 - 9)) - | ((in[31 + inpos]) << 9) - ; - } + protected static void fastpackwithoutmask6(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 6) + | ((in[2 + inpos]) << 12) | ((in[3 + inpos]) << 18) + | ((in[4 + inpos]) << 24) | ((in[5 + inpos]) << 30); + out[1 + outpos] = ((in[5 + inpos]) >>> (6 - 4)) + | ((in[6 + inpos]) << 4) | ((in[7 + inpos]) << 10) + | ((in[8 + inpos]) << 16) | ((in[9 + inpos]) << 22) + | ((in[10 + inpos]) << 28); + out[2 + outpos] = ((in[10 + inpos]) >>> (6 - 2)) + | ((in[11 + inpos]) << 2) | ((in[12 + inpos]) << 8) + | ((in[13 + inpos]) << 14) | ((in[14 + inpos]) << 20) + | ((in[15 + inpos]) << 26); + out[3 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 6) + | ((in[18 + inpos]) << 12) | ((in[19 + inpos]) << 18) + | ((in[20 + inpos]) << 24) | ((in[21 + inpos]) << 30); + out[4 + outpos] = ((in[21 + inpos]) >>> (6 - 4)) + | ((in[22 + inpos]) << 4) | ((in[23 + inpos]) << 10) + | ((in[24 + inpos]) << 16) | ((in[25 + inpos]) << 22) + | ((in[26 + inpos]) << 28); + out[5 + outpos] = ((in[26 + inpos]) >>> (6 - 2)) + | ((in[27 + inpos]) << 2) | ((in[28 + inpos]) << 8) + | ((in[29 + inpos]) << 14) | ((in[30 + inpos]) << 20) + | ((in[31 + inpos]) << 26); + } + protected static void fastpackwithoutmask7(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 7) + | ((in[2 + inpos]) << 14) | ((in[3 + inpos]) << 21) + | ((in[4 + inpos]) << 28); + out[1 + outpos] = ((in[4 + inpos]) >>> (7 - 3)) + | ((in[5 + inpos]) << 3) | ((in[6 + inpos]) << 10) + | ((in[7 + inpos]) << 17) | ((in[8 + inpos]) << 24) + | ((in[9 + inpos]) << 31); + out[2 + outpos] = ((in[9 + inpos]) >>> (7 - 6)) + | ((in[10 + inpos]) << 6) | ((in[11 + inpos]) << 13) + | ((in[12 + inpos]) << 20) | ((in[13 + inpos]) << 27); + out[3 + outpos] = ((in[13 + inpos]) >>> (7 - 2)) + | ((in[14 + inpos]) << 2) | ((in[15 + inpos]) << 9) + | ((in[16 + inpos]) << 16) | ((in[17 + inpos]) << 23) + | ((in[18 + inpos]) << 30); + out[4 + outpos] = ((in[18 + inpos]) >>> (7 - 5)) + | ((in[19 + inpos]) << 5) | ((in[20 + inpos]) << 12) + | ((in[21 + inpos]) << 19) | ((in[22 + inpos]) << 26); + out[5 + outpos] = ((in[22 + inpos]) >>> (7 - 1)) + | ((in[23 + inpos]) << 1) | ((in[24 + inpos]) << 8) + | ((in[25 + inpos]) << 15) | ((in[26 + inpos]) << 22) + | ((in[27 + inpos]) << 29); + out[6 + outpos] = ((in[27 + inpos]) >>> (7 - 4)) + | ((in[28 + inpos]) << 4) | ((in[29 + inpos]) << 11) + | ((in[30 + inpos]) << 18) | ((in[31 + inpos]) << 25); + } - protected static void fastpack24(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 16777215) - | ((in[1 + inpos]) << 24) - ; - out[1 + outpos] = ((in[1 + inpos] & 16777215) >>> (24 - 16)) - | ((in[2 + inpos]) << 16) - ; - out[2 + outpos] = ((in[2 + inpos] & 16777215) >>> (24 - 8)) - | ((in[3 + inpos]) << 8) - ; - out[3 + outpos] = (in[4 + inpos] & 16777215) - | ((in[5 + inpos]) << 24) - ; - out[4 + outpos] = ((in[5 + inpos] & 16777215) >>> (24 - 16)) - | ((in[6 + inpos]) << 16) - ; - out[5 + outpos] = ((in[6 + inpos] & 16777215) >>> (24 - 8)) - | ((in[7 + inpos]) << 8) - ; - out[6 + outpos] = (in[8 + inpos] & 16777215) - | ((in[9 + inpos]) << 24) - ; - out[7 + outpos] = ((in[9 + inpos] & 16777215) >>> (24 - 16)) - | ((in[10 + inpos]) << 16) - ; - out[8 + outpos] = ((in[10 + inpos] & 16777215) >>> (24 - 8)) - | ((in[11 + inpos]) << 8) - ; - out[9 + outpos] = (in[12 + inpos] & 16777215) - | ((in[13 + inpos]) << 24) - ; - out[10 + outpos] = ((in[13 + inpos] & 16777215) >>> (24 - 16)) - | ((in[14 + inpos]) << 16) - ; - out[11 + outpos] = ((in[14 + inpos] & 16777215) >>> (24 - 8)) - | ((in[15 + inpos]) << 8) - ; - out[12 + outpos] = (in[16 + inpos] & 16777215) - | ((in[17 + inpos]) << 24) - ; - out[13 + outpos] = ((in[17 + inpos] & 16777215) >>> (24 - 16)) - | ((in[18 + inpos]) << 16) - ; - out[14 + outpos] = ((in[18 + inpos] & 16777215) >>> (24 - 8)) - | ((in[19 + inpos]) << 8) - ; - out[15 + outpos] = (in[20 + inpos] & 16777215) - | ((in[21 + inpos]) << 24) - ; - out[16 + outpos] = ((in[21 + inpos] & 16777215) >>> (24 - 16)) - | ((in[22 + inpos]) << 16) - ; - out[17 + outpos] = ((in[22 + inpos] & 16777215) >>> (24 - 8)) - | ((in[23 + inpos]) << 8) - ; - out[18 + outpos] = (in[24 + inpos] & 16777215) - | ((in[25 + inpos]) << 24) - ; - out[19 + outpos] = ((in[25 + inpos] & 16777215) >>> (24 - 16)) - | ((in[26 + inpos]) << 16) - ; - out[20 + outpos] = ((in[26 + inpos] & 16777215) >>> (24 - 8)) - | ((in[27 + inpos]) << 8) - ; - out[21 + outpos] = (in[28 + inpos] & 16777215) - | ((in[29 + inpos]) << 24) - ; - out[22 + outpos] = ((in[29 + inpos] & 16777215) >>> (24 - 16)) - | ((in[30 + inpos]) << 16) - ; - out[23 + outpos] = ((in[30 + inpos] & 16777215) >>> (24 - 8)) - | ((in[31 + inpos]) << 8) - ; - } + protected static void fastpackwithoutmask8(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 8) + | ((in[2 + inpos]) << 16) | ((in[3 + inpos]) << 24); + out[1 + outpos] = in[4 + inpos] | ((in[5 + inpos]) << 8) + | ((in[6 + inpos]) << 16) | ((in[7 + inpos]) << 24); + out[2 + outpos] = in[8 + inpos] | ((in[9 + inpos]) << 8) + | ((in[10 + inpos]) << 16) | ((in[11 + inpos]) << 24); + out[3 + outpos] = in[12 + inpos] | ((in[13 + inpos]) << 8) + | ((in[14 + inpos]) << 16) | ((in[15 + inpos]) << 24); + out[4 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 8) + | ((in[18 + inpos]) << 16) | ((in[19 + inpos]) << 24); + out[5 + outpos] = in[20 + inpos] | ((in[21 + inpos]) << 8) + | ((in[22 + inpos]) << 16) | ((in[23 + inpos]) << 24); + out[6 + outpos] = in[24 + inpos] | ((in[25 + inpos]) << 8) + | ((in[26 + inpos]) << 16) | ((in[27 + inpos]) << 24); + out[7 + outpos] = in[28 + inpos] | ((in[29 + inpos]) << 8) + | ((in[30 + inpos]) << 16) | ((in[31 + inpos]) << 24); + } + protected static void fastpackwithoutmask9(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 9) + | ((in[2 + inpos]) << 18) | ((in[3 + inpos]) << 27); + out[1 + outpos] = ((in[3 + inpos]) >>> (9 - 4)) + | ((in[4 + inpos]) << 4) | ((in[5 + inpos]) << 13) + | ((in[6 + inpos]) << 22) | ((in[7 + inpos]) << 31); + out[2 + outpos] = ((in[7 + inpos]) >>> (9 - 8)) + | ((in[8 + inpos]) << 8) | ((in[9 + inpos]) << 17) + | ((in[10 + inpos]) << 26); + out[3 + outpos] = ((in[10 + inpos]) >>> (9 - 3)) + | ((in[11 + inpos]) << 3) | ((in[12 + inpos]) << 12) + | ((in[13 + inpos]) << 21) | ((in[14 + inpos]) << 30); + out[4 + outpos] = ((in[14 + inpos]) >>> (9 - 7)) + | ((in[15 + inpos]) << 7) | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 25); + out[5 + outpos] = ((in[17 + inpos]) >>> (9 - 2)) + | ((in[18 + inpos]) << 2) | ((in[19 + inpos]) << 11) + | ((in[20 + inpos]) << 20) | ((in[21 + inpos]) << 29); + out[6 + outpos] = ((in[21 + inpos]) >>> (9 - 6)) + | ((in[22 + inpos]) << 6) | ((in[23 + inpos]) << 15) + | ((in[24 + inpos]) << 24); + out[7 + outpos] = ((in[24 + inpos]) >>> (9 - 1)) + | ((in[25 + inpos]) << 1) | ((in[26 + inpos]) << 10) + | ((in[27 + inpos]) << 19) | ((in[28 + inpos]) << 28); + out[8 + outpos] = ((in[28 + inpos]) >>> (9 - 5)) + | ((in[29 + inpos]) << 5) | ((in[30 + inpos]) << 14) + | ((in[31 + inpos]) << 23); + } - protected static void fastpack25(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 33554431) - | ((in[1 + inpos]) << 25) - ; - out[1 + outpos] = ((in[1 + inpos] & 33554431) >>> (25 - 18)) - | ((in[2 + inpos]) << 18) - ; - out[2 + outpos] = ((in[2 + inpos] & 33554431) >>> (25 - 11)) - | ((in[3 + inpos]) << 11) - ; - out[3 + outpos] = ((in[3 + inpos] & 33554431) >>> (25 - 4)) - | ((in[4 + inpos] & 33554431) << 4) - | ((in[5 + inpos]) << 29) - ; - out[4 + outpos] = ((in[5 + inpos] & 33554431) >>> (25 - 22)) - | ((in[6 + inpos]) << 22) - ; - out[5 + outpos] = ((in[6 + inpos] & 33554431) >>> (25 - 15)) - | ((in[7 + inpos]) << 15) - ; - out[6 + outpos] = ((in[7 + inpos] & 33554431) >>> (25 - 8)) - | ((in[8 + inpos]) << 8) - ; - out[7 + outpos] = ((in[8 + inpos] & 33554431) >>> (25 - 1)) - | ((in[9 + inpos] & 33554431) << 1) - | ((in[10 + inpos]) << 26) - ; - out[8 + outpos] = ((in[10 + inpos] & 33554431) >>> (25 - 19)) - | ((in[11 + inpos]) << 19) - ; - out[9 + outpos] = ((in[11 + inpos] & 33554431) >>> (25 - 12)) - | ((in[12 + inpos]) << 12) - ; - out[10 + outpos] = ((in[12 + inpos] & 33554431) >>> (25 - 5)) - | ((in[13 + inpos] & 33554431) << 5) - | ((in[14 + inpos]) << 30) - ; - out[11 + outpos] = ((in[14 + inpos] & 33554431) >>> (25 - 23)) - | ((in[15 + inpos]) << 23) - ; - out[12 + outpos] = ((in[15 + inpos] & 33554431) >>> (25 - 16)) - | ((in[16 + inpos]) << 16) - ; - out[13 + outpos] = ((in[16 + inpos] & 33554431) >>> (25 - 9)) - | ((in[17 + inpos]) << 9) - ; - out[14 + outpos] = ((in[17 + inpos] & 33554431) >>> (25 - 2)) - | ((in[18 + inpos] & 33554431) << 2) - | ((in[19 + inpos]) << 27) - ; - out[15 + outpos] = ((in[19 + inpos] & 33554431) >>> (25 - 20)) - | ((in[20 + inpos]) << 20) - ; - out[16 + outpos] = ((in[20 + inpos] & 33554431) >>> (25 - 13)) - | ((in[21 + inpos]) << 13) - ; - out[17 + outpos] = ((in[21 + inpos] & 33554431) >>> (25 - 6)) - | ((in[22 + inpos] & 33554431) << 6) - | ((in[23 + inpos]) << 31) - ; - out[18 + outpos] = ((in[23 + inpos] & 33554431) >>> (25 - 24)) - | ((in[24 + inpos]) << 24) - ; - out[19 + outpos] = ((in[24 + inpos] & 33554431) >>> (25 - 17)) - | ((in[25 + inpos]) << 17) - ; - out[20 + outpos] = ((in[25 + inpos] & 33554431) >>> (25 - 10)) - | ((in[26 + inpos]) << 10) - ; - out[21 + outpos] = ((in[26 + inpos] & 33554431) >>> (25 - 3)) - | ((in[27 + inpos] & 33554431) << 3) - | ((in[28 + inpos]) << 28) - ; - out[22 + outpos] = ((in[28 + inpos] & 33554431) >>> (25 - 21)) - | ((in[29 + inpos]) << 21) - ; - out[23 + outpos] = ((in[29 + inpos] & 33554431) >>> (25 - 14)) - | ((in[30 + inpos]) << 14) - ; - out[24 + outpos] = ((in[30 + inpos] & 33554431) >>> (25 - 7)) - | ((in[31 + inpos]) << 7) - ; - } + protected static void fastpackwithoutmask10(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 10) + | ((in[2 + inpos]) << 20) | ((in[3 + inpos]) << 30); + out[1 + outpos] = ((in[3 + inpos]) >>> (10 - 8)) + | ((in[4 + inpos]) << 8) | ((in[5 + inpos]) << 18) + | ((in[6 + inpos]) << 28); + out[2 + outpos] = ((in[6 + inpos]) >>> (10 - 6)) + | ((in[7 + inpos]) << 6) | ((in[8 + inpos]) << 16) + | ((in[9 + inpos]) << 26); + out[3 + outpos] = ((in[9 + inpos]) >>> (10 - 4)) + | ((in[10 + inpos]) << 4) | ((in[11 + inpos]) << 14) + | ((in[12 + inpos]) << 24); + out[4 + outpos] = ((in[12 + inpos]) >>> (10 - 2)) + | ((in[13 + inpos]) << 2) | ((in[14 + inpos]) << 12) + | ((in[15 + inpos]) << 22); + out[5 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 10) + | ((in[18 + inpos]) << 20) | ((in[19 + inpos]) << 30); + out[6 + outpos] = ((in[19 + inpos]) >>> (10 - 8)) + | ((in[20 + inpos]) << 8) | ((in[21 + inpos]) << 18) + | ((in[22 + inpos]) << 28); + out[7 + outpos] = ((in[22 + inpos]) >>> (10 - 6)) + | ((in[23 + inpos]) << 6) | ((in[24 + inpos]) << 16) + | ((in[25 + inpos]) << 26); + out[8 + outpos] = ((in[25 + inpos]) >>> (10 - 4)) + | ((in[26 + inpos]) << 4) | ((in[27 + inpos]) << 14) + | ((in[28 + inpos]) << 24); + out[9 + outpos] = ((in[28 + inpos]) >>> (10 - 2)) + | ((in[29 + inpos]) << 2) | ((in[30 + inpos]) << 12) + | ((in[31 + inpos]) << 22); + } + protected static void fastpackwithoutmask11(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 11) + | ((in[2 + inpos]) << 22); + out[1 + outpos] = ((in[2 + inpos]) >>> (11 - 1)) + | ((in[3 + inpos]) << 1) | ((in[4 + inpos]) << 12) + | ((in[5 + inpos]) << 23); + out[2 + outpos] = ((in[5 + inpos]) >>> (11 - 2)) + | ((in[6 + inpos]) << 2) | ((in[7 + inpos]) << 13) + | ((in[8 + inpos]) << 24); + out[3 + outpos] = ((in[8 + inpos]) >>> (11 - 3)) + | ((in[9 + inpos]) << 3) | ((in[10 + inpos]) << 14) + | ((in[11 + inpos]) << 25); + out[4 + outpos] = ((in[11 + inpos]) >>> (11 - 4)) + | ((in[12 + inpos]) << 4) | ((in[13 + inpos]) << 15) + | ((in[14 + inpos]) << 26); + out[5 + outpos] = ((in[14 + inpos]) >>> (11 - 5)) + | ((in[15 + inpos]) << 5) | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 27); + out[6 + outpos] = ((in[17 + inpos]) >>> (11 - 6)) + | ((in[18 + inpos]) << 6) | ((in[19 + inpos]) << 17) + | ((in[20 + inpos]) << 28); + out[7 + outpos] = ((in[20 + inpos]) >>> (11 - 7)) + | ((in[21 + inpos]) << 7) | ((in[22 + inpos]) << 18) + | ((in[23 + inpos]) << 29); + out[8 + outpos] = ((in[23 + inpos]) >>> (11 - 8)) + | ((in[24 + inpos]) << 8) | ((in[25 + inpos]) << 19) + | ((in[26 + inpos]) << 30); + out[9 + outpos] = ((in[26 + inpos]) >>> (11 - 9)) + | ((in[27 + inpos]) << 9) | ((in[28 + inpos]) << 20) + | ((in[29 + inpos]) << 31); + out[10 + outpos] = ((in[29 + inpos]) >>> (11 - 10)) + | ((in[30 + inpos]) << 10) | ((in[31 + inpos]) << 21); + } - protected static void fastpack26(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 67108863) - | ((in[1 + inpos]) << 26) - ; - out[1 + outpos] = ((in[1 + inpos] & 67108863) >>> (26 - 20)) - | ((in[2 + inpos]) << 20) - ; - out[2 + outpos] = ((in[2 + inpos] & 67108863) >>> (26 - 14)) - | ((in[3 + inpos]) << 14) - ; - out[3 + outpos] = ((in[3 + inpos] & 67108863) >>> (26 - 8)) - | ((in[4 + inpos]) << 8) - ; - out[4 + outpos] = ((in[4 + inpos] & 67108863) >>> (26 - 2)) - | ((in[5 + inpos] & 67108863) << 2) - | ((in[6 + inpos]) << 28) - ; - out[5 + outpos] = ((in[6 + inpos] & 67108863) >>> (26 - 22)) - | ((in[7 + inpos]) << 22) - ; - out[6 + outpos] = ((in[7 + inpos] & 67108863) >>> (26 - 16)) - | ((in[8 + inpos]) << 16) - ; - out[7 + outpos] = ((in[8 + inpos] & 67108863) >>> (26 - 10)) - | ((in[9 + inpos]) << 10) - ; - out[8 + outpos] = ((in[9 + inpos] & 67108863) >>> (26 - 4)) - | ((in[10 + inpos] & 67108863) << 4) - | ((in[11 + inpos]) << 30) - ; - out[9 + outpos] = ((in[11 + inpos] & 67108863) >>> (26 - 24)) - | ((in[12 + inpos]) << 24) - ; - out[10 + outpos] = ((in[12 + inpos] & 67108863) >>> (26 - 18)) - | ((in[13 + inpos]) << 18) - ; - out[11 + outpos] = ((in[13 + inpos] & 67108863) >>> (26 - 12)) - | ((in[14 + inpos]) << 12) - ; - out[12 + outpos] = ((in[14 + inpos] & 67108863) >>> (26 - 6)) - | ((in[15 + inpos]) << 6) - ; - out[13 + outpos] = (in[16 + inpos] & 67108863) - | ((in[17 + inpos]) << 26) - ; - out[14 + outpos] = ((in[17 + inpos] & 67108863) >>> (26 - 20)) - | ((in[18 + inpos]) << 20) - ; - out[15 + outpos] = ((in[18 + inpos] & 67108863) >>> (26 - 14)) - | ((in[19 + inpos]) << 14) - ; - out[16 + outpos] = ((in[19 + inpos] & 67108863) >>> (26 - 8)) - | ((in[20 + inpos]) << 8) - ; - out[17 + outpos] = ((in[20 + inpos] & 67108863) >>> (26 - 2)) - | ((in[21 + inpos] & 67108863) << 2) - | ((in[22 + inpos]) << 28) - ; - out[18 + outpos] = ((in[22 + inpos] & 67108863) >>> (26 - 22)) - | ((in[23 + inpos]) << 22) - ; - out[19 + outpos] = ((in[23 + inpos] & 67108863) >>> (26 - 16)) - | ((in[24 + inpos]) << 16) - ; - out[20 + outpos] = ((in[24 + inpos] & 67108863) >>> (26 - 10)) - | ((in[25 + inpos]) << 10) - ; - out[21 + outpos] = ((in[25 + inpos] & 67108863) >>> (26 - 4)) - | ((in[26 + inpos] & 67108863) << 4) - | ((in[27 + inpos]) << 30) - ; - out[22 + outpos] = ((in[27 + inpos] & 67108863) >>> (26 - 24)) - | ((in[28 + inpos]) << 24) - ; - out[23 + outpos] = ((in[28 + inpos] & 67108863) >>> (26 - 18)) - | ((in[29 + inpos]) << 18) - ; - out[24 + outpos] = ((in[29 + inpos] & 67108863) >>> (26 - 12)) - | ((in[30 + inpos]) << 12) - ; - out[25 + outpos] = ((in[30 + inpos] & 67108863) >>> (26 - 6)) - | ((in[31 + inpos]) << 6) - ; - } + protected static void fastpackwithoutmask12(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 12) + | ((in[2 + inpos]) << 24); + out[1 + outpos] = ((in[2 + inpos]) >>> (12 - 4)) + | ((in[3 + inpos]) << 4) | ((in[4 + inpos]) << 16) + | ((in[5 + inpos]) << 28); + out[2 + outpos] = ((in[5 + inpos]) >>> (12 - 8)) + | ((in[6 + inpos]) << 8) | ((in[7 + inpos]) << 20); + out[3 + outpos] = in[8 + inpos] | ((in[9 + inpos]) << 12) + | ((in[10 + inpos]) << 24); + out[4 + outpos] = ((in[10 + inpos]) >>> (12 - 4)) + | ((in[11 + inpos]) << 4) | ((in[12 + inpos]) << 16) + | ((in[13 + inpos]) << 28); + out[5 + outpos] = ((in[13 + inpos]) >>> (12 - 8)) + | ((in[14 + inpos]) << 8) | ((in[15 + inpos]) << 20); + out[6 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 12) + | ((in[18 + inpos]) << 24); + out[7 + outpos] = ((in[18 + inpos]) >>> (12 - 4)) + | ((in[19 + inpos]) << 4) | ((in[20 + inpos]) << 16) + | ((in[21 + inpos]) << 28); + out[8 + outpos] = ((in[21 + inpos]) >>> (12 - 8)) + | ((in[22 + inpos]) << 8) | ((in[23 + inpos]) << 20); + out[9 + outpos] = in[24 + inpos] | ((in[25 + inpos]) << 12) + | ((in[26 + inpos]) << 24); + out[10 + outpos] = ((in[26 + inpos]) >>> (12 - 4)) + | ((in[27 + inpos]) << 4) | ((in[28 + inpos]) << 16) + | ((in[29 + inpos]) << 28); + out[11 + outpos] = ((in[29 + inpos]) >>> (12 - 8)) + | ((in[30 + inpos]) << 8) | ((in[31 + inpos]) << 20); + } + protected static void fastpackwithoutmask13(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 13) + | ((in[2 + inpos]) << 26); + out[1 + outpos] = ((in[2 + inpos]) >>> (13 - 7)) + | ((in[3 + inpos]) << 7) | ((in[4 + inpos]) << 20); + out[2 + outpos] = ((in[4 + inpos]) >>> (13 - 1)) + | ((in[5 + inpos]) << 1) | ((in[6 + inpos]) << 14) + | ((in[7 + inpos]) << 27); + out[3 + outpos] = ((in[7 + inpos]) >>> (13 - 8)) + | ((in[8 + inpos]) << 8) | ((in[9 + inpos]) << 21); + out[4 + outpos] = ((in[9 + inpos]) >>> (13 - 2)) + | ((in[10 + inpos]) << 2) | ((in[11 + inpos]) << 15) + | ((in[12 + inpos]) << 28); + out[5 + outpos] = ((in[12 + inpos]) >>> (13 - 9)) + | ((in[13 + inpos]) << 9) | ((in[14 + inpos]) << 22); + out[6 + outpos] = ((in[14 + inpos]) >>> (13 - 3)) + | ((in[15 + inpos]) << 3) | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 29); + out[7 + outpos] = ((in[17 + inpos]) >>> (13 - 10)) + | ((in[18 + inpos]) << 10) | ((in[19 + inpos]) << 23); + out[8 + outpos] = ((in[19 + inpos]) >>> (13 - 4)) + | ((in[20 + inpos]) << 4) | ((in[21 + inpos]) << 17) + | ((in[22 + inpos]) << 30); + out[9 + outpos] = ((in[22 + inpos]) >>> (13 - 11)) + | ((in[23 + inpos]) << 11) | ((in[24 + inpos]) << 24); + out[10 + outpos] = ((in[24 + inpos]) >>> (13 - 5)) + | ((in[25 + inpos]) << 5) | ((in[26 + inpos]) << 18) + | ((in[27 + inpos]) << 31); + out[11 + outpos] = ((in[27 + inpos]) >>> (13 - 12)) + | ((in[28 + inpos]) << 12) | ((in[29 + inpos]) << 25); + out[12 + outpos] = ((in[29 + inpos]) >>> (13 - 6)) + | ((in[30 + inpos]) << 6) | ((in[31 + inpos]) << 19); + } - protected static void fastpack27(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 134217727) - | ((in[1 + inpos]) << 27) - ; - out[1 + outpos] = ((in[1 + inpos] & 134217727) >>> (27 - 22)) - | ((in[2 + inpos]) << 22) - ; - out[2 + outpos] = ((in[2 + inpos] & 134217727) >>> (27 - 17)) - | ((in[3 + inpos]) << 17) - ; - out[3 + outpos] = ((in[3 + inpos] & 134217727) >>> (27 - 12)) - | ((in[4 + inpos]) << 12) - ; - out[4 + outpos] = ((in[4 + inpos] & 134217727) >>> (27 - 7)) - | ((in[5 + inpos]) << 7) - ; - out[5 + outpos] = ((in[5 + inpos] & 134217727) >>> (27 - 2)) - | ((in[6 + inpos] & 134217727) << 2) - | ((in[7 + inpos]) << 29) - ; - out[6 + outpos] = ((in[7 + inpos] & 134217727) >>> (27 - 24)) - | ((in[8 + inpos]) << 24) - ; - out[7 + outpos] = ((in[8 + inpos] & 134217727) >>> (27 - 19)) - | ((in[9 + inpos]) << 19) - ; - out[8 + outpos] = ((in[9 + inpos] & 134217727) >>> (27 - 14)) - | ((in[10 + inpos]) << 14) - ; - out[9 + outpos] = ((in[10 + inpos] & 134217727) >>> (27 - 9)) - | ((in[11 + inpos]) << 9) - ; - out[10 + outpos] = ((in[11 + inpos] & 134217727) >>> (27 - 4)) - | ((in[12 + inpos] & 134217727) << 4) - | ((in[13 + inpos]) << 31) - ; - out[11 + outpos] = ((in[13 + inpos] & 134217727) >>> (27 - 26)) - | ((in[14 + inpos]) << 26) - ; - out[12 + outpos] = ((in[14 + inpos] & 134217727) >>> (27 - 21)) - | ((in[15 + inpos]) << 21) - ; - out[13 + outpos] = ((in[15 + inpos] & 134217727) >>> (27 - 16)) - | ((in[16 + inpos]) << 16) - ; - out[14 + outpos] = ((in[16 + inpos] & 134217727) >>> (27 - 11)) - | ((in[17 + inpos]) << 11) - ; - out[15 + outpos] = ((in[17 + inpos] & 134217727) >>> (27 - 6)) - | ((in[18 + inpos]) << 6) - ; - out[16 + outpos] = ((in[18 + inpos] & 134217727) >>> (27 - 1)) - | ((in[19 + inpos] & 134217727) << 1) - | ((in[20 + inpos]) << 28) - ; - out[17 + outpos] = ((in[20 + inpos] & 134217727) >>> (27 - 23)) - | ((in[21 + inpos]) << 23) - ; - out[18 + outpos] = ((in[21 + inpos] & 134217727) >>> (27 - 18)) - | ((in[22 + inpos]) << 18) - ; - out[19 + outpos] = ((in[22 + inpos] & 134217727) >>> (27 - 13)) - | ((in[23 + inpos]) << 13) - ; - out[20 + outpos] = ((in[23 + inpos] & 134217727) >>> (27 - 8)) - | ((in[24 + inpos]) << 8) - ; - out[21 + outpos] = ((in[24 + inpos] & 134217727) >>> (27 - 3)) - | ((in[25 + inpos] & 134217727) << 3) - | ((in[26 + inpos]) << 30) - ; - out[22 + outpos] = ((in[26 + inpos] & 134217727) >>> (27 - 25)) - | ((in[27 + inpos]) << 25) - ; - out[23 + outpos] = ((in[27 + inpos] & 134217727) >>> (27 - 20)) - | ((in[28 + inpos]) << 20) - ; - out[24 + outpos] = ((in[28 + inpos] & 134217727) >>> (27 - 15)) - | ((in[29 + inpos]) << 15) - ; - out[25 + outpos] = ((in[29 + inpos] & 134217727) >>> (27 - 10)) - | ((in[30 + inpos]) << 10) - ; - out[26 + outpos] = ((in[30 + inpos] & 134217727) >>> (27 - 5)) - | ((in[31 + inpos]) << 5) - ; - } + protected static void fastpackwithoutmask14(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 14) + | ((in[2 + inpos]) << 28); + out[1 + outpos] = ((in[2 + inpos]) >>> (14 - 10)) + | ((in[3 + inpos]) << 10) | ((in[4 + inpos]) << 24); + out[2 + outpos] = ((in[4 + inpos]) >>> (14 - 6)) + | ((in[5 + inpos]) << 6) | ((in[6 + inpos]) << 20); + out[3 + outpos] = ((in[6 + inpos]) >>> (14 - 2)) + | ((in[7 + inpos]) << 2) | ((in[8 + inpos]) << 16) + | ((in[9 + inpos]) << 30); + out[4 + outpos] = ((in[9 + inpos]) >>> (14 - 12)) + | ((in[10 + inpos]) << 12) | ((in[11 + inpos]) << 26); + out[5 + outpos] = ((in[11 + inpos]) >>> (14 - 8)) + | ((in[12 + inpos]) << 8) | ((in[13 + inpos]) << 22); + out[6 + outpos] = ((in[13 + inpos]) >>> (14 - 4)) + | ((in[14 + inpos]) << 4) | ((in[15 + inpos]) << 18); + out[7 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 14) + | ((in[18 + inpos]) << 28); + out[8 + outpos] = ((in[18 + inpos]) >>> (14 - 10)) + | ((in[19 + inpos]) << 10) | ((in[20 + inpos]) << 24); + out[9 + outpos] = ((in[20 + inpos]) >>> (14 - 6)) + | ((in[21 + inpos]) << 6) | ((in[22 + inpos]) << 20); + out[10 + outpos] = ((in[22 + inpos]) >>> (14 - 2)) + | ((in[23 + inpos]) << 2) | ((in[24 + inpos]) << 16) + | ((in[25 + inpos]) << 30); + out[11 + outpos] = ((in[25 + inpos]) >>> (14 - 12)) + | ((in[26 + inpos]) << 12) | ((in[27 + inpos]) << 26); + out[12 + outpos] = ((in[27 + inpos]) >>> (14 - 8)) + | ((in[28 + inpos]) << 8) | ((in[29 + inpos]) << 22); + out[13 + outpos] = ((in[29 + inpos]) >>> (14 - 4)) + | ((in[30 + inpos]) << 4) | ((in[31 + inpos]) << 18); + } + protected static void fastpackwithoutmask15(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 15) + | ((in[2 + inpos]) << 30); + out[1 + outpos] = ((in[2 + inpos]) >>> (15 - 13)) + | ((in[3 + inpos]) << 13) | ((in[4 + inpos]) << 28); + out[2 + outpos] = ((in[4 + inpos]) >>> (15 - 11)) + | ((in[5 + inpos]) << 11) | ((in[6 + inpos]) << 26); + out[3 + outpos] = ((in[6 + inpos]) >>> (15 - 9)) + | ((in[7 + inpos]) << 9) | ((in[8 + inpos]) << 24); + out[4 + outpos] = ((in[8 + inpos]) >>> (15 - 7)) + | ((in[9 + inpos]) << 7) | ((in[10 + inpos]) << 22); + out[5 + outpos] = ((in[10 + inpos]) >>> (15 - 5)) + | ((in[11 + inpos]) << 5) | ((in[12 + inpos]) << 20); + out[6 + outpos] = ((in[12 + inpos]) >>> (15 - 3)) + | ((in[13 + inpos]) << 3) | ((in[14 + inpos]) << 18); + out[7 + outpos] = ((in[14 + inpos]) >>> (15 - 1)) + | ((in[15 + inpos]) << 1) | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 31); + out[8 + outpos] = ((in[17 + inpos]) >>> (15 - 14)) + | ((in[18 + inpos]) << 14) | ((in[19 + inpos]) << 29); + out[9 + outpos] = ((in[19 + inpos]) >>> (15 - 12)) + | ((in[20 + inpos]) << 12) | ((in[21 + inpos]) << 27); + out[10 + outpos] = ((in[21 + inpos]) >>> (15 - 10)) + | ((in[22 + inpos]) << 10) | ((in[23 + inpos]) << 25); + out[11 + outpos] = ((in[23 + inpos]) >>> (15 - 8)) + | ((in[24 + inpos]) << 8) | ((in[25 + inpos]) << 23); + out[12 + outpos] = ((in[25 + inpos]) >>> (15 - 6)) + | ((in[26 + inpos]) << 6) | ((in[27 + inpos]) << 21); + out[13 + outpos] = ((in[27 + inpos]) >>> (15 - 4)) + | ((in[28 + inpos]) << 4) | ((in[29 + inpos]) << 19); + out[14 + outpos] = ((in[29 + inpos]) >>> (15 - 2)) + | ((in[30 + inpos]) << 2) | ((in[31 + inpos]) << 17); + } - protected static void fastpack28(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 268435455) - | ((in[1 + inpos]) << 28) - ; - out[1 + outpos] = ((in[1 + inpos] & 268435455) >>> (28 - 24)) - | ((in[2 + inpos]) << 24) - ; - out[2 + outpos] = ((in[2 + inpos] & 268435455) >>> (28 - 20)) - | ((in[3 + inpos]) << 20) - ; - out[3 + outpos] = ((in[3 + inpos] & 268435455) >>> (28 - 16)) - | ((in[4 + inpos]) << 16) - ; - out[4 + outpos] = ((in[4 + inpos] & 268435455) >>> (28 - 12)) - | ((in[5 + inpos]) << 12) - ; - out[5 + outpos] = ((in[5 + inpos] & 268435455) >>> (28 - 8)) - | ((in[6 + inpos]) << 8) - ; - out[6 + outpos] = ((in[6 + inpos] & 268435455) >>> (28 - 4)) - | ((in[7 + inpos]) << 4) - ; - out[7 + outpos] = (in[8 + inpos] & 268435455) - | ((in[9 + inpos]) << 28) - ; - out[8 + outpos] = ((in[9 + inpos] & 268435455) >>> (28 - 24)) - | ((in[10 + inpos]) << 24) - ; - out[9 + outpos] = ((in[10 + inpos] & 268435455) >>> (28 - 20)) - | ((in[11 + inpos]) << 20) - ; - out[10 + outpos] = ((in[11 + inpos] & 268435455) >>> (28 - 16)) - | ((in[12 + inpos]) << 16) - ; - out[11 + outpos] = ((in[12 + inpos] & 268435455) >>> (28 - 12)) - | ((in[13 + inpos]) << 12) - ; - out[12 + outpos] = ((in[13 + inpos] & 268435455) >>> (28 - 8)) - | ((in[14 + inpos]) << 8) - ; - out[13 + outpos] = ((in[14 + inpos] & 268435455) >>> (28 - 4)) - | ((in[15 + inpos]) << 4) - ; - out[14 + outpos] = (in[16 + inpos] & 268435455) - | ((in[17 + inpos]) << 28) - ; - out[15 + outpos] = ((in[17 + inpos] & 268435455) >>> (28 - 24)) - | ((in[18 + inpos]) << 24) - ; - out[16 + outpos] = ((in[18 + inpos] & 268435455) >>> (28 - 20)) - | ((in[19 + inpos]) << 20) - ; - out[17 + outpos] = ((in[19 + inpos] & 268435455) >>> (28 - 16)) - | ((in[20 + inpos]) << 16) - ; - out[18 + outpos] = ((in[20 + inpos] & 268435455) >>> (28 - 12)) - | ((in[21 + inpos]) << 12) - ; - out[19 + outpos] = ((in[21 + inpos] & 268435455) >>> (28 - 8)) - | ((in[22 + inpos]) << 8) - ; - out[20 + outpos] = ((in[22 + inpos] & 268435455) >>> (28 - 4)) - | ((in[23 + inpos]) << 4) - ; - out[21 + outpos] = (in[24 + inpos] & 268435455) - | ((in[25 + inpos]) << 28) - ; - out[22 + outpos] = ((in[25 + inpos] & 268435455) >>> (28 - 24)) - | ((in[26 + inpos]) << 24) - ; - out[23 + outpos] = ((in[26 + inpos] & 268435455) >>> (28 - 20)) - | ((in[27 + inpos]) << 20) - ; - out[24 + outpos] = ((in[27 + inpos] & 268435455) >>> (28 - 16)) - | ((in[28 + inpos]) << 16) - ; - out[25 + outpos] = ((in[28 + inpos] & 268435455) >>> (28 - 12)) - | ((in[29 + inpos]) << 12) - ; - out[26 + outpos] = ((in[29 + inpos] & 268435455) >>> (28 - 8)) - | ((in[30 + inpos]) << 8) - ; - out[27 + outpos] = ((in[30 + inpos] & 268435455) >>> (28 - 4)) - | ((in[31 + inpos]) << 4) - ; - } + protected static void fastpackwithoutmask16(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 16); + out[1 + outpos] = in[2 + inpos] | ((in[3 + inpos]) << 16); + out[2 + outpos] = in[4 + inpos] | ((in[5 + inpos]) << 16); + out[3 + outpos] = in[6 + inpos] | ((in[7 + inpos]) << 16); + out[4 + outpos] = in[8 + inpos] | ((in[9 + inpos]) << 16); + out[5 + outpos] = in[10 + inpos] | ((in[11 + inpos]) << 16); + out[6 + outpos] = in[12 + inpos] | ((in[13 + inpos]) << 16); + out[7 + outpos] = in[14 + inpos] | ((in[15 + inpos]) << 16); + out[8 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 16); + out[9 + outpos] = in[18 + inpos] | ((in[19 + inpos]) << 16); + out[10 + outpos] = in[20 + inpos] | ((in[21 + inpos]) << 16); + out[11 + outpos] = in[22 + inpos] | ((in[23 + inpos]) << 16); + out[12 + outpos] = in[24 + inpos] | ((in[25 + inpos]) << 16); + out[13 + outpos] = in[26 + inpos] | ((in[27 + inpos]) << 16); + out[14 + outpos] = in[28 + inpos] | ((in[29 + inpos]) << 16); + out[15 + outpos] = in[30 + inpos] | ((in[31 + inpos]) << 16); + } + protected static void fastpackwithoutmask17(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 17); + out[1 + outpos] = ((in[1 + inpos]) >>> (17 - 2)) + | ((in[2 + inpos]) << 2) | ((in[3 + inpos]) << 19); + out[2 + outpos] = ((in[3 + inpos]) >>> (17 - 4)) + | ((in[4 + inpos]) << 4) | ((in[5 + inpos]) << 21); + out[3 + outpos] = ((in[5 + inpos]) >>> (17 - 6)) + | ((in[6 + inpos]) << 6) | ((in[7 + inpos]) << 23); + out[4 + outpos] = ((in[7 + inpos]) >>> (17 - 8)) + | ((in[8 + inpos]) << 8) | ((in[9 + inpos]) << 25); + out[5 + outpos] = ((in[9 + inpos]) >>> (17 - 10)) + | ((in[10 + inpos]) << 10) | ((in[11 + inpos]) << 27); + out[6 + outpos] = ((in[11 + inpos]) >>> (17 - 12)) + | ((in[12 + inpos]) << 12) | ((in[13 + inpos]) << 29); + out[7 + outpos] = ((in[13 + inpos]) >>> (17 - 14)) + | ((in[14 + inpos]) << 14) | ((in[15 + inpos]) << 31); + out[8 + outpos] = ((in[15 + inpos]) >>> (17 - 16)) + | ((in[16 + inpos]) << 16); + out[9 + outpos] = ((in[16 + inpos]) >>> (17 - 1)) + | ((in[17 + inpos]) << 1) | ((in[18 + inpos]) << 18); + out[10 + outpos] = ((in[18 + inpos]) >>> (17 - 3)) + | ((in[19 + inpos]) << 3) | ((in[20 + inpos]) << 20); + out[11 + outpos] = ((in[20 + inpos]) >>> (17 - 5)) + | ((in[21 + inpos]) << 5) | ((in[22 + inpos]) << 22); + out[12 + outpos] = ((in[22 + inpos]) >>> (17 - 7)) + | ((in[23 + inpos]) << 7) | ((in[24 + inpos]) << 24); + out[13 + outpos] = ((in[24 + inpos]) >>> (17 - 9)) + | ((in[25 + inpos]) << 9) | ((in[26 + inpos]) << 26); + out[14 + outpos] = ((in[26 + inpos]) >>> (17 - 11)) + | ((in[27 + inpos]) << 11) | ((in[28 + inpos]) << 28); + out[15 + outpos] = ((in[28 + inpos]) >>> (17 - 13)) + | ((in[29 + inpos]) << 13) | ((in[30 + inpos]) << 30); + out[16 + outpos] = ((in[30 + inpos]) >>> (17 - 15)) + | ((in[31 + inpos]) << 15); + } - protected static void fastpack29(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 536870911) - | ((in[1 + inpos]) << 29) - ; - out[1 + outpos] = ((in[1 + inpos] & 536870911) >>> (29 - 26)) - | ((in[2 + inpos]) << 26) - ; - out[2 + outpos] = ((in[2 + inpos] & 536870911) >>> (29 - 23)) - | ((in[3 + inpos]) << 23) - ; - out[3 + outpos] = ((in[3 + inpos] & 536870911) >>> (29 - 20)) - | ((in[4 + inpos]) << 20) - ; - out[4 + outpos] = ((in[4 + inpos] & 536870911) >>> (29 - 17)) - | ((in[5 + inpos]) << 17) - ; - out[5 + outpos] = ((in[5 + inpos] & 536870911) >>> (29 - 14)) - | ((in[6 + inpos]) << 14) - ; - out[6 + outpos] = ((in[6 + inpos] & 536870911) >>> (29 - 11)) - | ((in[7 + inpos]) << 11) - ; - out[7 + outpos] = ((in[7 + inpos] & 536870911) >>> (29 - 8)) - | ((in[8 + inpos]) << 8) - ; - out[8 + outpos] = ((in[8 + inpos] & 536870911) >>> (29 - 5)) - | ((in[9 + inpos]) << 5) - ; - out[9 + outpos] = ((in[9 + inpos] & 536870911) >>> (29 - 2)) - | ((in[10 + inpos] & 536870911) << 2) - | ((in[11 + inpos]) << 31) - ; - out[10 + outpos] = ((in[11 + inpos] & 536870911) >>> (29 - 28)) - | ((in[12 + inpos]) << 28) - ; - out[11 + outpos] = ((in[12 + inpos] & 536870911) >>> (29 - 25)) - | ((in[13 + inpos]) << 25) - ; - out[12 + outpos] = ((in[13 + inpos] & 536870911) >>> (29 - 22)) - | ((in[14 + inpos]) << 22) - ; - out[13 + outpos] = ((in[14 + inpos] & 536870911) >>> (29 - 19)) - | ((in[15 + inpos]) << 19) - ; - out[14 + outpos] = ((in[15 + inpos] & 536870911) >>> (29 - 16)) - | ((in[16 + inpos]) << 16) - ; - out[15 + outpos] = ((in[16 + inpos] & 536870911) >>> (29 - 13)) - | ((in[17 + inpos]) << 13) - ; - out[16 + outpos] = ((in[17 + inpos] & 536870911) >>> (29 - 10)) - | ((in[18 + inpos]) << 10) - ; - out[17 + outpos] = ((in[18 + inpos] & 536870911) >>> (29 - 7)) - | ((in[19 + inpos]) << 7) - ; - out[18 + outpos] = ((in[19 + inpos] & 536870911) >>> (29 - 4)) - | ((in[20 + inpos]) << 4) - ; - out[19 + outpos] = ((in[20 + inpos] & 536870911) >>> (29 - 1)) - | ((in[21 + inpos] & 536870911) << 1) - | ((in[22 + inpos]) << 30) - ; - out[20 + outpos] = ((in[22 + inpos] & 536870911) >>> (29 - 27)) - | ((in[23 + inpos]) << 27) - ; - out[21 + outpos] = ((in[23 + inpos] & 536870911) >>> (29 - 24)) - | ((in[24 + inpos]) << 24) - ; - out[22 + outpos] = ((in[24 + inpos] & 536870911) >>> (29 - 21)) - | ((in[25 + inpos]) << 21) - ; - out[23 + outpos] = ((in[25 + inpos] & 536870911) >>> (29 - 18)) - | ((in[26 + inpos]) << 18) - ; - out[24 + outpos] = ((in[26 + inpos] & 536870911) >>> (29 - 15)) - | ((in[27 + inpos]) << 15) - ; - out[25 + outpos] = ((in[27 + inpos] & 536870911) >>> (29 - 12)) - | ((in[28 + inpos]) << 12) - ; - out[26 + outpos] = ((in[28 + inpos] & 536870911) >>> (29 - 9)) - | ((in[29 + inpos]) << 9) - ; - out[27 + outpos] = ((in[29 + inpos] & 536870911) >>> (29 - 6)) - | ((in[30 + inpos]) << 6) - ; - out[28 + outpos] = ((in[30 + inpos] & 536870911) >>> (29 - 3)) - | ((in[31 + inpos]) << 3) - ; - } + protected static void fastpackwithoutmask18(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 18); + out[1 + outpos] = ((in[1 + inpos]) >>> (18 - 4)) + | ((in[2 + inpos]) << 4) | ((in[3 + inpos]) << 22); + out[2 + outpos] = ((in[3 + inpos]) >>> (18 - 8)) + | ((in[4 + inpos]) << 8) | ((in[5 + inpos]) << 26); + out[3 + outpos] = ((in[5 + inpos]) >>> (18 - 12)) + | ((in[6 + inpos]) << 12) | ((in[7 + inpos]) << 30); + out[4 + outpos] = ((in[7 + inpos]) >>> (18 - 16)) + | ((in[8 + inpos]) << 16); + out[5 + outpos] = ((in[8 + inpos]) >>> (18 - 2)) + | ((in[9 + inpos]) << 2) | ((in[10 + inpos]) << 20); + out[6 + outpos] = ((in[10 + inpos]) >>> (18 - 6)) + | ((in[11 + inpos]) << 6) | ((in[12 + inpos]) << 24); + out[7 + outpos] = ((in[12 + inpos]) >>> (18 - 10)) + | ((in[13 + inpos]) << 10) | ((in[14 + inpos]) << 28); + out[8 + outpos] = ((in[14 + inpos]) >>> (18 - 14)) + | ((in[15 + inpos]) << 14); + out[9 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 18); + out[10 + outpos] = ((in[17 + inpos]) >>> (18 - 4)) + | ((in[18 + inpos]) << 4) | ((in[19 + inpos]) << 22); + out[11 + outpos] = ((in[19 + inpos]) >>> (18 - 8)) + | ((in[20 + inpos]) << 8) | ((in[21 + inpos]) << 26); + out[12 + outpos] = ((in[21 + inpos]) >>> (18 - 12)) + | ((in[22 + inpos]) << 12) | ((in[23 + inpos]) << 30); + out[13 + outpos] = ((in[23 + inpos]) >>> (18 - 16)) + | ((in[24 + inpos]) << 16); + out[14 + outpos] = ((in[24 + inpos]) >>> (18 - 2)) + | ((in[25 + inpos]) << 2) | ((in[26 + inpos]) << 20); + out[15 + outpos] = ((in[26 + inpos]) >>> (18 - 6)) + | ((in[27 + inpos]) << 6) | ((in[28 + inpos]) << 24); + out[16 + outpos] = ((in[28 + inpos]) >>> (18 - 10)) + | ((in[29 + inpos]) << 10) | ((in[30 + inpos]) << 28); + out[17 + outpos] = ((in[30 + inpos]) >>> (18 - 14)) + | ((in[31 + inpos]) << 14); + } + protected static void fastpackwithoutmask19(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 19); + out[1 + outpos] = ((in[1 + inpos]) >>> (19 - 6)) + | ((in[2 + inpos]) << 6) | ((in[3 + inpos]) << 25); + out[2 + outpos] = ((in[3 + inpos]) >>> (19 - 12)) + | ((in[4 + inpos]) << 12) | ((in[5 + inpos]) << 31); + out[3 + outpos] = ((in[5 + inpos]) >>> (19 - 18)) + | ((in[6 + inpos]) << 18); + out[4 + outpos] = ((in[6 + inpos]) >>> (19 - 5)) + | ((in[7 + inpos]) << 5) | ((in[8 + inpos]) << 24); + out[5 + outpos] = ((in[8 + inpos]) >>> (19 - 11)) + | ((in[9 + inpos]) << 11) | ((in[10 + inpos]) << 30); + out[6 + outpos] = ((in[10 + inpos]) >>> (19 - 17)) + | ((in[11 + inpos]) << 17); + out[7 + outpos] = ((in[11 + inpos]) >>> (19 - 4)) + | ((in[12 + inpos]) << 4) | ((in[13 + inpos]) << 23); + out[8 + outpos] = ((in[13 + inpos]) >>> (19 - 10)) + | ((in[14 + inpos]) << 10) | ((in[15 + inpos]) << 29); + out[9 + outpos] = ((in[15 + inpos]) >>> (19 - 16)) + | ((in[16 + inpos]) << 16); + out[10 + outpos] = ((in[16 + inpos]) >>> (19 - 3)) + | ((in[17 + inpos]) << 3) | ((in[18 + inpos]) << 22); + out[11 + outpos] = ((in[18 + inpos]) >>> (19 - 9)) + | ((in[19 + inpos]) << 9) | ((in[20 + inpos]) << 28); + out[12 + outpos] = ((in[20 + inpos]) >>> (19 - 15)) + | ((in[21 + inpos]) << 15); + out[13 + outpos] = ((in[21 + inpos]) >>> (19 - 2)) + | ((in[22 + inpos]) << 2) | ((in[23 + inpos]) << 21); + out[14 + outpos] = ((in[23 + inpos]) >>> (19 - 8)) + | ((in[24 + inpos]) << 8) | ((in[25 + inpos]) << 27); + out[15 + outpos] = ((in[25 + inpos]) >>> (19 - 14)) + | ((in[26 + inpos]) << 14); + out[16 + outpos] = ((in[26 + inpos]) >>> (19 - 1)) + | ((in[27 + inpos]) << 1) | ((in[28 + inpos]) << 20); + out[17 + outpos] = ((in[28 + inpos]) >>> (19 - 7)) + | ((in[29 + inpos]) << 7) | ((in[30 + inpos]) << 26); + out[18 + outpos] = ((in[30 + inpos]) >>> (19 - 13)) + | ((in[31 + inpos]) << 13); + } - protected static void fastpack30(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 1073741823) - | ((in[1 + inpos]) << 30) - ; - out[1 + outpos] = ((in[1 + inpos] & 1073741823) >>> (30 - 28)) - | ((in[2 + inpos]) << 28) - ; - out[2 + outpos] = ((in[2 + inpos] & 1073741823) >>> (30 - 26)) - | ((in[3 + inpos]) << 26) - ; - out[3 + outpos] = ((in[3 + inpos] & 1073741823) >>> (30 - 24)) - | ((in[4 + inpos]) << 24) - ; - out[4 + outpos] = ((in[4 + inpos] & 1073741823) >>> (30 - 22)) - | ((in[5 + inpos]) << 22) - ; - out[5 + outpos] = ((in[5 + inpos] & 1073741823) >>> (30 - 20)) - | ((in[6 + inpos]) << 20) - ; - out[6 + outpos] = ((in[6 + inpos] & 1073741823) >>> (30 - 18)) - | ((in[7 + inpos]) << 18) - ; - out[7 + outpos] = ((in[7 + inpos] & 1073741823) >>> (30 - 16)) - | ((in[8 + inpos]) << 16) - ; - out[8 + outpos] = ((in[8 + inpos] & 1073741823) >>> (30 - 14)) - | ((in[9 + inpos]) << 14) - ; - out[9 + outpos] = ((in[9 + inpos] & 1073741823) >>> (30 - 12)) - | ((in[10 + inpos]) << 12) - ; - out[10 + outpos] = ((in[10 + inpos] & 1073741823) >>> (30 - 10)) - | ((in[11 + inpos]) << 10) - ; - out[11 + outpos] = ((in[11 + inpos] & 1073741823) >>> (30 - 8)) - | ((in[12 + inpos]) << 8) - ; - out[12 + outpos] = ((in[12 + inpos] & 1073741823) >>> (30 - 6)) - | ((in[13 + inpos]) << 6) - ; - out[13 + outpos] = ((in[13 + inpos] & 1073741823) >>> (30 - 4)) - | ((in[14 + inpos]) << 4) - ; - out[14 + outpos] = ((in[14 + inpos] & 1073741823) >>> (30 - 2)) - | ((in[15 + inpos]) << 2) - ; - out[15 + outpos] = (in[16 + inpos] & 1073741823) - | ((in[17 + inpos]) << 30) - ; - out[16 + outpos] = ((in[17 + inpos] & 1073741823) >>> (30 - 28)) - | ((in[18 + inpos]) << 28) - ; - out[17 + outpos] = ((in[18 + inpos] & 1073741823) >>> (30 - 26)) - | ((in[19 + inpos]) << 26) - ; - out[18 + outpos] = ((in[19 + inpos] & 1073741823) >>> (30 - 24)) - | ((in[20 + inpos]) << 24) - ; - out[19 + outpos] = ((in[20 + inpos] & 1073741823) >>> (30 - 22)) - | ((in[21 + inpos]) << 22) - ; - out[20 + outpos] = ((in[21 + inpos] & 1073741823) >>> (30 - 20)) - | ((in[22 + inpos]) << 20) - ; - out[21 + outpos] = ((in[22 + inpos] & 1073741823) >>> (30 - 18)) - | ((in[23 + inpos]) << 18) - ; - out[22 + outpos] = ((in[23 + inpos] & 1073741823) >>> (30 - 16)) - | ((in[24 + inpos]) << 16) - ; - out[23 + outpos] = ((in[24 + inpos] & 1073741823) >>> (30 - 14)) - | ((in[25 + inpos]) << 14) - ; - out[24 + outpos] = ((in[25 + inpos] & 1073741823) >>> (30 - 12)) - | ((in[26 + inpos]) << 12) - ; - out[25 + outpos] = ((in[26 + inpos] & 1073741823) >>> (30 - 10)) - | ((in[27 + inpos]) << 10) - ; - out[26 + outpos] = ((in[27 + inpos] & 1073741823) >>> (30 - 8)) - | ((in[28 + inpos]) << 8) - ; - out[27 + outpos] = ((in[28 + inpos] & 1073741823) >>> (30 - 6)) - | ((in[29 + inpos]) << 6) - ; - out[28 + outpos] = ((in[29 + inpos] & 1073741823) >>> (30 - 4)) - | ((in[30 + inpos]) << 4) - ; - out[29 + outpos] = ((in[30 + inpos] & 1073741823) >>> (30 - 2)) - | ((in[31 + inpos]) << 2) - ; - } + protected static void fastpackwithoutmask20(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 20); + out[1 + outpos] = ((in[1 + inpos]) >>> (20 - 8)) + | ((in[2 + inpos]) << 8) | ((in[3 + inpos]) << 28); + out[2 + outpos] = ((in[3 + inpos]) >>> (20 - 16)) + | ((in[4 + inpos]) << 16); + out[3 + outpos] = ((in[4 + inpos]) >>> (20 - 4)) + | ((in[5 + inpos]) << 4) | ((in[6 + inpos]) << 24); + out[4 + outpos] = ((in[6 + inpos]) >>> (20 - 12)) + | ((in[7 + inpos]) << 12); + out[5 + outpos] = in[8 + inpos] | ((in[9 + inpos]) << 20); + out[6 + outpos] = ((in[9 + inpos]) >>> (20 - 8)) + | ((in[10 + inpos]) << 8) | ((in[11 + inpos]) << 28); + out[7 + outpos] = ((in[11 + inpos]) >>> (20 - 16)) + | ((in[12 + inpos]) << 16); + out[8 + outpos] = ((in[12 + inpos]) >>> (20 - 4)) + | ((in[13 + inpos]) << 4) | ((in[14 + inpos]) << 24); + out[9 + outpos] = ((in[14 + inpos]) >>> (20 - 12)) + | ((in[15 + inpos]) << 12); + out[10 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 20); + out[11 + outpos] = ((in[17 + inpos]) >>> (20 - 8)) + | ((in[18 + inpos]) << 8) | ((in[19 + inpos]) << 28); + out[12 + outpos] = ((in[19 + inpos]) >>> (20 - 16)) + | ((in[20 + inpos]) << 16); + out[13 + outpos] = ((in[20 + inpos]) >>> (20 - 4)) + | ((in[21 + inpos]) << 4) | ((in[22 + inpos]) << 24); + out[14 + outpos] = ((in[22 + inpos]) >>> (20 - 12)) + | ((in[23 + inpos]) << 12); + out[15 + outpos] = in[24 + inpos] | ((in[25 + inpos]) << 20); + out[16 + outpos] = ((in[25 + inpos]) >>> (20 - 8)) + | ((in[26 + inpos]) << 8) | ((in[27 + inpos]) << 28); + out[17 + outpos] = ((in[27 + inpos]) >>> (20 - 16)) + | ((in[28 + inpos]) << 16); + out[18 + outpos] = ((in[28 + inpos]) >>> (20 - 4)) + | ((in[29 + inpos]) << 4) | ((in[30 + inpos]) << 24); + out[19 + outpos] = ((in[30 + inpos]) >>> (20 - 12)) + | ((in[31 + inpos]) << 12); + } + protected static void fastpackwithoutmask21(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 21); + out[1 + outpos] = ((in[1 + inpos]) >>> (21 - 10)) + | ((in[2 + inpos]) << 10) | ((in[3 + inpos]) << 31); + out[2 + outpos] = ((in[3 + inpos]) >>> (21 - 20)) + | ((in[4 + inpos]) << 20); + out[3 + outpos] = ((in[4 + inpos]) >>> (21 - 9)) + | ((in[5 + inpos]) << 9) | ((in[6 + inpos]) << 30); + out[4 + outpos] = ((in[6 + inpos]) >>> (21 - 19)) + | ((in[7 + inpos]) << 19); + out[5 + outpos] = ((in[7 + inpos]) >>> (21 - 8)) + | ((in[8 + inpos]) << 8) | ((in[9 + inpos]) << 29); + out[6 + outpos] = ((in[9 + inpos]) >>> (21 - 18)) + | ((in[10 + inpos]) << 18); + out[7 + outpos] = ((in[10 + inpos]) >>> (21 - 7)) + | ((in[11 + inpos]) << 7) | ((in[12 + inpos]) << 28); + out[8 + outpos] = ((in[12 + inpos]) >>> (21 - 17)) + | ((in[13 + inpos]) << 17); + out[9 + outpos] = ((in[13 + inpos]) >>> (21 - 6)) + | ((in[14 + inpos]) << 6) | ((in[15 + inpos]) << 27); + out[10 + outpos] = ((in[15 + inpos]) >>> (21 - 16)) + | ((in[16 + inpos]) << 16); + out[11 + outpos] = ((in[16 + inpos]) >>> (21 - 5)) + | ((in[17 + inpos]) << 5) | ((in[18 + inpos]) << 26); + out[12 + outpos] = ((in[18 + inpos]) >>> (21 - 15)) + | ((in[19 + inpos]) << 15); + out[13 + outpos] = ((in[19 + inpos]) >>> (21 - 4)) + | ((in[20 + inpos]) << 4) | ((in[21 + inpos]) << 25); + out[14 + outpos] = ((in[21 + inpos]) >>> (21 - 14)) + | ((in[22 + inpos]) << 14); + out[15 + outpos] = ((in[22 + inpos]) >>> (21 - 3)) + | ((in[23 + inpos]) << 3) | ((in[24 + inpos]) << 24); + out[16 + outpos] = ((in[24 + inpos]) >>> (21 - 13)) + | ((in[25 + inpos]) << 13); + out[17 + outpos] = ((in[25 + inpos]) >>> (21 - 2)) + | ((in[26 + inpos]) << 2) | ((in[27 + inpos]) << 23); + out[18 + outpos] = ((in[27 + inpos]) >>> (21 - 12)) + | ((in[28 + inpos]) << 12); + out[19 + outpos] = ((in[28 + inpos]) >>> (21 - 1)) + | ((in[29 + inpos]) << 1) | ((in[30 + inpos]) << 22); + out[20 + outpos] = ((in[30 + inpos]) >>> (21 - 11)) + | ((in[31 + inpos]) << 11); + } - protected static void fastpack31(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 2147483647) - | ((in[1 + inpos]) << 31) - ; - out[1 + outpos] = ((in[1 + inpos] & 2147483647) >>> (31 - 30)) - | ((in[2 + inpos]) << 30) - ; - out[2 + outpos] = ((in[2 + inpos] & 2147483647) >>> (31 - 29)) - | ((in[3 + inpos]) << 29) - ; - out[3 + outpos] = ((in[3 + inpos] & 2147483647) >>> (31 - 28)) - | ((in[4 + inpos]) << 28) - ; - out[4 + outpos] = ((in[4 + inpos] & 2147483647) >>> (31 - 27)) - | ((in[5 + inpos]) << 27) - ; - out[5 + outpos] = ((in[5 + inpos] & 2147483647) >>> (31 - 26)) - | ((in[6 + inpos]) << 26) - ; - out[6 + outpos] = ((in[6 + inpos] & 2147483647) >>> (31 - 25)) - | ((in[7 + inpos]) << 25) - ; - out[7 + outpos] = ((in[7 + inpos] & 2147483647) >>> (31 - 24)) - | ((in[8 + inpos]) << 24) - ; - out[8 + outpos] = ((in[8 + inpos] & 2147483647) >>> (31 - 23)) - | ((in[9 + inpos]) << 23) - ; - out[9 + outpos] = ((in[9 + inpos] & 2147483647) >>> (31 - 22)) - | ((in[10 + inpos]) << 22) - ; - out[10 + outpos] = ((in[10 + inpos] & 2147483647) >>> (31 - 21)) - | ((in[11 + inpos]) << 21) - ; - out[11 + outpos] = ((in[11 + inpos] & 2147483647) >>> (31 - 20)) - | ((in[12 + inpos]) << 20) - ; - out[12 + outpos] = ((in[12 + inpos] & 2147483647) >>> (31 - 19)) - | ((in[13 + inpos]) << 19) - ; - out[13 + outpos] = ((in[13 + inpos] & 2147483647) >>> (31 - 18)) - | ((in[14 + inpos]) << 18) - ; - out[14 + outpos] = ((in[14 + inpos] & 2147483647) >>> (31 - 17)) - | ((in[15 + inpos]) << 17) - ; - out[15 + outpos] = ((in[15 + inpos] & 2147483647) >>> (31 - 16)) - | ((in[16 + inpos]) << 16) - ; - out[16 + outpos] = ((in[16 + inpos] & 2147483647) >>> (31 - 15)) - | ((in[17 + inpos]) << 15) - ; - out[17 + outpos] = ((in[17 + inpos] & 2147483647) >>> (31 - 14)) - | ((in[18 + inpos]) << 14) - ; - out[18 + outpos] = ((in[18 + inpos] & 2147483647) >>> (31 - 13)) - | ((in[19 + inpos]) << 13) - ; - out[19 + outpos] = ((in[19 + inpos] & 2147483647) >>> (31 - 12)) - | ((in[20 + inpos]) << 12) - ; - out[20 + outpos] = ((in[20 + inpos] & 2147483647) >>> (31 - 11)) - | ((in[21 + inpos]) << 11) - ; - out[21 + outpos] = ((in[21 + inpos] & 2147483647) >>> (31 - 10)) - | ((in[22 + inpos]) << 10) - ; - out[22 + outpos] = ((in[22 + inpos] & 2147483647) >>> (31 - 9)) - | ((in[23 + inpos]) << 9) - ; - out[23 + outpos] = ((in[23 + inpos] & 2147483647) >>> (31 - 8)) - | ((in[24 + inpos]) << 8) - ; - out[24 + outpos] = ((in[24 + inpos] & 2147483647) >>> (31 - 7)) - | ((in[25 + inpos]) << 7) - ; - out[25 + outpos] = ((in[25 + inpos] & 2147483647) >>> (31 - 6)) - | ((in[26 + inpos]) << 6) - ; - out[26 + outpos] = ((in[26 + inpos] & 2147483647) >>> (31 - 5)) - | ((in[27 + inpos]) << 5) - ; - out[27 + outpos] = ((in[27 + inpos] & 2147483647) >>> (31 - 4)) - | ((in[28 + inpos]) << 4) - ; - out[28 + outpos] = ((in[28 + inpos] & 2147483647) >>> (31 - 3)) - | ((in[29 + inpos]) << 3) - ; - out[29 + outpos] = ((in[29 + inpos] & 2147483647) >>> (31 - 2)) - | ((in[30 + inpos]) << 2) - ; - out[30 + outpos] = ((in[30 + inpos] & 2147483647) >>> (31 - 1)) - | ((in[31 + inpos]) << 1) - ; - } + protected static void fastpackwithoutmask22(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 22); + out[1 + outpos] = ((in[1 + inpos]) >>> (22 - 12)) + | ((in[2 + inpos]) << 12); + out[2 + outpos] = ((in[2 + inpos]) >>> (22 - 2)) + | ((in[3 + inpos]) << 2) | ((in[4 + inpos]) << 24); + out[3 + outpos] = ((in[4 + inpos]) >>> (22 - 14)) + | ((in[5 + inpos]) << 14); + out[4 + outpos] = ((in[5 + inpos]) >>> (22 - 4)) + | ((in[6 + inpos]) << 4) | ((in[7 + inpos]) << 26); + out[5 + outpos] = ((in[7 + inpos]) >>> (22 - 16)) + | ((in[8 + inpos]) << 16); + out[6 + outpos] = ((in[8 + inpos]) >>> (22 - 6)) + | ((in[9 + inpos]) << 6) | ((in[10 + inpos]) << 28); + out[7 + outpos] = ((in[10 + inpos]) >>> (22 - 18)) + | ((in[11 + inpos]) << 18); + out[8 + outpos] = ((in[11 + inpos]) >>> (22 - 8)) + | ((in[12 + inpos]) << 8) | ((in[13 + inpos]) << 30); + out[9 + outpos] = ((in[13 + inpos]) >>> (22 - 20)) + | ((in[14 + inpos]) << 20); + out[10 + outpos] = ((in[14 + inpos]) >>> (22 - 10)) + | ((in[15 + inpos]) << 10); + out[11 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 22); + out[12 + outpos] = ((in[17 + inpos]) >>> (22 - 12)) + | ((in[18 + inpos]) << 12); + out[13 + outpos] = ((in[18 + inpos]) >>> (22 - 2)) + | ((in[19 + inpos]) << 2) | ((in[20 + inpos]) << 24); + out[14 + outpos] = ((in[20 + inpos]) >>> (22 - 14)) + | ((in[21 + inpos]) << 14); + out[15 + outpos] = ((in[21 + inpos]) >>> (22 - 4)) + | ((in[22 + inpos]) << 4) | ((in[23 + inpos]) << 26); + out[16 + outpos] = ((in[23 + inpos]) >>> (22 - 16)) + | ((in[24 + inpos]) << 16); + out[17 + outpos] = ((in[24 + inpos]) >>> (22 - 6)) + | ((in[25 + inpos]) << 6) | ((in[26 + inpos]) << 28); + out[18 + outpos] = ((in[26 + inpos]) >>> (22 - 18)) + | ((in[27 + inpos]) << 18); + out[19 + outpos] = ((in[27 + inpos]) >>> (22 - 8)) + | ((in[28 + inpos]) << 8) | ((in[29 + inpos]) << 30); + out[20 + outpos] = ((in[29 + inpos]) >>> (22 - 20)) + | ((in[30 + inpos]) << 20); + out[21 + outpos] = ((in[30 + inpos]) >>> (22 - 10)) + | ((in[31 + inpos]) << 10); + } + protected static void fastpackwithoutmask23(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 23); + out[1 + outpos] = ((in[1 + inpos]) >>> (23 - 14)) + | ((in[2 + inpos]) << 14); + out[2 + outpos] = ((in[2 + inpos]) >>> (23 - 5)) + | ((in[3 + inpos]) << 5) | ((in[4 + inpos]) << 28); + out[3 + outpos] = ((in[4 + inpos]) >>> (23 - 19)) + | ((in[5 + inpos]) << 19); + out[4 + outpos] = ((in[5 + inpos]) >>> (23 - 10)) + | ((in[6 + inpos]) << 10); + out[5 + outpos] = ((in[6 + inpos]) >>> (23 - 1)) + | ((in[7 + inpos]) << 1) | ((in[8 + inpos]) << 24); + out[6 + outpos] = ((in[8 + inpos]) >>> (23 - 15)) + | ((in[9 + inpos]) << 15); + out[7 + outpos] = ((in[9 + inpos]) >>> (23 - 6)) + | ((in[10 + inpos]) << 6) | ((in[11 + inpos]) << 29); + out[8 + outpos] = ((in[11 + inpos]) >>> (23 - 20)) + | ((in[12 + inpos]) << 20); + out[9 + outpos] = ((in[12 + inpos]) >>> (23 - 11)) + | ((in[13 + inpos]) << 11); + out[10 + outpos] = ((in[13 + inpos]) >>> (23 - 2)) + | ((in[14 + inpos]) << 2) | ((in[15 + inpos]) << 25); + out[11 + outpos] = ((in[15 + inpos]) >>> (23 - 16)) + | ((in[16 + inpos]) << 16); + out[12 + outpos] = ((in[16 + inpos]) >>> (23 - 7)) + | ((in[17 + inpos]) << 7) | ((in[18 + inpos]) << 30); + out[13 + outpos] = ((in[18 + inpos]) >>> (23 - 21)) + | ((in[19 + inpos]) << 21); + out[14 + outpos] = ((in[19 + inpos]) >>> (23 - 12)) + | ((in[20 + inpos]) << 12); + out[15 + outpos] = ((in[20 + inpos]) >>> (23 - 3)) + | ((in[21 + inpos]) << 3) | ((in[22 + inpos]) << 26); + out[16 + outpos] = ((in[22 + inpos]) >>> (23 - 17)) + | ((in[23 + inpos]) << 17); + out[17 + outpos] = ((in[23 + inpos]) >>> (23 - 8)) + | ((in[24 + inpos]) << 8) | ((in[25 + inpos]) << 31); + out[18 + outpos] = ((in[25 + inpos]) >>> (23 - 22)) + | ((in[26 + inpos]) << 22); + out[19 + outpos] = ((in[26 + inpos]) >>> (23 - 13)) + | ((in[27 + inpos]) << 13); + out[20 + outpos] = ((in[27 + inpos]) >>> (23 - 4)) + | ((in[28 + inpos]) << 4) | ((in[29 + inpos]) << 27); + out[21 + outpos] = ((in[29 + inpos]) >>> (23 - 18)) + | ((in[30 + inpos]) << 18); + out[22 + outpos] = ((in[30 + inpos]) >>> (23 - 9)) + | ((in[31 + inpos]) << 9); + } - protected static void fastunpack1(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 1) - ; - out[1 + outpos] = ((in[0 + inpos] >>> 1) & 1) - ; - out[2 + outpos] = ((in[0 + inpos] >>> 2) & 1) - ; - out[3 + outpos] = ((in[0 + inpos] >>> 3) & 1) - ; - out[4 + outpos] = ((in[0 + inpos] >>> 4) & 1) - ; - out[5 + outpos] = ((in[0 + inpos] >>> 5) & 1) - ; - out[6 + outpos] = ((in[0 + inpos] >>> 6) & 1) - ; - out[7 + outpos] = ((in[0 + inpos] >>> 7) & 1) - ; - out[8 + outpos] = ((in[0 + inpos] >>> 8) & 1) - ; - out[9 + outpos] = ((in[0 + inpos] >>> 9) & 1) - ; - out[10 + outpos] = ((in[0 + inpos] >>> 10) & 1) - ; - out[11 + outpos] = ((in[0 + inpos] >>> 11) & 1) - ; - out[12 + outpos] = ((in[0 + inpos] >>> 12) & 1) - ; - out[13 + outpos] = ((in[0 + inpos] >>> 13) & 1) - ; - out[14 + outpos] = ((in[0 + inpos] >>> 14) & 1) - ; - out[15 + outpos] = ((in[0 + inpos] >>> 15) & 1) - ; - out[16 + outpos] = ((in[0 + inpos] >>> 16) & 1) - ; - out[17 + outpos] = ((in[0 + inpos] >>> 17) & 1) - ; - out[18 + outpos] = ((in[0 + inpos] >>> 18) & 1) - ; - out[19 + outpos] = ((in[0 + inpos] >>> 19) & 1) - ; - out[20 + outpos] = ((in[0 + inpos] >>> 20) & 1) - ; - out[21 + outpos] = ((in[0 + inpos] >>> 21) & 1) - ; - out[22 + outpos] = ((in[0 + inpos] >>> 22) & 1) - ; - out[23 + outpos] = ((in[0 + inpos] >>> 23) & 1) - ; - out[24 + outpos] = ((in[0 + inpos] >>> 24) & 1) - ; - out[25 + outpos] = ((in[0 + inpos] >>> 25) & 1) - ; - out[26 + outpos] = ((in[0 + inpos] >>> 26) & 1) - ; - out[27 + outpos] = ((in[0 + inpos] >>> 27) & 1) - ; - out[28 + outpos] = ((in[0 + inpos] >>> 28) & 1) - ; - out[29 + outpos] = ((in[0 + inpos] >>> 29) & 1) - ; - out[30 + outpos] = ((in[0 + inpos] >>> 30) & 1) - ; - out[31 + outpos] = (in[0 + inpos] >>> 31) - ; - } + protected static void fastpackwithoutmask24(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 24); + out[1 + outpos] = ((in[1 + inpos]) >>> (24 - 16)) + | ((in[2 + inpos]) << 16); + out[2 + outpos] = ((in[2 + inpos]) >>> (24 - 8)) + | ((in[3 + inpos]) << 8); + out[3 + outpos] = in[4 + inpos] | ((in[5 + inpos]) << 24); + out[4 + outpos] = ((in[5 + inpos]) >>> (24 - 16)) + | ((in[6 + inpos]) << 16); + out[5 + outpos] = ((in[6 + inpos]) >>> (24 - 8)) + | ((in[7 + inpos]) << 8); + out[6 + outpos] = in[8 + inpos] | ((in[9 + inpos]) << 24); + out[7 + outpos] = ((in[9 + inpos]) >>> (24 - 16)) + | ((in[10 + inpos]) << 16); + out[8 + outpos] = ((in[10 + inpos]) >>> (24 - 8)) + | ((in[11 + inpos]) << 8); + out[9 + outpos] = in[12 + inpos] | ((in[13 + inpos]) << 24); + out[10 + outpos] = ((in[13 + inpos]) >>> (24 - 16)) + | ((in[14 + inpos]) << 16); + out[11 + outpos] = ((in[14 + inpos]) >>> (24 - 8)) + | ((in[15 + inpos]) << 8); + out[12 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 24); + out[13 + outpos] = ((in[17 + inpos]) >>> (24 - 16)) + | ((in[18 + inpos]) << 16); + out[14 + outpos] = ((in[18 + inpos]) >>> (24 - 8)) + | ((in[19 + inpos]) << 8); + out[15 + outpos] = in[20 + inpos] | ((in[21 + inpos]) << 24); + out[16 + outpos] = ((in[21 + inpos]) >>> (24 - 16)) + | ((in[22 + inpos]) << 16); + out[17 + outpos] = ((in[22 + inpos]) >>> (24 - 8)) + | ((in[23 + inpos]) << 8); + out[18 + outpos] = in[24 + inpos] | ((in[25 + inpos]) << 24); + out[19 + outpos] = ((in[25 + inpos]) >>> (24 - 16)) + | ((in[26 + inpos]) << 16); + out[20 + outpos] = ((in[26 + inpos]) >>> (24 - 8)) + | ((in[27 + inpos]) << 8); + out[21 + outpos] = in[28 + inpos] | ((in[29 + inpos]) << 24); + out[22 + outpos] = ((in[29 + inpos]) >>> (24 - 16)) + | ((in[30 + inpos]) << 16); + out[23 + outpos] = ((in[30 + inpos]) >>> (24 - 8)) + | ((in[31 + inpos]) << 8); + } + protected static void fastpackwithoutmask25(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 25); + out[1 + outpos] = ((in[1 + inpos]) >>> (25 - 18)) + | ((in[2 + inpos]) << 18); + out[2 + outpos] = ((in[2 + inpos]) >>> (25 - 11)) + | ((in[3 + inpos]) << 11); + out[3 + outpos] = ((in[3 + inpos]) >>> (25 - 4)) + | ((in[4 + inpos]) << 4) | ((in[5 + inpos]) << 29); + out[4 + outpos] = ((in[5 + inpos]) >>> (25 - 22)) + | ((in[6 + inpos]) << 22); + out[5 + outpos] = ((in[6 + inpos]) >>> (25 - 15)) + | ((in[7 + inpos]) << 15); + out[6 + outpos] = ((in[7 + inpos]) >>> (25 - 8)) + | ((in[8 + inpos]) << 8); + out[7 + outpos] = ((in[8 + inpos]) >>> (25 - 1)) + | ((in[9 + inpos]) << 1) | ((in[10 + inpos]) << 26); + out[8 + outpos] = ((in[10 + inpos]) >>> (25 - 19)) + | ((in[11 + inpos]) << 19); + out[9 + outpos] = ((in[11 + inpos]) >>> (25 - 12)) + | ((in[12 + inpos]) << 12); + out[10 + outpos] = ((in[12 + inpos]) >>> (25 - 5)) + | ((in[13 + inpos]) << 5) | ((in[14 + inpos]) << 30); + out[11 + outpos] = ((in[14 + inpos]) >>> (25 - 23)) + | ((in[15 + inpos]) << 23); + out[12 + outpos] = ((in[15 + inpos]) >>> (25 - 16)) + | ((in[16 + inpos]) << 16); + out[13 + outpos] = ((in[16 + inpos]) >>> (25 - 9)) + | ((in[17 + inpos]) << 9); + out[14 + outpos] = ((in[17 + inpos]) >>> (25 - 2)) + | ((in[18 + inpos]) << 2) | ((in[19 + inpos]) << 27); + out[15 + outpos] = ((in[19 + inpos]) >>> (25 - 20)) + | ((in[20 + inpos]) << 20); + out[16 + outpos] = ((in[20 + inpos]) >>> (25 - 13)) + | ((in[21 + inpos]) << 13); + out[17 + outpos] = ((in[21 + inpos]) >>> (25 - 6)) + | ((in[22 + inpos]) << 6) | ((in[23 + inpos]) << 31); + out[18 + outpos] = ((in[23 + inpos]) >>> (25 - 24)) + | ((in[24 + inpos]) << 24); + out[19 + outpos] = ((in[24 + inpos]) >>> (25 - 17)) + | ((in[25 + inpos]) << 17); + out[20 + outpos] = ((in[25 + inpos]) >>> (25 - 10)) + | ((in[26 + inpos]) << 10); + out[21 + outpos] = ((in[26 + inpos]) >>> (25 - 3)) + | ((in[27 + inpos]) << 3) | ((in[28 + inpos]) << 28); + out[22 + outpos] = ((in[28 + inpos]) >>> (25 - 21)) + | ((in[29 + inpos]) << 21); + out[23 + outpos] = ((in[29 + inpos]) >>> (25 - 14)) + | ((in[30 + inpos]) << 14); + out[24 + outpos] = ((in[30 + inpos]) >>> (25 - 7)) + | ((in[31 + inpos]) << 7); + } - protected static void fastunpack2(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 3) - ; - out[1 + outpos] = ((in[0 + inpos] >>> 2) & 3) - ; - out[2 + outpos] = ((in[0 + inpos] >>> 4) & 3) - ; - out[3 + outpos] = ((in[0 + inpos] >>> 6) & 3) - ; - out[4 + outpos] = ((in[0 + inpos] >>> 8) & 3) - ; - out[5 + outpos] = ((in[0 + inpos] >>> 10) & 3) - ; - out[6 + outpos] = ((in[0 + inpos] >>> 12) & 3) - ; - out[7 + outpos] = ((in[0 + inpos] >>> 14) & 3) - ; - out[8 + outpos] = ((in[0 + inpos] >>> 16) & 3) - ; - out[9 + outpos] = ((in[0 + inpos] >>> 18) & 3) - ; - out[10 + outpos] = ((in[0 + inpos] >>> 20) & 3) - ; - out[11 + outpos] = ((in[0 + inpos] >>> 22) & 3) - ; - out[12 + outpos] = ((in[0 + inpos] >>> 24) & 3) - ; - out[13 + outpos] = ((in[0 + inpos] >>> 26) & 3) - ; - out[14 + outpos] = ((in[0 + inpos] >>> 28) & 3) - ; - out[15 + outpos] = (in[0 + inpos] >>> 30) - ; - out[16 + outpos] = ((in[1 + inpos] >>> 0) & 3) - ; - out[17 + outpos] = ((in[1 + inpos] >>> 2) & 3) - ; - out[18 + outpos] = ((in[1 + inpos] >>> 4) & 3) - ; - out[19 + outpos] = ((in[1 + inpos] >>> 6) & 3) - ; - out[20 + outpos] = ((in[1 + inpos] >>> 8) & 3) - ; - out[21 + outpos] = ((in[1 + inpos] >>> 10) & 3) - ; - out[22 + outpos] = ((in[1 + inpos] >>> 12) & 3) - ; - out[23 + outpos] = ((in[1 + inpos] >>> 14) & 3) - ; - out[24 + outpos] = ((in[1 + inpos] >>> 16) & 3) - ; - out[25 + outpos] = ((in[1 + inpos] >>> 18) & 3) - ; - out[26 + outpos] = ((in[1 + inpos] >>> 20) & 3) - ; - out[27 + outpos] = ((in[1 + inpos] >>> 22) & 3) - ; - out[28 + outpos] = ((in[1 + inpos] >>> 24) & 3) - ; - out[29 + outpos] = ((in[1 + inpos] >>> 26) & 3) - ; - out[30 + outpos] = ((in[1 + inpos] >>> 28) & 3) - ; - out[31 + outpos] = (in[1 + inpos] >>> 30) - ; - } + protected static void fastpackwithoutmask26(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 26); + out[1 + outpos] = ((in[1 + inpos]) >>> (26 - 20)) + | ((in[2 + inpos]) << 20); + out[2 + outpos] = ((in[2 + inpos]) >>> (26 - 14)) + | ((in[3 + inpos]) << 14); + out[3 + outpos] = ((in[3 + inpos]) >>> (26 - 8)) + | ((in[4 + inpos]) << 8); + out[4 + outpos] = ((in[4 + inpos]) >>> (26 - 2)) + | ((in[5 + inpos]) << 2) | ((in[6 + inpos]) << 28); + out[5 + outpos] = ((in[6 + inpos]) >>> (26 - 22)) + | ((in[7 + inpos]) << 22); + out[6 + outpos] = ((in[7 + inpos]) >>> (26 - 16)) + | ((in[8 + inpos]) << 16); + out[7 + outpos] = ((in[8 + inpos]) >>> (26 - 10)) + | ((in[9 + inpos]) << 10); + out[8 + outpos] = ((in[9 + inpos]) >>> (26 - 4)) + | ((in[10 + inpos]) << 4) | ((in[11 + inpos]) << 30); + out[9 + outpos] = ((in[11 + inpos]) >>> (26 - 24)) + | ((in[12 + inpos]) << 24); + out[10 + outpos] = ((in[12 + inpos]) >>> (26 - 18)) + | ((in[13 + inpos]) << 18); + out[11 + outpos] = ((in[13 + inpos]) >>> (26 - 12)) + | ((in[14 + inpos]) << 12); + out[12 + outpos] = ((in[14 + inpos]) >>> (26 - 6)) + | ((in[15 + inpos]) << 6); + out[13 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 26); + out[14 + outpos] = ((in[17 + inpos]) >>> (26 - 20)) + | ((in[18 + inpos]) << 20); + out[15 + outpos] = ((in[18 + inpos]) >>> (26 - 14)) + | ((in[19 + inpos]) << 14); + out[16 + outpos] = ((in[19 + inpos]) >>> (26 - 8)) + | ((in[20 + inpos]) << 8); + out[17 + outpos] = ((in[20 + inpos]) >>> (26 - 2)) + | ((in[21 + inpos]) << 2) | ((in[22 + inpos]) << 28); + out[18 + outpos] = ((in[22 + inpos]) >>> (26 - 22)) + | ((in[23 + inpos]) << 22); + out[19 + outpos] = ((in[23 + inpos]) >>> (26 - 16)) + | ((in[24 + inpos]) << 16); + out[20 + outpos] = ((in[24 + inpos]) >>> (26 - 10)) + | ((in[25 + inpos]) << 10); + out[21 + outpos] = ((in[25 + inpos]) >>> (26 - 4)) + | ((in[26 + inpos]) << 4) | ((in[27 + inpos]) << 30); + out[22 + outpos] = ((in[27 + inpos]) >>> (26 - 24)) + | ((in[28 + inpos]) << 24); + out[23 + outpos] = ((in[28 + inpos]) >>> (26 - 18)) + | ((in[29 + inpos]) << 18); + out[24 + outpos] = ((in[29 + inpos]) >>> (26 - 12)) + | ((in[30 + inpos]) << 12); + out[25 + outpos] = ((in[30 + inpos]) >>> (26 - 6)) + | ((in[31 + inpos]) << 6); + } + protected static void fastpackwithoutmask27(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 27); + out[1 + outpos] = ((in[1 + inpos]) >>> (27 - 22)) + | ((in[2 + inpos]) << 22); + out[2 + outpos] = ((in[2 + inpos]) >>> (27 - 17)) + | ((in[3 + inpos]) << 17); + out[3 + outpos] = ((in[3 + inpos]) >>> (27 - 12)) + | ((in[4 + inpos]) << 12); + out[4 + outpos] = ((in[4 + inpos]) >>> (27 - 7)) + | ((in[5 + inpos]) << 7); + out[5 + outpos] = ((in[5 + inpos]) >>> (27 - 2)) + | ((in[6 + inpos]) << 2) | ((in[7 + inpos]) << 29); + out[6 + outpos] = ((in[7 + inpos]) >>> (27 - 24)) + | ((in[8 + inpos]) << 24); + out[7 + outpos] = ((in[8 + inpos]) >>> (27 - 19)) + | ((in[9 + inpos]) << 19); + out[8 + outpos] = ((in[9 + inpos]) >>> (27 - 14)) + | ((in[10 + inpos]) << 14); + out[9 + outpos] = ((in[10 + inpos]) >>> (27 - 9)) + | ((in[11 + inpos]) << 9); + out[10 + outpos] = ((in[11 + inpos]) >>> (27 - 4)) + | ((in[12 + inpos]) << 4) | ((in[13 + inpos]) << 31); + out[11 + outpos] = ((in[13 + inpos]) >>> (27 - 26)) + | ((in[14 + inpos]) << 26); + out[12 + outpos] = ((in[14 + inpos]) >>> (27 - 21)) + | ((in[15 + inpos]) << 21); + out[13 + outpos] = ((in[15 + inpos]) >>> (27 - 16)) + | ((in[16 + inpos]) << 16); + out[14 + outpos] = ((in[16 + inpos]) >>> (27 - 11)) + | ((in[17 + inpos]) << 11); + out[15 + outpos] = ((in[17 + inpos]) >>> (27 - 6)) + | ((in[18 + inpos]) << 6); + out[16 + outpos] = ((in[18 + inpos]) >>> (27 - 1)) + | ((in[19 + inpos]) << 1) | ((in[20 + inpos]) << 28); + out[17 + outpos] = ((in[20 + inpos]) >>> (27 - 23)) + | ((in[21 + inpos]) << 23); + out[18 + outpos] = ((in[21 + inpos]) >>> (27 - 18)) + | ((in[22 + inpos]) << 18); + out[19 + outpos] = ((in[22 + inpos]) >>> (27 - 13)) + | ((in[23 + inpos]) << 13); + out[20 + outpos] = ((in[23 + inpos]) >>> (27 - 8)) + | ((in[24 + inpos]) << 8); + out[21 + outpos] = ((in[24 + inpos]) >>> (27 - 3)) + | ((in[25 + inpos]) << 3) | ((in[26 + inpos]) << 30); + out[22 + outpos] = ((in[26 + inpos]) >>> (27 - 25)) + | ((in[27 + inpos]) << 25); + out[23 + outpos] = ((in[27 + inpos]) >>> (27 - 20)) + | ((in[28 + inpos]) << 20); + out[24 + outpos] = ((in[28 + inpos]) >>> (27 - 15)) + | ((in[29 + inpos]) << 15); + out[25 + outpos] = ((in[29 + inpos]) >>> (27 - 10)) + | ((in[30 + inpos]) << 10); + out[26 + outpos] = ((in[30 + inpos]) >>> (27 - 5)) + | ((in[31 + inpos]) << 5); + } - protected static void fastunpack3(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 7) - ; - out[1 + outpos] = ((in[0 + inpos] >>> 3) & 7) - ; - out[2 + outpos] = ((in[0 + inpos] >>> 6) & 7) - ; - out[3 + outpos] = ((in[0 + inpos] >>> 9) & 7) - ; - out[4 + outpos] = ((in[0 + inpos] >>> 12) & 7) - ; - out[5 + outpos] = ((in[0 + inpos] >>> 15) & 7) - ; - out[6 + outpos] = ((in[0 + inpos] >>> 18) & 7) - ; - out[7 + outpos] = ((in[0 + inpos] >>> 21) & 7) - ; - out[8 + outpos] = ((in[0 + inpos] >>> 24) & 7) - ; - out[9 + outpos] = ((in[0 + inpos] >>> 27) & 7) - ; - out[10 + outpos] = (in[0 + inpos] >>> 30) - | ((in[1 + inpos] & 1) << (3 - 1)) - ; - out[11 + outpos] = ((in[1 + inpos] >>> 1) & 7) - ; - out[12 + outpos] = ((in[1 + inpos] >>> 4) & 7) - ; - out[13 + outpos] = ((in[1 + inpos] >>> 7) & 7) - ; - out[14 + outpos] = ((in[1 + inpos] >>> 10) & 7) - ; - out[15 + outpos] = ((in[1 + inpos] >>> 13) & 7) - ; - out[16 + outpos] = ((in[1 + inpos] >>> 16) & 7) - ; - out[17 + outpos] = ((in[1 + inpos] >>> 19) & 7) - ; - out[18 + outpos] = ((in[1 + inpos] >>> 22) & 7) - ; - out[19 + outpos] = ((in[1 + inpos] >>> 25) & 7) - ; - out[20 + outpos] = ((in[1 + inpos] >>> 28) & 7) - ; - out[21 + outpos] = (in[1 + inpos] >>> 31) - | ((in[2 + inpos] & 3) << (3 - 2)) - ; - out[22 + outpos] = ((in[2 + inpos] >>> 2) & 7) - ; - out[23 + outpos] = ((in[2 + inpos] >>> 5) & 7) - ; - out[24 + outpos] = ((in[2 + inpos] >>> 8) & 7) - ; - out[25 + outpos] = ((in[2 + inpos] >>> 11) & 7) - ; - out[26 + outpos] = ((in[2 + inpos] >>> 14) & 7) - ; - out[27 + outpos] = ((in[2 + inpos] >>> 17) & 7) - ; - out[28 + outpos] = ((in[2 + inpos] >>> 20) & 7) - ; - out[29 + outpos] = ((in[2 + inpos] >>> 23) & 7) - ; - out[30 + outpos] = ((in[2 + inpos] >>> 26) & 7) - ; - out[31 + outpos] = (in[2 + inpos] >>> 29) - ; - } + protected static void fastpackwithoutmask28(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 28); + out[1 + outpos] = ((in[1 + inpos]) >>> (28 - 24)) + | ((in[2 + inpos]) << 24); + out[2 + outpos] = ((in[2 + inpos]) >>> (28 - 20)) + | ((in[3 + inpos]) << 20); + out[3 + outpos] = ((in[3 + inpos]) >>> (28 - 16)) + | ((in[4 + inpos]) << 16); + out[4 + outpos] = ((in[4 + inpos]) >>> (28 - 12)) + | ((in[5 + inpos]) << 12); + out[5 + outpos] = ((in[5 + inpos]) >>> (28 - 8)) + | ((in[6 + inpos]) << 8); + out[6 + outpos] = ((in[6 + inpos]) >>> (28 - 4)) + | ((in[7 + inpos]) << 4); + out[7 + outpos] = in[8 + inpos] | ((in[9 + inpos]) << 28); + out[8 + outpos] = ((in[9 + inpos]) >>> (28 - 24)) + | ((in[10 + inpos]) << 24); + out[9 + outpos] = ((in[10 + inpos]) >>> (28 - 20)) + | ((in[11 + inpos]) << 20); + out[10 + outpos] = ((in[11 + inpos]) >>> (28 - 16)) + | ((in[12 + inpos]) << 16); + out[11 + outpos] = ((in[12 + inpos]) >>> (28 - 12)) + | ((in[13 + inpos]) << 12); + out[12 + outpos] = ((in[13 + inpos]) >>> (28 - 8)) + | ((in[14 + inpos]) << 8); + out[13 + outpos] = ((in[14 + inpos]) >>> (28 - 4)) + | ((in[15 + inpos]) << 4); + out[14 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 28); + out[15 + outpos] = ((in[17 + inpos]) >>> (28 - 24)) + | ((in[18 + inpos]) << 24); + out[16 + outpos] = ((in[18 + inpos]) >>> (28 - 20)) + | ((in[19 + inpos]) << 20); + out[17 + outpos] = ((in[19 + inpos]) >>> (28 - 16)) + | ((in[20 + inpos]) << 16); + out[18 + outpos] = ((in[20 + inpos]) >>> (28 - 12)) + | ((in[21 + inpos]) << 12); + out[19 + outpos] = ((in[21 + inpos]) >>> (28 - 8)) + | ((in[22 + inpos]) << 8); + out[20 + outpos] = ((in[22 + inpos]) >>> (28 - 4)) + | ((in[23 + inpos]) << 4); + out[21 + outpos] = in[24 + inpos] | ((in[25 + inpos]) << 28); + out[22 + outpos] = ((in[25 + inpos]) >>> (28 - 24)) + | ((in[26 + inpos]) << 24); + out[23 + outpos] = ((in[26 + inpos]) >>> (28 - 20)) + | ((in[27 + inpos]) << 20); + out[24 + outpos] = ((in[27 + inpos]) >>> (28 - 16)) + | ((in[28 + inpos]) << 16); + out[25 + outpos] = ((in[28 + inpos]) >>> (28 - 12)) + | ((in[29 + inpos]) << 12); + out[26 + outpos] = ((in[29 + inpos]) >>> (28 - 8)) + | ((in[30 + inpos]) << 8); + out[27 + outpos] = ((in[30 + inpos]) >>> (28 - 4)) + | ((in[31 + inpos]) << 4); + } + protected static void fastpackwithoutmask29(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 29); + out[1 + outpos] = ((in[1 + inpos]) >>> (29 - 26)) + | ((in[2 + inpos]) << 26); + out[2 + outpos] = ((in[2 + inpos]) >>> (29 - 23)) + | ((in[3 + inpos]) << 23); + out[3 + outpos] = ((in[3 + inpos]) >>> (29 - 20)) + | ((in[4 + inpos]) << 20); + out[4 + outpos] = ((in[4 + inpos]) >>> (29 - 17)) + | ((in[5 + inpos]) << 17); + out[5 + outpos] = ((in[5 + inpos]) >>> (29 - 14)) + | ((in[6 + inpos]) << 14); + out[6 + outpos] = ((in[6 + inpos]) >>> (29 - 11)) + | ((in[7 + inpos]) << 11); + out[7 + outpos] = ((in[7 + inpos]) >>> (29 - 8)) + | ((in[8 + inpos]) << 8); + out[8 + outpos] = ((in[8 + inpos]) >>> (29 - 5)) + | ((in[9 + inpos]) << 5); + out[9 + outpos] = ((in[9 + inpos]) >>> (29 - 2)) + | ((in[10 + inpos]) << 2) | ((in[11 + inpos]) << 31); + out[10 + outpos] = ((in[11 + inpos]) >>> (29 - 28)) + | ((in[12 + inpos]) << 28); + out[11 + outpos] = ((in[12 + inpos]) >>> (29 - 25)) + | ((in[13 + inpos]) << 25); + out[12 + outpos] = ((in[13 + inpos]) >>> (29 - 22)) + | ((in[14 + inpos]) << 22); + out[13 + outpos] = ((in[14 + inpos]) >>> (29 - 19)) + | ((in[15 + inpos]) << 19); + out[14 + outpos] = ((in[15 + inpos]) >>> (29 - 16)) + | ((in[16 + inpos]) << 16); + out[15 + outpos] = ((in[16 + inpos]) >>> (29 - 13)) + | ((in[17 + inpos]) << 13); + out[16 + outpos] = ((in[17 + inpos]) >>> (29 - 10)) + | ((in[18 + inpos]) << 10); + out[17 + outpos] = ((in[18 + inpos]) >>> (29 - 7)) + | ((in[19 + inpos]) << 7); + out[18 + outpos] = ((in[19 + inpos]) >>> (29 - 4)) + | ((in[20 + inpos]) << 4); + out[19 + outpos] = ((in[20 + inpos]) >>> (29 - 1)) + | ((in[21 + inpos]) << 1) | ((in[22 + inpos]) << 30); + out[20 + outpos] = ((in[22 + inpos]) >>> (29 - 27)) + | ((in[23 + inpos]) << 27); + out[21 + outpos] = ((in[23 + inpos]) >>> (29 - 24)) + | ((in[24 + inpos]) << 24); + out[22 + outpos] = ((in[24 + inpos]) >>> (29 - 21)) + | ((in[25 + inpos]) << 21); + out[23 + outpos] = ((in[25 + inpos]) >>> (29 - 18)) + | ((in[26 + inpos]) << 18); + out[24 + outpos] = ((in[26 + inpos]) >>> (29 - 15)) + | ((in[27 + inpos]) << 15); + out[25 + outpos] = ((in[27 + inpos]) >>> (29 - 12)) + | ((in[28 + inpos]) << 12); + out[26 + outpos] = ((in[28 + inpos]) >>> (29 - 9)) + | ((in[29 + inpos]) << 9); + out[27 + outpos] = ((in[29 + inpos]) >>> (29 - 6)) + | ((in[30 + inpos]) << 6); + out[28 + outpos] = ((in[30 + inpos]) >>> (29 - 3)) + | ((in[31 + inpos]) << 3); + } - protected static void fastunpack4(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 15) - ; - out[1 + outpos] = ((in[0 + inpos] >>> 4) & 15) - ; - out[2 + outpos] = ((in[0 + inpos] >>> 8) & 15) - ; - out[3 + outpos] = ((in[0 + inpos] >>> 12) & 15) - ; - out[4 + outpos] = ((in[0 + inpos] >>> 16) & 15) - ; - out[5 + outpos] = ((in[0 + inpos] >>> 20) & 15) - ; - out[6 + outpos] = ((in[0 + inpos] >>> 24) & 15) - ; - out[7 + outpos] = (in[0 + inpos] >>> 28) - ; - out[8 + outpos] = ((in[1 + inpos] >>> 0) & 15) - ; - out[9 + outpos] = ((in[1 + inpos] >>> 4) & 15) - ; - out[10 + outpos] = ((in[1 + inpos] >>> 8) & 15) - ; - out[11 + outpos] = ((in[1 + inpos] >>> 12) & 15) - ; - out[12 + outpos] = ((in[1 + inpos] >>> 16) & 15) - ; - out[13 + outpos] = ((in[1 + inpos] >>> 20) & 15) - ; - out[14 + outpos] = ((in[1 + inpos] >>> 24) & 15) - ; - out[15 + outpos] = (in[1 + inpos] >>> 28) - ; - out[16 + outpos] = ((in[2 + inpos] >>> 0) & 15) - ; - out[17 + outpos] = ((in[2 + inpos] >>> 4) & 15) - ; - out[18 + outpos] = ((in[2 + inpos] >>> 8) & 15) - ; - out[19 + outpos] = ((in[2 + inpos] >>> 12) & 15) - ; - out[20 + outpos] = ((in[2 + inpos] >>> 16) & 15) - ; - out[21 + outpos] = ((in[2 + inpos] >>> 20) & 15) - ; - out[22 + outpos] = ((in[2 + inpos] >>> 24) & 15) - ; - out[23 + outpos] = (in[2 + inpos] >>> 28) - ; - out[24 + outpos] = ((in[3 + inpos] >>> 0) & 15) - ; - out[25 + outpos] = ((in[3 + inpos] >>> 4) & 15) - ; - out[26 + outpos] = ((in[3 + inpos] >>> 8) & 15) - ; - out[27 + outpos] = ((in[3 + inpos] >>> 12) & 15) - ; - out[28 + outpos] = ((in[3 + inpos] >>> 16) & 15) - ; - out[29 + outpos] = ((in[3 + inpos] >>> 20) & 15) - ; - out[30 + outpos] = ((in[3 + inpos] >>> 24) & 15) - ; - out[31 + outpos] = (in[3 + inpos] >>> 28) - ; - } + protected static void fastpackwithoutmask30(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 30); + out[1 + outpos] = ((in[1 + inpos]) >>> (30 - 28)) + | ((in[2 + inpos]) << 28); + out[2 + outpos] = ((in[2 + inpos]) >>> (30 - 26)) + | ((in[3 + inpos]) << 26); + out[3 + outpos] = ((in[3 + inpos]) >>> (30 - 24)) + | ((in[4 + inpos]) << 24); + out[4 + outpos] = ((in[4 + inpos]) >>> (30 - 22)) + | ((in[5 + inpos]) << 22); + out[5 + outpos] = ((in[5 + inpos]) >>> (30 - 20)) + | ((in[6 + inpos]) << 20); + out[6 + outpos] = ((in[6 + inpos]) >>> (30 - 18)) + | ((in[7 + inpos]) << 18); + out[7 + outpos] = ((in[7 + inpos]) >>> (30 - 16)) + | ((in[8 + inpos]) << 16); + out[8 + outpos] = ((in[8 + inpos]) >>> (30 - 14)) + | ((in[9 + inpos]) << 14); + out[9 + outpos] = ((in[9 + inpos]) >>> (30 - 12)) + | ((in[10 + inpos]) << 12); + out[10 + outpos] = ((in[10 + inpos]) >>> (30 - 10)) + | ((in[11 + inpos]) << 10); + out[11 + outpos] = ((in[11 + inpos]) >>> (30 - 8)) + | ((in[12 + inpos]) << 8); + out[12 + outpos] = ((in[12 + inpos]) >>> (30 - 6)) + | ((in[13 + inpos]) << 6); + out[13 + outpos] = ((in[13 + inpos]) >>> (30 - 4)) + | ((in[14 + inpos]) << 4); + out[14 + outpos] = ((in[14 + inpos]) >>> (30 - 2)) + | ((in[15 + inpos]) << 2); + out[15 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 30); + out[16 + outpos] = ((in[17 + inpos]) >>> (30 - 28)) + | ((in[18 + inpos]) << 28); + out[17 + outpos] = ((in[18 + inpos]) >>> (30 - 26)) + | ((in[19 + inpos]) << 26); + out[18 + outpos] = ((in[19 + inpos]) >>> (30 - 24)) + | ((in[20 + inpos]) << 24); + out[19 + outpos] = ((in[20 + inpos]) >>> (30 - 22)) + | ((in[21 + inpos]) << 22); + out[20 + outpos] = ((in[21 + inpos]) >>> (30 - 20)) + | ((in[22 + inpos]) << 20); + out[21 + outpos] = ((in[22 + inpos]) >>> (30 - 18)) + | ((in[23 + inpos]) << 18); + out[22 + outpos] = ((in[23 + inpos]) >>> (30 - 16)) + | ((in[24 + inpos]) << 16); + out[23 + outpos] = ((in[24 + inpos]) >>> (30 - 14)) + | ((in[25 + inpos]) << 14); + out[24 + outpos] = ((in[25 + inpos]) >>> (30 - 12)) + | ((in[26 + inpos]) << 12); + out[25 + outpos] = ((in[26 + inpos]) >>> (30 - 10)) + | ((in[27 + inpos]) << 10); + out[26 + outpos] = ((in[27 + inpos]) >>> (30 - 8)) + | ((in[28 + inpos]) << 8); + out[27 + outpos] = ((in[28 + inpos]) >>> (30 - 6)) + | ((in[29 + inpos]) << 6); + out[28 + outpos] = ((in[29 + inpos]) >>> (30 - 4)) + | ((in[30 + inpos]) << 4); + out[29 + outpos] = ((in[30 + inpos]) >>> (30 - 2)) + | ((in[31 + inpos]) << 2); + } + protected static void fastpackwithoutmask31(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 31); + out[1 + outpos] = ((in[1 + inpos]) >>> (31 - 30)) + | ((in[2 + inpos]) << 30); + out[2 + outpos] = ((in[2 + inpos]) >>> (31 - 29)) + | ((in[3 + inpos]) << 29); + out[3 + outpos] = ((in[3 + inpos]) >>> (31 - 28)) + | ((in[4 + inpos]) << 28); + out[4 + outpos] = ((in[4 + inpos]) >>> (31 - 27)) + | ((in[5 + inpos]) << 27); + out[5 + outpos] = ((in[5 + inpos]) >>> (31 - 26)) + | ((in[6 + inpos]) << 26); + out[6 + outpos] = ((in[6 + inpos]) >>> (31 - 25)) + | ((in[7 + inpos]) << 25); + out[7 + outpos] = ((in[7 + inpos]) >>> (31 - 24)) + | ((in[8 + inpos]) << 24); + out[8 + outpos] = ((in[8 + inpos]) >>> (31 - 23)) + | ((in[9 + inpos]) << 23); + out[9 + outpos] = ((in[9 + inpos]) >>> (31 - 22)) + | ((in[10 + inpos]) << 22); + out[10 + outpos] = ((in[10 + inpos]) >>> (31 - 21)) + | ((in[11 + inpos]) << 21); + out[11 + outpos] = ((in[11 + inpos]) >>> (31 - 20)) + | ((in[12 + inpos]) << 20); + out[12 + outpos] = ((in[12 + inpos]) >>> (31 - 19)) + | ((in[13 + inpos]) << 19); + out[13 + outpos] = ((in[13 + inpos]) >>> (31 - 18)) + | ((in[14 + inpos]) << 18); + out[14 + outpos] = ((in[14 + inpos]) >>> (31 - 17)) + | ((in[15 + inpos]) << 17); + out[15 + outpos] = ((in[15 + inpos]) >>> (31 - 16)) + | ((in[16 + inpos]) << 16); + out[16 + outpos] = ((in[16 + inpos]) >>> (31 - 15)) + | ((in[17 + inpos]) << 15); + out[17 + outpos] = ((in[17 + inpos]) >>> (31 - 14)) + | ((in[18 + inpos]) << 14); + out[18 + outpos] = ((in[18 + inpos]) >>> (31 - 13)) + | ((in[19 + inpos]) << 13); + out[19 + outpos] = ((in[19 + inpos]) >>> (31 - 12)) + | ((in[20 + inpos]) << 12); + out[20 + outpos] = ((in[20 + inpos]) >>> (31 - 11)) + | ((in[21 + inpos]) << 11); + out[21 + outpos] = ((in[21 + inpos]) >>> (31 - 10)) + | ((in[22 + inpos]) << 10); + out[22 + outpos] = ((in[22 + inpos]) >>> (31 - 9)) + | ((in[23 + inpos]) << 9); + out[23 + outpos] = ((in[23 + inpos]) >>> (31 - 8)) + | ((in[24 + inpos]) << 8); + out[24 + outpos] = ((in[24 + inpos]) >>> (31 - 7)) + | ((in[25 + inpos]) << 7); + out[25 + outpos] = ((in[25 + inpos]) >>> (31 - 6)) + | ((in[26 + inpos]) << 6); + out[26 + outpos] = ((in[26 + inpos]) >>> (31 - 5)) + | ((in[27 + inpos]) << 5); + out[27 + outpos] = ((in[27 + inpos]) >>> (31 - 4)) + | ((in[28 + inpos]) << 4); + out[28 + outpos] = ((in[28 + inpos]) >>> (31 - 3)) + | ((in[29 + inpos]) << 3); + out[29 + outpos] = ((in[29 + inpos]) >>> (31 - 2)) + | ((in[30 + inpos]) << 2); + out[30 + outpos] = ((in[30 + inpos]) >>> (31 - 1)) + | ((in[31 + inpos]) << 1); + } - protected static void fastunpack5(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 31) - ; - out[1 + outpos] = ((in[0 + inpos] >>> 5) & 31) - ; - out[2 + outpos] = ((in[0 + inpos] >>> 10) & 31) - ; - out[3 + outpos] = ((in[0 + inpos] >>> 15) & 31) - ; - out[4 + outpos] = ((in[0 + inpos] >>> 20) & 31) - ; - out[5 + outpos] = ((in[0 + inpos] >>> 25) & 31) - ; - out[6 + outpos] = (in[0 + inpos] >>> 30) - | ((in[1 + inpos] & 7) << (5 - 3)) - ; - out[7 + outpos] = ((in[1 + inpos] >>> 3) & 31) - ; - out[8 + outpos] = ((in[1 + inpos] >>> 8) & 31) - ; - out[9 + outpos] = ((in[1 + inpos] >>> 13) & 31) - ; - out[10 + outpos] = ((in[1 + inpos] >>> 18) & 31) - ; - out[11 + outpos] = ((in[1 + inpos] >>> 23) & 31) - ; - out[12 + outpos] = (in[1 + inpos] >>> 28) - | ((in[2 + inpos] & 1) << (5 - 1)) - ; - out[13 + outpos] = ((in[2 + inpos] >>> 1) & 31) - ; - out[14 + outpos] = ((in[2 + inpos] >>> 6) & 31) - ; - out[15 + outpos] = ((in[2 + inpos] >>> 11) & 31) - ; - out[16 + outpos] = ((in[2 + inpos] >>> 16) & 31) - ; - out[17 + outpos] = ((in[2 + inpos] >>> 21) & 31) - ; - out[18 + outpos] = ((in[2 + inpos] >>> 26) & 31) - ; - out[19 + outpos] = (in[2 + inpos] >>> 31) - | ((in[3 + inpos] & 15) << (5 - 4)) - ; - out[20 + outpos] = ((in[3 + inpos] >>> 4) & 31) - ; - out[21 + outpos] = ((in[3 + inpos] >>> 9) & 31) - ; - out[22 + outpos] = ((in[3 + inpos] >>> 14) & 31) - ; - out[23 + outpos] = ((in[3 + inpos] >>> 19) & 31) - ; - out[24 + outpos] = ((in[3 + inpos] >>> 24) & 31) - ; - out[25 + outpos] = (in[3 + inpos] >>> 29) - | ((in[4 + inpos] & 3) << (5 - 2)) - ; - out[26 + outpos] = ((in[4 + inpos] >>> 2) & 31) - ; - out[27 + outpos] = ((in[4 + inpos] >>> 7) & 31) - ; - out[28 + outpos] = ((in[4 + inpos] >>> 12) & 31) - ; - out[29 + outpos] = ((in[4 + inpos] >>> 17) & 31) - ; - out[30 + outpos] = ((in[4 + inpos] >>> 22) & 31) - ; - out[31 + outpos] = (in[4 + inpos] >>> 27) - ; - } + protected static void fastpack1(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 1) + | ((in[1 + inpos] & 1) << 1) + | ((in[2 + inpos] & 1) << 2) + | ((in[3 + inpos] & 1) << 3) + | ((in[4 + inpos] & 1) << 4) + | ((in[5 + inpos] & 1) << 5) + | ((in[6 + inpos] & 1) << 6) + | ((in[7 + inpos] & 1) << 7) + | ((in[8 + inpos] & 1) << 8) + | ((in[9 + inpos] & 1) << 9) + | ((in[10 + inpos] & 1) << 10) + | ((in[11 + inpos] & 1) << 11) + | ((in[12 + inpos] & 1) << 12) + | ((in[13 + inpos] & 1) << 13) + | ((in[14 + inpos] & 1) << 14) + | ((in[15 + inpos] & 1) << 15) + | ((in[16 + inpos] & 1) << 16) + | ((in[17 + inpos] & 1) << 17) + | ((in[18 + inpos] & 1) << 18) + | ((in[19 + inpos] & 1) << 19) + | ((in[20 + inpos] & 1) << 20) + | ((in[21 + inpos] & 1) << 21) + | ((in[22 + inpos] & 1) << 22) + | ((in[23 + inpos] & 1) << 23) + | ((in[24 + inpos] & 1) << 24) + | ((in[25 + inpos] & 1) << 25) + | ((in[26 + inpos] & 1) << 26) + | ((in[27 + inpos] & 1) << 27) + | ((in[28 + inpos] & 1) << 28) + | ((in[29 + inpos] & 1) << 29) + | ((in[30 + inpos] & 1) << 30) + | ((in[31 + inpos]) << 31); + } + protected static void fastpack2(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 3) + | ((in[1 + inpos] & 3) << 2) + | ((in[2 + inpos] & 3) << 4) + | ((in[3 + inpos] & 3) << 6) + | ((in[4 + inpos] & 3) << 8) + | ((in[5 + inpos] & 3) << 10) + | ((in[6 + inpos] & 3) << 12) + | ((in[7 + inpos] & 3) << 14) + | ((in[8 + inpos] & 3) << 16) + | ((in[9 + inpos] & 3) << 18) + | ((in[10 + inpos] & 3) << 20) + | ((in[11 + inpos] & 3) << 22) + | ((in[12 + inpos] & 3) << 24) + | ((in[13 + inpos] & 3) << 26) + | ((in[14 + inpos] & 3) << 28) + | ((in[15 + inpos]) << 30); + out[1 + outpos] = (in[16 + inpos] & 3) + | ((in[17 + inpos] & 3) << 2) + | ((in[18 + inpos] & 3) << 4) + | ((in[19 + inpos] & 3) << 6) + | ((in[20 + inpos] & 3) << 8) + | ((in[21 + inpos] & 3) << 10) + | ((in[22 + inpos] & 3) << 12) + | ((in[23 + inpos] & 3) << 14) + | ((in[24 + inpos] & 3) << 16) + | ((in[25 + inpos] & 3) << 18) + | ((in[26 + inpos] & 3) << 20) + | ((in[27 + inpos] & 3) << 22) + | ((in[28 + inpos] & 3) << 24) + | ((in[29 + inpos] & 3) << 26) + | ((in[30 + inpos] & 3) << 28) + | ((in[31 + inpos]) << 30); + } - protected static void fastunpack6(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 63) - ; - out[1 + outpos] = ((in[0 + inpos] >>> 6) & 63) - ; - out[2 + outpos] = ((in[0 + inpos] >>> 12) & 63) - ; - out[3 + outpos] = ((in[0 + inpos] >>> 18) & 63) - ; - out[4 + outpos] = ((in[0 + inpos] >>> 24) & 63) - ; - out[5 + outpos] = (in[0 + inpos] >>> 30) - | ((in[1 + inpos] & 15) << (6 - 4)) - ; - out[6 + outpos] = ((in[1 + inpos] >>> 4) & 63) - ; - out[7 + outpos] = ((in[1 + inpos] >>> 10) & 63) - ; - out[8 + outpos] = ((in[1 + inpos] >>> 16) & 63) - ; - out[9 + outpos] = ((in[1 + inpos] >>> 22) & 63) - ; - out[10 + outpos] = (in[1 + inpos] >>> 28) - | ((in[2 + inpos] & 3) << (6 - 2)) - ; - out[11 + outpos] = ((in[2 + inpos] >>> 2) & 63) - ; - out[12 + outpos] = ((in[2 + inpos] >>> 8) & 63) - ; - out[13 + outpos] = ((in[2 + inpos] >>> 14) & 63) - ; - out[14 + outpos] = ((in[2 + inpos] >>> 20) & 63) - ; - out[15 + outpos] = (in[2 + inpos] >>> 26) - ; - out[16 + outpos] = ((in[3 + inpos] >>> 0) & 63) - ; - out[17 + outpos] = ((in[3 + inpos] >>> 6) & 63) - ; - out[18 + outpos] = ((in[3 + inpos] >>> 12) & 63) - ; - out[19 + outpos] = ((in[3 + inpos] >>> 18) & 63) - ; - out[20 + outpos] = ((in[3 + inpos] >>> 24) & 63) - ; - out[21 + outpos] = (in[3 + inpos] >>> 30) - | ((in[4 + inpos] & 15) << (6 - 4)) - ; - out[22 + outpos] = ((in[4 + inpos] >>> 4) & 63) - ; - out[23 + outpos] = ((in[4 + inpos] >>> 10) & 63) - ; - out[24 + outpos] = ((in[4 + inpos] >>> 16) & 63) - ; - out[25 + outpos] = ((in[4 + inpos] >>> 22) & 63) - ; - out[26 + outpos] = (in[4 + inpos] >>> 28) - | ((in[5 + inpos] & 3) << (6 - 2)) - ; - out[27 + outpos] = ((in[5 + inpos] >>> 2) & 63) - ; - out[28 + outpos] = ((in[5 + inpos] >>> 8) & 63) - ; - out[29 + outpos] = ((in[5 + inpos] >>> 14) & 63) - ; - out[30 + outpos] = ((in[5 + inpos] >>> 20) & 63) - ; - out[31 + outpos] = (in[5 + inpos] >>> 26) - ; - } + protected static void fastpack3(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 7) + | ((in[1 + inpos] & 7) << 3) + | ((in[2 + inpos] & 7) << 6) + | ((in[3 + inpos] & 7) << 9) + | ((in[4 + inpos] & 7) << 12) + | ((in[5 + inpos] & 7) << 15) + | ((in[6 + inpos] & 7) << 18) + | ((in[7 + inpos] & 7) << 21) + | ((in[8 + inpos] & 7) << 24) + | ((in[9 + inpos] & 7) << 27) + | ((in[10 + inpos]) << 30); + out[1 + outpos] = ((in[10 + inpos] & 7) >>> (3 - 1)) + | ((in[11 + inpos] & 7) << 1) + | ((in[12 + inpos] & 7) << 4) + | ((in[13 + inpos] & 7) << 7) + | ((in[14 + inpos] & 7) << 10) + | ((in[15 + inpos] & 7) << 13) + | ((in[16 + inpos] & 7) << 16) + | ((in[17 + inpos] & 7) << 19) + | ((in[18 + inpos] & 7) << 22) + | ((in[19 + inpos] & 7) << 25) + | ((in[20 + inpos] & 7) << 28) + | ((in[21 + inpos]) << 31); + out[2 + outpos] = ((in[21 + inpos] & 7) >>> (3 - 2)) + | ((in[22 + inpos] & 7) << 2) + | ((in[23 + inpos] & 7) << 5) + | ((in[24 + inpos] & 7) << 8) + | ((in[25 + inpos] & 7) << 11) + | ((in[26 + inpos] & 7) << 14) + | ((in[27 + inpos] & 7) << 17) + | ((in[28 + inpos] & 7) << 20) + | ((in[29 + inpos] & 7) << 23) + | ((in[30 + inpos] & 7) << 26) + | ((in[31 + inpos]) << 29); + } + protected static void fastpack4(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 15) + | ((in[1 + inpos] & 15) << 4) + | ((in[2 + inpos] & 15) << 8) + | ((in[3 + inpos] & 15) << 12) + | ((in[4 + inpos] & 15) << 16) + | ((in[5 + inpos] & 15) << 20) + | ((in[6 + inpos] & 15) << 24) + | ((in[7 + inpos]) << 28); + out[1 + outpos] = (in[8 + inpos] & 15) + | ((in[9 + inpos] & 15) << 4) + | ((in[10 + inpos] & 15) << 8) + | ((in[11 + inpos] & 15) << 12) + | ((in[12 + inpos] & 15) << 16) + | ((in[13 + inpos] & 15) << 20) + | ((in[14 + inpos] & 15) << 24) + | ((in[15 + inpos]) << 28); + out[2 + outpos] = (in[16 + inpos] & 15) + | ((in[17 + inpos] & 15) << 4) + | ((in[18 + inpos] & 15) << 8) + | ((in[19 + inpos] & 15) << 12) + | ((in[20 + inpos] & 15) << 16) + | ((in[21 + inpos] & 15) << 20) + | ((in[22 + inpos] & 15) << 24) + | ((in[23 + inpos]) << 28); + out[3 + outpos] = (in[24 + inpos] & 15) + | ((in[25 + inpos] & 15) << 4) + | ((in[26 + inpos] & 15) << 8) + | ((in[27 + inpos] & 15) << 12) + | ((in[28 + inpos] & 15) << 16) + | ((in[29 + inpos] & 15) << 20) + | ((in[30 + inpos] & 15) << 24) + | ((in[31 + inpos]) << 28); + } - protected static void fastunpack7(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 127) - ; - out[1 + outpos] = ((in[0 + inpos] >>> 7) & 127) - ; - out[2 + outpos] = ((in[0 + inpos] >>> 14) & 127) - ; - out[3 + outpos] = ((in[0 + inpos] >>> 21) & 127) - ; - out[4 + outpos] = (in[0 + inpos] >>> 28) - | ((in[1 + inpos] & 7) << (7 - 3)) - ; - out[5 + outpos] = ((in[1 + inpos] >>> 3) & 127) - ; - out[6 + outpos] = ((in[1 + inpos] >>> 10) & 127) - ; - out[7 + outpos] = ((in[1 + inpos] >>> 17) & 127) - ; - out[8 + outpos] = ((in[1 + inpos] >>> 24) & 127) - ; - out[9 + outpos] = (in[1 + inpos] >>> 31) - | ((in[2 + inpos] & 63) << (7 - 6)) - ; - out[10 + outpos] = ((in[2 + inpos] >>> 6) & 127) - ; - out[11 + outpos] = ((in[2 + inpos] >>> 13) & 127) - ; - out[12 + outpos] = ((in[2 + inpos] >>> 20) & 127) - ; - out[13 + outpos] = (in[2 + inpos] >>> 27) - | ((in[3 + inpos] & 3) << (7 - 2)) - ; - out[14 + outpos] = ((in[3 + inpos] >>> 2) & 127) - ; - out[15 + outpos] = ((in[3 + inpos] >>> 9) & 127) - ; - out[16 + outpos] = ((in[3 + inpos] >>> 16) & 127) - ; - out[17 + outpos] = ((in[3 + inpos] >>> 23) & 127) - ; - out[18 + outpos] = (in[3 + inpos] >>> 30) - | ((in[4 + inpos] & 31) << (7 - 5)) - ; - out[19 + outpos] = ((in[4 + inpos] >>> 5) & 127) - ; - out[20 + outpos] = ((in[4 + inpos] >>> 12) & 127) - ; - out[21 + outpos] = ((in[4 + inpos] >>> 19) & 127) - ; - out[22 + outpos] = (in[4 + inpos] >>> 26) - | ((in[5 + inpos] & 1) << (7 - 1)) - ; - out[23 + outpos] = ((in[5 + inpos] >>> 1) & 127) - ; - out[24 + outpos] = ((in[5 + inpos] >>> 8) & 127) - ; - out[25 + outpos] = ((in[5 + inpos] >>> 15) & 127) - ; - out[26 + outpos] = ((in[5 + inpos] >>> 22) & 127) - ; - out[27 + outpos] = (in[5 + inpos] >>> 29) - | ((in[6 + inpos] & 15) << (7 - 4)) - ; - out[28 + outpos] = ((in[6 + inpos] >>> 4) & 127) - ; - out[29 + outpos] = ((in[6 + inpos] >>> 11) & 127) - ; - out[30 + outpos] = ((in[6 + inpos] >>> 18) & 127) - ; - out[31 + outpos] = (in[6 + inpos] >>> 25) - ; - } + protected static void fastpack5(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 31) + | ((in[1 + inpos] & 31) << 5) + | ((in[2 + inpos] & 31) << 10) + | ((in[3 + inpos] & 31) << 15) + | ((in[4 + inpos] & 31) << 20) + | ((in[5 + inpos] & 31) << 25) + | ((in[6 + inpos]) << 30); + out[1 + outpos] = ((in[6 + inpos] & 31) >>> (5 - 3)) + | ((in[7 + inpos] & 31) << 3) + | ((in[8 + inpos] & 31) << 8) + | ((in[9 + inpos] & 31) << 13) + | ((in[10 + inpos] & 31) << 18) + | ((in[11 + inpos] & 31) << 23) + | ((in[12 + inpos]) << 28); + out[2 + outpos] = ((in[12 + inpos] & 31) >>> (5 - 1)) + | ((in[13 + inpos] & 31) << 1) + | ((in[14 + inpos] & 31) << 6) + | ((in[15 + inpos] & 31) << 11) + | ((in[16 + inpos] & 31) << 16) + | ((in[17 + inpos] & 31) << 21) + | ((in[18 + inpos] & 31) << 26) + | ((in[19 + inpos]) << 31); + out[3 + outpos] = ((in[19 + inpos] & 31) >>> (5 - 4)) + | ((in[20 + inpos] & 31) << 4) + | ((in[21 + inpos] & 31) << 9) + | ((in[22 + inpos] & 31) << 14) + | ((in[23 + inpos] & 31) << 19) + | ((in[24 + inpos] & 31) << 24) + | ((in[25 + inpos]) << 29); + out[4 + outpos] = ((in[25 + inpos] & 31) >>> (5 - 2)) + | ((in[26 + inpos] & 31) << 2) + | ((in[27 + inpos] & 31) << 7) + | ((in[28 + inpos] & 31) << 12) + | ((in[29 + inpos] & 31) << 17) + | ((in[30 + inpos] & 31) << 22) + | ((in[31 + inpos]) << 27); + } + protected static void fastpack6(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 63) + | ((in[1 + inpos] & 63) << 6) + | ((in[2 + inpos] & 63) << 12) + | ((in[3 + inpos] & 63) << 18) + | ((in[4 + inpos] & 63) << 24) + | ((in[5 + inpos]) << 30); + out[1 + outpos] = ((in[5 + inpos] & 63) >>> (6 - 4)) + | ((in[6 + inpos] & 63) << 4) + | ((in[7 + inpos] & 63) << 10) + | ((in[8 + inpos] & 63) << 16) + | ((in[9 + inpos] & 63) << 22) + | ((in[10 + inpos]) << 28); + out[2 + outpos] = ((in[10 + inpos] & 63) >>> (6 - 2)) + | ((in[11 + inpos] & 63) << 2) + | ((in[12 + inpos] & 63) << 8) + | ((in[13 + inpos] & 63) << 14) + | ((in[14 + inpos] & 63) << 20) + | ((in[15 + inpos]) << 26); + out[3 + outpos] = (in[16 + inpos] & 63) + | ((in[17 + inpos] & 63) << 6) + | ((in[18 + inpos] & 63) << 12) + | ((in[19 + inpos] & 63) << 18) + | ((in[20 + inpos] & 63) << 24) + | ((in[21 + inpos]) << 30); + out[4 + outpos] = ((in[21 + inpos] & 63) >>> (6 - 4)) + | ((in[22 + inpos] & 63) << 4) + | ((in[23 + inpos] & 63) << 10) + | ((in[24 + inpos] & 63) << 16) + | ((in[25 + inpos] & 63) << 22) + | ((in[26 + inpos]) << 28); + out[5 + outpos] = ((in[26 + inpos] & 63) >>> (6 - 2)) + | ((in[27 + inpos] & 63) << 2) + | ((in[28 + inpos] & 63) << 8) + | ((in[29 + inpos] & 63) << 14) + | ((in[30 + inpos] & 63) << 20) + | ((in[31 + inpos]) << 26); + } - protected static void fastunpack8(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 255) - ; - out[1 + outpos] = ((in[0 + inpos] >>> 8) & 255) - ; - out[2 + outpos] = ((in[0 + inpos] >>> 16) & 255) - ; - out[3 + outpos] = (in[0 + inpos] >>> 24) - ; - out[4 + outpos] = ((in[1 + inpos] >>> 0) & 255) - ; - out[5 + outpos] = ((in[1 + inpos] >>> 8) & 255) - ; - out[6 + outpos] = ((in[1 + inpos] >>> 16) & 255) - ; - out[7 + outpos] = (in[1 + inpos] >>> 24) - ; - out[8 + outpos] = ((in[2 + inpos] >>> 0) & 255) - ; - out[9 + outpos] = ((in[2 + inpos] >>> 8) & 255) - ; - out[10 + outpos] = ((in[2 + inpos] >>> 16) & 255) - ; - out[11 + outpos] = (in[2 + inpos] >>> 24) - ; - out[12 + outpos] = ((in[3 + inpos] >>> 0) & 255) - ; - out[13 + outpos] = ((in[3 + inpos] >>> 8) & 255) - ; - out[14 + outpos] = ((in[3 + inpos] >>> 16) & 255) - ; - out[15 + outpos] = (in[3 + inpos] >>> 24) - ; - out[16 + outpos] = ((in[4 + inpos] >>> 0) & 255) - ; - out[17 + outpos] = ((in[4 + inpos] >>> 8) & 255) - ; - out[18 + outpos] = ((in[4 + inpos] >>> 16) & 255) - ; - out[19 + outpos] = (in[4 + inpos] >>> 24) - ; - out[20 + outpos] = ((in[5 + inpos] >>> 0) & 255) - ; - out[21 + outpos] = ((in[5 + inpos] >>> 8) & 255) - ; - out[22 + outpos] = ((in[5 + inpos] >>> 16) & 255) - ; - out[23 + outpos] = (in[5 + inpos] >>> 24) - ; - out[24 + outpos] = ((in[6 + inpos] >>> 0) & 255) - ; - out[25 + outpos] = ((in[6 + inpos] >>> 8) & 255) - ; - out[26 + outpos] = ((in[6 + inpos] >>> 16) & 255) - ; - out[27 + outpos] = (in[6 + inpos] >>> 24) - ; - out[28 + outpos] = ((in[7 + inpos] >>> 0) & 255) - ; - out[29 + outpos] = ((in[7 + inpos] >>> 8) & 255) - ; - out[30 + outpos] = ((in[7 + inpos] >>> 16) & 255) - ; - out[31 + outpos] = (in[7 + inpos] >>> 24) - ; - } + protected static void fastpack7(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 127) + | ((in[1 + inpos] & 127) << 7) + | ((in[2 + inpos] & 127) << 14) + | ((in[3 + inpos] & 127) << 21) + | ((in[4 + inpos]) << 28); + out[1 + outpos] = ((in[4 + inpos] & 127) >>> (7 - 3)) + | ((in[5 + inpos] & 127) << 3) + | ((in[6 + inpos] & 127) << 10) + | ((in[7 + inpos] & 127) << 17) + | ((in[8 + inpos] & 127) << 24) + | ((in[9 + inpos]) << 31); + out[2 + outpos] = ((in[9 + inpos] & 127) >>> (7 - 6)) + | ((in[10 + inpos] & 127) << 6) + | ((in[11 + inpos] & 127) << 13) + | ((in[12 + inpos] & 127) << 20) + | ((in[13 + inpos]) << 27); + out[3 + outpos] = ((in[13 + inpos] & 127) >>> (7 - 2)) + | ((in[14 + inpos] & 127) << 2) + | ((in[15 + inpos] & 127) << 9) + | ((in[16 + inpos] & 127) << 16) + | ((in[17 + inpos] & 127) << 23) + | ((in[18 + inpos]) << 30); + out[4 + outpos] = ((in[18 + inpos] & 127) >>> (7 - 5)) + | ((in[19 + inpos] & 127) << 5) + | ((in[20 + inpos] & 127) << 12) + | ((in[21 + inpos] & 127) << 19) + | ((in[22 + inpos]) << 26); + out[5 + outpos] = ((in[22 + inpos] & 127) >>> (7 - 1)) + | ((in[23 + inpos] & 127) << 1) + | ((in[24 + inpos] & 127) << 8) + | ((in[25 + inpos] & 127) << 15) + | ((in[26 + inpos] & 127) << 22) + | ((in[27 + inpos]) << 29); + out[6 + outpos] = ((in[27 + inpos] & 127) >>> (7 - 4)) + | ((in[28 + inpos] & 127) << 4) + | ((in[29 + inpos] & 127) << 11) + | ((in[30 + inpos] & 127) << 18) + | ((in[31 + inpos]) << 25); + } + protected static void fastpack8(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 255) + | ((in[1 + inpos] & 255) << 8) + | ((in[2 + inpos] & 255) << 16) + | ((in[3 + inpos]) << 24); + out[1 + outpos] = (in[4 + inpos] & 255) + | ((in[5 + inpos] & 255) << 8) + | ((in[6 + inpos] & 255) << 16) + | ((in[7 + inpos]) << 24); + out[2 + outpos] = (in[8 + inpos] & 255) + | ((in[9 + inpos] & 255) << 8) + | ((in[10 + inpos] & 255) << 16) + | ((in[11 + inpos]) << 24); + out[3 + outpos] = (in[12 + inpos] & 255) + | ((in[13 + inpos] & 255) << 8) + | ((in[14 + inpos] & 255) << 16) + | ((in[15 + inpos]) << 24); + out[4 + outpos] = (in[16 + inpos] & 255) + | ((in[17 + inpos] & 255) << 8) + | ((in[18 + inpos] & 255) << 16) + | ((in[19 + inpos]) << 24); + out[5 + outpos] = (in[20 + inpos] & 255) + | ((in[21 + inpos] & 255) << 8) + | ((in[22 + inpos] & 255) << 16) + | ((in[23 + inpos]) << 24); + out[6 + outpos] = (in[24 + inpos] & 255) + | ((in[25 + inpos] & 255) << 8) + | ((in[26 + inpos] & 255) << 16) + | ((in[27 + inpos]) << 24); + out[7 + outpos] = (in[28 + inpos] & 255) + | ((in[29 + inpos] & 255) << 8) + | ((in[30 + inpos] & 255) << 16) + | ((in[31 + inpos]) << 24); + } - protected static void fastunpack9(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 511) - ; - out[1 + outpos] = ((in[0 + inpos] >>> 9) & 511) - ; - out[2 + outpos] = ((in[0 + inpos] >>> 18) & 511) - ; - out[3 + outpos] = (in[0 + inpos] >>> 27) - | ((in[1 + inpos] & 15) << (9 - 4)) - ; - out[4 + outpos] = ((in[1 + inpos] >>> 4) & 511) - ; - out[5 + outpos] = ((in[1 + inpos] >>> 13) & 511) - ; - out[6 + outpos] = ((in[1 + inpos] >>> 22) & 511) - ; - out[7 + outpos] = (in[1 + inpos] >>> 31) - | ((in[2 + inpos] & 255) << (9 - 8)) - ; - out[8 + outpos] = ((in[2 + inpos] >>> 8) & 511) - ; - out[9 + outpos] = ((in[2 + inpos] >>> 17) & 511) - ; - out[10 + outpos] = (in[2 + inpos] >>> 26) - | ((in[3 + inpos] & 7) << (9 - 3)) - ; - out[11 + outpos] = ((in[3 + inpos] >>> 3) & 511) - ; - out[12 + outpos] = ((in[3 + inpos] >>> 12) & 511) - ; - out[13 + outpos] = ((in[3 + inpos] >>> 21) & 511) - ; - out[14 + outpos] = (in[3 + inpos] >>> 30) - | ((in[4 + inpos] & 127) << (9 - 7)) - ; - out[15 + outpos] = ((in[4 + inpos] >>> 7) & 511) - ; - out[16 + outpos] = ((in[4 + inpos] >>> 16) & 511) - ; - out[17 + outpos] = (in[4 + inpos] >>> 25) - | ((in[5 + inpos] & 3) << (9 - 2)) - ; - out[18 + outpos] = ((in[5 + inpos] >>> 2) & 511) - ; - out[19 + outpos] = ((in[5 + inpos] >>> 11) & 511) - ; - out[20 + outpos] = ((in[5 + inpos] >>> 20) & 511) - ; - out[21 + outpos] = (in[5 + inpos] >>> 29) - | ((in[6 + inpos] & 63) << (9 - 6)) - ; - out[22 + outpos] = ((in[6 + inpos] >>> 6) & 511) - ; - out[23 + outpos] = ((in[6 + inpos] >>> 15) & 511) - ; - out[24 + outpos] = (in[6 + inpos] >>> 24) - | ((in[7 + inpos] & 1) << (9 - 1)) - ; - out[25 + outpos] = ((in[7 + inpos] >>> 1) & 511) - ; - out[26 + outpos] = ((in[7 + inpos] >>> 10) & 511) - ; - out[27 + outpos] = ((in[7 + inpos] >>> 19) & 511) - ; - out[28 + outpos] = (in[7 + inpos] >>> 28) - | ((in[8 + inpos] & 31) << (9 - 5)) - ; - out[29 + outpos] = ((in[8 + inpos] >>> 5) & 511) - ; - out[30 + outpos] = ((in[8 + inpos] >>> 14) & 511) - ; - out[31 + outpos] = (in[8 + inpos] >>> 23) - ; - } + protected static void fastpack9(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 511) + | ((in[1 + inpos] & 511) << 9) + | ((in[2 + inpos] & 511) << 18) + | ((in[3 + inpos]) << 27); + out[1 + outpos] = ((in[3 + inpos] & 511) >>> (9 - 4)) + | ((in[4 + inpos] & 511) << 4) + | ((in[5 + inpos] & 511) << 13) + | ((in[6 + inpos] & 511) << 22) + | ((in[7 + inpos]) << 31); + out[2 + outpos] = ((in[7 + inpos] & 511) >>> (9 - 8)) + | ((in[8 + inpos] & 511) << 8) + | ((in[9 + inpos] & 511) << 17) + | ((in[10 + inpos]) << 26); + out[3 + outpos] = ((in[10 + inpos] & 511) >>> (9 - 3)) + | ((in[11 + inpos] & 511) << 3) + | ((in[12 + inpos] & 511) << 12) + | ((in[13 + inpos] & 511) << 21) + | ((in[14 + inpos]) << 30); + out[4 + outpos] = ((in[14 + inpos] & 511) >>> (9 - 7)) + | ((in[15 + inpos] & 511) << 7) + | ((in[16 + inpos] & 511) << 16) + | ((in[17 + inpos]) << 25); + out[5 + outpos] = ((in[17 + inpos] & 511) >>> (9 - 2)) + | ((in[18 + inpos] & 511) << 2) + | ((in[19 + inpos] & 511) << 11) + | ((in[20 + inpos] & 511) << 20) + | ((in[21 + inpos]) << 29); + out[6 + outpos] = ((in[21 + inpos] & 511) >>> (9 - 6)) + | ((in[22 + inpos] & 511) << 6) + | ((in[23 + inpos] & 511) << 15) + | ((in[24 + inpos]) << 24); + out[7 + outpos] = ((in[24 + inpos] & 511) >>> (9 - 1)) + | ((in[25 + inpos] & 511) << 1) + | ((in[26 + inpos] & 511) << 10) + | ((in[27 + inpos] & 511) << 19) + | ((in[28 + inpos]) << 28); + out[8 + outpos] = ((in[28 + inpos] & 511) >>> (9 - 5)) + | ((in[29 + inpos] & 511) << 5) + | ((in[30 + inpos] & 511) << 14) + | ((in[31 + inpos]) << 23); + } + protected static void fastpack10(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 1023) + | ((in[1 + inpos] & 1023) << 10) + | ((in[2 + inpos] & 1023) << 20) + | ((in[3 + inpos]) << 30); + out[1 + outpos] = ((in[3 + inpos] & 1023) >>> (10 - 8)) + | ((in[4 + inpos] & 1023) << 8) + | ((in[5 + inpos] & 1023) << 18) + | ((in[6 + inpos]) << 28); + out[2 + outpos] = ((in[6 + inpos] & 1023) >>> (10 - 6)) + | ((in[7 + inpos] & 1023) << 6) + | ((in[8 + inpos] & 1023) << 16) + | ((in[9 + inpos]) << 26); + out[3 + outpos] = ((in[9 + inpos] & 1023) >>> (10 - 4)) + | ((in[10 + inpos] & 1023) << 4) + | ((in[11 + inpos] & 1023) << 14) + | ((in[12 + inpos]) << 24); + out[4 + outpos] = ((in[12 + inpos] & 1023) >>> (10 - 2)) + | ((in[13 + inpos] & 1023) << 2) + | ((in[14 + inpos] & 1023) << 12) + | ((in[15 + inpos]) << 22); + out[5 + outpos] = (in[16 + inpos] & 1023) + | ((in[17 + inpos] & 1023) << 10) + | ((in[18 + inpos] & 1023) << 20) + | ((in[19 + inpos]) << 30); + out[6 + outpos] = ((in[19 + inpos] & 1023) >>> (10 - 8)) + | ((in[20 + inpos] & 1023) << 8) + | ((in[21 + inpos] & 1023) << 18) + | ((in[22 + inpos]) << 28); + out[7 + outpos] = ((in[22 + inpos] & 1023) >>> (10 - 6)) + | ((in[23 + inpos] & 1023) << 6) + | ((in[24 + inpos] & 1023) << 16) + | ((in[25 + inpos]) << 26); + out[8 + outpos] = ((in[25 + inpos] & 1023) >>> (10 - 4)) + | ((in[26 + inpos] & 1023) << 4) + | ((in[27 + inpos] & 1023) << 14) + | ((in[28 + inpos]) << 24); + out[9 + outpos] = ((in[28 + inpos] & 1023) >>> (10 - 2)) + | ((in[29 + inpos] & 1023) << 2) + | ((in[30 + inpos] & 1023) << 12) + | ((in[31 + inpos]) << 22); + } - protected static void fastunpack10(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 1023) - ; - out[1 + outpos] = ((in[0 + inpos] >>> 10) & 1023) - ; - out[2 + outpos] = ((in[0 + inpos] >>> 20) & 1023) - ; - out[3 + outpos] = (in[0 + inpos] >>> 30) - | ((in[1 + inpos] & 255) << (10 - 8)) - ; - out[4 + outpos] = ((in[1 + inpos] >>> 8) & 1023) - ; - out[5 + outpos] = ((in[1 + inpos] >>> 18) & 1023) - ; - out[6 + outpos] = (in[1 + inpos] >>> 28) - | ((in[2 + inpos] & 63) << (10 - 6)) - ; - out[7 + outpos] = ((in[2 + inpos] >>> 6) & 1023) - ; - out[8 + outpos] = ((in[2 + inpos] >>> 16) & 1023) - ; - out[9 + outpos] = (in[2 + inpos] >>> 26) - | ((in[3 + inpos] & 15) << (10 - 4)) - ; - out[10 + outpos] = ((in[3 + inpos] >>> 4) & 1023) - ; - out[11 + outpos] = ((in[3 + inpos] >>> 14) & 1023) - ; - out[12 + outpos] = (in[3 + inpos] >>> 24) - | ((in[4 + inpos] & 3) << (10 - 2)) - ; - out[13 + outpos] = ((in[4 + inpos] >>> 2) & 1023) - ; - out[14 + outpos] = ((in[4 + inpos] >>> 12) & 1023) - ; - out[15 + outpos] = (in[4 + inpos] >>> 22) - ; - out[16 + outpos] = ((in[5 + inpos] >>> 0) & 1023) - ; - out[17 + outpos] = ((in[5 + inpos] >>> 10) & 1023) - ; - out[18 + outpos] = ((in[5 + inpos] >>> 20) & 1023) - ; - out[19 + outpos] = (in[5 + inpos] >>> 30) - | ((in[6 + inpos] & 255) << (10 - 8)) - ; - out[20 + outpos] = ((in[6 + inpos] >>> 8) & 1023) - ; - out[21 + outpos] = ((in[6 + inpos] >>> 18) & 1023) - ; - out[22 + outpos] = (in[6 + inpos] >>> 28) - | ((in[7 + inpos] & 63) << (10 - 6)) - ; - out[23 + outpos] = ((in[7 + inpos] >>> 6) & 1023) - ; - out[24 + outpos] = ((in[7 + inpos] >>> 16) & 1023) - ; - out[25 + outpos] = (in[7 + inpos] >>> 26) - | ((in[8 + inpos] & 15) << (10 - 4)) - ; - out[26 + outpos] = ((in[8 + inpos] >>> 4) & 1023) - ; - out[27 + outpos] = ((in[8 + inpos] >>> 14) & 1023) - ; - out[28 + outpos] = (in[8 + inpos] >>> 24) - | ((in[9 + inpos] & 3) << (10 - 2)) - ; - out[29 + outpos] = ((in[9 + inpos] >>> 2) & 1023) - ; - out[30 + outpos] = ((in[9 + inpos] >>> 12) & 1023) - ; - out[31 + outpos] = (in[9 + inpos] >>> 22) - ; - } + protected static void fastpack11(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 2047) + | ((in[1 + inpos] & 2047) << 11) + | ((in[2 + inpos]) << 22); + out[1 + outpos] = ((in[2 + inpos] & 2047) >>> (11 - 1)) + | ((in[3 + inpos] & 2047) << 1) + | ((in[4 + inpos] & 2047) << 12) + | ((in[5 + inpos]) << 23); + out[2 + outpos] = ((in[5 + inpos] & 2047) >>> (11 - 2)) + | ((in[6 + inpos] & 2047) << 2) + | ((in[7 + inpos] & 2047) << 13) + | ((in[8 + inpos]) << 24); + out[3 + outpos] = ((in[8 + inpos] & 2047) >>> (11 - 3)) + | ((in[9 + inpos] & 2047) << 3) + | ((in[10 + inpos] & 2047) << 14) + | ((in[11 + inpos]) << 25); + out[4 + outpos] = ((in[11 + inpos] & 2047) >>> (11 - 4)) + | ((in[12 + inpos] & 2047) << 4) + | ((in[13 + inpos] & 2047) << 15) + | ((in[14 + inpos]) << 26); + out[5 + outpos] = ((in[14 + inpos] & 2047) >>> (11 - 5)) + | ((in[15 + inpos] & 2047) << 5) + | ((in[16 + inpos] & 2047) << 16) + | ((in[17 + inpos]) << 27); + out[6 + outpos] = ((in[17 + inpos] & 2047) >>> (11 - 6)) + | ((in[18 + inpos] & 2047) << 6) + | ((in[19 + inpos] & 2047) << 17) + | ((in[20 + inpos]) << 28); + out[7 + outpos] = ((in[20 + inpos] & 2047) >>> (11 - 7)) + | ((in[21 + inpos] & 2047) << 7) + | ((in[22 + inpos] & 2047) << 18) + | ((in[23 + inpos]) << 29); + out[8 + outpos] = ((in[23 + inpos] & 2047) >>> (11 - 8)) + | ((in[24 + inpos] & 2047) << 8) + | ((in[25 + inpos] & 2047) << 19) + | ((in[26 + inpos]) << 30); + out[9 + outpos] = ((in[26 + inpos] & 2047) >>> (11 - 9)) + | ((in[27 + inpos] & 2047) << 9) + | ((in[28 + inpos] & 2047) << 20) + | ((in[29 + inpos]) << 31); + out[10 + outpos] = ((in[29 + inpos] & 2047) >>> (11 - 10)) + | ((in[30 + inpos] & 2047) << 10) + | ((in[31 + inpos]) << 21); + } + protected static void fastpack12(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 4095) + | ((in[1 + inpos] & 4095) << 12) + | ((in[2 + inpos]) << 24); + out[1 + outpos] = ((in[2 + inpos] & 4095) >>> (12 - 4)) + | ((in[3 + inpos] & 4095) << 4) + | ((in[4 + inpos] & 4095) << 16) + | ((in[5 + inpos]) << 28); + out[2 + outpos] = ((in[5 + inpos] & 4095) >>> (12 - 8)) + | ((in[6 + inpos] & 4095) << 8) + | ((in[7 + inpos]) << 20); + out[3 + outpos] = (in[8 + inpos] & 4095) + | ((in[9 + inpos] & 4095) << 12) + | ((in[10 + inpos]) << 24); + out[4 + outpos] = ((in[10 + inpos] & 4095) >>> (12 - 4)) + | ((in[11 + inpos] & 4095) << 4) + | ((in[12 + inpos] & 4095) << 16) + | ((in[13 + inpos]) << 28); + out[5 + outpos] = ((in[13 + inpos] & 4095) >>> (12 - 8)) + | ((in[14 + inpos] & 4095) << 8) + | ((in[15 + inpos]) << 20); + out[6 + outpos] = (in[16 + inpos] & 4095) + | ((in[17 + inpos] & 4095) << 12) + | ((in[18 + inpos]) << 24); + out[7 + outpos] = ((in[18 + inpos] & 4095) >>> (12 - 4)) + | ((in[19 + inpos] & 4095) << 4) + | ((in[20 + inpos] & 4095) << 16) + | ((in[21 + inpos]) << 28); + out[8 + outpos] = ((in[21 + inpos] & 4095) >>> (12 - 8)) + | ((in[22 + inpos] & 4095) << 8) + | ((in[23 + inpos]) << 20); + out[9 + outpos] = (in[24 + inpos] & 4095) + | ((in[25 + inpos] & 4095) << 12) + | ((in[26 + inpos]) << 24); + out[10 + outpos] = ((in[26 + inpos] & 4095) >>> (12 - 4)) + | ((in[27 + inpos] & 4095) << 4) + | ((in[28 + inpos] & 4095) << 16) + | ((in[29 + inpos]) << 28); + out[11 + outpos] = ((in[29 + inpos] & 4095) >>> (12 - 8)) + | ((in[30 + inpos] & 4095) << 8) + | ((in[31 + inpos]) << 20); + } - protected static void fastunpack11(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 2047) - ; - out[1 + outpos] = ((in[0 + inpos] >>> 11) & 2047) - ; - out[2 + outpos] = (in[0 + inpos] >>> 22) - | ((in[1 + inpos] & 1) << (11 - 1)) - ; - out[3 + outpos] = ((in[1 + inpos] >>> 1) & 2047) - ; - out[4 + outpos] = ((in[1 + inpos] >>> 12) & 2047) - ; - out[5 + outpos] = (in[1 + inpos] >>> 23) - | ((in[2 + inpos] & 3) << (11 - 2)) - ; - out[6 + outpos] = ((in[2 + inpos] >>> 2) & 2047) - ; - out[7 + outpos] = ((in[2 + inpos] >>> 13) & 2047) - ; - out[8 + outpos] = (in[2 + inpos] >>> 24) - | ((in[3 + inpos] & 7) << (11 - 3)) - ; - out[9 + outpos] = ((in[3 + inpos] >>> 3) & 2047) - ; - out[10 + outpos] = ((in[3 + inpos] >>> 14) & 2047) - ; - out[11 + outpos] = (in[3 + inpos] >>> 25) - | ((in[4 + inpos] & 15) << (11 - 4)) - ; - out[12 + outpos] = ((in[4 + inpos] >>> 4) & 2047) - ; - out[13 + outpos] = ((in[4 + inpos] >>> 15) & 2047) - ; - out[14 + outpos] = (in[4 + inpos] >>> 26) - | ((in[5 + inpos] & 31) << (11 - 5)) - ; - out[15 + outpos] = ((in[5 + inpos] >>> 5) & 2047) - ; - out[16 + outpos] = ((in[5 + inpos] >>> 16) & 2047) - ; - out[17 + outpos] = (in[5 + inpos] >>> 27) - | ((in[6 + inpos] & 63) << (11 - 6)) - ; - out[18 + outpos] = ((in[6 + inpos] >>> 6) & 2047) - ; - out[19 + outpos] = ((in[6 + inpos] >>> 17) & 2047) - ; - out[20 + outpos] = (in[6 + inpos] >>> 28) - | ((in[7 + inpos] & 127) << (11 - 7)) - ; - out[21 + outpos] = ((in[7 + inpos] >>> 7) & 2047) - ; - out[22 + outpos] = ((in[7 + inpos] >>> 18) & 2047) - ; - out[23 + outpos] = (in[7 + inpos] >>> 29) - | ((in[8 + inpos] & 255) << (11 - 8)) - ; - out[24 + outpos] = ((in[8 + inpos] >>> 8) & 2047) - ; - out[25 + outpos] = ((in[8 + inpos] >>> 19) & 2047) - ; - out[26 + outpos] = (in[8 + inpos] >>> 30) - | ((in[9 + inpos] & 511) << (11 - 9)) - ; - out[27 + outpos] = ((in[9 + inpos] >>> 9) & 2047) - ; - out[28 + outpos] = ((in[9 + inpos] >>> 20) & 2047) - ; - out[29 + outpos] = (in[9 + inpos] >>> 31) - | ((in[10 + inpos] & 1023) << (11 - 10)) - ; - out[30 + outpos] = ((in[10 + inpos] >>> 10) & 2047) - ; - out[31 + outpos] = (in[10 + inpos] >>> 21) - ; - } + protected static void fastpack13(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 8191) + | ((in[1 + inpos] & 8191) << 13) + | ((in[2 + inpos]) << 26); + out[1 + outpos] = ((in[2 + inpos] & 8191) >>> (13 - 7)) + | ((in[3 + inpos] & 8191) << 7) + | ((in[4 + inpos]) << 20); + out[2 + outpos] = ((in[4 + inpos] & 8191) >>> (13 - 1)) + | ((in[5 + inpos] & 8191) << 1) + | ((in[6 + inpos] & 8191) << 14) + | ((in[7 + inpos]) << 27); + out[3 + outpos] = ((in[7 + inpos] & 8191) >>> (13 - 8)) + | ((in[8 + inpos] & 8191) << 8) + | ((in[9 + inpos]) << 21); + out[4 + outpos] = ((in[9 + inpos] & 8191) >>> (13 - 2)) + | ((in[10 + inpos] & 8191) << 2) + | ((in[11 + inpos] & 8191) << 15) + | ((in[12 + inpos]) << 28); + out[5 + outpos] = ((in[12 + inpos] & 8191) >>> (13 - 9)) + | ((in[13 + inpos] & 8191) << 9) + | ((in[14 + inpos]) << 22); + out[6 + outpos] = ((in[14 + inpos] & 8191) >>> (13 - 3)) + | ((in[15 + inpos] & 8191) << 3) + | ((in[16 + inpos] & 8191) << 16) + | ((in[17 + inpos]) << 29); + out[7 + outpos] = ((in[17 + inpos] & 8191) >>> (13 - 10)) + | ((in[18 + inpos] & 8191) << 10) + | ((in[19 + inpos]) << 23); + out[8 + outpos] = ((in[19 + inpos] & 8191) >>> (13 - 4)) + | ((in[20 + inpos] & 8191) << 4) + | ((in[21 + inpos] & 8191) << 17) + | ((in[22 + inpos]) << 30); + out[9 + outpos] = ((in[22 + inpos] & 8191) >>> (13 - 11)) + | ((in[23 + inpos] & 8191) << 11) + | ((in[24 + inpos]) << 24); + out[10 + outpos] = ((in[24 + inpos] & 8191) >>> (13 - 5)) + | ((in[25 + inpos] & 8191) << 5) + | ((in[26 + inpos] & 8191) << 18) + | ((in[27 + inpos]) << 31); + out[11 + outpos] = ((in[27 + inpos] & 8191) >>> (13 - 12)) + | ((in[28 + inpos] & 8191) << 12) + | ((in[29 + inpos]) << 25); + out[12 + outpos] = ((in[29 + inpos] & 8191) >>> (13 - 6)) + | ((in[30 + inpos] & 8191) << 6) + | ((in[31 + inpos]) << 19); + } + protected static void fastpack14(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 16383) + | ((in[1 + inpos] & 16383) << 14) + | ((in[2 + inpos]) << 28); + out[1 + outpos] = ((in[2 + inpos] & 16383) >>> (14 - 10)) + | ((in[3 + inpos] & 16383) << 10) + | ((in[4 + inpos]) << 24); + out[2 + outpos] = ((in[4 + inpos] & 16383) >>> (14 - 6)) + | ((in[5 + inpos] & 16383) << 6) + | ((in[6 + inpos]) << 20); + out[3 + outpos] = ((in[6 + inpos] & 16383) >>> (14 - 2)) + | ((in[7 + inpos] & 16383) << 2) + | ((in[8 + inpos] & 16383) << 16) + | ((in[9 + inpos]) << 30); + out[4 + outpos] = ((in[9 + inpos] & 16383) >>> (14 - 12)) + | ((in[10 + inpos] & 16383) << 12) + | ((in[11 + inpos]) << 26); + out[5 + outpos] = ((in[11 + inpos] & 16383) >>> (14 - 8)) + | ((in[12 + inpos] & 16383) << 8) + | ((in[13 + inpos]) << 22); + out[6 + outpos] = ((in[13 + inpos] & 16383) >>> (14 - 4)) + | ((in[14 + inpos] & 16383) << 4) + | ((in[15 + inpos]) << 18); + out[7 + outpos] = (in[16 + inpos] & 16383) + | ((in[17 + inpos] & 16383) << 14) + | ((in[18 + inpos]) << 28); + out[8 + outpos] = ((in[18 + inpos] & 16383) >>> (14 - 10)) + | ((in[19 + inpos] & 16383) << 10) + | ((in[20 + inpos]) << 24); + out[9 + outpos] = ((in[20 + inpos] & 16383) >>> (14 - 6)) + | ((in[21 + inpos] & 16383) << 6) + | ((in[22 + inpos]) << 20); + out[10 + outpos] = ((in[22 + inpos] & 16383) >>> (14 - 2)) + | ((in[23 + inpos] & 16383) << 2) + | ((in[24 + inpos] & 16383) << 16) + | ((in[25 + inpos]) << 30); + out[11 + outpos] = ((in[25 + inpos] & 16383) >>> (14 - 12)) + | ((in[26 + inpos] & 16383) << 12) + | ((in[27 + inpos]) << 26); + out[12 + outpos] = ((in[27 + inpos] & 16383) >>> (14 - 8)) + | ((in[28 + inpos] & 16383) << 8) + | ((in[29 + inpos]) << 22); + out[13 + outpos] = ((in[29 + inpos] & 16383) >>> (14 - 4)) + | ((in[30 + inpos] & 16383) << 4) + | ((in[31 + inpos]) << 18); + } - protected static void fastunpack12(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 4095) - ; - out[1 + outpos] = ((in[0 + inpos] >>> 12) & 4095) - ; - out[2 + outpos] = (in[0 + inpos] >>> 24) - | ((in[1 + inpos] & 15) << (12 - 4)) - ; - out[3 + outpos] = ((in[1 + inpos] >>> 4) & 4095) - ; - out[4 + outpos] = ((in[1 + inpos] >>> 16) & 4095) - ; - out[5 + outpos] = (in[1 + inpos] >>> 28) - | ((in[2 + inpos] & 255) << (12 - 8)) - ; - out[6 + outpos] = ((in[2 + inpos] >>> 8) & 4095) - ; - out[7 + outpos] = (in[2 + inpos] >>> 20) - ; - out[8 + outpos] = ((in[3 + inpos] >>> 0) & 4095) - ; - out[9 + outpos] = ((in[3 + inpos] >>> 12) & 4095) - ; - out[10 + outpos] = (in[3 + inpos] >>> 24) - | ((in[4 + inpos] & 15) << (12 - 4)) - ; - out[11 + outpos] = ((in[4 + inpos] >>> 4) & 4095) - ; - out[12 + outpos] = ((in[4 + inpos] >>> 16) & 4095) - ; - out[13 + outpos] = (in[4 + inpos] >>> 28) - | ((in[5 + inpos] & 255) << (12 - 8)) - ; - out[14 + outpos] = ((in[5 + inpos] >>> 8) & 4095) - ; - out[15 + outpos] = (in[5 + inpos] >>> 20) - ; - out[16 + outpos] = ((in[6 + inpos] >>> 0) & 4095) - ; - out[17 + outpos] = ((in[6 + inpos] >>> 12) & 4095) - ; - out[18 + outpos] = (in[6 + inpos] >>> 24) - | ((in[7 + inpos] & 15) << (12 - 4)) - ; - out[19 + outpos] = ((in[7 + inpos] >>> 4) & 4095) - ; - out[20 + outpos] = ((in[7 + inpos] >>> 16) & 4095) - ; - out[21 + outpos] = (in[7 + inpos] >>> 28) - | ((in[8 + inpos] & 255) << (12 - 8)) - ; - out[22 + outpos] = ((in[8 + inpos] >>> 8) & 4095) - ; - out[23 + outpos] = (in[8 + inpos] >>> 20) - ; - out[24 + outpos] = ((in[9 + inpos] >>> 0) & 4095) - ; - out[25 + outpos] = ((in[9 + inpos] >>> 12) & 4095) - ; - out[26 + outpos] = (in[9 + inpos] >>> 24) - | ((in[10 + inpos] & 15) << (12 - 4)) - ; - out[27 + outpos] = ((in[10 + inpos] >>> 4) & 4095) - ; - out[28 + outpos] = ((in[10 + inpos] >>> 16) & 4095) - ; - out[29 + outpos] = (in[10 + inpos] >>> 28) - | ((in[11 + inpos] & 255) << (12 - 8)) - ; - out[30 + outpos] = ((in[11 + inpos] >>> 8) & 4095) - ; - out[31 + outpos] = (in[11 + inpos] >>> 20) - ; - } + protected static void fastpack15(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 32767) + | ((in[1 + inpos] & 32767) << 15) + | ((in[2 + inpos]) << 30); + out[1 + outpos] = ((in[2 + inpos] & 32767) >>> (15 - 13)) + | ((in[3 + inpos] & 32767) << 13) + | ((in[4 + inpos]) << 28); + out[2 + outpos] = ((in[4 + inpos] & 32767) >>> (15 - 11)) + | ((in[5 + inpos] & 32767) << 11) + | ((in[6 + inpos]) << 26); + out[3 + outpos] = ((in[6 + inpos] & 32767) >>> (15 - 9)) + | ((in[7 + inpos] & 32767) << 9) + | ((in[8 + inpos]) << 24); + out[4 + outpos] = ((in[8 + inpos] & 32767) >>> (15 - 7)) + | ((in[9 + inpos] & 32767) << 7) + | ((in[10 + inpos]) << 22); + out[5 + outpos] = ((in[10 + inpos] & 32767) >>> (15 - 5)) + | ((in[11 + inpos] & 32767) << 5) + | ((in[12 + inpos]) << 20); + out[6 + outpos] = ((in[12 + inpos] & 32767) >>> (15 - 3)) + | ((in[13 + inpos] & 32767) << 3) + | ((in[14 + inpos]) << 18); + out[7 + outpos] = ((in[14 + inpos] & 32767) >>> (15 - 1)) + | ((in[15 + inpos] & 32767) << 1) + | ((in[16 + inpos] & 32767) << 16) + | ((in[17 + inpos]) << 31); + out[8 + outpos] = ((in[17 + inpos] & 32767) >>> (15 - 14)) + | ((in[18 + inpos] & 32767) << 14) + | ((in[19 + inpos]) << 29); + out[9 + outpos] = ((in[19 + inpos] & 32767) >>> (15 - 12)) + | ((in[20 + inpos] & 32767) << 12) + | ((in[21 + inpos]) << 27); + out[10 + outpos] = ((in[21 + inpos] & 32767) >>> (15 - 10)) + | ((in[22 + inpos] & 32767) << 10) + | ((in[23 + inpos]) << 25); + out[11 + outpos] = ((in[23 + inpos] & 32767) >>> (15 - 8)) + | ((in[24 + inpos] & 32767) << 8) + | ((in[25 + inpos]) << 23); + out[12 + outpos] = ((in[25 + inpos] & 32767) >>> (15 - 6)) + | ((in[26 + inpos] & 32767) << 6) + | ((in[27 + inpos]) << 21); + out[13 + outpos] = ((in[27 + inpos] & 32767) >>> (15 - 4)) + | ((in[28 + inpos] & 32767) << 4) + | ((in[29 + inpos]) << 19); + out[14 + outpos] = ((in[29 + inpos] & 32767) >>> (15 - 2)) + | ((in[30 + inpos] & 32767) << 2) + | ((in[31 + inpos]) << 17); + } + protected static void fastpack16(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 65535) + | ((in[1 + inpos]) << 16); + out[1 + outpos] = (in[2 + inpos] & 65535) + | ((in[3 + inpos]) << 16); + out[2 + outpos] = (in[4 + inpos] & 65535) + | ((in[5 + inpos]) << 16); + out[3 + outpos] = (in[6 + inpos] & 65535) + | ((in[7 + inpos]) << 16); + out[4 + outpos] = (in[8 + inpos] & 65535) + | ((in[9 + inpos]) << 16); + out[5 + outpos] = (in[10 + inpos] & 65535) + | ((in[11 + inpos]) << 16); + out[6 + outpos] = (in[12 + inpos] & 65535) + | ((in[13 + inpos]) << 16); + out[7 + outpos] = (in[14 + inpos] & 65535) + | ((in[15 + inpos]) << 16); + out[8 + outpos] = (in[16 + inpos] & 65535) + | ((in[17 + inpos]) << 16); + out[9 + outpos] = (in[18 + inpos] & 65535) + | ((in[19 + inpos]) << 16); + out[10 + outpos] = (in[20 + inpos] & 65535) + | ((in[21 + inpos]) << 16); + out[11 + outpos] = (in[22 + inpos] & 65535) + | ((in[23 + inpos]) << 16); + out[12 + outpos] = (in[24 + inpos] & 65535) + | ((in[25 + inpos]) << 16); + out[13 + outpos] = (in[26 + inpos] & 65535) + | ((in[27 + inpos]) << 16); + out[14 + outpos] = (in[28 + inpos] & 65535) + | ((in[29 + inpos]) << 16); + out[15 + outpos] = (in[30 + inpos] & 65535) + | ((in[31 + inpos]) << 16); + } - protected static void fastunpack13(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 8191) - ; - out[1 + outpos] = ((in[0 + inpos] >>> 13) & 8191) - ; - out[2 + outpos] = (in[0 + inpos] >>> 26) - | ((in[1 + inpos] & 127) << (13 - 7)) - ; - out[3 + outpos] = ((in[1 + inpos] >>> 7) & 8191) - ; - out[4 + outpos] = (in[1 + inpos] >>> 20) - | ((in[2 + inpos] & 1) << (13 - 1)) - ; - out[5 + outpos] = ((in[2 + inpos] >>> 1) & 8191) - ; - out[6 + outpos] = ((in[2 + inpos] >>> 14) & 8191) - ; - out[7 + outpos] = (in[2 + inpos] >>> 27) - | ((in[3 + inpos] & 255) << (13 - 8)) - ; - out[8 + outpos] = ((in[3 + inpos] >>> 8) & 8191) - ; - out[9 + outpos] = (in[3 + inpos] >>> 21) - | ((in[4 + inpos] & 3) << (13 - 2)) - ; - out[10 + outpos] = ((in[4 + inpos] >>> 2) & 8191) - ; - out[11 + outpos] = ((in[4 + inpos] >>> 15) & 8191) - ; - out[12 + outpos] = (in[4 + inpos] >>> 28) - | ((in[5 + inpos] & 511) << (13 - 9)) - ; - out[13 + outpos] = ((in[5 + inpos] >>> 9) & 8191) - ; - out[14 + outpos] = (in[5 + inpos] >>> 22) - | ((in[6 + inpos] & 7) << (13 - 3)) - ; - out[15 + outpos] = ((in[6 + inpos] >>> 3) & 8191) - ; - out[16 + outpos] = ((in[6 + inpos] >>> 16) & 8191) - ; - out[17 + outpos] = (in[6 + inpos] >>> 29) - | ((in[7 + inpos] & 1023) << (13 - 10)) - ; - out[18 + outpos] = ((in[7 + inpos] >>> 10) & 8191) - ; - out[19 + outpos] = (in[7 + inpos] >>> 23) - | ((in[8 + inpos] & 15) << (13 - 4)) - ; - out[20 + outpos] = ((in[8 + inpos] >>> 4) & 8191) - ; - out[21 + outpos] = ((in[8 + inpos] >>> 17) & 8191) - ; - out[22 + outpos] = (in[8 + inpos] >>> 30) - | ((in[9 + inpos] & 2047) << (13 - 11)) - ; - out[23 + outpos] = ((in[9 + inpos] >>> 11) & 8191) - ; - out[24 + outpos] = (in[9 + inpos] >>> 24) - | ((in[10 + inpos] & 31) << (13 - 5)) - ; - out[25 + outpos] = ((in[10 + inpos] >>> 5) & 8191) - ; - out[26 + outpos] = ((in[10 + inpos] >>> 18) & 8191) - ; - out[27 + outpos] = (in[10 + inpos] >>> 31) - | ((in[11 + inpos] & 4095) << (13 - 12)) - ; - out[28 + outpos] = ((in[11 + inpos] >>> 12) & 8191) - ; - out[29 + outpos] = (in[11 + inpos] >>> 25) - | ((in[12 + inpos] & 63) << (13 - 6)) - ; - out[30 + outpos] = ((in[12 + inpos] >>> 6) & 8191) - ; - out[31 + outpos] = (in[12 + inpos] >>> 19) - ; - } + protected static void fastpack17(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 131071) + | ((in[1 + inpos]) << 17); + out[1 + outpos] = ((in[1 + inpos] & 131071) >>> (17 - 2)) + | ((in[2 + inpos] & 131071) << 2) + | ((in[3 + inpos]) << 19); + out[2 + outpos] = ((in[3 + inpos] & 131071) >>> (17 - 4)) + | ((in[4 + inpos] & 131071) << 4) + | ((in[5 + inpos]) << 21); + out[3 + outpos] = ((in[5 + inpos] & 131071) >>> (17 - 6)) + | ((in[6 + inpos] & 131071) << 6) + | ((in[7 + inpos]) << 23); + out[4 + outpos] = ((in[7 + inpos] & 131071) >>> (17 - 8)) + | ((in[8 + inpos] & 131071) << 8) + | ((in[9 + inpos]) << 25); + out[5 + outpos] = ((in[9 + inpos] & 131071) >>> (17 - 10)) + | ((in[10 + inpos] & 131071) << 10) + | ((in[11 + inpos]) << 27); + out[6 + outpos] = ((in[11 + inpos] & 131071) >>> (17 - 12)) + | ((in[12 + inpos] & 131071) << 12) + | ((in[13 + inpos]) << 29); + out[7 + outpos] = ((in[13 + inpos] & 131071) >>> (17 - 14)) + | ((in[14 + inpos] & 131071) << 14) + | ((in[15 + inpos]) << 31); + out[8 + outpos] = ((in[15 + inpos] & 131071) >>> (17 - 16)) + | ((in[16 + inpos]) << 16); + out[9 + outpos] = ((in[16 + inpos] & 131071) >>> (17 - 1)) + | ((in[17 + inpos] & 131071) << 1) + | ((in[18 + inpos]) << 18); + out[10 + outpos] = ((in[18 + inpos] & 131071) >>> (17 - 3)) + | ((in[19 + inpos] & 131071) << 3) + | ((in[20 + inpos]) << 20); + out[11 + outpos] = ((in[20 + inpos] & 131071) >>> (17 - 5)) + | ((in[21 + inpos] & 131071) << 5) + | ((in[22 + inpos]) << 22); + out[12 + outpos] = ((in[22 + inpos] & 131071) >>> (17 - 7)) + | ((in[23 + inpos] & 131071) << 7) + | ((in[24 + inpos]) << 24); + out[13 + outpos] = ((in[24 + inpos] & 131071) >>> (17 - 9)) + | ((in[25 + inpos] & 131071) << 9) + | ((in[26 + inpos]) << 26); + out[14 + outpos] = ((in[26 + inpos] & 131071) >>> (17 - 11)) + | ((in[27 + inpos] & 131071) << 11) + | ((in[28 + inpos]) << 28); + out[15 + outpos] = ((in[28 + inpos] & 131071) >>> (17 - 13)) + | ((in[29 + inpos] & 131071) << 13) + | ((in[30 + inpos]) << 30); + out[16 + outpos] = ((in[30 + inpos] & 131071) >>> (17 - 15)) + | ((in[31 + inpos]) << 15); + } + protected static void fastpack18(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 262143) + | ((in[1 + inpos]) << 18); + out[1 + outpos] = ((in[1 + inpos] & 262143) >>> (18 - 4)) + | ((in[2 + inpos] & 262143) << 4) + | ((in[3 + inpos]) << 22); + out[2 + outpos] = ((in[3 + inpos] & 262143) >>> (18 - 8)) + | ((in[4 + inpos] & 262143) << 8) + | ((in[5 + inpos]) << 26); + out[3 + outpos] = ((in[5 + inpos] & 262143) >>> (18 - 12)) + | ((in[6 + inpos] & 262143) << 12) + | ((in[7 + inpos]) << 30); + out[4 + outpos] = ((in[7 + inpos] & 262143) >>> (18 - 16)) + | ((in[8 + inpos]) << 16); + out[5 + outpos] = ((in[8 + inpos] & 262143) >>> (18 - 2)) + | ((in[9 + inpos] & 262143) << 2) + | ((in[10 + inpos]) << 20); + out[6 + outpos] = ((in[10 + inpos] & 262143) >>> (18 - 6)) + | ((in[11 + inpos] & 262143) << 6) + | ((in[12 + inpos]) << 24); + out[7 + outpos] = ((in[12 + inpos] & 262143) >>> (18 - 10)) + | ((in[13 + inpos] & 262143) << 10) + | ((in[14 + inpos]) << 28); + out[8 + outpos] = ((in[14 + inpos] & 262143) >>> (18 - 14)) + | ((in[15 + inpos]) << 14); + out[9 + outpos] = (in[16 + inpos] & 262143) + | ((in[17 + inpos]) << 18); + out[10 + outpos] = ((in[17 + inpos] & 262143) >>> (18 - 4)) + | ((in[18 + inpos] & 262143) << 4) + | ((in[19 + inpos]) << 22); + out[11 + outpos] = ((in[19 + inpos] & 262143) >>> (18 - 8)) + | ((in[20 + inpos] & 262143) << 8) + | ((in[21 + inpos]) << 26); + out[12 + outpos] = ((in[21 + inpos] & 262143) >>> (18 - 12)) + | ((in[22 + inpos] & 262143) << 12) + | ((in[23 + inpos]) << 30); + out[13 + outpos] = ((in[23 + inpos] & 262143) >>> (18 - 16)) + | ((in[24 + inpos]) << 16); + out[14 + outpos] = ((in[24 + inpos] & 262143) >>> (18 - 2)) + | ((in[25 + inpos] & 262143) << 2) + | ((in[26 + inpos]) << 20); + out[15 + outpos] = ((in[26 + inpos] & 262143) >>> (18 - 6)) + | ((in[27 + inpos] & 262143) << 6) + | ((in[28 + inpos]) << 24); + out[16 + outpos] = ((in[28 + inpos] & 262143) >>> (18 - 10)) + | ((in[29 + inpos] & 262143) << 10) + | ((in[30 + inpos]) << 28); + out[17 + outpos] = ((in[30 + inpos] & 262143) >>> (18 - 14)) + | ((in[31 + inpos]) << 14); + } - protected static void fastunpack14(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 16383) - ; - out[1 + outpos] = ((in[0 + inpos] >>> 14) & 16383) - ; - out[2 + outpos] = (in[0 + inpos] >>> 28) - | ((in[1 + inpos] & 1023) << (14 - 10)) - ; - out[3 + outpos] = ((in[1 + inpos] >>> 10) & 16383) - ; - out[4 + outpos] = (in[1 + inpos] >>> 24) - | ((in[2 + inpos] & 63) << (14 - 6)) - ; - out[5 + outpos] = ((in[2 + inpos] >>> 6) & 16383) - ; - out[6 + outpos] = (in[2 + inpos] >>> 20) - | ((in[3 + inpos] & 3) << (14 - 2)) - ; - out[7 + outpos] = ((in[3 + inpos] >>> 2) & 16383) - ; - out[8 + outpos] = ((in[3 + inpos] >>> 16) & 16383) - ; - out[9 + outpos] = (in[3 + inpos] >>> 30) - | ((in[4 + inpos] & 4095) << (14 - 12)) - ; - out[10 + outpos] = ((in[4 + inpos] >>> 12) & 16383) - ; - out[11 + outpos] = (in[4 + inpos] >>> 26) - | ((in[5 + inpos] & 255) << (14 - 8)) - ; - out[12 + outpos] = ((in[5 + inpos] >>> 8) & 16383) - ; - out[13 + outpos] = (in[5 + inpos] >>> 22) - | ((in[6 + inpos] & 15) << (14 - 4)) - ; - out[14 + outpos] = ((in[6 + inpos] >>> 4) & 16383) - ; - out[15 + outpos] = (in[6 + inpos] >>> 18) - ; - out[16 + outpos] = ((in[7 + inpos] >>> 0) & 16383) - ; - out[17 + outpos] = ((in[7 + inpos] >>> 14) & 16383) - ; - out[18 + outpos] = (in[7 + inpos] >>> 28) - | ((in[8 + inpos] & 1023) << (14 - 10)) - ; - out[19 + outpos] = ((in[8 + inpos] >>> 10) & 16383) - ; - out[20 + outpos] = (in[8 + inpos] >>> 24) - | ((in[9 + inpos] & 63) << (14 - 6)) - ; - out[21 + outpos] = ((in[9 + inpos] >>> 6) & 16383) - ; - out[22 + outpos] = (in[9 + inpos] >>> 20) - | ((in[10 + inpos] & 3) << (14 - 2)) - ; - out[23 + outpos] = ((in[10 + inpos] >>> 2) & 16383) - ; - out[24 + outpos] = ((in[10 + inpos] >>> 16) & 16383) - ; - out[25 + outpos] = (in[10 + inpos] >>> 30) - | ((in[11 + inpos] & 4095) << (14 - 12)) - ; - out[26 + outpos] = ((in[11 + inpos] >>> 12) & 16383) - ; - out[27 + outpos] = (in[11 + inpos] >>> 26) - | ((in[12 + inpos] & 255) << (14 - 8)) - ; - out[28 + outpos] = ((in[12 + inpos] >>> 8) & 16383) - ; - out[29 + outpos] = (in[12 + inpos] >>> 22) - | ((in[13 + inpos] & 15) << (14 - 4)) - ; - out[30 + outpos] = ((in[13 + inpos] >>> 4) & 16383) - ; - out[31 + outpos] = (in[13 + inpos] >>> 18) - ; - } + protected static void fastpack19(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 524287) + | ((in[1 + inpos]) << 19); + out[1 + outpos] = ((in[1 + inpos] & 524287) >>> (19 - 6)) + | ((in[2 + inpos] & 524287) << 6) + | ((in[3 + inpos]) << 25); + out[2 + outpos] = ((in[3 + inpos] & 524287) >>> (19 - 12)) + | ((in[4 + inpos] & 524287) << 12) + | ((in[5 + inpos]) << 31); + out[3 + outpos] = ((in[5 + inpos] & 524287) >>> (19 - 18)) + | ((in[6 + inpos]) << 18); + out[4 + outpos] = ((in[6 + inpos] & 524287) >>> (19 - 5)) + | ((in[7 + inpos] & 524287) << 5) + | ((in[8 + inpos]) << 24); + out[5 + outpos] = ((in[8 + inpos] & 524287) >>> (19 - 11)) + | ((in[9 + inpos] & 524287) << 11) + | ((in[10 + inpos]) << 30); + out[6 + outpos] = ((in[10 + inpos] & 524287) >>> (19 - 17)) + | ((in[11 + inpos]) << 17); + out[7 + outpos] = ((in[11 + inpos] & 524287) >>> (19 - 4)) + | ((in[12 + inpos] & 524287) << 4) + | ((in[13 + inpos]) << 23); + out[8 + outpos] = ((in[13 + inpos] & 524287) >>> (19 - 10)) + | ((in[14 + inpos] & 524287) << 10) + | ((in[15 + inpos]) << 29); + out[9 + outpos] = ((in[15 + inpos] & 524287) >>> (19 - 16)) + | ((in[16 + inpos]) << 16); + out[10 + outpos] = ((in[16 + inpos] & 524287) >>> (19 - 3)) + | ((in[17 + inpos] & 524287) << 3) + | ((in[18 + inpos]) << 22); + out[11 + outpos] = ((in[18 + inpos] & 524287) >>> (19 - 9)) + | ((in[19 + inpos] & 524287) << 9) + | ((in[20 + inpos]) << 28); + out[12 + outpos] = ((in[20 + inpos] & 524287) >>> (19 - 15)) + | ((in[21 + inpos]) << 15); + out[13 + outpos] = ((in[21 + inpos] & 524287) >>> (19 - 2)) + | ((in[22 + inpos] & 524287) << 2) + | ((in[23 + inpos]) << 21); + out[14 + outpos] = ((in[23 + inpos] & 524287) >>> (19 - 8)) + | ((in[24 + inpos] & 524287) << 8) + | ((in[25 + inpos]) << 27); + out[15 + outpos] = ((in[25 + inpos] & 524287) >>> (19 - 14)) + | ((in[26 + inpos]) << 14); + out[16 + outpos] = ((in[26 + inpos] & 524287) >>> (19 - 1)) + | ((in[27 + inpos] & 524287) << 1) + | ((in[28 + inpos]) << 20); + out[17 + outpos] = ((in[28 + inpos] & 524287) >>> (19 - 7)) + | ((in[29 + inpos] & 524287) << 7) + | ((in[30 + inpos]) << 26); + out[18 + outpos] = ((in[30 + inpos] & 524287) >>> (19 - 13)) + | ((in[31 + inpos]) << 13); + } + protected static void fastpack20(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 1048575) + | ((in[1 + inpos]) << 20); + out[1 + outpos] = ((in[1 + inpos] & 1048575) >>> (20 - 8)) + | ((in[2 + inpos] & 1048575) << 8) + | ((in[3 + inpos]) << 28); + out[2 + outpos] = ((in[3 + inpos] & 1048575) >>> (20 - 16)) + | ((in[4 + inpos]) << 16); + out[3 + outpos] = ((in[4 + inpos] & 1048575) >>> (20 - 4)) + | ((in[5 + inpos] & 1048575) << 4) + | ((in[6 + inpos]) << 24); + out[4 + outpos] = ((in[6 + inpos] & 1048575) >>> (20 - 12)) + | ((in[7 + inpos]) << 12); + out[5 + outpos] = (in[8 + inpos] & 1048575) + | ((in[9 + inpos]) << 20); + out[6 + outpos] = ((in[9 + inpos] & 1048575) >>> (20 - 8)) + | ((in[10 + inpos] & 1048575) << 8) + | ((in[11 + inpos]) << 28); + out[7 + outpos] = ((in[11 + inpos] & 1048575) >>> (20 - 16)) + | ((in[12 + inpos]) << 16); + out[8 + outpos] = ((in[12 + inpos] & 1048575) >>> (20 - 4)) + | ((in[13 + inpos] & 1048575) << 4) + | ((in[14 + inpos]) << 24); + out[9 + outpos] = ((in[14 + inpos] & 1048575) >>> (20 - 12)) + | ((in[15 + inpos]) << 12); + out[10 + outpos] = (in[16 + inpos] & 1048575) + | ((in[17 + inpos]) << 20); + out[11 + outpos] = ((in[17 + inpos] & 1048575) >>> (20 - 8)) + | ((in[18 + inpos] & 1048575) << 8) + | ((in[19 + inpos]) << 28); + out[12 + outpos] = ((in[19 + inpos] & 1048575) >>> (20 - 16)) + | ((in[20 + inpos]) << 16); + out[13 + outpos] = ((in[20 + inpos] & 1048575) >>> (20 - 4)) + | ((in[21 + inpos] & 1048575) << 4) + | ((in[22 + inpos]) << 24); + out[14 + outpos] = ((in[22 + inpos] & 1048575) >>> (20 - 12)) + | ((in[23 + inpos]) << 12); + out[15 + outpos] = (in[24 + inpos] & 1048575) + | ((in[25 + inpos]) << 20); + out[16 + outpos] = ((in[25 + inpos] & 1048575) >>> (20 - 8)) + | ((in[26 + inpos] & 1048575) << 8) + | ((in[27 + inpos]) << 28); + out[17 + outpos] = ((in[27 + inpos] & 1048575) >>> (20 - 16)) + | ((in[28 + inpos]) << 16); + out[18 + outpos] = ((in[28 + inpos] & 1048575) >>> (20 - 4)) + | ((in[29 + inpos] & 1048575) << 4) + | ((in[30 + inpos]) << 24); + out[19 + outpos] = ((in[30 + inpos] & 1048575) >>> (20 - 12)) + | ((in[31 + inpos]) << 12); + } - protected static void fastunpack15(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 32767) - ; - out[1 + outpos] = ((in[0 + inpos] >>> 15) & 32767) - ; - out[2 + outpos] = (in[0 + inpos] >>> 30) - | ((in[1 + inpos] & 8191) << (15 - 13)) - ; - out[3 + outpos] = ((in[1 + inpos] >>> 13) & 32767) - ; - out[4 + outpos] = (in[1 + inpos] >>> 28) - | ((in[2 + inpos] & 2047) << (15 - 11)) - ; - out[5 + outpos] = ((in[2 + inpos] >>> 11) & 32767) - ; - out[6 + outpos] = (in[2 + inpos] >>> 26) - | ((in[3 + inpos] & 511) << (15 - 9)) - ; - out[7 + outpos] = ((in[3 + inpos] >>> 9) & 32767) - ; - out[8 + outpos] = (in[3 + inpos] >>> 24) - | ((in[4 + inpos] & 127) << (15 - 7)) - ; - out[9 + outpos] = ((in[4 + inpos] >>> 7) & 32767) - ; - out[10 + outpos] = (in[4 + inpos] >>> 22) - | ((in[5 + inpos] & 31) << (15 - 5)) - ; - out[11 + outpos] = ((in[5 + inpos] >>> 5) & 32767) - ; - out[12 + outpos] = (in[5 + inpos] >>> 20) - | ((in[6 + inpos] & 7) << (15 - 3)) - ; - out[13 + outpos] = ((in[6 + inpos] >>> 3) & 32767) - ; - out[14 + outpos] = (in[6 + inpos] >>> 18) - | ((in[7 + inpos] & 1) << (15 - 1)) - ; - out[15 + outpos] = ((in[7 + inpos] >>> 1) & 32767) - ; - out[16 + outpos] = ((in[7 + inpos] >>> 16) & 32767) - ; - out[17 + outpos] = (in[7 + inpos] >>> 31) - | ((in[8 + inpos] & 16383) << (15 - 14)) - ; - out[18 + outpos] = ((in[8 + inpos] >>> 14) & 32767) - ; - out[19 + outpos] = (in[8 + inpos] >>> 29) - | ((in[9 + inpos] & 4095) << (15 - 12)) - ; - out[20 + outpos] = ((in[9 + inpos] >>> 12) & 32767) - ; - out[21 + outpos] = (in[9 + inpos] >>> 27) - | ((in[10 + inpos] & 1023) << (15 - 10)) - ; - out[22 + outpos] = ((in[10 + inpos] >>> 10) & 32767) - ; - out[23 + outpos] = (in[10 + inpos] >>> 25) - | ((in[11 + inpos] & 255) << (15 - 8)) - ; - out[24 + outpos] = ((in[11 + inpos] >>> 8) & 32767) - ; - out[25 + outpos] = (in[11 + inpos] >>> 23) - | ((in[12 + inpos] & 63) << (15 - 6)) - ; - out[26 + outpos] = ((in[12 + inpos] >>> 6) & 32767) - ; - out[27 + outpos] = (in[12 + inpos] >>> 21) - | ((in[13 + inpos] & 15) << (15 - 4)) - ; - out[28 + outpos] = ((in[13 + inpos] >>> 4) & 32767) - ; - out[29 + outpos] = (in[13 + inpos] >>> 19) - | ((in[14 + inpos] & 3) << (15 - 2)) - ; - out[30 + outpos] = ((in[14 + inpos] >>> 2) & 32767) - ; - out[31 + outpos] = (in[14 + inpos] >>> 17) - ; - } + protected static void fastpack21(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 2097151) + | ((in[1 + inpos]) << 21); + out[1 + outpos] = ((in[1 + inpos] & 2097151) >>> (21 - 10)) + | ((in[2 + inpos] & 2097151) << 10) + | ((in[3 + inpos]) << 31); + out[2 + outpos] = ((in[3 + inpos] & 2097151) >>> (21 - 20)) + | ((in[4 + inpos]) << 20); + out[3 + outpos] = ((in[4 + inpos] & 2097151) >>> (21 - 9)) + | ((in[5 + inpos] & 2097151) << 9) + | ((in[6 + inpos]) << 30); + out[4 + outpos] = ((in[6 + inpos] & 2097151) >>> (21 - 19)) + | ((in[7 + inpos]) << 19); + out[5 + outpos] = ((in[7 + inpos] & 2097151) >>> (21 - 8)) + | ((in[8 + inpos] & 2097151) << 8) + | ((in[9 + inpos]) << 29); + out[6 + outpos] = ((in[9 + inpos] & 2097151) >>> (21 - 18)) + | ((in[10 + inpos]) << 18); + out[7 + outpos] = ((in[10 + inpos] & 2097151) >>> (21 - 7)) + | ((in[11 + inpos] & 2097151) << 7) + | ((in[12 + inpos]) << 28); + out[8 + outpos] = ((in[12 + inpos] & 2097151) >>> (21 - 17)) + | ((in[13 + inpos]) << 17); + out[9 + outpos] = ((in[13 + inpos] & 2097151) >>> (21 - 6)) + | ((in[14 + inpos] & 2097151) << 6) + | ((in[15 + inpos]) << 27); + out[10 + outpos] = ((in[15 + inpos] & 2097151) >>> (21 - 16)) + | ((in[16 + inpos]) << 16); + out[11 + outpos] = ((in[16 + inpos] & 2097151) >>> (21 - 5)) + | ((in[17 + inpos] & 2097151) << 5) + | ((in[18 + inpos]) << 26); + out[12 + outpos] = ((in[18 + inpos] & 2097151) >>> (21 - 15)) + | ((in[19 + inpos]) << 15); + out[13 + outpos] = ((in[19 + inpos] & 2097151) >>> (21 - 4)) + | ((in[20 + inpos] & 2097151) << 4) + | ((in[21 + inpos]) << 25); + out[14 + outpos] = ((in[21 + inpos] & 2097151) >>> (21 - 14)) + | ((in[22 + inpos]) << 14); + out[15 + outpos] = ((in[22 + inpos] & 2097151) >>> (21 - 3)) + | ((in[23 + inpos] & 2097151) << 3) + | ((in[24 + inpos]) << 24); + out[16 + outpos] = ((in[24 + inpos] & 2097151) >>> (21 - 13)) + | ((in[25 + inpos]) << 13); + out[17 + outpos] = ((in[25 + inpos] & 2097151) >>> (21 - 2)) + | ((in[26 + inpos] & 2097151) << 2) + | ((in[27 + inpos]) << 23); + out[18 + outpos] = ((in[27 + inpos] & 2097151) >>> (21 - 12)) + | ((in[28 + inpos]) << 12); + out[19 + outpos] = ((in[28 + inpos] & 2097151) >>> (21 - 1)) + | ((in[29 + inpos] & 2097151) << 1) + | ((in[30 + inpos]) << 22); + out[20 + outpos] = ((in[30 + inpos] & 2097151) >>> (21 - 11)) + | ((in[31 + inpos]) << 11); + } + protected static void fastpack22(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 4194303) + | ((in[1 + inpos]) << 22); + out[1 + outpos] = ((in[1 + inpos] & 4194303) >>> (22 - 12)) + | ((in[2 + inpos]) << 12); + out[2 + outpos] = ((in[2 + inpos] & 4194303) >>> (22 - 2)) + | ((in[3 + inpos] & 4194303) << 2) + | ((in[4 + inpos]) << 24); + out[3 + outpos] = ((in[4 + inpos] & 4194303) >>> (22 - 14)) + | ((in[5 + inpos]) << 14); + out[4 + outpos] = ((in[5 + inpos] & 4194303) >>> (22 - 4)) + | ((in[6 + inpos] & 4194303) << 4) + | ((in[7 + inpos]) << 26); + out[5 + outpos] = ((in[7 + inpos] & 4194303) >>> (22 - 16)) + | ((in[8 + inpos]) << 16); + out[6 + outpos] = ((in[8 + inpos] & 4194303) >>> (22 - 6)) + | ((in[9 + inpos] & 4194303) << 6) + | ((in[10 + inpos]) << 28); + out[7 + outpos] = ((in[10 + inpos] & 4194303) >>> (22 - 18)) + | ((in[11 + inpos]) << 18); + out[8 + outpos] = ((in[11 + inpos] & 4194303) >>> (22 - 8)) + | ((in[12 + inpos] & 4194303) << 8) + | ((in[13 + inpos]) << 30); + out[9 + outpos] = ((in[13 + inpos] & 4194303) >>> (22 - 20)) + | ((in[14 + inpos]) << 20); + out[10 + outpos] = ((in[14 + inpos] & 4194303) >>> (22 - 10)) + | ((in[15 + inpos]) << 10); + out[11 + outpos] = (in[16 + inpos] & 4194303) + | ((in[17 + inpos]) << 22); + out[12 + outpos] = ((in[17 + inpos] & 4194303) >>> (22 - 12)) + | ((in[18 + inpos]) << 12); + out[13 + outpos] = ((in[18 + inpos] & 4194303) >>> (22 - 2)) + | ((in[19 + inpos] & 4194303) << 2) + | ((in[20 + inpos]) << 24); + out[14 + outpos] = ((in[20 + inpos] & 4194303) >>> (22 - 14)) + | ((in[21 + inpos]) << 14); + out[15 + outpos] = ((in[21 + inpos] & 4194303) >>> (22 - 4)) + | ((in[22 + inpos] & 4194303) << 4) + | ((in[23 + inpos]) << 26); + out[16 + outpos] = ((in[23 + inpos] & 4194303) >>> (22 - 16)) + | ((in[24 + inpos]) << 16); + out[17 + outpos] = ((in[24 + inpos] & 4194303) >>> (22 - 6)) + | ((in[25 + inpos] & 4194303) << 6) + | ((in[26 + inpos]) << 28); + out[18 + outpos] = ((in[26 + inpos] & 4194303) >>> (22 - 18)) + | ((in[27 + inpos]) << 18); + out[19 + outpos] = ((in[27 + inpos] & 4194303) >>> (22 - 8)) + | ((in[28 + inpos] & 4194303) << 8) + | ((in[29 + inpos]) << 30); + out[20 + outpos] = ((in[29 + inpos] & 4194303) >>> (22 - 20)) + | ((in[30 + inpos]) << 20); + out[21 + outpos] = ((in[30 + inpos] & 4194303) >>> (22 - 10)) + | ((in[31 + inpos]) << 10); + } - protected static void fastunpack16(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 65535) - ; - out[1 + outpos] = (in[0 + inpos] >>> 16) - ; - out[2 + outpos] = ((in[1 + inpos] >>> 0) & 65535) - ; - out[3 + outpos] = (in[1 + inpos] >>> 16) - ; - out[4 + outpos] = ((in[2 + inpos] >>> 0) & 65535) - ; - out[5 + outpos] = (in[2 + inpos] >>> 16) - ; - out[6 + outpos] = ((in[3 + inpos] >>> 0) & 65535) - ; - out[7 + outpos] = (in[3 + inpos] >>> 16) - ; - out[8 + outpos] = ((in[4 + inpos] >>> 0) & 65535) - ; - out[9 + outpos] = (in[4 + inpos] >>> 16) - ; - out[10 + outpos] = ((in[5 + inpos] >>> 0) & 65535) - ; - out[11 + outpos] = (in[5 + inpos] >>> 16) - ; - out[12 + outpos] = ((in[6 + inpos] >>> 0) & 65535) - ; - out[13 + outpos] = (in[6 + inpos] >>> 16) - ; - out[14 + outpos] = ((in[7 + inpos] >>> 0) & 65535) - ; - out[15 + outpos] = (in[7 + inpos] >>> 16) - ; - out[16 + outpos] = ((in[8 + inpos] >>> 0) & 65535) - ; - out[17 + outpos] = (in[8 + inpos] >>> 16) - ; - out[18 + outpos] = ((in[9 + inpos] >>> 0) & 65535) - ; - out[19 + outpos] = (in[9 + inpos] >>> 16) - ; - out[20 + outpos] = ((in[10 + inpos] >>> 0) & 65535) - ; - out[21 + outpos] = (in[10 + inpos] >>> 16) - ; - out[22 + outpos] = ((in[11 + inpos] >>> 0) & 65535) - ; - out[23 + outpos] = (in[11 + inpos] >>> 16) - ; - out[24 + outpos] = ((in[12 + inpos] >>> 0) & 65535) - ; - out[25 + outpos] = (in[12 + inpos] >>> 16) - ; - out[26 + outpos] = ((in[13 + inpos] >>> 0) & 65535) - ; - out[27 + outpos] = (in[13 + inpos] >>> 16) - ; - out[28 + outpos] = ((in[14 + inpos] >>> 0) & 65535) - ; - out[29 + outpos] = (in[14 + inpos] >>> 16) - ; - out[30 + outpos] = ((in[15 + inpos] >>> 0) & 65535) - ; - out[31 + outpos] = (in[15 + inpos] >>> 16) - ; - } + protected static void fastpack23(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 8388607) + | ((in[1 + inpos]) << 23); + out[1 + outpos] = ((in[1 + inpos] & 8388607) >>> (23 - 14)) + | ((in[2 + inpos]) << 14); + out[2 + outpos] = ((in[2 + inpos] & 8388607) >>> (23 - 5)) + | ((in[3 + inpos] & 8388607) << 5) + | ((in[4 + inpos]) << 28); + out[3 + outpos] = ((in[4 + inpos] & 8388607) >>> (23 - 19)) + | ((in[5 + inpos]) << 19); + out[4 + outpos] = ((in[5 + inpos] & 8388607) >>> (23 - 10)) + | ((in[6 + inpos]) << 10); + out[5 + outpos] = ((in[6 + inpos] & 8388607) >>> (23 - 1)) + | ((in[7 + inpos] & 8388607) << 1) + | ((in[8 + inpos]) << 24); + out[6 + outpos] = ((in[8 + inpos] & 8388607) >>> (23 - 15)) + | ((in[9 + inpos]) << 15); + out[7 + outpos] = ((in[9 + inpos] & 8388607) >>> (23 - 6)) + | ((in[10 + inpos] & 8388607) << 6) + | ((in[11 + inpos]) << 29); + out[8 + outpos] = ((in[11 + inpos] & 8388607) >>> (23 - 20)) + | ((in[12 + inpos]) << 20); + out[9 + outpos] = ((in[12 + inpos] & 8388607) >>> (23 - 11)) + | ((in[13 + inpos]) << 11); + out[10 + outpos] = ((in[13 + inpos] & 8388607) >>> (23 - 2)) + | ((in[14 + inpos] & 8388607) << 2) + | ((in[15 + inpos]) << 25); + out[11 + outpos] = ((in[15 + inpos] & 8388607) >>> (23 - 16)) + | ((in[16 + inpos]) << 16); + out[12 + outpos] = ((in[16 + inpos] & 8388607) >>> (23 - 7)) + | ((in[17 + inpos] & 8388607) << 7) + | ((in[18 + inpos]) << 30); + out[13 + outpos] = ((in[18 + inpos] & 8388607) >>> (23 - 21)) + | ((in[19 + inpos]) << 21); + out[14 + outpos] = ((in[19 + inpos] & 8388607) >>> (23 - 12)) + | ((in[20 + inpos]) << 12); + out[15 + outpos] = ((in[20 + inpos] & 8388607) >>> (23 - 3)) + | ((in[21 + inpos] & 8388607) << 3) + | ((in[22 + inpos]) << 26); + out[16 + outpos] = ((in[22 + inpos] & 8388607) >>> (23 - 17)) + | ((in[23 + inpos]) << 17); + out[17 + outpos] = ((in[23 + inpos] & 8388607) >>> (23 - 8)) + | ((in[24 + inpos] & 8388607) << 8) + | ((in[25 + inpos]) << 31); + out[18 + outpos] = ((in[25 + inpos] & 8388607) >>> (23 - 22)) + | ((in[26 + inpos]) << 22); + out[19 + outpos] = ((in[26 + inpos] & 8388607) >>> (23 - 13)) + | ((in[27 + inpos]) << 13); + out[20 + outpos] = ((in[27 + inpos] & 8388607) >>> (23 - 4)) + | ((in[28 + inpos] & 8388607) << 4) + | ((in[29 + inpos]) << 27); + out[21 + outpos] = ((in[29 + inpos] & 8388607) >>> (23 - 18)) + | ((in[30 + inpos]) << 18); + out[22 + outpos] = ((in[30 + inpos] & 8388607) >>> (23 - 9)) + | ((in[31 + inpos]) << 9); + } + protected static void fastpack24(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 16777215) + | ((in[1 + inpos]) << 24); + out[1 + outpos] = ((in[1 + inpos] & 16777215) >>> (24 - 16)) + | ((in[2 + inpos]) << 16); + out[2 + outpos] = ((in[2 + inpos] & 16777215) >>> (24 - 8)) + | ((in[3 + inpos]) << 8); + out[3 + outpos] = (in[4 + inpos] & 16777215) + | ((in[5 + inpos]) << 24); + out[4 + outpos] = ((in[5 + inpos] & 16777215) >>> (24 - 16)) + | ((in[6 + inpos]) << 16); + out[5 + outpos] = ((in[6 + inpos] & 16777215) >>> (24 - 8)) + | ((in[7 + inpos]) << 8); + out[6 + outpos] = (in[8 + inpos] & 16777215) + | ((in[9 + inpos]) << 24); + out[7 + outpos] = ((in[9 + inpos] & 16777215) >>> (24 - 16)) + | ((in[10 + inpos]) << 16); + out[8 + outpos] = ((in[10 + inpos] & 16777215) >>> (24 - 8)) + | ((in[11 + inpos]) << 8); + out[9 + outpos] = (in[12 + inpos] & 16777215) + | ((in[13 + inpos]) << 24); + out[10 + outpos] = ((in[13 + inpos] & 16777215) >>> (24 - 16)) + | ((in[14 + inpos]) << 16); + out[11 + outpos] = ((in[14 + inpos] & 16777215) >>> (24 - 8)) + | ((in[15 + inpos]) << 8); + out[12 + outpos] = (in[16 + inpos] & 16777215) + | ((in[17 + inpos]) << 24); + out[13 + outpos] = ((in[17 + inpos] & 16777215) >>> (24 - 16)) + | ((in[18 + inpos]) << 16); + out[14 + outpos] = ((in[18 + inpos] & 16777215) >>> (24 - 8)) + | ((in[19 + inpos]) << 8); + out[15 + outpos] = (in[20 + inpos] & 16777215) + | ((in[21 + inpos]) << 24); + out[16 + outpos] = ((in[21 + inpos] & 16777215) >>> (24 - 16)) + | ((in[22 + inpos]) << 16); + out[17 + outpos] = ((in[22 + inpos] & 16777215) >>> (24 - 8)) + | ((in[23 + inpos]) << 8); + out[18 + outpos] = (in[24 + inpos] & 16777215) + | ((in[25 + inpos]) << 24); + out[19 + outpos] = ((in[25 + inpos] & 16777215) >>> (24 - 16)) + | ((in[26 + inpos]) << 16); + out[20 + outpos] = ((in[26 + inpos] & 16777215) >>> (24 - 8)) + | ((in[27 + inpos]) << 8); + out[21 + outpos] = (in[28 + inpos] & 16777215) + | ((in[29 + inpos]) << 24); + out[22 + outpos] = ((in[29 + inpos] & 16777215) >>> (24 - 16)) + | ((in[30 + inpos]) << 16); + out[23 + outpos] = ((in[30 + inpos] & 16777215) >>> (24 - 8)) + | ((in[31 + inpos]) << 8); + } - protected static void fastunpack17(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 131071) - ; - out[1 + outpos] = (in[0 + inpos] >>> 17) - | ((in[1 + inpos] & 3) << (17 - 2)) - ; - out[2 + outpos] = ((in[1 + inpos] >>> 2) & 131071) - ; - out[3 + outpos] = (in[1 + inpos] >>> 19) - | ((in[2 + inpos] & 15) << (17 - 4)) - ; - out[4 + outpos] = ((in[2 + inpos] >>> 4) & 131071) - ; - out[5 + outpos] = (in[2 + inpos] >>> 21) - | ((in[3 + inpos] & 63) << (17 - 6)) - ; - out[6 + outpos] = ((in[3 + inpos] >>> 6) & 131071) - ; - out[7 + outpos] = (in[3 + inpos] >>> 23) - | ((in[4 + inpos] & 255) << (17 - 8)) - ; - out[8 + outpos] = ((in[4 + inpos] >>> 8) & 131071) - ; - out[9 + outpos] = (in[4 + inpos] >>> 25) - | ((in[5 + inpos] & 1023) << (17 - 10)) - ; - out[10 + outpos] = ((in[5 + inpos] >>> 10) & 131071) - ; - out[11 + outpos] = (in[5 + inpos] >>> 27) - | ((in[6 + inpos] & 4095) << (17 - 12)) - ; - out[12 + outpos] = ((in[6 + inpos] >>> 12) & 131071) - ; - out[13 + outpos] = (in[6 + inpos] >>> 29) - | ((in[7 + inpos] & 16383) << (17 - 14)) - ; - out[14 + outpos] = ((in[7 + inpos] >>> 14) & 131071) - ; - out[15 + outpos] = (in[7 + inpos] >>> 31) - | ((in[8 + inpos] & 65535) << (17 - 16)) - ; - out[16 + outpos] = (in[8 + inpos] >>> 16) - | ((in[9 + inpos] & 1) << (17 - 1)) - ; - out[17 + outpos] = ((in[9 + inpos] >>> 1) & 131071) - ; - out[18 + outpos] = (in[9 + inpos] >>> 18) - | ((in[10 + inpos] & 7) << (17 - 3)) - ; - out[19 + outpos] = ((in[10 + inpos] >>> 3) & 131071) - ; - out[20 + outpos] = (in[10 + inpos] >>> 20) - | ((in[11 + inpos] & 31) << (17 - 5)) - ; - out[21 + outpos] = ((in[11 + inpos] >>> 5) & 131071) - ; - out[22 + outpos] = (in[11 + inpos] >>> 22) - | ((in[12 + inpos] & 127) << (17 - 7)) - ; - out[23 + outpos] = ((in[12 + inpos] >>> 7) & 131071) - ; - out[24 + outpos] = (in[12 + inpos] >>> 24) - | ((in[13 + inpos] & 511) << (17 - 9)) - ; - out[25 + outpos] = ((in[13 + inpos] >>> 9) & 131071) - ; - out[26 + outpos] = (in[13 + inpos] >>> 26) - | ((in[14 + inpos] & 2047) << (17 - 11)) - ; - out[27 + outpos] = ((in[14 + inpos] >>> 11) & 131071) - ; - out[28 + outpos] = (in[14 + inpos] >>> 28) - | ((in[15 + inpos] & 8191) << (17 - 13)) - ; - out[29 + outpos] = ((in[15 + inpos] >>> 13) & 131071) - ; - out[30 + outpos] = (in[15 + inpos] >>> 30) - | ((in[16 + inpos] & 32767) << (17 - 15)) - ; - out[31 + outpos] = (in[16 + inpos] >>> 15) - ; - } + protected static void fastpack25(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 33554431) + | ((in[1 + inpos]) << 25); + out[1 + outpos] = ((in[1 + inpos] & 33554431) >>> (25 - 18)) + | ((in[2 + inpos]) << 18); + out[2 + outpos] = ((in[2 + inpos] & 33554431) >>> (25 - 11)) + | ((in[3 + inpos]) << 11); + out[3 + outpos] = ((in[3 + inpos] & 33554431) >>> (25 - 4)) + | ((in[4 + inpos] & 33554431) << 4) + | ((in[5 + inpos]) << 29); + out[4 + outpos] = ((in[5 + inpos] & 33554431) >>> (25 - 22)) + | ((in[6 + inpos]) << 22); + out[5 + outpos] = ((in[6 + inpos] & 33554431) >>> (25 - 15)) + | ((in[7 + inpos]) << 15); + out[6 + outpos] = ((in[7 + inpos] & 33554431) >>> (25 - 8)) + | ((in[8 + inpos]) << 8); + out[7 + outpos] = ((in[8 + inpos] & 33554431) >>> (25 - 1)) + | ((in[9 + inpos] & 33554431) << 1) + | ((in[10 + inpos]) << 26); + out[8 + outpos] = ((in[10 + inpos] & 33554431) >>> (25 - 19)) + | ((in[11 + inpos]) << 19); + out[9 + outpos] = ((in[11 + inpos] & 33554431) >>> (25 - 12)) + | ((in[12 + inpos]) << 12); + out[10 + outpos] = ((in[12 + inpos] & 33554431) >>> (25 - 5)) + | ((in[13 + inpos] & 33554431) << 5) + | ((in[14 + inpos]) << 30); + out[11 + outpos] = ((in[14 + inpos] & 33554431) >>> (25 - 23)) + | ((in[15 + inpos]) << 23); + out[12 + outpos] = ((in[15 + inpos] & 33554431) >>> (25 - 16)) + | ((in[16 + inpos]) << 16); + out[13 + outpos] = ((in[16 + inpos] & 33554431) >>> (25 - 9)) + | ((in[17 + inpos]) << 9); + out[14 + outpos] = ((in[17 + inpos] & 33554431) >>> (25 - 2)) + | ((in[18 + inpos] & 33554431) << 2) + | ((in[19 + inpos]) << 27); + out[15 + outpos] = ((in[19 + inpos] & 33554431) >>> (25 - 20)) + | ((in[20 + inpos]) << 20); + out[16 + outpos] = ((in[20 + inpos] & 33554431) >>> (25 - 13)) + | ((in[21 + inpos]) << 13); + out[17 + outpos] = ((in[21 + inpos] & 33554431) >>> (25 - 6)) + | ((in[22 + inpos] & 33554431) << 6) + | ((in[23 + inpos]) << 31); + out[18 + outpos] = ((in[23 + inpos] & 33554431) >>> (25 - 24)) + | ((in[24 + inpos]) << 24); + out[19 + outpos] = ((in[24 + inpos] & 33554431) >>> (25 - 17)) + | ((in[25 + inpos]) << 17); + out[20 + outpos] = ((in[25 + inpos] & 33554431) >>> (25 - 10)) + | ((in[26 + inpos]) << 10); + out[21 + outpos] = ((in[26 + inpos] & 33554431) >>> (25 - 3)) + | ((in[27 + inpos] & 33554431) << 3) + | ((in[28 + inpos]) << 28); + out[22 + outpos] = ((in[28 + inpos] & 33554431) >>> (25 - 21)) + | ((in[29 + inpos]) << 21); + out[23 + outpos] = ((in[29 + inpos] & 33554431) >>> (25 - 14)) + | ((in[30 + inpos]) << 14); + out[24 + outpos] = ((in[30 + inpos] & 33554431) >>> (25 - 7)) + | ((in[31 + inpos]) << 7); + } + protected static void fastpack26(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 67108863) + | ((in[1 + inpos]) << 26); + out[1 + outpos] = ((in[1 + inpos] & 67108863) >>> (26 - 20)) + | ((in[2 + inpos]) << 20); + out[2 + outpos] = ((in[2 + inpos] & 67108863) >>> (26 - 14)) + | ((in[3 + inpos]) << 14); + out[3 + outpos] = ((in[3 + inpos] & 67108863) >>> (26 - 8)) + | ((in[4 + inpos]) << 8); + out[4 + outpos] = ((in[4 + inpos] & 67108863) >>> (26 - 2)) + | ((in[5 + inpos] & 67108863) << 2) + | ((in[6 + inpos]) << 28); + out[5 + outpos] = ((in[6 + inpos] & 67108863) >>> (26 - 22)) + | ((in[7 + inpos]) << 22); + out[6 + outpos] = ((in[7 + inpos] & 67108863) >>> (26 - 16)) + | ((in[8 + inpos]) << 16); + out[7 + outpos] = ((in[8 + inpos] & 67108863) >>> (26 - 10)) + | ((in[9 + inpos]) << 10); + out[8 + outpos] = ((in[9 + inpos] & 67108863) >>> (26 - 4)) + | ((in[10 + inpos] & 67108863) << 4) + | ((in[11 + inpos]) << 30); + out[9 + outpos] = ((in[11 + inpos] & 67108863) >>> (26 - 24)) + | ((in[12 + inpos]) << 24); + out[10 + outpos] = ((in[12 + inpos] & 67108863) >>> (26 - 18)) + | ((in[13 + inpos]) << 18); + out[11 + outpos] = ((in[13 + inpos] & 67108863) >>> (26 - 12)) + | ((in[14 + inpos]) << 12); + out[12 + outpos] = ((in[14 + inpos] & 67108863) >>> (26 - 6)) + | ((in[15 + inpos]) << 6); + out[13 + outpos] = (in[16 + inpos] & 67108863) + | ((in[17 + inpos]) << 26); + out[14 + outpos] = ((in[17 + inpos] & 67108863) >>> (26 - 20)) + | ((in[18 + inpos]) << 20); + out[15 + outpos] = ((in[18 + inpos] & 67108863) >>> (26 - 14)) + | ((in[19 + inpos]) << 14); + out[16 + outpos] = ((in[19 + inpos] & 67108863) >>> (26 - 8)) + | ((in[20 + inpos]) << 8); + out[17 + outpos] = ((in[20 + inpos] & 67108863) >>> (26 - 2)) + | ((in[21 + inpos] & 67108863) << 2) + | ((in[22 + inpos]) << 28); + out[18 + outpos] = ((in[22 + inpos] & 67108863) >>> (26 - 22)) + | ((in[23 + inpos]) << 22); + out[19 + outpos] = ((in[23 + inpos] & 67108863) >>> (26 - 16)) + | ((in[24 + inpos]) << 16); + out[20 + outpos] = ((in[24 + inpos] & 67108863) >>> (26 - 10)) + | ((in[25 + inpos]) << 10); + out[21 + outpos] = ((in[25 + inpos] & 67108863) >>> (26 - 4)) + | ((in[26 + inpos] & 67108863) << 4) + | ((in[27 + inpos]) << 30); + out[22 + outpos] = ((in[27 + inpos] & 67108863) >>> (26 - 24)) + | ((in[28 + inpos]) << 24); + out[23 + outpos] = ((in[28 + inpos] & 67108863) >>> (26 - 18)) + | ((in[29 + inpos]) << 18); + out[24 + outpos] = ((in[29 + inpos] & 67108863) >>> (26 - 12)) + | ((in[30 + inpos]) << 12); + out[25 + outpos] = ((in[30 + inpos] & 67108863) >>> (26 - 6)) + | ((in[31 + inpos]) << 6); + } - protected static void fastunpack18(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 262143) - ; - out[1 + outpos] = (in[0 + inpos] >>> 18) - | ((in[1 + inpos] & 15) << (18 - 4)) - ; - out[2 + outpos] = ((in[1 + inpos] >>> 4) & 262143) - ; - out[3 + outpos] = (in[1 + inpos] >>> 22) - | ((in[2 + inpos] & 255) << (18 - 8)) - ; - out[4 + outpos] = ((in[2 + inpos] >>> 8) & 262143) - ; - out[5 + outpos] = (in[2 + inpos] >>> 26) - | ((in[3 + inpos] & 4095) << (18 - 12)) - ; - out[6 + outpos] = ((in[3 + inpos] >>> 12) & 262143) - ; - out[7 + outpos] = (in[3 + inpos] >>> 30) - | ((in[4 + inpos] & 65535) << (18 - 16)) - ; - out[8 + outpos] = (in[4 + inpos] >>> 16) - | ((in[5 + inpos] & 3) << (18 - 2)) - ; - out[9 + outpos] = ((in[5 + inpos] >>> 2) & 262143) - ; - out[10 + outpos] = (in[5 + inpos] >>> 20) - | ((in[6 + inpos] & 63) << (18 - 6)) - ; - out[11 + outpos] = ((in[6 + inpos] >>> 6) & 262143) - ; - out[12 + outpos] = (in[6 + inpos] >>> 24) - | ((in[7 + inpos] & 1023) << (18 - 10)) - ; - out[13 + outpos] = ((in[7 + inpos] >>> 10) & 262143) - ; - out[14 + outpos] = (in[7 + inpos] >>> 28) - | ((in[8 + inpos] & 16383) << (18 - 14)) - ; - out[15 + outpos] = (in[8 + inpos] >>> 14) - ; - out[16 + outpos] = ((in[9 + inpos] >>> 0) & 262143) - ; - out[17 + outpos] = (in[9 + inpos] >>> 18) - | ((in[10 + inpos] & 15) << (18 - 4)) - ; - out[18 + outpos] = ((in[10 + inpos] >>> 4) & 262143) - ; - out[19 + outpos] = (in[10 + inpos] >>> 22) - | ((in[11 + inpos] & 255) << (18 - 8)) - ; - out[20 + outpos] = ((in[11 + inpos] >>> 8) & 262143) - ; - out[21 + outpos] = (in[11 + inpos] >>> 26) - | ((in[12 + inpos] & 4095) << (18 - 12)) - ; - out[22 + outpos] = ((in[12 + inpos] >>> 12) & 262143) - ; - out[23 + outpos] = (in[12 + inpos] >>> 30) - | ((in[13 + inpos] & 65535) << (18 - 16)) - ; - out[24 + outpos] = (in[13 + inpos] >>> 16) - | ((in[14 + inpos] & 3) << (18 - 2)) - ; - out[25 + outpos] = ((in[14 + inpos] >>> 2) & 262143) - ; - out[26 + outpos] = (in[14 + inpos] >>> 20) - | ((in[15 + inpos] & 63) << (18 - 6)) - ; - out[27 + outpos] = ((in[15 + inpos] >>> 6) & 262143) - ; - out[28 + outpos] = (in[15 + inpos] >>> 24) - | ((in[16 + inpos] & 1023) << (18 - 10)) - ; - out[29 + outpos] = ((in[16 + inpos] >>> 10) & 262143) - ; - out[30 + outpos] = (in[16 + inpos] >>> 28) - | ((in[17 + inpos] & 16383) << (18 - 14)) - ; - out[31 + outpos] = (in[17 + inpos] >>> 14) - ; - } + protected static void fastpack27(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 134217727) + | ((in[1 + inpos]) << 27); + out[1 + outpos] = ((in[1 + inpos] & 134217727) >>> (27 - 22)) + | ((in[2 + inpos]) << 22); + out[2 + outpos] = ((in[2 + inpos] & 134217727) >>> (27 - 17)) + | ((in[3 + inpos]) << 17); + out[3 + outpos] = ((in[3 + inpos] & 134217727) >>> (27 - 12)) + | ((in[4 + inpos]) << 12); + out[4 + outpos] = ((in[4 + inpos] & 134217727) >>> (27 - 7)) + | ((in[5 + inpos]) << 7); + out[5 + outpos] = ((in[5 + inpos] & 134217727) >>> (27 - 2)) + | ((in[6 + inpos] & 134217727) << 2) + | ((in[7 + inpos]) << 29); + out[6 + outpos] = ((in[7 + inpos] & 134217727) >>> (27 - 24)) + | ((in[8 + inpos]) << 24); + out[7 + outpos] = ((in[8 + inpos] & 134217727) >>> (27 - 19)) + | ((in[9 + inpos]) << 19); + out[8 + outpos] = ((in[9 + inpos] & 134217727) >>> (27 - 14)) + | ((in[10 + inpos]) << 14); + out[9 + outpos] = ((in[10 + inpos] & 134217727) >>> (27 - 9)) + | ((in[11 + inpos]) << 9); + out[10 + outpos] = ((in[11 + inpos] & 134217727) >>> (27 - 4)) + | ((in[12 + inpos] & 134217727) << 4) + | ((in[13 + inpos]) << 31); + out[11 + outpos] = ((in[13 + inpos] & 134217727) >>> (27 - 26)) + | ((in[14 + inpos]) << 26); + out[12 + outpos] = ((in[14 + inpos] & 134217727) >>> (27 - 21)) + | ((in[15 + inpos]) << 21); + out[13 + outpos] = ((in[15 + inpos] & 134217727) >>> (27 - 16)) + | ((in[16 + inpos]) << 16); + out[14 + outpos] = ((in[16 + inpos] & 134217727) >>> (27 - 11)) + | ((in[17 + inpos]) << 11); + out[15 + outpos] = ((in[17 + inpos] & 134217727) >>> (27 - 6)) + | ((in[18 + inpos]) << 6); + out[16 + outpos] = ((in[18 + inpos] & 134217727) >>> (27 - 1)) + | ((in[19 + inpos] & 134217727) << 1) + | ((in[20 + inpos]) << 28); + out[17 + outpos] = ((in[20 + inpos] & 134217727) >>> (27 - 23)) + | ((in[21 + inpos]) << 23); + out[18 + outpos] = ((in[21 + inpos] & 134217727) >>> (27 - 18)) + | ((in[22 + inpos]) << 18); + out[19 + outpos] = ((in[22 + inpos] & 134217727) >>> (27 - 13)) + | ((in[23 + inpos]) << 13); + out[20 + outpos] = ((in[23 + inpos] & 134217727) >>> (27 - 8)) + | ((in[24 + inpos]) << 8); + out[21 + outpos] = ((in[24 + inpos] & 134217727) >>> (27 - 3)) + | ((in[25 + inpos] & 134217727) << 3) + | ((in[26 + inpos]) << 30); + out[22 + outpos] = ((in[26 + inpos] & 134217727) >>> (27 - 25)) + | ((in[27 + inpos]) << 25); + out[23 + outpos] = ((in[27 + inpos] & 134217727) >>> (27 - 20)) + | ((in[28 + inpos]) << 20); + out[24 + outpos] = ((in[28 + inpos] & 134217727) >>> (27 - 15)) + | ((in[29 + inpos]) << 15); + out[25 + outpos] = ((in[29 + inpos] & 134217727) >>> (27 - 10)) + | ((in[30 + inpos]) << 10); + out[26 + outpos] = ((in[30 + inpos] & 134217727) >>> (27 - 5)) + | ((in[31 + inpos]) << 5); + } + protected static void fastpack28(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 268435455) + | ((in[1 + inpos]) << 28); + out[1 + outpos] = ((in[1 + inpos] & 268435455) >>> (28 - 24)) + | ((in[2 + inpos]) << 24); + out[2 + outpos] = ((in[2 + inpos] & 268435455) >>> (28 - 20)) + | ((in[3 + inpos]) << 20); + out[3 + outpos] = ((in[3 + inpos] & 268435455) >>> (28 - 16)) + | ((in[4 + inpos]) << 16); + out[4 + outpos] = ((in[4 + inpos] & 268435455) >>> (28 - 12)) + | ((in[5 + inpos]) << 12); + out[5 + outpos] = ((in[5 + inpos] & 268435455) >>> (28 - 8)) + | ((in[6 + inpos]) << 8); + out[6 + outpos] = ((in[6 + inpos] & 268435455) >>> (28 - 4)) + | ((in[7 + inpos]) << 4); + out[7 + outpos] = (in[8 + inpos] & 268435455) + | ((in[9 + inpos]) << 28); + out[8 + outpos] = ((in[9 + inpos] & 268435455) >>> (28 - 24)) + | ((in[10 + inpos]) << 24); + out[9 + outpos] = ((in[10 + inpos] & 268435455) >>> (28 - 20)) + | ((in[11 + inpos]) << 20); + out[10 + outpos] = ((in[11 + inpos] & 268435455) >>> (28 - 16)) + | ((in[12 + inpos]) << 16); + out[11 + outpos] = ((in[12 + inpos] & 268435455) >>> (28 - 12)) + | ((in[13 + inpos]) << 12); + out[12 + outpos] = ((in[13 + inpos] & 268435455) >>> (28 - 8)) + | ((in[14 + inpos]) << 8); + out[13 + outpos] = ((in[14 + inpos] & 268435455) >>> (28 - 4)) + | ((in[15 + inpos]) << 4); + out[14 + outpos] = (in[16 + inpos] & 268435455) + | ((in[17 + inpos]) << 28); + out[15 + outpos] = ((in[17 + inpos] & 268435455) >>> (28 - 24)) + | ((in[18 + inpos]) << 24); + out[16 + outpos] = ((in[18 + inpos] & 268435455) >>> (28 - 20)) + | ((in[19 + inpos]) << 20); + out[17 + outpos] = ((in[19 + inpos] & 268435455) >>> (28 - 16)) + | ((in[20 + inpos]) << 16); + out[18 + outpos] = ((in[20 + inpos] & 268435455) >>> (28 - 12)) + | ((in[21 + inpos]) << 12); + out[19 + outpos] = ((in[21 + inpos] & 268435455) >>> (28 - 8)) + | ((in[22 + inpos]) << 8); + out[20 + outpos] = ((in[22 + inpos] & 268435455) >>> (28 - 4)) + | ((in[23 + inpos]) << 4); + out[21 + outpos] = (in[24 + inpos] & 268435455) + | ((in[25 + inpos]) << 28); + out[22 + outpos] = ((in[25 + inpos] & 268435455) >>> (28 - 24)) + | ((in[26 + inpos]) << 24); + out[23 + outpos] = ((in[26 + inpos] & 268435455) >>> (28 - 20)) + | ((in[27 + inpos]) << 20); + out[24 + outpos] = ((in[27 + inpos] & 268435455) >>> (28 - 16)) + | ((in[28 + inpos]) << 16); + out[25 + outpos] = ((in[28 + inpos] & 268435455) >>> (28 - 12)) + | ((in[29 + inpos]) << 12); + out[26 + outpos] = ((in[29 + inpos] & 268435455) >>> (28 - 8)) + | ((in[30 + inpos]) << 8); + out[27 + outpos] = ((in[30 + inpos] & 268435455) >>> (28 - 4)) + | ((in[31 + inpos]) << 4); + } - protected static void fastunpack19(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 524287) - ; - out[1 + outpos] = (in[0 + inpos] >>> 19) - | ((in[1 + inpos] & 63) << (19 - 6)) - ; - out[2 + outpos] = ((in[1 + inpos] >>> 6) & 524287) - ; - out[3 + outpos] = (in[1 + inpos] >>> 25) - | ((in[2 + inpos] & 4095) << (19 - 12)) - ; - out[4 + outpos] = ((in[2 + inpos] >>> 12) & 524287) - ; - out[5 + outpos] = (in[2 + inpos] >>> 31) - | ((in[3 + inpos] & 262143) << (19 - 18)) - ; - out[6 + outpos] = (in[3 + inpos] >>> 18) - | ((in[4 + inpos] & 31) << (19 - 5)) - ; - out[7 + outpos] = ((in[4 + inpos] >>> 5) & 524287) - ; - out[8 + outpos] = (in[4 + inpos] >>> 24) - | ((in[5 + inpos] & 2047) << (19 - 11)) - ; - out[9 + outpos] = ((in[5 + inpos] >>> 11) & 524287) - ; - out[10 + outpos] = (in[5 + inpos] >>> 30) - | ((in[6 + inpos] & 131071) << (19 - 17)) - ; - out[11 + outpos] = (in[6 + inpos] >>> 17) - | ((in[7 + inpos] & 15) << (19 - 4)) - ; - out[12 + outpos] = ((in[7 + inpos] >>> 4) & 524287) - ; - out[13 + outpos] = (in[7 + inpos] >>> 23) - | ((in[8 + inpos] & 1023) << (19 - 10)) - ; - out[14 + outpos] = ((in[8 + inpos] >>> 10) & 524287) - ; - out[15 + outpos] = (in[8 + inpos] >>> 29) - | ((in[9 + inpos] & 65535) << (19 - 16)) - ; - out[16 + outpos] = (in[9 + inpos] >>> 16) - | ((in[10 + inpos] & 7) << (19 - 3)) - ; - out[17 + outpos] = ((in[10 + inpos] >>> 3) & 524287) - ; - out[18 + outpos] = (in[10 + inpos] >>> 22) - | ((in[11 + inpos] & 511) << (19 - 9)) - ; - out[19 + outpos] = ((in[11 + inpos] >>> 9) & 524287) - ; - out[20 + outpos] = (in[11 + inpos] >>> 28) - | ((in[12 + inpos] & 32767) << (19 - 15)) - ; - out[21 + outpos] = (in[12 + inpos] >>> 15) - | ((in[13 + inpos] & 3) << (19 - 2)) - ; - out[22 + outpos] = ((in[13 + inpos] >>> 2) & 524287) - ; - out[23 + outpos] = (in[13 + inpos] >>> 21) - | ((in[14 + inpos] & 255) << (19 - 8)) - ; - out[24 + outpos] = ((in[14 + inpos] >>> 8) & 524287) - ; - out[25 + outpos] = (in[14 + inpos] >>> 27) - | ((in[15 + inpos] & 16383) << (19 - 14)) - ; - out[26 + outpos] = (in[15 + inpos] >>> 14) - | ((in[16 + inpos] & 1) << (19 - 1)) - ; - out[27 + outpos] = ((in[16 + inpos] >>> 1) & 524287) - ; - out[28 + outpos] = (in[16 + inpos] >>> 20) - | ((in[17 + inpos] & 127) << (19 - 7)) - ; - out[29 + outpos] = ((in[17 + inpos] >>> 7) & 524287) - ; - out[30 + outpos] = (in[17 + inpos] >>> 26) - | ((in[18 + inpos] & 8191) << (19 - 13)) - ; - out[31 + outpos] = (in[18 + inpos] >>> 13) - ; - } + protected static void fastpack29(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 536870911) + | ((in[1 + inpos]) << 29); + out[1 + outpos] = ((in[1 + inpos] & 536870911) >>> (29 - 26)) + | ((in[2 + inpos]) << 26); + out[2 + outpos] = ((in[2 + inpos] & 536870911) >>> (29 - 23)) + | ((in[3 + inpos]) << 23); + out[3 + outpos] = ((in[3 + inpos] & 536870911) >>> (29 - 20)) + | ((in[4 + inpos]) << 20); + out[4 + outpos] = ((in[4 + inpos] & 536870911) >>> (29 - 17)) + | ((in[5 + inpos]) << 17); + out[5 + outpos] = ((in[5 + inpos] & 536870911) >>> (29 - 14)) + | ((in[6 + inpos]) << 14); + out[6 + outpos] = ((in[6 + inpos] & 536870911) >>> (29 - 11)) + | ((in[7 + inpos]) << 11); + out[7 + outpos] = ((in[7 + inpos] & 536870911) >>> (29 - 8)) + | ((in[8 + inpos]) << 8); + out[8 + outpos] = ((in[8 + inpos] & 536870911) >>> (29 - 5)) + | ((in[9 + inpos]) << 5); + out[9 + outpos] = ((in[9 + inpos] & 536870911) >>> (29 - 2)) + | ((in[10 + inpos] & 536870911) << 2) + | ((in[11 + inpos]) << 31); + out[10 + outpos] = ((in[11 + inpos] & 536870911) >>> (29 - 28)) + | ((in[12 + inpos]) << 28); + out[11 + outpos] = ((in[12 + inpos] & 536870911) >>> (29 - 25)) + | ((in[13 + inpos]) << 25); + out[12 + outpos] = ((in[13 + inpos] & 536870911) >>> (29 - 22)) + | ((in[14 + inpos]) << 22); + out[13 + outpos] = ((in[14 + inpos] & 536870911) >>> (29 - 19)) + | ((in[15 + inpos]) << 19); + out[14 + outpos] = ((in[15 + inpos] & 536870911) >>> (29 - 16)) + | ((in[16 + inpos]) << 16); + out[15 + outpos] = ((in[16 + inpos] & 536870911) >>> (29 - 13)) + | ((in[17 + inpos]) << 13); + out[16 + outpos] = ((in[17 + inpos] & 536870911) >>> (29 - 10)) + | ((in[18 + inpos]) << 10); + out[17 + outpos] = ((in[18 + inpos] & 536870911) >>> (29 - 7)) + | ((in[19 + inpos]) << 7); + out[18 + outpos] = ((in[19 + inpos] & 536870911) >>> (29 - 4)) + | ((in[20 + inpos]) << 4); + out[19 + outpos] = ((in[20 + inpos] & 536870911) >>> (29 - 1)) + | ((in[21 + inpos] & 536870911) << 1) + | ((in[22 + inpos]) << 30); + out[20 + outpos] = ((in[22 + inpos] & 536870911) >>> (29 - 27)) + | ((in[23 + inpos]) << 27); + out[21 + outpos] = ((in[23 + inpos] & 536870911) >>> (29 - 24)) + | ((in[24 + inpos]) << 24); + out[22 + outpos] = ((in[24 + inpos] & 536870911) >>> (29 - 21)) + | ((in[25 + inpos]) << 21); + out[23 + outpos] = ((in[25 + inpos] & 536870911) >>> (29 - 18)) + | ((in[26 + inpos]) << 18); + out[24 + outpos] = ((in[26 + inpos] & 536870911) >>> (29 - 15)) + | ((in[27 + inpos]) << 15); + out[25 + outpos] = ((in[27 + inpos] & 536870911) >>> (29 - 12)) + | ((in[28 + inpos]) << 12); + out[26 + outpos] = ((in[28 + inpos] & 536870911) >>> (29 - 9)) + | ((in[29 + inpos]) << 9); + out[27 + outpos] = ((in[29 + inpos] & 536870911) >>> (29 - 6)) + | ((in[30 + inpos]) << 6); + out[28 + outpos] = ((in[30 + inpos] & 536870911) >>> (29 - 3)) + | ((in[31 + inpos]) << 3); + } + protected static void fastpack30(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 1073741823) + | ((in[1 + inpos]) << 30); + out[1 + outpos] = ((in[1 + inpos] & 1073741823) >>> (30 - 28)) + | ((in[2 + inpos]) << 28); + out[2 + outpos] = ((in[2 + inpos] & 1073741823) >>> (30 - 26)) + | ((in[3 + inpos]) << 26); + out[3 + outpos] = ((in[3 + inpos] & 1073741823) >>> (30 - 24)) + | ((in[4 + inpos]) << 24); + out[4 + outpos] = ((in[4 + inpos] & 1073741823) >>> (30 - 22)) + | ((in[5 + inpos]) << 22); + out[5 + outpos] = ((in[5 + inpos] & 1073741823) >>> (30 - 20)) + | ((in[6 + inpos]) << 20); + out[6 + outpos] = ((in[6 + inpos] & 1073741823) >>> (30 - 18)) + | ((in[7 + inpos]) << 18); + out[7 + outpos] = ((in[7 + inpos] & 1073741823) >>> (30 - 16)) + | ((in[8 + inpos]) << 16); + out[8 + outpos] = ((in[8 + inpos] & 1073741823) >>> (30 - 14)) + | ((in[9 + inpos]) << 14); + out[9 + outpos] = ((in[9 + inpos] & 1073741823) >>> (30 - 12)) + | ((in[10 + inpos]) << 12); + out[10 + outpos] = ((in[10 + inpos] & 1073741823) >>> (30 - 10)) + | ((in[11 + inpos]) << 10); + out[11 + outpos] = ((in[11 + inpos] & 1073741823) >>> (30 - 8)) + | ((in[12 + inpos]) << 8); + out[12 + outpos] = ((in[12 + inpos] & 1073741823) >>> (30 - 6)) + | ((in[13 + inpos]) << 6); + out[13 + outpos] = ((in[13 + inpos] & 1073741823) >>> (30 - 4)) + | ((in[14 + inpos]) << 4); + out[14 + outpos] = ((in[14 + inpos] & 1073741823) >>> (30 - 2)) + | ((in[15 + inpos]) << 2); + out[15 + outpos] = (in[16 + inpos] & 1073741823) + | ((in[17 + inpos]) << 30); + out[16 + outpos] = ((in[17 + inpos] & 1073741823) >>> (30 - 28)) + | ((in[18 + inpos]) << 28); + out[17 + outpos] = ((in[18 + inpos] & 1073741823) >>> (30 - 26)) + | ((in[19 + inpos]) << 26); + out[18 + outpos] = ((in[19 + inpos] & 1073741823) >>> (30 - 24)) + | ((in[20 + inpos]) << 24); + out[19 + outpos] = ((in[20 + inpos] & 1073741823) >>> (30 - 22)) + | ((in[21 + inpos]) << 22); + out[20 + outpos] = ((in[21 + inpos] & 1073741823) >>> (30 - 20)) + | ((in[22 + inpos]) << 20); + out[21 + outpos] = ((in[22 + inpos] & 1073741823) >>> (30 - 18)) + | ((in[23 + inpos]) << 18); + out[22 + outpos] = ((in[23 + inpos] & 1073741823) >>> (30 - 16)) + | ((in[24 + inpos]) << 16); + out[23 + outpos] = ((in[24 + inpos] & 1073741823) >>> (30 - 14)) + | ((in[25 + inpos]) << 14); + out[24 + outpos] = ((in[25 + inpos] & 1073741823) >>> (30 - 12)) + | ((in[26 + inpos]) << 12); + out[25 + outpos] = ((in[26 + inpos] & 1073741823) >>> (30 - 10)) + | ((in[27 + inpos]) << 10); + out[26 + outpos] = ((in[27 + inpos] & 1073741823) >>> (30 - 8)) + | ((in[28 + inpos]) << 8); + out[27 + outpos] = ((in[28 + inpos] & 1073741823) >>> (30 - 6)) + | ((in[29 + inpos]) << 6); + out[28 + outpos] = ((in[29 + inpos] & 1073741823) >>> (30 - 4)) + | ((in[30 + inpos]) << 4); + out[29 + outpos] = ((in[30 + inpos] & 1073741823) >>> (30 - 2)) + | ((in[31 + inpos]) << 2); + } - protected static void fastunpack20(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 1048575) - ; - out[1 + outpos] = (in[0 + inpos] >>> 20) - | ((in[1 + inpos] & 255) << (20 - 8)) - ; - out[2 + outpos] = ((in[1 + inpos] >>> 8) & 1048575) - ; - out[3 + outpos] = (in[1 + inpos] >>> 28) - | ((in[2 + inpos] & 65535) << (20 - 16)) - ; - out[4 + outpos] = (in[2 + inpos] >>> 16) - | ((in[3 + inpos] & 15) << (20 - 4)) - ; - out[5 + outpos] = ((in[3 + inpos] >>> 4) & 1048575) - ; - out[6 + outpos] = (in[3 + inpos] >>> 24) - | ((in[4 + inpos] & 4095) << (20 - 12)) - ; - out[7 + outpos] = (in[4 + inpos] >>> 12) - ; - out[8 + outpos] = ((in[5 + inpos] >>> 0) & 1048575) - ; - out[9 + outpos] = (in[5 + inpos] >>> 20) - | ((in[6 + inpos] & 255) << (20 - 8)) - ; - out[10 + outpos] = ((in[6 + inpos] >>> 8) & 1048575) - ; - out[11 + outpos] = (in[6 + inpos] >>> 28) - | ((in[7 + inpos] & 65535) << (20 - 16)) - ; - out[12 + outpos] = (in[7 + inpos] >>> 16) - | ((in[8 + inpos] & 15) << (20 - 4)) - ; - out[13 + outpos] = ((in[8 + inpos] >>> 4) & 1048575) - ; - out[14 + outpos] = (in[8 + inpos] >>> 24) - | ((in[9 + inpos] & 4095) << (20 - 12)) - ; - out[15 + outpos] = (in[9 + inpos] >>> 12) - ; - out[16 + outpos] = ((in[10 + inpos] >>> 0) & 1048575) - ; - out[17 + outpos] = (in[10 + inpos] >>> 20) - | ((in[11 + inpos] & 255) << (20 - 8)) - ; - out[18 + outpos] = ((in[11 + inpos] >>> 8) & 1048575) - ; - out[19 + outpos] = (in[11 + inpos] >>> 28) - | ((in[12 + inpos] & 65535) << (20 - 16)) - ; - out[20 + outpos] = (in[12 + inpos] >>> 16) - | ((in[13 + inpos] & 15) << (20 - 4)) - ; - out[21 + outpos] = ((in[13 + inpos] >>> 4) & 1048575) - ; - out[22 + outpos] = (in[13 + inpos] >>> 24) - | ((in[14 + inpos] & 4095) << (20 - 12)) - ; - out[23 + outpos] = (in[14 + inpos] >>> 12) - ; - out[24 + outpos] = ((in[15 + inpos] >>> 0) & 1048575) - ; - out[25 + outpos] = (in[15 + inpos] >>> 20) - | ((in[16 + inpos] & 255) << (20 - 8)) - ; - out[26 + outpos] = ((in[16 + inpos] >>> 8) & 1048575) - ; - out[27 + outpos] = (in[16 + inpos] >>> 28) - | ((in[17 + inpos] & 65535) << (20 - 16)) - ; - out[28 + outpos] = (in[17 + inpos] >>> 16) - | ((in[18 + inpos] & 15) << (20 - 4)) - ; - out[29 + outpos] = ((in[18 + inpos] >>> 4) & 1048575) - ; - out[30 + outpos] = (in[18 + inpos] >>> 24) - | ((in[19 + inpos] & 4095) << (20 - 12)) - ; - out[31 + outpos] = (in[19 + inpos] >>> 12) - ; - } + protected static void fastpack31(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 2147483647) + | ((in[1 + inpos]) << 31); + out[1 + outpos] = ((in[1 + inpos] & 2147483647) >>> (31 - 30)) + | ((in[2 + inpos]) << 30); + out[2 + outpos] = ((in[2 + inpos] & 2147483647) >>> (31 - 29)) + | ((in[3 + inpos]) << 29); + out[3 + outpos] = ((in[3 + inpos] & 2147483647) >>> (31 - 28)) + | ((in[4 + inpos]) << 28); + out[4 + outpos] = ((in[4 + inpos] & 2147483647) >>> (31 - 27)) + | ((in[5 + inpos]) << 27); + out[5 + outpos] = ((in[5 + inpos] & 2147483647) >>> (31 - 26)) + | ((in[6 + inpos]) << 26); + out[6 + outpos] = ((in[6 + inpos] & 2147483647) >>> (31 - 25)) + | ((in[7 + inpos]) << 25); + out[7 + outpos] = ((in[7 + inpos] & 2147483647) >>> (31 - 24)) + | ((in[8 + inpos]) << 24); + out[8 + outpos] = ((in[8 + inpos] & 2147483647) >>> (31 - 23)) + | ((in[9 + inpos]) << 23); + out[9 + outpos] = ((in[9 + inpos] & 2147483647) >>> (31 - 22)) + | ((in[10 + inpos]) << 22); + out[10 + outpos] = ((in[10 + inpos] & 2147483647) >>> (31 - 21)) + | ((in[11 + inpos]) << 21); + out[11 + outpos] = ((in[11 + inpos] & 2147483647) >>> (31 - 20)) + | ((in[12 + inpos]) << 20); + out[12 + outpos] = ((in[12 + inpos] & 2147483647) >>> (31 - 19)) + | ((in[13 + inpos]) << 19); + out[13 + outpos] = ((in[13 + inpos] & 2147483647) >>> (31 - 18)) + | ((in[14 + inpos]) << 18); + out[14 + outpos] = ((in[14 + inpos] & 2147483647) >>> (31 - 17)) + | ((in[15 + inpos]) << 17); + out[15 + outpos] = ((in[15 + inpos] & 2147483647) >>> (31 - 16)) + | ((in[16 + inpos]) << 16); + out[16 + outpos] = ((in[16 + inpos] & 2147483647) >>> (31 - 15)) + | ((in[17 + inpos]) << 15); + out[17 + outpos] = ((in[17 + inpos] & 2147483647) >>> (31 - 14)) + | ((in[18 + inpos]) << 14); + out[18 + outpos] = ((in[18 + inpos] & 2147483647) >>> (31 - 13)) + | ((in[19 + inpos]) << 13); + out[19 + outpos] = ((in[19 + inpos] & 2147483647) >>> (31 - 12)) + | ((in[20 + inpos]) << 12); + out[20 + outpos] = ((in[20 + inpos] & 2147483647) >>> (31 - 11)) + | ((in[21 + inpos]) << 11); + out[21 + outpos] = ((in[21 + inpos] & 2147483647) >>> (31 - 10)) + | ((in[22 + inpos]) << 10); + out[22 + outpos] = ((in[22 + inpos] & 2147483647) >>> (31 - 9)) + | ((in[23 + inpos]) << 9); + out[23 + outpos] = ((in[23 + inpos] & 2147483647) >>> (31 - 8)) + | ((in[24 + inpos]) << 8); + out[24 + outpos] = ((in[24 + inpos] & 2147483647) >>> (31 - 7)) + | ((in[25 + inpos]) << 7); + out[25 + outpos] = ((in[25 + inpos] & 2147483647) >>> (31 - 6)) + | ((in[26 + inpos]) << 6); + out[26 + outpos] = ((in[26 + inpos] & 2147483647) >>> (31 - 5)) + | ((in[27 + inpos]) << 5); + out[27 + outpos] = ((in[27 + inpos] & 2147483647) >>> (31 - 4)) + | ((in[28 + inpos]) << 4); + out[28 + outpos] = ((in[28 + inpos] & 2147483647) >>> (31 - 3)) + | ((in[29 + inpos]) << 3); + out[29 + outpos] = ((in[29 + inpos] & 2147483647) >>> (31 - 2)) + | ((in[30 + inpos]) << 2); + out[30 + outpos] = ((in[30 + inpos] & 2147483647) >>> (31 - 1)) + | ((in[31 + inpos]) << 1); + } + protected static void fastunpack1(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 1); + out[1 + outpos] = ((in[0 + inpos] >>> 1) & 1); + out[2 + outpos] = ((in[0 + inpos] >>> 2) & 1); + out[3 + outpos] = ((in[0 + inpos] >>> 3) & 1); + out[4 + outpos] = ((in[0 + inpos] >>> 4) & 1); + out[5 + outpos] = ((in[0 + inpos] >>> 5) & 1); + out[6 + outpos] = ((in[0 + inpos] >>> 6) & 1); + out[7 + outpos] = ((in[0 + inpos] >>> 7) & 1); + out[8 + outpos] = ((in[0 + inpos] >>> 8) & 1); + out[9 + outpos] = ((in[0 + inpos] >>> 9) & 1); + out[10 + outpos] = ((in[0 + inpos] >>> 10) & 1); + out[11 + outpos] = ((in[0 + inpos] >>> 11) & 1); + out[12 + outpos] = ((in[0 + inpos] >>> 12) & 1); + out[13 + outpos] = ((in[0 + inpos] >>> 13) & 1); + out[14 + outpos] = ((in[0 + inpos] >>> 14) & 1); + out[15 + outpos] = ((in[0 + inpos] >>> 15) & 1); + out[16 + outpos] = ((in[0 + inpos] >>> 16) & 1); + out[17 + outpos] = ((in[0 + inpos] >>> 17) & 1); + out[18 + outpos] = ((in[0 + inpos] >>> 18) & 1); + out[19 + outpos] = ((in[0 + inpos] >>> 19) & 1); + out[20 + outpos] = ((in[0 + inpos] >>> 20) & 1); + out[21 + outpos] = ((in[0 + inpos] >>> 21) & 1); + out[22 + outpos] = ((in[0 + inpos] >>> 22) & 1); + out[23 + outpos] = ((in[0 + inpos] >>> 23) & 1); + out[24 + outpos] = ((in[0 + inpos] >>> 24) & 1); + out[25 + outpos] = ((in[0 + inpos] >>> 25) & 1); + out[26 + outpos] = ((in[0 + inpos] >>> 26) & 1); + out[27 + outpos] = ((in[0 + inpos] >>> 27) & 1); + out[28 + outpos] = ((in[0 + inpos] >>> 28) & 1); + out[29 + outpos] = ((in[0 + inpos] >>> 29) & 1); + out[30 + outpos] = ((in[0 + inpos] >>> 30) & 1); + out[31 + outpos] = (in[0 + inpos] >>> 31); + } - protected static void fastunpack21(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 2097151) - ; - out[1 + outpos] = (in[0 + inpos] >>> 21) - | ((in[1 + inpos] & 1023) << (21 - 10)) - ; - out[2 + outpos] = ((in[1 + inpos] >>> 10) & 2097151) - ; - out[3 + outpos] = (in[1 + inpos] >>> 31) - | ((in[2 + inpos] & 1048575) << (21 - 20)) - ; - out[4 + outpos] = (in[2 + inpos] >>> 20) - | ((in[3 + inpos] & 511) << (21 - 9)) - ; - out[5 + outpos] = ((in[3 + inpos] >>> 9) & 2097151) - ; - out[6 + outpos] = (in[3 + inpos] >>> 30) - | ((in[4 + inpos] & 524287) << (21 - 19)) - ; - out[7 + outpos] = (in[4 + inpos] >>> 19) - | ((in[5 + inpos] & 255) << (21 - 8)) - ; - out[8 + outpos] = ((in[5 + inpos] >>> 8) & 2097151) - ; - out[9 + outpos] = (in[5 + inpos] >>> 29) - | ((in[6 + inpos] & 262143) << (21 - 18)) - ; - out[10 + outpos] = (in[6 + inpos] >>> 18) - | ((in[7 + inpos] & 127) << (21 - 7)) - ; - out[11 + outpos] = ((in[7 + inpos] >>> 7) & 2097151) - ; - out[12 + outpos] = (in[7 + inpos] >>> 28) - | ((in[8 + inpos] & 131071) << (21 - 17)) - ; - out[13 + outpos] = (in[8 + inpos] >>> 17) - | ((in[9 + inpos] & 63) << (21 - 6)) - ; - out[14 + outpos] = ((in[9 + inpos] >>> 6) & 2097151) - ; - out[15 + outpos] = (in[9 + inpos] >>> 27) - | ((in[10 + inpos] & 65535) << (21 - 16)) - ; - out[16 + outpos] = (in[10 + inpos] >>> 16) - | ((in[11 + inpos] & 31) << (21 - 5)) - ; - out[17 + outpos] = ((in[11 + inpos] >>> 5) & 2097151) - ; - out[18 + outpos] = (in[11 + inpos] >>> 26) - | ((in[12 + inpos] & 32767) << (21 - 15)) - ; - out[19 + outpos] = (in[12 + inpos] >>> 15) - | ((in[13 + inpos] & 15) << (21 - 4)) - ; - out[20 + outpos] = ((in[13 + inpos] >>> 4) & 2097151) - ; - out[21 + outpos] = (in[13 + inpos] >>> 25) - | ((in[14 + inpos] & 16383) << (21 - 14)) - ; - out[22 + outpos] = (in[14 + inpos] >>> 14) - | ((in[15 + inpos] & 7) << (21 - 3)) - ; - out[23 + outpos] = ((in[15 + inpos] >>> 3) & 2097151) - ; - out[24 + outpos] = (in[15 + inpos] >>> 24) - | ((in[16 + inpos] & 8191) << (21 - 13)) - ; - out[25 + outpos] = (in[16 + inpos] >>> 13) - | ((in[17 + inpos] & 3) << (21 - 2)) - ; - out[26 + outpos] = ((in[17 + inpos] >>> 2) & 2097151) - ; - out[27 + outpos] = (in[17 + inpos] >>> 23) - | ((in[18 + inpos] & 4095) << (21 - 12)) - ; - out[28 + outpos] = (in[18 + inpos] >>> 12) - | ((in[19 + inpos] & 1) << (21 - 1)) - ; - out[29 + outpos] = ((in[19 + inpos] >>> 1) & 2097151) - ; - out[30 + outpos] = (in[19 + inpos] >>> 22) - | ((in[20 + inpos] & 2047) << (21 - 11)) - ; - out[31 + outpos] = (in[20 + inpos] >>> 11) - ; - } + protected static void fastunpack2(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 3); + out[1 + outpos] = ((in[0 + inpos] >>> 2) & 3); + out[2 + outpos] = ((in[0 + inpos] >>> 4) & 3); + out[3 + outpos] = ((in[0 + inpos] >>> 6) & 3); + out[4 + outpos] = ((in[0 + inpos] >>> 8) & 3); + out[5 + outpos] = ((in[0 + inpos] >>> 10) & 3); + out[6 + outpos] = ((in[0 + inpos] >>> 12) & 3); + out[7 + outpos] = ((in[0 + inpos] >>> 14) & 3); + out[8 + outpos] = ((in[0 + inpos] >>> 16) & 3); + out[9 + outpos] = ((in[0 + inpos] >>> 18) & 3); + out[10 + outpos] = ((in[0 + inpos] >>> 20) & 3); + out[11 + outpos] = ((in[0 + inpos] >>> 22) & 3); + out[12 + outpos] = ((in[0 + inpos] >>> 24) & 3); + out[13 + outpos] = ((in[0 + inpos] >>> 26) & 3); + out[14 + outpos] = ((in[0 + inpos] >>> 28) & 3); + out[15 + outpos] = (in[0 + inpos] >>> 30); + out[16 + outpos] = ((in[1 + inpos] >>> 0) & 3); + out[17 + outpos] = ((in[1 + inpos] >>> 2) & 3); + out[18 + outpos] = ((in[1 + inpos] >>> 4) & 3); + out[19 + outpos] = ((in[1 + inpos] >>> 6) & 3); + out[20 + outpos] = ((in[1 + inpos] >>> 8) & 3); + out[21 + outpos] = ((in[1 + inpos] >>> 10) & 3); + out[22 + outpos] = ((in[1 + inpos] >>> 12) & 3); + out[23 + outpos] = ((in[1 + inpos] >>> 14) & 3); + out[24 + outpos] = ((in[1 + inpos] >>> 16) & 3); + out[25 + outpos] = ((in[1 + inpos] >>> 18) & 3); + out[26 + outpos] = ((in[1 + inpos] >>> 20) & 3); + out[27 + outpos] = ((in[1 + inpos] >>> 22) & 3); + out[28 + outpos] = ((in[1 + inpos] >>> 24) & 3); + out[29 + outpos] = ((in[1 + inpos] >>> 26) & 3); + out[30 + outpos] = ((in[1 + inpos] >>> 28) & 3); + out[31 + outpos] = (in[1 + inpos] >>> 30); + } + protected static void fastunpack3(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 7); + out[1 + outpos] = ((in[0 + inpos] >>> 3) & 7); + out[2 + outpos] = ((in[0 + inpos] >>> 6) & 7); + out[3 + outpos] = ((in[0 + inpos] >>> 9) & 7); + out[4 + outpos] = ((in[0 + inpos] >>> 12) & 7); + out[5 + outpos] = ((in[0 + inpos] >>> 15) & 7); + out[6 + outpos] = ((in[0 + inpos] >>> 18) & 7); + out[7 + outpos] = ((in[0 + inpos] >>> 21) & 7); + out[8 + outpos] = ((in[0 + inpos] >>> 24) & 7); + out[9 + outpos] = ((in[0 + inpos] >>> 27) & 7); + out[10 + outpos] = (in[0 + inpos] >>> 30) + | ((in[1 + inpos] & 1) << (3 - 1)); + out[11 + outpos] = ((in[1 + inpos] >>> 1) & 7); + out[12 + outpos] = ((in[1 + inpos] >>> 4) & 7); + out[13 + outpos] = ((in[1 + inpos] >>> 7) & 7); + out[14 + outpos] = ((in[1 + inpos] >>> 10) & 7); + out[15 + outpos] = ((in[1 + inpos] >>> 13) & 7); + out[16 + outpos] = ((in[1 + inpos] >>> 16) & 7); + out[17 + outpos] = ((in[1 + inpos] >>> 19) & 7); + out[18 + outpos] = ((in[1 + inpos] >>> 22) & 7); + out[19 + outpos] = ((in[1 + inpos] >>> 25) & 7); + out[20 + outpos] = ((in[1 + inpos] >>> 28) & 7); + out[21 + outpos] = (in[1 + inpos] >>> 31) + | ((in[2 + inpos] & 3) << (3 - 2)); + out[22 + outpos] = ((in[2 + inpos] >>> 2) & 7); + out[23 + outpos] = ((in[2 + inpos] >>> 5) & 7); + out[24 + outpos] = ((in[2 + inpos] >>> 8) & 7); + out[25 + outpos] = ((in[2 + inpos] >>> 11) & 7); + out[26 + outpos] = ((in[2 + inpos] >>> 14) & 7); + out[27 + outpos] = ((in[2 + inpos] >>> 17) & 7); + out[28 + outpos] = ((in[2 + inpos] >>> 20) & 7); + out[29 + outpos] = ((in[2 + inpos] >>> 23) & 7); + out[30 + outpos] = ((in[2 + inpos] >>> 26) & 7); + out[31 + outpos] = (in[2 + inpos] >>> 29); + } - protected static void fastunpack22(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 4194303) - ; - out[1 + outpos] = (in[0 + inpos] >>> 22) - | ((in[1 + inpos] & 4095) << (22 - 12)) - ; - out[2 + outpos] = (in[1 + inpos] >>> 12) - | ((in[2 + inpos] & 3) << (22 - 2)) - ; - out[3 + outpos] = ((in[2 + inpos] >>> 2) & 4194303) - ; - out[4 + outpos] = (in[2 + inpos] >>> 24) - | ((in[3 + inpos] & 16383) << (22 - 14)) - ; - out[5 + outpos] = (in[3 + inpos] >>> 14) - | ((in[4 + inpos] & 15) << (22 - 4)) - ; - out[6 + outpos] = ((in[4 + inpos] >>> 4) & 4194303) - ; - out[7 + outpos] = (in[4 + inpos] >>> 26) - | ((in[5 + inpos] & 65535) << (22 - 16)) - ; - out[8 + outpos] = (in[5 + inpos] >>> 16) - | ((in[6 + inpos] & 63) << (22 - 6)) - ; - out[9 + outpos] = ((in[6 + inpos] >>> 6) & 4194303) - ; - out[10 + outpos] = (in[6 + inpos] >>> 28) - | ((in[7 + inpos] & 262143) << (22 - 18)) - ; - out[11 + outpos] = (in[7 + inpos] >>> 18) - | ((in[8 + inpos] & 255) << (22 - 8)) - ; - out[12 + outpos] = ((in[8 + inpos] >>> 8) & 4194303) - ; - out[13 + outpos] = (in[8 + inpos] >>> 30) - | ((in[9 + inpos] & 1048575) << (22 - 20)) - ; - out[14 + outpos] = (in[9 + inpos] >>> 20) - | ((in[10 + inpos] & 1023) << (22 - 10)) - ; - out[15 + outpos] = (in[10 + inpos] >>> 10) - ; - out[16 + outpos] = ((in[11 + inpos] >>> 0) & 4194303) - ; - out[17 + outpos] = (in[11 + inpos] >>> 22) - | ((in[12 + inpos] & 4095) << (22 - 12)) - ; - out[18 + outpos] = (in[12 + inpos] >>> 12) - | ((in[13 + inpos] & 3) << (22 - 2)) - ; - out[19 + outpos] = ((in[13 + inpos] >>> 2) & 4194303) - ; - out[20 + outpos] = (in[13 + inpos] >>> 24) - | ((in[14 + inpos] & 16383) << (22 - 14)) - ; - out[21 + outpos] = (in[14 + inpos] >>> 14) - | ((in[15 + inpos] & 15) << (22 - 4)) - ; - out[22 + outpos] = ((in[15 + inpos] >>> 4) & 4194303) - ; - out[23 + outpos] = (in[15 + inpos] >>> 26) - | ((in[16 + inpos] & 65535) << (22 - 16)) - ; - out[24 + outpos] = (in[16 + inpos] >>> 16) - | ((in[17 + inpos] & 63) << (22 - 6)) - ; - out[25 + outpos] = ((in[17 + inpos] >>> 6) & 4194303) - ; - out[26 + outpos] = (in[17 + inpos] >>> 28) - | ((in[18 + inpos] & 262143) << (22 - 18)) - ; - out[27 + outpos] = (in[18 + inpos] >>> 18) - | ((in[19 + inpos] & 255) << (22 - 8)) - ; - out[28 + outpos] = ((in[19 + inpos] >>> 8) & 4194303) - ; - out[29 + outpos] = (in[19 + inpos] >>> 30) - | ((in[20 + inpos] & 1048575) << (22 - 20)) - ; - out[30 + outpos] = (in[20 + inpos] >>> 20) - | ((in[21 + inpos] & 1023) << (22 - 10)) - ; - out[31 + outpos] = (in[21 + inpos] >>> 10) - ; - } + protected static void fastunpack4(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 15); + out[1 + outpos] = ((in[0 + inpos] >>> 4) & 15); + out[2 + outpos] = ((in[0 + inpos] >>> 8) & 15); + out[3 + outpos] = ((in[0 + inpos] >>> 12) & 15); + out[4 + outpos] = ((in[0 + inpos] >>> 16) & 15); + out[5 + outpos] = ((in[0 + inpos] >>> 20) & 15); + out[6 + outpos] = ((in[0 + inpos] >>> 24) & 15); + out[7 + outpos] = (in[0 + inpos] >>> 28); + out[8 + outpos] = ((in[1 + inpos] >>> 0) & 15); + out[9 + outpos] = ((in[1 + inpos] >>> 4) & 15); + out[10 + outpos] = ((in[1 + inpos] >>> 8) & 15); + out[11 + outpos] = ((in[1 + inpos] >>> 12) & 15); + out[12 + outpos] = ((in[1 + inpos] >>> 16) & 15); + out[13 + outpos] = ((in[1 + inpos] >>> 20) & 15); + out[14 + outpos] = ((in[1 + inpos] >>> 24) & 15); + out[15 + outpos] = (in[1 + inpos] >>> 28); + out[16 + outpos] = ((in[2 + inpos] >>> 0) & 15); + out[17 + outpos] = ((in[2 + inpos] >>> 4) & 15); + out[18 + outpos] = ((in[2 + inpos] >>> 8) & 15); + out[19 + outpos] = ((in[2 + inpos] >>> 12) & 15); + out[20 + outpos] = ((in[2 + inpos] >>> 16) & 15); + out[21 + outpos] = ((in[2 + inpos] >>> 20) & 15); + out[22 + outpos] = ((in[2 + inpos] >>> 24) & 15); + out[23 + outpos] = (in[2 + inpos] >>> 28); + out[24 + outpos] = ((in[3 + inpos] >>> 0) & 15); + out[25 + outpos] = ((in[3 + inpos] >>> 4) & 15); + out[26 + outpos] = ((in[3 + inpos] >>> 8) & 15); + out[27 + outpos] = ((in[3 + inpos] >>> 12) & 15); + out[28 + outpos] = ((in[3 + inpos] >>> 16) & 15); + out[29 + outpos] = ((in[3 + inpos] >>> 20) & 15); + out[30 + outpos] = ((in[3 + inpos] >>> 24) & 15); + out[31 + outpos] = (in[3 + inpos] >>> 28); + } + protected static void fastunpack5(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 31); + out[1 + outpos] = ((in[0 + inpos] >>> 5) & 31); + out[2 + outpos] = ((in[0 + inpos] >>> 10) & 31); + out[3 + outpos] = ((in[0 + inpos] >>> 15) & 31); + out[4 + outpos] = ((in[0 + inpos] >>> 20) & 31); + out[5 + outpos] = ((in[0 + inpos] >>> 25) & 31); + out[6 + outpos] = (in[0 + inpos] >>> 30) + | ((in[1 + inpos] & 7) << (5 - 3)); + out[7 + outpos] = ((in[1 + inpos] >>> 3) & 31); + out[8 + outpos] = ((in[1 + inpos] >>> 8) & 31); + out[9 + outpos] = ((in[1 + inpos] >>> 13) & 31); + out[10 + outpos] = ((in[1 + inpos] >>> 18) & 31); + out[11 + outpos] = ((in[1 + inpos] >>> 23) & 31); + out[12 + outpos] = (in[1 + inpos] >>> 28) + | ((in[2 + inpos] & 1) << (5 - 1)); + out[13 + outpos] = ((in[2 + inpos] >>> 1) & 31); + out[14 + outpos] = ((in[2 + inpos] >>> 6) & 31); + out[15 + outpos] = ((in[2 + inpos] >>> 11) & 31); + out[16 + outpos] = ((in[2 + inpos] >>> 16) & 31); + out[17 + outpos] = ((in[2 + inpos] >>> 21) & 31); + out[18 + outpos] = ((in[2 + inpos] >>> 26) & 31); + out[19 + outpos] = (in[2 + inpos] >>> 31) + | ((in[3 + inpos] & 15) << (5 - 4)); + out[20 + outpos] = ((in[3 + inpos] >>> 4) & 31); + out[21 + outpos] = ((in[3 + inpos] >>> 9) & 31); + out[22 + outpos] = ((in[3 + inpos] >>> 14) & 31); + out[23 + outpos] = ((in[3 + inpos] >>> 19) & 31); + out[24 + outpos] = ((in[3 + inpos] >>> 24) & 31); + out[25 + outpos] = (in[3 + inpos] >>> 29) + | ((in[4 + inpos] & 3) << (5 - 2)); + out[26 + outpos] = ((in[4 + inpos] >>> 2) & 31); + out[27 + outpos] = ((in[4 + inpos] >>> 7) & 31); + out[28 + outpos] = ((in[4 + inpos] >>> 12) & 31); + out[29 + outpos] = ((in[4 + inpos] >>> 17) & 31); + out[30 + outpos] = ((in[4 + inpos] >>> 22) & 31); + out[31 + outpos] = (in[4 + inpos] >>> 27); + } - protected static void fastunpack23(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 8388607) - ; - out[1 + outpos] = (in[0 + inpos] >>> 23) - | ((in[1 + inpos] & 16383) << (23 - 14)) - ; - out[2 + outpos] = (in[1 + inpos] >>> 14) - | ((in[2 + inpos] & 31) << (23 - 5)) - ; - out[3 + outpos] = ((in[2 + inpos] >>> 5) & 8388607) - ; - out[4 + outpos] = (in[2 + inpos] >>> 28) - | ((in[3 + inpos] & 524287) << (23 - 19)) - ; - out[5 + outpos] = (in[3 + inpos] >>> 19) - | ((in[4 + inpos] & 1023) << (23 - 10)) - ; - out[6 + outpos] = (in[4 + inpos] >>> 10) - | ((in[5 + inpos] & 1) << (23 - 1)) - ; - out[7 + outpos] = ((in[5 + inpos] >>> 1) & 8388607) - ; - out[8 + outpos] = (in[5 + inpos] >>> 24) - | ((in[6 + inpos] & 32767) << (23 - 15)) - ; - out[9 + outpos] = (in[6 + inpos] >>> 15) - | ((in[7 + inpos] & 63) << (23 - 6)) - ; - out[10 + outpos] = ((in[7 + inpos] >>> 6) & 8388607) - ; - out[11 + outpos] = (in[7 + inpos] >>> 29) - | ((in[8 + inpos] & 1048575) << (23 - 20)) - ; - out[12 + outpos] = (in[8 + inpos] >>> 20) - | ((in[9 + inpos] & 2047) << (23 - 11)) - ; - out[13 + outpos] = (in[9 + inpos] >>> 11) - | ((in[10 + inpos] & 3) << (23 - 2)) - ; - out[14 + outpos] = ((in[10 + inpos] >>> 2) & 8388607) - ; - out[15 + outpos] = (in[10 + inpos] >>> 25) - | ((in[11 + inpos] & 65535) << (23 - 16)) - ; - out[16 + outpos] = (in[11 + inpos] >>> 16) - | ((in[12 + inpos] & 127) << (23 - 7)) - ; - out[17 + outpos] = ((in[12 + inpos] >>> 7) & 8388607) - ; - out[18 + outpos] = (in[12 + inpos] >>> 30) - | ((in[13 + inpos] & 2097151) << (23 - 21)) - ; - out[19 + outpos] = (in[13 + inpos] >>> 21) - | ((in[14 + inpos] & 4095) << (23 - 12)) - ; - out[20 + outpos] = (in[14 + inpos] >>> 12) - | ((in[15 + inpos] & 7) << (23 - 3)) - ; - out[21 + outpos] = ((in[15 + inpos] >>> 3) & 8388607) - ; - out[22 + outpos] = (in[15 + inpos] >>> 26) - | ((in[16 + inpos] & 131071) << (23 - 17)) - ; - out[23 + outpos] = (in[16 + inpos] >>> 17) - | ((in[17 + inpos] & 255) << (23 - 8)) - ; - out[24 + outpos] = ((in[17 + inpos] >>> 8) & 8388607) - ; - out[25 + outpos] = (in[17 + inpos] >>> 31) - | ((in[18 + inpos] & 4194303) << (23 - 22)) - ; - out[26 + outpos] = (in[18 + inpos] >>> 22) - | ((in[19 + inpos] & 8191) << (23 - 13)) - ; - out[27 + outpos] = (in[19 + inpos] >>> 13) - | ((in[20 + inpos] & 15) << (23 - 4)) - ; - out[28 + outpos] = ((in[20 + inpos] >>> 4) & 8388607) - ; - out[29 + outpos] = (in[20 + inpos] >>> 27) - | ((in[21 + inpos] & 262143) << (23 - 18)) - ; - out[30 + outpos] = (in[21 + inpos] >>> 18) - | ((in[22 + inpos] & 511) << (23 - 9)) - ; - out[31 + outpos] = (in[22 + inpos] >>> 9) - ; - } + protected static void fastunpack6(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 63); + out[1 + outpos] = ((in[0 + inpos] >>> 6) & 63); + out[2 + outpos] = ((in[0 + inpos] >>> 12) & 63); + out[3 + outpos] = ((in[0 + inpos] >>> 18) & 63); + out[4 + outpos] = ((in[0 + inpos] >>> 24) & 63); + out[5 + outpos] = (in[0 + inpos] >>> 30) + | ((in[1 + inpos] & 15) << (6 - 4)); + out[6 + outpos] = ((in[1 + inpos] >>> 4) & 63); + out[7 + outpos] = ((in[1 + inpos] >>> 10) & 63); + out[8 + outpos] = ((in[1 + inpos] >>> 16) & 63); + out[9 + outpos] = ((in[1 + inpos] >>> 22) & 63); + out[10 + outpos] = (in[1 + inpos] >>> 28) + | ((in[2 + inpos] & 3) << (6 - 2)); + out[11 + outpos] = ((in[2 + inpos] >>> 2) & 63); + out[12 + outpos] = ((in[2 + inpos] >>> 8) & 63); + out[13 + outpos] = ((in[2 + inpos] >>> 14) & 63); + out[14 + outpos] = ((in[2 + inpos] >>> 20) & 63); + out[15 + outpos] = (in[2 + inpos] >>> 26); + out[16 + outpos] = ((in[3 + inpos] >>> 0) & 63); + out[17 + outpos] = ((in[3 + inpos] >>> 6) & 63); + out[18 + outpos] = ((in[3 + inpos] >>> 12) & 63); + out[19 + outpos] = ((in[3 + inpos] >>> 18) & 63); + out[20 + outpos] = ((in[3 + inpos] >>> 24) & 63); + out[21 + outpos] = (in[3 + inpos] >>> 30) + | ((in[4 + inpos] & 15) << (6 - 4)); + out[22 + outpos] = ((in[4 + inpos] >>> 4) & 63); + out[23 + outpos] = ((in[4 + inpos] >>> 10) & 63); + out[24 + outpos] = ((in[4 + inpos] >>> 16) & 63); + out[25 + outpos] = ((in[4 + inpos] >>> 22) & 63); + out[26 + outpos] = (in[4 + inpos] >>> 28) + | ((in[5 + inpos] & 3) << (6 - 2)); + out[27 + outpos] = ((in[5 + inpos] >>> 2) & 63); + out[28 + outpos] = ((in[5 + inpos] >>> 8) & 63); + out[29 + outpos] = ((in[5 + inpos] >>> 14) & 63); + out[30 + outpos] = ((in[5 + inpos] >>> 20) & 63); + out[31 + outpos] = (in[5 + inpos] >>> 26); + } + protected static void fastunpack7(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 127); + out[1 + outpos] = ((in[0 + inpos] >>> 7) & 127); + out[2 + outpos] = ((in[0 + inpos] >>> 14) & 127); + out[3 + outpos] = ((in[0 + inpos] >>> 21) & 127); + out[4 + outpos] = (in[0 + inpos] >>> 28) + | ((in[1 + inpos] & 7) << (7 - 3)); + out[5 + outpos] = ((in[1 + inpos] >>> 3) & 127); + out[6 + outpos] = ((in[1 + inpos] >>> 10) & 127); + out[7 + outpos] = ((in[1 + inpos] >>> 17) & 127); + out[8 + outpos] = ((in[1 + inpos] >>> 24) & 127); + out[9 + outpos] = (in[1 + inpos] >>> 31) + | ((in[2 + inpos] & 63) << (7 - 6)); + out[10 + outpos] = ((in[2 + inpos] >>> 6) & 127); + out[11 + outpos] = ((in[2 + inpos] >>> 13) & 127); + out[12 + outpos] = ((in[2 + inpos] >>> 20) & 127); + out[13 + outpos] = (in[2 + inpos] >>> 27) + | ((in[3 + inpos] & 3) << (7 - 2)); + out[14 + outpos] = ((in[3 + inpos] >>> 2) & 127); + out[15 + outpos] = ((in[3 + inpos] >>> 9) & 127); + out[16 + outpos] = ((in[3 + inpos] >>> 16) & 127); + out[17 + outpos] = ((in[3 + inpos] >>> 23) & 127); + out[18 + outpos] = (in[3 + inpos] >>> 30) + | ((in[4 + inpos] & 31) << (7 - 5)); + out[19 + outpos] = ((in[4 + inpos] >>> 5) & 127); + out[20 + outpos] = ((in[4 + inpos] >>> 12) & 127); + out[21 + outpos] = ((in[4 + inpos] >>> 19) & 127); + out[22 + outpos] = (in[4 + inpos] >>> 26) + | ((in[5 + inpos] & 1) << (7 - 1)); + out[23 + outpos] = ((in[5 + inpos] >>> 1) & 127); + out[24 + outpos] = ((in[5 + inpos] >>> 8) & 127); + out[25 + outpos] = ((in[5 + inpos] >>> 15) & 127); + out[26 + outpos] = ((in[5 + inpos] >>> 22) & 127); + out[27 + outpos] = (in[5 + inpos] >>> 29) + | ((in[6 + inpos] & 15) << (7 - 4)); + out[28 + outpos] = ((in[6 + inpos] >>> 4) & 127); + out[29 + outpos] = ((in[6 + inpos] >>> 11) & 127); + out[30 + outpos] = ((in[6 + inpos] >>> 18) & 127); + out[31 + outpos] = (in[6 + inpos] >>> 25); + } - protected static void fastunpack24(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 16777215) - ; - out[1 + outpos] = (in[0 + inpos] >>> 24) - | ((in[1 + inpos] & 65535) << (24 - 16)) - ; - out[2 + outpos] = (in[1 + inpos] >>> 16) - | ((in[2 + inpos] & 255) << (24 - 8)) - ; - out[3 + outpos] = (in[2 + inpos] >>> 8) - ; - out[4 + outpos] = ((in[3 + inpos] >>> 0) & 16777215) - ; - out[5 + outpos] = (in[3 + inpos] >>> 24) - | ((in[4 + inpos] & 65535) << (24 - 16)) - ; - out[6 + outpos] = (in[4 + inpos] >>> 16) - | ((in[5 + inpos] & 255) << (24 - 8)) - ; - out[7 + outpos] = (in[5 + inpos] >>> 8) - ; - out[8 + outpos] = ((in[6 + inpos] >>> 0) & 16777215) - ; - out[9 + outpos] = (in[6 + inpos] >>> 24) - | ((in[7 + inpos] & 65535) << (24 - 16)) - ; - out[10 + outpos] = (in[7 + inpos] >>> 16) - | ((in[8 + inpos] & 255) << (24 - 8)) - ; - out[11 + outpos] = (in[8 + inpos] >>> 8) - ; - out[12 + outpos] = ((in[9 + inpos] >>> 0) & 16777215) - ; - out[13 + outpos] = (in[9 + inpos] >>> 24) - | ((in[10 + inpos] & 65535) << (24 - 16)) - ; - out[14 + outpos] = (in[10 + inpos] >>> 16) - | ((in[11 + inpos] & 255) << (24 - 8)) - ; - out[15 + outpos] = (in[11 + inpos] >>> 8) - ; - out[16 + outpos] = ((in[12 + inpos] >>> 0) & 16777215) - ; - out[17 + outpos] = (in[12 + inpos] >>> 24) - | ((in[13 + inpos] & 65535) << (24 - 16)) - ; - out[18 + outpos] = (in[13 + inpos] >>> 16) - | ((in[14 + inpos] & 255) << (24 - 8)) - ; - out[19 + outpos] = (in[14 + inpos] >>> 8) - ; - out[20 + outpos] = ((in[15 + inpos] >>> 0) & 16777215) - ; - out[21 + outpos] = (in[15 + inpos] >>> 24) - | ((in[16 + inpos] & 65535) << (24 - 16)) - ; - out[22 + outpos] = (in[16 + inpos] >>> 16) - | ((in[17 + inpos] & 255) << (24 - 8)) - ; - out[23 + outpos] = (in[17 + inpos] >>> 8) - ; - out[24 + outpos] = ((in[18 + inpos] >>> 0) & 16777215) - ; - out[25 + outpos] = (in[18 + inpos] >>> 24) - | ((in[19 + inpos] & 65535) << (24 - 16)) - ; - out[26 + outpos] = (in[19 + inpos] >>> 16) - | ((in[20 + inpos] & 255) << (24 - 8)) - ; - out[27 + outpos] = (in[20 + inpos] >>> 8) - ; - out[28 + outpos] = ((in[21 + inpos] >>> 0) & 16777215) - ; - out[29 + outpos] = (in[21 + inpos] >>> 24) - | ((in[22 + inpos] & 65535) << (24 - 16)) - ; - out[30 + outpos] = (in[22 + inpos] >>> 16) - | ((in[23 + inpos] & 255) << (24 - 8)) - ; - out[31 + outpos] = (in[23 + inpos] >>> 8) - ; - } + protected static void fastunpack8(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 255); + out[1 + outpos] = ((in[0 + inpos] >>> 8) & 255); + out[2 + outpos] = ((in[0 + inpos] >>> 16) & 255); + out[3 + outpos] = (in[0 + inpos] >>> 24); + out[4 + outpos] = ((in[1 + inpos] >>> 0) & 255); + out[5 + outpos] = ((in[1 + inpos] >>> 8) & 255); + out[6 + outpos] = ((in[1 + inpos] >>> 16) & 255); + out[7 + outpos] = (in[1 + inpos] >>> 24); + out[8 + outpos] = ((in[2 + inpos] >>> 0) & 255); + out[9 + outpos] = ((in[2 + inpos] >>> 8) & 255); + out[10 + outpos] = ((in[2 + inpos] >>> 16) & 255); + out[11 + outpos] = (in[2 + inpos] >>> 24); + out[12 + outpos] = ((in[3 + inpos] >>> 0) & 255); + out[13 + outpos] = ((in[3 + inpos] >>> 8) & 255); + out[14 + outpos] = ((in[3 + inpos] >>> 16) & 255); + out[15 + outpos] = (in[3 + inpos] >>> 24); + out[16 + outpos] = ((in[4 + inpos] >>> 0) & 255); + out[17 + outpos] = ((in[4 + inpos] >>> 8) & 255); + out[18 + outpos] = ((in[4 + inpos] >>> 16) & 255); + out[19 + outpos] = (in[4 + inpos] >>> 24); + out[20 + outpos] = ((in[5 + inpos] >>> 0) & 255); + out[21 + outpos] = ((in[5 + inpos] >>> 8) & 255); + out[22 + outpos] = ((in[5 + inpos] >>> 16) & 255); + out[23 + outpos] = (in[5 + inpos] >>> 24); + out[24 + outpos] = ((in[6 + inpos] >>> 0) & 255); + out[25 + outpos] = ((in[6 + inpos] >>> 8) & 255); + out[26 + outpos] = ((in[6 + inpos] >>> 16) & 255); + out[27 + outpos] = (in[6 + inpos] >>> 24); + out[28 + outpos] = ((in[7 + inpos] >>> 0) & 255); + out[29 + outpos] = ((in[7 + inpos] >>> 8) & 255); + out[30 + outpos] = ((in[7 + inpos] >>> 16) & 255); + out[31 + outpos] = (in[7 + inpos] >>> 24); + } + protected static void fastunpack9(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 511); + out[1 + outpos] = ((in[0 + inpos] >>> 9) & 511); + out[2 + outpos] = ((in[0 + inpos] >>> 18) & 511); + out[3 + outpos] = (in[0 + inpos] >>> 27) + | ((in[1 + inpos] & 15) << (9 - 4)); + out[4 + outpos] = ((in[1 + inpos] >>> 4) & 511); + out[5 + outpos] = ((in[1 + inpos] >>> 13) & 511); + out[6 + outpos] = ((in[1 + inpos] >>> 22) & 511); + out[7 + outpos] = (in[1 + inpos] >>> 31) + | ((in[2 + inpos] & 255) << (9 - 8)); + out[8 + outpos] = ((in[2 + inpos] >>> 8) & 511); + out[9 + outpos] = ((in[2 + inpos] >>> 17) & 511); + out[10 + outpos] = (in[2 + inpos] >>> 26) + | ((in[3 + inpos] & 7) << (9 - 3)); + out[11 + outpos] = ((in[3 + inpos] >>> 3) & 511); + out[12 + outpos] = ((in[3 + inpos] >>> 12) & 511); + out[13 + outpos] = ((in[3 + inpos] >>> 21) & 511); + out[14 + outpos] = (in[3 + inpos] >>> 30) + | ((in[4 + inpos] & 127) << (9 - 7)); + out[15 + outpos] = ((in[4 + inpos] >>> 7) & 511); + out[16 + outpos] = ((in[4 + inpos] >>> 16) & 511); + out[17 + outpos] = (in[4 + inpos] >>> 25) + | ((in[5 + inpos] & 3) << (9 - 2)); + out[18 + outpos] = ((in[5 + inpos] >>> 2) & 511); + out[19 + outpos] = ((in[5 + inpos] >>> 11) & 511); + out[20 + outpos] = ((in[5 + inpos] >>> 20) & 511); + out[21 + outpos] = (in[5 + inpos] >>> 29) + | ((in[6 + inpos] & 63) << (9 - 6)); + out[22 + outpos] = ((in[6 + inpos] >>> 6) & 511); + out[23 + outpos] = ((in[6 + inpos] >>> 15) & 511); + out[24 + outpos] = (in[6 + inpos] >>> 24) + | ((in[7 + inpos] & 1) << (9 - 1)); + out[25 + outpos] = ((in[7 + inpos] >>> 1) & 511); + out[26 + outpos] = ((in[7 + inpos] >>> 10) & 511); + out[27 + outpos] = ((in[7 + inpos] >>> 19) & 511); + out[28 + outpos] = (in[7 + inpos] >>> 28) + | ((in[8 + inpos] & 31) << (9 - 5)); + out[29 + outpos] = ((in[8 + inpos] >>> 5) & 511); + out[30 + outpos] = ((in[8 + inpos] >>> 14) & 511); + out[31 + outpos] = (in[8 + inpos] >>> 23); + } - protected static void fastunpack25(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 33554431) - ; - out[1 + outpos] = (in[0 + inpos] >>> 25) - | ((in[1 + inpos] & 262143) << (25 - 18)) - ; - out[2 + outpos] = (in[1 + inpos] >>> 18) - | ((in[2 + inpos] & 2047) << (25 - 11)) - ; - out[3 + outpos] = (in[2 + inpos] >>> 11) - | ((in[3 + inpos] & 15) << (25 - 4)) - ; - out[4 + outpos] = ((in[3 + inpos] >>> 4) & 33554431) - ; - out[5 + outpos] = (in[3 + inpos] >>> 29) - | ((in[4 + inpos] & 4194303) << (25 - 22)) - ; - out[6 + outpos] = (in[4 + inpos] >>> 22) - | ((in[5 + inpos] & 32767) << (25 - 15)) - ; - out[7 + outpos] = (in[5 + inpos] >>> 15) - | ((in[6 + inpos] & 255) << (25 - 8)) - ; - out[8 + outpos] = (in[6 + inpos] >>> 8) - | ((in[7 + inpos] & 1) << (25 - 1)) - ; - out[9 + outpos] = ((in[7 + inpos] >>> 1) & 33554431) - ; - out[10 + outpos] = (in[7 + inpos] >>> 26) - | ((in[8 + inpos] & 524287) << (25 - 19)) - ; - out[11 + outpos] = (in[8 + inpos] >>> 19) - | ((in[9 + inpos] & 4095) << (25 - 12)) - ; - out[12 + outpos] = (in[9 + inpos] >>> 12) - | ((in[10 + inpos] & 31) << (25 - 5)) - ; - out[13 + outpos] = ((in[10 + inpos] >>> 5) & 33554431) - ; - out[14 + outpos] = (in[10 + inpos] >>> 30) - | ((in[11 + inpos] & 8388607) << (25 - 23)) - ; - out[15 + outpos] = (in[11 + inpos] >>> 23) - | ((in[12 + inpos] & 65535) << (25 - 16)) - ; - out[16 + outpos] = (in[12 + inpos] >>> 16) - | ((in[13 + inpos] & 511) << (25 - 9)) - ; - out[17 + outpos] = (in[13 + inpos] >>> 9) - | ((in[14 + inpos] & 3) << (25 - 2)) - ; - out[18 + outpos] = ((in[14 + inpos] >>> 2) & 33554431) - ; - out[19 + outpos] = (in[14 + inpos] >>> 27) - | ((in[15 + inpos] & 1048575) << (25 - 20)) - ; - out[20 + outpos] = (in[15 + inpos] >>> 20) - | ((in[16 + inpos] & 8191) << (25 - 13)) - ; - out[21 + outpos] = (in[16 + inpos] >>> 13) - | ((in[17 + inpos] & 63) << (25 - 6)) - ; - out[22 + outpos] = ((in[17 + inpos] >>> 6) & 33554431) - ; - out[23 + outpos] = (in[17 + inpos] >>> 31) - | ((in[18 + inpos] & 16777215) << (25 - 24)) - ; - out[24 + outpos] = (in[18 + inpos] >>> 24) - | ((in[19 + inpos] & 131071) << (25 - 17)) - ; - out[25 + outpos] = (in[19 + inpos] >>> 17) - | ((in[20 + inpos] & 1023) << (25 - 10)) - ; - out[26 + outpos] = (in[20 + inpos] >>> 10) - | ((in[21 + inpos] & 7) << (25 - 3)) - ; - out[27 + outpos] = ((in[21 + inpos] >>> 3) & 33554431) - ; - out[28 + outpos] = (in[21 + inpos] >>> 28) - | ((in[22 + inpos] & 2097151) << (25 - 21)) - ; - out[29 + outpos] = (in[22 + inpos] >>> 21) - | ((in[23 + inpos] & 16383) << (25 - 14)) - ; - out[30 + outpos] = (in[23 + inpos] >>> 14) - | ((in[24 + inpos] & 127) << (25 - 7)) - ; - out[31 + outpos] = (in[24 + inpos] >>> 7) - ; - } + protected static void fastunpack10(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 1023); + out[1 + outpos] = ((in[0 + inpos] >>> 10) & 1023); + out[2 + outpos] = ((in[0 + inpos] >>> 20) & 1023); + out[3 + outpos] = (in[0 + inpos] >>> 30) + | ((in[1 + inpos] & 255) << (10 - 8)); + out[4 + outpos] = ((in[1 + inpos] >>> 8) & 1023); + out[5 + outpos] = ((in[1 + inpos] >>> 18) & 1023); + out[6 + outpos] = (in[1 + inpos] >>> 28) + | ((in[2 + inpos] & 63) << (10 - 6)); + out[7 + outpos] = ((in[2 + inpos] >>> 6) & 1023); + out[8 + outpos] = ((in[2 + inpos] >>> 16) & 1023); + out[9 + outpos] = (in[2 + inpos] >>> 26) + | ((in[3 + inpos] & 15) << (10 - 4)); + out[10 + outpos] = ((in[3 + inpos] >>> 4) & 1023); + out[11 + outpos] = ((in[3 + inpos] >>> 14) & 1023); + out[12 + outpos] = (in[3 + inpos] >>> 24) + | ((in[4 + inpos] & 3) << (10 - 2)); + out[13 + outpos] = ((in[4 + inpos] >>> 2) & 1023); + out[14 + outpos] = ((in[4 + inpos] >>> 12) & 1023); + out[15 + outpos] = (in[4 + inpos] >>> 22); + out[16 + outpos] = ((in[5 + inpos] >>> 0) & 1023); + out[17 + outpos] = ((in[5 + inpos] >>> 10) & 1023); + out[18 + outpos] = ((in[5 + inpos] >>> 20) & 1023); + out[19 + outpos] = (in[5 + inpos] >>> 30) + | ((in[6 + inpos] & 255) << (10 - 8)); + out[20 + outpos] = ((in[6 + inpos] >>> 8) & 1023); + out[21 + outpos] = ((in[6 + inpos] >>> 18) & 1023); + out[22 + outpos] = (in[6 + inpos] >>> 28) + | ((in[7 + inpos] & 63) << (10 - 6)); + out[23 + outpos] = ((in[7 + inpos] >>> 6) & 1023); + out[24 + outpos] = ((in[7 + inpos] >>> 16) & 1023); + out[25 + outpos] = (in[7 + inpos] >>> 26) + | ((in[8 + inpos] & 15) << (10 - 4)); + out[26 + outpos] = ((in[8 + inpos] >>> 4) & 1023); + out[27 + outpos] = ((in[8 + inpos] >>> 14) & 1023); + out[28 + outpos] = (in[8 + inpos] >>> 24) + | ((in[9 + inpos] & 3) << (10 - 2)); + out[29 + outpos] = ((in[9 + inpos] >>> 2) & 1023); + out[30 + outpos] = ((in[9 + inpos] >>> 12) & 1023); + out[31 + outpos] = (in[9 + inpos] >>> 22); + } + protected static void fastunpack11(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 2047); + out[1 + outpos] = ((in[0 + inpos] >>> 11) & 2047); + out[2 + outpos] = (in[0 + inpos] >>> 22) + | ((in[1 + inpos] & 1) << (11 - 1)); + out[3 + outpos] = ((in[1 + inpos] >>> 1) & 2047); + out[4 + outpos] = ((in[1 + inpos] >>> 12) & 2047); + out[5 + outpos] = (in[1 + inpos] >>> 23) + | ((in[2 + inpos] & 3) << (11 - 2)); + out[6 + outpos] = ((in[2 + inpos] >>> 2) & 2047); + out[7 + outpos] = ((in[2 + inpos] >>> 13) & 2047); + out[8 + outpos] = (in[2 + inpos] >>> 24) + | ((in[3 + inpos] & 7) << (11 - 3)); + out[9 + outpos] = ((in[3 + inpos] >>> 3) & 2047); + out[10 + outpos] = ((in[3 + inpos] >>> 14) & 2047); + out[11 + outpos] = (in[3 + inpos] >>> 25) + | ((in[4 + inpos] & 15) << (11 - 4)); + out[12 + outpos] = ((in[4 + inpos] >>> 4) & 2047); + out[13 + outpos] = ((in[4 + inpos] >>> 15) & 2047); + out[14 + outpos] = (in[4 + inpos] >>> 26) + | ((in[5 + inpos] & 31) << (11 - 5)); + out[15 + outpos] = ((in[5 + inpos] >>> 5) & 2047); + out[16 + outpos] = ((in[5 + inpos] >>> 16) & 2047); + out[17 + outpos] = (in[5 + inpos] >>> 27) + | ((in[6 + inpos] & 63) << (11 - 6)); + out[18 + outpos] = ((in[6 + inpos] >>> 6) & 2047); + out[19 + outpos] = ((in[6 + inpos] >>> 17) & 2047); + out[20 + outpos] = (in[6 + inpos] >>> 28) + | ((in[7 + inpos] & 127) << (11 - 7)); + out[21 + outpos] = ((in[7 + inpos] >>> 7) & 2047); + out[22 + outpos] = ((in[7 + inpos] >>> 18) & 2047); + out[23 + outpos] = (in[7 + inpos] >>> 29) + | ((in[8 + inpos] & 255) << (11 - 8)); + out[24 + outpos] = ((in[8 + inpos] >>> 8) & 2047); + out[25 + outpos] = ((in[8 + inpos] >>> 19) & 2047); + out[26 + outpos] = (in[8 + inpos] >>> 30) + | ((in[9 + inpos] & 511) << (11 - 9)); + out[27 + outpos] = ((in[9 + inpos] >>> 9) & 2047); + out[28 + outpos] = ((in[9 + inpos] >>> 20) & 2047); + out[29 + outpos] = (in[9 + inpos] >>> 31) + | ((in[10 + inpos] & 1023) << (11 - 10)); + out[30 + outpos] = ((in[10 + inpos] >>> 10) & 2047); + out[31 + outpos] = (in[10 + inpos] >>> 21); + } - protected static void fastunpack26(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 67108863) - ; - out[1 + outpos] = (in[0 + inpos] >>> 26) - | ((in[1 + inpos] & 1048575) << (26 - 20)) - ; - out[2 + outpos] = (in[1 + inpos] >>> 20) - | ((in[2 + inpos] & 16383) << (26 - 14)) - ; - out[3 + outpos] = (in[2 + inpos] >>> 14) - | ((in[3 + inpos] & 255) << (26 - 8)) - ; - out[4 + outpos] = (in[3 + inpos] >>> 8) - | ((in[4 + inpos] & 3) << (26 - 2)) - ; - out[5 + outpos] = ((in[4 + inpos] >>> 2) & 67108863) - ; - out[6 + outpos] = (in[4 + inpos] >>> 28) - | ((in[5 + inpos] & 4194303) << (26 - 22)) - ; - out[7 + outpos] = (in[5 + inpos] >>> 22) - | ((in[6 + inpos] & 65535) << (26 - 16)) - ; - out[8 + outpos] = (in[6 + inpos] >>> 16) - | ((in[7 + inpos] & 1023) << (26 - 10)) - ; - out[9 + outpos] = (in[7 + inpos] >>> 10) - | ((in[8 + inpos] & 15) << (26 - 4)) - ; - out[10 + outpos] = ((in[8 + inpos] >>> 4) & 67108863) - ; - out[11 + outpos] = (in[8 + inpos] >>> 30) - | ((in[9 + inpos] & 16777215) << (26 - 24)) - ; - out[12 + outpos] = (in[9 + inpos] >>> 24) - | ((in[10 + inpos] & 262143) << (26 - 18)) - ; - out[13 + outpos] = (in[10 + inpos] >>> 18) - | ((in[11 + inpos] & 4095) << (26 - 12)) - ; - out[14 + outpos] = (in[11 + inpos] >>> 12) - | ((in[12 + inpos] & 63) << (26 - 6)) - ; - out[15 + outpos] = (in[12 + inpos] >>> 6) - ; - out[16 + outpos] = ((in[13 + inpos] >>> 0) & 67108863) - ; - out[17 + outpos] = (in[13 + inpos] >>> 26) - | ((in[14 + inpos] & 1048575) << (26 - 20)) - ; - out[18 + outpos] = (in[14 + inpos] >>> 20) - | ((in[15 + inpos] & 16383) << (26 - 14)) - ; - out[19 + outpos] = (in[15 + inpos] >>> 14) - | ((in[16 + inpos] & 255) << (26 - 8)) - ; - out[20 + outpos] = (in[16 + inpos] >>> 8) - | ((in[17 + inpos] & 3) << (26 - 2)) - ; - out[21 + outpos] = ((in[17 + inpos] >>> 2) & 67108863) - ; - out[22 + outpos] = (in[17 + inpos] >>> 28) - | ((in[18 + inpos] & 4194303) << (26 - 22)) - ; - out[23 + outpos] = (in[18 + inpos] >>> 22) - | ((in[19 + inpos] & 65535) << (26 - 16)) - ; - out[24 + outpos] = (in[19 + inpos] >>> 16) - | ((in[20 + inpos] & 1023) << (26 - 10)) - ; - out[25 + outpos] = (in[20 + inpos] >>> 10) - | ((in[21 + inpos] & 15) << (26 - 4)) - ; - out[26 + outpos] = ((in[21 + inpos] >>> 4) & 67108863) - ; - out[27 + outpos] = (in[21 + inpos] >>> 30) - | ((in[22 + inpos] & 16777215) << (26 - 24)) - ; - out[28 + outpos] = (in[22 + inpos] >>> 24) - | ((in[23 + inpos] & 262143) << (26 - 18)) - ; - out[29 + outpos] = (in[23 + inpos] >>> 18) - | ((in[24 + inpos] & 4095) << (26 - 12)) - ; - out[30 + outpos] = (in[24 + inpos] >>> 12) - | ((in[25 + inpos] & 63) << (26 - 6)) - ; - out[31 + outpos] = (in[25 + inpos] >>> 6) - ; - } + protected static void fastunpack12(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 4095); + out[1 + outpos] = ((in[0 + inpos] >>> 12) & 4095); + out[2 + outpos] = (in[0 + inpos] >>> 24) + | ((in[1 + inpos] & 15) << (12 - 4)); + out[3 + outpos] = ((in[1 + inpos] >>> 4) & 4095); + out[4 + outpos] = ((in[1 + inpos] >>> 16) & 4095); + out[5 + outpos] = (in[1 + inpos] >>> 28) + | ((in[2 + inpos] & 255) << (12 - 8)); + out[6 + outpos] = ((in[2 + inpos] >>> 8) & 4095); + out[7 + outpos] = (in[2 + inpos] >>> 20); + out[8 + outpos] = ((in[3 + inpos] >>> 0) & 4095); + out[9 + outpos] = ((in[3 + inpos] >>> 12) & 4095); + out[10 + outpos] = (in[3 + inpos] >>> 24) + | ((in[4 + inpos] & 15) << (12 - 4)); + out[11 + outpos] = ((in[4 + inpos] >>> 4) & 4095); + out[12 + outpos] = ((in[4 + inpos] >>> 16) & 4095); + out[13 + outpos] = (in[4 + inpos] >>> 28) + | ((in[5 + inpos] & 255) << (12 - 8)); + out[14 + outpos] = ((in[5 + inpos] >>> 8) & 4095); + out[15 + outpos] = (in[5 + inpos] >>> 20); + out[16 + outpos] = ((in[6 + inpos] >>> 0) & 4095); + out[17 + outpos] = ((in[6 + inpos] >>> 12) & 4095); + out[18 + outpos] = (in[6 + inpos] >>> 24) + | ((in[7 + inpos] & 15) << (12 - 4)); + out[19 + outpos] = ((in[7 + inpos] >>> 4) & 4095); + out[20 + outpos] = ((in[7 + inpos] >>> 16) & 4095); + out[21 + outpos] = (in[7 + inpos] >>> 28) + | ((in[8 + inpos] & 255) << (12 - 8)); + out[22 + outpos] = ((in[8 + inpos] >>> 8) & 4095); + out[23 + outpos] = (in[8 + inpos] >>> 20); + out[24 + outpos] = ((in[9 + inpos] >>> 0) & 4095); + out[25 + outpos] = ((in[9 + inpos] >>> 12) & 4095); + out[26 + outpos] = (in[9 + inpos] >>> 24) + | ((in[10 + inpos] & 15) << (12 - 4)); + out[27 + outpos] = ((in[10 + inpos] >>> 4) & 4095); + out[28 + outpos] = ((in[10 + inpos] >>> 16) & 4095); + out[29 + outpos] = (in[10 + inpos] >>> 28) + | ((in[11 + inpos] & 255) << (12 - 8)); + out[30 + outpos] = ((in[11 + inpos] >>> 8) & 4095); + out[31 + outpos] = (in[11 + inpos] >>> 20); + } + protected static void fastunpack13(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 8191); + out[1 + outpos] = ((in[0 + inpos] >>> 13) & 8191); + out[2 + outpos] = (in[0 + inpos] >>> 26) + | ((in[1 + inpos] & 127) << (13 - 7)); + out[3 + outpos] = ((in[1 + inpos] >>> 7) & 8191); + out[4 + outpos] = (in[1 + inpos] >>> 20) + | ((in[2 + inpos] & 1) << (13 - 1)); + out[5 + outpos] = ((in[2 + inpos] >>> 1) & 8191); + out[6 + outpos] = ((in[2 + inpos] >>> 14) & 8191); + out[7 + outpos] = (in[2 + inpos] >>> 27) + | ((in[3 + inpos] & 255) << (13 - 8)); + out[8 + outpos] = ((in[3 + inpos] >>> 8) & 8191); + out[9 + outpos] = (in[3 + inpos] >>> 21) + | ((in[4 + inpos] & 3) << (13 - 2)); + out[10 + outpos] = ((in[4 + inpos] >>> 2) & 8191); + out[11 + outpos] = ((in[4 + inpos] >>> 15) & 8191); + out[12 + outpos] = (in[4 + inpos] >>> 28) + | ((in[5 + inpos] & 511) << (13 - 9)); + out[13 + outpos] = ((in[5 + inpos] >>> 9) & 8191); + out[14 + outpos] = (in[5 + inpos] >>> 22) + | ((in[6 + inpos] & 7) << (13 - 3)); + out[15 + outpos] = ((in[6 + inpos] >>> 3) & 8191); + out[16 + outpos] = ((in[6 + inpos] >>> 16) & 8191); + out[17 + outpos] = (in[6 + inpos] >>> 29) + | ((in[7 + inpos] & 1023) << (13 - 10)); + out[18 + outpos] = ((in[7 + inpos] >>> 10) & 8191); + out[19 + outpos] = (in[7 + inpos] >>> 23) + | ((in[8 + inpos] & 15) << (13 - 4)); + out[20 + outpos] = ((in[8 + inpos] >>> 4) & 8191); + out[21 + outpos] = ((in[8 + inpos] >>> 17) & 8191); + out[22 + outpos] = (in[8 + inpos] >>> 30) + | ((in[9 + inpos] & 2047) << (13 - 11)); + out[23 + outpos] = ((in[9 + inpos] >>> 11) & 8191); + out[24 + outpos] = (in[9 + inpos] >>> 24) + | ((in[10 + inpos] & 31) << (13 - 5)); + out[25 + outpos] = ((in[10 + inpos] >>> 5) & 8191); + out[26 + outpos] = ((in[10 + inpos] >>> 18) & 8191); + out[27 + outpos] = (in[10 + inpos] >>> 31) + | ((in[11 + inpos] & 4095) << (13 - 12)); + out[28 + outpos] = ((in[11 + inpos] >>> 12) & 8191); + out[29 + outpos] = (in[11 + inpos] >>> 25) + | ((in[12 + inpos] & 63) << (13 - 6)); + out[30 + outpos] = ((in[12 + inpos] >>> 6) & 8191); + out[31 + outpos] = (in[12 + inpos] >>> 19); + } - protected static void fastunpack27(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 134217727) - ; - out[1 + outpos] = (in[0 + inpos] >>> 27) - | ((in[1 + inpos] & 4194303) << (27 - 22)) - ; - out[2 + outpos] = (in[1 + inpos] >>> 22) - | ((in[2 + inpos] & 131071) << (27 - 17)) - ; - out[3 + outpos] = (in[2 + inpos] >>> 17) - | ((in[3 + inpos] & 4095) << (27 - 12)) - ; - out[4 + outpos] = (in[3 + inpos] >>> 12) - | ((in[4 + inpos] & 127) << (27 - 7)) - ; - out[5 + outpos] = (in[4 + inpos] >>> 7) - | ((in[5 + inpos] & 3) << (27 - 2)) - ; - out[6 + outpos] = ((in[5 + inpos] >>> 2) & 134217727) - ; - out[7 + outpos] = (in[5 + inpos] >>> 29) - | ((in[6 + inpos] & 16777215) << (27 - 24)) - ; - out[8 + outpos] = (in[6 + inpos] >>> 24) - | ((in[7 + inpos] & 524287) << (27 - 19)) - ; - out[9 + outpos] = (in[7 + inpos] >>> 19) - | ((in[8 + inpos] & 16383) << (27 - 14)) - ; - out[10 + outpos] = (in[8 + inpos] >>> 14) - | ((in[9 + inpos] & 511) << (27 - 9)) - ; - out[11 + outpos] = (in[9 + inpos] >>> 9) - | ((in[10 + inpos] & 15) << (27 - 4)) - ; - out[12 + outpos] = ((in[10 + inpos] >>> 4) & 134217727) - ; - out[13 + outpos] = (in[10 + inpos] >>> 31) - | ((in[11 + inpos] & 67108863) << (27 - 26)) - ; - out[14 + outpos] = (in[11 + inpos] >>> 26) - | ((in[12 + inpos] & 2097151) << (27 - 21)) - ; - out[15 + outpos] = (in[12 + inpos] >>> 21) - | ((in[13 + inpos] & 65535) << (27 - 16)) - ; - out[16 + outpos] = (in[13 + inpos] >>> 16) - | ((in[14 + inpos] & 2047) << (27 - 11)) - ; - out[17 + outpos] = (in[14 + inpos] >>> 11) - | ((in[15 + inpos] & 63) << (27 - 6)) - ; - out[18 + outpos] = (in[15 + inpos] >>> 6) - | ((in[16 + inpos] & 1) << (27 - 1)) - ; - out[19 + outpos] = ((in[16 + inpos] >>> 1) & 134217727) - ; - out[20 + outpos] = (in[16 + inpos] >>> 28) - | ((in[17 + inpos] & 8388607) << (27 - 23)) - ; - out[21 + outpos] = (in[17 + inpos] >>> 23) - | ((in[18 + inpos] & 262143) << (27 - 18)) - ; - out[22 + outpos] = (in[18 + inpos] >>> 18) - | ((in[19 + inpos] & 8191) << (27 - 13)) - ; - out[23 + outpos] = (in[19 + inpos] >>> 13) - | ((in[20 + inpos] & 255) << (27 - 8)) - ; - out[24 + outpos] = (in[20 + inpos] >>> 8) - | ((in[21 + inpos] & 7) << (27 - 3)) - ; - out[25 + outpos] = ((in[21 + inpos] >>> 3) & 134217727) - ; - out[26 + outpos] = (in[21 + inpos] >>> 30) - | ((in[22 + inpos] & 33554431) << (27 - 25)) - ; - out[27 + outpos] = (in[22 + inpos] >>> 25) - | ((in[23 + inpos] & 1048575) << (27 - 20)) - ; - out[28 + outpos] = (in[23 + inpos] >>> 20) - | ((in[24 + inpos] & 32767) << (27 - 15)) - ; - out[29 + outpos] = (in[24 + inpos] >>> 15) - | ((in[25 + inpos] & 1023) << (27 - 10)) - ; - out[30 + outpos] = (in[25 + inpos] >>> 10) - | ((in[26 + inpos] & 31) << (27 - 5)) - ; - out[31 + outpos] = (in[26 + inpos] >>> 5) - ; - } + protected static void fastunpack14(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 16383); + out[1 + outpos] = ((in[0 + inpos] >>> 14) & 16383); + out[2 + outpos] = (in[0 + inpos] >>> 28) + | ((in[1 + inpos] & 1023) << (14 - 10)); + out[3 + outpos] = ((in[1 + inpos] >>> 10) & 16383); + out[4 + outpos] = (in[1 + inpos] >>> 24) + | ((in[2 + inpos] & 63) << (14 - 6)); + out[5 + outpos] = ((in[2 + inpos] >>> 6) & 16383); + out[6 + outpos] = (in[2 + inpos] >>> 20) + | ((in[3 + inpos] & 3) << (14 - 2)); + out[7 + outpos] = ((in[3 + inpos] >>> 2) & 16383); + out[8 + outpos] = ((in[3 + inpos] >>> 16) & 16383); + out[9 + outpos] = (in[3 + inpos] >>> 30) + | ((in[4 + inpos] & 4095) << (14 - 12)); + out[10 + outpos] = ((in[4 + inpos] >>> 12) & 16383); + out[11 + outpos] = (in[4 + inpos] >>> 26) + | ((in[5 + inpos] & 255) << (14 - 8)); + out[12 + outpos] = ((in[5 + inpos] >>> 8) & 16383); + out[13 + outpos] = (in[5 + inpos] >>> 22) + | ((in[6 + inpos] & 15) << (14 - 4)); + out[14 + outpos] = ((in[6 + inpos] >>> 4) & 16383); + out[15 + outpos] = (in[6 + inpos] >>> 18); + out[16 + outpos] = ((in[7 + inpos] >>> 0) & 16383); + out[17 + outpos] = ((in[7 + inpos] >>> 14) & 16383); + out[18 + outpos] = (in[7 + inpos] >>> 28) + | ((in[8 + inpos] & 1023) << (14 - 10)); + out[19 + outpos] = ((in[8 + inpos] >>> 10) & 16383); + out[20 + outpos] = (in[8 + inpos] >>> 24) + | ((in[9 + inpos] & 63) << (14 - 6)); + out[21 + outpos] = ((in[9 + inpos] >>> 6) & 16383); + out[22 + outpos] = (in[9 + inpos] >>> 20) + | ((in[10 + inpos] & 3) << (14 - 2)); + out[23 + outpos] = ((in[10 + inpos] >>> 2) & 16383); + out[24 + outpos] = ((in[10 + inpos] >>> 16) & 16383); + out[25 + outpos] = (in[10 + inpos] >>> 30) + | ((in[11 + inpos] & 4095) << (14 - 12)); + out[26 + outpos] = ((in[11 + inpos] >>> 12) & 16383); + out[27 + outpos] = (in[11 + inpos] >>> 26) + | ((in[12 + inpos] & 255) << (14 - 8)); + out[28 + outpos] = ((in[12 + inpos] >>> 8) & 16383); + out[29 + outpos] = (in[12 + inpos] >>> 22) + | ((in[13 + inpos] & 15) << (14 - 4)); + out[30 + outpos] = ((in[13 + inpos] >>> 4) & 16383); + out[31 + outpos] = (in[13 + inpos] >>> 18); + } + protected static void fastunpack15(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 32767); + out[1 + outpos] = ((in[0 + inpos] >>> 15) & 32767); + out[2 + outpos] = (in[0 + inpos] >>> 30) + | ((in[1 + inpos] & 8191) << (15 - 13)); + out[3 + outpos] = ((in[1 + inpos] >>> 13) & 32767); + out[4 + outpos] = (in[1 + inpos] >>> 28) + | ((in[2 + inpos] & 2047) << (15 - 11)); + out[5 + outpos] = ((in[2 + inpos] >>> 11) & 32767); + out[6 + outpos] = (in[2 + inpos] >>> 26) + | ((in[3 + inpos] & 511) << (15 - 9)); + out[7 + outpos] = ((in[3 + inpos] >>> 9) & 32767); + out[8 + outpos] = (in[3 + inpos] >>> 24) + | ((in[4 + inpos] & 127) << (15 - 7)); + out[9 + outpos] = ((in[4 + inpos] >>> 7) & 32767); + out[10 + outpos] = (in[4 + inpos] >>> 22) + | ((in[5 + inpos] & 31) << (15 - 5)); + out[11 + outpos] = ((in[5 + inpos] >>> 5) & 32767); + out[12 + outpos] = (in[5 + inpos] >>> 20) + | ((in[6 + inpos] & 7) << (15 - 3)); + out[13 + outpos] = ((in[6 + inpos] >>> 3) & 32767); + out[14 + outpos] = (in[6 + inpos] >>> 18) + | ((in[7 + inpos] & 1) << (15 - 1)); + out[15 + outpos] = ((in[7 + inpos] >>> 1) & 32767); + out[16 + outpos] = ((in[7 + inpos] >>> 16) & 32767); + out[17 + outpos] = (in[7 + inpos] >>> 31) + | ((in[8 + inpos] & 16383) << (15 - 14)); + out[18 + outpos] = ((in[8 + inpos] >>> 14) & 32767); + out[19 + outpos] = (in[8 + inpos] >>> 29) + | ((in[9 + inpos] & 4095) << (15 - 12)); + out[20 + outpos] = ((in[9 + inpos] >>> 12) & 32767); + out[21 + outpos] = (in[9 + inpos] >>> 27) + | ((in[10 + inpos] & 1023) << (15 - 10)); + out[22 + outpos] = ((in[10 + inpos] >>> 10) & 32767); + out[23 + outpos] = (in[10 + inpos] >>> 25) + | ((in[11 + inpos] & 255) << (15 - 8)); + out[24 + outpos] = ((in[11 + inpos] >>> 8) & 32767); + out[25 + outpos] = (in[11 + inpos] >>> 23) + | ((in[12 + inpos] & 63) << (15 - 6)); + out[26 + outpos] = ((in[12 + inpos] >>> 6) & 32767); + out[27 + outpos] = (in[12 + inpos] >>> 21) + | ((in[13 + inpos] & 15) << (15 - 4)); + out[28 + outpos] = ((in[13 + inpos] >>> 4) & 32767); + out[29 + outpos] = (in[13 + inpos] >>> 19) + | ((in[14 + inpos] & 3) << (15 - 2)); + out[30 + outpos] = ((in[14 + inpos] >>> 2) & 32767); + out[31 + outpos] = (in[14 + inpos] >>> 17); + } - protected static void fastunpack28(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 268435455) - ; - out[1 + outpos] = (in[0 + inpos] >>> 28) - | ((in[1 + inpos] & 16777215) << (28 - 24)) - ; - out[2 + outpos] = (in[1 + inpos] >>> 24) - | ((in[2 + inpos] & 1048575) << (28 - 20)) - ; - out[3 + outpos] = (in[2 + inpos] >>> 20) - | ((in[3 + inpos] & 65535) << (28 - 16)) - ; - out[4 + outpos] = (in[3 + inpos] >>> 16) - | ((in[4 + inpos] & 4095) << (28 - 12)) - ; - out[5 + outpos] = (in[4 + inpos] >>> 12) - | ((in[5 + inpos] & 255) << (28 - 8)) - ; - out[6 + outpos] = (in[5 + inpos] >>> 8) - | ((in[6 + inpos] & 15) << (28 - 4)) - ; - out[7 + outpos] = (in[6 + inpos] >>> 4) - ; - out[8 + outpos] = ((in[7 + inpos] >>> 0) & 268435455) - ; - out[9 + outpos] = (in[7 + inpos] >>> 28) - | ((in[8 + inpos] & 16777215) << (28 - 24)) - ; - out[10 + outpos] = (in[8 + inpos] >>> 24) - | ((in[9 + inpos] & 1048575) << (28 - 20)) - ; - out[11 + outpos] = (in[9 + inpos] >>> 20) - | ((in[10 + inpos] & 65535) << (28 - 16)) - ; - out[12 + outpos] = (in[10 + inpos] >>> 16) - | ((in[11 + inpos] & 4095) << (28 - 12)) - ; - out[13 + outpos] = (in[11 + inpos] >>> 12) - | ((in[12 + inpos] & 255) << (28 - 8)) - ; - out[14 + outpos] = (in[12 + inpos] >>> 8) - | ((in[13 + inpos] & 15) << (28 - 4)) - ; - out[15 + outpos] = (in[13 + inpos] >>> 4) - ; - out[16 + outpos] = ((in[14 + inpos] >>> 0) & 268435455) - ; - out[17 + outpos] = (in[14 + inpos] >>> 28) - | ((in[15 + inpos] & 16777215) << (28 - 24)) - ; - out[18 + outpos] = (in[15 + inpos] >>> 24) - | ((in[16 + inpos] & 1048575) << (28 - 20)) - ; - out[19 + outpos] = (in[16 + inpos] >>> 20) - | ((in[17 + inpos] & 65535) << (28 - 16)) - ; - out[20 + outpos] = (in[17 + inpos] >>> 16) - | ((in[18 + inpos] & 4095) << (28 - 12)) - ; - out[21 + outpos] = (in[18 + inpos] >>> 12) - | ((in[19 + inpos] & 255) << (28 - 8)) - ; - out[22 + outpos] = (in[19 + inpos] >>> 8) - | ((in[20 + inpos] & 15) << (28 - 4)) - ; - out[23 + outpos] = (in[20 + inpos] >>> 4) - ; - out[24 + outpos] = ((in[21 + inpos] >>> 0) & 268435455) - ; - out[25 + outpos] = (in[21 + inpos] >>> 28) - | ((in[22 + inpos] & 16777215) << (28 - 24)) - ; - out[26 + outpos] = (in[22 + inpos] >>> 24) - | ((in[23 + inpos] & 1048575) << (28 - 20)) - ; - out[27 + outpos] = (in[23 + inpos] >>> 20) - | ((in[24 + inpos] & 65535) << (28 - 16)) - ; - out[28 + outpos] = (in[24 + inpos] >>> 16) - | ((in[25 + inpos] & 4095) << (28 - 12)) - ; - out[29 + outpos] = (in[25 + inpos] >>> 12) - | ((in[26 + inpos] & 255) << (28 - 8)) - ; - out[30 + outpos] = (in[26 + inpos] >>> 8) - | ((in[27 + inpos] & 15) << (28 - 4)) - ; - out[31 + outpos] = (in[27 + inpos] >>> 4) - ; - } + protected static void fastunpack16(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 65535); + out[1 + outpos] = (in[0 + inpos] >>> 16); + out[2 + outpos] = ((in[1 + inpos] >>> 0) & 65535); + out[3 + outpos] = (in[1 + inpos] >>> 16); + out[4 + outpos] = ((in[2 + inpos] >>> 0) & 65535); + out[5 + outpos] = (in[2 + inpos] >>> 16); + out[6 + outpos] = ((in[3 + inpos] >>> 0) & 65535); + out[7 + outpos] = (in[3 + inpos] >>> 16); + out[8 + outpos] = ((in[4 + inpos] >>> 0) & 65535); + out[9 + outpos] = (in[4 + inpos] >>> 16); + out[10 + outpos] = ((in[5 + inpos] >>> 0) & 65535); + out[11 + outpos] = (in[5 + inpos] >>> 16); + out[12 + outpos] = ((in[6 + inpos] >>> 0) & 65535); + out[13 + outpos] = (in[6 + inpos] >>> 16); + out[14 + outpos] = ((in[7 + inpos] >>> 0) & 65535); + out[15 + outpos] = (in[7 + inpos] >>> 16); + out[16 + outpos] = ((in[8 + inpos] >>> 0) & 65535); + out[17 + outpos] = (in[8 + inpos] >>> 16); + out[18 + outpos] = ((in[9 + inpos] >>> 0) & 65535); + out[19 + outpos] = (in[9 + inpos] >>> 16); + out[20 + outpos] = ((in[10 + inpos] >>> 0) & 65535); + out[21 + outpos] = (in[10 + inpos] >>> 16); + out[22 + outpos] = ((in[11 + inpos] >>> 0) & 65535); + out[23 + outpos] = (in[11 + inpos] >>> 16); + out[24 + outpos] = ((in[12 + inpos] >>> 0) & 65535); + out[25 + outpos] = (in[12 + inpos] >>> 16); + out[26 + outpos] = ((in[13 + inpos] >>> 0) & 65535); + out[27 + outpos] = (in[13 + inpos] >>> 16); + out[28 + outpos] = ((in[14 + inpos] >>> 0) & 65535); + out[29 + outpos] = (in[14 + inpos] >>> 16); + out[30 + outpos] = ((in[15 + inpos] >>> 0) & 65535); + out[31 + outpos] = (in[15 + inpos] >>> 16); + } + protected static void fastunpack17(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 131071); + out[1 + outpos] = (in[0 + inpos] >>> 17) + | ((in[1 + inpos] & 3) << (17 - 2)); + out[2 + outpos] = ((in[1 + inpos] >>> 2) & 131071); + out[3 + outpos] = (in[1 + inpos] >>> 19) + | ((in[2 + inpos] & 15) << (17 - 4)); + out[4 + outpos] = ((in[2 + inpos] >>> 4) & 131071); + out[5 + outpos] = (in[2 + inpos] >>> 21) + | ((in[3 + inpos] & 63) << (17 - 6)); + out[6 + outpos] = ((in[3 + inpos] >>> 6) & 131071); + out[7 + outpos] = (in[3 + inpos] >>> 23) + | ((in[4 + inpos] & 255) << (17 - 8)); + out[8 + outpos] = ((in[4 + inpos] >>> 8) & 131071); + out[9 + outpos] = (in[4 + inpos] >>> 25) + | ((in[5 + inpos] & 1023) << (17 - 10)); + out[10 + outpos] = ((in[5 + inpos] >>> 10) & 131071); + out[11 + outpos] = (in[5 + inpos] >>> 27) + | ((in[6 + inpos] & 4095) << (17 - 12)); + out[12 + outpos] = ((in[6 + inpos] >>> 12) & 131071); + out[13 + outpos] = (in[6 + inpos] >>> 29) + | ((in[7 + inpos] & 16383) << (17 - 14)); + out[14 + outpos] = ((in[7 + inpos] >>> 14) & 131071); + out[15 + outpos] = (in[7 + inpos] >>> 31) + | ((in[8 + inpos] & 65535) << (17 - 16)); + out[16 + outpos] = (in[8 + inpos] >>> 16) + | ((in[9 + inpos] & 1) << (17 - 1)); + out[17 + outpos] = ((in[9 + inpos] >>> 1) & 131071); + out[18 + outpos] = (in[9 + inpos] >>> 18) + | ((in[10 + inpos] & 7) << (17 - 3)); + out[19 + outpos] = ((in[10 + inpos] >>> 3) & 131071); + out[20 + outpos] = (in[10 + inpos] >>> 20) + | ((in[11 + inpos] & 31) << (17 - 5)); + out[21 + outpos] = ((in[11 + inpos] >>> 5) & 131071); + out[22 + outpos] = (in[11 + inpos] >>> 22) + | ((in[12 + inpos] & 127) << (17 - 7)); + out[23 + outpos] = ((in[12 + inpos] >>> 7) & 131071); + out[24 + outpos] = (in[12 + inpos] >>> 24) + | ((in[13 + inpos] & 511) << (17 - 9)); + out[25 + outpos] = ((in[13 + inpos] >>> 9) & 131071); + out[26 + outpos] = (in[13 + inpos] >>> 26) + | ((in[14 + inpos] & 2047) << (17 - 11)); + out[27 + outpos] = ((in[14 + inpos] >>> 11) & 131071); + out[28 + outpos] = (in[14 + inpos] >>> 28) + | ((in[15 + inpos] & 8191) << (17 - 13)); + out[29 + outpos] = ((in[15 + inpos] >>> 13) & 131071); + out[30 + outpos] = (in[15 + inpos] >>> 30) + | ((in[16 + inpos] & 32767) << (17 - 15)); + out[31 + outpos] = (in[16 + inpos] >>> 15); + } - protected static void fastunpack29(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 536870911) - ; - out[1 + outpos] = (in[0 + inpos] >>> 29) - | ((in[1 + inpos] & 67108863) << (29 - 26)) - ; - out[2 + outpos] = (in[1 + inpos] >>> 26) - | ((in[2 + inpos] & 8388607) << (29 - 23)) - ; - out[3 + outpos] = (in[2 + inpos] >>> 23) - | ((in[3 + inpos] & 1048575) << (29 - 20)) - ; - out[4 + outpos] = (in[3 + inpos] >>> 20) - | ((in[4 + inpos] & 131071) << (29 - 17)) - ; - out[5 + outpos] = (in[4 + inpos] >>> 17) - | ((in[5 + inpos] & 16383) << (29 - 14)) - ; - out[6 + outpos] = (in[5 + inpos] >>> 14) - | ((in[6 + inpos] & 2047) << (29 - 11)) - ; - out[7 + outpos] = (in[6 + inpos] >>> 11) - | ((in[7 + inpos] & 255) << (29 - 8)) - ; - out[8 + outpos] = (in[7 + inpos] >>> 8) - | ((in[8 + inpos] & 31) << (29 - 5)) - ; - out[9 + outpos] = (in[8 + inpos] >>> 5) - | ((in[9 + inpos] & 3) << (29 - 2)) - ; - out[10 + outpos] = ((in[9 + inpos] >>> 2) & 536870911) - ; - out[11 + outpos] = (in[9 + inpos] >>> 31) - | ((in[10 + inpos] & 268435455) << (29 - 28)) - ; - out[12 + outpos] = (in[10 + inpos] >>> 28) - | ((in[11 + inpos] & 33554431) << (29 - 25)) - ; - out[13 + outpos] = (in[11 + inpos] >>> 25) - | ((in[12 + inpos] & 4194303) << (29 - 22)) - ; - out[14 + outpos] = (in[12 + inpos] >>> 22) - | ((in[13 + inpos] & 524287) << (29 - 19)) - ; - out[15 + outpos] = (in[13 + inpos] >>> 19) - | ((in[14 + inpos] & 65535) << (29 - 16)) - ; - out[16 + outpos] = (in[14 + inpos] >>> 16) - | ((in[15 + inpos] & 8191) << (29 - 13)) - ; - out[17 + outpos] = (in[15 + inpos] >>> 13) - | ((in[16 + inpos] & 1023) << (29 - 10)) - ; - out[18 + outpos] = (in[16 + inpos] >>> 10) - | ((in[17 + inpos] & 127) << (29 - 7)) - ; - out[19 + outpos] = (in[17 + inpos] >>> 7) - | ((in[18 + inpos] & 15) << (29 - 4)) - ; - out[20 + outpos] = (in[18 + inpos] >>> 4) - | ((in[19 + inpos] & 1) << (29 - 1)) - ; - out[21 + outpos] = ((in[19 + inpos] >>> 1) & 536870911) - ; - out[22 + outpos] = (in[19 + inpos] >>> 30) - | ((in[20 + inpos] & 134217727) << (29 - 27)) - ; - out[23 + outpos] = (in[20 + inpos] >>> 27) - | ((in[21 + inpos] & 16777215) << (29 - 24)) - ; - out[24 + outpos] = (in[21 + inpos] >>> 24) - | ((in[22 + inpos] & 2097151) << (29 - 21)) - ; - out[25 + outpos] = (in[22 + inpos] >>> 21) - | ((in[23 + inpos] & 262143) << (29 - 18)) - ; - out[26 + outpos] = (in[23 + inpos] >>> 18) - | ((in[24 + inpos] & 32767) << (29 - 15)) - ; - out[27 + outpos] = (in[24 + inpos] >>> 15) - | ((in[25 + inpos] & 4095) << (29 - 12)) - ; - out[28 + outpos] = (in[25 + inpos] >>> 12) - | ((in[26 + inpos] & 511) << (29 - 9)) - ; - out[29 + outpos] = (in[26 + inpos] >>> 9) - | ((in[27 + inpos] & 63) << (29 - 6)) - ; - out[30 + outpos] = (in[27 + inpos] >>> 6) - | ((in[28 + inpos] & 7) << (29 - 3)) - ; - out[31 + outpos] = (in[28 + inpos] >>> 3) - ; - } + protected static void fastunpack18(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 262143); + out[1 + outpos] = (in[0 + inpos] >>> 18) + | ((in[1 + inpos] & 15) << (18 - 4)); + out[2 + outpos] = ((in[1 + inpos] >>> 4) & 262143); + out[3 + outpos] = (in[1 + inpos] >>> 22) + | ((in[2 + inpos] & 255) << (18 - 8)); + out[4 + outpos] = ((in[2 + inpos] >>> 8) & 262143); + out[5 + outpos] = (in[2 + inpos] >>> 26) + | ((in[3 + inpos] & 4095) << (18 - 12)); + out[6 + outpos] = ((in[3 + inpos] >>> 12) & 262143); + out[7 + outpos] = (in[3 + inpos] >>> 30) + | ((in[4 + inpos] & 65535) << (18 - 16)); + out[8 + outpos] = (in[4 + inpos] >>> 16) + | ((in[5 + inpos] & 3) << (18 - 2)); + out[9 + outpos] = ((in[5 + inpos] >>> 2) & 262143); + out[10 + outpos] = (in[5 + inpos] >>> 20) + | ((in[6 + inpos] & 63) << (18 - 6)); + out[11 + outpos] = ((in[6 + inpos] >>> 6) & 262143); + out[12 + outpos] = (in[6 + inpos] >>> 24) + | ((in[7 + inpos] & 1023) << (18 - 10)); + out[13 + outpos] = ((in[7 + inpos] >>> 10) & 262143); + out[14 + outpos] = (in[7 + inpos] >>> 28) + | ((in[8 + inpos] & 16383) << (18 - 14)); + out[15 + outpos] = (in[8 + inpos] >>> 14); + out[16 + outpos] = ((in[9 + inpos] >>> 0) & 262143); + out[17 + outpos] = (in[9 + inpos] >>> 18) + | ((in[10 + inpos] & 15) << (18 - 4)); + out[18 + outpos] = ((in[10 + inpos] >>> 4) & 262143); + out[19 + outpos] = (in[10 + inpos] >>> 22) + | ((in[11 + inpos] & 255) << (18 - 8)); + out[20 + outpos] = ((in[11 + inpos] >>> 8) & 262143); + out[21 + outpos] = (in[11 + inpos] >>> 26) + | ((in[12 + inpos] & 4095) << (18 - 12)); + out[22 + outpos] = ((in[12 + inpos] >>> 12) & 262143); + out[23 + outpos] = (in[12 + inpos] >>> 30) + | ((in[13 + inpos] & 65535) << (18 - 16)); + out[24 + outpos] = (in[13 + inpos] >>> 16) + | ((in[14 + inpos] & 3) << (18 - 2)); + out[25 + outpos] = ((in[14 + inpos] >>> 2) & 262143); + out[26 + outpos] = (in[14 + inpos] >>> 20) + | ((in[15 + inpos] & 63) << (18 - 6)); + out[27 + outpos] = ((in[15 + inpos] >>> 6) & 262143); + out[28 + outpos] = (in[15 + inpos] >>> 24) + | ((in[16 + inpos] & 1023) << (18 - 10)); + out[29 + outpos] = ((in[16 + inpos] >>> 10) & 262143); + out[30 + outpos] = (in[16 + inpos] >>> 28) + | ((in[17 + inpos] & 16383) << (18 - 14)); + out[31 + outpos] = (in[17 + inpos] >>> 14); + } + protected static void fastunpack19(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 524287); + out[1 + outpos] = (in[0 + inpos] >>> 19) + | ((in[1 + inpos] & 63) << (19 - 6)); + out[2 + outpos] = ((in[1 + inpos] >>> 6) & 524287); + out[3 + outpos] = (in[1 + inpos] >>> 25) + | ((in[2 + inpos] & 4095) << (19 - 12)); + out[4 + outpos] = ((in[2 + inpos] >>> 12) & 524287); + out[5 + outpos] = (in[2 + inpos] >>> 31) + | ((in[3 + inpos] & 262143) << (19 - 18)); + out[6 + outpos] = (in[3 + inpos] >>> 18) + | ((in[4 + inpos] & 31) << (19 - 5)); + out[7 + outpos] = ((in[4 + inpos] >>> 5) & 524287); + out[8 + outpos] = (in[4 + inpos] >>> 24) + | ((in[5 + inpos] & 2047) << (19 - 11)); + out[9 + outpos] = ((in[5 + inpos] >>> 11) & 524287); + out[10 + outpos] = (in[5 + inpos] >>> 30) + | ((in[6 + inpos] & 131071) << (19 - 17)); + out[11 + outpos] = (in[6 + inpos] >>> 17) + | ((in[7 + inpos] & 15) << (19 - 4)); + out[12 + outpos] = ((in[7 + inpos] >>> 4) & 524287); + out[13 + outpos] = (in[7 + inpos] >>> 23) + | ((in[8 + inpos] & 1023) << (19 - 10)); + out[14 + outpos] = ((in[8 + inpos] >>> 10) & 524287); + out[15 + outpos] = (in[8 + inpos] >>> 29) + | ((in[9 + inpos] & 65535) << (19 - 16)); + out[16 + outpos] = (in[9 + inpos] >>> 16) + | ((in[10 + inpos] & 7) << (19 - 3)); + out[17 + outpos] = ((in[10 + inpos] >>> 3) & 524287); + out[18 + outpos] = (in[10 + inpos] >>> 22) + | ((in[11 + inpos] & 511) << (19 - 9)); + out[19 + outpos] = ((in[11 + inpos] >>> 9) & 524287); + out[20 + outpos] = (in[11 + inpos] >>> 28) + | ((in[12 + inpos] & 32767) << (19 - 15)); + out[21 + outpos] = (in[12 + inpos] >>> 15) + | ((in[13 + inpos] & 3) << (19 - 2)); + out[22 + outpos] = ((in[13 + inpos] >>> 2) & 524287); + out[23 + outpos] = (in[13 + inpos] >>> 21) + | ((in[14 + inpos] & 255) << (19 - 8)); + out[24 + outpos] = ((in[14 + inpos] >>> 8) & 524287); + out[25 + outpos] = (in[14 + inpos] >>> 27) + | ((in[15 + inpos] & 16383) << (19 - 14)); + out[26 + outpos] = (in[15 + inpos] >>> 14) + | ((in[16 + inpos] & 1) << (19 - 1)); + out[27 + outpos] = ((in[16 + inpos] >>> 1) & 524287); + out[28 + outpos] = (in[16 + inpos] >>> 20) + | ((in[17 + inpos] & 127) << (19 - 7)); + out[29 + outpos] = ((in[17 + inpos] >>> 7) & 524287); + out[30 + outpos] = (in[17 + inpos] >>> 26) + | ((in[18 + inpos] & 8191) << (19 - 13)); + out[31 + outpos] = (in[18 + inpos] >>> 13); + } - protected static void fastunpack30(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 1073741823) - ; - out[1 + outpos] = (in[0 + inpos] >>> 30) - | ((in[1 + inpos] & 268435455) << (30 - 28)) - ; - out[2 + outpos] = (in[1 + inpos] >>> 28) - | ((in[2 + inpos] & 67108863) << (30 - 26)) - ; - out[3 + outpos] = (in[2 + inpos] >>> 26) - | ((in[3 + inpos] & 16777215) << (30 - 24)) - ; - out[4 + outpos] = (in[3 + inpos] >>> 24) - | ((in[4 + inpos] & 4194303) << (30 - 22)) - ; - out[5 + outpos] = (in[4 + inpos] >>> 22) - | ((in[5 + inpos] & 1048575) << (30 - 20)) - ; - out[6 + outpos] = (in[5 + inpos] >>> 20) - | ((in[6 + inpos] & 262143) << (30 - 18)) - ; - out[7 + outpos] = (in[6 + inpos] >>> 18) - | ((in[7 + inpos] & 65535) << (30 - 16)) - ; - out[8 + outpos] = (in[7 + inpos] >>> 16) - | ((in[8 + inpos] & 16383) << (30 - 14)) - ; - out[9 + outpos] = (in[8 + inpos] >>> 14) - | ((in[9 + inpos] & 4095) << (30 - 12)) - ; - out[10 + outpos] = (in[9 + inpos] >>> 12) - | ((in[10 + inpos] & 1023) << (30 - 10)) - ; - out[11 + outpos] = (in[10 + inpos] >>> 10) - | ((in[11 + inpos] & 255) << (30 - 8)) - ; - out[12 + outpos] = (in[11 + inpos] >>> 8) - | ((in[12 + inpos] & 63) << (30 - 6)) - ; - out[13 + outpos] = (in[12 + inpos] >>> 6) - | ((in[13 + inpos] & 15) << (30 - 4)) - ; - out[14 + outpos] = (in[13 + inpos] >>> 4) - | ((in[14 + inpos] & 3) << (30 - 2)) - ; - out[15 + outpos] = (in[14 + inpos] >>> 2) - ; - out[16 + outpos] = ((in[15 + inpos] >>> 0) & 1073741823) - ; - out[17 + outpos] = (in[15 + inpos] >>> 30) - | ((in[16 + inpos] & 268435455) << (30 - 28)) - ; - out[18 + outpos] = (in[16 + inpos] >>> 28) - | ((in[17 + inpos] & 67108863) << (30 - 26)) - ; - out[19 + outpos] = (in[17 + inpos] >>> 26) - | ((in[18 + inpos] & 16777215) << (30 - 24)) - ; - out[20 + outpos] = (in[18 + inpos] >>> 24) - | ((in[19 + inpos] & 4194303) << (30 - 22)) - ; - out[21 + outpos] = (in[19 + inpos] >>> 22) - | ((in[20 + inpos] & 1048575) << (30 - 20)) - ; - out[22 + outpos] = (in[20 + inpos] >>> 20) - | ((in[21 + inpos] & 262143) << (30 - 18)) - ; - out[23 + outpos] = (in[21 + inpos] >>> 18) - | ((in[22 + inpos] & 65535) << (30 - 16)) - ; - out[24 + outpos] = (in[22 + inpos] >>> 16) - | ((in[23 + inpos] & 16383) << (30 - 14)) - ; - out[25 + outpos] = (in[23 + inpos] >>> 14) - | ((in[24 + inpos] & 4095) << (30 - 12)) - ; - out[26 + outpos] = (in[24 + inpos] >>> 12) - | ((in[25 + inpos] & 1023) << (30 - 10)) - ; - out[27 + outpos] = (in[25 + inpos] >>> 10) - | ((in[26 + inpos] & 255) << (30 - 8)) - ; - out[28 + outpos] = (in[26 + inpos] >>> 8) - | ((in[27 + inpos] & 63) << (30 - 6)) - ; - out[29 + outpos] = (in[27 + inpos] >>> 6) - | ((in[28 + inpos] & 15) << (30 - 4)) - ; - out[30 + outpos] = (in[28 + inpos] >>> 4) - | ((in[29 + inpos] & 3) << (30 - 2)) - ; - out[31 + outpos] = (in[29 + inpos] >>> 2) - ; - } + protected static void fastunpack20(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 1048575); + out[1 + outpos] = (in[0 + inpos] >>> 20) + | ((in[1 + inpos] & 255) << (20 - 8)); + out[2 + outpos] = ((in[1 + inpos] >>> 8) & 1048575); + out[3 + outpos] = (in[1 + inpos] >>> 28) + | ((in[2 + inpos] & 65535) << (20 - 16)); + out[4 + outpos] = (in[2 + inpos] >>> 16) + | ((in[3 + inpos] & 15) << (20 - 4)); + out[5 + outpos] = ((in[3 + inpos] >>> 4) & 1048575); + out[6 + outpos] = (in[3 + inpos] >>> 24) + | ((in[4 + inpos] & 4095) << (20 - 12)); + out[7 + outpos] = (in[4 + inpos] >>> 12); + out[8 + outpos] = ((in[5 + inpos] >>> 0) & 1048575); + out[9 + outpos] = (in[5 + inpos] >>> 20) + | ((in[6 + inpos] & 255) << (20 - 8)); + out[10 + outpos] = ((in[6 + inpos] >>> 8) & 1048575); + out[11 + outpos] = (in[6 + inpos] >>> 28) + | ((in[7 + inpos] & 65535) << (20 - 16)); + out[12 + outpos] = (in[7 + inpos] >>> 16) + | ((in[8 + inpos] & 15) << (20 - 4)); + out[13 + outpos] = ((in[8 + inpos] >>> 4) & 1048575); + out[14 + outpos] = (in[8 + inpos] >>> 24) + | ((in[9 + inpos] & 4095) << (20 - 12)); + out[15 + outpos] = (in[9 + inpos] >>> 12); + out[16 + outpos] = ((in[10 + inpos] >>> 0) & 1048575); + out[17 + outpos] = (in[10 + inpos] >>> 20) + | ((in[11 + inpos] & 255) << (20 - 8)); + out[18 + outpos] = ((in[11 + inpos] >>> 8) & 1048575); + out[19 + outpos] = (in[11 + inpos] >>> 28) + | ((in[12 + inpos] & 65535) << (20 - 16)); + out[20 + outpos] = (in[12 + inpos] >>> 16) + | ((in[13 + inpos] & 15) << (20 - 4)); + out[21 + outpos] = ((in[13 + inpos] >>> 4) & 1048575); + out[22 + outpos] = (in[13 + inpos] >>> 24) + | ((in[14 + inpos] & 4095) << (20 - 12)); + out[23 + outpos] = (in[14 + inpos] >>> 12); + out[24 + outpos] = ((in[15 + inpos] >>> 0) & 1048575); + out[25 + outpos] = (in[15 + inpos] >>> 20) + | ((in[16 + inpos] & 255) << (20 - 8)); + out[26 + outpos] = ((in[16 + inpos] >>> 8) & 1048575); + out[27 + outpos] = (in[16 + inpos] >>> 28) + | ((in[17 + inpos] & 65535) << (20 - 16)); + out[28 + outpos] = (in[17 + inpos] >>> 16) + | ((in[18 + inpos] & 15) << (20 - 4)); + out[29 + outpos] = ((in[18 + inpos] >>> 4) & 1048575); + out[30 + outpos] = (in[18 + inpos] >>> 24) + | ((in[19 + inpos] & 4095) << (20 - 12)); + out[31 + outpos] = (in[19 + inpos] >>> 12); + } + protected static void fastunpack21(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 2097151); + out[1 + outpos] = (in[0 + inpos] >>> 21) + | ((in[1 + inpos] & 1023) << (21 - 10)); + out[2 + outpos] = ((in[1 + inpos] >>> 10) & 2097151); + out[3 + outpos] = (in[1 + inpos] >>> 31) + | ((in[2 + inpos] & 1048575) << (21 - 20)); + out[4 + outpos] = (in[2 + inpos] >>> 20) + | ((in[3 + inpos] & 511) << (21 - 9)); + out[5 + outpos] = ((in[3 + inpos] >>> 9) & 2097151); + out[6 + outpos] = (in[3 + inpos] >>> 30) + | ((in[4 + inpos] & 524287) << (21 - 19)); + out[7 + outpos] = (in[4 + inpos] >>> 19) + | ((in[5 + inpos] & 255) << (21 - 8)); + out[8 + outpos] = ((in[5 + inpos] >>> 8) & 2097151); + out[9 + outpos] = (in[5 + inpos] >>> 29) + | ((in[6 + inpos] & 262143) << (21 - 18)); + out[10 + outpos] = (in[6 + inpos] >>> 18) + | ((in[7 + inpos] & 127) << (21 - 7)); + out[11 + outpos] = ((in[7 + inpos] >>> 7) & 2097151); + out[12 + outpos] = (in[7 + inpos] >>> 28) + | ((in[8 + inpos] & 131071) << (21 - 17)); + out[13 + outpos] = (in[8 + inpos] >>> 17) + | ((in[9 + inpos] & 63) << (21 - 6)); + out[14 + outpos] = ((in[9 + inpos] >>> 6) & 2097151); + out[15 + outpos] = (in[9 + inpos] >>> 27) + | ((in[10 + inpos] & 65535) << (21 - 16)); + out[16 + outpos] = (in[10 + inpos] >>> 16) + | ((in[11 + inpos] & 31) << (21 - 5)); + out[17 + outpos] = ((in[11 + inpos] >>> 5) & 2097151); + out[18 + outpos] = (in[11 + inpos] >>> 26) + | ((in[12 + inpos] & 32767) << (21 - 15)); + out[19 + outpos] = (in[12 + inpos] >>> 15) + | ((in[13 + inpos] & 15) << (21 - 4)); + out[20 + outpos] = ((in[13 + inpos] >>> 4) & 2097151); + out[21 + outpos] = (in[13 + inpos] >>> 25) + | ((in[14 + inpos] & 16383) << (21 - 14)); + out[22 + outpos] = (in[14 + inpos] >>> 14) + | ((in[15 + inpos] & 7) << (21 - 3)); + out[23 + outpos] = ((in[15 + inpos] >>> 3) & 2097151); + out[24 + outpos] = (in[15 + inpos] >>> 24) + | ((in[16 + inpos] & 8191) << (21 - 13)); + out[25 + outpos] = (in[16 + inpos] >>> 13) + | ((in[17 + inpos] & 3) << (21 - 2)); + out[26 + outpos] = ((in[17 + inpos] >>> 2) & 2097151); + out[27 + outpos] = (in[17 + inpos] >>> 23) + | ((in[18 + inpos] & 4095) << (21 - 12)); + out[28 + outpos] = (in[18 + inpos] >>> 12) + | ((in[19 + inpos] & 1) << (21 - 1)); + out[29 + outpos] = ((in[19 + inpos] >>> 1) & 2097151); + out[30 + outpos] = (in[19 + inpos] >>> 22) + | ((in[20 + inpos] & 2047) << (21 - 11)); + out[31 + outpos] = (in[20 + inpos] >>> 11); + } - protected static void fastunpack31(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 2147483647) - ; - out[1 + outpos] = (in[0 + inpos] >>> 31) - | ((in[1 + inpos] & 1073741823) << (31 - 30)) - ; - out[2 + outpos] = (in[1 + inpos] >>> 30) - | ((in[2 + inpos] & 536870911) << (31 - 29)) - ; - out[3 + outpos] = (in[2 + inpos] >>> 29) - | ((in[3 + inpos] & 268435455) << (31 - 28)) - ; - out[4 + outpos] = (in[3 + inpos] >>> 28) - | ((in[4 + inpos] & 134217727) << (31 - 27)) - ; - out[5 + outpos] = (in[4 + inpos] >>> 27) - | ((in[5 + inpos] & 67108863) << (31 - 26)) - ; - out[6 + outpos] = (in[5 + inpos] >>> 26) - | ((in[6 + inpos] & 33554431) << (31 - 25)) - ; - out[7 + outpos] = (in[6 + inpos] >>> 25) - | ((in[7 + inpos] & 16777215) << (31 - 24)) - ; - out[8 + outpos] = (in[7 + inpos] >>> 24) - | ((in[8 + inpos] & 8388607) << (31 - 23)) - ; - out[9 + outpos] = (in[8 + inpos] >>> 23) - | ((in[9 + inpos] & 4194303) << (31 - 22)) - ; - out[10 + outpos] = (in[9 + inpos] >>> 22) - | ((in[10 + inpos] & 2097151) << (31 - 21)) - ; - out[11 + outpos] = (in[10 + inpos] >>> 21) - | ((in[11 + inpos] & 1048575) << (31 - 20)) - ; - out[12 + outpos] = (in[11 + inpos] >>> 20) - | ((in[12 + inpos] & 524287) << (31 - 19)) - ; - out[13 + outpos] = (in[12 + inpos] >>> 19) - | ((in[13 + inpos] & 262143) << (31 - 18)) - ; - out[14 + outpos] = (in[13 + inpos] >>> 18) - | ((in[14 + inpos] & 131071) << (31 - 17)) - ; - out[15 + outpos] = (in[14 + inpos] >>> 17) - | ((in[15 + inpos] & 65535) << (31 - 16)) - ; - out[16 + outpos] = (in[15 + inpos] >>> 16) - | ((in[16 + inpos] & 32767) << (31 - 15)) - ; - out[17 + outpos] = (in[16 + inpos] >>> 15) - | ((in[17 + inpos] & 16383) << (31 - 14)) - ; - out[18 + outpos] = (in[17 + inpos] >>> 14) - | ((in[18 + inpos] & 8191) << (31 - 13)) - ; - out[19 + outpos] = (in[18 + inpos] >>> 13) - | ((in[19 + inpos] & 4095) << (31 - 12)) - ; - out[20 + outpos] = (in[19 + inpos] >>> 12) - | ((in[20 + inpos] & 2047) << (31 - 11)) - ; - out[21 + outpos] = (in[20 + inpos] >>> 11) - | ((in[21 + inpos] & 1023) << (31 - 10)) - ; - out[22 + outpos] = (in[21 + inpos] >>> 10) - | ((in[22 + inpos] & 511) << (31 - 9)) - ; - out[23 + outpos] = (in[22 + inpos] >>> 9) - | ((in[23 + inpos] & 255) << (31 - 8)) - ; - out[24 + outpos] = (in[23 + inpos] >>> 8) - | ((in[24 + inpos] & 127) << (31 - 7)) - ; - out[25 + outpos] = (in[24 + inpos] >>> 7) - | ((in[25 + inpos] & 63) << (31 - 6)) - ; - out[26 + outpos] = (in[25 + inpos] >>> 6) - | ((in[26 + inpos] & 31) << (31 - 5)) - ; - out[27 + outpos] = (in[26 + inpos] >>> 5) - | ((in[27 + inpos] & 15) << (31 - 4)) - ; - out[28 + outpos] = (in[27 + inpos] >>> 4) - | ((in[28 + inpos] & 7) << (31 - 3)) - ; - out[29 + outpos] = (in[28 + inpos] >>> 3) - | ((in[29 + inpos] & 3) << (31 - 2)) - ; - out[30 + outpos] = (in[29 + inpos] >>> 2) - | ((in[30 + inpos] & 1) << (31 - 1)) - ; - out[31 + outpos] = (in[30 + inpos] >>> 1) - ; - } + protected static void fastunpack22(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 4194303); + out[1 + outpos] = (in[0 + inpos] >>> 22) + | ((in[1 + inpos] & 4095) << (22 - 12)); + out[2 + outpos] = (in[1 + inpos] >>> 12) + | ((in[2 + inpos] & 3) << (22 - 2)); + out[3 + outpos] = ((in[2 + inpos] >>> 2) & 4194303); + out[4 + outpos] = (in[2 + inpos] >>> 24) + | ((in[3 + inpos] & 16383) << (22 - 14)); + out[5 + outpos] = (in[3 + inpos] >>> 14) + | ((in[4 + inpos] & 15) << (22 - 4)); + out[6 + outpos] = ((in[4 + inpos] >>> 4) & 4194303); + out[7 + outpos] = (in[4 + inpos] >>> 26) + | ((in[5 + inpos] & 65535) << (22 - 16)); + out[8 + outpos] = (in[5 + inpos] >>> 16) + | ((in[6 + inpos] & 63) << (22 - 6)); + out[9 + outpos] = ((in[6 + inpos] >>> 6) & 4194303); + out[10 + outpos] = (in[6 + inpos] >>> 28) + | ((in[7 + inpos] & 262143) << (22 - 18)); + out[11 + outpos] = (in[7 + inpos] >>> 18) + | ((in[8 + inpos] & 255) << (22 - 8)); + out[12 + outpos] = ((in[8 + inpos] >>> 8) & 4194303); + out[13 + outpos] = (in[8 + inpos] >>> 30) + | ((in[9 + inpos] & 1048575) << (22 - 20)); + out[14 + outpos] = (in[9 + inpos] >>> 20) + | ((in[10 + inpos] & 1023) << (22 - 10)); + out[15 + outpos] = (in[10 + inpos] >>> 10); + out[16 + outpos] = ((in[11 + inpos] >>> 0) & 4194303); + out[17 + outpos] = (in[11 + inpos] >>> 22) + | ((in[12 + inpos] & 4095) << (22 - 12)); + out[18 + outpos] = (in[12 + inpos] >>> 12) + | ((in[13 + inpos] & 3) << (22 - 2)); + out[19 + outpos] = ((in[13 + inpos] >>> 2) & 4194303); + out[20 + outpos] = (in[13 + inpos] >>> 24) + | ((in[14 + inpos] & 16383) << (22 - 14)); + out[21 + outpos] = (in[14 + inpos] >>> 14) + | ((in[15 + inpos] & 15) << (22 - 4)); + out[22 + outpos] = ((in[15 + inpos] >>> 4) & 4194303); + out[23 + outpos] = (in[15 + inpos] >>> 26) + | ((in[16 + inpos] & 65535) << (22 - 16)); + out[24 + outpos] = (in[16 + inpos] >>> 16) + | ((in[17 + inpos] & 63) << (22 - 6)); + out[25 + outpos] = ((in[17 + inpos] >>> 6) & 4194303); + out[26 + outpos] = (in[17 + inpos] >>> 28) + | ((in[18 + inpos] & 262143) << (22 - 18)); + out[27 + outpos] = (in[18 + inpos] >>> 18) + | ((in[19 + inpos] & 255) << (22 - 8)); + out[28 + outpos] = ((in[19 + inpos] >>> 8) & 4194303); + out[29 + outpos] = (in[19 + inpos] >>> 30) + | ((in[20 + inpos] & 1048575) << (22 - 20)); + out[30 + outpos] = (in[20 + inpos] >>> 20) + | ((in[21 + inpos] & 1023) << (22 - 10)); + out[31 + outpos] = (in[21 + inpos] >>> 10); + } + protected static void fastunpack23(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 8388607); + out[1 + outpos] = (in[0 + inpos] >>> 23) + | ((in[1 + inpos] & 16383) << (23 - 14)); + out[2 + outpos] = (in[1 + inpos] >>> 14) + | ((in[2 + inpos] & 31) << (23 - 5)); + out[3 + outpos] = ((in[2 + inpos] >>> 5) & 8388607); + out[4 + outpos] = (in[2 + inpos] >>> 28) + | ((in[3 + inpos] & 524287) << (23 - 19)); + out[5 + outpos] = (in[3 + inpos] >>> 19) + | ((in[4 + inpos] & 1023) << (23 - 10)); + out[6 + outpos] = (in[4 + inpos] >>> 10) + | ((in[5 + inpos] & 1) << (23 - 1)); + out[7 + outpos] = ((in[5 + inpos] >>> 1) & 8388607); + out[8 + outpos] = (in[5 + inpos] >>> 24) + | ((in[6 + inpos] & 32767) << (23 - 15)); + out[9 + outpos] = (in[6 + inpos] >>> 15) + | ((in[7 + inpos] & 63) << (23 - 6)); + out[10 + outpos] = ((in[7 + inpos] >>> 6) & 8388607); + out[11 + outpos] = (in[7 + inpos] >>> 29) + | ((in[8 + inpos] & 1048575) << (23 - 20)); + out[12 + outpos] = (in[8 + inpos] >>> 20) + | ((in[9 + inpos] & 2047) << (23 - 11)); + out[13 + outpos] = (in[9 + inpos] >>> 11) + | ((in[10 + inpos] & 3) << (23 - 2)); + out[14 + outpos] = ((in[10 + inpos] >>> 2) & 8388607); + out[15 + outpos] = (in[10 + inpos] >>> 25) + | ((in[11 + inpos] & 65535) << (23 - 16)); + out[16 + outpos] = (in[11 + inpos] >>> 16) + | ((in[12 + inpos] & 127) << (23 - 7)); + out[17 + outpos] = ((in[12 + inpos] >>> 7) & 8388607); + out[18 + outpos] = (in[12 + inpos] >>> 30) + | ((in[13 + inpos] & 2097151) << (23 - 21)); + out[19 + outpos] = (in[13 + inpos] >>> 21) + | ((in[14 + inpos] & 4095) << (23 - 12)); + out[20 + outpos] = (in[14 + inpos] >>> 12) + | ((in[15 + inpos] & 7) << (23 - 3)); + out[21 + outpos] = ((in[15 + inpos] >>> 3) & 8388607); + out[22 + outpos] = (in[15 + inpos] >>> 26) + | ((in[16 + inpos] & 131071) << (23 - 17)); + out[23 + outpos] = (in[16 + inpos] >>> 17) + | ((in[17 + inpos] & 255) << (23 - 8)); + out[24 + outpos] = ((in[17 + inpos] >>> 8) & 8388607); + out[25 + outpos] = (in[17 + inpos] >>> 31) + | ((in[18 + inpos] & 4194303) << (23 - 22)); + out[26 + outpos] = (in[18 + inpos] >>> 22) + | ((in[19 + inpos] & 8191) << (23 - 13)); + out[27 + outpos] = (in[19 + inpos] >>> 13) + | ((in[20 + inpos] & 15) << (23 - 4)); + out[28 + outpos] = ((in[20 + inpos] >>> 4) & 8388607); + out[29 + outpos] = (in[20 + inpos] >>> 27) + | ((in[21 + inpos] & 262143) << (23 - 18)); + out[30 + outpos] = (in[21 + inpos] >>> 18) + | ((in[22 + inpos] & 511) << (23 - 9)); + out[31 + outpos] = (in[22 + inpos] >>> 9); + } - protected static void fastunpack32(final int[] in, int inpos, final int[] out, int outpos) { - System.arraycopy(in, inpos, out, outpos, 32); - } + protected static void fastunpack24(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 16777215); + out[1 + outpos] = (in[0 + inpos] >>> 24) + | ((in[1 + inpos] & 65535) << (24 - 16)); + out[2 + outpos] = (in[1 + inpos] >>> 16) + | ((in[2 + inpos] & 255) << (24 - 8)); + out[3 + outpos] = (in[2 + inpos] >>> 8); + out[4 + outpos] = ((in[3 + inpos] >>> 0) & 16777215); + out[5 + outpos] = (in[3 + inpos] >>> 24) + | ((in[4 + inpos] & 65535) << (24 - 16)); + out[6 + outpos] = (in[4 + inpos] >>> 16) + | ((in[5 + inpos] & 255) << (24 - 8)); + out[7 + outpos] = (in[5 + inpos] >>> 8); + out[8 + outpos] = ((in[6 + inpos] >>> 0) & 16777215); + out[9 + outpos] = (in[6 + inpos] >>> 24) + | ((in[7 + inpos] & 65535) << (24 - 16)); + out[10 + outpos] = (in[7 + inpos] >>> 16) + | ((in[8 + inpos] & 255) << (24 - 8)); + out[11 + outpos] = (in[8 + inpos] >>> 8); + out[12 + outpos] = ((in[9 + inpos] >>> 0) & 16777215); + out[13 + outpos] = (in[9 + inpos] >>> 24) + | ((in[10 + inpos] & 65535) << (24 - 16)); + out[14 + outpos] = (in[10 + inpos] >>> 16) + | ((in[11 + inpos] & 255) << (24 - 8)); + out[15 + outpos] = (in[11 + inpos] >>> 8); + out[16 + outpos] = ((in[12 + inpos] >>> 0) & 16777215); + out[17 + outpos] = (in[12 + inpos] >>> 24) + | ((in[13 + inpos] & 65535) << (24 - 16)); + out[18 + outpos] = (in[13 + inpos] >>> 16) + | ((in[14 + inpos] & 255) << (24 - 8)); + out[19 + outpos] = (in[14 + inpos] >>> 8); + out[20 + outpos] = ((in[15 + inpos] >>> 0) & 16777215); + out[21 + outpos] = (in[15 + inpos] >>> 24) + | ((in[16 + inpos] & 65535) << (24 - 16)); + out[22 + outpos] = (in[16 + inpos] >>> 16) + | ((in[17 + inpos] & 255) << (24 - 8)); + out[23 + outpos] = (in[17 + inpos] >>> 8); + out[24 + outpos] = ((in[18 + inpos] >>> 0) & 16777215); + out[25 + outpos] = (in[18 + inpos] >>> 24) + | ((in[19 + inpos] & 65535) << (24 - 16)); + out[26 + outpos] = (in[19 + inpos] >>> 16) + | ((in[20 + inpos] & 255) << (24 - 8)); + out[27 + outpos] = (in[20 + inpos] >>> 8); + out[28 + outpos] = ((in[21 + inpos] >>> 0) & 16777215); + out[29 + outpos] = (in[21 + inpos] >>> 24) + | ((in[22 + inpos] & 65535) << (24 - 16)); + out[30 + outpos] = (in[22 + inpos] >>> 16) + | ((in[23 + inpos] & 255) << (24 - 8)); + out[31 + outpos] = (in[23 + inpos] >>> 8); + } + protected static void fastunpack25(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 33554431); + out[1 + outpos] = (in[0 + inpos] >>> 25) + | ((in[1 + inpos] & 262143) << (25 - 18)); + out[2 + outpos] = (in[1 + inpos] >>> 18) + | ((in[2 + inpos] & 2047) << (25 - 11)); + out[3 + outpos] = (in[2 + inpos] >>> 11) + | ((in[3 + inpos] & 15) << (25 - 4)); + out[4 + outpos] = ((in[3 + inpos] >>> 4) & 33554431); + out[5 + outpos] = (in[3 + inpos] >>> 29) + | ((in[4 + inpos] & 4194303) << (25 - 22)); + out[6 + outpos] = (in[4 + inpos] >>> 22) + | ((in[5 + inpos] & 32767) << (25 - 15)); + out[7 + outpos] = (in[5 + inpos] >>> 15) + | ((in[6 + inpos] & 255) << (25 - 8)); + out[8 + outpos] = (in[6 + inpos] >>> 8) + | ((in[7 + inpos] & 1) << (25 - 1)); + out[9 + outpos] = ((in[7 + inpos] >>> 1) & 33554431); + out[10 + outpos] = (in[7 + inpos] >>> 26) + | ((in[8 + inpos] & 524287) << (25 - 19)); + out[11 + outpos] = (in[8 + inpos] >>> 19) + | ((in[9 + inpos] & 4095) << (25 - 12)); + out[12 + outpos] = (in[9 + inpos] >>> 12) + | ((in[10 + inpos] & 31) << (25 - 5)); + out[13 + outpos] = ((in[10 + inpos] >>> 5) & 33554431); + out[14 + outpos] = (in[10 + inpos] >>> 30) + | ((in[11 + inpos] & 8388607) << (25 - 23)); + out[15 + outpos] = (in[11 + inpos] >>> 23) + | ((in[12 + inpos] & 65535) << (25 - 16)); + out[16 + outpos] = (in[12 + inpos] >>> 16) + | ((in[13 + inpos] & 511) << (25 - 9)); + out[17 + outpos] = (in[13 + inpos] >>> 9) + | ((in[14 + inpos] & 3) << (25 - 2)); + out[18 + outpos] = ((in[14 + inpos] >>> 2) & 33554431); + out[19 + outpos] = (in[14 + inpos] >>> 27) + | ((in[15 + inpos] & 1048575) << (25 - 20)); + out[20 + outpos] = (in[15 + inpos] >>> 20) + | ((in[16 + inpos] & 8191) << (25 - 13)); + out[21 + outpos] = (in[16 + inpos] >>> 13) + | ((in[17 + inpos] & 63) << (25 - 6)); + out[22 + outpos] = ((in[17 + inpos] >>> 6) & 33554431); + out[23 + outpos] = (in[17 + inpos] >>> 31) + | ((in[18 + inpos] & 16777215) << (25 - 24)); + out[24 + outpos] = (in[18 + inpos] >>> 24) + | ((in[19 + inpos] & 131071) << (25 - 17)); + out[25 + outpos] = (in[19 + inpos] >>> 17) + | ((in[20 + inpos] & 1023) << (25 - 10)); + out[26 + outpos] = (in[20 + inpos] >>> 10) + | ((in[21 + inpos] & 7) << (25 - 3)); + out[27 + outpos] = ((in[21 + inpos] >>> 3) & 33554431); + out[28 + outpos] = (in[21 + inpos] >>> 28) + | ((in[22 + inpos] & 2097151) << (25 - 21)); + out[29 + outpos] = (in[22 + inpos] >>> 21) + | ((in[23 + inpos] & 16383) << (25 - 14)); + out[30 + outpos] = (in[23 + inpos] >>> 14) + | ((in[24 + inpos] & 127) << (25 - 7)); + out[31 + outpos] = (in[24 + inpos] >>> 7); + } - protected static void fastpack32(final int[] in, int inpos, final int[] out, int outpos) { - System.arraycopy(in, inpos, out, outpos, 32); - } + protected static void fastunpack26(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 67108863); + out[1 + outpos] = (in[0 + inpos] >>> 26) + | ((in[1 + inpos] & 1048575) << (26 - 20)); + out[2 + outpos] = (in[1 + inpos] >>> 20) + | ((in[2 + inpos] & 16383) << (26 - 14)); + out[3 + outpos] = (in[2 + inpos] >>> 14) + | ((in[3 + inpos] & 255) << (26 - 8)); + out[4 + outpos] = (in[3 + inpos] >>> 8) + | ((in[4 + inpos] & 3) << (26 - 2)); + out[5 + outpos] = ((in[4 + inpos] >>> 2) & 67108863); + out[6 + outpos] = (in[4 + inpos] >>> 28) + | ((in[5 + inpos] & 4194303) << (26 - 22)); + out[7 + outpos] = (in[5 + inpos] >>> 22) + | ((in[6 + inpos] & 65535) << (26 - 16)); + out[8 + outpos] = (in[6 + inpos] >>> 16) + | ((in[7 + inpos] & 1023) << (26 - 10)); + out[9 + outpos] = (in[7 + inpos] >>> 10) + | ((in[8 + inpos] & 15) << (26 - 4)); + out[10 + outpos] = ((in[8 + inpos] >>> 4) & 67108863); + out[11 + outpos] = (in[8 + inpos] >>> 30) + | ((in[9 + inpos] & 16777215) << (26 - 24)); + out[12 + outpos] = (in[9 + inpos] >>> 24) + | ((in[10 + inpos] & 262143) << (26 - 18)); + out[13 + outpos] = (in[10 + inpos] >>> 18) + | ((in[11 + inpos] & 4095) << (26 - 12)); + out[14 + outpos] = (in[11 + inpos] >>> 12) + | ((in[12 + inpos] & 63) << (26 - 6)); + out[15 + outpos] = (in[12 + inpos] >>> 6); + out[16 + outpos] = ((in[13 + inpos] >>> 0) & 67108863); + out[17 + outpos] = (in[13 + inpos] >>> 26) + | ((in[14 + inpos] & 1048575) << (26 - 20)); + out[18 + outpos] = (in[14 + inpos] >>> 20) + | ((in[15 + inpos] & 16383) << (26 - 14)); + out[19 + outpos] = (in[15 + inpos] >>> 14) + | ((in[16 + inpos] & 255) << (26 - 8)); + out[20 + outpos] = (in[16 + inpos] >>> 8) + | ((in[17 + inpos] & 3) << (26 - 2)); + out[21 + outpos] = ((in[17 + inpos] >>> 2) & 67108863); + out[22 + outpos] = (in[17 + inpos] >>> 28) + | ((in[18 + inpos] & 4194303) << (26 - 22)); + out[23 + outpos] = (in[18 + inpos] >>> 22) + | ((in[19 + inpos] & 65535) << (26 - 16)); + out[24 + outpos] = (in[19 + inpos] >>> 16) + | ((in[20 + inpos] & 1023) << (26 - 10)); + out[25 + outpos] = (in[20 + inpos] >>> 10) + | ((in[21 + inpos] & 15) << (26 - 4)); + out[26 + outpos] = ((in[21 + inpos] >>> 4) & 67108863); + out[27 + outpos] = (in[21 + inpos] >>> 30) + | ((in[22 + inpos] & 16777215) << (26 - 24)); + out[28 + outpos] = (in[22 + inpos] >>> 24) + | ((in[23 + inpos] & 262143) << (26 - 18)); + out[29 + outpos] = (in[23 + inpos] >>> 18) + | ((in[24 + inpos] & 4095) << (26 - 12)); + out[30 + outpos] = (in[24 + inpos] >>> 12) + | ((in[25 + inpos] & 63) << (26 - 6)); + out[31 + outpos] = (in[25 + inpos] >>> 6); + } + protected static void fastunpack27(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 134217727); + out[1 + outpos] = (in[0 + inpos] >>> 27) + | ((in[1 + inpos] & 4194303) << (27 - 22)); + out[2 + outpos] = (in[1 + inpos] >>> 22) + | ((in[2 + inpos] & 131071) << (27 - 17)); + out[3 + outpos] = (in[2 + inpos] >>> 17) + | ((in[3 + inpos] & 4095) << (27 - 12)); + out[4 + outpos] = (in[3 + inpos] >>> 12) + | ((in[4 + inpos] & 127) << (27 - 7)); + out[5 + outpos] = (in[4 + inpos] >>> 7) + | ((in[5 + inpos] & 3) << (27 - 2)); + out[6 + outpos] = ((in[5 + inpos] >>> 2) & 134217727); + out[7 + outpos] = (in[5 + inpos] >>> 29) + | ((in[6 + inpos] & 16777215) << (27 - 24)); + out[8 + outpos] = (in[6 + inpos] >>> 24) + | ((in[7 + inpos] & 524287) << (27 - 19)); + out[9 + outpos] = (in[7 + inpos] >>> 19) + | ((in[8 + inpos] & 16383) << (27 - 14)); + out[10 + outpos] = (in[8 + inpos] >>> 14) + | ((in[9 + inpos] & 511) << (27 - 9)); + out[11 + outpos] = (in[9 + inpos] >>> 9) + | ((in[10 + inpos] & 15) << (27 - 4)); + out[12 + outpos] = ((in[10 + inpos] >>> 4) & 134217727); + out[13 + outpos] = (in[10 + inpos] >>> 31) + | ((in[11 + inpos] & 67108863) << (27 - 26)); + out[14 + outpos] = (in[11 + inpos] >>> 26) + | ((in[12 + inpos] & 2097151) << (27 - 21)); + out[15 + outpos] = (in[12 + inpos] >>> 21) + | ((in[13 + inpos] & 65535) << (27 - 16)); + out[16 + outpos] = (in[13 + inpos] >>> 16) + | ((in[14 + inpos] & 2047) << (27 - 11)); + out[17 + outpos] = (in[14 + inpos] >>> 11) + | ((in[15 + inpos] & 63) << (27 - 6)); + out[18 + outpos] = (in[15 + inpos] >>> 6) + | ((in[16 + inpos] & 1) << (27 - 1)); + out[19 + outpos] = ((in[16 + inpos] >>> 1) & 134217727); + out[20 + outpos] = (in[16 + inpos] >>> 28) + | ((in[17 + inpos] & 8388607) << (27 - 23)); + out[21 + outpos] = (in[17 + inpos] >>> 23) + | ((in[18 + inpos] & 262143) << (27 - 18)); + out[22 + outpos] = (in[18 + inpos] >>> 18) + | ((in[19 + inpos] & 8191) << (27 - 13)); + out[23 + outpos] = (in[19 + inpos] >>> 13) + | ((in[20 + inpos] & 255) << (27 - 8)); + out[24 + outpos] = (in[20 + inpos] >>> 8) + | ((in[21 + inpos] & 7) << (27 - 3)); + out[25 + outpos] = ((in[21 + inpos] >>> 3) & 134217727); + out[26 + outpos] = (in[21 + inpos] >>> 30) + | ((in[22 + inpos] & 33554431) << (27 - 25)); + out[27 + outpos] = (in[22 + inpos] >>> 25) + | ((in[23 + inpos] & 1048575) << (27 - 20)); + out[28 + outpos] = (in[23 + inpos] >>> 20) + | ((in[24 + inpos] & 32767) << (27 - 15)); + out[29 + outpos] = (in[24 + inpos] >>> 15) + | ((in[25 + inpos] & 1023) << (27 - 10)); + out[30 + outpos] = (in[25 + inpos] >>> 10) + | ((in[26 + inpos] & 31) << (27 - 5)); + out[31 + outpos] = (in[26 + inpos] >>> 5); + } - protected static void fastpackwithoutmask32(final int[] in, int inpos, final int[] out, int outpos) { - System.arraycopy(in, inpos, out, outpos, 32); - } + protected static void fastunpack28(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 268435455); + out[1 + outpos] = (in[0 + inpos] >>> 28) + | ((in[1 + inpos] & 16777215) << (28 - 24)); + out[2 + outpos] = (in[1 + inpos] >>> 24) + | ((in[2 + inpos] & 1048575) << (28 - 20)); + out[3 + outpos] = (in[2 + inpos] >>> 20) + | ((in[3 + inpos] & 65535) << (28 - 16)); + out[4 + outpos] = (in[3 + inpos] >>> 16) + | ((in[4 + inpos] & 4095) << (28 - 12)); + out[5 + outpos] = (in[4 + inpos] >>> 12) + | ((in[5 + inpos] & 255) << (28 - 8)); + out[6 + outpos] = (in[5 + inpos] >>> 8) + | ((in[6 + inpos] & 15) << (28 - 4)); + out[7 + outpos] = (in[6 + inpos] >>> 4); + out[8 + outpos] = ((in[7 + inpos] >>> 0) & 268435455); + out[9 + outpos] = (in[7 + inpos] >>> 28) + | ((in[8 + inpos] & 16777215) << (28 - 24)); + out[10 + outpos] = (in[8 + inpos] >>> 24) + | ((in[9 + inpos] & 1048575) << (28 - 20)); + out[11 + outpos] = (in[9 + inpos] >>> 20) + | ((in[10 + inpos] & 65535) << (28 - 16)); + out[12 + outpos] = (in[10 + inpos] >>> 16) + | ((in[11 + inpos] & 4095) << (28 - 12)); + out[13 + outpos] = (in[11 + inpos] >>> 12) + | ((in[12 + inpos] & 255) << (28 - 8)); + out[14 + outpos] = (in[12 + inpos] >>> 8) + | ((in[13 + inpos] & 15) << (28 - 4)); + out[15 + outpos] = (in[13 + inpos] >>> 4); + out[16 + outpos] = ((in[14 + inpos] >>> 0) & 268435455); + out[17 + outpos] = (in[14 + inpos] >>> 28) + | ((in[15 + inpos] & 16777215) << (28 - 24)); + out[18 + outpos] = (in[15 + inpos] >>> 24) + | ((in[16 + inpos] & 1048575) << (28 - 20)); + out[19 + outpos] = (in[16 + inpos] >>> 20) + | ((in[17 + inpos] & 65535) << (28 - 16)); + out[20 + outpos] = (in[17 + inpos] >>> 16) + | ((in[18 + inpos] & 4095) << (28 - 12)); + out[21 + outpos] = (in[18 + inpos] >>> 12) + | ((in[19 + inpos] & 255) << (28 - 8)); + out[22 + outpos] = (in[19 + inpos] >>> 8) + | ((in[20 + inpos] & 15) << (28 - 4)); + out[23 + outpos] = (in[20 + inpos] >>> 4); + out[24 + outpos] = ((in[21 + inpos] >>> 0) & 268435455); + out[25 + outpos] = (in[21 + inpos] >>> 28) + | ((in[22 + inpos] & 16777215) << (28 - 24)); + out[26 + outpos] = (in[22 + inpos] >>> 24) + | ((in[23 + inpos] & 1048575) << (28 - 20)); + out[27 + outpos] = (in[23 + inpos] >>> 20) + | ((in[24 + inpos] & 65535) << (28 - 16)); + out[28 + outpos] = (in[24 + inpos] >>> 16) + | ((in[25 + inpos] & 4095) << (28 - 12)); + out[29 + outpos] = (in[25 + inpos] >>> 12) + | ((in[26 + inpos] & 255) << (28 - 8)); + out[30 + outpos] = (in[26 + inpos] >>> 8) + | ((in[27 + inpos] & 15) << (28 - 4)); + out[31 + outpos] = (in[27 + inpos] >>> 4); + } + protected static void fastunpack29(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 536870911); + out[1 + outpos] = (in[0 + inpos] >>> 29) + | ((in[1 + inpos] & 67108863) << (29 - 26)); + out[2 + outpos] = (in[1 + inpos] >>> 26) + | ((in[2 + inpos] & 8388607) << (29 - 23)); + out[3 + outpos] = (in[2 + inpos] >>> 23) + | ((in[3 + inpos] & 1048575) << (29 - 20)); + out[4 + outpos] = (in[3 + inpos] >>> 20) + | ((in[4 + inpos] & 131071) << (29 - 17)); + out[5 + outpos] = (in[4 + inpos] >>> 17) + | ((in[5 + inpos] & 16383) << (29 - 14)); + out[6 + outpos] = (in[5 + inpos] >>> 14) + | ((in[6 + inpos] & 2047) << (29 - 11)); + out[7 + outpos] = (in[6 + inpos] >>> 11) + | ((in[7 + inpos] & 255) << (29 - 8)); + out[8 + outpos] = (in[7 + inpos] >>> 8) + | ((in[8 + inpos] & 31) << (29 - 5)); + out[9 + outpos] = (in[8 + inpos] >>> 5) + | ((in[9 + inpos] & 3) << (29 - 2)); + out[10 + outpos] = ((in[9 + inpos] >>> 2) & 536870911); + out[11 + outpos] = (in[9 + inpos] >>> 31) + | ((in[10 + inpos] & 268435455) << (29 - 28)); + out[12 + outpos] = (in[10 + inpos] >>> 28) + | ((in[11 + inpos] & 33554431) << (29 - 25)); + out[13 + outpos] = (in[11 + inpos] >>> 25) + | ((in[12 + inpos] & 4194303) << (29 - 22)); + out[14 + outpos] = (in[12 + inpos] >>> 22) + | ((in[13 + inpos] & 524287) << (29 - 19)); + out[15 + outpos] = (in[13 + inpos] >>> 19) + | ((in[14 + inpos] & 65535) << (29 - 16)); + out[16 + outpos] = (in[14 + inpos] >>> 16) + | ((in[15 + inpos] & 8191) << (29 - 13)); + out[17 + outpos] = (in[15 + inpos] >>> 13) + | ((in[16 + inpos] & 1023) << (29 - 10)); + out[18 + outpos] = (in[16 + inpos] >>> 10) + | ((in[17 + inpos] & 127) << (29 - 7)); + out[19 + outpos] = (in[17 + inpos] >>> 7) + | ((in[18 + inpos] & 15) << (29 - 4)); + out[20 + outpos] = (in[18 + inpos] >>> 4) + | ((in[19 + inpos] & 1) << (29 - 1)); + out[21 + outpos] = ((in[19 + inpos] >>> 1) & 536870911); + out[22 + outpos] = (in[19 + inpos] >>> 30) + | ((in[20 + inpos] & 134217727) << (29 - 27)); + out[23 + outpos] = (in[20 + inpos] >>> 27) + | ((in[21 + inpos] & 16777215) << (29 - 24)); + out[24 + outpos] = (in[21 + inpos] >>> 24) + | ((in[22 + inpos] & 2097151) << (29 - 21)); + out[25 + outpos] = (in[22 + inpos] >>> 21) + | ((in[23 + inpos] & 262143) << (29 - 18)); + out[26 + outpos] = (in[23 + inpos] >>> 18) + | ((in[24 + inpos] & 32767) << (29 - 15)); + out[27 + outpos] = (in[24 + inpos] >>> 15) + | ((in[25 + inpos] & 4095) << (29 - 12)); + out[28 + outpos] = (in[25 + inpos] >>> 12) + | ((in[26 + inpos] & 511) << (29 - 9)); + out[29 + outpos] = (in[26 + inpos] >>> 9) + | ((in[27 + inpos] & 63) << (29 - 6)); + out[30 + outpos] = (in[27 + inpos] >>> 6) + | ((in[28 + inpos] & 7) << (29 - 3)); + out[31 + outpos] = (in[28 + inpos] >>> 3); + } - protected static void fastunpack0(final int[] in, int inpos, final int[] out, int outpos) { - Arrays.fill(out, outpos, outpos + 32, 0); - } + protected static void fastunpack30(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 1073741823); + out[1 + outpos] = (in[0 + inpos] >>> 30) + | ((in[1 + inpos] & 268435455) << (30 - 28)); + out[2 + outpos] = (in[1 + inpos] >>> 28) + | ((in[2 + inpos] & 67108863) << (30 - 26)); + out[3 + outpos] = (in[2 + inpos] >>> 26) + | ((in[3 + inpos] & 16777215) << (30 - 24)); + out[4 + outpos] = (in[3 + inpos] >>> 24) + | ((in[4 + inpos] & 4194303) << (30 - 22)); + out[5 + outpos] = (in[4 + inpos] >>> 22) + | ((in[5 + inpos] & 1048575) << (30 - 20)); + out[6 + outpos] = (in[5 + inpos] >>> 20) + | ((in[6 + inpos] & 262143) << (30 - 18)); + out[7 + outpos] = (in[6 + inpos] >>> 18) + | ((in[7 + inpos] & 65535) << (30 - 16)); + out[8 + outpos] = (in[7 + inpos] >>> 16) + | ((in[8 + inpos] & 16383) << (30 - 14)); + out[9 + outpos] = (in[8 + inpos] >>> 14) + | ((in[9 + inpos] & 4095) << (30 - 12)); + out[10 + outpos] = (in[9 + inpos] >>> 12) + | ((in[10 + inpos] & 1023) << (30 - 10)); + out[11 + outpos] = (in[10 + inpos] >>> 10) + | ((in[11 + inpos] & 255) << (30 - 8)); + out[12 + outpos] = (in[11 + inpos] >>> 8) + | ((in[12 + inpos] & 63) << (30 - 6)); + out[13 + outpos] = (in[12 + inpos] >>> 6) + | ((in[13 + inpos] & 15) << (30 - 4)); + out[14 + outpos] = (in[13 + inpos] >>> 4) + | ((in[14 + inpos] & 3) << (30 - 2)); + out[15 + outpos] = (in[14 + inpos] >>> 2); + out[16 + outpos] = ((in[15 + inpos] >>> 0) & 1073741823); + out[17 + outpos] = (in[15 + inpos] >>> 30) + | ((in[16 + inpos] & 268435455) << (30 - 28)); + out[18 + outpos] = (in[16 + inpos] >>> 28) + | ((in[17 + inpos] & 67108863) << (30 - 26)); + out[19 + outpos] = (in[17 + inpos] >>> 26) + | ((in[18 + inpos] & 16777215) << (30 - 24)); + out[20 + outpos] = (in[18 + inpos] >>> 24) + | ((in[19 + inpos] & 4194303) << (30 - 22)); + out[21 + outpos] = (in[19 + inpos] >>> 22) + | ((in[20 + inpos] & 1048575) << (30 - 20)); + out[22 + outpos] = (in[20 + inpos] >>> 20) + | ((in[21 + inpos] & 262143) << (30 - 18)); + out[23 + outpos] = (in[21 + inpos] >>> 18) + | ((in[22 + inpos] & 65535) << (30 - 16)); + out[24 + outpos] = (in[22 + inpos] >>> 16) + | ((in[23 + inpos] & 16383) << (30 - 14)); + out[25 + outpos] = (in[23 + inpos] >>> 14) + | ((in[24 + inpos] & 4095) << (30 - 12)); + out[26 + outpos] = (in[24 + inpos] >>> 12) + | ((in[25 + inpos] & 1023) << (30 - 10)); + out[27 + outpos] = (in[25 + inpos] >>> 10) + | ((in[26 + inpos] & 255) << (30 - 8)); + out[28 + outpos] = (in[26 + inpos] >>> 8) + | ((in[27 + inpos] & 63) << (30 - 6)); + out[29 + outpos] = (in[27 + inpos] >>> 6) + | ((in[28 + inpos] & 15) << (30 - 4)); + out[30 + outpos] = (in[28 + inpos] >>> 4) + | ((in[29 + inpos] & 3) << (30 - 2)); + out[31 + outpos] = (in[29 + inpos] >>> 2); + } + protected static void fastunpack31(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 2147483647); + out[1 + outpos] = (in[0 + inpos] >>> 31) + | ((in[1 + inpos] & 1073741823) << (31 - 30)); + out[2 + outpos] = (in[1 + inpos] >>> 30) + | ((in[2 + inpos] & 536870911) << (31 - 29)); + out[3 + outpos] = (in[2 + inpos] >>> 29) + | ((in[3 + inpos] & 268435455) << (31 - 28)); + out[4 + outpos] = (in[3 + inpos] >>> 28) + | ((in[4 + inpos] & 134217727) << (31 - 27)); + out[5 + outpos] = (in[4 + inpos] >>> 27) + | ((in[5 + inpos] & 67108863) << (31 - 26)); + out[6 + outpos] = (in[5 + inpos] >>> 26) + | ((in[6 + inpos] & 33554431) << (31 - 25)); + out[7 + outpos] = (in[6 + inpos] >>> 25) + | ((in[7 + inpos] & 16777215) << (31 - 24)); + out[8 + outpos] = (in[7 + inpos] >>> 24) + | ((in[8 + inpos] & 8388607) << (31 - 23)); + out[9 + outpos] = (in[8 + inpos] >>> 23) + | ((in[9 + inpos] & 4194303) << (31 - 22)); + out[10 + outpos] = (in[9 + inpos] >>> 22) + | ((in[10 + inpos] & 2097151) << (31 - 21)); + out[11 + outpos] = (in[10 + inpos] >>> 21) + | ((in[11 + inpos] & 1048575) << (31 - 20)); + out[12 + outpos] = (in[11 + inpos] >>> 20) + | ((in[12 + inpos] & 524287) << (31 - 19)); + out[13 + outpos] = (in[12 + inpos] >>> 19) + | ((in[13 + inpos] & 262143) << (31 - 18)); + out[14 + outpos] = (in[13 + inpos] >>> 18) + | ((in[14 + inpos] & 131071) << (31 - 17)); + out[15 + outpos] = (in[14 + inpos] >>> 17) + | ((in[15 + inpos] & 65535) << (31 - 16)); + out[16 + outpos] = (in[15 + inpos] >>> 16) + | ((in[16 + inpos] & 32767) << (31 - 15)); + out[17 + outpos] = (in[16 + inpos] >>> 15) + | ((in[17 + inpos] & 16383) << (31 - 14)); + out[18 + outpos] = (in[17 + inpos] >>> 14) + | ((in[18 + inpos] & 8191) << (31 - 13)); + out[19 + outpos] = (in[18 + inpos] >>> 13) + | ((in[19 + inpos] & 4095) << (31 - 12)); + out[20 + outpos] = (in[19 + inpos] >>> 12) + | ((in[20 + inpos] & 2047) << (31 - 11)); + out[21 + outpos] = (in[20 + inpos] >>> 11) + | ((in[21 + inpos] & 1023) << (31 - 10)); + out[22 + outpos] = (in[21 + inpos] >>> 10) + | ((in[22 + inpos] & 511) << (31 - 9)); + out[23 + outpos] = (in[22 + inpos] >>> 9) + | ((in[23 + inpos] & 255) << (31 - 8)); + out[24 + outpos] = (in[23 + inpos] >>> 8) + | ((in[24 + inpos] & 127) << (31 - 7)); + out[25 + outpos] = (in[24 + inpos] >>> 7) + | ((in[25 + inpos] & 63) << (31 - 6)); + out[26 + outpos] = (in[25 + inpos] >>> 6) + | ((in[26 + inpos] & 31) << (31 - 5)); + out[27 + outpos] = (in[26 + inpos] >>> 5) + | ((in[27 + inpos] & 15) << (31 - 4)); + out[28 + outpos] = (in[27 + inpos] >>> 4) + | ((in[28 + inpos] & 7) << (31 - 3)); + out[29 + outpos] = (in[28 + inpos] >>> 3) + | ((in[29 + inpos] & 3) << (31 - 2)); + out[30 + outpos] = (in[29 + inpos] >>> 2) + | ((in[30 + inpos] & 1) << (31 - 1)); + out[31 + outpos] = (in[30 + inpos] >>> 1); + } - protected static void fastpack0(final int[] in, int inpos, final int[] out, int outpos) { - // nothing - } + protected static void fastunpack32(final int[] in, int inpos, + final int[] out, int outpos) { + System.arraycopy(in, inpos, out, outpos, 32); + } + protected static void fastpack32(final int[] in, int inpos, + final int[] out, int outpos) { + System.arraycopy(in, inpos, out, outpos, 32); + } - protected static void fastpackwithoutmask0(final int[] in, int inpos, final int[] out, int outpos) { - // nothing - } + protected static void fastpackwithoutmask32(final int[] in, int inpos, + final int[] out, int outpos) { + System.arraycopy(in, inpos, out, outpos, 32); + } + protected static void fastunpack0(final int[] in, int inpos, + final int[] out, int outpos) { + Arrays.fill(out, outpos, outpos + 32, 0); + } - protected static void fastunpack(final int[] in, int inpos, final int[] out, int outpos, final int bit) { - switch (bit) { - case 0: - fastunpack0(in, inpos, out, outpos); - break; - case 1: - fastunpack1(in, inpos, out, outpos); - break; - case 2: - fastunpack2(in, inpos, out, outpos); - break; - case 3: - fastunpack3(in, inpos, out, outpos); - break; - case 4: - fastunpack4(in, inpos, out, outpos); - break; - case 5: - fastunpack5(in, inpos, out, outpos); - break; - case 6: - fastunpack6(in, inpos, out, outpos); - break; - case 7: - fastunpack7(in, inpos, out, outpos); - break; - case 8: - fastunpack8(in, inpos, out, outpos); - break; - case 9: - fastunpack9(in, inpos, out, outpos); - break; - case 10: - fastunpack10(in, inpos, out, outpos); - break; - case 11: - fastunpack11(in, inpos, out, outpos); - break; - case 12: - fastunpack12(in, inpos, out, outpos); - break; - case 13: - fastunpack13(in, inpos, out, outpos); - break; - case 14: - fastunpack14(in, inpos, out, outpos); - break; - case 15: - fastunpack15(in, inpos, out, outpos); - break; - case 16: - fastunpack16(in, inpos, out, outpos); - break; - case 17: - fastunpack17(in, inpos, out, outpos); - break; - case 18: - fastunpack18(in, inpos, out, outpos); - break; - case 19: - fastunpack19(in, inpos, out, outpos); - break; - case 20: - fastunpack20(in, inpos, out, outpos); - break; - case 21: - fastunpack21(in, inpos, out, outpos); - break; - case 22: - fastunpack22(in, inpos, out, outpos); - break; - case 23: - fastunpack23(in, inpos, out, outpos); - break; - case 24: - fastunpack24(in, inpos, out, outpos); - break; - case 25: - fastunpack25(in, inpos, out, outpos); - break; - case 26: - fastunpack26(in, inpos, out, outpos); - break; - case 27: - fastunpack27(in, inpos, out, outpos); - break; - case 28: - fastunpack28(in, inpos, out, outpos); - break; - case 29: - fastunpack29(in, inpos, out, outpos); - break; - case 30: - fastunpack30(in, inpos, out, outpos); - break; - case 31: - fastunpack31(in, inpos, out, outpos); - break; - case 32: - fastunpack32(in, inpos, out, outpos); - break; - default: - throw new IllegalArgumentException("Unsupported bit width."); + protected static void fastpack0(final int[] in, int inpos, + final int[] out, int outpos) { + // nothing } - } + protected static void fastpackwithoutmask0(final int[] in, int inpos, + final int[] out, int outpos) { + // nothing + } - protected static void fastpack(final int[] in, int inpos, final int[] out, int outpos, final int bit) { - switch (bit) { - case 0: - fastpack0(in, inpos, out, outpos); - break; - case 1: - fastpack1(in, inpos, out, outpos); - break; - case 2: - fastpack2(in, inpos, out, outpos); - break; - case 3: - fastpack3(in, inpos, out, outpos); - break; - case 4: - fastpack4(in, inpos, out, outpos); - break; - case 5: - fastpack5(in, inpos, out, outpos); - break; - case 6: - fastpack6(in, inpos, out, outpos); - break; - case 7: - fastpack7(in, inpos, out, outpos); - break; - case 8: - fastpack8(in, inpos, out, outpos); - break; - case 9: - fastpack9(in, inpos, out, outpos); - break; - case 10: - fastpack10(in, inpos, out, outpos); - break; - case 11: - fastpack11(in, inpos, out, outpos); - break; - case 12: - fastpack12(in, inpos, out, outpos); - break; - case 13: - fastpack13(in, inpos, out, outpos); - break; - case 14: - fastpack14(in, inpos, out, outpos); - break; - case 15: - fastpack15(in, inpos, out, outpos); - break; - case 16: - fastpack16(in, inpos, out, outpos); - break; - case 17: - fastpack17(in, inpos, out, outpos); - break; - case 18: - fastpack18(in, inpos, out, outpos); - break; - case 19: - fastpack19(in, inpos, out, outpos); - break; - case 20: - fastpack20(in, inpos, out, outpos); - break; - case 21: - fastpack21(in, inpos, out, outpos); - break; - case 22: - fastpack22(in, inpos, out, outpos); - break; - case 23: - fastpack23(in, inpos, out, outpos); - break; - case 24: - fastpack24(in, inpos, out, outpos); - break; - case 25: - fastpack25(in, inpos, out, outpos); - break; - case 26: - fastpack26(in, inpos, out, outpos); - break; - case 27: - fastpack27(in, inpos, out, outpos); - break; - case 28: - fastpack28(in, inpos, out, outpos); - break; - case 29: - fastpack29(in, inpos, out, outpos); - break; - case 30: - fastpack30(in, inpos, out, outpos); - break; - case 31: - fastpack31(in, inpos, out, outpos); - break; - case 32: - fastpack32(in, inpos, out, outpos); - break; - default: - throw new IllegalArgumentException("Unsupported bit width."); + /** + * Pack the 32 integers + * + * @param in + * source array + * @param inpos + * starting point in the source array + * @param out + * output array + * @param outpos + * starting point in the output array + * @param bit + * how many bits to use per integer + */ + public static void fastunpack(final int[] in, final int inpos, + final int[] out, final int outpos, final int bit) { + switch (bit) { + case 0: + fastunpack0(in, inpos, out, outpos); + break; + case 1: + fastunpack1(in, inpos, out, outpos); + break; + case 2: + fastunpack2(in, inpos, out, outpos); + break; + case 3: + fastunpack3(in, inpos, out, outpos); + break; + case 4: + fastunpack4(in, inpos, out, outpos); + break; + case 5: + fastunpack5(in, inpos, out, outpos); + break; + case 6: + fastunpack6(in, inpos, out, outpos); + break; + case 7: + fastunpack7(in, inpos, out, outpos); + break; + case 8: + fastunpack8(in, inpos, out, outpos); + break; + case 9: + fastunpack9(in, inpos, out, outpos); + break; + case 10: + fastunpack10(in, inpos, out, outpos); + break; + case 11: + fastunpack11(in, inpos, out, outpos); + break; + case 12: + fastunpack12(in, inpos, out, outpos); + break; + case 13: + fastunpack13(in, inpos, out, outpos); + break; + case 14: + fastunpack14(in, inpos, out, outpos); + break; + case 15: + fastunpack15(in, inpos, out, outpos); + break; + case 16: + fastunpack16(in, inpos, out, outpos); + break; + case 17: + fastunpack17(in, inpos, out, outpos); + break; + case 18: + fastunpack18(in, inpos, out, outpos); + break; + case 19: + fastunpack19(in, inpos, out, outpos); + break; + case 20: + fastunpack20(in, inpos, out, outpos); + break; + case 21: + fastunpack21(in, inpos, out, outpos); + break; + case 22: + fastunpack22(in, inpos, out, outpos); + break; + case 23: + fastunpack23(in, inpos, out, outpos); + break; + case 24: + fastunpack24(in, inpos, out, outpos); + break; + case 25: + fastunpack25(in, inpos, out, outpos); + break; + case 26: + fastunpack26(in, inpos, out, outpos); + break; + case 27: + fastunpack27(in, inpos, out, outpos); + break; + case 28: + fastunpack28(in, inpos, out, outpos); + break; + case 29: + fastunpack29(in, inpos, out, outpos); + break; + case 30: + fastunpack30(in, inpos, out, outpos); + break; + case 31: + fastunpack31(in, inpos, out, outpos); + break; + case 32: + fastunpack32(in, inpos, out, outpos); + break; + default: + throw new IllegalArgumentException( + "Unsupported bit width."); + } } - } + /** + * Pack 32 integers + * + * @param in + * source array + * @param inpos + * position in source array + * @param out + * output array + * @param outpos + * position in output array + * @param bit + * number of bits to use per integer + */ + public static void fastpack(final int[] in, final int inpos, + final int[] out, final int outpos, final int bit) { + switch (bit) { + case 0: + fastpack0(in, inpos, out, outpos); + break; + case 1: + fastpack1(in, inpos, out, outpos); + break; + case 2: + fastpack2(in, inpos, out, outpos); + break; + case 3: + fastpack3(in, inpos, out, outpos); + break; + case 4: + fastpack4(in, inpos, out, outpos); + break; + case 5: + fastpack5(in, inpos, out, outpos); + break; + case 6: + fastpack6(in, inpos, out, outpos); + break; + case 7: + fastpack7(in, inpos, out, outpos); + break; + case 8: + fastpack8(in, inpos, out, outpos); + break; + case 9: + fastpack9(in, inpos, out, outpos); + break; + case 10: + fastpack10(in, inpos, out, outpos); + break; + case 11: + fastpack11(in, inpos, out, outpos); + break; + case 12: + fastpack12(in, inpos, out, outpos); + break; + case 13: + fastpack13(in, inpos, out, outpos); + break; + case 14: + fastpack14(in, inpos, out, outpos); + break; + case 15: + fastpack15(in, inpos, out, outpos); + break; + case 16: + fastpack16(in, inpos, out, outpos); + break; + case 17: + fastpack17(in, inpos, out, outpos); + break; + case 18: + fastpack18(in, inpos, out, outpos); + break; + case 19: + fastpack19(in, inpos, out, outpos); + break; + case 20: + fastpack20(in, inpos, out, outpos); + break; + case 21: + fastpack21(in, inpos, out, outpos); + break; + case 22: + fastpack22(in, inpos, out, outpos); + break; + case 23: + fastpack23(in, inpos, out, outpos); + break; + case 24: + fastpack24(in, inpos, out, outpos); + break; + case 25: + fastpack25(in, inpos, out, outpos); + break; + case 26: + fastpack26(in, inpos, out, outpos); + break; + case 27: + fastpack27(in, inpos, out, outpos); + break; + case 28: + fastpack28(in, inpos, out, outpos); + break; + case 29: + fastpack29(in, inpos, out, outpos); + break; + case 30: + fastpack30(in, inpos, out, outpos); + break; + case 31: + fastpack31(in, inpos, out, outpos); + break; + case 32: + fastpack32(in, inpos, out, outpos); + break; + default: + throw new IllegalArgumentException( + "Unsupported bit width."); + /** + * @param in + * @param inpos + * @param out + * @param outpos + * @param bit + */ + } + } - protected static void fastpackwithoutmask(final int[] in, int inpos, final int[] out, int outpos, final int bit) { - switch (bit) { - case 0: - fastpackwithoutmask0(in, inpos, out, outpos); - break; - case 1: - fastpackwithoutmask1(in, inpos, out, outpos); - break; - case 2: - fastpackwithoutmask2(in, inpos, out, outpos); - break; - case 3: - fastpackwithoutmask3(in, inpos, out, outpos); - break; - case 4: - fastpackwithoutmask4(in, inpos, out, outpos); - break; - case 5: - fastpackwithoutmask5(in, inpos, out, outpos); - break; - case 6: - fastpackwithoutmask6(in, inpos, out, outpos); - break; - case 7: - fastpackwithoutmask7(in, inpos, out, outpos); - break; - case 8: - fastpackwithoutmask8(in, inpos, out, outpos); - break; - case 9: - fastpackwithoutmask9(in, inpos, out, outpos); - break; - case 10: - fastpackwithoutmask10(in, inpos, out, outpos); - break; - case 11: - fastpackwithoutmask11(in, inpos, out, outpos); - break; - case 12: - fastpackwithoutmask12(in, inpos, out, outpos); - break; - case 13: - fastpackwithoutmask13(in, inpos, out, outpos); - break; - case 14: - fastpackwithoutmask14(in, inpos, out, outpos); - break; - case 15: - fastpackwithoutmask15(in, inpos, out, outpos); - break; - case 16: - fastpackwithoutmask16(in, inpos, out, outpos); - break; - case 17: - fastpackwithoutmask17(in, inpos, out, outpos); - break; - case 18: - fastpackwithoutmask18(in, inpos, out, outpos); - break; - case 19: - fastpackwithoutmask19(in, inpos, out, outpos); - break; - case 20: - fastpackwithoutmask20(in, inpos, out, outpos); - break; - case 21: - fastpackwithoutmask21(in, inpos, out, outpos); - break; - case 22: - fastpackwithoutmask22(in, inpos, out, outpos); - break; - case 23: - fastpackwithoutmask23(in, inpos, out, outpos); - break; - case 24: - fastpackwithoutmask24(in, inpos, out, outpos); - break; - case 25: - fastpackwithoutmask25(in, inpos, out, outpos); - break; - case 26: - fastpackwithoutmask26(in, inpos, out, outpos); - break; - case 27: - fastpackwithoutmask27(in, inpos, out, outpos); - break; - case 28: - fastpackwithoutmask28(in, inpos, out, outpos); - break; - case 29: - fastpackwithoutmask29(in, inpos, out, outpos); - break; - case 30: - fastpackwithoutmask30(in, inpos, out, outpos); - break; - case 31: - fastpackwithoutmask31(in, inpos, out, outpos); - break; - case 32: - fastpackwithoutmask32(in, inpos, out, outpos); - break; - default: - throw new IllegalArgumentException("Unsupported bit width."); + /** + * Unpack 32 integers + * + * @param in + * source array + * @param inpos + * position in source array + * @param out + * output array + * @param outpos + * position in output array + * @param bit + * number of bits to use per integer + */ + public static void fastpackwithoutmask(final int[] in, final int inpos, + final int[] out, final int outpos, final int bit) { + switch (bit) { + case 0: + fastpackwithoutmask0(in, inpos, out, outpos); + break; + case 1: + fastpackwithoutmask1(in, inpos, out, outpos); + break; + case 2: + fastpackwithoutmask2(in, inpos, out, outpos); + break; + case 3: + fastpackwithoutmask3(in, inpos, out, outpos); + break; + case 4: + fastpackwithoutmask4(in, inpos, out, outpos); + break; + case 5: + fastpackwithoutmask5(in, inpos, out, outpos); + break; + case 6: + fastpackwithoutmask6(in, inpos, out, outpos); + break; + case 7: + fastpackwithoutmask7(in, inpos, out, outpos); + break; + case 8: + fastpackwithoutmask8(in, inpos, out, outpos); + break; + case 9: + fastpackwithoutmask9(in, inpos, out, outpos); + break; + case 10: + fastpackwithoutmask10(in, inpos, out, outpos); + break; + case 11: + fastpackwithoutmask11(in, inpos, out, outpos); + break; + case 12: + fastpackwithoutmask12(in, inpos, out, outpos); + break; + case 13: + fastpackwithoutmask13(in, inpos, out, outpos); + break; + case 14: + fastpackwithoutmask14(in, inpos, out, outpos); + break; + case 15: + fastpackwithoutmask15(in, inpos, out, outpos); + break; + case 16: + fastpackwithoutmask16(in, inpos, out, outpos); + break; + case 17: + fastpackwithoutmask17(in, inpos, out, outpos); + break; + case 18: + fastpackwithoutmask18(in, inpos, out, outpos); + break; + case 19: + fastpackwithoutmask19(in, inpos, out, outpos); + break; + case 20: + fastpackwithoutmask20(in, inpos, out, outpos); + break; + case 21: + fastpackwithoutmask21(in, inpos, out, outpos); + break; + case 22: + fastpackwithoutmask22(in, inpos, out, outpos); + break; + case 23: + fastpackwithoutmask23(in, inpos, out, outpos); + break; + case 24: + fastpackwithoutmask24(in, inpos, out, outpos); + break; + case 25: + fastpackwithoutmask25(in, inpos, out, outpos); + break; + case 26: + fastpackwithoutmask26(in, inpos, out, outpos); + break; + case 27: + fastpackwithoutmask27(in, inpos, out, outpos); + break; + case 28: + fastpackwithoutmask28(in, inpos, out, outpos); + break; + case 29: + fastpackwithoutmask29(in, inpos, out, outpos); + break; + case 30: + fastpackwithoutmask30(in, inpos, out, outpos); + break; + case 31: + fastpackwithoutmask31(in, inpos, out, outpos); + break; + case 32: + fastpackwithoutmask32(in, inpos, out, outpos); + break; + default: + throw new IllegalArgumentException( + "Unsupported bit width."); + } } - } } diff --git a/src/main/java/me/lemire/integercompression/ByteIntegerCODEC.java b/src/main/java/me/lemire/integercompression/ByteIntegerCODEC.java index 2c79089..47d4f57 100644 --- a/src/main/java/me/lemire/integercompression/ByteIntegerCODEC.java +++ b/src/main/java/me/lemire/integercompression/ByteIntegerCODEC.java @@ -7,43 +7,54 @@ package me.lemire.integercompression; - /** - * Interface describing a CODEC to compress integers to bytes. + * Interface describing a CODEC to compress integers to bytes. * * @author Daniel Lemire - * + * */ public interface ByteIntegerCODEC { - /** - * Compress data from an array to another array. - * - * Both inpos and outpos are modified to represent how much - * data was read and written to - * if 12 ints (inlength = 12) are compressed to 3 bytes, then - * inpos will be incremented by 12 while outpos will be - * incremented by 3 - * we use IntWrapper to pass the values by reference. - * @param in input array - * @param inpos location in the input array - * @param inlength how many integers to compress - * @param out output array - * @param outpos where to write in the output array - */ - public void compress(int[] in, IntWrapper inpos, int inlength, byte[] out, IntWrapper outpos); - - /** - * Uncompress data from an array to another array. - * - * Both inpos and outpos parameters are modified to indicate new positions after read/write. - * - * @param in array containing data in compressed form - * @param inpos where to start reading in the array - * @param inlength length of the compressed data (ignored by some schemes) - * @param out array where to write the compressed output - * @param outpos where to write the compressed output in out - */ - public void uncompress(byte[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos); + /** + * Compress data from an array to another array. + * + * Both inpos and outpos are modified to represent how much data was + * read and written to if 12 ints (inlength = 12) are compressed to 3 + * bytes, then inpos will be incremented by 12 while outpos will be + * incremented by 3 we use IntWrapper to pass the values by reference. + * + * @param in + * input array + * @param inpos + * location in the input array + * @param inlength + * how many integers to compress + * @param out + * output array + * @param outpos + * where to write in the output array + */ + public void compress(int[] in, IntWrapper inpos, int inlength, + byte[] out, IntWrapper outpos); + /** + * Uncompress data from an array to another array. + * + * Both inpos and outpos parameters are modified to indicate new + * positions after read/write. + * + * @param in + * array containing data in compressed form + * @param inpos + * where to start reading in the array + * @param inlength + * length of the compressed data (ignored by some + * schemes) + * @param out + * array where to write the compressed output + * @param outpos + * where to write the compressed output in out + */ + public void uncompress(byte[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos); } diff --git a/src/main/java/me/lemire/integercompression/Composition.java b/src/main/java/me/lemire/integercompression/Composition.java index 8282031..35d17f6 100644 --- a/src/main/java/me/lemire/integercompression/Composition.java +++ b/src/main/java/me/lemire/integercompression/Composition.java @@ -6,60 +6,62 @@ */ package me.lemire.integercompression; - /** * Helper class to compose schemes. - * + * * @author Daniel Lemire */ public class Composition implements IntegerCODEC { - IntegerCODEC F1, F2; - - /** - * Compose a scheme from a first one (f1) and a second one (f2). - * The first one is called first and then the second one tries to - * compress whatever remains from the first run. - * - * By convention, the first scheme should be such that if, during - * decoding, a 32-bit zero is first encountered, then there is no - * output. - * - * @param f1 first codec - * @param f2 second codec - */ - public Composition(IntegerCODEC f1, IntegerCODEC f2) { - F1 = f1; - F2 = f2; - } + IntegerCODEC F1, F2; - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - if(inlength == 0) return; - int init = inpos.get(); - F1.compress(in, inpos, inlength, out, outpos); - if (outpos.get() == 0) { - out[0] = 0; - outpos.increment(); + /** + * Compose a scheme from a first one (f1) and a second one (f2). The + * first one is called first and then the second one tries to compress + * whatever remains from the first run. + * + * By convention, the first scheme should be such that if, during + * decoding, a 32-bit zero is first encountered, then there is no + * output. + * + * @param f1 + * first codec + * @param f2 + * second codec + */ + public Composition(IntegerCODEC f1, IntegerCODEC f2) { + F1 = f1; + F2 = f2; } - inlength -= inpos.get() - init; - F2.compress(in, inpos, inlength, out, outpos); - } - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { - if(inlength == 0) return; - final int init = inpos.get(); - F1.uncompress(in, inpos, inlength, out, outpos); - inlength -= inpos.get() - init; - F2.uncompress(in, inpos, inlength, out, outpos); - } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + if (inlength == 0) + return; + int init = inpos.get(); + F1.compress(in, inpos, inlength, out, outpos); + if (outpos.get() == 0) { + out[0] = 0; + outpos.increment(); + } + inlength -= inpos.get() - init; + F2.compress(in, inpos, inlength, out, outpos); + } + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + if (inlength == 0) + return; + final int init = inpos.get(); + F1.uncompress(in, inpos, inlength, out, outpos); + inlength -= inpos.get() - init; + F2.uncompress(in, inpos, inlength, out, outpos); + } - @Override - public String toString() { - return F1.toString() + " + " + F2.toString(); - } + @Override + public String toString() { + return F1.toString() + " + " + F2.toString(); + } } diff --git a/src/main/java/me/lemire/integercompression/Delta.java b/src/main/java/me/lemire/integercompression/Delta.java index 877a817..29f0cd2 100644 --- a/src/main/java/me/lemire/integercompression/Delta.java +++ b/src/main/java/me/lemire/integercompression/Delta.java @@ -11,124 +11,140 @@ * Generic class to compute differential coding. * * @author Daniel Lemire - * + * */ public final class Delta { - /** - * Apply differential coding (in-place). - * - * @param data data to be modified - */ - public static void delta(int[] data) { - for (int i = data.length - 1; i > 0; --i) { - data[i] -= data[i - 1]; + /** + * Apply differential coding (in-place). + * + * @param data + * data to be modified + */ + public static void delta(int[] data) { + for (int i = data.length - 1; i > 0; --i) { + data[i] -= data[i - 1]; + } } - } - /** - * Apply differential coding (in-place) given an initial value. - * - * @param data data to be modified - * @param start starting index - * @param length number of integers to process - * @param init initial value - * @return next initial vale - */ - public static int delta(int[] data, int start, int length, int init) { - final int nextinit = data[start + length - 1]; - for (int i = length - 1; i > 0; --i) { - data[start + i] -= data[start + i - 1]; - } - data[start] -= init; - return nextinit; - } - /** - * Compute differential coding given an initial value. - * Output is written to a provided array: must have length "length" or better. - * - * @param data data to be modified - * @param start starting index - * @param length number of integers to process - * @param init initial value - * @param out output array - * @return next initial vale - */ - public static int delta(int[] data, int start, int length, int init, int[] out) { - for (int i = length - 1; i > 0; --i) { - out[i] = data[start + i] - data[start + i - 1]; - } - out[0] = data[start] - init; - return data[start + length - 1]; - } - /** - * Undo differential coding (in-place). Effectively - * computes a prefix sum. - * - * @param data to be modified. - */ - public static void inverseDelta(int[] data) { - for (int i = 1; i < data.length; ++i) { - data[i] += data[i - 1]; + /** + * Apply differential coding (in-place) given an initial value. + * + * @param data + * data to be modified + * @param start + * starting index + * @param length + * number of integers to process + * @param init + * initial value + * @return next initial vale + */ + public static int delta(int[] data, int start, int length, int init) { + final int nextinit = data[start + length - 1]; + for (int i = length - 1; i > 0; --i) { + data[start + i] -= data[start + i - 1]; + } + data[start] -= init; + return nextinit; } - } - /** - * Undo differential coding (in-place). Effectively - * computes a prefix sum. - * Like inverseDelta, only faster. - * - * @param data to be modified - */ - public static void fastinverseDelta(int[] data) { - int sz0 = data.length / 4 * 4; - int i = 1; - if (sz0 >= 4) { - int a = data[0]; - for (; i < sz0 - 4; i += 4) { - a = data[i] += a; - a = data[i + 1] += a; - a = data[i + 2] += a; - a = data[i + 3] += a; - } + /** + * Compute differential coding given an initial value. Output is written + * to a provided array: must have length "length" or better. + * + * @param data + * data to be modified + * @param start + * starting index + * @param length + * number of integers to process + * @param init + * initial value + * @param out + * output array + * @return next initial vale + */ + public static int delta(int[] data, int start, int length, int init, + int[] out) { + for (int i = length - 1; i > 0; --i) { + out[i] = data[start + i] - data[start + i - 1]; + } + out[0] = data[start] - init; + return data[start + length - 1]; } - for (; i != data.length; ++i) { - data[i] += data[i - 1]; + /** + * Undo differential coding (in-place). Effectively computes a prefix + * sum. + * + * @param data + * to be modified. + */ + public static void inverseDelta(int[] data) { + for (int i = 1; i < data.length; ++i) { + data[i] += data[i - 1]; + } } - } - - - /** - * Undo differential coding (in-place). Effectively - * computes a prefix sum. - * Like inverseDelta, only faster. - * Uses an initial value. - * - * @param data to be modified - * @param start starting index - * @param length number of integers to process - * @param init initial value - * @return next initial value - */ - public static int fastinverseDelta(int[] data, int start, int length, int init) { - data[start] += init; - int sz0 = length / 4 * 4; - int i = 1; - if (sz0 >= 4) { - int a = data[start]; - for (; i < sz0 - 4; i += 4) { - a = data[start + i] += a; - a = data[start + i + 1] += a; - a = data[start + i + 2] += a; - a = data[start + i + 3] += a; - } + + /** + * Undo differential coding (in-place). Effectively computes a prefix + * sum. Like inverseDelta, only faster. + * + * @param data + * to be modified + */ + public static void fastinverseDelta(int[] data) { + int sz0 = data.length / 4 * 4; + int i = 1; + if (sz0 >= 4) { + int a = data[0]; + for (; i < sz0 - 4; i += 4) { + a = data[i] += a; + a = data[i + 1] += a; + a = data[i + 2] += a; + a = data[i + 3] += a; + } + } + + for (; i != data.length; ++i) { + data[i] += data[i - 1]; + } } - for (; i != length; ++i) { - data[start + i] += data[start + i - 1]; + /** + * Undo differential coding (in-place). Effectively computes a prefix + * sum. Like inverseDelta, only faster. Uses an initial value. + * + * @param data + * to be modified + * @param start + * starting index + * @param length + * number of integers to process + * @param init + * initial value + * @return next initial value + */ + public static int fastinverseDelta(int[] data, int start, int length, + int init) { + data[start] += init; + int sz0 = length / 4 * 4; + int i = 1; + if (sz0 >= 4) { + int a = data[start]; + for (; i < sz0 - 4; i += 4) { + a = data[start + i] += a; + a = data[start + i + 1] += a; + a = data[start + i + 2] += a; + a = data[start + i + 3] += a; + } + } + + for (; i != length; ++i) { + data[start + i] += data[start + i - 1]; + } + return data[start + length - 1]; } - return data[start + length - 1]; - } } diff --git a/src/main/java/me/lemire/integercompression/DeltaZigzagBinaryPacking.java b/src/main/java/me/lemire/integercompression/DeltaZigzagBinaryPacking.java index 451ec97..59c6881 100644 --- a/src/main/java/me/lemire/integercompression/DeltaZigzagBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/DeltaZigzagBinaryPacking.java @@ -7,98 +7,92 @@ /** * BinaryPacking with Delta+Zigzag Encoding. - * + * * @author MURAOKA Taro http://github.com/koron */ public final class DeltaZigzagBinaryPacking implements IntegerCODEC { - public static final int BLOCK_LENGTH = 128; - - @Override - public void compress( - int[] inBuf, IntWrapper inPos, int inLen, - int[] outBuf, IntWrapper outPos) - { - inLen = inLen - inLen % BLOCK_LENGTH; - if (inLen == 0) { - return; + private static final int BLOCK_LENGTH = 128; + + @Override + public void compress(int[] inBuf, IntWrapper inPos, int inLen, + int[] outBuf, IntWrapper outPos) { + inLen = inLen - inLen % BLOCK_LENGTH; + if (inLen == 0) { + return; + } + + outBuf[outPos.get()] = inLen; + outPos.increment(); + + DeltaZigzagEncoding.Encoder ctx = new DeltaZigzagEncoding.Encoder(0); + int[] work = new int[BLOCK_LENGTH]; + + int op = outPos.get(); + int ip = inPos.get(); + final int inPosLast = ip + inLen; + for (; ip < inPosLast; ip += BLOCK_LENGTH) { + ctx.encodeArray(inBuf, ip, BLOCK_LENGTH, work); + final int bits1 = Util.maxbits32(work, 0); + final int bits2 = Util.maxbits32(work, 32); + final int bits3 = Util.maxbits32(work, 64); + final int bits4 = Util.maxbits32(work, 96); + outBuf[op++] = (bits1 << 24) | (bits2 << 16) + | (bits3 << 8) | (bits4 << 0); + op += pack(work, 0, outBuf, op, bits1); + op += pack(work, 32, outBuf, op, bits2); + op += pack(work, 64, outBuf, op, bits3); + op += pack(work, 96, outBuf, op, bits4); + } + + inPos.add(inLen); + outPos.set(op); } - outBuf[outPos.get()] = inLen; - outPos.increment(); - - DeltaZigzagEncoding.Encoder ctx = new DeltaZigzagEncoding.Encoder(); - int[] work = new int[BLOCK_LENGTH]; - - int op = outPos.get(); - int ip = inPos.get(); - final int inPosLast = ip + inLen; - for (; ip < inPosLast; ip += BLOCK_LENGTH) { - ctx.encodeArray(inBuf, ip, BLOCK_LENGTH, work); - final int bits1 = Util.maxbits32(work, 0); - final int bits2 = Util.maxbits32(work, 32); - final int bits3 = Util.maxbits32(work, 64); - final int bits4 = Util.maxbits32(work, 96); - outBuf[op++] = (bits1 << 24) | (bits2 << 16) | - (bits3 << 8) | (bits4 << 0); - op += pack(work, 0, outBuf, op, bits1); - op += pack(work, 32, outBuf, op, bits2); - op += pack(work, 64, outBuf, op, bits3); - op += pack(work, 96, outBuf, op, bits4); + @Override + public void uncompress(int[] inBuf, IntWrapper inPos, int inLen, + int[] outBuf, IntWrapper outPos) { + if (inLen == 0) { + return; + } + + final int outLen = inBuf[inPos.get()]; + inPos.increment(); + + DeltaZigzagEncoding.Decoder ctx = new DeltaZigzagEncoding.Decoder(0); + int[] work = new int[BLOCK_LENGTH]; + + int ip = inPos.get(); + int op = outPos.get(); + final int outPosLast = op + outLen; + for (; op < outPosLast; op += BLOCK_LENGTH) { + int n = inBuf[ip++]; + ip += unpack(inBuf, ip, work, 0, (n >> 24) & 0x3F); + ip += unpack(inBuf, ip, work, 32, (n >> 16) & 0x3F); + ip += unpack(inBuf, ip, work, 64, (n >> 8) & 0x3F); + ip += unpack(inBuf, ip, work, 96, (n >> 0) & 0x3F); + ctx.decodeArray(work, 0, BLOCK_LENGTH, outBuf, op); + } + + outPos.add(outLen); + inPos.set(ip); } - inPos.add(inLen); - outPos.set(op); - } - - @Override - public void uncompress( - int[] inBuf, IntWrapper inPos, int inLen, - int[] outBuf, IntWrapper outPos) - { - if (inLen == 0) { - return; + private static int pack(int[] inBuf, int inOff, int[] outBuf, + int outOff, int validBits) { + BitPacking.fastpackwithoutmask(inBuf, inOff, outBuf, outOff, + validBits); + return validBits; } - final int outLen = inBuf[inPos.get()]; - inPos.increment(); - - DeltaZigzagEncoding.Decoder ctx = new DeltaZigzagEncoding.Decoder(); - int[] work = new int[BLOCK_LENGTH]; - - int ip = inPos.get(); - int op = outPos.get(); - final int outPosLast = op + outLen; - for (; op < outPosLast; op += BLOCK_LENGTH) { - int n = inBuf[ip++]; - ip += unpack(inBuf, ip, work, 0, (n >> 24) & 0x3F); - ip += unpack(inBuf, ip, work, 32, (n >> 16) & 0x3F); - ip += unpack(inBuf, ip, work, 64, (n >> 8) & 0x3F); - ip += unpack(inBuf, ip, work, 96, (n >> 0) & 0x3F); - ctx.decodeArray(work, 0, BLOCK_LENGTH, outBuf, op); + private static int unpack(int[] inBuf, int inOff, int[] outBuf, + int outOff, int validBits) { + BitPacking.fastunpack(inBuf, inOff, outBuf, outOff, validBits); + return validBits; } - outPos.add(outLen); - inPos.set(ip); - } - - private static int pack(int[] inBuf, int inOff, - int[] outBuf, int outOff, int validBits) - { - BitPacking.fastpackwithoutmask(inBuf, inOff, outBuf, outOff, - validBits); - return validBits; - } - - private static int unpack(int[] inBuf, int inOff, - int[] outBuf, int outOff, int validBits) - { - BitPacking.fastunpack(inBuf, inOff, outBuf, outOff, validBits); - return validBits; - } - - @Override - public String toString() { - return this.getClass().getSimpleName(); - } + @Override + public String toString() { + return this.getClass().getSimpleName(); + } } diff --git a/src/main/java/me/lemire/integercompression/DeltaZigzagEncoding.java b/src/main/java/me/lemire/integercompression/DeltaZigzagEncoding.java index 3402e6a..a3f0d7e 100644 --- a/src/main/java/me/lemire/integercompression/DeltaZigzagEncoding.java +++ b/src/main/java/me/lemire/integercompression/DeltaZigzagEncoding.java @@ -6,103 +6,89 @@ /** * Delta+Zigzag Encoding. - * + * * @author MURAOKA Taro http://github.com/koron */ public final class DeltaZigzagEncoding { - public static class Context { - protected int contextValue; - - protected Context(int contextValue) { - this.contextValue = contextValue; - } - - public void setContextValue(int contextValue) { - this.contextValue = contextValue; - } - - public int getContextValue() { - return this.contextValue; - } - } - - public static class Encoder extends Context { - public Encoder(int contextValue) { - super(contextValue); - } - - public Encoder() { - super(0); - } - - public int encodeInt(int value) { - int n = value - this.contextValue; - this.contextValue = value; - return (n << 1) ^ (n >> 31); - } - - public int[] encodeArray(int[] src, int srcoff, int length, - int[] dst, int dstoff) - { - for (int i = 0; i < length; ++i) { - dst[dstoff + i] = encodeInt(src[srcoff + i]); - } - return dst; - } - - public int[] encodeArray(int[] src, int srcoff, int length, - int[] dst) - { - return encodeArray(src, srcoff, length, dst, 0); - } - - public int[] encodeArray(int[] src, int offset, int length) { - return encodeArray(src, offset, length, new int[length], 0); - } - - public int[] encodeArray(int[] src) { - return encodeArray(src, 0, src.length, new int[src.length], 0); - } - } - - public static class Decoder extends Context { - public Decoder(int contextValue) { - super(contextValue); - } - - public Decoder() { - super(0); - } - - public int decodeInt(int value) { - int n = (value >>> 1) ^ ((value << 31) >> 31); - n += this.contextValue; - this.contextValue = n; - return n; - } - - public int[] decodeArray(int[] src, int srcoff, int length, - int[] dst, int dstoff) - { - for (int i = 0; i < length; ++i) { - dst[dstoff + i] = decodeInt(src[srcoff + i]); - } - return dst; - } - - public int[] decodeArray(int[] src, int srcoff, int length, - int[] dst) - { - return decodeArray(src, srcoff, length, dst, 0); - } - - public int[] decodeArray(int[] src, int offset, int length) { - return decodeArray(src, offset, length, new int[length], 0); - } - - public int[] decodeArray(int[] src) { - return decodeArray(src, 0, src.length); + static class Context { + int contextValue; + + Context(int contextValue) { + this.contextValue = contextValue; + } + + void setContextValue(int contextValue) { + this.contextValue = contextValue; + } + + int getContextValue() { + return this.contextValue; + } + } + + static class Encoder extends Context { + Encoder(int contextValue) { + super(contextValue); + } + + int encodeInt(int value) { + int n = value - this.contextValue; + this.contextValue = value; + return (n << 1) ^ (n >> 31); + } + + int[] encodeArray(int[] src, int srcoff, int length, + int[] dst, int dstoff) { + for (int i = 0; i < length; ++i) { + dst[dstoff + i] = encodeInt(src[srcoff + i]); + } + return dst; + } + + int[] encodeArray(int[] src, int srcoff, int length, + int[] dst) { + return encodeArray(src, srcoff, length, dst, 0); + } + + int[] encodeArray(int[] src, int offset, int length) { + return encodeArray(src, offset, length, + new int[length], 0); + } + + int[] encodeArray(int[] src) { + return encodeArray(src, 0, src.length, + new int[src.length], 0); + } + } + + static class Decoder extends Context { + Decoder(int contextValue) { + super(contextValue); + } + + int decodeInt(int value) { + int n = (value >>> 1) ^ ((value << 31) >> 31); + n += this.contextValue; + this.contextValue = n; + return n; + } + + int[] decodeArray(int[] src, int srcoff, int length, + int[] dst, int dstoff) { + for (int i = 0; i < length; ++i) { + dst[dstoff + i] = decodeInt(src[srcoff + i]); + } + return dst; + } + + int[] decodeArray(int[] src, int offset, int length) { + return decodeArray(src, offset, length, + new int[length], 0); + } + + int[] decodeArray(int[] src) { + return decodeArray(src, 0, src.length); + } } - } } diff --git a/src/main/java/me/lemire/integercompression/DeltaZigzagVariableByte.java b/src/main/java/me/lemire/integercompression/DeltaZigzagVariableByte.java index eea1e96..1988d47 100644 --- a/src/main/java/me/lemire/integercompression/DeltaZigzagVariableByte.java +++ b/src/main/java/me/lemire/integercompression/DeltaZigzagVariableByte.java @@ -8,98 +8,123 @@ import java.nio.ByteBuffer; import java.nio.IntBuffer; +/** + * VariableByte with Delta+Zigzag Encoding. + * + * @author MURAOKA Taro http://github.com/koron + */ public final class DeltaZigzagVariableByte implements IntegerCODEC { - @Override - public String toString() { - return DeltaZigzagVariableByte.class.getSimpleName(); - } - - @Override - public void compress( - int[] inBuf, IntWrapper inPos, int inLen, - int[] outBuf, IntWrapper outPos) - { - if (inLen == 0) { - return; + @Override + public String toString() { + return DeltaZigzagVariableByte.class.getSimpleName(); } - ByteBuffer byteBuf = ByteBuffer.allocateDirect(inLen * 5 + 3); - DeltaZigzagEncoding.Encoder ctx = new DeltaZigzagEncoding.Encoder(); + @Override + public void compress(int[] inBuf, IntWrapper inPos, int inLen, + int[] outBuf, IntWrapper outPos) { + if (inLen == 0) { + return; + } - // Delta+Zigzag+VariableByte encoding. - int ip = inPos.get(); - final int inPosLast = ip + inLen; - for (; ip < inPosLast; ++ip) { - // Filter with delta+zigzag encoding. - int n = ctx.encodeInt(inBuf[ip]); - // Variable byte encoding. - switch (Integer.numberOfLeadingZeros(n)) { - case 0: case 1: case 2: case 3: - byteBuf.put((byte)(((n >>> 28) & 0x7F) | 0x80)); - // through. - case 4: case 5: case 6: case 7: case 8: case 9: case 10: - byteBuf.put((byte)(((n >>> 21) & 0x7F) | 0x80)); - // through. - case 11: case 12: case 13: case 14: case 15: case 16: case 17: - byteBuf.put((byte)(((n >>> 14) & 0x7F) | 0x80)); - // through. - case 18: case 19: case 20: case 21: case 22: case 23: case 24: - byteBuf.put((byte)(((n >>> 7) & 0x7F) | 0x80)); - // through. - default: - byteBuf.put((byte)(n & 0x7F)); - } - } + ByteBuffer byteBuf = ByteBuffer.allocateDirect(inLen * 5 + 3); + DeltaZigzagEncoding.Encoder ctx = new DeltaZigzagEncoding.Encoder(0); - // Padding buffer to considerable as IntBuffer. - for (int i = (4 - (byteBuf.position() % 4)) % 4; i > 0; --i) { - byteBuf.put((byte)(0x80)); + // Delta+Zigzag+VariableByte encoding. + int ip = inPos.get(); + final int inPosLast = ip + inLen; + for (; ip < inPosLast; ++ip) { + // Filter with delta+zigzag encoding. + int n = ctx.encodeInt(inBuf[ip]); + // Variable byte encoding. + switch (Integer.numberOfLeadingZeros(n)) { + case 0: + case 1: + case 2: + case 3: + byteBuf.put((byte) (((n >>> 28) & 0x7F) | 0x80)); + // through. + //$FALL-THROUGH$ + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + byteBuf.put((byte) (((n >>> 21) & 0x7F) | 0x80)); + // through. + //$FALL-THROUGH$ + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + case 17: + byteBuf.put((byte) (((n >>> 14) & 0x7F) | 0x80)); + // through. + //$FALL-THROUGH$ + case 18: + case 19: + case 20: + case 21: + case 22: + case 23: + case 24: + byteBuf.put((byte) (((n >>> 7) & 0x7F) | 0x80)); + // through. + //$FALL-THROUGH$ + default: + byteBuf.put((byte) (n & 0x7F)); + } + } + + // Padding buffer to considerable as IntBuffer. + for (int i = (4 - (byteBuf.position() % 4)) % 4; i > 0; --i) { + byteBuf.put((byte) (0x80)); + } + + int outLen = byteBuf.position() / 4; + byteBuf.flip(); + IntBuffer intBuf = byteBuf.asIntBuffer(); + /* + * System.out.println(String.format( + * "inLen=%d pos=%d limit=%d outLen=%d outBuf.len=%d", inLen, + * intBuf.position(), intBuf.limit(), outLen, outBuf.length)); + */ + intBuf.get(outBuf, outPos.get(), outLen); + inPos.add(inLen); + outPos.add(outLen); } - int outLen = byteBuf.position() / 4; - byteBuf.flip(); - IntBuffer intBuf = byteBuf.asIntBuffer(); - /* - System.out.println(String.format( - "inLen=%d pos=%d limit=%d outLen=%d outBuf.len=%d", - inLen, intBuf.position(), intBuf.limit(), outLen, - outBuf.length)); - */ - intBuf.get(outBuf, outPos.get(), outLen); - inPos.add(inLen); - outPos.add(outLen); - } + @Override + public void uncompress(int[] inBuf, IntWrapper inPos, int inLen, + int[] outBuf, IntWrapper outPos) { + DeltaZigzagEncoding.Decoder ctx = new DeltaZigzagEncoding.Decoder(0); - @Override - public void uncompress( - int[] inBuf, IntWrapper inPos, int inLen, - int[] outBuf, IntWrapper outPos) - { - DeltaZigzagEncoding.Decoder ctx = new DeltaZigzagEncoding.Decoder(); + int ip = inPos.get(); + int op = outPos.get(); + int vbcNum = 0, vbcShift = 24; // Varialbe Byte Context. + final int inPosLast = ip + inLen; + while (ip < inPosLast) { + // Fetch a byte value. + int n = (inBuf[ip] >>> vbcShift) & 0xFF; + if (vbcShift > 0) { + vbcShift -= 8; + } else { + vbcShift = 24; + ip++; + } + // Decode variable byte and delta+zigzag. + vbcNum = (vbcNum << 7) + (n & 0x7F); + if ((n & 0x80) == 0) { + outBuf[op++] = ctx.decodeInt(vbcNum); + vbcNum = 0; + } + } - int ip = inPos.get(); - int op = outPos.get(); - int vbcNum = 0, vbcShift = 24; // Varialbe Byte Context. - final int inPosLast = ip + inLen; - while (ip < inPosLast) { - // Fetch a byte value. - int n = (inBuf[ip] >>> vbcShift) & 0xFF; - if (vbcShift > 0) { - vbcShift -= 8; - } else { - vbcShift = 24; - ip++; - } - // Decode variable byte and delta+zigzag. - vbcNum = (vbcNum << 7) + (n & 0x7F); - if ((n & 0x80) == 0) { - outBuf[op++] = ctx.decodeInt(vbcNum); - vbcNum = 0; - } + outPos.set(op); + inPos.set(inPosLast); } - - outPos.set(op); - inPos.set(inPosLast); - } } diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 45f6a74..4753d19 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -10,266 +10,280 @@ import java.util.Arrays; /** - * This is a PFOR Scheme designed by D. Lemire called FastPFOR. + * This is a PFOR Scheme designed by D. Lemire called FastPFOR. *

* For details, please see *

- * Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second through vectorization - * Software: Practice & Experience + * Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second + * through vectorization Software: Practice & Experience * http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract * http://arxiv.org/abs/1209.2137 *

* For sufficiently compressible arrays, it is faster and better than other PFOR * schemes. - * - * Note that this does not use differential coding: if you are working on - * sorted lists, use IntegratedFastPFOR instead. * - * For multi-threaded applications, each thread should use its own FastPFOR object. - * + * Note that this does not use differential coding: if you are working on sorted + * lists, use IntegratedFastPFOR instead. + * + * For multi-threaded applications, each thread should use its own FastPFOR + * object. + * * @author Daniel Lemire */ public final class FastPFOR implements IntegerCODEC { - final static int BLOCK_SIZE = 128; - final static int OVERHEAD_OF_EACH_EXCEPT = 8; - final static int DEFAULT_PAGE_SIZE = 65536; - - int pageSize; - final int[][] dataTobePacked = new int[33][]; - final ByteBuffer byteContainer; + final static int BLOCK_SIZE = 128; + final static int OVERHEAD_OF_EACH_EXCEPT = 8; + final static int DEFAULT_PAGE_SIZE = 65536; - // Working area for compress and uncompress. - int[] dataPointers; - int[] freqs; - byte[] bestbbestcexceptmaxb; + int pageSize; + final int[][] dataTobePacked = new int[33][]; + final ByteBuffer byteContainer; - /** - * Construct the FastPFOR CODEC. - * @param pagesize the desired page size (for expert use) - */ - public FastPFOR(int pagesize) { - pageSize = pagesize; - // Initiate arrrays. - byteContainer = ByteBuffer.allocateDirect(3 * pageSize / BLOCK_SIZE - + pageSize); - for (int k = 1; k < dataTobePacked.length; ++k) - dataTobePacked[k] = new int[pageSize / 32 * 4]; // heuristic - } + // Working area for compress and uncompress. + int[] dataPointers; + int[] freqs; + byte[] bestbbestcexceptmaxb; - /** - * Construct the fastPFOR CODEC with default parameters. - */ - public FastPFOR() { - this(DEFAULT_PAGE_SIZE); - } + /** + * Construct the FastPFOR CODEC. + * + * @param pagesize + * the desired page size (for expert use) + */ + public FastPFOR(int pagesize) { + pageSize = pagesize; + // Initiate arrrays. + byteContainer = ByteBuffer.allocateDirect(3 * pageSize + / BLOCK_SIZE + pageSize); + for (int k = 1; k < dataTobePacked.length; ++k) + dataTobePacked[k] = new int[pageSize / 32 * 4]; // heuristic + } - /** - * Compress data in blocks of 128 integers (if fewer than 128 integers are - * provided, nothing is done). - * - * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) - */ - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - inlength = Util.floorBy(inlength, 128); - if (inlength == 0) return; + /** + * Construct the fastPFOR CODEC with default parameters. + */ + public FastPFOR() { + this(DEFAULT_PAGE_SIZE); + } - out[outpos.get()] = inlength; - outpos.increment(); + /** + * Compress data in blocks of 128 integers (if fewer than 128 integers + * are provided, nothing is done). + * + * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) + */ + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + inlength = Util.floorBy(inlength, 128); + if (inlength == 0) + return; - // Allocate memory for working area. - dataPointers = new int[33]; - freqs = new int[33]; - bestbbestcexceptmaxb = new byte[3]; + out[outpos.get()] = inlength; + outpos.increment(); - final int finalinpos = inpos.get() + inlength; - while (inpos.get() != finalinpos) { - int thissize = Math.min(pageSize, finalinpos - inpos.get()); - encodePage(in, inpos, thissize, out, outpos); - } + // Allocate memory for working area. + dataPointers = new int[33]; + freqs = new int[33]; + bestbbestcexceptmaxb = new byte[3]; - dataPointers = null; - freqs = null; - bestbbestcexceptmaxb = null; - } + final int finalinpos = inpos.get() + inlength; + while (inpos.get() != finalinpos) { + int thissize = Math.min(pageSize, + finalinpos - inpos.get()); + encodePage(in, inpos, thissize, out, outpos); + } - private void getBestBFromData(int[] in, int pos) { - Arrays.fill(freqs, 0); - for (int k = pos, k_end = pos + BLOCK_SIZE; k < k_end; ++k) { - freqs[Util.bits(in[k])]++; + dataPointers = null; + freqs = null; + bestbbestcexceptmaxb = null; } - bestbbestcexceptmaxb[0] = 32; - while (freqs[bestbbestcexceptmaxb[0]] == 0) - bestbbestcexceptmaxb[0]--; - bestbbestcexceptmaxb[2] = bestbbestcexceptmaxb[0]; - int bestcost = bestbbestcexceptmaxb[0] * BLOCK_SIZE; - byte cexcept = 0; - bestbbestcexceptmaxb[1] = cexcept; - for (int b = bestbbestcexceptmaxb[0] - 1; b >= 0; --b) { - cexcept += freqs[b + 1]; - if (cexcept < 0) - break; - // the extra 8 is the cost of storing maxbits - int thiscost = cexcept * OVERHEAD_OF_EACH_EXCEPT + cexcept - * (bestbbestcexceptmaxb[2] - b) + b * BLOCK_SIZE + 8; - if (thiscost < bestcost) { - bestcost = thiscost; - bestbbestcexceptmaxb[0] = (byte) b; + + private void getBestBFromData(int[] in, int pos) { + Arrays.fill(freqs, 0); + for (int k = pos, k_end = pos + BLOCK_SIZE; k < k_end; ++k) { + freqs[Util.bits(in[k])]++; + } + bestbbestcexceptmaxb[0] = 32; + while (freqs[bestbbestcexceptmaxb[0]] == 0) + bestbbestcexceptmaxb[0]--; + bestbbestcexceptmaxb[2] = bestbbestcexceptmaxb[0]; + int bestcost = bestbbestcexceptmaxb[0] * BLOCK_SIZE; + byte cexcept = 0; bestbbestcexceptmaxb[1] = cexcept; - } + for (int b = bestbbestcexceptmaxb[0] - 1; b >= 0; --b) { + cexcept += freqs[b + 1]; + if (cexcept < 0) + break; + // the extra 8 is the cost of storing maxbits + int thiscost = cexcept * OVERHEAD_OF_EACH_EXCEPT + + cexcept * (bestbbestcexceptmaxb[2] - b) + b + * BLOCK_SIZE + 8; + if (thiscost < bestcost) { + bestcost = thiscost; + bestbbestcexceptmaxb[0] = (byte) b; + bestbbestcexceptmaxb[1] = cexcept; + } + } } - } - private void encodePage(int[] in, IntWrapper inpos, int thissize, - int[] out, IntWrapper outpos) { - final int headerpos = outpos.get(); - outpos.increment(); - int tmpoutpos = outpos.get(); + private void encodePage(int[] in, IntWrapper inpos, int thissize, + int[] out, IntWrapper outpos) { + final int headerpos = outpos.get(); + outpos.increment(); + int tmpoutpos = outpos.get(); - // Clear working area. - Arrays.fill(dataPointers, 0); - //Arrays.fill(bestbbestcexceptmaxb, (byte)0);//DL:unncessary - byteContainer.clear(); + // Clear working area. + Arrays.fill(dataPointers, 0); + // Arrays.fill(bestbbestcexceptmaxb, (byte)0);//DL:unncessary + byteContainer.clear(); - int tmpinpos = inpos.get(); - for (final int finalinpos = tmpinpos + thissize - BLOCK_SIZE; tmpinpos <= finalinpos; tmpinpos += BLOCK_SIZE) { - getBestBFromData(in, tmpinpos); - final int tmpbestb = bestbbestcexceptmaxb[0]; - byteContainer.put(bestbbestcexceptmaxb[0]); - byteContainer.put(bestbbestcexceptmaxb[1]); - if (bestbbestcexceptmaxb[1] > 0) { - byteContainer.put(bestbbestcexceptmaxb[2]); - final int index = bestbbestcexceptmaxb[2] - - bestbbestcexceptmaxb[0]; - if (dataPointers[index] + bestbbestcexceptmaxb[1] >= dataTobePacked[index].length) { - int newsize = 2 * (dataPointers[index] + bestbbestcexceptmaxb[1]); - // make sure it is a multiple of 32 - newsize = Util.floorBy(newsize + 31, 32); - dataTobePacked[index] = Arrays.copyOf( - dataTobePacked[index], newsize); + int tmpinpos = inpos.get(); + for (final int finalinpos = tmpinpos + thissize - BLOCK_SIZE; tmpinpos <= finalinpos; tmpinpos += BLOCK_SIZE) { + getBestBFromData(in, tmpinpos); + final int tmpbestb = bestbbestcexceptmaxb[0]; + byteContainer.put(bestbbestcexceptmaxb[0]); + byteContainer.put(bestbbestcexceptmaxb[1]); + if (bestbbestcexceptmaxb[1] > 0) { + byteContainer.put(bestbbestcexceptmaxb[2]); + final int index = bestbbestcexceptmaxb[2] + - bestbbestcexceptmaxb[0]; + if (dataPointers[index] + + bestbbestcexceptmaxb[1] >= dataTobePacked[index].length) { + int newsize = 2 * (dataPointers[index] + bestbbestcexceptmaxb[1]); + // make sure it is a multiple of 32 + newsize = Util + .floorBy(newsize + 31, 32); + dataTobePacked[index] = Arrays.copyOf( + dataTobePacked[index], newsize); + } + for (int k = 0; k < BLOCK_SIZE; ++k) { + if ((in[k + tmpinpos] >>> bestbbestcexceptmaxb[0]) != 0) { + // we have an exception + byteContainer.put((byte) k); + dataTobePacked[index][dataPointers[index]++] = in[k + + tmpinpos] >>> tmpbestb; + } + } + + } + for (int k = 0; k < 128; k += 32) { + BitPacking.fastpack(in, tmpinpos + k, out, + tmpoutpos, tmpbestb); + tmpoutpos += tmpbestb; + } } - for (int k = 0; k < BLOCK_SIZE; ++k) { - if ((in[k + tmpinpos] >>> bestbbestcexceptmaxb[0]) != 0) { - // we have an exception - byteContainer.put((byte) k); - dataTobePacked[index][dataPointers[index]++] = in[k - + tmpinpos] >>> tmpbestb; - } + inpos.set(tmpinpos); + out[headerpos] = tmpoutpos - headerpos; + while ((byteContainer.position() & 3) != 0) + byteContainer.put((byte) 0); + final int bytesize = byteContainer.position(); + out[tmpoutpos++] = bytesize; + final int howmanyints = bytesize / 4; + byteContainer.flip(); + byteContainer.asIntBuffer().get(out, tmpoutpos, howmanyints); + tmpoutpos += howmanyints; + int bitmap = 0; + for (int k = 1; k <= 32; ++k) { + if (dataPointers[k] != 0) + bitmap |= (1 << (k - 1)); } - - } - for (int k = 0; k < 128; k += 32) { - BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, tmpbestb); - tmpoutpos += tmpbestb; - } - } - inpos.set(tmpinpos); - out[headerpos] = tmpoutpos - headerpos; - while ((byteContainer.position() & 3) != 0) - byteContainer.put((byte) 0); - final int bytesize = byteContainer.position(); - out[tmpoutpos++] = bytesize; - final int howmanyints = bytesize / 4; - byteContainer.flip(); - byteContainer.asIntBuffer().get(out, tmpoutpos, howmanyints); - tmpoutpos += howmanyints; - int bitmap = 0; - for (int k = 1; k <= 32; ++k) { - if (dataPointers[k] != 0) - bitmap |= (1 << (k - 1)); - } - out[tmpoutpos++] = bitmap; - for (int k = 1; k <= 31; ++k) { - if (dataPointers[k] != 0) { - out[tmpoutpos++] = dataPointers[k];// size - for (int j = 0; j < dataPointers[k]; j += 32) { - BitPacking.fastpack(dataTobePacked[k], j, out, tmpoutpos, k); - tmpoutpos += k; + out[tmpoutpos++] = bitmap; + for (int k = 1; k <= 31; ++k) { + if (dataPointers[k] != 0) { + out[tmpoutpos++] = dataPointers[k];// size + for (int j = 0; j < dataPointers[k]; j += 32) { + BitPacking.fastpack(dataTobePacked[k], + j, out, tmpoutpos, k); + tmpoutpos += k; + } + } } - } + outpos.set(tmpoutpos); } - outpos.set(tmpoutpos); - } - /** - * Uncompress data in blocks of 128 integers. In this - * particular case, the inlength parameter is ignored: - * it is deduced from the compressed data. - * - * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) - */ - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - if (inlength == 0) return; + /** + * Uncompress data in blocks of 128 integers. In this particular case, + * the inlength parameter is ignored: it is deduced from the compressed + * data. + * + * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) + */ + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + if (inlength == 0) + return; - int mynvalue = in[inpos.get()]; - inpos.increment(); + int mynvalue = in[inpos.get()]; + inpos.increment(); - dataPointers = new int[33]; + dataPointers = new int[33]; - int finalout = outpos.get() + mynvalue; - while (outpos.get() != finalout) { - int thissize = Math.min(pageSize, finalout - outpos.get()); - decodePage(in, inpos, out, outpos, thissize); - } + int finalout = outpos.get() + mynvalue; + while (outpos.get() != finalout) { + int thissize = Math.min(pageSize, + finalout - outpos.get()); + decodePage(in, inpos, out, outpos, thissize); + } - dataPointers = null; - } + dataPointers = null; + } - private void decodePage(int[] in, IntWrapper inpos, int[] out, - IntWrapper outpos, int thissize) { - final int initpos = inpos.get(); - final int wheremeta = in[inpos.get()]; - inpos.increment(); - int inexcept = initpos + wheremeta; - final int bytesize = in[inexcept++]; - byteContainer.clear(); - byteContainer.asIntBuffer().put(in, inexcept, bytesize / 4); - inexcept += bytesize / 4; + private void decodePage(int[] in, IntWrapper inpos, int[] out, + IntWrapper outpos, int thissize) { + final int initpos = inpos.get(); + final int wheremeta = in[inpos.get()]; + inpos.increment(); + int inexcept = initpos + wheremeta; + final int bytesize = in[inexcept++]; + byteContainer.clear(); + byteContainer.asIntBuffer().put(in, inexcept, bytesize / 4); + inexcept += bytesize / 4; - final int bitmap = in[inexcept++]; - for (int k = 1; k <= 31; ++k) { - if ((bitmap & (1 << (k - 1))) != 0) { - int size = in[inexcept++]; - if (dataTobePacked[k].length < size) - dataTobePacked[k] = new int[Util.floorBy(size + 31, 32)]; - for (int j = 0; j < size; j += 32) { - BitPacking - .fastunpack(in, inexcept, dataTobePacked[k], j, k); - inexcept += k; + final int bitmap = in[inexcept++]; + for (int k = 1; k <= 31; ++k) { + if ((bitmap & (1 << (k - 1))) != 0) { + int size = in[inexcept++]; + if (dataTobePacked[k].length < size) + dataTobePacked[k] = new int[Util + .floorBy(size + 31, 32)]; + for (int j = 0; j < size; j += 32) { + BitPacking.fastunpack(in, inexcept, + dataTobePacked[k], j, k); + inexcept += k; + } + } } - } - } - Arrays.fill(dataPointers, 0); - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); + Arrays.fill(dataPointers, 0); + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); - for (int run = 0, run_end = thissize / BLOCK_SIZE; run < run_end; ++run, tmpoutpos += BLOCK_SIZE) { - final byte b = byteContainer.get(); - final byte cexcept = byteContainer.get(); - for (int k = 0; k < 128; k += 32) { - BitPacking.fastunpack(in, tmpinpos, out, tmpoutpos + k, b); - tmpinpos += b; - } - if (cexcept > 0) { - final byte maxbits = byteContainer.get(); - final int index = maxbits - b; - for (int k = 0; k < cexcept; ++k) { - final byte pos = byteContainer.get(); - final int exceptvalue = dataTobePacked[index][dataPointers[index]++]; - out[pos + tmpoutpos] |= exceptvalue << b; - } + for (int run = 0, run_end = thissize / BLOCK_SIZE; run < run_end; ++run, tmpoutpos += BLOCK_SIZE) { + final byte b = byteContainer.get(); + final byte cexcept = byteContainer.get(); + for (int k = 0; k < 128; k += 32) { + BitPacking.fastunpack(in, tmpinpos, out, + tmpoutpos + k, b); + tmpinpos += b; + } + if (cexcept > 0) { + final byte maxbits = byteContainer.get(); + final int index = maxbits - b; + for (int k = 0; k < cexcept; ++k) { + final byte pos = byteContainer.get(); + final int exceptvalue = dataTobePacked[index][dataPointers[index]++]; + out[pos + tmpoutpos] |= exceptvalue << b; + } - } + } + } + outpos.set(tmpoutpos); + inpos.set(inexcept); } - outpos.set(tmpoutpos); - inpos.set(inexcept); - } - @Override - public String toString() { - return this.getClass().getSimpleName(); - } + @Override + public String toString() { + return this.getClass().getSimpleName(); + } } diff --git a/src/main/java/me/lemire/integercompression/IntWrapper.java b/src/main/java/me/lemire/integercompression/IntWrapper.java index d875eb4..94968eb 100644 --- a/src/main/java/me/lemire/integercompression/IntWrapper.java +++ b/src/main/java/me/lemire/integercompression/IntWrapper.java @@ -12,76 +12,79 @@ * @author dwu */ public final class IntWrapper extends Number { - private static final long serialVersionUID = 1L; - private int value; + private static final long serialVersionUID = 1L; + private int value; - /** - * Constructor: value set to 0. - */ - public IntWrapper() { - this(0); - } + /** + * Constructor: value set to 0. + */ + public IntWrapper() { + this(0); + } - /** - * Construction: value set to provided argument. - * - * @param v value to wrap - */ - public IntWrapper(final int v) { - this.value = v; - } + /** + * Construction: value set to provided argument. + * + * @param v + * value to wrap + */ + public IntWrapper(final int v) { + this.value = v; + } - /** - * @param v - */ - public void add(int v) { - this.value += v; - } + /** + * @param v + */ + public void add(int v) { + this.value += v; + } - @Override - public double doubleValue() { - return this.value; - } + @Override + public double doubleValue() { + return this.value; + } - @Override - public float floatValue() { - return this.value; - } + @Override + public float floatValue() { + return this.value; + } - /** - * @return the integer value - */ - public int get() { - return this.value; - } + /** + * @return the integer value + */ + public int get() { + return this.value; + } - /** - * add 1 to the integer value - */ - public void increment() { - this.value++; - } + /** + * add 1 to the integer value + */ + public void increment() { + this.value++; + } - @Override - public int intValue() { - return this.value; - } + @Override + public int intValue() { + return this.value; + } - @Override - public long longValue() { - return this.value; - } + @Override + public long longValue() { + return this.value; + } - /** - * Set the value to that of the specified integer. - * @param value specified integer value - */ - public void set(final int value) { - this.value = value; - } + /** + * Set the value to that of the specified integer. + * + * @param value + * specified integer value + */ + public void set(final int value) { + this.value = value; + } - @Override - public String toString() { - return Integer.toString(this.value); - } + @Override + public String toString() { + return Integer.toString(this.value); + } } diff --git a/src/main/java/me/lemire/integercompression/IntegerCODEC.java b/src/main/java/me/lemire/integercompression/IntegerCODEC.java index 9a27f4a..7929e48 100644 --- a/src/main/java/me/lemire/integercompression/IntegerCODEC.java +++ b/src/main/java/me/lemire/integercompression/IntegerCODEC.java @@ -7,43 +7,54 @@ package me.lemire.integercompression; - /** * Interface describing a standard CODEC to compress integers. * * @author Daniel Lemire - * + * */ public interface IntegerCODEC { - /** - * Compress data from an array to another array. - * - * Both inpos and outpos are modified to represent how much - * data was read and written to - * if 12 ints (inlength = 12) are compressed to 3 ints, then - * inpos will be incremented by 12 while outpos will be - * incremented by 3 - * we use IntWrapper to pass the values by reference. - * @param in input array - * @param inpos location in the input array - * @param inlength how many integers to compress - * @param out output array - * @param outpos where to write in the output array - */ - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos); - - /** - * Uncompress data from an array to another array. - * - * Both inpos and outpos parameters are modified to indicate new positions after read/write. - * - * @param in array containing data in compressed form - * @param inpos where to start reading in the array - * @param inlength length of the compressed data (ignored by some schemes) - * @param out array where to write the compressed output - * @param outpos where to write the compressed output in out - */ - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos); + /** + * Compress data from an array to another array. + * + * Both inpos and outpos are modified to represent how much data was + * read and written to if 12 ints (inlength = 12) are compressed to 3 + * ints, then inpos will be incremented by 12 while outpos will be + * incremented by 3 we use IntWrapper to pass the values by reference. + * + * @param in + * input array + * @param inpos + * location in the input array + * @param inlength + * how many integers to compress + * @param out + * output array + * @param outpos + * where to write in the output array + */ + public void compress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos); + /** + * Uncompress data from an array to another array. + * + * Both inpos and outpos parameters are modified to indicate new + * positions after read/write. + * + * @param in + * array containing data in compressed form + * @param inpos + * where to start reading in the array + * @param inlength + * length of the compressed data (ignored by some + * schemes) + * @param out + * array where to write the compressed output + * @param outpos + * where to write the compressed output in out + */ + public void uncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos); } diff --git a/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java b/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java index 4903fac..d19bf53 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java @@ -10,78 +10,94 @@ /** * Scheme designed by D. Lemire based on a commonly used idea. * - * You should only use this scheme on sorted arrays. Use BinaryPacking - * if you have unsorted arrays. - * + * You should only use this scheme on sorted arrays. Use BinaryPacking if you + * have unsorted arrays. + * * @author Daniel Lemire - * + * */ public class IntegratedBinaryPacking implements IntegratedIntegerCODEC { - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = inlength / 128 * 128; - if(inlength == 0) return; - out[outpos.get()] = inlength; - outpos.increment(); - int tmpoutpos = outpos.get(); - int initoffset = 0; - for (int s = inpos.get(); s < inpos.get() + inlength; s += 32 * 4) { - final int mbits1 = Util.maxdiffbits(initoffset, in, s, 32); - int initoffset2 = in[s + 31]; - final int mbits2 = Util.maxdiffbits(initoffset2, in, s + 32, 32); - int initoffset3 = in[s + 32 + 31]; - final int mbits3 = Util.maxdiffbits(initoffset3, in, s + 2 * 32, 32); - int initoffset4 = in[s + 2 * 32 + 31]; - final int mbits4 = Util.maxdiffbits(initoffset4, in, s + 3 * 32, 32); - out[tmpoutpos++] = (mbits1 << 24) | (mbits2 << 16) | (mbits3 << 8) - | (mbits4); - IntegratedBitPacking.integratedpack(initoffset, in, s, out, tmpoutpos, mbits1); - tmpoutpos += mbits1; - IntegratedBitPacking.integratedpack(initoffset2, in, s + 32, out, tmpoutpos, mbits2); - tmpoutpos += mbits2; - IntegratedBitPacking.integratedpack(initoffset3, in, s + 2 * 32, out, tmpoutpos, mbits3); - tmpoutpos += mbits3; - IntegratedBitPacking.integratedpack(initoffset4, in, s + 3 * 32, out, tmpoutpos, mbits4); - tmpoutpos += mbits4; - initoffset = in[s + 3 * 32 + 31]; + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + inlength = inlength / 128 * 128; + if (inlength == 0) + return; + out[outpos.get()] = inlength; + outpos.increment(); + int tmpoutpos = outpos.get(); + int initoffset = 0; + for (int s = inpos.get(); s < inpos.get() + inlength; s += 32 * 4) { + final int mbits1 = Util.maxdiffbits(initoffset, in, s, + 32); + int initoffset2 = in[s + 31]; + final int mbits2 = Util.maxdiffbits(initoffset2, in, + s + 32, 32); + int initoffset3 = in[s + 32 + 31]; + final int mbits3 = Util.maxdiffbits(initoffset3, in, + s + 2 * 32, 32); + int initoffset4 = in[s + 2 * 32 + 31]; + final int mbits4 = Util.maxdiffbits(initoffset4, in, + s + 3 * 32, 32); + out[tmpoutpos++] = (mbits1 << 24) | (mbits2 << 16) + | (mbits3 << 8) | (mbits4); + IntegratedBitPacking.integratedpack(initoffset, in, s, + out, tmpoutpos, mbits1); + tmpoutpos += mbits1; + IntegratedBitPacking.integratedpack(initoffset2, in, + s + 32, out, tmpoutpos, mbits2); + tmpoutpos += mbits2; + IntegratedBitPacking.integratedpack(initoffset3, in, + s + 2 * 32, out, tmpoutpos, mbits3); + tmpoutpos += mbits3; + IntegratedBitPacking.integratedpack(initoffset4, in, + s + 3 * 32, out, tmpoutpos, mbits4); + tmpoutpos += mbits4; + initoffset = in[s + 3 * 32 + 31]; + } + inpos.add(inlength); + outpos.set(tmpoutpos); } - inpos.add(inlength); - outpos.set(tmpoutpos); - } - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - if(inlength == 0) return; - final int outlength = in[inpos.get()]; - inpos.increment(); - int tmpinpos = inpos.get(); - int initoffset = 0; - for (int s = outpos.get(); s < outpos.get() + outlength; s += 32 * 4) { - final int mbits1 = (in[tmpinpos] >>> 24); - final int mbits2 = (in[tmpinpos] >>> 16) & 0xFF; - final int mbits3 = (in[tmpinpos] >>> 8) & 0xFF; - final int mbits4 = (in[tmpinpos]) & 0xFF; - ++tmpinpos; - IntegratedBitPacking.integratedunpack(initoffset, in, tmpinpos, out, s, mbits1); - tmpinpos += mbits1; - initoffset = out[s + 31]; - IntegratedBitPacking.integratedunpack(initoffset, in, tmpinpos, out, s + 32, mbits2); - tmpinpos += mbits2; - initoffset = out[s + 32 + 31]; - IntegratedBitPacking.integratedunpack(initoffset, in, tmpinpos, out, s + 2 * 32, mbits3); - tmpinpos += mbits3; - initoffset = out[s + 2 * 32 + 31]; - IntegratedBitPacking.integratedunpack(initoffset, in, tmpinpos, out, s + 3 * 32, mbits4); - tmpinpos += mbits4; - initoffset = out[s + 3 * 32 + 31]; + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + if (inlength == 0) + return; + final int outlength = in[inpos.get()]; + inpos.increment(); + int tmpinpos = inpos.get(); + int initoffset = 0; + for (int s = outpos.get(); s < outpos.get() + outlength; s += 32 * 4) { + final int mbits1 = (in[tmpinpos] >>> 24); + final int mbits2 = (in[tmpinpos] >>> 16) & 0xFF; + final int mbits3 = (in[tmpinpos] >>> 8) & 0xFF; + final int mbits4 = (in[tmpinpos]) & 0xFF; + ++tmpinpos; + IntegratedBitPacking.integratedunpack(initoffset, in, + tmpinpos, out, s, mbits1); + tmpinpos += mbits1; + initoffset = out[s + 31]; + IntegratedBitPacking.integratedunpack(initoffset, in, + tmpinpos, out, s + 32, mbits2); + tmpinpos += mbits2; + initoffset = out[s + 32 + 31]; + IntegratedBitPacking.integratedunpack(initoffset, in, + tmpinpos, out, s + 2 * 32, mbits3); + tmpinpos += mbits3; + initoffset = out[s + 2 * 32 + 31]; + IntegratedBitPacking.integratedunpack(initoffset, in, + tmpinpos, out, s + 3 * 32, mbits4); + tmpinpos += mbits4; + initoffset = out[s + 3 * 32 + 31]; + } + outpos.add(outlength); + inpos.set(tmpinpos); } - outpos.add(outlength); - inpos.set(tmpinpos); - } - @Override - public String toString() { - return this.getClass().getSimpleName(); - } + @Override + public String toString() { + return this.getClass().getSimpleName(); + } } diff --git a/src/main/java/me/lemire/integercompression/IntegratedBitPacking.java b/src/main/java/me/lemire/integercompression/IntegratedBitPacking.java index 7da8936..5dd2335 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedBitPacking.java +++ b/src/main/java/me/lemire/integercompression/IntegratedBitPacking.java @@ -10,4801 +10,3897 @@ import java.util.Arrays; /** - * "Integrated" bit packing routines: they include - * both the bit packing and the differential coding. + * "Integrated" bit packing routines: they include both the bit packing and the + * differential coding. * * @author Daniel Lemire - * + * */ public final class IntegratedBitPacking { + protected static void integratedpack1(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 1) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 2) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 3) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 4) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 5) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 6) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 7) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 9) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 10) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 11) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 12) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 13) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 14) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 15) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 17) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 18) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 19) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 20) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 21) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 22) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 23) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 24) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 25) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 26) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 27) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 28) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 29) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 30) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 31); + } - protected static void integratedpack1(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 1) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 2) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 3) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 4) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 5) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 6) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 7) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 9) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 10) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 11) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 12) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 13) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 14) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 15) - | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 17) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 18) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 19) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 20) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 21) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 22) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 23) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 24) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 25) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 26) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 27) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 28) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 29) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 30) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 31) - ; - } - - - protected static void integratedpack2(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 2) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 4) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 6) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 8) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 10) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 12) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 14) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 16) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 18) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 20) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 22) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 24) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 26) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 28) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 30) - ; - out[1 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 2) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 4) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 6) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 8) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 10) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 12) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 14) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 16) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 18) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 20) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 22) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 24) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 26) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 28) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 30) - ; - } - - - protected static void integratedpack3(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 3) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 6) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 9) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 12) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 15) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 18) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 21) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 24) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 27) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 30) - ; - out[1 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (3 - 1) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 1) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 4) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 7) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 10) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 13) - | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 19) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 22) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 25) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 28) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 31) - ; - out[2 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (3 - 2) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 2) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 5) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 11) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 14) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 17) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 20) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 23) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 26) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 29) - ; - } - - - protected static void integratedpack4(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 4) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 8) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 12) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 16) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 20) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 24) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 28) - ; - out[1 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 4) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 8) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 12) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 16) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 20) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 24) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 28) - ; - out[2 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 4) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 8) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 12) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 16) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 20) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 24) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 28) - ; - out[3 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 4) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 8) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 12) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 16) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 20) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 24) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 28) - ; - } - - - protected static void integratedpack5(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 5) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 10) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 15) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 20) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 25) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 30) - ; - out[1 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (5 - 3) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 3) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 13) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 18) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 23) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 28) - ; - out[2 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (5 - 1) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 1) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 6) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 11) - | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 21) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 26) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 31) - ; - out[3 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (5 - 4) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 4) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 9) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 14) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 19) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 24) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 29) - ; - out[4 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (5 - 2) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 2) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 7) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 12) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 17) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 22) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 27) - ; - } - - - protected static void integratedpack6(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 6) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 12) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 18) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 24) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 30) - ; - out[1 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (6 - 4) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 4) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 10) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 16) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 22) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 28) - ; - out[2 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (6 - 2) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 2) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 8) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 14) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 20) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 26) - ; - out[3 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 6) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 12) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 18) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 24) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 30) - ; - out[4 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (6 - 4) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 4) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 10) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 16) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 22) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 28) - ; - out[5 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (6 - 2) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 2) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 8) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 14) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 20) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 26) - ; - } - - - protected static void integratedpack7(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 7) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 14) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 21) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 28) - ; - out[1 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (7 - 3) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 3) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 10) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 17) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 24) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 31) - ; - out[2 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (7 - 6) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 6) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 13) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 20) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 27) - ; - out[3 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (7 - 2) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 2) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 9) - | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 23) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 30) - ; - out[4 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (7 - 5) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 5) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 12) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 19) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 26) - ; - out[5 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (7 - 1) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 1) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 15) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 22) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 29) - ; - out[6 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (7 - 4) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 4) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 11) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 18) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 25) - ; - } - - - protected static void integratedpack8(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 8) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 16) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 24) - ; - out[1 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 8) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 16) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 24) - ; - out[2 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 8) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 16) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 24) - ; - out[3 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 8) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 16) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 24) - ; - out[4 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 8) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 16) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 24) - ; - out[5 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 8) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 16) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 24) - ; - out[6 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 8) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 16) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 24) - ; - out[7 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 8) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 16) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 24) - ; - } - - - protected static void integratedpack9(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 9) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 18) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 27) - ; - out[1 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (9 - 4) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 4) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 13) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 22) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 31) - ; - out[2 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (9 - 8) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 17) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 26) - ; - out[3 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (9 - 3) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 3) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 12) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 21) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 30) - ; - out[4 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (9 - 7) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 7) - | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 25) - ; - out[5 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (9 - 2) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 2) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 11) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 20) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 29) - ; - out[6 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (9 - 6) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 6) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 15) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 24) - ; - out[7 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (9 - 1) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 1) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 10) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 19) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 28) - ; - out[8 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (9 - 5) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 5) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 14) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 23) - ; - } - - - protected static void integratedpack10(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 10) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 20) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 30) - ; - out[1 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (10 - 8) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 8) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 18) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 28) - ; - out[2 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (10 - 6) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 6) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 16) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 26) - ; - out[3 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (10 - 4) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 4) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 14) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 24) - ; - out[4 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (10 - 2) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 2) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 12) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 22) - ; - out[5 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 10) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 20) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 30) - ; - out[6 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (10 - 8) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 8) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 18) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 28) - ; - out[7 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (10 - 6) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 6) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 16) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 26) - ; - out[8 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (10 - 4) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 4) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 14) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 24) - ; - out[9 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (10 - 2) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 2) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 12) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 22) - ; - } - - - protected static void integratedpack11(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 11) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 22) - ; - out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (11 - 1) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 1) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 12) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 23) - ; - out[2 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (11 - 2) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 2) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 13) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 24) - ; - out[3 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (11 - 3) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 3) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 14) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 25) - ; - out[4 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (11 - 4) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 4) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 15) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 26) - ; - out[5 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (11 - 5) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 5) - | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 27) - ; - out[6 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (11 - 6) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 6) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 17) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 28) - ; - out[7 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (11 - 7) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 7) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 18) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 29) - ; - out[8 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (11 - 8) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 19) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 30) - ; - out[9 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (11 - 9) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 9) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 20) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 31) - ; - out[10 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (11 - 10) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 10) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 21) - ; - } - - - protected static void integratedpack12(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 12) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 24) - ; - out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (12 - 4) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 4) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 16) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 28) - ; - out[2 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (12 - 8) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 8) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 20) - ; - out[3 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 12) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 24) - ; - out[4 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (12 - 4) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 4) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 16) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 28) - ; - out[5 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (12 - 8) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 8) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 20) - ; - out[6 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 12) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 24) - ; - out[7 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (12 - 4) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 4) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 16) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 28) - ; - out[8 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (12 - 8) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 8) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 20) - ; - out[9 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 12) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 24) - ; - out[10 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (12 - 4) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 4) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 16) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 28) - ; - out[11 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (12 - 8) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 8) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 20) - ; - } - - - protected static void integratedpack13(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 13) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 26) - ; - out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (13 - 7) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 7) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 20) - ; - out[2 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (13 - 1) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 1) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 14) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 27) - ; - out[3 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (13 - 8) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 21) - ; - out[4 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (13 - 2) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 2) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 15) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 28) - ; - out[5 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (13 - 9) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 9) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 22) - ; - out[6 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (13 - 3) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 3) - | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 29) - ; - out[7 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (13 - 10) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 10) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 23) - ; - out[8 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (13 - 4) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 4) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 17) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 30) - ; - out[9 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (13 - 11) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 11) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 24) - ; - out[10 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (13 - 5) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 5) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 18) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 31) - ; - out[11 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (13 - 12) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 12) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 25) - ; - out[12 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (13 - 6) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 6) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 19) - ; - } - - - protected static void integratedpack14(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 14) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 28) - ; - out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (14 - 10) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 10) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 24) - ; - out[2 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (14 - 6) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 6) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 20) - ; - out[3 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (14 - 2) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 2) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 16) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 30) - ; - out[4 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (14 - 12) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 12) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 26) - ; - out[5 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (14 - 8) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 8) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 22) - ; - out[6 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (14 - 4) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 4) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 18) - ; - out[7 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 14) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 28) - ; - out[8 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (14 - 10) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 10) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 24) - ; - out[9 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (14 - 6) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 6) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 20) - ; - out[10 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (14 - 2) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 2) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 16) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 30) - ; - out[11 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (14 - 12) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 12) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 26) - ; - out[12 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (14 - 8) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 8) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 22) - ; - out[13 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (14 - 4) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 4) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 18) - ; - } - - - protected static void integratedpack15(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 15) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 30) - ; - out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (15 - 13) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 13) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 28) - ; - out[2 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (15 - 11) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 11) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 26) - ; - out[3 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (15 - 9) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 9) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 24) - ; - out[4 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (15 - 7) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 7) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 22) - ; - out[5 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (15 - 5) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 5) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 20) - ; - out[6 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (15 - 3) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 3) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 18) - ; - out[7 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (15 - 1) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 1) - | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 31) - ; - out[8 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (15 - 14) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 14) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 29) - ; - out[9 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (15 - 12) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 12) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 27) - ; - out[10 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (15 - 10) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 10) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 25) - ; - out[11 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (15 - 8) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 23) - ; - out[12 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (15 - 6) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 6) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 21) - ; - out[13 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (15 - 4) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 4) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 19) - ; - out[14 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (15 - 2) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 2) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 17) - ; - } - - - protected static void integratedpack16(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 16) - ; - out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 16) - ; - out[2 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 16) - ; - out[3 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 16) - ; - out[4 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 16) - ; - out[5 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 16) - ; - out[6 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 16) - ; - out[7 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 16) - ; - out[8 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 16) - ; - out[9 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 16) - ; - out[10 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 16) - ; - out[11 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 16) - ; - out[12 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 16) - ; - out[13 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 16) - ; - out[14 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 16) - ; - out[15 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 16) - ; - } - - - protected static void integratedpack17(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 17) - ; - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (17 - 2) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 2) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 19) - ; - out[2 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (17 - 4) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 4) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 21) - ; - out[3 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (17 - 6) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 6) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 23) - ; - out[4 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (17 - 8) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 25) - ; - out[5 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (17 - 10) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 10) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 27) - ; - out[6 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (17 - 12) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 12) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 29) - ; - out[7 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (17 - 14) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 14) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 31) - ; - out[8 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (17 - 16) - | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) - ; - out[9 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (17 - 1) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 1) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 18) - ; - out[10 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (17 - 3) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 3) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 20) - ; - out[11 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (17 - 5) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 5) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 22) - ; - out[12 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (17 - 7) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 7) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 24) - ; - out[13 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (17 - 9) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 9) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 26) - ; - out[14 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (17 - 11) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 11) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 28) - ; - out[15 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (17 - 13) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 13) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 30) - ; - out[16 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (17 - 15) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 15) - ; - } - - - protected static void integratedpack18(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 18) - ; - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (18 - 4) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 4) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 22) - ; - out[2 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (18 - 8) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 8) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 26) - ; - out[3 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (18 - 12) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 12) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 30) - ; - out[4 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (18 - 16) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 16) - ; - out[5 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (18 - 2) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 2) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 20) - ; - out[6 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (18 - 6) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 6) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 24) - ; - out[7 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (18 - 10) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 10) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 28) - ; - out[8 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (18 - 14) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 14) - ; - out[9 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 18) - ; - out[10 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (18 - 4) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 4) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 22) - ; - out[11 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (18 - 8) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 8) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 26) - ; - out[12 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (18 - 12) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 12) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 30) - ; - out[13 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (18 - 16) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 16) - ; - out[14 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (18 - 2) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 2) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 20) - ; - out[15 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (18 - 6) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 6) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 24) - ; - out[16 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (18 - 10) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 10) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 28) - ; - out[17 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (18 - 14) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 14) - ; - } - - - protected static void integratedpack19(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 19) - ; - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (19 - 6) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 6) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 25) - ; - out[2 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (19 - 12) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 12) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 31) - ; - out[3 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (19 - 18) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 18) - ; - out[4 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (19 - 5) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 5) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 24) - ; - out[5 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (19 - 11) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 11) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 30) - ; - out[6 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (19 - 17) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 17) - ; - out[7 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (19 - 4) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 4) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 23) - ; - out[8 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (19 - 10) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 10) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 29) - ; - out[9 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (19 - 16) - | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) - ; - out[10 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (19 - 3) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 3) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 22) - ; - out[11 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (19 - 9) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 9) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 28) - ; - out[12 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (19 - 15) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 15) - ; - out[13 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (19 - 2) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 2) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 21) - ; - out[14 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (19 - 8) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 27) - ; - out[15 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (19 - 14) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 14) - ; - out[16 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (19 - 1) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 1) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 20) - ; - out[17 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (19 - 7) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 7) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 26) - ; - out[18 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (19 - 13) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 13) - ; - } - - - protected static void integratedpack20(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 20) - ; - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (20 - 8) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 8) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 28) - ; - out[2 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (20 - 16) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 16) - ; - out[3 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (20 - 4) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 4) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 24) - ; - out[4 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (20 - 12) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 12) - ; - out[5 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 20) - ; - out[6 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (20 - 8) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 8) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 28) - ; - out[7 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (20 - 16) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 16) - ; - out[8 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (20 - 4) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 4) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 24) - ; - out[9 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (20 - 12) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 12) - ; - out[10 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 20) - ; - out[11 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (20 - 8) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 8) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 28) - ; - out[12 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (20 - 16) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 16) - ; - out[13 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (20 - 4) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 4) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 24) - ; - out[14 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (20 - 12) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 12) - ; - out[15 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 20) - ; - out[16 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (20 - 8) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 8) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 28) - ; - out[17 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (20 - 16) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 16) - ; - out[18 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (20 - 4) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 4) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 24) - ; - out[19 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (20 - 12) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 12) - ; - } - - - protected static void integratedpack21(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 21) - ; - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (21 - 10) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 10) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 31) - ; - out[2 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (21 - 20) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 20) - ; - out[3 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (21 - 9) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 9) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 30) - ; - out[4 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (21 - 19) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 19) - ; - out[5 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (21 - 8) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 29) - ; - out[6 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (21 - 18) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 18) - ; - out[7 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (21 - 7) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 7) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 28) - ; - out[8 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (21 - 17) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 17) - ; - out[9 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (21 - 6) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 6) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 27) - ; - out[10 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (21 - 16) - | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) - ; - out[11 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (21 - 5) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 5) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 26) - ; - out[12 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (21 - 15) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 15) - ; - out[13 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (21 - 4) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 4) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 25) - ; - out[14 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (21 - 14) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 14) - ; - out[15 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (21 - 3) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 3) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 24) - ; - out[16 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (21 - 13) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 13) - ; - out[17 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (21 - 2) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 2) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 23) - ; - out[18 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (21 - 12) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 12) - ; - out[19 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (21 - 1) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 1) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 22) - ; - out[20 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (21 - 11) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 11) - ; - } - - - protected static void integratedpack22(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 22) - ; - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (22 - 12) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 12) - ; - out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (22 - 2) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 2) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 24) - ; - out[3 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (22 - 14) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 14) - ; - out[4 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (22 - 4) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 4) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 26) - ; - out[5 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (22 - 16) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 16) - ; - out[6 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (22 - 6) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 6) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 28) - ; - out[7 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (22 - 18) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 18) - ; - out[8 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (22 - 8) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 8) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 30) - ; - out[9 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (22 - 20) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 20) - ; - out[10 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (22 - 10) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 10) - ; - out[11 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 22) - ; - out[12 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (22 - 12) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 12) - ; - out[13 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (22 - 2) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 2) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 24) - ; - out[14 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (22 - 14) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 14) - ; - out[15 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (22 - 4) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 4) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 26) - ; - out[16 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (22 - 16) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 16) - ; - out[17 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (22 - 6) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 6) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 28) - ; - out[18 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (22 - 18) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 18) - ; - out[19 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (22 - 8) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 8) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 30) - ; - out[20 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (22 - 20) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 20) - ; - out[21 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (22 - 10) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 10) - ; - } - - - protected static void integratedpack23(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 23) - ; - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (23 - 14) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 14) - ; - out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (23 - 5) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 5) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 28) - ; - out[3 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (23 - 19) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 19) - ; - out[4 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (23 - 10) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 10) - ; - out[5 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (23 - 1) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 1) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 24) - ; - out[6 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (23 - 15) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 15) - ; - out[7 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (23 - 6) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 6) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 29) - ; - out[8 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (23 - 20) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 20) - ; - out[9 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (23 - 11) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 11) - ; - out[10 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (23 - 2) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 2) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 25) - ; - out[11 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (23 - 16) - | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) - ; - out[12 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (23 - 7) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 7) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 30) - ; - out[13 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (23 - 21) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 21) - ; - out[14 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (23 - 12) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 12) - ; - out[15 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (23 - 3) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 3) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 26) - ; - out[16 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (23 - 17) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 17) - ; - out[17 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (23 - 8) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 31) - ; - out[18 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (23 - 22) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 22) - ; - out[19 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (23 - 13) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 13) - ; - out[20 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (23 - 4) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 4) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 27) - ; - out[21 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (23 - 18) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 18) - ; - out[22 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (23 - 9) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 9) - ; - } - - - protected static void integratedpack24(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 24) - ; - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (24 - 16) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 16) - ; - out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (24 - 8) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 8) - ; - out[3 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 24) - ; - out[4 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (24 - 16) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 16) - ; - out[5 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (24 - 8) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 8) - ; - out[6 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 24) - ; - out[7 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (24 - 16) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 16) - ; - out[8 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (24 - 8) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 8) - ; - out[9 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 24) - ; - out[10 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (24 - 16) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 16) - ; - out[11 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (24 - 8) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 8) - ; - out[12 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 24) - ; - out[13 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (24 - 16) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 16) - ; - out[14 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (24 - 8) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 8) - ; - out[15 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 24) - ; - out[16 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (24 - 16) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 16) - ; - out[17 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (24 - 8) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 8) - ; - out[18 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 24) - ; - out[19 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (24 - 16) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 16) - ; - out[20 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (24 - 8) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 8) - ; - out[21 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 24) - ; - out[22 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (24 - 16) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 16) - ; - out[23 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (24 - 8) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 8) - ; - } - - - protected static void integratedpack25(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 25) - ; - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (25 - 18) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 18) - ; - out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (25 - 11) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 11) - ; - out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (25 - 4) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 4) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 29) - ; - out[4 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (25 - 22) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 22) - ; - out[5 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (25 - 15) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 15) - ; - out[6 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (25 - 8) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) - ; - out[7 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (25 - 1) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 1) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 26) - ; - out[8 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (25 - 19) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 19) - ; - out[9 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (25 - 12) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 12) - ; - out[10 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (25 - 5) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 5) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 30) - ; - out[11 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (25 - 23) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 23) - ; - out[12 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (25 - 16) - | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) - ; - out[13 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (25 - 9) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 9) - ; - out[14 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (25 - 2) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 2) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 27) - ; - out[15 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (25 - 20) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 20) - ; - out[16 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (25 - 13) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 13) - ; - out[17 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (25 - 6) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 6) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 31) - ; - out[18 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (25 - 24) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 24) - ; - out[19 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (25 - 17) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 17) - ; - out[20 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (25 - 10) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 10) - ; - out[21 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (25 - 3) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 3) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 28) - ; - out[22 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (25 - 21) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 21) - ; - out[23 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (25 - 14) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 14) - ; - out[24 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (25 - 7) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 7) - ; - } - - - protected static void integratedpack26(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 26) - ; - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (26 - 20) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 20) - ; - out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (26 - 14) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 14) - ; - out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (26 - 8) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 8) - ; - out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (26 - 2) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 2) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 28) - ; - out[5 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (26 - 22) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 22) - ; - out[6 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (26 - 16) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 16) - ; - out[7 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (26 - 10) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 10) - ; - out[8 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (26 - 4) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 4) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 30) - ; - out[9 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (26 - 24) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 24) - ; - out[10 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (26 - 18) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 18) - ; - out[11 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (26 - 12) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 12) - ; - out[12 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (26 - 6) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 6) - ; - out[13 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 26) - ; - out[14 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (26 - 20) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 20) - ; - out[15 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (26 - 14) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 14) - ; - out[16 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (26 - 8) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 8) - ; - out[17 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (26 - 2) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 2) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 28) - ; - out[18 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (26 - 22) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 22) - ; - out[19 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (26 - 16) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 16) - ; - out[20 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (26 - 10) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 10) - ; - out[21 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (26 - 4) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 4) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 30) - ; - out[22 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (26 - 24) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 24) - ; - out[23 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (26 - 18) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 18) - ; - out[24 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (26 - 12) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 12) - ; - out[25 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (26 - 6) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 6) - ; - } - - - protected static void integratedpack27(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 27) - ; - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (27 - 22) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 22) - ; - out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (27 - 17) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 17) - ; - out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (27 - 12) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 12) - ; - out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (27 - 7) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 7) - ; - out[5 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (27 - 2) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 2) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 29) - ; - out[6 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (27 - 24) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 24) - ; - out[7 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (27 - 19) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 19) - ; - out[8 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (27 - 14) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 14) - ; - out[9 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (27 - 9) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 9) - ; - out[10 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (27 - 4) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 4) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 31) - ; - out[11 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (27 - 26) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 26) - ; - out[12 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (27 - 21) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 21) - ; - out[13 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (27 - 16) - | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) - ; - out[14 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (27 - 11) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 11) - ; - out[15 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (27 - 6) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 6) - ; - out[16 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (27 - 1) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 1) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 28) - ; - out[17 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (27 - 23) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 23) - ; - out[18 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (27 - 18) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 18) - ; - out[19 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (27 - 13) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 13) - ; - out[20 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (27 - 8) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) - ; - out[21 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (27 - 3) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 3) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 30) - ; - out[22 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (27 - 25) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 25) - ; - out[23 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (27 - 20) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 20) - ; - out[24 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (27 - 15) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 15) - ; - out[25 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (27 - 10) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 10) - ; - out[26 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (27 - 5) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 5) - ; - } - - - protected static void integratedpack28(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 28) - ; - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (28 - 24) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 24) - ; - out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (28 - 20) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 20) - ; - out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (28 - 16) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 16) - ; - out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (28 - 12) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 12) - ; - out[5 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (28 - 8) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 8) - ; - out[6 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (28 - 4) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 4) - ; - out[7 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 28) - ; - out[8 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (28 - 24) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 24) - ; - out[9 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (28 - 20) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 20) - ; - out[10 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (28 - 16) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 16) - ; - out[11 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (28 - 12) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 12) - ; - out[12 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (28 - 8) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 8) - ; - out[13 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (28 - 4) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 4) - ; - out[14 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 28) - ; - out[15 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (28 - 24) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 24) - ; - out[16 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (28 - 20) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 20) - ; - out[17 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (28 - 16) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 16) - ; - out[18 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (28 - 12) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 12) - ; - out[19 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (28 - 8) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 8) - ; - out[20 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (28 - 4) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 4) - ; - out[21 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 28) - ; - out[22 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (28 - 24) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 24) - ; - out[23 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (28 - 20) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 20) - ; - out[24 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (28 - 16) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 16) - ; - out[25 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (28 - 12) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 12) - ; - out[26 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (28 - 8) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 8) - ; - out[27 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (28 - 4) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 4) - ; - } - - - protected static void integratedpack29(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 29) - ; - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (29 - 26) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 26) - ; - out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (29 - 23) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 23) - ; - out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (29 - 20) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 20) - ; - out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (29 - 17) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 17) - ; - out[5 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (29 - 14) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 14) - ; - out[6 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (29 - 11) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 11) - ; - out[7 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (29 - 8) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) - ; - out[8 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (29 - 5) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 5) - ; - out[9 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (29 - 2) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 2) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 31) - ; - out[10 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (29 - 28) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 28) - ; - out[11 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (29 - 25) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 25) - ; - out[12 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (29 - 22) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 22) - ; - out[13 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (29 - 19) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 19) - ; - out[14 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (29 - 16) - | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) - ; - out[15 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (29 - 13) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 13) - ; - out[16 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (29 - 10) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 10) - ; - out[17 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (29 - 7) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 7) - ; - out[18 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (29 - 4) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 4) - ; - out[19 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (29 - 1) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 1) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 30) - ; - out[20 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (29 - 27) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 27) - ; - out[21 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (29 - 24) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 24) - ; - out[22 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (29 - 21) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 21) - ; - out[23 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (29 - 18) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 18) - ; - out[24 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (29 - 15) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 15) - ; - out[25 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (29 - 12) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 12) - ; - out[26 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (29 - 9) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 9) - ; - out[27 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (29 - 6) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 6) - ; - out[28 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (29 - 3) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 3) - ; - } - - - protected static void integratedpack30(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 30) - ; - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (30 - 28) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 28) - ; - out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (30 - 26) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 26) - ; - out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (30 - 24) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 24) - ; - out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (30 - 22) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 22) - ; - out[5 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (30 - 20) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 20) - ; - out[6 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (30 - 18) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 18) - ; - out[7 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (30 - 16) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 16) - ; - out[8 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (30 - 14) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 14) - ; - out[9 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (30 - 12) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 12) - ; - out[10 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (30 - 10) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 10) - ; - out[11 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (30 - 8) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 8) - ; - out[12 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (30 - 6) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 6) - ; - out[13 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (30 - 4) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 4) - ; - out[14 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (30 - 2) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 2) - ; - out[15 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 30) - ; - out[16 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (30 - 28) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 28) - ; - out[17 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (30 - 26) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 26) - ; - out[18 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (30 - 24) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 24) - ; - out[19 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (30 - 22) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 22) - ; - out[20 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (30 - 20) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 20) - ; - out[21 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (30 - 18) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 18) - ; - out[22 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (30 - 16) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 16) - ; - out[23 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (30 - 14) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 14) - ; - out[24 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (30 - 12) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 12) - ; - out[25 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (30 - 10) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 10) - ; - out[26 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (30 - 8) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 8) - ; - out[27 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (30 - 6) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 6) - ; - out[28 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (30 - 4) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 4) - ; - out[29 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (30 - 2) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 2) - ; - } - - - protected static void integratedpack31(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 31) - ; - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (31 - 30) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 30) - ; - out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (31 - 29) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 29) - ; - out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (31 - 28) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 28) - ; - out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (31 - 27) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 27) - ; - out[5 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (31 - 26) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 26) - ; - out[6 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (31 - 25) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 25) - ; - out[7 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (31 - 24) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 24) - ; - out[8 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (31 - 23) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 23) - ; - out[9 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (31 - 22) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 22) - ; - out[10 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (31 - 21) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 21) - ; - out[11 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (31 - 20) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 20) - ; - out[12 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (31 - 19) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 19) - ; - out[13 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (31 - 18) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 18) - ; - out[14 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (31 - 17) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 17) - ; - out[15 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (31 - 16) - | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) - ; - out[16 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (31 - 15) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 15) - ; - out[17 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (31 - 14) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 14) - ; - out[18 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (31 - 13) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 13) - ; - out[19 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (31 - 12) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 12) - ; - out[20 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (31 - 11) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 11) - ; - out[21 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (31 - 10) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 10) - ; - out[22 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (31 - 9) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 9) - ; - out[23 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (31 - 8) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) - ; - out[24 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (31 - 7) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 7) - ; - out[25 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (31 - 6) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 6) - ; - out[26 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (31 - 5) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 5) - ; - out[27 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (31 - 4) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 4) - ; - out[28 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (31 - 3) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 3) - ; - out[29 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (31 - 2) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 2) - ; - out[30 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (31 - 1) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 1) - ; - } - - - protected static void integratedunpack1(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 1) - ) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 1) & 1) - ) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[0 + inpos] >>> 2) & 1) - ) + out[2 + outpos - 1]; - out[3 + outpos] = (((in[0 + inpos] >>> 3) & 1) - ) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[0 + inpos] >>> 4) & 1) - ) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[0 + inpos] >>> 5) & 1) - ) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[0 + inpos] >>> 6) & 1) - ) + out[6 + outpos - 1]; - out[7 + outpos] = (((in[0 + inpos] >>> 7) & 1) - ) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[0 + inpos] >>> 8) & 1) - ) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[0 + inpos] >>> 9) & 1) - ) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[0 + inpos] >>> 10) & 1) - ) + out[10 + outpos - 1]; - out[11 + outpos] = (((in[0 + inpos] >>> 11) & 1) - ) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[0 + inpos] >>> 12) & 1) - ) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[0 + inpos] >>> 13) & 1) - ) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[0 + inpos] >>> 14) & 1) - ) + out[14 + outpos - 1]; - out[15 + outpos] = (((in[0 + inpos] >>> 15) & 1) - ) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[0 + inpos] >>> 16) & 1) - ) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[0 + inpos] >>> 17) & 1) - ) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[0 + inpos] >>> 18) & 1) - ) + out[18 + outpos - 1]; - out[19 + outpos] = (((in[0 + inpos] >>> 19) & 1) - ) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[0 + inpos] >>> 20) & 1) - ) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[0 + inpos] >>> 21) & 1) - ) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[0 + inpos] >>> 22) & 1) - ) + out[22 + outpos - 1]; - out[23 + outpos] = (((in[0 + inpos] >>> 23) & 1) - ) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[0 + inpos] >>> 24) & 1) - ) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[0 + inpos] >>> 25) & 1) - ) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[0 + inpos] >>> 26) & 1) - ) + out[26 + outpos - 1]; - out[27 + outpos] = (((in[0 + inpos] >>> 27) & 1) - ) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[0 + inpos] >>> 28) & 1) - ) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[0 + inpos] >>> 29) & 1) - ) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[0 + inpos] >>> 30) & 1) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[0 + inpos] >>> 31) - ) + out[31 + outpos - 1]; - } - - - protected static void integratedunpack2(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 3) - ) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 2) & 3) - ) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[0 + inpos] >>> 4) & 3) - ) + out[2 + outpos - 1]; - out[3 + outpos] = (((in[0 + inpos] >>> 6) & 3) - ) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[0 + inpos] >>> 8) & 3) - ) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[0 + inpos] >>> 10) & 3) - ) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[0 + inpos] >>> 12) & 3) - ) + out[6 + outpos - 1]; - out[7 + outpos] = (((in[0 + inpos] >>> 14) & 3) - ) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[0 + inpos] >>> 16) & 3) - ) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[0 + inpos] >>> 18) & 3) - ) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[0 + inpos] >>> 20) & 3) - ) + out[10 + outpos - 1]; - out[11 + outpos] = (((in[0 + inpos] >>> 22) & 3) - ) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[0 + inpos] >>> 24) & 3) - ) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[0 + inpos] >>> 26) & 3) - ) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[0 + inpos] >>> 28) & 3) - ) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[0 + inpos] >>> 30) - ) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[1 + inpos] >>> 0) & 3) - ) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[1 + inpos] >>> 2) & 3) - ) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[1 + inpos] >>> 4) & 3) - ) + out[18 + outpos - 1]; - out[19 + outpos] = (((in[1 + inpos] >>> 6) & 3) - ) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[1 + inpos] >>> 8) & 3) - ) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[1 + inpos] >>> 10) & 3) - ) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[1 + inpos] >>> 12) & 3) - ) + out[22 + outpos - 1]; - out[23 + outpos] = (((in[1 + inpos] >>> 14) & 3) - ) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[1 + inpos] >>> 16) & 3) - ) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[1 + inpos] >>> 18) & 3) - ) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[1 + inpos] >>> 20) & 3) - ) + out[26 + outpos - 1]; - out[27 + outpos] = (((in[1 + inpos] >>> 22) & 3) - ) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[1 + inpos] >>> 24) & 3) - ) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[1 + inpos] >>> 26) & 3) - ) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[1 + inpos] >>> 28) & 3) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[1 + inpos] >>> 30) - ) + out[31 + outpos - 1]; - } - - - protected static void integratedunpack3(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 7) - ) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 3) & 7) - ) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[0 + inpos] >>> 6) & 7) - ) + out[2 + outpos - 1]; - out[3 + outpos] = (((in[0 + inpos] >>> 9) & 7) - ) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[0 + inpos] >>> 12) & 7) - ) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[0 + inpos] >>> 15) & 7) - ) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[0 + inpos] >>> 18) & 7) - ) + out[6 + outpos - 1]; - out[7 + outpos] = (((in[0 + inpos] >>> 21) & 7) - ) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[0 + inpos] >>> 24) & 7) - ) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[0 + inpos] >>> 27) & 7) - ) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[0 + inpos] >>> 30) - | ((in[1 + inpos] & 1) << (3 - 1)) - ) + out[10 + outpos - 1]; - out[11 + outpos] = (((in[1 + inpos] >>> 1) & 7) - ) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[1 + inpos] >>> 4) & 7) - ) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[1 + inpos] >>> 7) & 7) - ) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[1 + inpos] >>> 10) & 7) - ) + out[14 + outpos - 1]; - out[15 + outpos] = (((in[1 + inpos] >>> 13) & 7) - ) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[1 + inpos] >>> 16) & 7) - ) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[1 + inpos] >>> 19) & 7) - ) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[1 + inpos] >>> 22) & 7) - ) + out[18 + outpos - 1]; - out[19 + outpos] = (((in[1 + inpos] >>> 25) & 7) - ) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[1 + inpos] >>> 28) & 7) - ) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[1 + inpos] >>> 31) - | ((in[2 + inpos] & 3) << (3 - 2)) - ) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[2 + inpos] >>> 2) & 7) - ) + out[22 + outpos - 1]; - out[23 + outpos] = (((in[2 + inpos] >>> 5) & 7) - ) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[2 + inpos] >>> 8) & 7) - ) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[2 + inpos] >>> 11) & 7) - ) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[2 + inpos] >>> 14) & 7) - ) + out[26 + outpos - 1]; - out[27 + outpos] = (((in[2 + inpos] >>> 17) & 7) - ) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[2 + inpos] >>> 20) & 7) - ) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[2 + inpos] >>> 23) & 7) - ) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[2 + inpos] >>> 26) & 7) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[2 + inpos] >>> 29) - ) + out[31 + outpos - 1]; - } - - - protected static void integratedunpack4(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 15) - ) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 4) & 15) - ) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[0 + inpos] >>> 8) & 15) - ) + out[2 + outpos - 1]; - out[3 + outpos] = (((in[0 + inpos] >>> 12) & 15) - ) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[0 + inpos] >>> 16) & 15) - ) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[0 + inpos] >>> 20) & 15) - ) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[0 + inpos] >>> 24) & 15) - ) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[0 + inpos] >>> 28) - ) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[1 + inpos] >>> 0) & 15) - ) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[1 + inpos] >>> 4) & 15) - ) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[1 + inpos] >>> 8) & 15) - ) + out[10 + outpos - 1]; - out[11 + outpos] = (((in[1 + inpos] >>> 12) & 15) - ) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[1 + inpos] >>> 16) & 15) - ) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[1 + inpos] >>> 20) & 15) - ) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[1 + inpos] >>> 24) & 15) - ) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[1 + inpos] >>> 28) - ) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[2 + inpos] >>> 0) & 15) - ) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[2 + inpos] >>> 4) & 15) - ) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[2 + inpos] >>> 8) & 15) - ) + out[18 + outpos - 1]; - out[19 + outpos] = (((in[2 + inpos] >>> 12) & 15) - ) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[2 + inpos] >>> 16) & 15) - ) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[2 + inpos] >>> 20) & 15) - ) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[2 + inpos] >>> 24) & 15) - ) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[2 + inpos] >>> 28) - ) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[3 + inpos] >>> 0) & 15) - ) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[3 + inpos] >>> 4) & 15) - ) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[3 + inpos] >>> 8) & 15) - ) + out[26 + outpos - 1]; - out[27 + outpos] = (((in[3 + inpos] >>> 12) & 15) - ) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[3 + inpos] >>> 16) & 15) - ) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[3 + inpos] >>> 20) & 15) - ) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[3 + inpos] >>> 24) & 15) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[3 + inpos] >>> 28) - ) + out[31 + outpos - 1]; - } - + protected static void integratedpack2(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 2) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 4) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 6) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 8) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 10) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 12) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 14) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 16) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 18) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 20) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 22) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 24) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 26) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 28) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 30); + out[1 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 2) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 4) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 6) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 8) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 10) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 12) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 14) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 16) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 18) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 20) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 22) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 24) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 26) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 28) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 30); + } - protected static void integratedunpack5(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 31) - ) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 5) & 31) - ) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[0 + inpos] >>> 10) & 31) - ) + out[2 + outpos - 1]; - out[3 + outpos] = (((in[0 + inpos] >>> 15) & 31) - ) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[0 + inpos] >>> 20) & 31) - ) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[0 + inpos] >>> 25) & 31) - ) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[0 + inpos] >>> 30) - | ((in[1 + inpos] & 7) << (5 - 3)) - ) + out[6 + outpos - 1]; - out[7 + outpos] = (((in[1 + inpos] >>> 3) & 31) - ) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[1 + inpos] >>> 8) & 31) - ) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[1 + inpos] >>> 13) & 31) - ) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[1 + inpos] >>> 18) & 31) - ) + out[10 + outpos - 1]; - out[11 + outpos] = (((in[1 + inpos] >>> 23) & 31) - ) + out[11 + outpos - 1]; - out[12 + outpos] = ((in[1 + inpos] >>> 28) - | ((in[2 + inpos] & 1) << (5 - 1)) - ) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[2 + inpos] >>> 1) & 31) - ) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[2 + inpos] >>> 6) & 31) - ) + out[14 + outpos - 1]; - out[15 + outpos] = (((in[2 + inpos] >>> 11) & 31) - ) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[2 + inpos] >>> 16) & 31) - ) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[2 + inpos] >>> 21) & 31) - ) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[2 + inpos] >>> 26) & 31) - ) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[2 + inpos] >>> 31) - | ((in[3 + inpos] & 15) << (5 - 4)) - ) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[3 + inpos] >>> 4) & 31) - ) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[3 + inpos] >>> 9) & 31) - ) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[3 + inpos] >>> 14) & 31) - ) + out[22 + outpos - 1]; - out[23 + outpos] = (((in[3 + inpos] >>> 19) & 31) - ) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[3 + inpos] >>> 24) & 31) - ) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[3 + inpos] >>> 29) - | ((in[4 + inpos] & 3) << (5 - 2)) - ) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[4 + inpos] >>> 2) & 31) - ) + out[26 + outpos - 1]; - out[27 + outpos] = (((in[4 + inpos] >>> 7) & 31) - ) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[4 + inpos] >>> 12) & 31) - ) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[4 + inpos] >>> 17) & 31) - ) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[4 + inpos] >>> 22) & 31) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[4 + inpos] >>> 27) - ) + out[31 + outpos - 1]; - } + protected static void integratedpack3(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 3) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 6) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 9) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 12) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 15) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 18) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 21) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 24) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 27) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 30); + out[1 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (3 - 1) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 1) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 4) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 7) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 10) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 13) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 19) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 22) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 25) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 28) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 31); + out[2 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (3 - 2) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 2) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 5) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 11) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 14) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 17) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 20) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 23) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 26) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 29); + } + protected static void integratedpack4(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 4) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 8) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 12) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 16) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 20) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 24) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 28); + out[1 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 4) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 8) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 12) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 16) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 20) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 24) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 28); + out[2 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 4) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 8) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 12) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 16) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 20) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 24) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 28); + out[3 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 4) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 8) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 12) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 16) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 20) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 24) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 28); + } - protected static void integratedunpack6(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 63) - ) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 6) & 63) - ) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[0 + inpos] >>> 12) & 63) - ) + out[2 + outpos - 1]; - out[3 + outpos] = (((in[0 + inpos] >>> 18) & 63) - ) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[0 + inpos] >>> 24) & 63) - ) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[0 + inpos] >>> 30) - | ((in[1 + inpos] & 15) << (6 - 4)) - ) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[1 + inpos] >>> 4) & 63) - ) + out[6 + outpos - 1]; - out[7 + outpos] = (((in[1 + inpos] >>> 10) & 63) - ) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[1 + inpos] >>> 16) & 63) - ) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[1 + inpos] >>> 22) & 63) - ) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[1 + inpos] >>> 28) - | ((in[2 + inpos] & 3) << (6 - 2)) - ) + out[10 + outpos - 1]; - out[11 + outpos] = (((in[2 + inpos] >>> 2) & 63) - ) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[2 + inpos] >>> 8) & 63) - ) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[2 + inpos] >>> 14) & 63) - ) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[2 + inpos] >>> 20) & 63) - ) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[2 + inpos] >>> 26) - ) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[3 + inpos] >>> 0) & 63) - ) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[3 + inpos] >>> 6) & 63) - ) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[3 + inpos] >>> 12) & 63) - ) + out[18 + outpos - 1]; - out[19 + outpos] = (((in[3 + inpos] >>> 18) & 63) - ) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[3 + inpos] >>> 24) & 63) - ) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[3 + inpos] >>> 30) - | ((in[4 + inpos] & 15) << (6 - 4)) - ) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[4 + inpos] >>> 4) & 63) - ) + out[22 + outpos - 1]; - out[23 + outpos] = (((in[4 + inpos] >>> 10) & 63) - ) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[4 + inpos] >>> 16) & 63) - ) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[4 + inpos] >>> 22) & 63) - ) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[4 + inpos] >>> 28) - | ((in[5 + inpos] & 3) << (6 - 2)) - ) + out[26 + outpos - 1]; - out[27 + outpos] = (((in[5 + inpos] >>> 2) & 63) - ) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[5 + inpos] >>> 8) & 63) - ) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[5 + inpos] >>> 14) & 63) - ) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[5 + inpos] >>> 20) & 63) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[5 + inpos] >>> 26) - ) + out[31 + outpos - 1]; - } + protected static void integratedpack5(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 5) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 10) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 15) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 20) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 25) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 30); + out[1 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (5 - 3) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 3) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 13) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 18) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 23) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 28); + out[2 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (5 - 1) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 1) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 6) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 11) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 21) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 26) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 31); + out[3 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (5 - 4) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 4) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 9) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 14) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 19) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 24) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 29); + out[4 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (5 - 2) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 2) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 7) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 12) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 17) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 22) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 27); + } + protected static void integratedpack6(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 6) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 12) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 18) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 24) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 30); + out[1 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (6 - 4) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 4) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 10) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 16) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 22) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 28); + out[2 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (6 - 2) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 2) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 8) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 14) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 20) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 26); + out[3 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 6) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 12) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 18) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 24) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 30); + out[4 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (6 - 4) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 4) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 10) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 16) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 22) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 28); + out[5 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (6 - 2) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 2) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 8) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 14) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 20) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 26); + } - protected static void integratedunpack7(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 127) - ) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 7) & 127) - ) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[0 + inpos] >>> 14) & 127) - ) + out[2 + outpos - 1]; - out[3 + outpos] = (((in[0 + inpos] >>> 21) & 127) - ) + out[3 + outpos - 1]; - out[4 + outpos] = ((in[0 + inpos] >>> 28) - | ((in[1 + inpos] & 7) << (7 - 3)) - ) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[1 + inpos] >>> 3) & 127) - ) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[1 + inpos] >>> 10) & 127) - ) + out[6 + outpos - 1]; - out[7 + outpos] = (((in[1 + inpos] >>> 17) & 127) - ) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[1 + inpos] >>> 24) & 127) - ) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[1 + inpos] >>> 31) - | ((in[2 + inpos] & 63) << (7 - 6)) - ) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[2 + inpos] >>> 6) & 127) - ) + out[10 + outpos - 1]; - out[11 + outpos] = (((in[2 + inpos] >>> 13) & 127) - ) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[2 + inpos] >>> 20) & 127) - ) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[2 + inpos] >>> 27) - | ((in[3 + inpos] & 3) << (7 - 2)) - ) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[3 + inpos] >>> 2) & 127) - ) + out[14 + outpos - 1]; - out[15 + outpos] = (((in[3 + inpos] >>> 9) & 127) - ) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[3 + inpos] >>> 16) & 127) - ) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[3 + inpos] >>> 23) & 127) - ) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[3 + inpos] >>> 30) - | ((in[4 + inpos] & 31) << (7 - 5)) - ) + out[18 + outpos - 1]; - out[19 + outpos] = (((in[4 + inpos] >>> 5) & 127) - ) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[4 + inpos] >>> 12) & 127) - ) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[4 + inpos] >>> 19) & 127) - ) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[4 + inpos] >>> 26) - | ((in[5 + inpos] & 1) << (7 - 1)) - ) + out[22 + outpos - 1]; - out[23 + outpos] = (((in[5 + inpos] >>> 1) & 127) - ) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[5 + inpos] >>> 8) & 127) - ) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[5 + inpos] >>> 15) & 127) - ) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[5 + inpos] >>> 22) & 127) - ) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[5 + inpos] >>> 29) - | ((in[6 + inpos] & 15) << (7 - 4)) - ) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[6 + inpos] >>> 4) & 127) - ) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[6 + inpos] >>> 11) & 127) - ) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[6 + inpos] >>> 18) & 127) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[6 + inpos] >>> 25) - ) + out[31 + outpos - 1]; - } + protected static void integratedpack7(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 7) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 14) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 21) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 28); + out[1 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (7 - 3) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 3) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 10) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 17) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 24) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 31); + out[2 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (7 - 6) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 6) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 13) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 20) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 27); + out[3 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (7 - 2) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 2) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 9) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 23) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 30); + out[4 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (7 - 5) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 5) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 12) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 19) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 26); + out[5 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (7 - 1) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 1) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 15) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 22) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 29); + out[6 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (7 - 4) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 4) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 11) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 18) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 25); + } + protected static void integratedpack8(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 8) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 16) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 24); + out[1 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 8) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 16) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 24); + out[2 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 8) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 16) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 24); + out[3 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 8) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 16) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 24); + out[4 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 8) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 16) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 24); + out[5 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 8) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 16) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 24); + out[6 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 8) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 16) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 24); + out[7 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 8) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 16) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 24); + } - protected static void integratedunpack8(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 255) - ) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 8) & 255) - ) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[0 + inpos] >>> 16) & 255) - ) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[0 + inpos] >>> 24) - ) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[1 + inpos] >>> 0) & 255) - ) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[1 + inpos] >>> 8) & 255) - ) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[1 + inpos] >>> 16) & 255) - ) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[1 + inpos] >>> 24) - ) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[2 + inpos] >>> 0) & 255) - ) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[2 + inpos] >>> 8) & 255) - ) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[2 + inpos] >>> 16) & 255) - ) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[2 + inpos] >>> 24) - ) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[3 + inpos] >>> 0) & 255) - ) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[3 + inpos] >>> 8) & 255) - ) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[3 + inpos] >>> 16) & 255) - ) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[3 + inpos] >>> 24) - ) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[4 + inpos] >>> 0) & 255) - ) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[4 + inpos] >>> 8) & 255) - ) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[4 + inpos] >>> 16) & 255) - ) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[4 + inpos] >>> 24) - ) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[5 + inpos] >>> 0) & 255) - ) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[5 + inpos] >>> 8) & 255) - ) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[5 + inpos] >>> 16) & 255) - ) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[5 + inpos] >>> 24) - ) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[6 + inpos] >>> 0) & 255) - ) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[6 + inpos] >>> 8) & 255) - ) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[6 + inpos] >>> 16) & 255) - ) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[6 + inpos] >>> 24) - ) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[7 + inpos] >>> 0) & 255) - ) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[7 + inpos] >>> 8) & 255) - ) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[7 + inpos] >>> 16) & 255) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[7 + inpos] >>> 24) - ) + out[31 + outpos - 1]; - } + protected static void integratedpack9(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 9) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 18) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 27); + out[1 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (9 - 4) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 4) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 13) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 22) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 31); + out[2 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (9 - 8) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 17) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 26); + out[3 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (9 - 3) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 3) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 12) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 21) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 30); + out[4 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (9 - 7) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 7) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 25); + out[5 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (9 - 2) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 2) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 11) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 20) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 29); + out[6 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (9 - 6) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 6) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 15) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 24); + out[7 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (9 - 1) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 1) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 10) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 19) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 28); + out[8 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (9 - 5) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 5) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 14) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 23); + } + protected static void integratedpack10(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 10) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 20) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 30); + out[1 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (10 - 8) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 8) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 18) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 28); + out[2 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (10 - 6) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 6) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 16) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 26); + out[3 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (10 - 4) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 4) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 14) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 24); + out[4 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (10 - 2) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 2) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 12) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 22); + out[5 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 10) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 20) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 30); + out[6 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (10 - 8) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 8) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 18) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 28); + out[7 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (10 - 6) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 6) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 16) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 26); + out[8 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (10 - 4) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 4) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 14) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 24); + out[9 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (10 - 2) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 2) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 12) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 22); + } - protected static void integratedunpack9(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 511) - ) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 9) & 511) - ) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[0 + inpos] >>> 18) & 511) - ) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[0 + inpos] >>> 27) - | ((in[1 + inpos] & 15) << (9 - 4)) - ) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[1 + inpos] >>> 4) & 511) - ) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[1 + inpos] >>> 13) & 511) - ) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[1 + inpos] >>> 22) & 511) - ) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[1 + inpos] >>> 31) - | ((in[2 + inpos] & 255) << (9 - 8)) - ) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[2 + inpos] >>> 8) & 511) - ) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[2 + inpos] >>> 17) & 511) - ) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[2 + inpos] >>> 26) - | ((in[3 + inpos] & 7) << (9 - 3)) - ) + out[10 + outpos - 1]; - out[11 + outpos] = (((in[3 + inpos] >>> 3) & 511) - ) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[3 + inpos] >>> 12) & 511) - ) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[3 + inpos] >>> 21) & 511) - ) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[3 + inpos] >>> 30) - | ((in[4 + inpos] & 127) << (9 - 7)) - ) + out[14 + outpos - 1]; - out[15 + outpos] = (((in[4 + inpos] >>> 7) & 511) - ) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[4 + inpos] >>> 16) & 511) - ) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[4 + inpos] >>> 25) - | ((in[5 + inpos] & 3) << (9 - 2)) - ) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[5 + inpos] >>> 2) & 511) - ) + out[18 + outpos - 1]; - out[19 + outpos] = (((in[5 + inpos] >>> 11) & 511) - ) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[5 + inpos] >>> 20) & 511) - ) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[5 + inpos] >>> 29) - | ((in[6 + inpos] & 63) << (9 - 6)) - ) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[6 + inpos] >>> 6) & 511) - ) + out[22 + outpos - 1]; - out[23 + outpos] = (((in[6 + inpos] >>> 15) & 511) - ) + out[23 + outpos - 1]; - out[24 + outpos] = ((in[6 + inpos] >>> 24) - | ((in[7 + inpos] & 1) << (9 - 1)) - ) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[7 + inpos] >>> 1) & 511) - ) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[7 + inpos] >>> 10) & 511) - ) + out[26 + outpos - 1]; - out[27 + outpos] = (((in[7 + inpos] >>> 19) & 511) - ) + out[27 + outpos - 1]; - out[28 + outpos] = ((in[7 + inpos] >>> 28) - | ((in[8 + inpos] & 31) << (9 - 5)) - ) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[8 + inpos] >>> 5) & 511) - ) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[8 + inpos] >>> 14) & 511) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[8 + inpos] >>> 23) - ) + out[31 + outpos - 1]; - } + protected static void integratedpack11(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 11) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 22); + out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (11 - 1) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 1) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 12) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 23); + out[2 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (11 - 2) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 2) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 13) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 24); + out[3 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (11 - 3) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 3) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 14) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 25); + out[4 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (11 - 4) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 4) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 15) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 26); + out[5 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (11 - 5) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 5) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 27); + out[6 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (11 - 6) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 6) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 17) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 28); + out[7 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (11 - 7) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 7) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 18) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 29); + out[8 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (11 - 8) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 19) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 30); + out[9 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (11 - 9) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 9) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 20) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 31); + out[10 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (11 - 10) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 10) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 21); + } + protected static void integratedpack12(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 12) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 24); + out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (12 - 4) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 4) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 16) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 28); + out[2 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (12 - 8) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 8) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 20); + out[3 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 12) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 24); + out[4 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (12 - 4) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 4) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 16) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 28); + out[5 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (12 - 8) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 8) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 20); + out[6 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 12) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 24); + out[7 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (12 - 4) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 4) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 16) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 28); + out[8 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (12 - 8) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 8) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 20); + out[9 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 12) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 24); + out[10 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (12 - 4) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 4) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 16) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 28); + out[11 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (12 - 8) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 8) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 20); + } - protected static void integratedunpack10(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 1023) - ) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 10) & 1023) - ) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[0 + inpos] >>> 20) & 1023) - ) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[0 + inpos] >>> 30) - | ((in[1 + inpos] & 255) << (10 - 8)) - ) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[1 + inpos] >>> 8) & 1023) - ) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[1 + inpos] >>> 18) & 1023) - ) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[1 + inpos] >>> 28) - | ((in[2 + inpos] & 63) << (10 - 6)) - ) + out[6 + outpos - 1]; - out[7 + outpos] = (((in[2 + inpos] >>> 6) & 1023) - ) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[2 + inpos] >>> 16) & 1023) - ) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[2 + inpos] >>> 26) - | ((in[3 + inpos] & 15) << (10 - 4)) - ) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[3 + inpos] >>> 4) & 1023) - ) + out[10 + outpos - 1]; - out[11 + outpos] = (((in[3 + inpos] >>> 14) & 1023) - ) + out[11 + outpos - 1]; - out[12 + outpos] = ((in[3 + inpos] >>> 24) - | ((in[4 + inpos] & 3) << (10 - 2)) - ) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[4 + inpos] >>> 2) & 1023) - ) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[4 + inpos] >>> 12) & 1023) - ) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[4 + inpos] >>> 22) - ) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[5 + inpos] >>> 0) & 1023) - ) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[5 + inpos] >>> 10) & 1023) - ) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[5 + inpos] >>> 20) & 1023) - ) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[5 + inpos] >>> 30) - | ((in[6 + inpos] & 255) << (10 - 8)) - ) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[6 + inpos] >>> 8) & 1023) - ) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[6 + inpos] >>> 18) & 1023) - ) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[6 + inpos] >>> 28) - | ((in[7 + inpos] & 63) << (10 - 6)) - ) + out[22 + outpos - 1]; - out[23 + outpos] = (((in[7 + inpos] >>> 6) & 1023) - ) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[7 + inpos] >>> 16) & 1023) - ) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[7 + inpos] >>> 26) - | ((in[8 + inpos] & 15) << (10 - 4)) - ) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[8 + inpos] >>> 4) & 1023) - ) + out[26 + outpos - 1]; - out[27 + outpos] = (((in[8 + inpos] >>> 14) & 1023) - ) + out[27 + outpos - 1]; - out[28 + outpos] = ((in[8 + inpos] >>> 24) - | ((in[9 + inpos] & 3) << (10 - 2)) - ) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[9 + inpos] >>> 2) & 1023) - ) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[9 + inpos] >>> 12) & 1023) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[9 + inpos] >>> 22) - ) + out[31 + outpos - 1]; - } + protected static void integratedpack13(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 13) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 26); + out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (13 - 7) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 7) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 20); + out[2 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (13 - 1) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 1) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 14) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 27); + out[3 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (13 - 8) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 21); + out[4 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (13 - 2) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 2) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 15) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 28); + out[5 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (13 - 9) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 9) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 22); + out[6 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (13 - 3) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 3) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 29); + out[7 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (13 - 10) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 10) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 23); + out[8 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (13 - 4) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 4) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 17) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 30); + out[9 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (13 - 11) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 11) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 24); + out[10 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (13 - 5) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 5) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 18) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 31); + out[11 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (13 - 12) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 12) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 25); + out[12 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (13 - 6) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 6) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 19); + } + protected static void integratedpack14(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 14) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 28); + out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (14 - 10) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 10) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 24); + out[2 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (14 - 6) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 6) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 20); + out[3 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (14 - 2) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 2) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 16) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 30); + out[4 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (14 - 12) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 12) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 26); + out[5 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (14 - 8) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 8) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 22); + out[6 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (14 - 4) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 4) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 18); + out[7 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 14) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 28); + out[8 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (14 - 10) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 10) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 24); + out[9 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (14 - 6) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 6) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 20); + out[10 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (14 - 2) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 2) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 16) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 30); + out[11 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (14 - 12) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 12) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 26); + out[12 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (14 - 8) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 8) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 22); + out[13 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (14 - 4) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 4) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 18); + } - protected static void integratedunpack11(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 2047) - ) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 11) & 2047) - ) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[0 + inpos] >>> 22) - | ((in[1 + inpos] & 1) << (11 - 1)) - ) + out[2 + outpos - 1]; - out[3 + outpos] = (((in[1 + inpos] >>> 1) & 2047) - ) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[1 + inpos] >>> 12) & 2047) - ) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[1 + inpos] >>> 23) - | ((in[2 + inpos] & 3) << (11 - 2)) - ) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[2 + inpos] >>> 2) & 2047) - ) + out[6 + outpos - 1]; - out[7 + outpos] = (((in[2 + inpos] >>> 13) & 2047) - ) + out[7 + outpos - 1]; - out[8 + outpos] = ((in[2 + inpos] >>> 24) - | ((in[3 + inpos] & 7) << (11 - 3)) - ) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[3 + inpos] >>> 3) & 2047) - ) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[3 + inpos] >>> 14) & 2047) - ) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[3 + inpos] >>> 25) - | ((in[4 + inpos] & 15) << (11 - 4)) - ) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[4 + inpos] >>> 4) & 2047) - ) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[4 + inpos] >>> 15) & 2047) - ) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[4 + inpos] >>> 26) - | ((in[5 + inpos] & 31) << (11 - 5)) - ) + out[14 + outpos - 1]; - out[15 + outpos] = (((in[5 + inpos] >>> 5) & 2047) - ) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[5 + inpos] >>> 16) & 2047) - ) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[5 + inpos] >>> 27) - | ((in[6 + inpos] & 63) << (11 - 6)) - ) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[6 + inpos] >>> 6) & 2047) - ) + out[18 + outpos - 1]; - out[19 + outpos] = (((in[6 + inpos] >>> 17) & 2047) - ) + out[19 + outpos - 1]; - out[20 + outpos] = ((in[6 + inpos] >>> 28) - | ((in[7 + inpos] & 127) << (11 - 7)) - ) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[7 + inpos] >>> 7) & 2047) - ) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[7 + inpos] >>> 18) & 2047) - ) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[7 + inpos] >>> 29) - | ((in[8 + inpos] & 255) << (11 - 8)) - ) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[8 + inpos] >>> 8) & 2047) - ) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[8 + inpos] >>> 19) & 2047) - ) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[8 + inpos] >>> 30) - | ((in[9 + inpos] & 511) << (11 - 9)) - ) + out[26 + outpos - 1]; - out[27 + outpos] = (((in[9 + inpos] >>> 9) & 2047) - ) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[9 + inpos] >>> 20) & 2047) - ) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[9 + inpos] >>> 31) - | ((in[10 + inpos] & 1023) << (11 - 10)) - ) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[10 + inpos] >>> 10) & 2047) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[10 + inpos] >>> 21) - ) + out[31 + outpos - 1]; - } + protected static void integratedpack15(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 15) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 30); + out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (15 - 13) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 13) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 28); + out[2 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (15 - 11) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 11) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 26); + out[3 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (15 - 9) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 9) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 24); + out[4 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (15 - 7) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 7) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 22); + out[5 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (15 - 5) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 5) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 20); + out[6 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (15 - 3) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 3) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 18); + out[7 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (15 - 1) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 1) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 31); + out[8 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (15 - 14) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 14) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 29); + out[9 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (15 - 12) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 12) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 27); + out[10 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (15 - 10) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 10) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 25); + out[11 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (15 - 8) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 23); + out[12 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (15 - 6) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 6) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 21); + out[13 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (15 - 4) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 4) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 19); + out[14 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (15 - 2) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 2) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 17); + } + protected static void integratedpack16(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 16); + out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 16); + out[2 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 16); + out[3 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 16); + out[4 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 16); + out[5 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 16); + out[6 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 16); + out[7 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 16); + out[8 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 16); + out[9 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 16); + out[10 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 16); + out[11 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 16); + out[12 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 16); + out[13 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 16); + out[14 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 16); + out[15 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 16); + } - protected static void integratedunpack12(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 4095) - ) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 12) & 4095) - ) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[0 + inpos] >>> 24) - | ((in[1 + inpos] & 15) << (12 - 4)) - ) + out[2 + outpos - 1]; - out[3 + outpos] = (((in[1 + inpos] >>> 4) & 4095) - ) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[1 + inpos] >>> 16) & 4095) - ) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[1 + inpos] >>> 28) - | ((in[2 + inpos] & 255) << (12 - 8)) - ) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[2 + inpos] >>> 8) & 4095) - ) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[2 + inpos] >>> 20) - ) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[3 + inpos] >>> 0) & 4095) - ) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[3 + inpos] >>> 12) & 4095) - ) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[3 + inpos] >>> 24) - | ((in[4 + inpos] & 15) << (12 - 4)) - ) + out[10 + outpos - 1]; - out[11 + outpos] = (((in[4 + inpos] >>> 4) & 4095) - ) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[4 + inpos] >>> 16) & 4095) - ) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[4 + inpos] >>> 28) - | ((in[5 + inpos] & 255) << (12 - 8)) - ) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[5 + inpos] >>> 8) & 4095) - ) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[5 + inpos] >>> 20) - ) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[6 + inpos] >>> 0) & 4095) - ) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[6 + inpos] >>> 12) & 4095) - ) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[6 + inpos] >>> 24) - | ((in[7 + inpos] & 15) << (12 - 4)) - ) + out[18 + outpos - 1]; - out[19 + outpos] = (((in[7 + inpos] >>> 4) & 4095) - ) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[7 + inpos] >>> 16) & 4095) - ) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[7 + inpos] >>> 28) - | ((in[8 + inpos] & 255) << (12 - 8)) - ) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[8 + inpos] >>> 8) & 4095) - ) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[8 + inpos] >>> 20) - ) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[9 + inpos] >>> 0) & 4095) - ) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[9 + inpos] >>> 12) & 4095) - ) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[9 + inpos] >>> 24) - | ((in[10 + inpos] & 15) << (12 - 4)) - ) + out[26 + outpos - 1]; - out[27 + outpos] = (((in[10 + inpos] >>> 4) & 4095) - ) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[10 + inpos] >>> 16) & 4095) - ) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[10 + inpos] >>> 28) - | ((in[11 + inpos] & 255) << (12 - 8)) - ) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[11 + inpos] >>> 8) & 4095) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[11 + inpos] >>> 20) - ) + out[31 + outpos - 1]; - } + protected static void integratedpack17(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 17); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (17 - 2) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 2) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 19); + out[2 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (17 - 4) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 4) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 21); + out[3 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (17 - 6) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 6) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 23); + out[4 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (17 - 8) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 25); + out[5 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (17 - 10) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 10) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 27); + out[6 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (17 - 12) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 12) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 29); + out[7 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (17 - 14) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 14) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 31); + out[8 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (17 - 16) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16); + out[9 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (17 - 1) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 1) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 18); + out[10 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (17 - 3) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 3) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 20); + out[11 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (17 - 5) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 5) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 22); + out[12 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (17 - 7) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 7) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 24); + out[13 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (17 - 9) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 9) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 26); + out[14 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (17 - 11) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 11) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 28); + out[15 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (17 - 13) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 13) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 30); + out[16 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (17 - 15) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 15); + } + protected static void integratedpack18(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 18); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (18 - 4) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 4) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 22); + out[2 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (18 - 8) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 8) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 26); + out[3 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (18 - 12) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 12) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 30); + out[4 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (18 - 16) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 16); + out[5 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (18 - 2) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 2) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 20); + out[6 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (18 - 6) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 6) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 24); + out[7 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (18 - 10) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 10) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 28); + out[8 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (18 - 14) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 14); + out[9 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 18); + out[10 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (18 - 4) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 4) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 22); + out[11 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (18 - 8) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 8) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 26); + out[12 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (18 - 12) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 12) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 30); + out[13 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (18 - 16) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 16); + out[14 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (18 - 2) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 2) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 20); + out[15 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (18 - 6) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 6) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 24); + out[16 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (18 - 10) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 10) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 28); + out[17 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (18 - 14) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 14); + } - protected static void integratedunpack13(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 8191) - ) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 13) & 8191) - ) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[0 + inpos] >>> 26) - | ((in[1 + inpos] & 127) << (13 - 7)) - ) + out[2 + outpos - 1]; - out[3 + outpos] = (((in[1 + inpos] >>> 7) & 8191) - ) + out[3 + outpos - 1]; - out[4 + outpos] = ((in[1 + inpos] >>> 20) - | ((in[2 + inpos] & 1) << (13 - 1)) - ) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[2 + inpos] >>> 1) & 8191) - ) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[2 + inpos] >>> 14) & 8191) - ) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[2 + inpos] >>> 27) - | ((in[3 + inpos] & 255) << (13 - 8)) - ) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[3 + inpos] >>> 8) & 8191) - ) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[3 + inpos] >>> 21) - | ((in[4 + inpos] & 3) << (13 - 2)) - ) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[4 + inpos] >>> 2) & 8191) - ) + out[10 + outpos - 1]; - out[11 + outpos] = (((in[4 + inpos] >>> 15) & 8191) - ) + out[11 + outpos - 1]; - out[12 + outpos] = ((in[4 + inpos] >>> 28) - | ((in[5 + inpos] & 511) << (13 - 9)) - ) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[5 + inpos] >>> 9) & 8191) - ) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[5 + inpos] >>> 22) - | ((in[6 + inpos] & 7) << (13 - 3)) - ) + out[14 + outpos - 1]; - out[15 + outpos] = (((in[6 + inpos] >>> 3) & 8191) - ) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[6 + inpos] >>> 16) & 8191) - ) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[6 + inpos] >>> 29) - | ((in[7 + inpos] & 1023) << (13 - 10)) - ) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[7 + inpos] >>> 10) & 8191) - ) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[7 + inpos] >>> 23) - | ((in[8 + inpos] & 15) << (13 - 4)) - ) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[8 + inpos] >>> 4) & 8191) - ) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[8 + inpos] >>> 17) & 8191) - ) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[8 + inpos] >>> 30) - | ((in[9 + inpos] & 2047) << (13 - 11)) - ) + out[22 + outpos - 1]; - out[23 + outpos] = (((in[9 + inpos] >>> 11) & 8191) - ) + out[23 + outpos - 1]; - out[24 + outpos] = ((in[9 + inpos] >>> 24) - | ((in[10 + inpos] & 31) << (13 - 5)) - ) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[10 + inpos] >>> 5) & 8191) - ) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[10 + inpos] >>> 18) & 8191) - ) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[10 + inpos] >>> 31) - | ((in[11 + inpos] & 4095) << (13 - 12)) - ) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[11 + inpos] >>> 12) & 8191) - ) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[11 + inpos] >>> 25) - | ((in[12 + inpos] & 63) << (13 - 6)) - ) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[12 + inpos] >>> 6) & 8191) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[12 + inpos] >>> 19) - ) + out[31 + outpos - 1]; - } + protected static void integratedpack19(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 19); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (19 - 6) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 6) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 25); + out[2 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (19 - 12) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 12) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 31); + out[3 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (19 - 18) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 18); + out[4 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (19 - 5) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 5) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 24); + out[5 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (19 - 11) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 11) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 30); + out[6 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (19 - 17) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 17); + out[7 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (19 - 4) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 4) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 23); + out[8 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (19 - 10) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 10) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 29); + out[9 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (19 - 16) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16); + out[10 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (19 - 3) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 3) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 22); + out[11 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (19 - 9) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 9) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 28); + out[12 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (19 - 15) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 15); + out[13 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (19 - 2) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 2) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 21); + out[14 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (19 - 8) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 27); + out[15 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (19 - 14) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 14); + out[16 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (19 - 1) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 1) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 20); + out[17 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (19 - 7) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 7) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 26); + out[18 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (19 - 13) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 13); + } + protected static void integratedpack20(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 20); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (20 - 8) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 8) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 28); + out[2 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (20 - 16) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 16); + out[3 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (20 - 4) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 4) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 24); + out[4 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (20 - 12) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 12); + out[5 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 20); + out[6 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (20 - 8) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 8) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 28); + out[7 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (20 - 16) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 16); + out[8 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (20 - 4) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 4) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 24); + out[9 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (20 - 12) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 12); + out[10 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 20); + out[11 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (20 - 8) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 8) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 28); + out[12 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (20 - 16) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 16); + out[13 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (20 - 4) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 4) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 24); + out[14 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (20 - 12) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 12); + out[15 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 20); + out[16 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (20 - 8) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 8) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 28); + out[17 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (20 - 16) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 16); + out[18 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (20 - 4) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 4) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 24); + out[19 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (20 - 12) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 12); + } - protected static void integratedunpack14(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 16383) - ) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 14) & 16383) - ) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[0 + inpos] >>> 28) - | ((in[1 + inpos] & 1023) << (14 - 10)) - ) + out[2 + outpos - 1]; - out[3 + outpos] = (((in[1 + inpos] >>> 10) & 16383) - ) + out[3 + outpos - 1]; - out[4 + outpos] = ((in[1 + inpos] >>> 24) - | ((in[2 + inpos] & 63) << (14 - 6)) - ) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[2 + inpos] >>> 6) & 16383) - ) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[2 + inpos] >>> 20) - | ((in[3 + inpos] & 3) << (14 - 2)) - ) + out[6 + outpos - 1]; - out[7 + outpos] = (((in[3 + inpos] >>> 2) & 16383) - ) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[3 + inpos] >>> 16) & 16383) - ) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[3 + inpos] >>> 30) - | ((in[4 + inpos] & 4095) << (14 - 12)) - ) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[4 + inpos] >>> 12) & 16383) - ) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[4 + inpos] >>> 26) - | ((in[5 + inpos] & 255) << (14 - 8)) - ) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[5 + inpos] >>> 8) & 16383) - ) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[5 + inpos] >>> 22) - | ((in[6 + inpos] & 15) << (14 - 4)) - ) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[6 + inpos] >>> 4) & 16383) - ) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[6 + inpos] >>> 18) - ) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[7 + inpos] >>> 0) & 16383) - ) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[7 + inpos] >>> 14) & 16383) - ) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[7 + inpos] >>> 28) - | ((in[8 + inpos] & 1023) << (14 - 10)) - ) + out[18 + outpos - 1]; - out[19 + outpos] = (((in[8 + inpos] >>> 10) & 16383) - ) + out[19 + outpos - 1]; - out[20 + outpos] = ((in[8 + inpos] >>> 24) - | ((in[9 + inpos] & 63) << (14 - 6)) - ) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[9 + inpos] >>> 6) & 16383) - ) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[9 + inpos] >>> 20) - | ((in[10 + inpos] & 3) << (14 - 2)) - ) + out[22 + outpos - 1]; - out[23 + outpos] = (((in[10 + inpos] >>> 2) & 16383) - ) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[10 + inpos] >>> 16) & 16383) - ) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[10 + inpos] >>> 30) - | ((in[11 + inpos] & 4095) << (14 - 12)) - ) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[11 + inpos] >>> 12) & 16383) - ) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[11 + inpos] >>> 26) - | ((in[12 + inpos] & 255) << (14 - 8)) - ) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[12 + inpos] >>> 8) & 16383) - ) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[12 + inpos] >>> 22) - | ((in[13 + inpos] & 15) << (14 - 4)) - ) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[13 + inpos] >>> 4) & 16383) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[13 + inpos] >>> 18) - ) + out[31 + outpos - 1]; - } + protected static void integratedpack21(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 21); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (21 - 10) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 10) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 31); + out[2 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (21 - 20) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 20); + out[3 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (21 - 9) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 9) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 30); + out[4 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (21 - 19) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 19); + out[5 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (21 - 8) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 29); + out[6 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (21 - 18) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 18); + out[7 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (21 - 7) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 7) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 28); + out[8 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (21 - 17) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 17); + out[9 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (21 - 6) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 6) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 27); + out[10 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (21 - 16) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16); + out[11 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (21 - 5) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 5) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 26); + out[12 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (21 - 15) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 15); + out[13 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (21 - 4) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 4) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 25); + out[14 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (21 - 14) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 14); + out[15 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (21 - 3) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 3) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 24); + out[16 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (21 - 13) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 13); + out[17 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (21 - 2) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 2) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 23); + out[18 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (21 - 12) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 12); + out[19 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (21 - 1) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 1) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 22); + out[20 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (21 - 11) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 11); + } + protected static void integratedpack22(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 22); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (22 - 12) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 12); + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (22 - 2) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 2) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 24); + out[3 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (22 - 14) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 14); + out[4 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (22 - 4) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 4) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 26); + out[5 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (22 - 16) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 16); + out[6 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (22 - 6) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 6) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 28); + out[7 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (22 - 18) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 18); + out[8 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (22 - 8) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 8) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 30); + out[9 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (22 - 20) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 20); + out[10 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (22 - 10) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 10); + out[11 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 22); + out[12 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (22 - 12) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 12); + out[13 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (22 - 2) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 2) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 24); + out[14 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (22 - 14) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 14); + out[15 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (22 - 4) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 4) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 26); + out[16 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (22 - 16) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 16); + out[17 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (22 - 6) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 6) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 28); + out[18 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (22 - 18) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 18); + out[19 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (22 - 8) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 8) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 30); + out[20 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (22 - 20) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 20); + out[21 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (22 - 10) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 10); + } - protected static void integratedunpack15(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 32767) - ) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 15) & 32767) - ) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[0 + inpos] >>> 30) - | ((in[1 + inpos] & 8191) << (15 - 13)) - ) + out[2 + outpos - 1]; - out[3 + outpos] = (((in[1 + inpos] >>> 13) & 32767) - ) + out[3 + outpos - 1]; - out[4 + outpos] = ((in[1 + inpos] >>> 28) - | ((in[2 + inpos] & 2047) << (15 - 11)) - ) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[2 + inpos] >>> 11) & 32767) - ) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[2 + inpos] >>> 26) - | ((in[3 + inpos] & 511) << (15 - 9)) - ) + out[6 + outpos - 1]; - out[7 + outpos] = (((in[3 + inpos] >>> 9) & 32767) - ) + out[7 + outpos - 1]; - out[8 + outpos] = ((in[3 + inpos] >>> 24) - | ((in[4 + inpos] & 127) << (15 - 7)) - ) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[4 + inpos] >>> 7) & 32767) - ) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[4 + inpos] >>> 22) - | ((in[5 + inpos] & 31) << (15 - 5)) - ) + out[10 + outpos - 1]; - out[11 + outpos] = (((in[5 + inpos] >>> 5) & 32767) - ) + out[11 + outpos - 1]; - out[12 + outpos] = ((in[5 + inpos] >>> 20) - | ((in[6 + inpos] & 7) << (15 - 3)) - ) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[6 + inpos] >>> 3) & 32767) - ) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[6 + inpos] >>> 18) - | ((in[7 + inpos] & 1) << (15 - 1)) - ) + out[14 + outpos - 1]; - out[15 + outpos] = (((in[7 + inpos] >>> 1) & 32767) - ) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[7 + inpos] >>> 16) & 32767) - ) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[7 + inpos] >>> 31) - | ((in[8 + inpos] & 16383) << (15 - 14)) - ) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[8 + inpos] >>> 14) & 32767) - ) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[8 + inpos] >>> 29) - | ((in[9 + inpos] & 4095) << (15 - 12)) - ) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[9 + inpos] >>> 12) & 32767) - ) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[9 + inpos] >>> 27) - | ((in[10 + inpos] & 1023) << (15 - 10)) - ) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[10 + inpos] >>> 10) & 32767) - ) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[10 + inpos] >>> 25) - | ((in[11 + inpos] & 255) << (15 - 8)) - ) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[11 + inpos] >>> 8) & 32767) - ) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[11 + inpos] >>> 23) - | ((in[12 + inpos] & 63) << (15 - 6)) - ) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[12 + inpos] >>> 6) & 32767) - ) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[12 + inpos] >>> 21) - | ((in[13 + inpos] & 15) << (15 - 4)) - ) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[13 + inpos] >>> 4) & 32767) - ) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[13 + inpos] >>> 19) - | ((in[14 + inpos] & 3) << (15 - 2)) - ) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[14 + inpos] >>> 2) & 32767) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[14 + inpos] >>> 17) - ) + out[31 + outpos - 1]; - } + protected static void integratedpack23(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 23); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (23 - 14) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 14); + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (23 - 5) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 5) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 28); + out[3 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (23 - 19) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 19); + out[4 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (23 - 10) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 10); + out[5 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (23 - 1) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 1) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 24); + out[6 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (23 - 15) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 15); + out[7 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (23 - 6) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 6) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 29); + out[8 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (23 - 20) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 20); + out[9 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (23 - 11) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 11); + out[10 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (23 - 2) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 2) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 25); + out[11 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (23 - 16) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16); + out[12 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (23 - 7) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 7) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 30); + out[13 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (23 - 21) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 21); + out[14 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (23 - 12) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 12); + out[15 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (23 - 3) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 3) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 26); + out[16 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (23 - 17) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 17); + out[17 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (23 - 8) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 31); + out[18 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (23 - 22) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 22); + out[19 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (23 - 13) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 13); + out[20 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (23 - 4) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 4) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 27); + out[21 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (23 - 18) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 18); + out[22 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (23 - 9) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 9); + } + protected static void integratedpack24(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 24); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (24 - 16) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 16); + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (24 - 8) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 8); + out[3 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 24); + out[4 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (24 - 16) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 16); + out[5 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (24 - 8) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 8); + out[6 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 24); + out[7 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (24 - 16) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 16); + out[8 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (24 - 8) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 8); + out[9 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 24); + out[10 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (24 - 16) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 16); + out[11 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (24 - 8) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 8); + out[12 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 24); + out[13 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (24 - 16) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 16); + out[14 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (24 - 8) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 8); + out[15 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 24); + out[16 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (24 - 16) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 16); + out[17 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (24 - 8) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 8); + out[18 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 24); + out[19 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (24 - 16) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 16); + out[20 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (24 - 8) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 8); + out[21 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 24); + out[22 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (24 - 16) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 16); + out[23 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (24 - 8) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 8); + } - protected static void integratedunpack16(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 65535) - ) + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 16) - ) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[1 + inpos] >>> 0) & 65535) - ) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[1 + inpos] >>> 16) - ) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[2 + inpos] >>> 0) & 65535) - ) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[2 + inpos] >>> 16) - ) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[3 + inpos] >>> 0) & 65535) - ) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[3 + inpos] >>> 16) - ) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[4 + inpos] >>> 0) & 65535) - ) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[4 + inpos] >>> 16) - ) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[5 + inpos] >>> 0) & 65535) - ) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[5 + inpos] >>> 16) - ) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[6 + inpos] >>> 0) & 65535) - ) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[6 + inpos] >>> 16) - ) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[7 + inpos] >>> 0) & 65535) - ) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[7 + inpos] >>> 16) - ) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[8 + inpos] >>> 0) & 65535) - ) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[8 + inpos] >>> 16) - ) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[9 + inpos] >>> 0) & 65535) - ) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[9 + inpos] >>> 16) - ) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[10 + inpos] >>> 0) & 65535) - ) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[10 + inpos] >>> 16) - ) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[11 + inpos] >>> 0) & 65535) - ) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[11 + inpos] >>> 16) - ) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[12 + inpos] >>> 0) & 65535) - ) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[12 + inpos] >>> 16) - ) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[13 + inpos] >>> 0) & 65535) - ) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[13 + inpos] >>> 16) - ) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[14 + inpos] >>> 0) & 65535) - ) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[14 + inpos] >>> 16) - ) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[15 + inpos] >>> 0) & 65535) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[15 + inpos] >>> 16) - ) + out[31 + outpos - 1]; - } + protected static void integratedpack25(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 25); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (25 - 18) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 18); + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (25 - 11) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 11); + out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (25 - 4) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 4) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 29); + out[4 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (25 - 22) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 22); + out[5 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (25 - 15) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 15); + out[6 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (25 - 8) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 8); + out[7 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (25 - 1) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 1) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 26); + out[8 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (25 - 19) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 19); + out[9 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (25 - 12) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 12); + out[10 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (25 - 5) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 5) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 30); + out[11 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (25 - 23) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 23); + out[12 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (25 - 16) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16); + out[13 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (25 - 9) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 9); + out[14 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (25 - 2) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 2) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 27); + out[15 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (25 - 20) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 20); + out[16 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (25 - 13) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 13); + out[17 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (25 - 6) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 6) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 31); + out[18 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (25 - 24) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 24); + out[19 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (25 - 17) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 17); + out[20 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (25 - 10) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 10); + out[21 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (25 - 3) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 3) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 28); + out[22 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (25 - 21) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 21); + out[23 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (25 - 14) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 14); + out[24 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (25 - 7) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 7); + } + protected static void integratedpack26(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 26); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (26 - 20) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 20); + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (26 - 14) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 14); + out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (26 - 8) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 8); + out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (26 - 2) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 2) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 28); + out[5 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (26 - 22) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 22); + out[6 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (26 - 16) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 16); + out[7 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (26 - 10) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 10); + out[8 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (26 - 4) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 4) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 30); + out[9 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (26 - 24) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 24); + out[10 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (26 - 18) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 18); + out[11 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (26 - 12) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 12); + out[12 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (26 - 6) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 6); + out[13 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 26); + out[14 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (26 - 20) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 20); + out[15 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (26 - 14) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 14); + out[16 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (26 - 8) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 8); + out[17 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (26 - 2) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 2) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 28); + out[18 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (26 - 22) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 22); + out[19 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (26 - 16) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 16); + out[20 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (26 - 10) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 10); + out[21 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (26 - 4) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 4) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 30); + out[22 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (26 - 24) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 24); + out[23 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (26 - 18) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 18); + out[24 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (26 - 12) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 12); + out[25 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (26 - 6) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 6); + } - protected static void integratedunpack17(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 131071) - ) + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 17) - | ((in[1 + inpos] & 3) << (17 - 2)) - ) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[1 + inpos] >>> 2) & 131071) - ) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[1 + inpos] >>> 19) - | ((in[2 + inpos] & 15) << (17 - 4)) - ) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[2 + inpos] >>> 4) & 131071) - ) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[2 + inpos] >>> 21) - | ((in[3 + inpos] & 63) << (17 - 6)) - ) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[3 + inpos] >>> 6) & 131071) - ) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[3 + inpos] >>> 23) - | ((in[4 + inpos] & 255) << (17 - 8)) - ) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[4 + inpos] >>> 8) & 131071) - ) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[4 + inpos] >>> 25) - | ((in[5 + inpos] & 1023) << (17 - 10)) - ) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[5 + inpos] >>> 10) & 131071) - ) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[5 + inpos] >>> 27) - | ((in[6 + inpos] & 4095) << (17 - 12)) - ) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[6 + inpos] >>> 12) & 131071) - ) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[6 + inpos] >>> 29) - | ((in[7 + inpos] & 16383) << (17 - 14)) - ) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[7 + inpos] >>> 14) & 131071) - ) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[7 + inpos] >>> 31) - | ((in[8 + inpos] & 65535) << (17 - 16)) - ) + out[15 + outpos - 1]; - out[16 + outpos] = ((in[8 + inpos] >>> 16) - | ((in[9 + inpos] & 1) << (17 - 1)) - ) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[9 + inpos] >>> 1) & 131071) - ) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[9 + inpos] >>> 18) - | ((in[10 + inpos] & 7) << (17 - 3)) - ) + out[18 + outpos - 1]; - out[19 + outpos] = (((in[10 + inpos] >>> 3) & 131071) - ) + out[19 + outpos - 1]; - out[20 + outpos] = ((in[10 + inpos] >>> 20) - | ((in[11 + inpos] & 31) << (17 - 5)) - ) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[11 + inpos] >>> 5) & 131071) - ) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[11 + inpos] >>> 22) - | ((in[12 + inpos] & 127) << (17 - 7)) - ) + out[22 + outpos - 1]; - out[23 + outpos] = (((in[12 + inpos] >>> 7) & 131071) - ) + out[23 + outpos - 1]; - out[24 + outpos] = ((in[12 + inpos] >>> 24) - | ((in[13 + inpos] & 511) << (17 - 9)) - ) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[13 + inpos] >>> 9) & 131071) - ) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[13 + inpos] >>> 26) - | ((in[14 + inpos] & 2047) << (17 - 11)) - ) + out[26 + outpos - 1]; - out[27 + outpos] = (((in[14 + inpos] >>> 11) & 131071) - ) + out[27 + outpos - 1]; - out[28 + outpos] = ((in[14 + inpos] >>> 28) - | ((in[15 + inpos] & 8191) << (17 - 13)) - ) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[15 + inpos] >>> 13) & 131071) - ) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[15 + inpos] >>> 30) - | ((in[16 + inpos] & 32767) << (17 - 15)) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[16 + inpos] >>> 15) - ) + out[31 + outpos - 1]; - } + protected static void integratedpack27(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 27); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (27 - 22) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 22); + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (27 - 17) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 17); + out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (27 - 12) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 12); + out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (27 - 7) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 7); + out[5 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (27 - 2) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 2) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 29); + out[6 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (27 - 24) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 24); + out[7 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (27 - 19) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 19); + out[8 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (27 - 14) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 14); + out[9 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (27 - 9) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 9); + out[10 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (27 - 4) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 4) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 31); + out[11 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (27 - 26) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 26); + out[12 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (27 - 21) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 21); + out[13 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (27 - 16) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16); + out[14 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (27 - 11) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 11); + out[15 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (27 - 6) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 6); + out[16 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (27 - 1) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 1) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 28); + out[17 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (27 - 23) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 23); + out[18 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (27 - 18) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 18); + out[19 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (27 - 13) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 13); + out[20 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (27 - 8) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 8); + out[21 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (27 - 3) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 3) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 30); + out[22 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (27 - 25) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 25); + out[23 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (27 - 20) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 20); + out[24 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (27 - 15) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 15); + out[25 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (27 - 10) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 10); + out[26 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (27 - 5) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 5); + } + protected static void integratedpack28(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 28); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (28 - 24) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 24); + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (28 - 20) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 20); + out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (28 - 16) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 16); + out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (28 - 12) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 12); + out[5 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (28 - 8) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 8); + out[6 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (28 - 4) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 4); + out[7 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 28); + out[8 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (28 - 24) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 24); + out[9 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (28 - 20) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 20); + out[10 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (28 - 16) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 16); + out[11 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (28 - 12) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 12); + out[12 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (28 - 8) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 8); + out[13 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (28 - 4) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 4); + out[14 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 28); + out[15 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (28 - 24) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 24); + out[16 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (28 - 20) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 20); + out[17 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (28 - 16) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 16); + out[18 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (28 - 12) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 12); + out[19 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (28 - 8) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 8); + out[20 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (28 - 4) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 4); + out[21 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 28); + out[22 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (28 - 24) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 24); + out[23 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (28 - 20) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 20); + out[24 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (28 - 16) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 16); + out[25 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (28 - 12) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 12); + out[26 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (28 - 8) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 8); + out[27 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (28 - 4) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 4); + } - protected static void integratedunpack18(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 262143) - ) + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 18) - | ((in[1 + inpos] & 15) << (18 - 4)) - ) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[1 + inpos] >>> 4) & 262143) - ) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[1 + inpos] >>> 22) - | ((in[2 + inpos] & 255) << (18 - 8)) - ) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[2 + inpos] >>> 8) & 262143) - ) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[2 + inpos] >>> 26) - | ((in[3 + inpos] & 4095) << (18 - 12)) - ) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[3 + inpos] >>> 12) & 262143) - ) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[3 + inpos] >>> 30) - | ((in[4 + inpos] & 65535) << (18 - 16)) - ) + out[7 + outpos - 1]; - out[8 + outpos] = ((in[4 + inpos] >>> 16) - | ((in[5 + inpos] & 3) << (18 - 2)) - ) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[5 + inpos] >>> 2) & 262143) - ) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[5 + inpos] >>> 20) - | ((in[6 + inpos] & 63) << (18 - 6)) - ) + out[10 + outpos - 1]; - out[11 + outpos] = (((in[6 + inpos] >>> 6) & 262143) - ) + out[11 + outpos - 1]; - out[12 + outpos] = ((in[6 + inpos] >>> 24) - | ((in[7 + inpos] & 1023) << (18 - 10)) - ) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[7 + inpos] >>> 10) & 262143) - ) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[7 + inpos] >>> 28) - | ((in[8 + inpos] & 16383) << (18 - 14)) - ) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[8 + inpos] >>> 14) - ) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[9 + inpos] >>> 0) & 262143) - ) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[9 + inpos] >>> 18) - | ((in[10 + inpos] & 15) << (18 - 4)) - ) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[10 + inpos] >>> 4) & 262143) - ) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[10 + inpos] >>> 22) - | ((in[11 + inpos] & 255) << (18 - 8)) - ) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[11 + inpos] >>> 8) & 262143) - ) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[11 + inpos] >>> 26) - | ((in[12 + inpos] & 4095) << (18 - 12)) - ) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[12 + inpos] >>> 12) & 262143) - ) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[12 + inpos] >>> 30) - | ((in[13 + inpos] & 65535) << (18 - 16)) - ) + out[23 + outpos - 1]; - out[24 + outpos] = ((in[13 + inpos] >>> 16) - | ((in[14 + inpos] & 3) << (18 - 2)) - ) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[14 + inpos] >>> 2) & 262143) - ) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[14 + inpos] >>> 20) - | ((in[15 + inpos] & 63) << (18 - 6)) - ) + out[26 + outpos - 1]; - out[27 + outpos] = (((in[15 + inpos] >>> 6) & 262143) - ) + out[27 + outpos - 1]; - out[28 + outpos] = ((in[15 + inpos] >>> 24) - | ((in[16 + inpos] & 1023) << (18 - 10)) - ) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[16 + inpos] >>> 10) & 262143) - ) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[16 + inpos] >>> 28) - | ((in[17 + inpos] & 16383) << (18 - 14)) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[17 + inpos] >>> 14) - ) + out[31 + outpos - 1]; - } + protected static void integratedpack29(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 29); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (29 - 26) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 26); + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (29 - 23) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 23); + out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (29 - 20) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 20); + out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (29 - 17) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 17); + out[5 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (29 - 14) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 14); + out[6 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (29 - 11) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 11); + out[7 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (29 - 8) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 8); + out[8 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (29 - 5) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 5); + out[9 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (29 - 2) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 2) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 31); + out[10 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (29 - 28) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 28); + out[11 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (29 - 25) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 25); + out[12 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (29 - 22) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 22); + out[13 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (29 - 19) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 19); + out[14 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (29 - 16) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16); + out[15 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (29 - 13) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 13); + out[16 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (29 - 10) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 10); + out[17 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (29 - 7) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 7); + out[18 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (29 - 4) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 4); + out[19 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (29 - 1) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 1) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 30); + out[20 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (29 - 27) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 27); + out[21 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (29 - 24) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 24); + out[22 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (29 - 21) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 21); + out[23 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (29 - 18) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 18); + out[24 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (29 - 15) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 15); + out[25 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (29 - 12) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 12); + out[26 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (29 - 9) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 9); + out[27 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (29 - 6) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 6); + out[28 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (29 - 3) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 3); + } + protected static void integratedpack30(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 30); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (30 - 28) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 28); + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (30 - 26) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 26); + out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (30 - 24) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 24); + out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (30 - 22) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 22); + out[5 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (30 - 20) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 20); + out[6 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (30 - 18) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 18); + out[7 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (30 - 16) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 16); + out[8 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (30 - 14) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 14); + out[9 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (30 - 12) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 12); + out[10 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (30 - 10) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 10); + out[11 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (30 - 8) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 8); + out[12 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (30 - 6) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 6); + out[13 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (30 - 4) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 4); + out[14 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (30 - 2) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 2); + out[15 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 30); + out[16 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (30 - 28) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 28); + out[17 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (30 - 26) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 26); + out[18 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (30 - 24) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 24); + out[19 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (30 - 22) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 22); + out[20 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (30 - 20) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 20); + out[21 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (30 - 18) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 18); + out[22 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (30 - 16) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 16); + out[23 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (30 - 14) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 14); + out[24 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (30 - 12) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 12); + out[25 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (30 - 10) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 10); + out[26 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (30 - 8) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 8); + out[27 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (30 - 6) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 6); + out[28 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (30 - 4) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 4); + out[29 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (30 - 2) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 2); + } - protected static void integratedunpack19(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 524287) - ) + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 19) - | ((in[1 + inpos] & 63) << (19 - 6)) - ) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[1 + inpos] >>> 6) & 524287) - ) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[1 + inpos] >>> 25) - | ((in[2 + inpos] & 4095) << (19 - 12)) - ) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[2 + inpos] >>> 12) & 524287) - ) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[2 + inpos] >>> 31) - | ((in[3 + inpos] & 262143) << (19 - 18)) - ) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[3 + inpos] >>> 18) - | ((in[4 + inpos] & 31) << (19 - 5)) - ) + out[6 + outpos - 1]; - out[7 + outpos] = (((in[4 + inpos] >>> 5) & 524287) - ) + out[7 + outpos - 1]; - out[8 + outpos] = ((in[4 + inpos] >>> 24) - | ((in[5 + inpos] & 2047) << (19 - 11)) - ) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[5 + inpos] >>> 11) & 524287) - ) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[5 + inpos] >>> 30) - | ((in[6 + inpos] & 131071) << (19 - 17)) - ) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[6 + inpos] >>> 17) - | ((in[7 + inpos] & 15) << (19 - 4)) - ) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[7 + inpos] >>> 4) & 524287) - ) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[7 + inpos] >>> 23) - | ((in[8 + inpos] & 1023) << (19 - 10)) - ) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[8 + inpos] >>> 10) & 524287) - ) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[8 + inpos] >>> 29) - | ((in[9 + inpos] & 65535) << (19 - 16)) - ) + out[15 + outpos - 1]; - out[16 + outpos] = ((in[9 + inpos] >>> 16) - | ((in[10 + inpos] & 7) << (19 - 3)) - ) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[10 + inpos] >>> 3) & 524287) - ) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[10 + inpos] >>> 22) - | ((in[11 + inpos] & 511) << (19 - 9)) - ) + out[18 + outpos - 1]; - out[19 + outpos] = (((in[11 + inpos] >>> 9) & 524287) - ) + out[19 + outpos - 1]; - out[20 + outpos] = ((in[11 + inpos] >>> 28) - | ((in[12 + inpos] & 32767) << (19 - 15)) - ) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[12 + inpos] >>> 15) - | ((in[13 + inpos] & 3) << (19 - 2)) - ) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[13 + inpos] >>> 2) & 524287) - ) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[13 + inpos] >>> 21) - | ((in[14 + inpos] & 255) << (19 - 8)) - ) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[14 + inpos] >>> 8) & 524287) - ) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[14 + inpos] >>> 27) - | ((in[15 + inpos] & 16383) << (19 - 14)) - ) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[15 + inpos] >>> 14) - | ((in[16 + inpos] & 1) << (19 - 1)) - ) + out[26 + outpos - 1]; - out[27 + outpos] = (((in[16 + inpos] >>> 1) & 524287) - ) + out[27 + outpos - 1]; - out[28 + outpos] = ((in[16 + inpos] >>> 20) - | ((in[17 + inpos] & 127) << (19 - 7)) - ) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[17 + inpos] >>> 7) & 524287) - ) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[17 + inpos] >>> 26) - | ((in[18 + inpos] & 8191) << (19 - 13)) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[18 + inpos] >>> 13) - ) + out[31 + outpos - 1]; - } + protected static void integratedpack31(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 31); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (31 - 30) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 30); + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (31 - 29) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 29); + out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (31 - 28) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 28); + out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (31 - 27) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 27); + out[5 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (31 - 26) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 26); + out[6 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (31 - 25) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 25); + out[7 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (31 - 24) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 24); + out[8 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (31 - 23) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 23); + out[9 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (31 - 22) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 22); + out[10 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (31 - 21) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 21); + out[11 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (31 - 20) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 20); + out[12 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (31 - 19) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 19); + out[13 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (31 - 18) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 18); + out[14 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (31 - 17) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 17); + out[15 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (31 - 16) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16); + out[16 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (31 - 15) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 15); + out[17 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (31 - 14) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 14); + out[18 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (31 - 13) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 13); + out[19 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (31 - 12) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 12); + out[20 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (31 - 11) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 11); + out[21 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (31 - 10) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 10); + out[22 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (31 - 9) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 9); + out[23 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (31 - 8) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 8); + out[24 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (31 - 7) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 7); + out[25 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (31 - 6) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 6); + out[26 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (31 - 5) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 5); + out[27 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (31 - 4) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 4); + out[28 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (31 - 3) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 3); + out[29 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (31 - 2) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 2); + out[30 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (31 - 1) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 1); + } + protected static void integratedunpack1(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 1)) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 1) & 1)) + + out[1 + outpos - 1]; + out[2 + outpos] = (((in[0 + inpos] >>> 2) & 1)) + + out[2 + outpos - 1]; + out[3 + outpos] = (((in[0 + inpos] >>> 3) & 1)) + + out[3 + outpos - 1]; + out[4 + outpos] = (((in[0 + inpos] >>> 4) & 1)) + + out[4 + outpos - 1]; + out[5 + outpos] = (((in[0 + inpos] >>> 5) & 1)) + + out[5 + outpos - 1]; + out[6 + outpos] = (((in[0 + inpos] >>> 6) & 1)) + + out[6 + outpos - 1]; + out[7 + outpos] = (((in[0 + inpos] >>> 7) & 1)) + + out[7 + outpos - 1]; + out[8 + outpos] = (((in[0 + inpos] >>> 8) & 1)) + + out[8 + outpos - 1]; + out[9 + outpos] = (((in[0 + inpos] >>> 9) & 1)) + + out[9 + outpos - 1]; + out[10 + outpos] = (((in[0 + inpos] >>> 10) & 1)) + + out[10 + outpos - 1]; + out[11 + outpos] = (((in[0 + inpos] >>> 11) & 1)) + + out[11 + outpos - 1]; + out[12 + outpos] = (((in[0 + inpos] >>> 12) & 1)) + + out[12 + outpos - 1]; + out[13 + outpos] = (((in[0 + inpos] >>> 13) & 1)) + + out[13 + outpos - 1]; + out[14 + outpos] = (((in[0 + inpos] >>> 14) & 1)) + + out[14 + outpos - 1]; + out[15 + outpos] = (((in[0 + inpos] >>> 15) & 1)) + + out[15 + outpos - 1]; + out[16 + outpos] = (((in[0 + inpos] >>> 16) & 1)) + + out[16 + outpos - 1]; + out[17 + outpos] = (((in[0 + inpos] >>> 17) & 1)) + + out[17 + outpos - 1]; + out[18 + outpos] = (((in[0 + inpos] >>> 18) & 1)) + + out[18 + outpos - 1]; + out[19 + outpos] = (((in[0 + inpos] >>> 19) & 1)) + + out[19 + outpos - 1]; + out[20 + outpos] = (((in[0 + inpos] >>> 20) & 1)) + + out[20 + outpos - 1]; + out[21 + outpos] = (((in[0 + inpos] >>> 21) & 1)) + + out[21 + outpos - 1]; + out[22 + outpos] = (((in[0 + inpos] >>> 22) & 1)) + + out[22 + outpos - 1]; + out[23 + outpos] = (((in[0 + inpos] >>> 23) & 1)) + + out[23 + outpos - 1]; + out[24 + outpos] = (((in[0 + inpos] >>> 24) & 1)) + + out[24 + outpos - 1]; + out[25 + outpos] = (((in[0 + inpos] >>> 25) & 1)) + + out[25 + outpos - 1]; + out[26 + outpos] = (((in[0 + inpos] >>> 26) & 1)) + + out[26 + outpos - 1]; + out[27 + outpos] = (((in[0 + inpos] >>> 27) & 1)) + + out[27 + outpos - 1]; + out[28 + outpos] = (((in[0 + inpos] >>> 28) & 1)) + + out[28 + outpos - 1]; + out[29 + outpos] = (((in[0 + inpos] >>> 29) & 1)) + + out[29 + outpos - 1]; + out[30 + outpos] = (((in[0 + inpos] >>> 30) & 1)) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[0 + inpos] >>> 31)) + + out[31 + outpos - 1]; + } - protected static void integratedunpack20(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 1048575) - ) + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 20) - | ((in[1 + inpos] & 255) << (20 - 8)) - ) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[1 + inpos] >>> 8) & 1048575) - ) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[1 + inpos] >>> 28) - | ((in[2 + inpos] & 65535) << (20 - 16)) - ) + out[3 + outpos - 1]; - out[4 + outpos] = ((in[2 + inpos] >>> 16) - | ((in[3 + inpos] & 15) << (20 - 4)) - ) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[3 + inpos] >>> 4) & 1048575) - ) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[3 + inpos] >>> 24) - | ((in[4 + inpos] & 4095) << (20 - 12)) - ) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[4 + inpos] >>> 12) - ) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[5 + inpos] >>> 0) & 1048575) - ) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[5 + inpos] >>> 20) - | ((in[6 + inpos] & 255) << (20 - 8)) - ) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[6 + inpos] >>> 8) & 1048575) - ) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[6 + inpos] >>> 28) - | ((in[7 + inpos] & 65535) << (20 - 16)) - ) + out[11 + outpos - 1]; - out[12 + outpos] = ((in[7 + inpos] >>> 16) - | ((in[8 + inpos] & 15) << (20 - 4)) - ) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[8 + inpos] >>> 4) & 1048575) - ) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[8 + inpos] >>> 24) - | ((in[9 + inpos] & 4095) << (20 - 12)) - ) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[9 + inpos] >>> 12) - ) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[10 + inpos] >>> 0) & 1048575) - ) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[10 + inpos] >>> 20) - | ((in[11 + inpos] & 255) << (20 - 8)) - ) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[11 + inpos] >>> 8) & 1048575) - ) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[11 + inpos] >>> 28) - | ((in[12 + inpos] & 65535) << (20 - 16)) - ) + out[19 + outpos - 1]; - out[20 + outpos] = ((in[12 + inpos] >>> 16) - | ((in[13 + inpos] & 15) << (20 - 4)) - ) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[13 + inpos] >>> 4) & 1048575) - ) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[13 + inpos] >>> 24) - | ((in[14 + inpos] & 4095) << (20 - 12)) - ) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[14 + inpos] >>> 12) - ) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[15 + inpos] >>> 0) & 1048575) - ) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[15 + inpos] >>> 20) - | ((in[16 + inpos] & 255) << (20 - 8)) - ) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[16 + inpos] >>> 8) & 1048575) - ) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[16 + inpos] >>> 28) - | ((in[17 + inpos] & 65535) << (20 - 16)) - ) + out[27 + outpos - 1]; - out[28 + outpos] = ((in[17 + inpos] >>> 16) - | ((in[18 + inpos] & 15) << (20 - 4)) - ) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[18 + inpos] >>> 4) & 1048575) - ) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[18 + inpos] >>> 24) - | ((in[19 + inpos] & 4095) << (20 - 12)) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[19 + inpos] >>> 12) - ) + out[31 + outpos - 1]; - } + protected static void integratedunpack2(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 3)) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 2) & 3)) + + out[1 + outpos - 1]; + out[2 + outpos] = (((in[0 + inpos] >>> 4) & 3)) + + out[2 + outpos - 1]; + out[3 + outpos] = (((in[0 + inpos] >>> 6) & 3)) + + out[3 + outpos - 1]; + out[4 + outpos] = (((in[0 + inpos] >>> 8) & 3)) + + out[4 + outpos - 1]; + out[5 + outpos] = (((in[0 + inpos] >>> 10) & 3)) + + out[5 + outpos - 1]; + out[6 + outpos] = (((in[0 + inpos] >>> 12) & 3)) + + out[6 + outpos - 1]; + out[7 + outpos] = (((in[0 + inpos] >>> 14) & 3)) + + out[7 + outpos - 1]; + out[8 + outpos] = (((in[0 + inpos] >>> 16) & 3)) + + out[8 + outpos - 1]; + out[9 + outpos] = (((in[0 + inpos] >>> 18) & 3)) + + out[9 + outpos - 1]; + out[10 + outpos] = (((in[0 + inpos] >>> 20) & 3)) + + out[10 + outpos - 1]; + out[11 + outpos] = (((in[0 + inpos] >>> 22) & 3)) + + out[11 + outpos - 1]; + out[12 + outpos] = (((in[0 + inpos] >>> 24) & 3)) + + out[12 + outpos - 1]; + out[13 + outpos] = (((in[0 + inpos] >>> 26) & 3)) + + out[13 + outpos - 1]; + out[14 + outpos] = (((in[0 + inpos] >>> 28) & 3)) + + out[14 + outpos - 1]; + out[15 + outpos] = ((in[0 + inpos] >>> 30)) + + out[15 + outpos - 1]; + out[16 + outpos] = (((in[1 + inpos] >>> 0) & 3)) + + out[16 + outpos - 1]; + out[17 + outpos] = (((in[1 + inpos] >>> 2) & 3)) + + out[17 + outpos - 1]; + out[18 + outpos] = (((in[1 + inpos] >>> 4) & 3)) + + out[18 + outpos - 1]; + out[19 + outpos] = (((in[1 + inpos] >>> 6) & 3)) + + out[19 + outpos - 1]; + out[20 + outpos] = (((in[1 + inpos] >>> 8) & 3)) + + out[20 + outpos - 1]; + out[21 + outpos] = (((in[1 + inpos] >>> 10) & 3)) + + out[21 + outpos - 1]; + out[22 + outpos] = (((in[1 + inpos] >>> 12) & 3)) + + out[22 + outpos - 1]; + out[23 + outpos] = (((in[1 + inpos] >>> 14) & 3)) + + out[23 + outpos - 1]; + out[24 + outpos] = (((in[1 + inpos] >>> 16) & 3)) + + out[24 + outpos - 1]; + out[25 + outpos] = (((in[1 + inpos] >>> 18) & 3)) + + out[25 + outpos - 1]; + out[26 + outpos] = (((in[1 + inpos] >>> 20) & 3)) + + out[26 + outpos - 1]; + out[27 + outpos] = (((in[1 + inpos] >>> 22) & 3)) + + out[27 + outpos - 1]; + out[28 + outpos] = (((in[1 + inpos] >>> 24) & 3)) + + out[28 + outpos - 1]; + out[29 + outpos] = (((in[1 + inpos] >>> 26) & 3)) + + out[29 + outpos - 1]; + out[30 + outpos] = (((in[1 + inpos] >>> 28) & 3)) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[1 + inpos] >>> 30)) + + out[31 + outpos - 1]; + } + protected static void integratedunpack3(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 7)) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 3) & 7)) + + out[1 + outpos - 1]; + out[2 + outpos] = (((in[0 + inpos] >>> 6) & 7)) + + out[2 + outpos - 1]; + out[3 + outpos] = (((in[0 + inpos] >>> 9) & 7)) + + out[3 + outpos - 1]; + out[4 + outpos] = (((in[0 + inpos] >>> 12) & 7)) + + out[4 + outpos - 1]; + out[5 + outpos] = (((in[0 + inpos] >>> 15) & 7)) + + out[5 + outpos - 1]; + out[6 + outpos] = (((in[0 + inpos] >>> 18) & 7)) + + out[6 + outpos - 1]; + out[7 + outpos] = (((in[0 + inpos] >>> 21) & 7)) + + out[7 + outpos - 1]; + out[8 + outpos] = (((in[0 + inpos] >>> 24) & 7)) + + out[8 + outpos - 1]; + out[9 + outpos] = (((in[0 + inpos] >>> 27) & 7)) + + out[9 + outpos - 1]; + out[10 + outpos] = ((in[0 + inpos] >>> 30) | ((in[1 + inpos] & 1) << (3 - 1))) + + out[10 + outpos - 1]; + out[11 + outpos] = (((in[1 + inpos] >>> 1) & 7)) + + out[11 + outpos - 1]; + out[12 + outpos] = (((in[1 + inpos] >>> 4) & 7)) + + out[12 + outpos - 1]; + out[13 + outpos] = (((in[1 + inpos] >>> 7) & 7)) + + out[13 + outpos - 1]; + out[14 + outpos] = (((in[1 + inpos] >>> 10) & 7)) + + out[14 + outpos - 1]; + out[15 + outpos] = (((in[1 + inpos] >>> 13) & 7)) + + out[15 + outpos - 1]; + out[16 + outpos] = (((in[1 + inpos] >>> 16) & 7)) + + out[16 + outpos - 1]; + out[17 + outpos] = (((in[1 + inpos] >>> 19) & 7)) + + out[17 + outpos - 1]; + out[18 + outpos] = (((in[1 + inpos] >>> 22) & 7)) + + out[18 + outpos - 1]; + out[19 + outpos] = (((in[1 + inpos] >>> 25) & 7)) + + out[19 + outpos - 1]; + out[20 + outpos] = (((in[1 + inpos] >>> 28) & 7)) + + out[20 + outpos - 1]; + out[21 + outpos] = ((in[1 + inpos] >>> 31) | ((in[2 + inpos] & 3) << (3 - 2))) + + out[21 + outpos - 1]; + out[22 + outpos] = (((in[2 + inpos] >>> 2) & 7)) + + out[22 + outpos - 1]; + out[23 + outpos] = (((in[2 + inpos] >>> 5) & 7)) + + out[23 + outpos - 1]; + out[24 + outpos] = (((in[2 + inpos] >>> 8) & 7)) + + out[24 + outpos - 1]; + out[25 + outpos] = (((in[2 + inpos] >>> 11) & 7)) + + out[25 + outpos - 1]; + out[26 + outpos] = (((in[2 + inpos] >>> 14) & 7)) + + out[26 + outpos - 1]; + out[27 + outpos] = (((in[2 + inpos] >>> 17) & 7)) + + out[27 + outpos - 1]; + out[28 + outpos] = (((in[2 + inpos] >>> 20) & 7)) + + out[28 + outpos - 1]; + out[29 + outpos] = (((in[2 + inpos] >>> 23) & 7)) + + out[29 + outpos - 1]; + out[30 + outpos] = (((in[2 + inpos] >>> 26) & 7)) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[2 + inpos] >>> 29)) + + out[31 + outpos - 1]; + } - protected static void integratedunpack21(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 2097151) - ) + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 21) - | ((in[1 + inpos] & 1023) << (21 - 10)) - ) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[1 + inpos] >>> 10) & 2097151) - ) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[1 + inpos] >>> 31) - | ((in[2 + inpos] & 1048575) << (21 - 20)) - ) + out[3 + outpos - 1]; - out[4 + outpos] = ((in[2 + inpos] >>> 20) - | ((in[3 + inpos] & 511) << (21 - 9)) - ) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[3 + inpos] >>> 9) & 2097151) - ) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[3 + inpos] >>> 30) - | ((in[4 + inpos] & 524287) << (21 - 19)) - ) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[4 + inpos] >>> 19) - | ((in[5 + inpos] & 255) << (21 - 8)) - ) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[5 + inpos] >>> 8) & 2097151) - ) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[5 + inpos] >>> 29) - | ((in[6 + inpos] & 262143) << (21 - 18)) - ) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[6 + inpos] >>> 18) - | ((in[7 + inpos] & 127) << (21 - 7)) - ) + out[10 + outpos - 1]; - out[11 + outpos] = (((in[7 + inpos] >>> 7) & 2097151) - ) + out[11 + outpos - 1]; - out[12 + outpos] = ((in[7 + inpos] >>> 28) - | ((in[8 + inpos] & 131071) << (21 - 17)) - ) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[8 + inpos] >>> 17) - | ((in[9 + inpos] & 63) << (21 - 6)) - ) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[9 + inpos] >>> 6) & 2097151) - ) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[9 + inpos] >>> 27) - | ((in[10 + inpos] & 65535) << (21 - 16)) - ) + out[15 + outpos - 1]; - out[16 + outpos] = ((in[10 + inpos] >>> 16) - | ((in[11 + inpos] & 31) << (21 - 5)) - ) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[11 + inpos] >>> 5) & 2097151) - ) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[11 + inpos] >>> 26) - | ((in[12 + inpos] & 32767) << (21 - 15)) - ) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[12 + inpos] >>> 15) - | ((in[13 + inpos] & 15) << (21 - 4)) - ) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[13 + inpos] >>> 4) & 2097151) - ) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[13 + inpos] >>> 25) - | ((in[14 + inpos] & 16383) << (21 - 14)) - ) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[14 + inpos] >>> 14) - | ((in[15 + inpos] & 7) << (21 - 3)) - ) + out[22 + outpos - 1]; - out[23 + outpos] = (((in[15 + inpos] >>> 3) & 2097151) - ) + out[23 + outpos - 1]; - out[24 + outpos] = ((in[15 + inpos] >>> 24) - | ((in[16 + inpos] & 8191) << (21 - 13)) - ) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[16 + inpos] >>> 13) - | ((in[17 + inpos] & 3) << (21 - 2)) - ) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[17 + inpos] >>> 2) & 2097151) - ) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[17 + inpos] >>> 23) - | ((in[18 + inpos] & 4095) << (21 - 12)) - ) + out[27 + outpos - 1]; - out[28 + outpos] = ((in[18 + inpos] >>> 12) - | ((in[19 + inpos] & 1) << (21 - 1)) - ) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[19 + inpos] >>> 1) & 2097151) - ) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[19 + inpos] >>> 22) - | ((in[20 + inpos] & 2047) << (21 - 11)) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[20 + inpos] >>> 11) - ) + out[31 + outpos - 1]; - } + protected static void integratedunpack4(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 15)) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 4) & 15)) + + out[1 + outpos - 1]; + out[2 + outpos] = (((in[0 + inpos] >>> 8) & 15)) + + out[2 + outpos - 1]; + out[3 + outpos] = (((in[0 + inpos] >>> 12) & 15)) + + out[3 + outpos - 1]; + out[4 + outpos] = (((in[0 + inpos] >>> 16) & 15)) + + out[4 + outpos - 1]; + out[5 + outpos] = (((in[0 + inpos] >>> 20) & 15)) + + out[5 + outpos - 1]; + out[6 + outpos] = (((in[0 + inpos] >>> 24) & 15)) + + out[6 + outpos - 1]; + out[7 + outpos] = ((in[0 + inpos] >>> 28)) + + out[7 + outpos - 1]; + out[8 + outpos] = (((in[1 + inpos] >>> 0) & 15)) + + out[8 + outpos - 1]; + out[9 + outpos] = (((in[1 + inpos] >>> 4) & 15)) + + out[9 + outpos - 1]; + out[10 + outpos] = (((in[1 + inpos] >>> 8) & 15)) + + out[10 + outpos - 1]; + out[11 + outpos] = (((in[1 + inpos] >>> 12) & 15)) + + out[11 + outpos - 1]; + out[12 + outpos] = (((in[1 + inpos] >>> 16) & 15)) + + out[12 + outpos - 1]; + out[13 + outpos] = (((in[1 + inpos] >>> 20) & 15)) + + out[13 + outpos - 1]; + out[14 + outpos] = (((in[1 + inpos] >>> 24) & 15)) + + out[14 + outpos - 1]; + out[15 + outpos] = ((in[1 + inpos] >>> 28)) + + out[15 + outpos - 1]; + out[16 + outpos] = (((in[2 + inpos] >>> 0) & 15)) + + out[16 + outpos - 1]; + out[17 + outpos] = (((in[2 + inpos] >>> 4) & 15)) + + out[17 + outpos - 1]; + out[18 + outpos] = (((in[2 + inpos] >>> 8) & 15)) + + out[18 + outpos - 1]; + out[19 + outpos] = (((in[2 + inpos] >>> 12) & 15)) + + out[19 + outpos - 1]; + out[20 + outpos] = (((in[2 + inpos] >>> 16) & 15)) + + out[20 + outpos - 1]; + out[21 + outpos] = (((in[2 + inpos] >>> 20) & 15)) + + out[21 + outpos - 1]; + out[22 + outpos] = (((in[2 + inpos] >>> 24) & 15)) + + out[22 + outpos - 1]; + out[23 + outpos] = ((in[2 + inpos] >>> 28)) + + out[23 + outpos - 1]; + out[24 + outpos] = (((in[3 + inpos] >>> 0) & 15)) + + out[24 + outpos - 1]; + out[25 + outpos] = (((in[3 + inpos] >>> 4) & 15)) + + out[25 + outpos - 1]; + out[26 + outpos] = (((in[3 + inpos] >>> 8) & 15)) + + out[26 + outpos - 1]; + out[27 + outpos] = (((in[3 + inpos] >>> 12) & 15)) + + out[27 + outpos - 1]; + out[28 + outpos] = (((in[3 + inpos] >>> 16) & 15)) + + out[28 + outpos - 1]; + out[29 + outpos] = (((in[3 + inpos] >>> 20) & 15)) + + out[29 + outpos - 1]; + out[30 + outpos] = (((in[3 + inpos] >>> 24) & 15)) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[3 + inpos] >>> 28)) + + out[31 + outpos - 1]; + } + protected static void integratedunpack5(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 31)) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 5) & 31)) + + out[1 + outpos - 1]; + out[2 + outpos] = (((in[0 + inpos] >>> 10) & 31)) + + out[2 + outpos - 1]; + out[3 + outpos] = (((in[0 + inpos] >>> 15) & 31)) + + out[3 + outpos - 1]; + out[4 + outpos] = (((in[0 + inpos] >>> 20) & 31)) + + out[4 + outpos - 1]; + out[5 + outpos] = (((in[0 + inpos] >>> 25) & 31)) + + out[5 + outpos - 1]; + out[6 + outpos] = ((in[0 + inpos] >>> 30) | ((in[1 + inpos] & 7) << (5 - 3))) + + out[6 + outpos - 1]; + out[7 + outpos] = (((in[1 + inpos] >>> 3) & 31)) + + out[7 + outpos - 1]; + out[8 + outpos] = (((in[1 + inpos] >>> 8) & 31)) + + out[8 + outpos - 1]; + out[9 + outpos] = (((in[1 + inpos] >>> 13) & 31)) + + out[9 + outpos - 1]; + out[10 + outpos] = (((in[1 + inpos] >>> 18) & 31)) + + out[10 + outpos - 1]; + out[11 + outpos] = (((in[1 + inpos] >>> 23) & 31)) + + out[11 + outpos - 1]; + out[12 + outpos] = ((in[1 + inpos] >>> 28) | ((in[2 + inpos] & 1) << (5 - 1))) + + out[12 + outpos - 1]; + out[13 + outpos] = (((in[2 + inpos] >>> 1) & 31)) + + out[13 + outpos - 1]; + out[14 + outpos] = (((in[2 + inpos] >>> 6) & 31)) + + out[14 + outpos - 1]; + out[15 + outpos] = (((in[2 + inpos] >>> 11) & 31)) + + out[15 + outpos - 1]; + out[16 + outpos] = (((in[2 + inpos] >>> 16) & 31)) + + out[16 + outpos - 1]; + out[17 + outpos] = (((in[2 + inpos] >>> 21) & 31)) + + out[17 + outpos - 1]; + out[18 + outpos] = (((in[2 + inpos] >>> 26) & 31)) + + out[18 + outpos - 1]; + out[19 + outpos] = ((in[2 + inpos] >>> 31) | ((in[3 + inpos] & 15) << (5 - 4))) + + out[19 + outpos - 1]; + out[20 + outpos] = (((in[3 + inpos] >>> 4) & 31)) + + out[20 + outpos - 1]; + out[21 + outpos] = (((in[3 + inpos] >>> 9) & 31)) + + out[21 + outpos - 1]; + out[22 + outpos] = (((in[3 + inpos] >>> 14) & 31)) + + out[22 + outpos - 1]; + out[23 + outpos] = (((in[3 + inpos] >>> 19) & 31)) + + out[23 + outpos - 1]; + out[24 + outpos] = (((in[3 + inpos] >>> 24) & 31)) + + out[24 + outpos - 1]; + out[25 + outpos] = ((in[3 + inpos] >>> 29) | ((in[4 + inpos] & 3) << (5 - 2))) + + out[25 + outpos - 1]; + out[26 + outpos] = (((in[4 + inpos] >>> 2) & 31)) + + out[26 + outpos - 1]; + out[27 + outpos] = (((in[4 + inpos] >>> 7) & 31)) + + out[27 + outpos - 1]; + out[28 + outpos] = (((in[4 + inpos] >>> 12) & 31)) + + out[28 + outpos - 1]; + out[29 + outpos] = (((in[4 + inpos] >>> 17) & 31)) + + out[29 + outpos - 1]; + out[30 + outpos] = (((in[4 + inpos] >>> 22) & 31)) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[4 + inpos] >>> 27)) + + out[31 + outpos - 1]; + } - protected static void integratedunpack22(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 4194303) - ) + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 22) - | ((in[1 + inpos] & 4095) << (22 - 12)) - ) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[1 + inpos] >>> 12) - | ((in[2 + inpos] & 3) << (22 - 2)) - ) + out[2 + outpos - 1]; - out[3 + outpos] = (((in[2 + inpos] >>> 2) & 4194303) - ) + out[3 + outpos - 1]; - out[4 + outpos] = ((in[2 + inpos] >>> 24) - | ((in[3 + inpos] & 16383) << (22 - 14)) - ) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[3 + inpos] >>> 14) - | ((in[4 + inpos] & 15) << (22 - 4)) - ) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[4 + inpos] >>> 4) & 4194303) - ) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[4 + inpos] >>> 26) - | ((in[5 + inpos] & 65535) << (22 - 16)) - ) + out[7 + outpos - 1]; - out[8 + outpos] = ((in[5 + inpos] >>> 16) - | ((in[6 + inpos] & 63) << (22 - 6)) - ) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[6 + inpos] >>> 6) & 4194303) - ) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[6 + inpos] >>> 28) - | ((in[7 + inpos] & 262143) << (22 - 18)) - ) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[7 + inpos] >>> 18) - | ((in[8 + inpos] & 255) << (22 - 8)) - ) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[8 + inpos] >>> 8) & 4194303) - ) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[8 + inpos] >>> 30) - | ((in[9 + inpos] & 1048575) << (22 - 20)) - ) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[9 + inpos] >>> 20) - | ((in[10 + inpos] & 1023) << (22 - 10)) - ) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[10 + inpos] >>> 10) - ) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[11 + inpos] >>> 0) & 4194303) - ) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[11 + inpos] >>> 22) - | ((in[12 + inpos] & 4095) << (22 - 12)) - ) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[12 + inpos] >>> 12) - | ((in[13 + inpos] & 3) << (22 - 2)) - ) + out[18 + outpos - 1]; - out[19 + outpos] = (((in[13 + inpos] >>> 2) & 4194303) - ) + out[19 + outpos - 1]; - out[20 + outpos] = ((in[13 + inpos] >>> 24) - | ((in[14 + inpos] & 16383) << (22 - 14)) - ) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[14 + inpos] >>> 14) - | ((in[15 + inpos] & 15) << (22 - 4)) - ) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[15 + inpos] >>> 4) & 4194303) - ) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[15 + inpos] >>> 26) - | ((in[16 + inpos] & 65535) << (22 - 16)) - ) + out[23 + outpos - 1]; - out[24 + outpos] = ((in[16 + inpos] >>> 16) - | ((in[17 + inpos] & 63) << (22 - 6)) - ) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[17 + inpos] >>> 6) & 4194303) - ) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[17 + inpos] >>> 28) - | ((in[18 + inpos] & 262143) << (22 - 18)) - ) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[18 + inpos] >>> 18) - | ((in[19 + inpos] & 255) << (22 - 8)) - ) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[19 + inpos] >>> 8) & 4194303) - ) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[19 + inpos] >>> 30) - | ((in[20 + inpos] & 1048575) << (22 - 20)) - ) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[20 + inpos] >>> 20) - | ((in[21 + inpos] & 1023) << (22 - 10)) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[21 + inpos] >>> 10) - ) + out[31 + outpos - 1]; - } + protected static void integratedunpack6(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 63)) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 6) & 63)) + + out[1 + outpos - 1]; + out[2 + outpos] = (((in[0 + inpos] >>> 12) & 63)) + + out[2 + outpos - 1]; + out[3 + outpos] = (((in[0 + inpos] >>> 18) & 63)) + + out[3 + outpos - 1]; + out[4 + outpos] = (((in[0 + inpos] >>> 24) & 63)) + + out[4 + outpos - 1]; + out[5 + outpos] = ((in[0 + inpos] >>> 30) | ((in[1 + inpos] & 15) << (6 - 4))) + + out[5 + outpos - 1]; + out[6 + outpos] = (((in[1 + inpos] >>> 4) & 63)) + + out[6 + outpos - 1]; + out[7 + outpos] = (((in[1 + inpos] >>> 10) & 63)) + + out[7 + outpos - 1]; + out[8 + outpos] = (((in[1 + inpos] >>> 16) & 63)) + + out[8 + outpos - 1]; + out[9 + outpos] = (((in[1 + inpos] >>> 22) & 63)) + + out[9 + outpos - 1]; + out[10 + outpos] = ((in[1 + inpos] >>> 28) | ((in[2 + inpos] & 3) << (6 - 2))) + + out[10 + outpos - 1]; + out[11 + outpos] = (((in[2 + inpos] >>> 2) & 63)) + + out[11 + outpos - 1]; + out[12 + outpos] = (((in[2 + inpos] >>> 8) & 63)) + + out[12 + outpos - 1]; + out[13 + outpos] = (((in[2 + inpos] >>> 14) & 63)) + + out[13 + outpos - 1]; + out[14 + outpos] = (((in[2 + inpos] >>> 20) & 63)) + + out[14 + outpos - 1]; + out[15 + outpos] = ((in[2 + inpos] >>> 26)) + + out[15 + outpos - 1]; + out[16 + outpos] = (((in[3 + inpos] >>> 0) & 63)) + + out[16 + outpos - 1]; + out[17 + outpos] = (((in[3 + inpos] >>> 6) & 63)) + + out[17 + outpos - 1]; + out[18 + outpos] = (((in[3 + inpos] >>> 12) & 63)) + + out[18 + outpos - 1]; + out[19 + outpos] = (((in[3 + inpos] >>> 18) & 63)) + + out[19 + outpos - 1]; + out[20 + outpos] = (((in[3 + inpos] >>> 24) & 63)) + + out[20 + outpos - 1]; + out[21 + outpos] = ((in[3 + inpos] >>> 30) | ((in[4 + inpos] & 15) << (6 - 4))) + + out[21 + outpos - 1]; + out[22 + outpos] = (((in[4 + inpos] >>> 4) & 63)) + + out[22 + outpos - 1]; + out[23 + outpos] = (((in[4 + inpos] >>> 10) & 63)) + + out[23 + outpos - 1]; + out[24 + outpos] = (((in[4 + inpos] >>> 16) & 63)) + + out[24 + outpos - 1]; + out[25 + outpos] = (((in[4 + inpos] >>> 22) & 63)) + + out[25 + outpos - 1]; + out[26 + outpos] = ((in[4 + inpos] >>> 28) | ((in[5 + inpos] & 3) << (6 - 2))) + + out[26 + outpos - 1]; + out[27 + outpos] = (((in[5 + inpos] >>> 2) & 63)) + + out[27 + outpos - 1]; + out[28 + outpos] = (((in[5 + inpos] >>> 8) & 63)) + + out[28 + outpos - 1]; + out[29 + outpos] = (((in[5 + inpos] >>> 14) & 63)) + + out[29 + outpos - 1]; + out[30 + outpos] = (((in[5 + inpos] >>> 20) & 63)) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[5 + inpos] >>> 26)) + + out[31 + outpos - 1]; + } + protected static void integratedunpack7(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 127)) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 7) & 127)) + + out[1 + outpos - 1]; + out[2 + outpos] = (((in[0 + inpos] >>> 14) & 127)) + + out[2 + outpos - 1]; + out[3 + outpos] = (((in[0 + inpos] >>> 21) & 127)) + + out[3 + outpos - 1]; + out[4 + outpos] = ((in[0 + inpos] >>> 28) | ((in[1 + inpos] & 7) << (7 - 3))) + + out[4 + outpos - 1]; + out[5 + outpos] = (((in[1 + inpos] >>> 3) & 127)) + + out[5 + outpos - 1]; + out[6 + outpos] = (((in[1 + inpos] >>> 10) & 127)) + + out[6 + outpos - 1]; + out[7 + outpos] = (((in[1 + inpos] >>> 17) & 127)) + + out[7 + outpos - 1]; + out[8 + outpos] = (((in[1 + inpos] >>> 24) & 127)) + + out[8 + outpos - 1]; + out[9 + outpos] = ((in[1 + inpos] >>> 31) | ((in[2 + inpos] & 63) << (7 - 6))) + + out[9 + outpos - 1]; + out[10 + outpos] = (((in[2 + inpos] >>> 6) & 127)) + + out[10 + outpos - 1]; + out[11 + outpos] = (((in[2 + inpos] >>> 13) & 127)) + + out[11 + outpos - 1]; + out[12 + outpos] = (((in[2 + inpos] >>> 20) & 127)) + + out[12 + outpos - 1]; + out[13 + outpos] = ((in[2 + inpos] >>> 27) | ((in[3 + inpos] & 3) << (7 - 2))) + + out[13 + outpos - 1]; + out[14 + outpos] = (((in[3 + inpos] >>> 2) & 127)) + + out[14 + outpos - 1]; + out[15 + outpos] = (((in[3 + inpos] >>> 9) & 127)) + + out[15 + outpos - 1]; + out[16 + outpos] = (((in[3 + inpos] >>> 16) & 127)) + + out[16 + outpos - 1]; + out[17 + outpos] = (((in[3 + inpos] >>> 23) & 127)) + + out[17 + outpos - 1]; + out[18 + outpos] = ((in[3 + inpos] >>> 30) | ((in[4 + inpos] & 31) << (7 - 5))) + + out[18 + outpos - 1]; + out[19 + outpos] = (((in[4 + inpos] >>> 5) & 127)) + + out[19 + outpos - 1]; + out[20 + outpos] = (((in[4 + inpos] >>> 12) & 127)) + + out[20 + outpos - 1]; + out[21 + outpos] = (((in[4 + inpos] >>> 19) & 127)) + + out[21 + outpos - 1]; + out[22 + outpos] = ((in[4 + inpos] >>> 26) | ((in[5 + inpos] & 1) << (7 - 1))) + + out[22 + outpos - 1]; + out[23 + outpos] = (((in[5 + inpos] >>> 1) & 127)) + + out[23 + outpos - 1]; + out[24 + outpos] = (((in[5 + inpos] >>> 8) & 127)) + + out[24 + outpos - 1]; + out[25 + outpos] = (((in[5 + inpos] >>> 15) & 127)) + + out[25 + outpos - 1]; + out[26 + outpos] = (((in[5 + inpos] >>> 22) & 127)) + + out[26 + outpos - 1]; + out[27 + outpos] = ((in[5 + inpos] >>> 29) | ((in[6 + inpos] & 15) << (7 - 4))) + + out[27 + outpos - 1]; + out[28 + outpos] = (((in[6 + inpos] >>> 4) & 127)) + + out[28 + outpos - 1]; + out[29 + outpos] = (((in[6 + inpos] >>> 11) & 127)) + + out[29 + outpos - 1]; + out[30 + outpos] = (((in[6 + inpos] >>> 18) & 127)) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[6 + inpos] >>> 25)) + + out[31 + outpos - 1]; + } - protected static void integratedunpack23(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 8388607) - ) + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 23) - | ((in[1 + inpos] & 16383) << (23 - 14)) - ) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[1 + inpos] >>> 14) - | ((in[2 + inpos] & 31) << (23 - 5)) - ) + out[2 + outpos - 1]; - out[3 + outpos] = (((in[2 + inpos] >>> 5) & 8388607) - ) + out[3 + outpos - 1]; - out[4 + outpos] = ((in[2 + inpos] >>> 28) - | ((in[3 + inpos] & 524287) << (23 - 19)) - ) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[3 + inpos] >>> 19) - | ((in[4 + inpos] & 1023) << (23 - 10)) - ) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[4 + inpos] >>> 10) - | ((in[5 + inpos] & 1) << (23 - 1)) - ) + out[6 + outpos - 1]; - out[7 + outpos] = (((in[5 + inpos] >>> 1) & 8388607) - ) + out[7 + outpos - 1]; - out[8 + outpos] = ((in[5 + inpos] >>> 24) - | ((in[6 + inpos] & 32767) << (23 - 15)) - ) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[6 + inpos] >>> 15) - | ((in[7 + inpos] & 63) << (23 - 6)) - ) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[7 + inpos] >>> 6) & 8388607) - ) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[7 + inpos] >>> 29) - | ((in[8 + inpos] & 1048575) << (23 - 20)) - ) + out[11 + outpos - 1]; - out[12 + outpos] = ((in[8 + inpos] >>> 20) - | ((in[9 + inpos] & 2047) << (23 - 11)) - ) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[9 + inpos] >>> 11) - | ((in[10 + inpos] & 3) << (23 - 2)) - ) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[10 + inpos] >>> 2) & 8388607) - ) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[10 + inpos] >>> 25) - | ((in[11 + inpos] & 65535) << (23 - 16)) - ) + out[15 + outpos - 1]; - out[16 + outpos] = ((in[11 + inpos] >>> 16) - | ((in[12 + inpos] & 127) << (23 - 7)) - ) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[12 + inpos] >>> 7) & 8388607) - ) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[12 + inpos] >>> 30) - | ((in[13 + inpos] & 2097151) << (23 - 21)) - ) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[13 + inpos] >>> 21) - | ((in[14 + inpos] & 4095) << (23 - 12)) - ) + out[19 + outpos - 1]; - out[20 + outpos] = ((in[14 + inpos] >>> 12) - | ((in[15 + inpos] & 7) << (23 - 3)) - ) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[15 + inpos] >>> 3) & 8388607) - ) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[15 + inpos] >>> 26) - | ((in[16 + inpos] & 131071) << (23 - 17)) - ) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[16 + inpos] >>> 17) - | ((in[17 + inpos] & 255) << (23 - 8)) - ) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[17 + inpos] >>> 8) & 8388607) - ) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[17 + inpos] >>> 31) - | ((in[18 + inpos] & 4194303) << (23 - 22)) - ) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[18 + inpos] >>> 22) - | ((in[19 + inpos] & 8191) << (23 - 13)) - ) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[19 + inpos] >>> 13) - | ((in[20 + inpos] & 15) << (23 - 4)) - ) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[20 + inpos] >>> 4) & 8388607) - ) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[20 + inpos] >>> 27) - | ((in[21 + inpos] & 262143) << (23 - 18)) - ) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[21 + inpos] >>> 18) - | ((in[22 + inpos] & 511) << (23 - 9)) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[22 + inpos] >>> 9) - ) + out[31 + outpos - 1]; - } + protected static void integratedunpack8(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 255)) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 8) & 255)) + + out[1 + outpos - 1]; + out[2 + outpos] = (((in[0 + inpos] >>> 16) & 255)) + + out[2 + outpos - 1]; + out[3 + outpos] = ((in[0 + inpos] >>> 24)) + + out[3 + outpos - 1]; + out[4 + outpos] = (((in[1 + inpos] >>> 0) & 255)) + + out[4 + outpos - 1]; + out[5 + outpos] = (((in[1 + inpos] >>> 8) & 255)) + + out[5 + outpos - 1]; + out[6 + outpos] = (((in[1 + inpos] >>> 16) & 255)) + + out[6 + outpos - 1]; + out[7 + outpos] = ((in[1 + inpos] >>> 24)) + + out[7 + outpos - 1]; + out[8 + outpos] = (((in[2 + inpos] >>> 0) & 255)) + + out[8 + outpos - 1]; + out[9 + outpos] = (((in[2 + inpos] >>> 8) & 255)) + + out[9 + outpos - 1]; + out[10 + outpos] = (((in[2 + inpos] >>> 16) & 255)) + + out[10 + outpos - 1]; + out[11 + outpos] = ((in[2 + inpos] >>> 24)) + + out[11 + outpos - 1]; + out[12 + outpos] = (((in[3 + inpos] >>> 0) & 255)) + + out[12 + outpos - 1]; + out[13 + outpos] = (((in[3 + inpos] >>> 8) & 255)) + + out[13 + outpos - 1]; + out[14 + outpos] = (((in[3 + inpos] >>> 16) & 255)) + + out[14 + outpos - 1]; + out[15 + outpos] = ((in[3 + inpos] >>> 24)) + + out[15 + outpos - 1]; + out[16 + outpos] = (((in[4 + inpos] >>> 0) & 255)) + + out[16 + outpos - 1]; + out[17 + outpos] = (((in[4 + inpos] >>> 8) & 255)) + + out[17 + outpos - 1]; + out[18 + outpos] = (((in[4 + inpos] >>> 16) & 255)) + + out[18 + outpos - 1]; + out[19 + outpos] = ((in[4 + inpos] >>> 24)) + + out[19 + outpos - 1]; + out[20 + outpos] = (((in[5 + inpos] >>> 0) & 255)) + + out[20 + outpos - 1]; + out[21 + outpos] = (((in[5 + inpos] >>> 8) & 255)) + + out[21 + outpos - 1]; + out[22 + outpos] = (((in[5 + inpos] >>> 16) & 255)) + + out[22 + outpos - 1]; + out[23 + outpos] = ((in[5 + inpos] >>> 24)) + + out[23 + outpos - 1]; + out[24 + outpos] = (((in[6 + inpos] >>> 0) & 255)) + + out[24 + outpos - 1]; + out[25 + outpos] = (((in[6 + inpos] >>> 8) & 255)) + + out[25 + outpos - 1]; + out[26 + outpos] = (((in[6 + inpos] >>> 16) & 255)) + + out[26 + outpos - 1]; + out[27 + outpos] = ((in[6 + inpos] >>> 24)) + + out[27 + outpos - 1]; + out[28 + outpos] = (((in[7 + inpos] >>> 0) & 255)) + + out[28 + outpos - 1]; + out[29 + outpos] = (((in[7 + inpos] >>> 8) & 255)) + + out[29 + outpos - 1]; + out[30 + outpos] = (((in[7 + inpos] >>> 16) & 255)) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[7 + inpos] >>> 24)) + + out[31 + outpos - 1]; + } + protected static void integratedunpack9(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 511)) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 9) & 511)) + + out[1 + outpos - 1]; + out[2 + outpos] = (((in[0 + inpos] >>> 18) & 511)) + + out[2 + outpos - 1]; + out[3 + outpos] = ((in[0 + inpos] >>> 27) | ((in[1 + inpos] & 15) << (9 - 4))) + + out[3 + outpos - 1]; + out[4 + outpos] = (((in[1 + inpos] >>> 4) & 511)) + + out[4 + outpos - 1]; + out[5 + outpos] = (((in[1 + inpos] >>> 13) & 511)) + + out[5 + outpos - 1]; + out[6 + outpos] = (((in[1 + inpos] >>> 22) & 511)) + + out[6 + outpos - 1]; + out[7 + outpos] = ((in[1 + inpos] >>> 31) | ((in[2 + inpos] & 255) << (9 - 8))) + + out[7 + outpos - 1]; + out[8 + outpos] = (((in[2 + inpos] >>> 8) & 511)) + + out[8 + outpos - 1]; + out[9 + outpos] = (((in[2 + inpos] >>> 17) & 511)) + + out[9 + outpos - 1]; + out[10 + outpos] = ((in[2 + inpos] >>> 26) | ((in[3 + inpos] & 7) << (9 - 3))) + + out[10 + outpos - 1]; + out[11 + outpos] = (((in[3 + inpos] >>> 3) & 511)) + + out[11 + outpos - 1]; + out[12 + outpos] = (((in[3 + inpos] >>> 12) & 511)) + + out[12 + outpos - 1]; + out[13 + outpos] = (((in[3 + inpos] >>> 21) & 511)) + + out[13 + outpos - 1]; + out[14 + outpos] = ((in[3 + inpos] >>> 30) | ((in[4 + inpos] & 127) << (9 - 7))) + + out[14 + outpos - 1]; + out[15 + outpos] = (((in[4 + inpos] >>> 7) & 511)) + + out[15 + outpos - 1]; + out[16 + outpos] = (((in[4 + inpos] >>> 16) & 511)) + + out[16 + outpos - 1]; + out[17 + outpos] = ((in[4 + inpos] >>> 25) | ((in[5 + inpos] & 3) << (9 - 2))) + + out[17 + outpos - 1]; + out[18 + outpos] = (((in[5 + inpos] >>> 2) & 511)) + + out[18 + outpos - 1]; + out[19 + outpos] = (((in[5 + inpos] >>> 11) & 511)) + + out[19 + outpos - 1]; + out[20 + outpos] = (((in[5 + inpos] >>> 20) & 511)) + + out[20 + outpos - 1]; + out[21 + outpos] = ((in[5 + inpos] >>> 29) | ((in[6 + inpos] & 63) << (9 - 6))) + + out[21 + outpos - 1]; + out[22 + outpos] = (((in[6 + inpos] >>> 6) & 511)) + + out[22 + outpos - 1]; + out[23 + outpos] = (((in[6 + inpos] >>> 15) & 511)) + + out[23 + outpos - 1]; + out[24 + outpos] = ((in[6 + inpos] >>> 24) | ((in[7 + inpos] & 1) << (9 - 1))) + + out[24 + outpos - 1]; + out[25 + outpos] = (((in[7 + inpos] >>> 1) & 511)) + + out[25 + outpos - 1]; + out[26 + outpos] = (((in[7 + inpos] >>> 10) & 511)) + + out[26 + outpos - 1]; + out[27 + outpos] = (((in[7 + inpos] >>> 19) & 511)) + + out[27 + outpos - 1]; + out[28 + outpos] = ((in[7 + inpos] >>> 28) | ((in[8 + inpos] & 31) << (9 - 5))) + + out[28 + outpos - 1]; + out[29 + outpos] = (((in[8 + inpos] >>> 5) & 511)) + + out[29 + outpos - 1]; + out[30 + outpos] = (((in[8 + inpos] >>> 14) & 511)) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[8 + inpos] >>> 23)) + + out[31 + outpos - 1]; + } - protected static void integratedunpack24(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 16777215) - ) + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 24) - | ((in[1 + inpos] & 65535) << (24 - 16)) - ) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[1 + inpos] >>> 16) - | ((in[2 + inpos] & 255) << (24 - 8)) - ) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[2 + inpos] >>> 8) - ) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[3 + inpos] >>> 0) & 16777215) - ) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[3 + inpos] >>> 24) - | ((in[4 + inpos] & 65535) << (24 - 16)) - ) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[4 + inpos] >>> 16) - | ((in[5 + inpos] & 255) << (24 - 8)) - ) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[5 + inpos] >>> 8) - ) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[6 + inpos] >>> 0) & 16777215) - ) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[6 + inpos] >>> 24) - | ((in[7 + inpos] & 65535) << (24 - 16)) - ) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[7 + inpos] >>> 16) - | ((in[8 + inpos] & 255) << (24 - 8)) - ) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[8 + inpos] >>> 8) - ) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[9 + inpos] >>> 0) & 16777215) - ) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[9 + inpos] >>> 24) - | ((in[10 + inpos] & 65535) << (24 - 16)) - ) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[10 + inpos] >>> 16) - | ((in[11 + inpos] & 255) << (24 - 8)) - ) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[11 + inpos] >>> 8) - ) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[12 + inpos] >>> 0) & 16777215) - ) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[12 + inpos] >>> 24) - | ((in[13 + inpos] & 65535) << (24 - 16)) - ) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[13 + inpos] >>> 16) - | ((in[14 + inpos] & 255) << (24 - 8)) - ) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[14 + inpos] >>> 8) - ) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[15 + inpos] >>> 0) & 16777215) - ) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[15 + inpos] >>> 24) - | ((in[16 + inpos] & 65535) << (24 - 16)) - ) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[16 + inpos] >>> 16) - | ((in[17 + inpos] & 255) << (24 - 8)) - ) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[17 + inpos] >>> 8) - ) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[18 + inpos] >>> 0) & 16777215) - ) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[18 + inpos] >>> 24) - | ((in[19 + inpos] & 65535) << (24 - 16)) - ) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[19 + inpos] >>> 16) - | ((in[20 + inpos] & 255) << (24 - 8)) - ) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[20 + inpos] >>> 8) - ) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[21 + inpos] >>> 0) & 16777215) - ) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[21 + inpos] >>> 24) - | ((in[22 + inpos] & 65535) << (24 - 16)) - ) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[22 + inpos] >>> 16) - | ((in[23 + inpos] & 255) << (24 - 8)) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[23 + inpos] >>> 8) - ) + out[31 + outpos - 1]; - } + protected static void integratedunpack10(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 1023)) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 10) & 1023)) + + out[1 + outpos - 1]; + out[2 + outpos] = (((in[0 + inpos] >>> 20) & 1023)) + + out[2 + outpos - 1]; + out[3 + outpos] = ((in[0 + inpos] >>> 30) | ((in[1 + inpos] & 255) << (10 - 8))) + + out[3 + outpos - 1]; + out[4 + outpos] = (((in[1 + inpos] >>> 8) & 1023)) + + out[4 + outpos - 1]; + out[5 + outpos] = (((in[1 + inpos] >>> 18) & 1023)) + + out[5 + outpos - 1]; + out[6 + outpos] = ((in[1 + inpos] >>> 28) | ((in[2 + inpos] & 63) << (10 - 6))) + + out[6 + outpos - 1]; + out[7 + outpos] = (((in[2 + inpos] >>> 6) & 1023)) + + out[7 + outpos - 1]; + out[8 + outpos] = (((in[2 + inpos] >>> 16) & 1023)) + + out[8 + outpos - 1]; + out[9 + outpos] = ((in[2 + inpos] >>> 26) | ((in[3 + inpos] & 15) << (10 - 4))) + + out[9 + outpos - 1]; + out[10 + outpos] = (((in[3 + inpos] >>> 4) & 1023)) + + out[10 + outpos - 1]; + out[11 + outpos] = (((in[3 + inpos] >>> 14) & 1023)) + + out[11 + outpos - 1]; + out[12 + outpos] = ((in[3 + inpos] >>> 24) | ((in[4 + inpos] & 3) << (10 - 2))) + + out[12 + outpos - 1]; + out[13 + outpos] = (((in[4 + inpos] >>> 2) & 1023)) + + out[13 + outpos - 1]; + out[14 + outpos] = (((in[4 + inpos] >>> 12) & 1023)) + + out[14 + outpos - 1]; + out[15 + outpos] = ((in[4 + inpos] >>> 22)) + + out[15 + outpos - 1]; + out[16 + outpos] = (((in[5 + inpos] >>> 0) & 1023)) + + out[16 + outpos - 1]; + out[17 + outpos] = (((in[5 + inpos] >>> 10) & 1023)) + + out[17 + outpos - 1]; + out[18 + outpos] = (((in[5 + inpos] >>> 20) & 1023)) + + out[18 + outpos - 1]; + out[19 + outpos] = ((in[5 + inpos] >>> 30) | ((in[6 + inpos] & 255) << (10 - 8))) + + out[19 + outpos - 1]; + out[20 + outpos] = (((in[6 + inpos] >>> 8) & 1023)) + + out[20 + outpos - 1]; + out[21 + outpos] = (((in[6 + inpos] >>> 18) & 1023)) + + out[21 + outpos - 1]; + out[22 + outpos] = ((in[6 + inpos] >>> 28) | ((in[7 + inpos] & 63) << (10 - 6))) + + out[22 + outpos - 1]; + out[23 + outpos] = (((in[7 + inpos] >>> 6) & 1023)) + + out[23 + outpos - 1]; + out[24 + outpos] = (((in[7 + inpos] >>> 16) & 1023)) + + out[24 + outpos - 1]; + out[25 + outpos] = ((in[7 + inpos] >>> 26) | ((in[8 + inpos] & 15) << (10 - 4))) + + out[25 + outpos - 1]; + out[26 + outpos] = (((in[8 + inpos] >>> 4) & 1023)) + + out[26 + outpos - 1]; + out[27 + outpos] = (((in[8 + inpos] >>> 14) & 1023)) + + out[27 + outpos - 1]; + out[28 + outpos] = ((in[8 + inpos] >>> 24) | ((in[9 + inpos] & 3) << (10 - 2))) + + out[28 + outpos - 1]; + out[29 + outpos] = (((in[9 + inpos] >>> 2) & 1023)) + + out[29 + outpos - 1]; + out[30 + outpos] = (((in[9 + inpos] >>> 12) & 1023)) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[9 + inpos] >>> 22)) + + out[31 + outpos - 1]; + } + protected static void integratedunpack11(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 2047)) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 11) & 2047)) + + out[1 + outpos - 1]; + out[2 + outpos] = ((in[0 + inpos] >>> 22) | ((in[1 + inpos] & 1) << (11 - 1))) + + out[2 + outpos - 1]; + out[3 + outpos] = (((in[1 + inpos] >>> 1) & 2047)) + + out[3 + outpos - 1]; + out[4 + outpos] = (((in[1 + inpos] >>> 12) & 2047)) + + out[4 + outpos - 1]; + out[5 + outpos] = ((in[1 + inpos] >>> 23) | ((in[2 + inpos] & 3) << (11 - 2))) + + out[5 + outpos - 1]; + out[6 + outpos] = (((in[2 + inpos] >>> 2) & 2047)) + + out[6 + outpos - 1]; + out[7 + outpos] = (((in[2 + inpos] >>> 13) & 2047)) + + out[7 + outpos - 1]; + out[8 + outpos] = ((in[2 + inpos] >>> 24) | ((in[3 + inpos] & 7) << (11 - 3))) + + out[8 + outpos - 1]; + out[9 + outpos] = (((in[3 + inpos] >>> 3) & 2047)) + + out[9 + outpos - 1]; + out[10 + outpos] = (((in[3 + inpos] >>> 14) & 2047)) + + out[10 + outpos - 1]; + out[11 + outpos] = ((in[3 + inpos] >>> 25) | ((in[4 + inpos] & 15) << (11 - 4))) + + out[11 + outpos - 1]; + out[12 + outpos] = (((in[4 + inpos] >>> 4) & 2047)) + + out[12 + outpos - 1]; + out[13 + outpos] = (((in[4 + inpos] >>> 15) & 2047)) + + out[13 + outpos - 1]; + out[14 + outpos] = ((in[4 + inpos] >>> 26) | ((in[5 + inpos] & 31) << (11 - 5))) + + out[14 + outpos - 1]; + out[15 + outpos] = (((in[5 + inpos] >>> 5) & 2047)) + + out[15 + outpos - 1]; + out[16 + outpos] = (((in[5 + inpos] >>> 16) & 2047)) + + out[16 + outpos - 1]; + out[17 + outpos] = ((in[5 + inpos] >>> 27) | ((in[6 + inpos] & 63) << (11 - 6))) + + out[17 + outpos - 1]; + out[18 + outpos] = (((in[6 + inpos] >>> 6) & 2047)) + + out[18 + outpos - 1]; + out[19 + outpos] = (((in[6 + inpos] >>> 17) & 2047)) + + out[19 + outpos - 1]; + out[20 + outpos] = ((in[6 + inpos] >>> 28) | ((in[7 + inpos] & 127) << (11 - 7))) + + out[20 + outpos - 1]; + out[21 + outpos] = (((in[7 + inpos] >>> 7) & 2047)) + + out[21 + outpos - 1]; + out[22 + outpos] = (((in[7 + inpos] >>> 18) & 2047)) + + out[22 + outpos - 1]; + out[23 + outpos] = ((in[7 + inpos] >>> 29) | ((in[8 + inpos] & 255) << (11 - 8))) + + out[23 + outpos - 1]; + out[24 + outpos] = (((in[8 + inpos] >>> 8) & 2047)) + + out[24 + outpos - 1]; + out[25 + outpos] = (((in[8 + inpos] >>> 19) & 2047)) + + out[25 + outpos - 1]; + out[26 + outpos] = ((in[8 + inpos] >>> 30) | ((in[9 + inpos] & 511) << (11 - 9))) + + out[26 + outpos - 1]; + out[27 + outpos] = (((in[9 + inpos] >>> 9) & 2047)) + + out[27 + outpos - 1]; + out[28 + outpos] = (((in[9 + inpos] >>> 20) & 2047)) + + out[28 + outpos - 1]; + out[29 + outpos] = ((in[9 + inpos] >>> 31) | ((in[10 + inpos] & 1023) << (11 - 10))) + + out[29 + outpos - 1]; + out[30 + outpos] = (((in[10 + inpos] >>> 10) & 2047)) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[10 + inpos] >>> 21)) + + out[31 + outpos - 1]; + } - protected static void integratedunpack25(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 33554431) - ) + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 25) - | ((in[1 + inpos] & 262143) << (25 - 18)) - ) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[1 + inpos] >>> 18) - | ((in[2 + inpos] & 2047) << (25 - 11)) - ) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[2 + inpos] >>> 11) - | ((in[3 + inpos] & 15) << (25 - 4)) - ) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[3 + inpos] >>> 4) & 33554431) - ) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[3 + inpos] >>> 29) - | ((in[4 + inpos] & 4194303) << (25 - 22)) - ) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[4 + inpos] >>> 22) - | ((in[5 + inpos] & 32767) << (25 - 15)) - ) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[5 + inpos] >>> 15) - | ((in[6 + inpos] & 255) << (25 - 8)) - ) + out[7 + outpos - 1]; - out[8 + outpos] = ((in[6 + inpos] >>> 8) - | ((in[7 + inpos] & 1) << (25 - 1)) - ) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[7 + inpos] >>> 1) & 33554431) - ) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[7 + inpos] >>> 26) - | ((in[8 + inpos] & 524287) << (25 - 19)) - ) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[8 + inpos] >>> 19) - | ((in[9 + inpos] & 4095) << (25 - 12)) - ) + out[11 + outpos - 1]; - out[12 + outpos] = ((in[9 + inpos] >>> 12) - | ((in[10 + inpos] & 31) << (25 - 5)) - ) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[10 + inpos] >>> 5) & 33554431) - ) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[10 + inpos] >>> 30) - | ((in[11 + inpos] & 8388607) << (25 - 23)) - ) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[11 + inpos] >>> 23) - | ((in[12 + inpos] & 65535) << (25 - 16)) - ) + out[15 + outpos - 1]; - out[16 + outpos] = ((in[12 + inpos] >>> 16) - | ((in[13 + inpos] & 511) << (25 - 9)) - ) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[13 + inpos] >>> 9) - | ((in[14 + inpos] & 3) << (25 - 2)) - ) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[14 + inpos] >>> 2) & 33554431) - ) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[14 + inpos] >>> 27) - | ((in[15 + inpos] & 1048575) << (25 - 20)) - ) + out[19 + outpos - 1]; - out[20 + outpos] = ((in[15 + inpos] >>> 20) - | ((in[16 + inpos] & 8191) << (25 - 13)) - ) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[16 + inpos] >>> 13) - | ((in[17 + inpos] & 63) << (25 - 6)) - ) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[17 + inpos] >>> 6) & 33554431) - ) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[17 + inpos] >>> 31) - | ((in[18 + inpos] & 16777215) << (25 - 24)) - ) + out[23 + outpos - 1]; - out[24 + outpos] = ((in[18 + inpos] >>> 24) - | ((in[19 + inpos] & 131071) << (25 - 17)) - ) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[19 + inpos] >>> 17) - | ((in[20 + inpos] & 1023) << (25 - 10)) - ) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[20 + inpos] >>> 10) - | ((in[21 + inpos] & 7) << (25 - 3)) - ) + out[26 + outpos - 1]; - out[27 + outpos] = (((in[21 + inpos] >>> 3) & 33554431) - ) + out[27 + outpos - 1]; - out[28 + outpos] = ((in[21 + inpos] >>> 28) - | ((in[22 + inpos] & 2097151) << (25 - 21)) - ) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[22 + inpos] >>> 21) - | ((in[23 + inpos] & 16383) << (25 - 14)) - ) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[23 + inpos] >>> 14) - | ((in[24 + inpos] & 127) << (25 - 7)) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[24 + inpos] >>> 7) - ) + out[31 + outpos - 1]; - } + protected static void integratedunpack12(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 4095)) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 12) & 4095)) + + out[1 + outpos - 1]; + out[2 + outpos] = ((in[0 + inpos] >>> 24) | ((in[1 + inpos] & 15) << (12 - 4))) + + out[2 + outpos - 1]; + out[3 + outpos] = (((in[1 + inpos] >>> 4) & 4095)) + + out[3 + outpos - 1]; + out[4 + outpos] = (((in[1 + inpos] >>> 16) & 4095)) + + out[4 + outpos - 1]; + out[5 + outpos] = ((in[1 + inpos] >>> 28) | ((in[2 + inpos] & 255) << (12 - 8))) + + out[5 + outpos - 1]; + out[6 + outpos] = (((in[2 + inpos] >>> 8) & 4095)) + + out[6 + outpos - 1]; + out[7 + outpos] = ((in[2 + inpos] >>> 20)) + + out[7 + outpos - 1]; + out[8 + outpos] = (((in[3 + inpos] >>> 0) & 4095)) + + out[8 + outpos - 1]; + out[9 + outpos] = (((in[3 + inpos] >>> 12) & 4095)) + + out[9 + outpos - 1]; + out[10 + outpos] = ((in[3 + inpos] >>> 24) | ((in[4 + inpos] & 15) << (12 - 4))) + + out[10 + outpos - 1]; + out[11 + outpos] = (((in[4 + inpos] >>> 4) & 4095)) + + out[11 + outpos - 1]; + out[12 + outpos] = (((in[4 + inpos] >>> 16) & 4095)) + + out[12 + outpos - 1]; + out[13 + outpos] = ((in[4 + inpos] >>> 28) | ((in[5 + inpos] & 255) << (12 - 8))) + + out[13 + outpos - 1]; + out[14 + outpos] = (((in[5 + inpos] >>> 8) & 4095)) + + out[14 + outpos - 1]; + out[15 + outpos] = ((in[5 + inpos] >>> 20)) + + out[15 + outpos - 1]; + out[16 + outpos] = (((in[6 + inpos] >>> 0) & 4095)) + + out[16 + outpos - 1]; + out[17 + outpos] = (((in[6 + inpos] >>> 12) & 4095)) + + out[17 + outpos - 1]; + out[18 + outpos] = ((in[6 + inpos] >>> 24) | ((in[7 + inpos] & 15) << (12 - 4))) + + out[18 + outpos - 1]; + out[19 + outpos] = (((in[7 + inpos] >>> 4) & 4095)) + + out[19 + outpos - 1]; + out[20 + outpos] = (((in[7 + inpos] >>> 16) & 4095)) + + out[20 + outpos - 1]; + out[21 + outpos] = ((in[7 + inpos] >>> 28) | ((in[8 + inpos] & 255) << (12 - 8))) + + out[21 + outpos - 1]; + out[22 + outpos] = (((in[8 + inpos] >>> 8) & 4095)) + + out[22 + outpos - 1]; + out[23 + outpos] = ((in[8 + inpos] >>> 20)) + + out[23 + outpos - 1]; + out[24 + outpos] = (((in[9 + inpos] >>> 0) & 4095)) + + out[24 + outpos - 1]; + out[25 + outpos] = (((in[9 + inpos] >>> 12) & 4095)) + + out[25 + outpos - 1]; + out[26 + outpos] = ((in[9 + inpos] >>> 24) | ((in[10 + inpos] & 15) << (12 - 4))) + + out[26 + outpos - 1]; + out[27 + outpos] = (((in[10 + inpos] >>> 4) & 4095)) + + out[27 + outpos - 1]; + out[28 + outpos] = (((in[10 + inpos] >>> 16) & 4095)) + + out[28 + outpos - 1]; + out[29 + outpos] = ((in[10 + inpos] >>> 28) | ((in[11 + inpos] & 255) << (12 - 8))) + + out[29 + outpos - 1]; + out[30 + outpos] = (((in[11 + inpos] >>> 8) & 4095)) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[11 + inpos] >>> 20)) + + out[31 + outpos - 1]; + } + protected static void integratedunpack13(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 8191)) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 13) & 8191)) + + out[1 + outpos - 1]; + out[2 + outpos] = ((in[0 + inpos] >>> 26) | ((in[1 + inpos] & 127) << (13 - 7))) + + out[2 + outpos - 1]; + out[3 + outpos] = (((in[1 + inpos] >>> 7) & 8191)) + + out[3 + outpos - 1]; + out[4 + outpos] = ((in[1 + inpos] >>> 20) | ((in[2 + inpos] & 1) << (13 - 1))) + + out[4 + outpos - 1]; + out[5 + outpos] = (((in[2 + inpos] >>> 1) & 8191)) + + out[5 + outpos - 1]; + out[6 + outpos] = (((in[2 + inpos] >>> 14) & 8191)) + + out[6 + outpos - 1]; + out[7 + outpos] = ((in[2 + inpos] >>> 27) | ((in[3 + inpos] & 255) << (13 - 8))) + + out[7 + outpos - 1]; + out[8 + outpos] = (((in[3 + inpos] >>> 8) & 8191)) + + out[8 + outpos - 1]; + out[9 + outpos] = ((in[3 + inpos] >>> 21) | ((in[4 + inpos] & 3) << (13 - 2))) + + out[9 + outpos - 1]; + out[10 + outpos] = (((in[4 + inpos] >>> 2) & 8191)) + + out[10 + outpos - 1]; + out[11 + outpos] = (((in[4 + inpos] >>> 15) & 8191)) + + out[11 + outpos - 1]; + out[12 + outpos] = ((in[4 + inpos] >>> 28) | ((in[5 + inpos] & 511) << (13 - 9))) + + out[12 + outpos - 1]; + out[13 + outpos] = (((in[5 + inpos] >>> 9) & 8191)) + + out[13 + outpos - 1]; + out[14 + outpos] = ((in[5 + inpos] >>> 22) | ((in[6 + inpos] & 7) << (13 - 3))) + + out[14 + outpos - 1]; + out[15 + outpos] = (((in[6 + inpos] >>> 3) & 8191)) + + out[15 + outpos - 1]; + out[16 + outpos] = (((in[6 + inpos] >>> 16) & 8191)) + + out[16 + outpos - 1]; + out[17 + outpos] = ((in[6 + inpos] >>> 29) | ((in[7 + inpos] & 1023) << (13 - 10))) + + out[17 + outpos - 1]; + out[18 + outpos] = (((in[7 + inpos] >>> 10) & 8191)) + + out[18 + outpos - 1]; + out[19 + outpos] = ((in[7 + inpos] >>> 23) | ((in[8 + inpos] & 15) << (13 - 4))) + + out[19 + outpos - 1]; + out[20 + outpos] = (((in[8 + inpos] >>> 4) & 8191)) + + out[20 + outpos - 1]; + out[21 + outpos] = (((in[8 + inpos] >>> 17) & 8191)) + + out[21 + outpos - 1]; + out[22 + outpos] = ((in[8 + inpos] >>> 30) | ((in[9 + inpos] & 2047) << (13 - 11))) + + out[22 + outpos - 1]; + out[23 + outpos] = (((in[9 + inpos] >>> 11) & 8191)) + + out[23 + outpos - 1]; + out[24 + outpos] = ((in[9 + inpos] >>> 24) | ((in[10 + inpos] & 31) << (13 - 5))) + + out[24 + outpos - 1]; + out[25 + outpos] = (((in[10 + inpos] >>> 5) & 8191)) + + out[25 + outpos - 1]; + out[26 + outpos] = (((in[10 + inpos] >>> 18) & 8191)) + + out[26 + outpos - 1]; + out[27 + outpos] = ((in[10 + inpos] >>> 31) | ((in[11 + inpos] & 4095) << (13 - 12))) + + out[27 + outpos - 1]; + out[28 + outpos] = (((in[11 + inpos] >>> 12) & 8191)) + + out[28 + outpos - 1]; + out[29 + outpos] = ((in[11 + inpos] >>> 25) | ((in[12 + inpos] & 63) << (13 - 6))) + + out[29 + outpos - 1]; + out[30 + outpos] = (((in[12 + inpos] >>> 6) & 8191)) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[12 + inpos] >>> 19)) + + out[31 + outpos - 1]; + } - protected static void integratedunpack26(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 67108863) - ) + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 26) - | ((in[1 + inpos] & 1048575) << (26 - 20)) - ) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[1 + inpos] >>> 20) - | ((in[2 + inpos] & 16383) << (26 - 14)) - ) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[2 + inpos] >>> 14) - | ((in[3 + inpos] & 255) << (26 - 8)) - ) + out[3 + outpos - 1]; - out[4 + outpos] = ((in[3 + inpos] >>> 8) - | ((in[4 + inpos] & 3) << (26 - 2)) - ) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[4 + inpos] >>> 2) & 67108863) - ) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[4 + inpos] >>> 28) - | ((in[5 + inpos] & 4194303) << (26 - 22)) - ) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[5 + inpos] >>> 22) - | ((in[6 + inpos] & 65535) << (26 - 16)) - ) + out[7 + outpos - 1]; - out[8 + outpos] = ((in[6 + inpos] >>> 16) - | ((in[7 + inpos] & 1023) << (26 - 10)) - ) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[7 + inpos] >>> 10) - | ((in[8 + inpos] & 15) << (26 - 4)) - ) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[8 + inpos] >>> 4) & 67108863) - ) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[8 + inpos] >>> 30) - | ((in[9 + inpos] & 16777215) << (26 - 24)) - ) + out[11 + outpos - 1]; - out[12 + outpos] = ((in[9 + inpos] >>> 24) - | ((in[10 + inpos] & 262143) << (26 - 18)) - ) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[10 + inpos] >>> 18) - | ((in[11 + inpos] & 4095) << (26 - 12)) - ) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[11 + inpos] >>> 12) - | ((in[12 + inpos] & 63) << (26 - 6)) - ) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[12 + inpos] >>> 6) - ) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[13 + inpos] >>> 0) & 67108863) - ) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[13 + inpos] >>> 26) - | ((in[14 + inpos] & 1048575) << (26 - 20)) - ) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[14 + inpos] >>> 20) - | ((in[15 + inpos] & 16383) << (26 - 14)) - ) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[15 + inpos] >>> 14) - | ((in[16 + inpos] & 255) << (26 - 8)) - ) + out[19 + outpos - 1]; - out[20 + outpos] = ((in[16 + inpos] >>> 8) - | ((in[17 + inpos] & 3) << (26 - 2)) - ) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[17 + inpos] >>> 2) & 67108863) - ) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[17 + inpos] >>> 28) - | ((in[18 + inpos] & 4194303) << (26 - 22)) - ) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[18 + inpos] >>> 22) - | ((in[19 + inpos] & 65535) << (26 - 16)) - ) + out[23 + outpos - 1]; - out[24 + outpos] = ((in[19 + inpos] >>> 16) - | ((in[20 + inpos] & 1023) << (26 - 10)) - ) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[20 + inpos] >>> 10) - | ((in[21 + inpos] & 15) << (26 - 4)) - ) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[21 + inpos] >>> 4) & 67108863) - ) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[21 + inpos] >>> 30) - | ((in[22 + inpos] & 16777215) << (26 - 24)) - ) + out[27 + outpos - 1]; - out[28 + outpos] = ((in[22 + inpos] >>> 24) - | ((in[23 + inpos] & 262143) << (26 - 18)) - ) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[23 + inpos] >>> 18) - | ((in[24 + inpos] & 4095) << (26 - 12)) - ) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[24 + inpos] >>> 12) - | ((in[25 + inpos] & 63) << (26 - 6)) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[25 + inpos] >>> 6) - ) + out[31 + outpos - 1]; - } + protected static void integratedunpack14(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 16383)) + + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 14) & 16383)) + + out[1 + outpos - 1]; + out[2 + outpos] = ((in[0 + inpos] >>> 28) | ((in[1 + inpos] & 1023) << (14 - 10))) + + out[2 + outpos - 1]; + out[3 + outpos] = (((in[1 + inpos] >>> 10) & 16383)) + + out[3 + outpos - 1]; + out[4 + outpos] = ((in[1 + inpos] >>> 24) | ((in[2 + inpos] & 63) << (14 - 6))) + + out[4 + outpos - 1]; + out[5 + outpos] = (((in[2 + inpos] >>> 6) & 16383)) + + out[5 + outpos - 1]; + out[6 + outpos] = ((in[2 + inpos] >>> 20) | ((in[3 + inpos] & 3) << (14 - 2))) + + out[6 + outpos - 1]; + out[7 + outpos] = (((in[3 + inpos] >>> 2) & 16383)) + + out[7 + outpos - 1]; + out[8 + outpos] = (((in[3 + inpos] >>> 16) & 16383)) + + out[8 + outpos - 1]; + out[9 + outpos] = ((in[3 + inpos] >>> 30) | ((in[4 + inpos] & 4095) << (14 - 12))) + + out[9 + outpos - 1]; + out[10 + outpos] = (((in[4 + inpos] >>> 12) & 16383)) + + out[10 + outpos - 1]; + out[11 + outpos] = ((in[4 + inpos] >>> 26) | ((in[5 + inpos] & 255) << (14 - 8))) + + out[11 + outpos - 1]; + out[12 + outpos] = (((in[5 + inpos] >>> 8) & 16383)) + + out[12 + outpos - 1]; + out[13 + outpos] = ((in[5 + inpos] >>> 22) | ((in[6 + inpos] & 15) << (14 - 4))) + + out[13 + outpos - 1]; + out[14 + outpos] = (((in[6 + inpos] >>> 4) & 16383)) + + out[14 + outpos - 1]; + out[15 + outpos] = ((in[6 + inpos] >>> 18)) + + out[15 + outpos - 1]; + out[16 + outpos] = (((in[7 + inpos] >>> 0) & 16383)) + + out[16 + outpos - 1]; + out[17 + outpos] = (((in[7 + inpos] >>> 14) & 16383)) + + out[17 + outpos - 1]; + out[18 + outpos] = ((in[7 + inpos] >>> 28) | ((in[8 + inpos] & 1023) << (14 - 10))) + + out[18 + outpos - 1]; + out[19 + outpos] = (((in[8 + inpos] >>> 10) & 16383)) + + out[19 + outpos - 1]; + out[20 + outpos] = ((in[8 + inpos] >>> 24) | ((in[9 + inpos] & 63) << (14 - 6))) + + out[20 + outpos - 1]; + out[21 + outpos] = (((in[9 + inpos] >>> 6) & 16383)) + + out[21 + outpos - 1]; + out[22 + outpos] = ((in[9 + inpos] >>> 20) | ((in[10 + inpos] & 3) << (14 - 2))) + + out[22 + outpos - 1]; + out[23 + outpos] = (((in[10 + inpos] >>> 2) & 16383)) + + out[23 + outpos - 1]; + out[24 + outpos] = (((in[10 + inpos] >>> 16) & 16383)) + + out[24 + outpos - 1]; + out[25 + outpos] = ((in[10 + inpos] >>> 30) | ((in[11 + inpos] & 4095) << (14 - 12))) + + out[25 + outpos - 1]; + out[26 + outpos] = (((in[11 + inpos] >>> 12) & 16383)) + + out[26 + outpos - 1]; + out[27 + outpos] = ((in[11 + inpos] >>> 26) | ((in[12 + inpos] & 255) << (14 - 8))) + + out[27 + outpos - 1]; + out[28 + outpos] = (((in[12 + inpos] >>> 8) & 16383)) + + out[28 + outpos - 1]; + out[29 + outpos] = ((in[12 + inpos] >>> 22) | ((in[13 + inpos] & 15) << (14 - 4))) + + out[29 + outpos - 1]; + out[30 + outpos] = (((in[13 + inpos] >>> 4) & 16383)) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[13 + inpos] >>> 18)) + + out[31 + outpos - 1]; + } + protected static void integratedunpack15(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 32767)) + + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 15) & 32767)) + + out[1 + outpos - 1]; + out[2 + outpos] = ((in[0 + inpos] >>> 30) | ((in[1 + inpos] & 8191) << (15 - 13))) + + out[2 + outpos - 1]; + out[3 + outpos] = (((in[1 + inpos] >>> 13) & 32767)) + + out[3 + outpos - 1]; + out[4 + outpos] = ((in[1 + inpos] >>> 28) | ((in[2 + inpos] & 2047) << (15 - 11))) + + out[4 + outpos - 1]; + out[5 + outpos] = (((in[2 + inpos] >>> 11) & 32767)) + + out[5 + outpos - 1]; + out[6 + outpos] = ((in[2 + inpos] >>> 26) | ((in[3 + inpos] & 511) << (15 - 9))) + + out[6 + outpos - 1]; + out[7 + outpos] = (((in[3 + inpos] >>> 9) & 32767)) + + out[7 + outpos - 1]; + out[8 + outpos] = ((in[3 + inpos] >>> 24) | ((in[4 + inpos] & 127) << (15 - 7))) + + out[8 + outpos - 1]; + out[9 + outpos] = (((in[4 + inpos] >>> 7) & 32767)) + + out[9 + outpos - 1]; + out[10 + outpos] = ((in[4 + inpos] >>> 22) | ((in[5 + inpos] & 31) << (15 - 5))) + + out[10 + outpos - 1]; + out[11 + outpos] = (((in[5 + inpos] >>> 5) & 32767)) + + out[11 + outpos - 1]; + out[12 + outpos] = ((in[5 + inpos] >>> 20) | ((in[6 + inpos] & 7) << (15 - 3))) + + out[12 + outpos - 1]; + out[13 + outpos] = (((in[6 + inpos] >>> 3) & 32767)) + + out[13 + outpos - 1]; + out[14 + outpos] = ((in[6 + inpos] >>> 18) | ((in[7 + inpos] & 1) << (15 - 1))) + + out[14 + outpos - 1]; + out[15 + outpos] = (((in[7 + inpos] >>> 1) & 32767)) + + out[15 + outpos - 1]; + out[16 + outpos] = (((in[7 + inpos] >>> 16) & 32767)) + + out[16 + outpos - 1]; + out[17 + outpos] = ((in[7 + inpos] >>> 31) | ((in[8 + inpos] & 16383) << (15 - 14))) + + out[17 + outpos - 1]; + out[18 + outpos] = (((in[8 + inpos] >>> 14) & 32767)) + + out[18 + outpos - 1]; + out[19 + outpos] = ((in[8 + inpos] >>> 29) | ((in[9 + inpos] & 4095) << (15 - 12))) + + out[19 + outpos - 1]; + out[20 + outpos] = (((in[9 + inpos] >>> 12) & 32767)) + + out[20 + outpos - 1]; + out[21 + outpos] = ((in[9 + inpos] >>> 27) | ((in[10 + inpos] & 1023) << (15 - 10))) + + out[21 + outpos - 1]; + out[22 + outpos] = (((in[10 + inpos] >>> 10) & 32767)) + + out[22 + outpos - 1]; + out[23 + outpos] = ((in[10 + inpos] >>> 25) | ((in[11 + inpos] & 255) << (15 - 8))) + + out[23 + outpos - 1]; + out[24 + outpos] = (((in[11 + inpos] >>> 8) & 32767)) + + out[24 + outpos - 1]; + out[25 + outpos] = ((in[11 + inpos] >>> 23) | ((in[12 + inpos] & 63) << (15 - 6))) + + out[25 + outpos - 1]; + out[26 + outpos] = (((in[12 + inpos] >>> 6) & 32767)) + + out[26 + outpos - 1]; + out[27 + outpos] = ((in[12 + inpos] >>> 21) | ((in[13 + inpos] & 15) << (15 - 4))) + + out[27 + outpos - 1]; + out[28 + outpos] = (((in[13 + inpos] >>> 4) & 32767)) + + out[28 + outpos - 1]; + out[29 + outpos] = ((in[13 + inpos] >>> 19) | ((in[14 + inpos] & 3) << (15 - 2))) + + out[29 + outpos - 1]; + out[30 + outpos] = (((in[14 + inpos] >>> 2) & 32767)) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[14 + inpos] >>> 17)) + + out[31 + outpos - 1]; + } - protected static void integratedunpack27(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 134217727) - ) + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 27) - | ((in[1 + inpos] & 4194303) << (27 - 22)) - ) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[1 + inpos] >>> 22) - | ((in[2 + inpos] & 131071) << (27 - 17)) - ) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[2 + inpos] >>> 17) - | ((in[3 + inpos] & 4095) << (27 - 12)) - ) + out[3 + outpos - 1]; - out[4 + outpos] = ((in[3 + inpos] >>> 12) - | ((in[4 + inpos] & 127) << (27 - 7)) - ) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[4 + inpos] >>> 7) - | ((in[5 + inpos] & 3) << (27 - 2)) - ) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[5 + inpos] >>> 2) & 134217727) - ) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[5 + inpos] >>> 29) - | ((in[6 + inpos] & 16777215) << (27 - 24)) - ) + out[7 + outpos - 1]; - out[8 + outpos] = ((in[6 + inpos] >>> 24) - | ((in[7 + inpos] & 524287) << (27 - 19)) - ) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[7 + inpos] >>> 19) - | ((in[8 + inpos] & 16383) << (27 - 14)) - ) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[8 + inpos] >>> 14) - | ((in[9 + inpos] & 511) << (27 - 9)) - ) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[9 + inpos] >>> 9) - | ((in[10 + inpos] & 15) << (27 - 4)) - ) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[10 + inpos] >>> 4) & 134217727) - ) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[10 + inpos] >>> 31) - | ((in[11 + inpos] & 67108863) << (27 - 26)) - ) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[11 + inpos] >>> 26) - | ((in[12 + inpos] & 2097151) << (27 - 21)) - ) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[12 + inpos] >>> 21) - | ((in[13 + inpos] & 65535) << (27 - 16)) - ) + out[15 + outpos - 1]; - out[16 + outpos] = ((in[13 + inpos] >>> 16) - | ((in[14 + inpos] & 2047) << (27 - 11)) - ) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[14 + inpos] >>> 11) - | ((in[15 + inpos] & 63) << (27 - 6)) - ) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[15 + inpos] >>> 6) - | ((in[16 + inpos] & 1) << (27 - 1)) - ) + out[18 + outpos - 1]; - out[19 + outpos] = (((in[16 + inpos] >>> 1) & 134217727) - ) + out[19 + outpos - 1]; - out[20 + outpos] = ((in[16 + inpos] >>> 28) - | ((in[17 + inpos] & 8388607) << (27 - 23)) - ) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[17 + inpos] >>> 23) - | ((in[18 + inpos] & 262143) << (27 - 18)) - ) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[18 + inpos] >>> 18) - | ((in[19 + inpos] & 8191) << (27 - 13)) - ) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[19 + inpos] >>> 13) - | ((in[20 + inpos] & 255) << (27 - 8)) - ) + out[23 + outpos - 1]; - out[24 + outpos] = ((in[20 + inpos] >>> 8) - | ((in[21 + inpos] & 7) << (27 - 3)) - ) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[21 + inpos] >>> 3) & 134217727) - ) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[21 + inpos] >>> 30) - | ((in[22 + inpos] & 33554431) << (27 - 25)) - ) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[22 + inpos] >>> 25) - | ((in[23 + inpos] & 1048575) << (27 - 20)) - ) + out[27 + outpos - 1]; - out[28 + outpos] = ((in[23 + inpos] >>> 20) - | ((in[24 + inpos] & 32767) << (27 - 15)) - ) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[24 + inpos] >>> 15) - | ((in[25 + inpos] & 1023) << (27 - 10)) - ) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[25 + inpos] >>> 10) - | ((in[26 + inpos] & 31) << (27 - 5)) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[26 + inpos] >>> 5) - ) + out[31 + outpos - 1]; - } + protected static void integratedunpack16(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 65535)) + + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 16)) + + out[1 + outpos - 1]; + out[2 + outpos] = (((in[1 + inpos] >>> 0) & 65535)) + + out[2 + outpos - 1]; + out[3 + outpos] = ((in[1 + inpos] >>> 16)) + + out[3 + outpos - 1]; + out[4 + outpos] = (((in[2 + inpos] >>> 0) & 65535)) + + out[4 + outpos - 1]; + out[5 + outpos] = ((in[2 + inpos] >>> 16)) + + out[5 + outpos - 1]; + out[6 + outpos] = (((in[3 + inpos] >>> 0) & 65535)) + + out[6 + outpos - 1]; + out[7 + outpos] = ((in[3 + inpos] >>> 16)) + + out[7 + outpos - 1]; + out[8 + outpos] = (((in[4 + inpos] >>> 0) & 65535)) + + out[8 + outpos - 1]; + out[9 + outpos] = ((in[4 + inpos] >>> 16)) + + out[9 + outpos - 1]; + out[10 + outpos] = (((in[5 + inpos] >>> 0) & 65535)) + + out[10 + outpos - 1]; + out[11 + outpos] = ((in[5 + inpos] >>> 16)) + + out[11 + outpos - 1]; + out[12 + outpos] = (((in[6 + inpos] >>> 0) & 65535)) + + out[12 + outpos - 1]; + out[13 + outpos] = ((in[6 + inpos] >>> 16)) + + out[13 + outpos - 1]; + out[14 + outpos] = (((in[7 + inpos] >>> 0) & 65535)) + + out[14 + outpos - 1]; + out[15 + outpos] = ((in[7 + inpos] >>> 16)) + + out[15 + outpos - 1]; + out[16 + outpos] = (((in[8 + inpos] >>> 0) & 65535)) + + out[16 + outpos - 1]; + out[17 + outpos] = ((in[8 + inpos] >>> 16)) + + out[17 + outpos - 1]; + out[18 + outpos] = (((in[9 + inpos] >>> 0) & 65535)) + + out[18 + outpos - 1]; + out[19 + outpos] = ((in[9 + inpos] >>> 16)) + + out[19 + outpos - 1]; + out[20 + outpos] = (((in[10 + inpos] >>> 0) & 65535)) + + out[20 + outpos - 1]; + out[21 + outpos] = ((in[10 + inpos] >>> 16)) + + out[21 + outpos - 1]; + out[22 + outpos] = (((in[11 + inpos] >>> 0) & 65535)) + + out[22 + outpos - 1]; + out[23 + outpos] = ((in[11 + inpos] >>> 16)) + + out[23 + outpos - 1]; + out[24 + outpos] = (((in[12 + inpos] >>> 0) & 65535)) + + out[24 + outpos - 1]; + out[25 + outpos] = ((in[12 + inpos] >>> 16)) + + out[25 + outpos - 1]; + out[26 + outpos] = (((in[13 + inpos] >>> 0) & 65535)) + + out[26 + outpos - 1]; + out[27 + outpos] = ((in[13 + inpos] >>> 16)) + + out[27 + outpos - 1]; + out[28 + outpos] = (((in[14 + inpos] >>> 0) & 65535)) + + out[28 + outpos - 1]; + out[29 + outpos] = ((in[14 + inpos] >>> 16)) + + out[29 + outpos - 1]; + out[30 + outpos] = (((in[15 + inpos] >>> 0) & 65535)) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[15 + inpos] >>> 16)) + + out[31 + outpos - 1]; + } + protected static void integratedunpack17(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 131071)) + + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 17) | ((in[1 + inpos] & 3) << (17 - 2))) + + out[1 + outpos - 1]; + out[2 + outpos] = (((in[1 + inpos] >>> 2) & 131071)) + + out[2 + outpos - 1]; + out[3 + outpos] = ((in[1 + inpos] >>> 19) | ((in[2 + inpos] & 15) << (17 - 4))) + + out[3 + outpos - 1]; + out[4 + outpos] = (((in[2 + inpos] >>> 4) & 131071)) + + out[4 + outpos - 1]; + out[5 + outpos] = ((in[2 + inpos] >>> 21) | ((in[3 + inpos] & 63) << (17 - 6))) + + out[5 + outpos - 1]; + out[6 + outpos] = (((in[3 + inpos] >>> 6) & 131071)) + + out[6 + outpos - 1]; + out[7 + outpos] = ((in[3 + inpos] >>> 23) | ((in[4 + inpos] & 255) << (17 - 8))) + + out[7 + outpos - 1]; + out[8 + outpos] = (((in[4 + inpos] >>> 8) & 131071)) + + out[8 + outpos - 1]; + out[9 + outpos] = ((in[4 + inpos] >>> 25) | ((in[5 + inpos] & 1023) << (17 - 10))) + + out[9 + outpos - 1]; + out[10 + outpos] = (((in[5 + inpos] >>> 10) & 131071)) + + out[10 + outpos - 1]; + out[11 + outpos] = ((in[5 + inpos] >>> 27) | ((in[6 + inpos] & 4095) << (17 - 12))) + + out[11 + outpos - 1]; + out[12 + outpos] = (((in[6 + inpos] >>> 12) & 131071)) + + out[12 + outpos - 1]; + out[13 + outpos] = ((in[6 + inpos] >>> 29) | ((in[7 + inpos] & 16383) << (17 - 14))) + + out[13 + outpos - 1]; + out[14 + outpos] = (((in[7 + inpos] >>> 14) & 131071)) + + out[14 + outpos - 1]; + out[15 + outpos] = ((in[7 + inpos] >>> 31) | ((in[8 + inpos] & 65535) << (17 - 16))) + + out[15 + outpos - 1]; + out[16 + outpos] = ((in[8 + inpos] >>> 16) | ((in[9 + inpos] & 1) << (17 - 1))) + + out[16 + outpos - 1]; + out[17 + outpos] = (((in[9 + inpos] >>> 1) & 131071)) + + out[17 + outpos - 1]; + out[18 + outpos] = ((in[9 + inpos] >>> 18) | ((in[10 + inpos] & 7) << (17 - 3))) + + out[18 + outpos - 1]; + out[19 + outpos] = (((in[10 + inpos] >>> 3) & 131071)) + + out[19 + outpos - 1]; + out[20 + outpos] = ((in[10 + inpos] >>> 20) | ((in[11 + inpos] & 31) << (17 - 5))) + + out[20 + outpos - 1]; + out[21 + outpos] = (((in[11 + inpos] >>> 5) & 131071)) + + out[21 + outpos - 1]; + out[22 + outpos] = ((in[11 + inpos] >>> 22) | ((in[12 + inpos] & 127) << (17 - 7))) + + out[22 + outpos - 1]; + out[23 + outpos] = (((in[12 + inpos] >>> 7) & 131071)) + + out[23 + outpos - 1]; + out[24 + outpos] = ((in[12 + inpos] >>> 24) | ((in[13 + inpos] & 511) << (17 - 9))) + + out[24 + outpos - 1]; + out[25 + outpos] = (((in[13 + inpos] >>> 9) & 131071)) + + out[25 + outpos - 1]; + out[26 + outpos] = ((in[13 + inpos] >>> 26) | ((in[14 + inpos] & 2047) << (17 - 11))) + + out[26 + outpos - 1]; + out[27 + outpos] = (((in[14 + inpos] >>> 11) & 131071)) + + out[27 + outpos - 1]; + out[28 + outpos] = ((in[14 + inpos] >>> 28) | ((in[15 + inpos] & 8191) << (17 - 13))) + + out[28 + outpos - 1]; + out[29 + outpos] = (((in[15 + inpos] >>> 13) & 131071)) + + out[29 + outpos - 1]; + out[30 + outpos] = ((in[15 + inpos] >>> 30) | ((in[16 + inpos] & 32767) << (17 - 15))) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[16 + inpos] >>> 15)) + + out[31 + outpos - 1]; + } - protected static void integratedunpack28(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 268435455) - ) + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 28) - | ((in[1 + inpos] & 16777215) << (28 - 24)) - ) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[1 + inpos] >>> 24) - | ((in[2 + inpos] & 1048575) << (28 - 20)) - ) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[2 + inpos] >>> 20) - | ((in[3 + inpos] & 65535) << (28 - 16)) - ) + out[3 + outpos - 1]; - out[4 + outpos] = ((in[3 + inpos] >>> 16) - | ((in[4 + inpos] & 4095) << (28 - 12)) - ) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[4 + inpos] >>> 12) - | ((in[5 + inpos] & 255) << (28 - 8)) - ) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[5 + inpos] >>> 8) - | ((in[6 + inpos] & 15) << (28 - 4)) - ) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[6 + inpos] >>> 4) - ) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[7 + inpos] >>> 0) & 268435455) - ) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[7 + inpos] >>> 28) - | ((in[8 + inpos] & 16777215) << (28 - 24)) - ) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[8 + inpos] >>> 24) - | ((in[9 + inpos] & 1048575) << (28 - 20)) - ) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[9 + inpos] >>> 20) - | ((in[10 + inpos] & 65535) << (28 - 16)) - ) + out[11 + outpos - 1]; - out[12 + outpos] = ((in[10 + inpos] >>> 16) - | ((in[11 + inpos] & 4095) << (28 - 12)) - ) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[11 + inpos] >>> 12) - | ((in[12 + inpos] & 255) << (28 - 8)) - ) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[12 + inpos] >>> 8) - | ((in[13 + inpos] & 15) << (28 - 4)) - ) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[13 + inpos] >>> 4) - ) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[14 + inpos] >>> 0) & 268435455) - ) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[14 + inpos] >>> 28) - | ((in[15 + inpos] & 16777215) << (28 - 24)) - ) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[15 + inpos] >>> 24) - | ((in[16 + inpos] & 1048575) << (28 - 20)) - ) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[16 + inpos] >>> 20) - | ((in[17 + inpos] & 65535) << (28 - 16)) - ) + out[19 + outpos - 1]; - out[20 + outpos] = ((in[17 + inpos] >>> 16) - | ((in[18 + inpos] & 4095) << (28 - 12)) - ) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[18 + inpos] >>> 12) - | ((in[19 + inpos] & 255) << (28 - 8)) - ) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[19 + inpos] >>> 8) - | ((in[20 + inpos] & 15) << (28 - 4)) - ) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[20 + inpos] >>> 4) - ) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[21 + inpos] >>> 0) & 268435455) - ) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[21 + inpos] >>> 28) - | ((in[22 + inpos] & 16777215) << (28 - 24)) - ) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[22 + inpos] >>> 24) - | ((in[23 + inpos] & 1048575) << (28 - 20)) - ) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[23 + inpos] >>> 20) - | ((in[24 + inpos] & 65535) << (28 - 16)) - ) + out[27 + outpos - 1]; - out[28 + outpos] = ((in[24 + inpos] >>> 16) - | ((in[25 + inpos] & 4095) << (28 - 12)) - ) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[25 + inpos] >>> 12) - | ((in[26 + inpos] & 255) << (28 - 8)) - ) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[26 + inpos] >>> 8) - | ((in[27 + inpos] & 15) << (28 - 4)) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[27 + inpos] >>> 4) - ) + out[31 + outpos - 1]; - } + protected static void integratedunpack18(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 262143)) + + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 18) | ((in[1 + inpos] & 15) << (18 - 4))) + + out[1 + outpos - 1]; + out[2 + outpos] = (((in[1 + inpos] >>> 4) & 262143)) + + out[2 + outpos - 1]; + out[3 + outpos] = ((in[1 + inpos] >>> 22) | ((in[2 + inpos] & 255) << (18 - 8))) + + out[3 + outpos - 1]; + out[4 + outpos] = (((in[2 + inpos] >>> 8) & 262143)) + + out[4 + outpos - 1]; + out[5 + outpos] = ((in[2 + inpos] >>> 26) | ((in[3 + inpos] & 4095) << (18 - 12))) + + out[5 + outpos - 1]; + out[6 + outpos] = (((in[3 + inpos] >>> 12) & 262143)) + + out[6 + outpos - 1]; + out[7 + outpos] = ((in[3 + inpos] >>> 30) | ((in[4 + inpos] & 65535) << (18 - 16))) + + out[7 + outpos - 1]; + out[8 + outpos] = ((in[4 + inpos] >>> 16) | ((in[5 + inpos] & 3) << (18 - 2))) + + out[8 + outpos - 1]; + out[9 + outpos] = (((in[5 + inpos] >>> 2) & 262143)) + + out[9 + outpos - 1]; + out[10 + outpos] = ((in[5 + inpos] >>> 20) | ((in[6 + inpos] & 63) << (18 - 6))) + + out[10 + outpos - 1]; + out[11 + outpos] = (((in[6 + inpos] >>> 6) & 262143)) + + out[11 + outpos - 1]; + out[12 + outpos] = ((in[6 + inpos] >>> 24) | ((in[7 + inpos] & 1023) << (18 - 10))) + + out[12 + outpos - 1]; + out[13 + outpos] = (((in[7 + inpos] >>> 10) & 262143)) + + out[13 + outpos - 1]; + out[14 + outpos] = ((in[7 + inpos] >>> 28) | ((in[8 + inpos] & 16383) << (18 - 14))) + + out[14 + outpos - 1]; + out[15 + outpos] = ((in[8 + inpos] >>> 14)) + + out[15 + outpos - 1]; + out[16 + outpos] = (((in[9 + inpos] >>> 0) & 262143)) + + out[16 + outpos - 1]; + out[17 + outpos] = ((in[9 + inpos] >>> 18) | ((in[10 + inpos] & 15) << (18 - 4))) + + out[17 + outpos - 1]; + out[18 + outpos] = (((in[10 + inpos] >>> 4) & 262143)) + + out[18 + outpos - 1]; + out[19 + outpos] = ((in[10 + inpos] >>> 22) | ((in[11 + inpos] & 255) << (18 - 8))) + + out[19 + outpos - 1]; + out[20 + outpos] = (((in[11 + inpos] >>> 8) & 262143)) + + out[20 + outpos - 1]; + out[21 + outpos] = ((in[11 + inpos] >>> 26) | ((in[12 + inpos] & 4095) << (18 - 12))) + + out[21 + outpos - 1]; + out[22 + outpos] = (((in[12 + inpos] >>> 12) & 262143)) + + out[22 + outpos - 1]; + out[23 + outpos] = ((in[12 + inpos] >>> 30) | ((in[13 + inpos] & 65535) << (18 - 16))) + + out[23 + outpos - 1]; + out[24 + outpos] = ((in[13 + inpos] >>> 16) | ((in[14 + inpos] & 3) << (18 - 2))) + + out[24 + outpos - 1]; + out[25 + outpos] = (((in[14 + inpos] >>> 2) & 262143)) + + out[25 + outpos - 1]; + out[26 + outpos] = ((in[14 + inpos] >>> 20) | ((in[15 + inpos] & 63) << (18 - 6))) + + out[26 + outpos - 1]; + out[27 + outpos] = (((in[15 + inpos] >>> 6) & 262143)) + + out[27 + outpos - 1]; + out[28 + outpos] = ((in[15 + inpos] >>> 24) | ((in[16 + inpos] & 1023) << (18 - 10))) + + out[28 + outpos - 1]; + out[29 + outpos] = (((in[16 + inpos] >>> 10) & 262143)) + + out[29 + outpos - 1]; + out[30 + outpos] = ((in[16 + inpos] >>> 28) | ((in[17 + inpos] & 16383) << (18 - 14))) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[17 + inpos] >>> 14)) + + out[31 + outpos - 1]; + } + protected static void integratedunpack19(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 524287)) + + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 19) | ((in[1 + inpos] & 63) << (19 - 6))) + + out[1 + outpos - 1]; + out[2 + outpos] = (((in[1 + inpos] >>> 6) & 524287)) + + out[2 + outpos - 1]; + out[3 + outpos] = ((in[1 + inpos] >>> 25) | ((in[2 + inpos] & 4095) << (19 - 12))) + + out[3 + outpos - 1]; + out[4 + outpos] = (((in[2 + inpos] >>> 12) & 524287)) + + out[4 + outpos - 1]; + out[5 + outpos] = ((in[2 + inpos] >>> 31) | ((in[3 + inpos] & 262143) << (19 - 18))) + + out[5 + outpos - 1]; + out[6 + outpos] = ((in[3 + inpos] >>> 18) | ((in[4 + inpos] & 31) << (19 - 5))) + + out[6 + outpos - 1]; + out[7 + outpos] = (((in[4 + inpos] >>> 5) & 524287)) + + out[7 + outpos - 1]; + out[8 + outpos] = ((in[4 + inpos] >>> 24) | ((in[5 + inpos] & 2047) << (19 - 11))) + + out[8 + outpos - 1]; + out[9 + outpos] = (((in[5 + inpos] >>> 11) & 524287)) + + out[9 + outpos - 1]; + out[10 + outpos] = ((in[5 + inpos] >>> 30) | ((in[6 + inpos] & 131071) << (19 - 17))) + + out[10 + outpos - 1]; + out[11 + outpos] = ((in[6 + inpos] >>> 17) | ((in[7 + inpos] & 15) << (19 - 4))) + + out[11 + outpos - 1]; + out[12 + outpos] = (((in[7 + inpos] >>> 4) & 524287)) + + out[12 + outpos - 1]; + out[13 + outpos] = ((in[7 + inpos] >>> 23) | ((in[8 + inpos] & 1023) << (19 - 10))) + + out[13 + outpos - 1]; + out[14 + outpos] = (((in[8 + inpos] >>> 10) & 524287)) + + out[14 + outpos - 1]; + out[15 + outpos] = ((in[8 + inpos] >>> 29) | ((in[9 + inpos] & 65535) << (19 - 16))) + + out[15 + outpos - 1]; + out[16 + outpos] = ((in[9 + inpos] >>> 16) | ((in[10 + inpos] & 7) << (19 - 3))) + + out[16 + outpos - 1]; + out[17 + outpos] = (((in[10 + inpos] >>> 3) & 524287)) + + out[17 + outpos - 1]; + out[18 + outpos] = ((in[10 + inpos] >>> 22) | ((in[11 + inpos] & 511) << (19 - 9))) + + out[18 + outpos - 1]; + out[19 + outpos] = (((in[11 + inpos] >>> 9) & 524287)) + + out[19 + outpos - 1]; + out[20 + outpos] = ((in[11 + inpos] >>> 28) | ((in[12 + inpos] & 32767) << (19 - 15))) + + out[20 + outpos - 1]; + out[21 + outpos] = ((in[12 + inpos] >>> 15) | ((in[13 + inpos] & 3) << (19 - 2))) + + out[21 + outpos - 1]; + out[22 + outpos] = (((in[13 + inpos] >>> 2) & 524287)) + + out[22 + outpos - 1]; + out[23 + outpos] = ((in[13 + inpos] >>> 21) | ((in[14 + inpos] & 255) << (19 - 8))) + + out[23 + outpos - 1]; + out[24 + outpos] = (((in[14 + inpos] >>> 8) & 524287)) + + out[24 + outpos - 1]; + out[25 + outpos] = ((in[14 + inpos] >>> 27) | ((in[15 + inpos] & 16383) << (19 - 14))) + + out[25 + outpos - 1]; + out[26 + outpos] = ((in[15 + inpos] >>> 14) | ((in[16 + inpos] & 1) << (19 - 1))) + + out[26 + outpos - 1]; + out[27 + outpos] = (((in[16 + inpos] >>> 1) & 524287)) + + out[27 + outpos - 1]; + out[28 + outpos] = ((in[16 + inpos] >>> 20) | ((in[17 + inpos] & 127) << (19 - 7))) + + out[28 + outpos - 1]; + out[29 + outpos] = (((in[17 + inpos] >>> 7) & 524287)) + + out[29 + outpos - 1]; + out[30 + outpos] = ((in[17 + inpos] >>> 26) | ((in[18 + inpos] & 8191) << (19 - 13))) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[18 + inpos] >>> 13)) + + out[31 + outpos - 1]; + } - protected static void integratedunpack29(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 536870911) - ) + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 29) - | ((in[1 + inpos] & 67108863) << (29 - 26)) - ) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[1 + inpos] >>> 26) - | ((in[2 + inpos] & 8388607) << (29 - 23)) - ) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[2 + inpos] >>> 23) - | ((in[3 + inpos] & 1048575) << (29 - 20)) - ) + out[3 + outpos - 1]; - out[4 + outpos] = ((in[3 + inpos] >>> 20) - | ((in[4 + inpos] & 131071) << (29 - 17)) - ) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[4 + inpos] >>> 17) - | ((in[5 + inpos] & 16383) << (29 - 14)) - ) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[5 + inpos] >>> 14) - | ((in[6 + inpos] & 2047) << (29 - 11)) - ) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[6 + inpos] >>> 11) - | ((in[7 + inpos] & 255) << (29 - 8)) - ) + out[7 + outpos - 1]; - out[8 + outpos] = ((in[7 + inpos] >>> 8) - | ((in[8 + inpos] & 31) << (29 - 5)) - ) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[8 + inpos] >>> 5) - | ((in[9 + inpos] & 3) << (29 - 2)) - ) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[9 + inpos] >>> 2) & 536870911) - ) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[9 + inpos] >>> 31) - | ((in[10 + inpos] & 268435455) << (29 - 28)) - ) + out[11 + outpos - 1]; - out[12 + outpos] = ((in[10 + inpos] >>> 28) - | ((in[11 + inpos] & 33554431) << (29 - 25)) - ) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[11 + inpos] >>> 25) - | ((in[12 + inpos] & 4194303) << (29 - 22)) - ) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[12 + inpos] >>> 22) - | ((in[13 + inpos] & 524287) << (29 - 19)) - ) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[13 + inpos] >>> 19) - | ((in[14 + inpos] & 65535) << (29 - 16)) - ) + out[15 + outpos - 1]; - out[16 + outpos] = ((in[14 + inpos] >>> 16) - | ((in[15 + inpos] & 8191) << (29 - 13)) - ) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[15 + inpos] >>> 13) - | ((in[16 + inpos] & 1023) << (29 - 10)) - ) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[16 + inpos] >>> 10) - | ((in[17 + inpos] & 127) << (29 - 7)) - ) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[17 + inpos] >>> 7) - | ((in[18 + inpos] & 15) << (29 - 4)) - ) + out[19 + outpos - 1]; - out[20 + outpos] = ((in[18 + inpos] >>> 4) - | ((in[19 + inpos] & 1) << (29 - 1)) - ) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[19 + inpos] >>> 1) & 536870911) - ) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[19 + inpos] >>> 30) - | ((in[20 + inpos] & 134217727) << (29 - 27)) - ) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[20 + inpos] >>> 27) - | ((in[21 + inpos] & 16777215) << (29 - 24)) - ) + out[23 + outpos - 1]; - out[24 + outpos] = ((in[21 + inpos] >>> 24) - | ((in[22 + inpos] & 2097151) << (29 - 21)) - ) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[22 + inpos] >>> 21) - | ((in[23 + inpos] & 262143) << (29 - 18)) - ) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[23 + inpos] >>> 18) - | ((in[24 + inpos] & 32767) << (29 - 15)) - ) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[24 + inpos] >>> 15) - | ((in[25 + inpos] & 4095) << (29 - 12)) - ) + out[27 + outpos - 1]; - out[28 + outpos] = ((in[25 + inpos] >>> 12) - | ((in[26 + inpos] & 511) << (29 - 9)) - ) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[26 + inpos] >>> 9) - | ((in[27 + inpos] & 63) << (29 - 6)) - ) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[27 + inpos] >>> 6) - | ((in[28 + inpos] & 7) << (29 - 3)) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[28 + inpos] >>> 3) - ) + out[31 + outpos - 1]; - } + protected static void integratedunpack20(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 1048575)) + + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 20) | ((in[1 + inpos] & 255) << (20 - 8))) + + out[1 + outpos - 1]; + out[2 + outpos] = (((in[1 + inpos] >>> 8) & 1048575)) + + out[2 + outpos - 1]; + out[3 + outpos] = ((in[1 + inpos] >>> 28) | ((in[2 + inpos] & 65535) << (20 - 16))) + + out[3 + outpos - 1]; + out[4 + outpos] = ((in[2 + inpos] >>> 16) | ((in[3 + inpos] & 15) << (20 - 4))) + + out[4 + outpos - 1]; + out[5 + outpos] = (((in[3 + inpos] >>> 4) & 1048575)) + + out[5 + outpos - 1]; + out[6 + outpos] = ((in[3 + inpos] >>> 24) | ((in[4 + inpos] & 4095) << (20 - 12))) + + out[6 + outpos - 1]; + out[7 + outpos] = ((in[4 + inpos] >>> 12)) + + out[7 + outpos - 1]; + out[8 + outpos] = (((in[5 + inpos] >>> 0) & 1048575)) + + out[8 + outpos - 1]; + out[9 + outpos] = ((in[5 + inpos] >>> 20) | ((in[6 + inpos] & 255) << (20 - 8))) + + out[9 + outpos - 1]; + out[10 + outpos] = (((in[6 + inpos] >>> 8) & 1048575)) + + out[10 + outpos - 1]; + out[11 + outpos] = ((in[6 + inpos] >>> 28) | ((in[7 + inpos] & 65535) << (20 - 16))) + + out[11 + outpos - 1]; + out[12 + outpos] = ((in[7 + inpos] >>> 16) | ((in[8 + inpos] & 15) << (20 - 4))) + + out[12 + outpos - 1]; + out[13 + outpos] = (((in[8 + inpos] >>> 4) & 1048575)) + + out[13 + outpos - 1]; + out[14 + outpos] = ((in[8 + inpos] >>> 24) | ((in[9 + inpos] & 4095) << (20 - 12))) + + out[14 + outpos - 1]; + out[15 + outpos] = ((in[9 + inpos] >>> 12)) + + out[15 + outpos - 1]; + out[16 + outpos] = (((in[10 + inpos] >>> 0) & 1048575)) + + out[16 + outpos - 1]; + out[17 + outpos] = ((in[10 + inpos] >>> 20) | ((in[11 + inpos] & 255) << (20 - 8))) + + out[17 + outpos - 1]; + out[18 + outpos] = (((in[11 + inpos] >>> 8) & 1048575)) + + out[18 + outpos - 1]; + out[19 + outpos] = ((in[11 + inpos] >>> 28) | ((in[12 + inpos] & 65535) << (20 - 16))) + + out[19 + outpos - 1]; + out[20 + outpos] = ((in[12 + inpos] >>> 16) | ((in[13 + inpos] & 15) << (20 - 4))) + + out[20 + outpos - 1]; + out[21 + outpos] = (((in[13 + inpos] >>> 4) & 1048575)) + + out[21 + outpos - 1]; + out[22 + outpos] = ((in[13 + inpos] >>> 24) | ((in[14 + inpos] & 4095) << (20 - 12))) + + out[22 + outpos - 1]; + out[23 + outpos] = ((in[14 + inpos] >>> 12)) + + out[23 + outpos - 1]; + out[24 + outpos] = (((in[15 + inpos] >>> 0) & 1048575)) + + out[24 + outpos - 1]; + out[25 + outpos] = ((in[15 + inpos] >>> 20) | ((in[16 + inpos] & 255) << (20 - 8))) + + out[25 + outpos - 1]; + out[26 + outpos] = (((in[16 + inpos] >>> 8) & 1048575)) + + out[26 + outpos - 1]; + out[27 + outpos] = ((in[16 + inpos] >>> 28) | ((in[17 + inpos] & 65535) << (20 - 16))) + + out[27 + outpos - 1]; + out[28 + outpos] = ((in[17 + inpos] >>> 16) | ((in[18 + inpos] & 15) << (20 - 4))) + + out[28 + outpos - 1]; + out[29 + outpos] = (((in[18 + inpos] >>> 4) & 1048575)) + + out[29 + outpos - 1]; + out[30 + outpos] = ((in[18 + inpos] >>> 24) | ((in[19 + inpos] & 4095) << (20 - 12))) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[19 + inpos] >>> 12)) + + out[31 + outpos - 1]; + } + protected static void integratedunpack21(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 2097151)) + + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 21) | ((in[1 + inpos] & 1023) << (21 - 10))) + + out[1 + outpos - 1]; + out[2 + outpos] = (((in[1 + inpos] >>> 10) & 2097151)) + + out[2 + outpos - 1]; + out[3 + outpos] = ((in[1 + inpos] >>> 31) | ((in[2 + inpos] & 1048575) << (21 - 20))) + + out[3 + outpos - 1]; + out[4 + outpos] = ((in[2 + inpos] >>> 20) | ((in[3 + inpos] & 511) << (21 - 9))) + + out[4 + outpos - 1]; + out[5 + outpos] = (((in[3 + inpos] >>> 9) & 2097151)) + + out[5 + outpos - 1]; + out[6 + outpos] = ((in[3 + inpos] >>> 30) | ((in[4 + inpos] & 524287) << (21 - 19))) + + out[6 + outpos - 1]; + out[7 + outpos] = ((in[4 + inpos] >>> 19) | ((in[5 + inpos] & 255) << (21 - 8))) + + out[7 + outpos - 1]; + out[8 + outpos] = (((in[5 + inpos] >>> 8) & 2097151)) + + out[8 + outpos - 1]; + out[9 + outpos] = ((in[5 + inpos] >>> 29) | ((in[6 + inpos] & 262143) << (21 - 18))) + + out[9 + outpos - 1]; + out[10 + outpos] = ((in[6 + inpos] >>> 18) | ((in[7 + inpos] & 127) << (21 - 7))) + + out[10 + outpos - 1]; + out[11 + outpos] = (((in[7 + inpos] >>> 7) & 2097151)) + + out[11 + outpos - 1]; + out[12 + outpos] = ((in[7 + inpos] >>> 28) | ((in[8 + inpos] & 131071) << (21 - 17))) + + out[12 + outpos - 1]; + out[13 + outpos] = ((in[8 + inpos] >>> 17) | ((in[9 + inpos] & 63) << (21 - 6))) + + out[13 + outpos - 1]; + out[14 + outpos] = (((in[9 + inpos] >>> 6) & 2097151)) + + out[14 + outpos - 1]; + out[15 + outpos] = ((in[9 + inpos] >>> 27) | ((in[10 + inpos] & 65535) << (21 - 16))) + + out[15 + outpos - 1]; + out[16 + outpos] = ((in[10 + inpos] >>> 16) | ((in[11 + inpos] & 31) << (21 - 5))) + + out[16 + outpos - 1]; + out[17 + outpos] = (((in[11 + inpos] >>> 5) & 2097151)) + + out[17 + outpos - 1]; + out[18 + outpos] = ((in[11 + inpos] >>> 26) | ((in[12 + inpos] & 32767) << (21 - 15))) + + out[18 + outpos - 1]; + out[19 + outpos] = ((in[12 + inpos] >>> 15) | ((in[13 + inpos] & 15) << (21 - 4))) + + out[19 + outpos - 1]; + out[20 + outpos] = (((in[13 + inpos] >>> 4) & 2097151)) + + out[20 + outpos - 1]; + out[21 + outpos] = ((in[13 + inpos] >>> 25) | ((in[14 + inpos] & 16383) << (21 - 14))) + + out[21 + outpos - 1]; + out[22 + outpos] = ((in[14 + inpos] >>> 14) | ((in[15 + inpos] & 7) << (21 - 3))) + + out[22 + outpos - 1]; + out[23 + outpos] = (((in[15 + inpos] >>> 3) & 2097151)) + + out[23 + outpos - 1]; + out[24 + outpos] = ((in[15 + inpos] >>> 24) | ((in[16 + inpos] & 8191) << (21 - 13))) + + out[24 + outpos - 1]; + out[25 + outpos] = ((in[16 + inpos] >>> 13) | ((in[17 + inpos] & 3) << (21 - 2))) + + out[25 + outpos - 1]; + out[26 + outpos] = (((in[17 + inpos] >>> 2) & 2097151)) + + out[26 + outpos - 1]; + out[27 + outpos] = ((in[17 + inpos] >>> 23) | ((in[18 + inpos] & 4095) << (21 - 12))) + + out[27 + outpos - 1]; + out[28 + outpos] = ((in[18 + inpos] >>> 12) | ((in[19 + inpos] & 1) << (21 - 1))) + + out[28 + outpos - 1]; + out[29 + outpos] = (((in[19 + inpos] >>> 1) & 2097151)) + + out[29 + outpos - 1]; + out[30 + outpos] = ((in[19 + inpos] >>> 22) | ((in[20 + inpos] & 2047) << (21 - 11))) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[20 + inpos] >>> 11)) + + out[31 + outpos - 1]; + } - protected static void integratedunpack30(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 1073741823) - ) + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 30) - | ((in[1 + inpos] & 268435455) << (30 - 28)) - ) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[1 + inpos] >>> 28) - | ((in[2 + inpos] & 67108863) << (30 - 26)) - ) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[2 + inpos] >>> 26) - | ((in[3 + inpos] & 16777215) << (30 - 24)) - ) + out[3 + outpos - 1]; - out[4 + outpos] = ((in[3 + inpos] >>> 24) - | ((in[4 + inpos] & 4194303) << (30 - 22)) - ) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[4 + inpos] >>> 22) - | ((in[5 + inpos] & 1048575) << (30 - 20)) - ) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[5 + inpos] >>> 20) - | ((in[6 + inpos] & 262143) << (30 - 18)) - ) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[6 + inpos] >>> 18) - | ((in[7 + inpos] & 65535) << (30 - 16)) - ) + out[7 + outpos - 1]; - out[8 + outpos] = ((in[7 + inpos] >>> 16) - | ((in[8 + inpos] & 16383) << (30 - 14)) - ) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[8 + inpos] >>> 14) - | ((in[9 + inpos] & 4095) << (30 - 12)) - ) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[9 + inpos] >>> 12) - | ((in[10 + inpos] & 1023) << (30 - 10)) - ) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[10 + inpos] >>> 10) - | ((in[11 + inpos] & 255) << (30 - 8)) - ) + out[11 + outpos - 1]; - out[12 + outpos] = ((in[11 + inpos] >>> 8) - | ((in[12 + inpos] & 63) << (30 - 6)) - ) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[12 + inpos] >>> 6) - | ((in[13 + inpos] & 15) << (30 - 4)) - ) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[13 + inpos] >>> 4) - | ((in[14 + inpos] & 3) << (30 - 2)) - ) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[14 + inpos] >>> 2) - ) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[15 + inpos] >>> 0) & 1073741823) - ) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[15 + inpos] >>> 30) - | ((in[16 + inpos] & 268435455) << (30 - 28)) - ) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[16 + inpos] >>> 28) - | ((in[17 + inpos] & 67108863) << (30 - 26)) - ) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[17 + inpos] >>> 26) - | ((in[18 + inpos] & 16777215) << (30 - 24)) - ) + out[19 + outpos - 1]; - out[20 + outpos] = ((in[18 + inpos] >>> 24) - | ((in[19 + inpos] & 4194303) << (30 - 22)) - ) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[19 + inpos] >>> 22) - | ((in[20 + inpos] & 1048575) << (30 - 20)) - ) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[20 + inpos] >>> 20) - | ((in[21 + inpos] & 262143) << (30 - 18)) - ) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[21 + inpos] >>> 18) - | ((in[22 + inpos] & 65535) << (30 - 16)) - ) + out[23 + outpos - 1]; - out[24 + outpos] = ((in[22 + inpos] >>> 16) - | ((in[23 + inpos] & 16383) << (30 - 14)) - ) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[23 + inpos] >>> 14) - | ((in[24 + inpos] & 4095) << (30 - 12)) - ) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[24 + inpos] >>> 12) - | ((in[25 + inpos] & 1023) << (30 - 10)) - ) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[25 + inpos] >>> 10) - | ((in[26 + inpos] & 255) << (30 - 8)) - ) + out[27 + outpos - 1]; - out[28 + outpos] = ((in[26 + inpos] >>> 8) - | ((in[27 + inpos] & 63) << (30 - 6)) - ) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[27 + inpos] >>> 6) - | ((in[28 + inpos] & 15) << (30 - 4)) - ) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[28 + inpos] >>> 4) - | ((in[29 + inpos] & 3) << (30 - 2)) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[29 + inpos] >>> 2) - ) + out[31 + outpos - 1]; - } + protected static void integratedunpack22(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 4194303)) + + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 22) | ((in[1 + inpos] & 4095) << (22 - 12))) + + out[1 + outpos - 1]; + out[2 + outpos] = ((in[1 + inpos] >>> 12) | ((in[2 + inpos] & 3) << (22 - 2))) + + out[2 + outpos - 1]; + out[3 + outpos] = (((in[2 + inpos] >>> 2) & 4194303)) + + out[3 + outpos - 1]; + out[4 + outpos] = ((in[2 + inpos] >>> 24) | ((in[3 + inpos] & 16383) << (22 - 14))) + + out[4 + outpos - 1]; + out[5 + outpos] = ((in[3 + inpos] >>> 14) | ((in[4 + inpos] & 15) << (22 - 4))) + + out[5 + outpos - 1]; + out[6 + outpos] = (((in[4 + inpos] >>> 4) & 4194303)) + + out[6 + outpos - 1]; + out[7 + outpos] = ((in[4 + inpos] >>> 26) | ((in[5 + inpos] & 65535) << (22 - 16))) + + out[7 + outpos - 1]; + out[8 + outpos] = ((in[5 + inpos] >>> 16) | ((in[6 + inpos] & 63) << (22 - 6))) + + out[8 + outpos - 1]; + out[9 + outpos] = (((in[6 + inpos] >>> 6) & 4194303)) + + out[9 + outpos - 1]; + out[10 + outpos] = ((in[6 + inpos] >>> 28) | ((in[7 + inpos] & 262143) << (22 - 18))) + + out[10 + outpos - 1]; + out[11 + outpos] = ((in[7 + inpos] >>> 18) | ((in[8 + inpos] & 255) << (22 - 8))) + + out[11 + outpos - 1]; + out[12 + outpos] = (((in[8 + inpos] >>> 8) & 4194303)) + + out[12 + outpos - 1]; + out[13 + outpos] = ((in[8 + inpos] >>> 30) | ((in[9 + inpos] & 1048575) << (22 - 20))) + + out[13 + outpos - 1]; + out[14 + outpos] = ((in[9 + inpos] >>> 20) | ((in[10 + inpos] & 1023) << (22 - 10))) + + out[14 + outpos - 1]; + out[15 + outpos] = ((in[10 + inpos] >>> 10)) + + out[15 + outpos - 1]; + out[16 + outpos] = (((in[11 + inpos] >>> 0) & 4194303)) + + out[16 + outpos - 1]; + out[17 + outpos] = ((in[11 + inpos] >>> 22) | ((in[12 + inpos] & 4095) << (22 - 12))) + + out[17 + outpos - 1]; + out[18 + outpos] = ((in[12 + inpos] >>> 12) | ((in[13 + inpos] & 3) << (22 - 2))) + + out[18 + outpos - 1]; + out[19 + outpos] = (((in[13 + inpos] >>> 2) & 4194303)) + + out[19 + outpos - 1]; + out[20 + outpos] = ((in[13 + inpos] >>> 24) | ((in[14 + inpos] & 16383) << (22 - 14))) + + out[20 + outpos - 1]; + out[21 + outpos] = ((in[14 + inpos] >>> 14) | ((in[15 + inpos] & 15) << (22 - 4))) + + out[21 + outpos - 1]; + out[22 + outpos] = (((in[15 + inpos] >>> 4) & 4194303)) + + out[22 + outpos - 1]; + out[23 + outpos] = ((in[15 + inpos] >>> 26) | ((in[16 + inpos] & 65535) << (22 - 16))) + + out[23 + outpos - 1]; + out[24 + outpos] = ((in[16 + inpos] >>> 16) | ((in[17 + inpos] & 63) << (22 - 6))) + + out[24 + outpos - 1]; + out[25 + outpos] = (((in[17 + inpos] >>> 6) & 4194303)) + + out[25 + outpos - 1]; + out[26 + outpos] = ((in[17 + inpos] >>> 28) | ((in[18 + inpos] & 262143) << (22 - 18))) + + out[26 + outpos - 1]; + out[27 + outpos] = ((in[18 + inpos] >>> 18) | ((in[19 + inpos] & 255) << (22 - 8))) + + out[27 + outpos - 1]; + out[28 + outpos] = (((in[19 + inpos] >>> 8) & 4194303)) + + out[28 + outpos - 1]; + out[29 + outpos] = ((in[19 + inpos] >>> 30) | ((in[20 + inpos] & 1048575) << (22 - 20))) + + out[29 + outpos - 1]; + out[30 + outpos] = ((in[20 + inpos] >>> 20) | ((in[21 + inpos] & 1023) << (22 - 10))) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[21 + inpos] >>> 10)) + + out[31 + outpos - 1]; + } + protected static void integratedunpack23(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 8388607)) + + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 23) | ((in[1 + inpos] & 16383) << (23 - 14))) + + out[1 + outpos - 1]; + out[2 + outpos] = ((in[1 + inpos] >>> 14) | ((in[2 + inpos] & 31) << (23 - 5))) + + out[2 + outpos - 1]; + out[3 + outpos] = (((in[2 + inpos] >>> 5) & 8388607)) + + out[3 + outpos - 1]; + out[4 + outpos] = ((in[2 + inpos] >>> 28) | ((in[3 + inpos] & 524287) << (23 - 19))) + + out[4 + outpos - 1]; + out[5 + outpos] = ((in[3 + inpos] >>> 19) | ((in[4 + inpos] & 1023) << (23 - 10))) + + out[5 + outpos - 1]; + out[6 + outpos] = ((in[4 + inpos] >>> 10) | ((in[5 + inpos] & 1) << (23 - 1))) + + out[6 + outpos - 1]; + out[7 + outpos] = (((in[5 + inpos] >>> 1) & 8388607)) + + out[7 + outpos - 1]; + out[8 + outpos] = ((in[5 + inpos] >>> 24) | ((in[6 + inpos] & 32767) << (23 - 15))) + + out[8 + outpos - 1]; + out[9 + outpos] = ((in[6 + inpos] >>> 15) | ((in[7 + inpos] & 63) << (23 - 6))) + + out[9 + outpos - 1]; + out[10 + outpos] = (((in[7 + inpos] >>> 6) & 8388607)) + + out[10 + outpos - 1]; + out[11 + outpos] = ((in[7 + inpos] >>> 29) | ((in[8 + inpos] & 1048575) << (23 - 20))) + + out[11 + outpos - 1]; + out[12 + outpos] = ((in[8 + inpos] >>> 20) | ((in[9 + inpos] & 2047) << (23 - 11))) + + out[12 + outpos - 1]; + out[13 + outpos] = ((in[9 + inpos] >>> 11) | ((in[10 + inpos] & 3) << (23 - 2))) + + out[13 + outpos - 1]; + out[14 + outpos] = (((in[10 + inpos] >>> 2) & 8388607)) + + out[14 + outpos - 1]; + out[15 + outpos] = ((in[10 + inpos] >>> 25) | ((in[11 + inpos] & 65535) << (23 - 16))) + + out[15 + outpos - 1]; + out[16 + outpos] = ((in[11 + inpos] >>> 16) | ((in[12 + inpos] & 127) << (23 - 7))) + + out[16 + outpos - 1]; + out[17 + outpos] = (((in[12 + inpos] >>> 7) & 8388607)) + + out[17 + outpos - 1]; + out[18 + outpos] = ((in[12 + inpos] >>> 30) | ((in[13 + inpos] & 2097151) << (23 - 21))) + + out[18 + outpos - 1]; + out[19 + outpos] = ((in[13 + inpos] >>> 21) | ((in[14 + inpos] & 4095) << (23 - 12))) + + out[19 + outpos - 1]; + out[20 + outpos] = ((in[14 + inpos] >>> 12) | ((in[15 + inpos] & 7) << (23 - 3))) + + out[20 + outpos - 1]; + out[21 + outpos] = (((in[15 + inpos] >>> 3) & 8388607)) + + out[21 + outpos - 1]; + out[22 + outpos] = ((in[15 + inpos] >>> 26) | ((in[16 + inpos] & 131071) << (23 - 17))) + + out[22 + outpos - 1]; + out[23 + outpos] = ((in[16 + inpos] >>> 17) | ((in[17 + inpos] & 255) << (23 - 8))) + + out[23 + outpos - 1]; + out[24 + outpos] = (((in[17 + inpos] >>> 8) & 8388607)) + + out[24 + outpos - 1]; + out[25 + outpos] = ((in[17 + inpos] >>> 31) | ((in[18 + inpos] & 4194303) << (23 - 22))) + + out[25 + outpos - 1]; + out[26 + outpos] = ((in[18 + inpos] >>> 22) | ((in[19 + inpos] & 8191) << (23 - 13))) + + out[26 + outpos - 1]; + out[27 + outpos] = ((in[19 + inpos] >>> 13) | ((in[20 + inpos] & 15) << (23 - 4))) + + out[27 + outpos - 1]; + out[28 + outpos] = (((in[20 + inpos] >>> 4) & 8388607)) + + out[28 + outpos - 1]; + out[29 + outpos] = ((in[20 + inpos] >>> 27) | ((in[21 + inpos] & 262143) << (23 - 18))) + + out[29 + outpos - 1]; + out[30 + outpos] = ((in[21 + inpos] >>> 18) | ((in[22 + inpos] & 511) << (23 - 9))) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[22 + inpos] >>> 9)) + + out[31 + outpos - 1]; + } - protected static void integratedunpack31(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 2147483647) - ) + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 31) - | ((in[1 + inpos] & 1073741823) << (31 - 30)) - ) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[1 + inpos] >>> 30) - | ((in[2 + inpos] & 536870911) << (31 - 29)) - ) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[2 + inpos] >>> 29) - | ((in[3 + inpos] & 268435455) << (31 - 28)) - ) + out[3 + outpos - 1]; - out[4 + outpos] = ((in[3 + inpos] >>> 28) - | ((in[4 + inpos] & 134217727) << (31 - 27)) - ) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[4 + inpos] >>> 27) - | ((in[5 + inpos] & 67108863) << (31 - 26)) - ) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[5 + inpos] >>> 26) - | ((in[6 + inpos] & 33554431) << (31 - 25)) - ) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[6 + inpos] >>> 25) - | ((in[7 + inpos] & 16777215) << (31 - 24)) - ) + out[7 + outpos - 1]; - out[8 + outpos] = ((in[7 + inpos] >>> 24) - | ((in[8 + inpos] & 8388607) << (31 - 23)) - ) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[8 + inpos] >>> 23) - | ((in[9 + inpos] & 4194303) << (31 - 22)) - ) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[9 + inpos] >>> 22) - | ((in[10 + inpos] & 2097151) << (31 - 21)) - ) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[10 + inpos] >>> 21) - | ((in[11 + inpos] & 1048575) << (31 - 20)) - ) + out[11 + outpos - 1]; - out[12 + outpos] = ((in[11 + inpos] >>> 20) - | ((in[12 + inpos] & 524287) << (31 - 19)) - ) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[12 + inpos] >>> 19) - | ((in[13 + inpos] & 262143) << (31 - 18)) - ) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[13 + inpos] >>> 18) - | ((in[14 + inpos] & 131071) << (31 - 17)) - ) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[14 + inpos] >>> 17) - | ((in[15 + inpos] & 65535) << (31 - 16)) - ) + out[15 + outpos - 1]; - out[16 + outpos] = ((in[15 + inpos] >>> 16) - | ((in[16 + inpos] & 32767) << (31 - 15)) - ) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[16 + inpos] >>> 15) - | ((in[17 + inpos] & 16383) << (31 - 14)) - ) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[17 + inpos] >>> 14) - | ((in[18 + inpos] & 8191) << (31 - 13)) - ) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[18 + inpos] >>> 13) - | ((in[19 + inpos] & 4095) << (31 - 12)) - ) + out[19 + outpos - 1]; - out[20 + outpos] = ((in[19 + inpos] >>> 12) - | ((in[20 + inpos] & 2047) << (31 - 11)) - ) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[20 + inpos] >>> 11) - | ((in[21 + inpos] & 1023) << (31 - 10)) - ) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[21 + inpos] >>> 10) - | ((in[22 + inpos] & 511) << (31 - 9)) - ) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[22 + inpos] >>> 9) - | ((in[23 + inpos] & 255) << (31 - 8)) - ) + out[23 + outpos - 1]; - out[24 + outpos] = ((in[23 + inpos] >>> 8) - | ((in[24 + inpos] & 127) << (31 - 7)) - ) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[24 + inpos] >>> 7) - | ((in[25 + inpos] & 63) << (31 - 6)) - ) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[25 + inpos] >>> 6) - | ((in[26 + inpos] & 31) << (31 - 5)) - ) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[26 + inpos] >>> 5) - | ((in[27 + inpos] & 15) << (31 - 4)) - ) + out[27 + outpos - 1]; - out[28 + outpos] = ((in[27 + inpos] >>> 4) - | ((in[28 + inpos] & 7) << (31 - 3)) - ) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[28 + inpos] >>> 3) - | ((in[29 + inpos] & 3) << (31 - 2)) - ) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[29 + inpos] >>> 2) - | ((in[30 + inpos] & 1) << (31 - 1)) - ) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[30 + inpos] >>> 1) - ) + out[31 + outpos - 1]; - } + protected static void integratedunpack24(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 16777215)) + + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 24) | ((in[1 + inpos] & 65535) << (24 - 16))) + + out[1 + outpos - 1]; + out[2 + outpos] = ((in[1 + inpos] >>> 16) | ((in[2 + inpos] & 255) << (24 - 8))) + + out[2 + outpos - 1]; + out[3 + outpos] = ((in[2 + inpos] >>> 8)) + out[3 + outpos - 1]; + out[4 + outpos] = (((in[3 + inpos] >>> 0) & 16777215)) + + out[4 + outpos - 1]; + out[5 + outpos] = ((in[3 + inpos] >>> 24) | ((in[4 + inpos] & 65535) << (24 - 16))) + + out[5 + outpos - 1]; + out[6 + outpos] = ((in[4 + inpos] >>> 16) | ((in[5 + inpos] & 255) << (24 - 8))) + + out[6 + outpos - 1]; + out[7 + outpos] = ((in[5 + inpos] >>> 8)) + out[7 + outpos - 1]; + out[8 + outpos] = (((in[6 + inpos] >>> 0) & 16777215)) + + out[8 + outpos - 1]; + out[9 + outpos] = ((in[6 + inpos] >>> 24) | ((in[7 + inpos] & 65535) << (24 - 16))) + + out[9 + outpos - 1]; + out[10 + outpos] = ((in[7 + inpos] >>> 16) | ((in[8 + inpos] & 255) << (24 - 8))) + + out[10 + outpos - 1]; + out[11 + outpos] = ((in[8 + inpos] >>> 8)) + + out[11 + outpos - 1]; + out[12 + outpos] = (((in[9 + inpos] >>> 0) & 16777215)) + + out[12 + outpos - 1]; + out[13 + outpos] = ((in[9 + inpos] >>> 24) | ((in[10 + inpos] & 65535) << (24 - 16))) + + out[13 + outpos - 1]; + out[14 + outpos] = ((in[10 + inpos] >>> 16) | ((in[11 + inpos] & 255) << (24 - 8))) + + out[14 + outpos - 1]; + out[15 + outpos] = ((in[11 + inpos] >>> 8)) + + out[15 + outpos - 1]; + out[16 + outpos] = (((in[12 + inpos] >>> 0) & 16777215)) + + out[16 + outpos - 1]; + out[17 + outpos] = ((in[12 + inpos] >>> 24) | ((in[13 + inpos] & 65535) << (24 - 16))) + + out[17 + outpos - 1]; + out[18 + outpos] = ((in[13 + inpos] >>> 16) | ((in[14 + inpos] & 255) << (24 - 8))) + + out[18 + outpos - 1]; + out[19 + outpos] = ((in[14 + inpos] >>> 8)) + + out[19 + outpos - 1]; + out[20 + outpos] = (((in[15 + inpos] >>> 0) & 16777215)) + + out[20 + outpos - 1]; + out[21 + outpos] = ((in[15 + inpos] >>> 24) | ((in[16 + inpos] & 65535) << (24 - 16))) + + out[21 + outpos - 1]; + out[22 + outpos] = ((in[16 + inpos] >>> 16) | ((in[17 + inpos] & 255) << (24 - 8))) + + out[22 + outpos - 1]; + out[23 + outpos] = ((in[17 + inpos] >>> 8)) + + out[23 + outpos - 1]; + out[24 + outpos] = (((in[18 + inpos] >>> 0) & 16777215)) + + out[24 + outpos - 1]; + out[25 + outpos] = ((in[18 + inpos] >>> 24) | ((in[19 + inpos] & 65535) << (24 - 16))) + + out[25 + outpos - 1]; + out[26 + outpos] = ((in[19 + inpos] >>> 16) | ((in[20 + inpos] & 255) << (24 - 8))) + + out[26 + outpos - 1]; + out[27 + outpos] = ((in[20 + inpos] >>> 8)) + + out[27 + outpos - 1]; + out[28 + outpos] = (((in[21 + inpos] >>> 0) & 16777215)) + + out[28 + outpos - 1]; + out[29 + outpos] = ((in[21 + inpos] >>> 24) | ((in[22 + inpos] & 65535) << (24 - 16))) + + out[29 + outpos - 1]; + out[30 + outpos] = ((in[22 + inpos] >>> 16) | ((in[23 + inpos] & 255) << (24 - 8))) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[23 + inpos] >>> 8)) + + out[31 + outpos - 1]; + } + protected static void integratedunpack25(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 33554431)) + + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 25) | ((in[1 + inpos] & 262143) << (25 - 18))) + + out[1 + outpos - 1]; + out[2 + outpos] = ((in[1 + inpos] >>> 18) | ((in[2 + inpos] & 2047) << (25 - 11))) + + out[2 + outpos - 1]; + out[3 + outpos] = ((in[2 + inpos] >>> 11) | ((in[3 + inpos] & 15) << (25 - 4))) + + out[3 + outpos - 1]; + out[4 + outpos] = (((in[3 + inpos] >>> 4) & 33554431)) + + out[4 + outpos - 1]; + out[5 + outpos] = ((in[3 + inpos] >>> 29) | ((in[4 + inpos] & 4194303) << (25 - 22))) + + out[5 + outpos - 1]; + out[6 + outpos] = ((in[4 + inpos] >>> 22) | ((in[5 + inpos] & 32767) << (25 - 15))) + + out[6 + outpos - 1]; + out[7 + outpos] = ((in[5 + inpos] >>> 15) | ((in[6 + inpos] & 255) << (25 - 8))) + + out[7 + outpos - 1]; + out[8 + outpos] = ((in[6 + inpos] >>> 8) | ((in[7 + inpos] & 1) << (25 - 1))) + + out[8 + outpos - 1]; + out[9 + outpos] = (((in[7 + inpos] >>> 1) & 33554431)) + + out[9 + outpos - 1]; + out[10 + outpos] = ((in[7 + inpos] >>> 26) | ((in[8 + inpos] & 524287) << (25 - 19))) + + out[10 + outpos - 1]; + out[11 + outpos] = ((in[8 + inpos] >>> 19) | ((in[9 + inpos] & 4095) << (25 - 12))) + + out[11 + outpos - 1]; + out[12 + outpos] = ((in[9 + inpos] >>> 12) | ((in[10 + inpos] & 31) << (25 - 5))) + + out[12 + outpos - 1]; + out[13 + outpos] = (((in[10 + inpos] >>> 5) & 33554431)) + + out[13 + outpos - 1]; + out[14 + outpos] = ((in[10 + inpos] >>> 30) | ((in[11 + inpos] & 8388607) << (25 - 23))) + + out[14 + outpos - 1]; + out[15 + outpos] = ((in[11 + inpos] >>> 23) | ((in[12 + inpos] & 65535) << (25 - 16))) + + out[15 + outpos - 1]; + out[16 + outpos] = ((in[12 + inpos] >>> 16) | ((in[13 + inpos] & 511) << (25 - 9))) + + out[16 + outpos - 1]; + out[17 + outpos] = ((in[13 + inpos] >>> 9) | ((in[14 + inpos] & 3) << (25 - 2))) + + out[17 + outpos - 1]; + out[18 + outpos] = (((in[14 + inpos] >>> 2) & 33554431)) + + out[18 + outpos - 1]; + out[19 + outpos] = ((in[14 + inpos] >>> 27) | ((in[15 + inpos] & 1048575) << (25 - 20))) + + out[19 + outpos - 1]; + out[20 + outpos] = ((in[15 + inpos] >>> 20) | ((in[16 + inpos] & 8191) << (25 - 13))) + + out[20 + outpos - 1]; + out[21 + outpos] = ((in[16 + inpos] >>> 13) | ((in[17 + inpos] & 63) << (25 - 6))) + + out[21 + outpos - 1]; + out[22 + outpos] = (((in[17 + inpos] >>> 6) & 33554431)) + + out[22 + outpos - 1]; + out[23 + outpos] = ((in[17 + inpos] >>> 31) | ((in[18 + inpos] & 16777215) << (25 - 24))) + + out[23 + outpos - 1]; + out[24 + outpos] = ((in[18 + inpos] >>> 24) | ((in[19 + inpos] & 131071) << (25 - 17))) + + out[24 + outpos - 1]; + out[25 + outpos] = ((in[19 + inpos] >>> 17) | ((in[20 + inpos] & 1023) << (25 - 10))) + + out[25 + outpos - 1]; + out[26 + outpos] = ((in[20 + inpos] >>> 10) | ((in[21 + inpos] & 7) << (25 - 3))) + + out[26 + outpos - 1]; + out[27 + outpos] = (((in[21 + inpos] >>> 3) & 33554431)) + + out[27 + outpos - 1]; + out[28 + outpos] = ((in[21 + inpos] >>> 28) | ((in[22 + inpos] & 2097151) << (25 - 21))) + + out[28 + outpos - 1]; + out[29 + outpos] = ((in[22 + inpos] >>> 21) | ((in[23 + inpos] & 16383) << (25 - 14))) + + out[29 + outpos - 1]; + out[30 + outpos] = ((in[23 + inpos] >>> 14) | ((in[24 + inpos] & 127) << (25 - 7))) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[24 + inpos] >>> 7)) + + out[31 + outpos - 1]; + } - protected static void integratedunpack32(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - System.arraycopy(in, inpos, out, outpos, 32); // no sense in doing delta coding - } + protected static void integratedunpack26(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 67108863)) + + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 26) | ((in[1 + inpos] & 1048575) << (26 - 20))) + + out[1 + outpos - 1]; + out[2 + outpos] = ((in[1 + inpos] >>> 20) | ((in[2 + inpos] & 16383) << (26 - 14))) + + out[2 + outpos - 1]; + out[3 + outpos] = ((in[2 + inpos] >>> 14) | ((in[3 + inpos] & 255) << (26 - 8))) + + out[3 + outpos - 1]; + out[4 + outpos] = ((in[3 + inpos] >>> 8) | ((in[4 + inpos] & 3) << (26 - 2))) + + out[4 + outpos - 1]; + out[5 + outpos] = (((in[4 + inpos] >>> 2) & 67108863)) + + out[5 + outpos - 1]; + out[6 + outpos] = ((in[4 + inpos] >>> 28) | ((in[5 + inpos] & 4194303) << (26 - 22))) + + out[6 + outpos - 1]; + out[7 + outpos] = ((in[5 + inpos] >>> 22) | ((in[6 + inpos] & 65535) << (26 - 16))) + + out[7 + outpos - 1]; + out[8 + outpos] = ((in[6 + inpos] >>> 16) | ((in[7 + inpos] & 1023) << (26 - 10))) + + out[8 + outpos - 1]; + out[9 + outpos] = ((in[7 + inpos] >>> 10) | ((in[8 + inpos] & 15) << (26 - 4))) + + out[9 + outpos - 1]; + out[10 + outpos] = (((in[8 + inpos] >>> 4) & 67108863)) + + out[10 + outpos - 1]; + out[11 + outpos] = ((in[8 + inpos] >>> 30) | ((in[9 + inpos] & 16777215) << (26 - 24))) + + out[11 + outpos - 1]; + out[12 + outpos] = ((in[9 + inpos] >>> 24) | ((in[10 + inpos] & 262143) << (26 - 18))) + + out[12 + outpos - 1]; + out[13 + outpos] = ((in[10 + inpos] >>> 18) | ((in[11 + inpos] & 4095) << (26 - 12))) + + out[13 + outpos - 1]; + out[14 + outpos] = ((in[11 + inpos] >>> 12) | ((in[12 + inpos] & 63) << (26 - 6))) + + out[14 + outpos - 1]; + out[15 + outpos] = ((in[12 + inpos] >>> 6)) + + out[15 + outpos - 1]; + out[16 + outpos] = (((in[13 + inpos] >>> 0) & 67108863)) + + out[16 + outpos - 1]; + out[17 + outpos] = ((in[13 + inpos] >>> 26) | ((in[14 + inpos] & 1048575) << (26 - 20))) + + out[17 + outpos - 1]; + out[18 + outpos] = ((in[14 + inpos] >>> 20) | ((in[15 + inpos] & 16383) << (26 - 14))) + + out[18 + outpos - 1]; + out[19 + outpos] = ((in[15 + inpos] >>> 14) | ((in[16 + inpos] & 255) << (26 - 8))) + + out[19 + outpos - 1]; + out[20 + outpos] = ((in[16 + inpos] >>> 8) | ((in[17 + inpos] & 3) << (26 - 2))) + + out[20 + outpos - 1]; + out[21 + outpos] = (((in[17 + inpos] >>> 2) & 67108863)) + + out[21 + outpos - 1]; + out[22 + outpos] = ((in[17 + inpos] >>> 28) | ((in[18 + inpos] & 4194303) << (26 - 22))) + + out[22 + outpos - 1]; + out[23 + outpos] = ((in[18 + inpos] >>> 22) | ((in[19 + inpos] & 65535) << (26 - 16))) + + out[23 + outpos - 1]; + out[24 + outpos] = ((in[19 + inpos] >>> 16) | ((in[20 + inpos] & 1023) << (26 - 10))) + + out[24 + outpos - 1]; + out[25 + outpos] = ((in[20 + inpos] >>> 10) | ((in[21 + inpos] & 15) << (26 - 4))) + + out[25 + outpos - 1]; + out[26 + outpos] = (((in[21 + inpos] >>> 4) & 67108863)) + + out[26 + outpos - 1]; + out[27 + outpos] = ((in[21 + inpos] >>> 30) | ((in[22 + inpos] & 16777215) << (26 - 24))) + + out[27 + outpos - 1]; + out[28 + outpos] = ((in[22 + inpos] >>> 24) | ((in[23 + inpos] & 262143) << (26 - 18))) + + out[28 + outpos - 1]; + out[29 + outpos] = ((in[23 + inpos] >>> 18) | ((in[24 + inpos] & 4095) << (26 - 12))) + + out[29 + outpos - 1]; + out[30 + outpos] = ((in[24 + inpos] >>> 12) | ((in[25 + inpos] & 63) << (26 - 6))) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[25 + inpos] >>> 6)) + + out[31 + outpos - 1]; + } + protected static void integratedunpack27(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 134217727)) + + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 27) | ((in[1 + inpos] & 4194303) << (27 - 22))) + + out[1 + outpos - 1]; + out[2 + outpos] = ((in[1 + inpos] >>> 22) | ((in[2 + inpos] & 131071) << (27 - 17))) + + out[2 + outpos - 1]; + out[3 + outpos] = ((in[2 + inpos] >>> 17) | ((in[3 + inpos] & 4095) << (27 - 12))) + + out[3 + outpos - 1]; + out[4 + outpos] = ((in[3 + inpos] >>> 12) | ((in[4 + inpos] & 127) << (27 - 7))) + + out[4 + outpos - 1]; + out[5 + outpos] = ((in[4 + inpos] >>> 7) | ((in[5 + inpos] & 3) << (27 - 2))) + + out[5 + outpos - 1]; + out[6 + outpos] = (((in[5 + inpos] >>> 2) & 134217727)) + + out[6 + outpos - 1]; + out[7 + outpos] = ((in[5 + inpos] >>> 29) | ((in[6 + inpos] & 16777215) << (27 - 24))) + + out[7 + outpos - 1]; + out[8 + outpos] = ((in[6 + inpos] >>> 24) | ((in[7 + inpos] & 524287) << (27 - 19))) + + out[8 + outpos - 1]; + out[9 + outpos] = ((in[7 + inpos] >>> 19) | ((in[8 + inpos] & 16383) << (27 - 14))) + + out[9 + outpos - 1]; + out[10 + outpos] = ((in[8 + inpos] >>> 14) | ((in[9 + inpos] & 511) << (27 - 9))) + + out[10 + outpos - 1]; + out[11 + outpos] = ((in[9 + inpos] >>> 9) | ((in[10 + inpos] & 15) << (27 - 4))) + + out[11 + outpos - 1]; + out[12 + outpos] = (((in[10 + inpos] >>> 4) & 134217727)) + + out[12 + outpos - 1]; + out[13 + outpos] = ((in[10 + inpos] >>> 31) | ((in[11 + inpos] & 67108863) << (27 - 26))) + + out[13 + outpos - 1]; + out[14 + outpos] = ((in[11 + inpos] >>> 26) | ((in[12 + inpos] & 2097151) << (27 - 21))) + + out[14 + outpos - 1]; + out[15 + outpos] = ((in[12 + inpos] >>> 21) | ((in[13 + inpos] & 65535) << (27 - 16))) + + out[15 + outpos - 1]; + out[16 + outpos] = ((in[13 + inpos] >>> 16) | ((in[14 + inpos] & 2047) << (27 - 11))) + + out[16 + outpos - 1]; + out[17 + outpos] = ((in[14 + inpos] >>> 11) | ((in[15 + inpos] & 63) << (27 - 6))) + + out[17 + outpos - 1]; + out[18 + outpos] = ((in[15 + inpos] >>> 6) | ((in[16 + inpos] & 1) << (27 - 1))) + + out[18 + outpos - 1]; + out[19 + outpos] = (((in[16 + inpos] >>> 1) & 134217727)) + + out[19 + outpos - 1]; + out[20 + outpos] = ((in[16 + inpos] >>> 28) | ((in[17 + inpos] & 8388607) << (27 - 23))) + + out[20 + outpos - 1]; + out[21 + outpos] = ((in[17 + inpos] >>> 23) | ((in[18 + inpos] & 262143) << (27 - 18))) + + out[21 + outpos - 1]; + out[22 + outpos] = ((in[18 + inpos] >>> 18) | ((in[19 + inpos] & 8191) << (27 - 13))) + + out[22 + outpos - 1]; + out[23 + outpos] = ((in[19 + inpos] >>> 13) | ((in[20 + inpos] & 255) << (27 - 8))) + + out[23 + outpos - 1]; + out[24 + outpos] = ((in[20 + inpos] >>> 8) | ((in[21 + inpos] & 7) << (27 - 3))) + + out[24 + outpos - 1]; + out[25 + outpos] = (((in[21 + inpos] >>> 3) & 134217727)) + + out[25 + outpos - 1]; + out[26 + outpos] = ((in[21 + inpos] >>> 30) | ((in[22 + inpos] & 33554431) << (27 - 25))) + + out[26 + outpos - 1]; + out[27 + outpos] = ((in[22 + inpos] >>> 25) | ((in[23 + inpos] & 1048575) << (27 - 20))) + + out[27 + outpos - 1]; + out[28 + outpos] = ((in[23 + inpos] >>> 20) | ((in[24 + inpos] & 32767) << (27 - 15))) + + out[28 + outpos - 1]; + out[29 + outpos] = ((in[24 + inpos] >>> 15) | ((in[25 + inpos] & 1023) << (27 - 10))) + + out[29 + outpos - 1]; + out[30 + outpos] = ((in[25 + inpos] >>> 10) | ((in[26 + inpos] & 31) << (27 - 5))) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[26 + inpos] >>> 5)) + + out[31 + outpos - 1]; + } - protected static void integratedpack32(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - System.arraycopy(in, inpos, out, outpos, 32); // no sense in doing delta coding - } + protected static void integratedunpack28(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 268435455)) + + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 28) | ((in[1 + inpos] & 16777215) << (28 - 24))) + + out[1 + outpos - 1]; + out[2 + outpos] = ((in[1 + inpos] >>> 24) | ((in[2 + inpos] & 1048575) << (28 - 20))) + + out[2 + outpos - 1]; + out[3 + outpos] = ((in[2 + inpos] >>> 20) | ((in[3 + inpos] & 65535) << (28 - 16))) + + out[3 + outpos - 1]; + out[4 + outpos] = ((in[3 + inpos] >>> 16) | ((in[4 + inpos] & 4095) << (28 - 12))) + + out[4 + outpos - 1]; + out[5 + outpos] = ((in[4 + inpos] >>> 12) | ((in[5 + inpos] & 255) << (28 - 8))) + + out[5 + outpos - 1]; + out[6 + outpos] = ((in[5 + inpos] >>> 8) | ((in[6 + inpos] & 15) << (28 - 4))) + + out[6 + outpos - 1]; + out[7 + outpos] = ((in[6 + inpos] >>> 4)) + out[7 + outpos - 1]; + out[8 + outpos] = (((in[7 + inpos] >>> 0) & 268435455)) + + out[8 + outpos - 1]; + out[9 + outpos] = ((in[7 + inpos] >>> 28) | ((in[8 + inpos] & 16777215) << (28 - 24))) + + out[9 + outpos - 1]; + out[10 + outpos] = ((in[8 + inpos] >>> 24) | ((in[9 + inpos] & 1048575) << (28 - 20))) + + out[10 + outpos - 1]; + out[11 + outpos] = ((in[9 + inpos] >>> 20) | ((in[10 + inpos] & 65535) << (28 - 16))) + + out[11 + outpos - 1]; + out[12 + outpos] = ((in[10 + inpos] >>> 16) | ((in[11 + inpos] & 4095) << (28 - 12))) + + out[12 + outpos - 1]; + out[13 + outpos] = ((in[11 + inpos] >>> 12) | ((in[12 + inpos] & 255) << (28 - 8))) + + out[13 + outpos - 1]; + out[14 + outpos] = ((in[12 + inpos] >>> 8) | ((in[13 + inpos] & 15) << (28 - 4))) + + out[14 + outpos - 1]; + out[15 + outpos] = ((in[13 + inpos] >>> 4)) + + out[15 + outpos - 1]; + out[16 + outpos] = (((in[14 + inpos] >>> 0) & 268435455)) + + out[16 + outpos - 1]; + out[17 + outpos] = ((in[14 + inpos] >>> 28) | ((in[15 + inpos] & 16777215) << (28 - 24))) + + out[17 + outpos - 1]; + out[18 + outpos] = ((in[15 + inpos] >>> 24) | ((in[16 + inpos] & 1048575) << (28 - 20))) + + out[18 + outpos - 1]; + out[19 + outpos] = ((in[16 + inpos] >>> 20) | ((in[17 + inpos] & 65535) << (28 - 16))) + + out[19 + outpos - 1]; + out[20 + outpos] = ((in[17 + inpos] >>> 16) | ((in[18 + inpos] & 4095) << (28 - 12))) + + out[20 + outpos - 1]; + out[21 + outpos] = ((in[18 + inpos] >>> 12) | ((in[19 + inpos] & 255) << (28 - 8))) + + out[21 + outpos - 1]; + out[22 + outpos] = ((in[19 + inpos] >>> 8) | ((in[20 + inpos] & 15) << (28 - 4))) + + out[22 + outpos - 1]; + out[23 + outpos] = ((in[20 + inpos] >>> 4)) + + out[23 + outpos - 1]; + out[24 + outpos] = (((in[21 + inpos] >>> 0) & 268435455)) + + out[24 + outpos - 1]; + out[25 + outpos] = ((in[21 + inpos] >>> 28) | ((in[22 + inpos] & 16777215) << (28 - 24))) + + out[25 + outpos - 1]; + out[26 + outpos] = ((in[22 + inpos] >>> 24) | ((in[23 + inpos] & 1048575) << (28 - 20))) + + out[26 + outpos - 1]; + out[27 + outpos] = ((in[23 + inpos] >>> 20) | ((in[24 + inpos] & 65535) << (28 - 16))) + + out[27 + outpos - 1]; + out[28 + outpos] = ((in[24 + inpos] >>> 16) | ((in[25 + inpos] & 4095) << (28 - 12))) + + out[28 + outpos - 1]; + out[29 + outpos] = ((in[25 + inpos] >>> 12) | ((in[26 + inpos] & 255) << (28 - 8))) + + out[29 + outpos - 1]; + out[30 + outpos] = ((in[26 + inpos] >>> 8) | ((in[27 + inpos] & 15) << (28 - 4))) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[27 + inpos] >>> 4)) + + out[31 + outpos - 1]; + } + protected static void integratedunpack29(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 536870911)) + + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 29) | ((in[1 + inpos] & 67108863) << (29 - 26))) + + out[1 + outpos - 1]; + out[2 + outpos] = ((in[1 + inpos] >>> 26) | ((in[2 + inpos] & 8388607) << (29 - 23))) + + out[2 + outpos - 1]; + out[3 + outpos] = ((in[2 + inpos] >>> 23) | ((in[3 + inpos] & 1048575) << (29 - 20))) + + out[3 + outpos - 1]; + out[4 + outpos] = ((in[3 + inpos] >>> 20) | ((in[4 + inpos] & 131071) << (29 - 17))) + + out[4 + outpos - 1]; + out[5 + outpos] = ((in[4 + inpos] >>> 17) | ((in[5 + inpos] & 16383) << (29 - 14))) + + out[5 + outpos - 1]; + out[6 + outpos] = ((in[5 + inpos] >>> 14) | ((in[6 + inpos] & 2047) << (29 - 11))) + + out[6 + outpos - 1]; + out[7 + outpos] = ((in[6 + inpos] >>> 11) | ((in[7 + inpos] & 255) << (29 - 8))) + + out[7 + outpos - 1]; + out[8 + outpos] = ((in[7 + inpos] >>> 8) | ((in[8 + inpos] & 31) << (29 - 5))) + + out[8 + outpos - 1]; + out[9 + outpos] = ((in[8 + inpos] >>> 5) | ((in[9 + inpos] & 3) << (29 - 2))) + + out[9 + outpos - 1]; + out[10 + outpos] = (((in[9 + inpos] >>> 2) & 536870911)) + + out[10 + outpos - 1]; + out[11 + outpos] = ((in[9 + inpos] >>> 31) | ((in[10 + inpos] & 268435455) << (29 - 28))) + + out[11 + outpos - 1]; + out[12 + outpos] = ((in[10 + inpos] >>> 28) | ((in[11 + inpos] & 33554431) << (29 - 25))) + + out[12 + outpos - 1]; + out[13 + outpos] = ((in[11 + inpos] >>> 25) | ((in[12 + inpos] & 4194303) << (29 - 22))) + + out[13 + outpos - 1]; + out[14 + outpos] = ((in[12 + inpos] >>> 22) | ((in[13 + inpos] & 524287) << (29 - 19))) + + out[14 + outpos - 1]; + out[15 + outpos] = ((in[13 + inpos] >>> 19) | ((in[14 + inpos] & 65535) << (29 - 16))) + + out[15 + outpos - 1]; + out[16 + outpos] = ((in[14 + inpos] >>> 16) | ((in[15 + inpos] & 8191) << (29 - 13))) + + out[16 + outpos - 1]; + out[17 + outpos] = ((in[15 + inpos] >>> 13) | ((in[16 + inpos] & 1023) << (29 - 10))) + + out[17 + outpos - 1]; + out[18 + outpos] = ((in[16 + inpos] >>> 10) | ((in[17 + inpos] & 127) << (29 - 7))) + + out[18 + outpos - 1]; + out[19 + outpos] = ((in[17 + inpos] >>> 7) | ((in[18 + inpos] & 15) << (29 - 4))) + + out[19 + outpos - 1]; + out[20 + outpos] = ((in[18 + inpos] >>> 4) | ((in[19 + inpos] & 1) << (29 - 1))) + + out[20 + outpos - 1]; + out[21 + outpos] = (((in[19 + inpos] >>> 1) & 536870911)) + + out[21 + outpos - 1]; + out[22 + outpos] = ((in[19 + inpos] >>> 30) | ((in[20 + inpos] & 134217727) << (29 - 27))) + + out[22 + outpos - 1]; + out[23 + outpos] = ((in[20 + inpos] >>> 27) | ((in[21 + inpos] & 16777215) << (29 - 24))) + + out[23 + outpos - 1]; + out[24 + outpos] = ((in[21 + inpos] >>> 24) | ((in[22 + inpos] & 2097151) << (29 - 21))) + + out[24 + outpos - 1]; + out[25 + outpos] = ((in[22 + inpos] >>> 21) | ((in[23 + inpos] & 262143) << (29 - 18))) + + out[25 + outpos - 1]; + out[26 + outpos] = ((in[23 + inpos] >>> 18) | ((in[24 + inpos] & 32767) << (29 - 15))) + + out[26 + outpos - 1]; + out[27 + outpos] = ((in[24 + inpos] >>> 15) | ((in[25 + inpos] & 4095) << (29 - 12))) + + out[27 + outpos - 1]; + out[28 + outpos] = ((in[25 + inpos] >>> 12) | ((in[26 + inpos] & 511) << (29 - 9))) + + out[28 + outpos - 1]; + out[29 + outpos] = ((in[26 + inpos] >>> 9) | ((in[27 + inpos] & 63) << (29 - 6))) + + out[29 + outpos - 1]; + out[30 + outpos] = ((in[27 + inpos] >>> 6) | ((in[28 + inpos] & 7) << (29 - 3))) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[28 + inpos] >>> 3)) + + out[31 + outpos - 1]; + } - protected static void integratedunpack0(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - Arrays.fill(out, outpos, outpos + 32, initoffset); - } + protected static void integratedunpack30(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 1073741823)) + + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 30) | ((in[1 + inpos] & 268435455) << (30 - 28))) + + out[1 + outpos - 1]; + out[2 + outpos] = ((in[1 + inpos] >>> 28) | ((in[2 + inpos] & 67108863) << (30 - 26))) + + out[2 + outpos - 1]; + out[3 + outpos] = ((in[2 + inpos] >>> 26) | ((in[3 + inpos] & 16777215) << (30 - 24))) + + out[3 + outpos - 1]; + out[4 + outpos] = ((in[3 + inpos] >>> 24) | ((in[4 + inpos] & 4194303) << (30 - 22))) + + out[4 + outpos - 1]; + out[5 + outpos] = ((in[4 + inpos] >>> 22) | ((in[5 + inpos] & 1048575) << (30 - 20))) + + out[5 + outpos - 1]; + out[6 + outpos] = ((in[5 + inpos] >>> 20) | ((in[6 + inpos] & 262143) << (30 - 18))) + + out[6 + outpos - 1]; + out[7 + outpos] = ((in[6 + inpos] >>> 18) | ((in[7 + inpos] & 65535) << (30 - 16))) + + out[7 + outpos - 1]; + out[8 + outpos] = ((in[7 + inpos] >>> 16) | ((in[8 + inpos] & 16383) << (30 - 14))) + + out[8 + outpos - 1]; + out[9 + outpos] = ((in[8 + inpos] >>> 14) | ((in[9 + inpos] & 4095) << (30 - 12))) + + out[9 + outpos - 1]; + out[10 + outpos] = ((in[9 + inpos] >>> 12) | ((in[10 + inpos] & 1023) << (30 - 10))) + + out[10 + outpos - 1]; + out[11 + outpos] = ((in[10 + inpos] >>> 10) | ((in[11 + inpos] & 255) << (30 - 8))) + + out[11 + outpos - 1]; + out[12 + outpos] = ((in[11 + inpos] >>> 8) | ((in[12 + inpos] & 63) << (30 - 6))) + + out[12 + outpos - 1]; + out[13 + outpos] = ((in[12 + inpos] >>> 6) | ((in[13 + inpos] & 15) << (30 - 4))) + + out[13 + outpos - 1]; + out[14 + outpos] = ((in[13 + inpos] >>> 4) | ((in[14 + inpos] & 3) << (30 - 2))) + + out[14 + outpos - 1]; + out[15 + outpos] = ((in[14 + inpos] >>> 2)) + + out[15 + outpos - 1]; + out[16 + outpos] = (((in[15 + inpos] >>> 0) & 1073741823)) + + out[16 + outpos - 1]; + out[17 + outpos] = ((in[15 + inpos] >>> 30) | ((in[16 + inpos] & 268435455) << (30 - 28))) + + out[17 + outpos - 1]; + out[18 + outpos] = ((in[16 + inpos] >>> 28) | ((in[17 + inpos] & 67108863) << (30 - 26))) + + out[18 + outpos - 1]; + out[19 + outpos] = ((in[17 + inpos] >>> 26) | ((in[18 + inpos] & 16777215) << (30 - 24))) + + out[19 + outpos - 1]; + out[20 + outpos] = ((in[18 + inpos] >>> 24) | ((in[19 + inpos] & 4194303) << (30 - 22))) + + out[20 + outpos - 1]; + out[21 + outpos] = ((in[19 + inpos] >>> 22) | ((in[20 + inpos] & 1048575) << (30 - 20))) + + out[21 + outpos - 1]; + out[22 + outpos] = ((in[20 + inpos] >>> 20) | ((in[21 + inpos] & 262143) << (30 - 18))) + + out[22 + outpos - 1]; + out[23 + outpos] = ((in[21 + inpos] >>> 18) | ((in[22 + inpos] & 65535) << (30 - 16))) + + out[23 + outpos - 1]; + out[24 + outpos] = ((in[22 + inpos] >>> 16) | ((in[23 + inpos] & 16383) << (30 - 14))) + + out[24 + outpos - 1]; + out[25 + outpos] = ((in[23 + inpos] >>> 14) | ((in[24 + inpos] & 4095) << (30 - 12))) + + out[25 + outpos - 1]; + out[26 + outpos] = ((in[24 + inpos] >>> 12) | ((in[25 + inpos] & 1023) << (30 - 10))) + + out[26 + outpos - 1]; + out[27 + outpos] = ((in[25 + inpos] >>> 10) | ((in[26 + inpos] & 255) << (30 - 8))) + + out[27 + outpos - 1]; + out[28 + outpos] = ((in[26 + inpos] >>> 8) | ((in[27 + inpos] & 63) << (30 - 6))) + + out[28 + outpos - 1]; + out[29 + outpos] = ((in[27 + inpos] >>> 6) | ((in[28 + inpos] & 15) << (30 - 4))) + + out[29 + outpos - 1]; + out[30 + outpos] = ((in[28 + inpos] >>> 4) | ((in[29 + inpos] & 3) << (30 - 2))) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[29 + inpos] >>> 2)) + + out[31 + outpos - 1]; + } + protected static void integratedunpack31(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 2147483647)) + + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 31) | ((in[1 + inpos] & 1073741823) << (31 - 30))) + + out[1 + outpos - 1]; + out[2 + outpos] = ((in[1 + inpos] >>> 30) | ((in[2 + inpos] & 536870911) << (31 - 29))) + + out[2 + outpos - 1]; + out[3 + outpos] = ((in[2 + inpos] >>> 29) | ((in[3 + inpos] & 268435455) << (31 - 28))) + + out[3 + outpos - 1]; + out[4 + outpos] = ((in[3 + inpos] >>> 28) | ((in[4 + inpos] & 134217727) << (31 - 27))) + + out[4 + outpos - 1]; + out[5 + outpos] = ((in[4 + inpos] >>> 27) | ((in[5 + inpos] & 67108863) << (31 - 26))) + + out[5 + outpos - 1]; + out[6 + outpos] = ((in[5 + inpos] >>> 26) | ((in[6 + inpos] & 33554431) << (31 - 25))) + + out[6 + outpos - 1]; + out[7 + outpos] = ((in[6 + inpos] >>> 25) | ((in[7 + inpos] & 16777215) << (31 - 24))) + + out[7 + outpos - 1]; + out[8 + outpos] = ((in[7 + inpos] >>> 24) | ((in[8 + inpos] & 8388607) << (31 - 23))) + + out[8 + outpos - 1]; + out[9 + outpos] = ((in[8 + inpos] >>> 23) | ((in[9 + inpos] & 4194303) << (31 - 22))) + + out[9 + outpos - 1]; + out[10 + outpos] = ((in[9 + inpos] >>> 22) | ((in[10 + inpos] & 2097151) << (31 - 21))) + + out[10 + outpos - 1]; + out[11 + outpos] = ((in[10 + inpos] >>> 21) | ((in[11 + inpos] & 1048575) << (31 - 20))) + + out[11 + outpos - 1]; + out[12 + outpos] = ((in[11 + inpos] >>> 20) | ((in[12 + inpos] & 524287) << (31 - 19))) + + out[12 + outpos - 1]; + out[13 + outpos] = ((in[12 + inpos] >>> 19) | ((in[13 + inpos] & 262143) << (31 - 18))) + + out[13 + outpos - 1]; + out[14 + outpos] = ((in[13 + inpos] >>> 18) | ((in[14 + inpos] & 131071) << (31 - 17))) + + out[14 + outpos - 1]; + out[15 + outpos] = ((in[14 + inpos] >>> 17) | ((in[15 + inpos] & 65535) << (31 - 16))) + + out[15 + outpos - 1]; + out[16 + outpos] = ((in[15 + inpos] >>> 16) | ((in[16 + inpos] & 32767) << (31 - 15))) + + out[16 + outpos - 1]; + out[17 + outpos] = ((in[16 + inpos] >>> 15) | ((in[17 + inpos] & 16383) << (31 - 14))) + + out[17 + outpos - 1]; + out[18 + outpos] = ((in[17 + inpos] >>> 14) | ((in[18 + inpos] & 8191) << (31 - 13))) + + out[18 + outpos - 1]; + out[19 + outpos] = ((in[18 + inpos] >>> 13) | ((in[19 + inpos] & 4095) << (31 - 12))) + + out[19 + outpos - 1]; + out[20 + outpos] = ((in[19 + inpos] >>> 12) | ((in[20 + inpos] & 2047) << (31 - 11))) + + out[20 + outpos - 1]; + out[21 + outpos] = ((in[20 + inpos] >>> 11) | ((in[21 + inpos] & 1023) << (31 - 10))) + + out[21 + outpos - 1]; + out[22 + outpos] = ((in[21 + inpos] >>> 10) | ((in[22 + inpos] & 511) << (31 - 9))) + + out[22 + outpos - 1]; + out[23 + outpos] = ((in[22 + inpos] >>> 9) | ((in[23 + inpos] & 255) << (31 - 8))) + + out[23 + outpos - 1]; + out[24 + outpos] = ((in[23 + inpos] >>> 8) | ((in[24 + inpos] & 127) << (31 - 7))) + + out[24 + outpos - 1]; + out[25 + outpos] = ((in[24 + inpos] >>> 7) | ((in[25 + inpos] & 63) << (31 - 6))) + + out[25 + outpos - 1]; + out[26 + outpos] = ((in[25 + inpos] >>> 6) | ((in[26 + inpos] & 31) << (31 - 5))) + + out[26 + outpos - 1]; + out[27 + outpos] = ((in[26 + inpos] >>> 5) | ((in[27 + inpos] & 15) << (31 - 4))) + + out[27 + outpos - 1]; + out[28 + outpos] = ((in[27 + inpos] >>> 4) | ((in[28 + inpos] & 7) << (31 - 3))) + + out[28 + outpos - 1]; + out[29 + outpos] = ((in[28 + inpos] >>> 3) | ((in[29 + inpos] & 3) << (31 - 2))) + + out[29 + outpos - 1]; + out[30 + outpos] = ((in[29 + inpos] >>> 2) | ((in[30 + inpos] & 1) << (31 - 1))) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[30 + inpos] >>> 1)) + + out[31 + outpos - 1]; + } - protected static void integratedpack0(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - // nothing - } + protected static void integratedunpack32(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + System.arraycopy(in, inpos, out, outpos, 32); // no sense in + // doing delta + // coding + } + protected static void integratedpack32(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + System.arraycopy(in, inpos, out, outpos, 32); // no sense in + // doing delta + // coding + } - protected static void integratedunpack(final int initoffset, final int[] in, int inpos, final int[] out, int outpos, final int bit) { - switch (bit) { - case 0: - integratedunpack0(initoffset, in, inpos, out, outpos); - break; - case 1: - integratedunpack1(initoffset, in, inpos, out, outpos); - break; - case 2: - integratedunpack2(initoffset, in, inpos, out, outpos); - break; - case 3: - integratedunpack3(initoffset, in, inpos, out, outpos); - break; - case 4: - integratedunpack4(initoffset, in, inpos, out, outpos); - break; - case 5: - integratedunpack5(initoffset, in, inpos, out, outpos); - break; - case 6: - integratedunpack6(initoffset, in, inpos, out, outpos); - break; - case 7: - integratedunpack7(initoffset, in, inpos, out, outpos); - break; - case 8: - integratedunpack8(initoffset, in, inpos, out, outpos); - break; - case 9: - integratedunpack9(initoffset, in, inpos, out, outpos); - break; - case 10: - integratedunpack10(initoffset, in, inpos, out, outpos); - break; - case 11: - integratedunpack11(initoffset, in, inpos, out, outpos); - break; - case 12: - integratedunpack12(initoffset, in, inpos, out, outpos); - break; - case 13: - integratedunpack13(initoffset, in, inpos, out, outpos); - break; - case 14: - integratedunpack14(initoffset, in, inpos, out, outpos); - break; - case 15: - integratedunpack15(initoffset, in, inpos, out, outpos); - break; - case 16: - integratedunpack16(initoffset, in, inpos, out, outpos); - break; - case 17: - integratedunpack17(initoffset, in, inpos, out, outpos); - break; - case 18: - integratedunpack18(initoffset, in, inpos, out, outpos); - break; - case 19: - integratedunpack19(initoffset, in, inpos, out, outpos); - break; - case 20: - integratedunpack20(initoffset, in, inpos, out, outpos); - break; - case 21: - integratedunpack21(initoffset, in, inpos, out, outpos); - break; - case 22: - integratedunpack22(initoffset, in, inpos, out, outpos); - break; - case 23: - integratedunpack23(initoffset, in, inpos, out, outpos); - break; - case 24: - integratedunpack24(initoffset, in, inpos, out, outpos); - break; - case 25: - integratedunpack25(initoffset, in, inpos, out, outpos); - break; - case 26: - integratedunpack26(initoffset, in, inpos, out, outpos); - break; - case 27: - integratedunpack27(initoffset, in, inpos, out, outpos); - break; - case 28: - integratedunpack28(initoffset, in, inpos, out, outpos); - break; - case 29: - integratedunpack29(initoffset, in, inpos, out, outpos); - break; - case 30: - integratedunpack30(initoffset, in, inpos, out, outpos); - break; - case 31: - integratedunpack31(initoffset, in, inpos, out, outpos); - break; - case 32: - integratedunpack32(initoffset, in, inpos, out, outpos); - break; - default: - throw new IllegalArgumentException("Unsupported bit width."); + protected static void integratedunpack0(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + Arrays.fill(out, outpos, outpos + 32, initoffset); } - } + protected static void integratedpack0(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + // nothing + } - protected static void integratedpack(final int initoffset, final int[] in, int inpos, final int[] out, int outpos, final int bit) { - switch (bit) { - case 0: - integratedpack0(initoffset, in, inpos, out, outpos); - break; - case 1: - integratedpack1(initoffset, in, inpos, out, outpos); - break; - case 2: - integratedpack2(initoffset, in, inpos, out, outpos); - break; - case 3: - integratedpack3(initoffset, in, inpos, out, outpos); - break; - case 4: - integratedpack4(initoffset, in, inpos, out, outpos); - break; - case 5: - integratedpack5(initoffset, in, inpos, out, outpos); - break; - case 6: - integratedpack6(initoffset, in, inpos, out, outpos); - break; - case 7: - integratedpack7(initoffset, in, inpos, out, outpos); - break; - case 8: - integratedpack8(initoffset, in, inpos, out, outpos); - break; - case 9: - integratedpack9(initoffset, in, inpos, out, outpos); - break; - case 10: - integratedpack10(initoffset, in, inpos, out, outpos); - break; - case 11: - integratedpack11(initoffset, in, inpos, out, outpos); - break; - case 12: - integratedpack12(initoffset, in, inpos, out, outpos); - break; - case 13: - integratedpack13(initoffset, in, inpos, out, outpos); - break; - case 14: - integratedpack14(initoffset, in, inpos, out, outpos); - break; - case 15: - integratedpack15(initoffset, in, inpos, out, outpos); - break; - case 16: - integratedpack16(initoffset, in, inpos, out, outpos); - break; - case 17: - integratedpack17(initoffset, in, inpos, out, outpos); - break; - case 18: - integratedpack18(initoffset, in, inpos, out, outpos); - break; - case 19: - integratedpack19(initoffset, in, inpos, out, outpos); - break; - case 20: - integratedpack20(initoffset, in, inpos, out, outpos); - break; - case 21: - integratedpack21(initoffset, in, inpos, out, outpos); - break; - case 22: - integratedpack22(initoffset, in, inpos, out, outpos); - break; - case 23: - integratedpack23(initoffset, in, inpos, out, outpos); - break; - case 24: - integratedpack24(initoffset, in, inpos, out, outpos); - break; - case 25: - integratedpack25(initoffset, in, inpos, out, outpos); - break; - case 26: - integratedpack26(initoffset, in, inpos, out, outpos); - break; - case 27: - integratedpack27(initoffset, in, inpos, out, outpos); - break; - case 28: - integratedpack28(initoffset, in, inpos, out, outpos); - break; - case 29: - integratedpack29(initoffset, in, inpos, out, outpos); - break; - case 30: - integratedpack30(initoffset, in, inpos, out, outpos); - break; - case 31: - integratedpack31(initoffset, in, inpos, out, outpos); - break; - case 32: -if(out.length < outpos + 32) throw new RuntimeException(outpos + " "+out.length); -if(in.length < inpos + 32) throw new RuntimeException(); + /** + * Unpack 32 integers along with prefix sum computation + * + * @param initoffset value to add to all outputted values + * @param in source array + * @param inpos initial position in source array + * @param out output array + * @param outpos initial position in output array + * @param bit number of bits to use per integer + */ + public static void integratedunpack(final int initoffset, + final int[] in, final int inpos, final int[] out, final int outpos, + final int bit) { + switch (bit) { + case 0: + integratedunpack0(initoffset, in, inpos, out, outpos); + break; + case 1: + integratedunpack1(initoffset, in, inpos, out, outpos); + break; + case 2: + integratedunpack2(initoffset, in, inpos, out, outpos); + break; + case 3: + integratedunpack3(initoffset, in, inpos, out, outpos); + break; + case 4: + integratedunpack4(initoffset, in, inpos, out, outpos); + break; + case 5: + integratedunpack5(initoffset, in, inpos, out, outpos); + break; + case 6: + integratedunpack6(initoffset, in, inpos, out, outpos); + break; + case 7: + integratedunpack7(initoffset, in, inpos, out, outpos); + break; + case 8: + integratedunpack8(initoffset, in, inpos, out, outpos); + break; + case 9: + integratedunpack9(initoffset, in, inpos, out, outpos); + break; + case 10: + integratedunpack10(initoffset, in, inpos, out, outpos); + break; + case 11: + integratedunpack11(initoffset, in, inpos, out, outpos); + break; + case 12: + integratedunpack12(initoffset, in, inpos, out, outpos); + break; + case 13: + integratedunpack13(initoffset, in, inpos, out, outpos); + break; + case 14: + integratedunpack14(initoffset, in, inpos, out, outpos); + break; + case 15: + integratedunpack15(initoffset, in, inpos, out, outpos); + break; + case 16: + integratedunpack16(initoffset, in, inpos, out, outpos); + break; + case 17: + integratedunpack17(initoffset, in, inpos, out, outpos); + break; + case 18: + integratedunpack18(initoffset, in, inpos, out, outpos); + break; + case 19: + integratedunpack19(initoffset, in, inpos, out, outpos); + break; + case 20: + integratedunpack20(initoffset, in, inpos, out, outpos); + break; + case 21: + integratedunpack21(initoffset, in, inpos, out, outpos); + break; + case 22: + integratedunpack22(initoffset, in, inpos, out, outpos); + break; + case 23: + integratedunpack23(initoffset, in, inpos, out, outpos); + break; + case 24: + integratedunpack24(initoffset, in, inpos, out, outpos); + break; + case 25: + integratedunpack25(initoffset, in, inpos, out, outpos); + break; + case 26: + integratedunpack26(initoffset, in, inpos, out, outpos); + break; + case 27: + integratedunpack27(initoffset, in, inpos, out, outpos); + break; + case 28: + integratedunpack28(initoffset, in, inpos, out, outpos); + break; + case 29: + integratedunpack29(initoffset, in, inpos, out, outpos); + break; + case 30: + integratedunpack30(initoffset, in, inpos, out, outpos); + break; + case 31: + integratedunpack31(initoffset, in, inpos, out, outpos); + break; + case 32: + integratedunpack32(initoffset, in, inpos, out, outpos); + break; + default: + throw new IllegalArgumentException( + "Unsupported bit width."); + } + } -integratedpack32(initoffset, in, inpos, out, outpos); - break; - default: - throw new IllegalArgumentException("Unsupported bit width."); + /** + * Pack 32 integers as deltas with an initial value + * + * @param initoffset initial value (used to compute first delta) + * @param in input array + * @param inpos initial position in input array + * @param out output array + * @param outpos initial position in output array + * @param bit number of bits to use per integer + */ + public static void integratedpack(final int initoffset, final int[] in, + final int inpos, final int[] out, final int outpos, final int bit) { + switch (bit) { + case 0: + integratedpack0(initoffset, in, inpos, out, outpos); + break; + case 1: + integratedpack1(initoffset, in, inpos, out, outpos); + break; + case 2: + integratedpack2(initoffset, in, inpos, out, outpos); + break; + case 3: + integratedpack3(initoffset, in, inpos, out, outpos); + break; + case 4: + integratedpack4(initoffset, in, inpos, out, outpos); + break; + case 5: + integratedpack5(initoffset, in, inpos, out, outpos); + break; + case 6: + integratedpack6(initoffset, in, inpos, out, outpos); + break; + case 7: + integratedpack7(initoffset, in, inpos, out, outpos); + break; + case 8: + integratedpack8(initoffset, in, inpos, out, outpos); + break; + case 9: + integratedpack9(initoffset, in, inpos, out, outpos); + break; + case 10: + integratedpack10(initoffset, in, inpos, out, outpos); + break; + case 11: + integratedpack11(initoffset, in, inpos, out, outpos); + break; + case 12: + integratedpack12(initoffset, in, inpos, out, outpos); + break; + case 13: + integratedpack13(initoffset, in, inpos, out, outpos); + break; + case 14: + integratedpack14(initoffset, in, inpos, out, outpos); + break; + case 15: + integratedpack15(initoffset, in, inpos, out, outpos); + break; + case 16: + integratedpack16(initoffset, in, inpos, out, outpos); + break; + case 17: + integratedpack17(initoffset, in, inpos, out, outpos); + break; + case 18: + integratedpack18(initoffset, in, inpos, out, outpos); + break; + case 19: + integratedpack19(initoffset, in, inpos, out, outpos); + break; + case 20: + integratedpack20(initoffset, in, inpos, out, outpos); + break; + case 21: + integratedpack21(initoffset, in, inpos, out, outpos); + break; + case 22: + integratedpack22(initoffset, in, inpos, out, outpos); + break; + case 23: + integratedpack23(initoffset, in, inpos, out, outpos); + break; + case 24: + integratedpack24(initoffset, in, inpos, out, outpos); + break; + case 25: + integratedpack25(initoffset, in, inpos, out, outpos); + break; + case 26: + integratedpack26(initoffset, in, inpos, out, outpos); + break; + case 27: + integratedpack27(initoffset, in, inpos, out, outpos); + break; + case 28: + integratedpack28(initoffset, in, inpos, out, outpos); + break; + case 29: + integratedpack29(initoffset, in, inpos, out, outpos); + break; + case 30: + integratedpack30(initoffset, in, inpos, out, outpos); + break; + case 31: + integratedpack31(initoffset, in, inpos, out, outpos); + break; + case 32: + integratedpack32(initoffset, in, inpos, out, outpos); + break; + default: + throw new IllegalArgumentException( + "Unsupported bit width."); + } } - } } diff --git a/src/main/java/me/lemire/integercompression/IntegratedByteIntegerCODEC.java b/src/main/java/me/lemire/integercompression/IntegratedByteIntegerCODEC.java index fc86acf..e155b66 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedByteIntegerCODEC.java +++ b/src/main/java/me/lemire/integercompression/IntegratedByteIntegerCODEC.java @@ -7,14 +7,13 @@ package me.lemire.integercompression; - /** - * Interface describing a CODEC to compress integers to bytes. + * Interface describing a CODEC to compress integers to bytes. * * "Integrated" means that it uses differential coding. * * @author Daniel Lemire - * + * */ public interface IntegratedByteIntegerCODEC extends ByteIntegerCODEC { } \ No newline at end of file diff --git a/src/main/java/me/lemire/integercompression/IntegratedComposition.java b/src/main/java/me/lemire/integercompression/IntegratedComposition.java index 353515d..9cf274b 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedComposition.java +++ b/src/main/java/me/lemire/integercompression/IntegratedComposition.java @@ -8,56 +8,61 @@ /** * Helper class to compose schemes. - * + * * @author Daniel Lemire */ public class IntegratedComposition implements IntegratedIntegerCODEC { - IntegratedIntegerCODEC F1, F2; - - /** - * Compose a scheme from a first one (f1) and a second one (f2). - * The first one is called first and then the second one tries to - * compress whatever remains from the first run. - * - * By convention, the first scheme should be such that if, during - * decoding, a 32-bit zero is first encountered, then there is no - * output. - * - * @param f1 first codec - * @param f2 second codec - */ - public IntegratedComposition(IntegratedIntegerCODEC f1, IntegratedIntegerCODEC f2) { - F1 = f1; - F2 = f2; - } + IntegratedIntegerCODEC F1, F2; - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - if(inlength == 0) return; - final int init = inpos.get(); - F1.compress(in, inpos, inlength, out, outpos); - if (outpos.get() == 0) { - out[0] = 0; - outpos.increment(); + /** + * Compose a scheme from a first one (f1) and a second one (f2). The + * first one is called first and then the second one tries to compress + * whatever remains from the first run. + * + * By convention, the first scheme should be such that if, during + * decoding, a 32-bit zero is first encountered, then there is no + * output. + * + * @param f1 + * first codec + * @param f2 + * second codec + */ + public IntegratedComposition(IntegratedIntegerCODEC f1, + IntegratedIntegerCODEC f2) { + F1 = f1; + F2 = f2; } - inlength -= inpos.get() - init; - F2.compress(in, inpos, inlength, out, outpos); - } - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - if(inlength == 0) return; - int init = inpos.get(); - F1.uncompress(in, inpos, inlength, out, outpos); - inlength -= inpos.get() - init; - F2.uncompress(in, inpos, inlength, out, outpos); - } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + if (inlength == 0) + return; + final int init = inpos.get(); + F1.compress(in, inpos, inlength, out, outpos); + if (outpos.get() == 0) { + out[0] = 0; + outpos.increment(); + } + inlength -= inpos.get() - init; + F2.compress(in, inpos, inlength, out, outpos); + } - @Override - public String toString() { - return F1.toString() + " + " + F2.toString() + " (Integrated)"; - } + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + if (inlength == 0) + return; + int init = inpos.get(); + F1.uncompress(in, inpos, inlength, out, outpos); + inlength -= inpos.get() - init; + F2.uncompress(in, inpos, inlength, out, outpos); + } + + @Override + public String toString() { + return F1.toString() + " + " + F2.toString() + " (Integrated)"; + } } diff --git a/src/main/java/me/lemire/integercompression/IntegratedFastPFOR.java b/src/main/java/me/lemire/integercompression/IntegratedFastPFOR.java index eb0ceb4..2f8bf40 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedFastPFOR.java +++ b/src/main/java/me/lemire/integercompression/IntegratedFastPFOR.java @@ -10,271 +10,292 @@ import java.util.Arrays; /** - *

This is an integrated version of FastPFOR meaning that it computes differential coding - * as part of the compression.

+ *

+ * This is an integrated version of FastPFOR meaning that it computes + * differential coding as part of the compression. + *

* - *

For details, please see + *

+ * For details, please see *

*

- * Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second through vectorization - * Software: Practice & Experience + * Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second + * through vectorization Software: Practice & Experience * http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract * http://arxiv.org/abs/1209.2137 *

- *

For multi-threaded applications, each thread should use its own IntegratedFastPFOR object.

- * - * You should only use this scheme on sorted arrays. Use FastPFOR - * if you have unsorted arrays. - * + *

+ * For multi-threaded applications, each thread should use its own + * IntegratedFastPFOR object. + *

+ * + * You should only use this scheme on sorted arrays. Use FastPFOR if you have + * unsorted arrays. + * * @author Daniel Lemire */ public final class IntegratedFastPFOR implements IntegratedIntegerCODEC { - final static int BLOCK_SIZE = 128; - final static int OVERHEAD_OF_EACH_EXCEPT = 8; - final static int DEFAULT_PAGE_SIZE = 65536; + final static int BLOCK_SIZE = 128; + final static int OVERHEAD_OF_EACH_EXCEPT = 8; + final static int DEFAULT_PAGE_SIZE = 65536; - int pageSize; - final int[] buffer = new int[BLOCK_SIZE]; - final int[][] dataTobePacked = new int[33][]; - final ByteBuffer byteContainer; + int pageSize; + final int[] buffer = new int[BLOCK_SIZE]; + final int[][] dataTobePacked = new int[33][]; + final ByteBuffer byteContainer; - // Working area for compress and uncompress. - int[] dataPointers; - int[] freqs; - byte[] bestbbestcexceptmaxb; + // Working area for compress and uncompress. + int[] dataPointers; + int[] freqs; + byte[] bestbbestcexceptmaxb; - /** - * Construct the FastPFOR CODEC. - * @param pagesize the desired page size (for expert use) - */ - public IntegratedFastPFOR(int pagesize) { - pageSize = pagesize; - // Initiate arrrays. - byteContainer = ByteBuffer.allocateDirect(3 * pageSize / BLOCK_SIZE - + pageSize); - for (int k = 1; k < dataTobePacked.length; ++k) - dataTobePacked[k] = new int[pageSize / 32 * 4]; // heuristic - } + /** + * Construct the FastPFOR CODEC. + * + * @param pagesize + * the desired page size (for expert use) + */ + public IntegratedFastPFOR(int pagesize) { + pageSize = pagesize; + // Initiate arrrays. + byteContainer = ByteBuffer.allocateDirect(3 * pageSize + / BLOCK_SIZE + pageSize); + for (int k = 1; k < dataTobePacked.length; ++k) + dataTobePacked[k] = new int[pageSize / 32 * 4]; // heuristic + } - /** - * Construct the fastPFOR CODEC with default parameters. - */ - public IntegratedFastPFOR() { - this(DEFAULT_PAGE_SIZE); - } + /** + * Construct the fastPFOR CODEC with default parameters. + */ + public IntegratedFastPFOR() { + this(DEFAULT_PAGE_SIZE); + } - /** - * Compress data in blocks of 128 integers (if fewer than 128 integers are - * provided, nothing is done). - * - * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) - */ - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - inlength = Util.floorBy(inlength, 128); - if (inlength == 0) return; + /** + * Compress data in blocks of 128 integers (if fewer than 128 integers + * are provided, nothing is done). + * + * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) + */ + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + inlength = Util.floorBy(inlength, 128); + if (inlength == 0) + return; - out[outpos.get()] = inlength; - outpos.increment(); - IntWrapper initoffset = new IntWrapper(0); + out[outpos.get()] = inlength; + outpos.increment(); + IntWrapper initoffset = new IntWrapper(0); + // Allocate memory for working area. + dataPointers = new int[33]; + freqs = new int[33]; + bestbbestcexceptmaxb = new byte[3]; - // Allocate memory for working area. - dataPointers = new int[33]; - freqs = new int[33]; - bestbbestcexceptmaxb = new byte[3]; + final int finalinpos = inpos.get() + inlength; + while (inpos.get() != finalinpos) { + int thissize = Math.min(pageSize, + finalinpos - inpos.get()); + encodePage(in, inpos, thissize, out, outpos, initoffset); + } - final int finalinpos = inpos.get() + inlength; - while (inpos.get() != finalinpos) { - int thissize = Math.min(pageSize, finalinpos - inpos.get()); - encodePage(in, inpos, thissize, out, outpos,initoffset); + dataPointers = null; + freqs = null; + bestbbestcexceptmaxb = null; } - dataPointers = null; - freqs = null; - bestbbestcexceptmaxb = null; - } - - private void getBestBFromData(int[] in, int pos) { - Arrays.fill(freqs, 0); - for (int k = pos, k_end = pos + BLOCK_SIZE; k < k_end; ++k) { - freqs[Util.bits(in[k])]++; - } - bestbbestcexceptmaxb[0] = 32; - while (freqs[bestbbestcexceptmaxb[0]] == 0) - bestbbestcexceptmaxb[0]--; - bestbbestcexceptmaxb[2] = bestbbestcexceptmaxb[0]; - int bestcost = bestbbestcexceptmaxb[0] * BLOCK_SIZE; - byte cexcept = 0; - bestbbestcexceptmaxb[1] = cexcept; - for (int b = bestbbestcexceptmaxb[0] - 1; b >= 0; --b) { - cexcept += freqs[b + 1]; - if (cexcept < 0) - break; - // the extra 8 is the cost of storing maxbits - int thiscost = cexcept * OVERHEAD_OF_EACH_EXCEPT + cexcept - * (bestbbestcexceptmaxb[2] - b) + b * BLOCK_SIZE + 8; - if (thiscost < bestcost) { - bestcost = thiscost; - bestbbestcexceptmaxb[0] = (byte) b; + private void getBestBFromData(int[] in, int pos) { + Arrays.fill(freqs, 0); + for (int k = pos, k_end = pos + BLOCK_SIZE; k < k_end; ++k) { + freqs[Util.bits(in[k])]++; + } + bestbbestcexceptmaxb[0] = 32; + while (freqs[bestbbestcexceptmaxb[0]] == 0) + bestbbestcexceptmaxb[0]--; + bestbbestcexceptmaxb[2] = bestbbestcexceptmaxb[0]; + int bestcost = bestbbestcexceptmaxb[0] * BLOCK_SIZE; + byte cexcept = 0; bestbbestcexceptmaxb[1] = cexcept; - } + for (int b = bestbbestcexceptmaxb[0] - 1; b >= 0; --b) { + cexcept += freqs[b + 1]; + if (cexcept < 0) + break; + // the extra 8 is the cost of storing maxbits + int thiscost = cexcept * OVERHEAD_OF_EACH_EXCEPT + + cexcept * (bestbbestcexceptmaxb[2] - b) + b + * BLOCK_SIZE + 8; + if (thiscost < bestcost) { + bestcost = thiscost; + bestbbestcexceptmaxb[0] = (byte) b; + bestbbestcexceptmaxb[1] = cexcept; + } + } } - } - private void encodePage(int[] constin, IntWrapper constinpos, int thissize, - int[] out, IntWrapper outpos,IntWrapper initoffset) { - final int headerpos = outpos.get(); - outpos.increment(); - int tmpoutpos = outpos.get(); + private void encodePage(int[] constin, IntWrapper constinpos, + int thissize, int[] out, IntWrapper outpos, + IntWrapper initoffset) { + final int headerpos = outpos.get(); + outpos.increment(); + int tmpoutpos = outpos.get(); - // Clear working area. - Arrays.fill(dataPointers, 0); - //Arrays.fill(bestbbestcexceptmaxb, (byte)0);//DL:unncessary - byteContainer.clear(); + // Clear working area. + Arrays.fill(dataPointers, 0); + // Arrays.fill(bestbbestcexceptmaxb, (byte)0);//DL:unncessary + byteContainer.clear(); - int tmpconstinpos = constinpos.get(); - for (final int finalconstinpos = tmpconstinpos + thissize - BLOCK_SIZE; tmpconstinpos <= finalconstinpos; tmpconstinpos += BLOCK_SIZE) { - initoffset.set(Delta.delta(constin, tmpconstinpos, + int tmpconstinpos = constinpos.get(); + for (final int finalconstinpos = tmpconstinpos + thissize + - BLOCK_SIZE; tmpconstinpos <= finalconstinpos; tmpconstinpos += BLOCK_SIZE) { + initoffset.set(Delta.delta(constin, tmpconstinpos, BLOCK_SIZE, initoffset.intValue(), buffer)); - getBestBFromData(buffer, 0); - final int tmpbestb = bestbbestcexceptmaxb[0]; - byteContainer.put(bestbbestcexceptmaxb[0]); - byteContainer.put(bestbbestcexceptmaxb[1]); + getBestBFromData(buffer, 0); + final int tmpbestb = bestbbestcexceptmaxb[0]; + byteContainer.put(bestbbestcexceptmaxb[0]); + byteContainer.put(bestbbestcexceptmaxb[1]); - if (bestbbestcexceptmaxb[1] > 0) { - byteContainer.put(bestbbestcexceptmaxb[2]); - final int index = bestbbestcexceptmaxb[2] - - bestbbestcexceptmaxb[0]; - if (dataPointers[index] + bestbbestcexceptmaxb[1] >= dataTobePacked[index].length) { - int newsize = 2 * (dataPointers[index] + bestbbestcexceptmaxb[1]); - // make sure it is a multiple of 32 - newsize = Util.floorBy(newsize + 31, 32); - dataTobePacked[index] = Arrays.copyOf( - dataTobePacked[index], newsize); + if (bestbbestcexceptmaxb[1] > 0) { + byteContainer.put(bestbbestcexceptmaxb[2]); + final int index = bestbbestcexceptmaxb[2] + - bestbbestcexceptmaxb[0]; + if (dataPointers[index] + + bestbbestcexceptmaxb[1] >= dataTobePacked[index].length) { + int newsize = 2 * (dataPointers[index] + bestbbestcexceptmaxb[1]); + // make sure it is a multiple of 32 + newsize = Util + .floorBy(newsize + 31, 32); + dataTobePacked[index] = Arrays.copyOf( + dataTobePacked[index], newsize); + } + for (int k = 0; k < BLOCK_SIZE; ++k) { + if ((buffer[k] >>> bestbbestcexceptmaxb[0]) != 0) { + // we have an exception + byteContainer.put((byte) k); + dataTobePacked[index][dataPointers[index]++] = buffer[k] >>> tmpbestb; + } + } + + } + for (int k = 0; k < 128; k += 32) { + BitPacking.fastpack(buffer, k, out, tmpoutpos, + tmpbestb); + tmpoutpos += tmpbestb; + } } - for (int k = 0; k < BLOCK_SIZE; ++k) { - if ((buffer[k] >>> bestbbestcexceptmaxb[0]) != 0) { - // we have an exception - byteContainer.put((byte) k); - dataTobePacked[index][dataPointers[index]++] = buffer[k] >>> tmpbestb; - } + constinpos.set(tmpconstinpos); + out[headerpos] = tmpoutpos - headerpos; + while ((byteContainer.position() & 3) != 0) + byteContainer.put((byte) 0); + final int bytesize = byteContainer.position(); + out[tmpoutpos++] = bytesize; + final int howmanyints = bytesize / 4; + byteContainer.flip(); + byteContainer.asIntBuffer().get(out, tmpoutpos, howmanyints); + tmpoutpos += howmanyints; + int bitmap = 0; + for (int k = 1; k <= 32; ++k) { + if (dataPointers[k] != 0) + bitmap |= (1 << (k - 1)); } - - } - for (int k = 0; k < 128; k += 32) { - BitPacking.fastpack(buffer, k, out, tmpoutpos, tmpbestb); - tmpoutpos += tmpbestb; - } - } - constinpos.set(tmpconstinpos); - out[headerpos] = tmpoutpos - headerpos; - while ((byteContainer.position() & 3) != 0) - byteContainer.put((byte) 0); - final int bytesize = byteContainer.position(); - out[tmpoutpos++] = bytesize; - final int howmanyints = bytesize / 4; - byteContainer.flip(); - byteContainer.asIntBuffer().get(out, tmpoutpos, howmanyints); - tmpoutpos += howmanyints; - int bitmap = 0; - for (int k = 1; k <= 32; ++k) { - if (dataPointers[k] != 0) - bitmap |= (1 << (k - 1)); - } - out[tmpoutpos++] = bitmap; - for (int k = 1; k <= 31; ++k) { - if (dataPointers[k] != 0) { - out[tmpoutpos++] = dataPointers[k];// size - for (int j = 0; j < dataPointers[k]; j += 32) { - BitPacking.fastpack(dataTobePacked[k], j, out, tmpoutpos, k); - tmpoutpos += k; + out[tmpoutpos++] = bitmap; + for (int k = 1; k <= 31; ++k) { + if (dataPointers[k] != 0) { + out[tmpoutpos++] = dataPointers[k];// size + for (int j = 0; j < dataPointers[k]; j += 32) { + BitPacking.fastpack(dataTobePacked[k], + j, out, tmpoutpos, k); + tmpoutpos += k; + } + } } - } + outpos.set(tmpoutpos); } - outpos.set(tmpoutpos); - } - /** - * Uncompress data in blocks of 128 integers. In this - * particular case, the inlength parameter is ignored: - * it is deduced from the compressed data. - * - * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) - */ - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - if (inlength == 0) return; + /** + * Uncompress data in blocks of 128 integers. In this particular case, + * the inlength parameter is ignored: it is deduced from the compressed + * data. + * + * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) + */ + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + if (inlength == 0) + return; - int mynvalue = in[inpos.get()]; - inpos.increment(); + int mynvalue = in[inpos.get()]; + inpos.increment(); - dataPointers = new int[33]; - IntWrapper initoffset = new IntWrapper(0); + dataPointers = new int[33]; + IntWrapper initoffset = new IntWrapper(0); - int finalout = outpos.get() + mynvalue; - while (outpos.get() != finalout) { - int thissize = Math.min(pageSize, finalout - outpos.get()); - decodePage(in, inpos, out, outpos, thissize,initoffset); - } + int finalout = outpos.get() + mynvalue; + while (outpos.get() != finalout) { + int thissize = Math.min(pageSize, + finalout - outpos.get()); + decodePage(in, inpos, out, outpos, thissize, initoffset); + } - dataPointers = null; - } + dataPointers = null; + } - private void decodePage(int[] in, IntWrapper inpos, int[] out, - IntWrapper outpos, int thissize,IntWrapper initoffset) { - final int initpos = inpos.get(); - final int wheremeta = in[inpos.get()]; - inpos.increment(); - int inexcept = initpos + wheremeta; - final int bytesize = in[inexcept++]; - byteContainer.clear(); - byteContainer.asIntBuffer().put(in, inexcept, bytesize / 4); - inexcept += bytesize / 4; + private void decodePage(int[] in, IntWrapper inpos, int[] out, + IntWrapper outpos, int thissize, IntWrapper initoffset) { + final int initpos = inpos.get(); + final int wheremeta = in[inpos.get()]; + inpos.increment(); + int inexcept = initpos + wheremeta; + final int bytesize = in[inexcept++]; + byteContainer.clear(); + byteContainer.asIntBuffer().put(in, inexcept, bytesize / 4); + inexcept += bytesize / 4; - final int bitmap = in[inexcept++]; - for (int k = 1; k <= 31; ++k) { - if ((bitmap & (1 << (k - 1))) != 0) { - int size = in[inexcept++]; - if (dataTobePacked[k].length < size) - dataTobePacked[k] = new int[Util.floorBy(size + 31, 32)]; - for (int j = 0; j < size; j += 32) { - BitPacking - .fastunpack(in, inexcept, dataTobePacked[k], j, k); - inexcept += k; + final int bitmap = in[inexcept++]; + for (int k = 1; k <= 31; ++k) { + if ((bitmap & (1 << (k - 1))) != 0) { + int size = in[inexcept++]; + if (dataTobePacked[k].length < size) + dataTobePacked[k] = new int[Util + .floorBy(size + 31, 32)]; + for (int j = 0; j < size; j += 32) { + BitPacking.fastunpack(in, inexcept, + dataTobePacked[k], j, k); + inexcept += k; + } + } } - } - } - Arrays.fill(dataPointers, 0); - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); + Arrays.fill(dataPointers, 0); + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); - for (int run = 0, run_end = thissize / BLOCK_SIZE; run < run_end; ++run, tmpoutpos += BLOCK_SIZE) { - final byte b = byteContainer.get(); - final byte cexcept = byteContainer.get(); - for (int k = 0; k < 128; k += 32) { - BitPacking.fastunpack(in, tmpinpos, out, tmpoutpos + k, b); - tmpinpos += b; - } - if (cexcept > 0) { - final byte maxbits = byteContainer.get(); - final int index = maxbits - b; - for (int k = 0; k < cexcept; ++k) { - final byte pos = byteContainer.get(); - final int exceptvalue = dataTobePacked[index][dataPointers[index]++]; - out[pos + tmpoutpos] |= exceptvalue << b; + for (int run = 0, run_end = thissize / BLOCK_SIZE; run < run_end; ++run, tmpoutpos += BLOCK_SIZE) { + final byte b = byteContainer.get(); + final byte cexcept = byteContainer.get(); + for (int k = 0; k < 128; k += 32) { + BitPacking.fastunpack(in, tmpinpos, out, + tmpoutpos + k, b); + tmpinpos += b; + } + if (cexcept > 0) { + final byte maxbits = byteContainer.get(); + final int index = maxbits - b; + for (int k = 0; k < cexcept; ++k) { + final byte pos = byteContainer.get(); + final int exceptvalue = dataTobePacked[index][dataPointers[index]++]; + out[pos + tmpoutpos] |= exceptvalue << b; + } + } + initoffset.set(Delta.fastinverseDelta(out, tmpoutpos, + BLOCK_SIZE, initoffset.intValue())); } - } - initoffset.set(Delta.fastinverseDelta(out,tmpoutpos,BLOCK_SIZE, initoffset.intValue())); + outpos.set(tmpoutpos); + inpos.set(inexcept); } - outpos.set(tmpoutpos); - inpos.set(inexcept); - } - @Override - public String toString() { - return this.getClass().getSimpleName(); - } + @Override + public String toString() { + return this.getClass().getSimpleName(); + } } diff --git a/src/main/java/me/lemire/integercompression/IntegratedIntegerCODEC.java b/src/main/java/me/lemire/integercompression/IntegratedIntegerCODEC.java index dcfe0c4..7cb07c4 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedIntegerCODEC.java +++ b/src/main/java/me/lemire/integercompression/IntegratedIntegerCODEC.java @@ -6,12 +6,10 @@ */ package me.lemire.integercompression; - /** - * This is just like IntegerCODEC, except that it indicates - * that delta coding is "integrated", so that you don't - * need a separate step for delta coding. - * + * This is just like IntegerCODEC, except that it indicates that delta coding is + * "integrated", so that you don't need a separate step for delta coding. + * * @author Daniel Lemire */ public interface IntegratedIntegerCODEC extends IntegerCODEC { diff --git a/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java b/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java index 010b782..8403776 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java +++ b/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java @@ -1,4 +1,3 @@ - /** * This code is released under the * Apache License Version 2.0 http://www.apache.org/licenses/. @@ -11,127 +10,129 @@ import java.nio.IntBuffer; /** - * Implementation of variable-byte with differential coding. For best performance, - * use it using the IntegratedByteIntegerCODEC interface. - * - * You should only use this scheme on sorted arrays. Use VariableByte - * if you have unsorted arrays. - * - * + * Implementation of variable-byte with differential coding. For best + * performance, use it using the IntegratedByteIntegerCODEC interface. + * + * You should only use this scheme on sorted arrays. Use VariableByte if you + * have unsorted arrays. + * + * * @author Daniel Lemire */ -public class IntegratedVariableByte implements IntegratedIntegerCODEC, IntegratedByteIntegerCODEC { - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - if(inlength == 0) return; - int initoffset = 0; - ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); - for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { - int val = in[k] - initoffset; - initoffset = in[k]; - do { - int b = (val & 127); - val >>>= 7; - if (val != 0) { - b |= 128; +public class IntegratedVariableByte implements IntegratedIntegerCODEC, + IntegratedByteIntegerCODEC { + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + if (inlength == 0) + return; + int initoffset = 0; + ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); + for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { + int val = in[k] - initoffset; + initoffset = in[k]; + do { + int b = (val & 127); + val >>>= 7; + if (val != 0) { + b |= 128; + } + buf.put((byte) b); + } while (val != 0); } - buf.put((byte) b); - } while (val != 0); + while (buf.position() % 4 != 0) + buf.put((byte) 128); + final int length = buf.position(); + buf.flip(); + IntBuffer ibuf = buf.asIntBuffer(); + ibuf.get(out, outpos.get(), length / 4); + outpos.add(length / 4); + inpos.add(inlength); } - while (buf.position() % 4 != 0) - buf.put((byte) 128); - final int length = buf.position(); - buf.flip(); - IntBuffer ibuf = buf.asIntBuffer(); - ibuf.get(out, outpos.get(), length / 4); - outpos.add(length / 4); - inpos.add(inlength); - } - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, byte[] out, - IntWrapper outpos) { - if(inlength == 0) return; - int outp = outpos.get(); - int initoffset = 0; - - for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { - int val = in[k] - initoffset; - initoffset = in[k]; - do { - int b = (val & 127); - val >>>= 7; - if (val != 0) { - b |= 128; + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, + byte[] out, IntWrapper outpos) { + if (inlength == 0) + return; + int outp = outpos.get(); + int initoffset = 0; + + for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { + int val = in[k] - initoffset; + initoffset = in[k]; + do { + int b = (val & 127); + val >>>= 7; + if (val != 0) { + b |= 128; + } + out[outp++] = (byte) b; + } while (val != 0); } - out[outp++]= (byte) b; - } while (val != 0); + outpos.set(outp); + inpos.add(inlength); } - outpos.set(outp); - inpos.add(inlength); - } - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { - if(inlength == 0) return; - int s = 0; - int p = inpos.get(); - int finalp = inpos.get() + inlength; - int tmpoutpos = outpos.get(); - int initoffset = 0; - for (int v = 0, shift = 0; p < finalp; ) { - int c = (byte) (in[p] >>> (24 - s)); - s += 8; - if (s == 32) { - s = 0; - p++; - } - v += ((c & 127) << shift); - if ((c & 128) == 0) { - out[tmpoutpos] = v + initoffset; - initoffset = out[tmpoutpos]; - tmpoutpos++; - v = 0; - shift = 0; - } else - shift += 7; + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + if (inlength == 0) + return; + int s = 0; + int p = inpos.get(); + int finalp = inpos.get() + inlength; + int tmpoutpos = outpos.get(); + int initoffset = 0; + for (int v = 0, shift = 0; p < finalp;) { + int c = (byte) (in[p] >>> (24 - s)); + s += 8; + if (s == 32) { + s = 0; + p++; + } + v += ((c & 127) << shift); + if ((c & 128) == 0) { + out[tmpoutpos] = v + initoffset; + initoffset = out[tmpoutpos]; + tmpoutpos++; + v = 0; + shift = 0; + } else + shift += 7; + } + outpos.set(tmpoutpos); + inpos.add(inlength); } - outpos.set(tmpoutpos); - inpos.add(inlength); - } - @Override - public void uncompress(byte[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { - int s = 0; - int p = inpos.get(); - int finalp = inpos.get() + inlength; - int tmpoutpos = outpos.get(); - int v = 0; - int shift = 0; - int initoffset = 0; - for (; p < finalp; ++p) { - byte c = in[p]; - v += ((c & 127) << shift); - if ((c & 128) == 0) { - out[tmpoutpos] = v + initoffset; - initoffset = out[tmpoutpos]; - v = 0; - ++tmpoutpos; - shift = 0; - } else - shift += 7; + @Override + public void uncompress(byte[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + int p = inpos.get(); + int finalp = inpos.get() + inlength; + int tmpoutpos = outpos.get(); + int v = 0; + int shift = 0; + int initoffset = 0; + for (; p < finalp; ++p) { + byte c = in[p]; + v += ((c & 127) << shift); + if ((c & 128) == 0) { + out[tmpoutpos] = v + initoffset; + initoffset = out[tmpoutpos]; + v = 0; + ++tmpoutpos; + shift = 0; + } else + shift += 7; + } + outpos.set(tmpoutpos); + inpos.add(p); } - outpos.set(tmpoutpos); - inpos.add(p); - } - - @Override - public String toString() { - return this.getClass().getSimpleName(); - } + @Override + public String toString() { + return this.getClass().getSimpleName(); + } } diff --git a/src/main/java/me/lemire/integercompression/JustCopy.java b/src/main/java/me/lemire/integercompression/JustCopy.java index 2ef2f7a..a385bde 100644 --- a/src/main/java/me/lemire/integercompression/JustCopy.java +++ b/src/main/java/me/lemire/integercompression/JustCopy.java @@ -7,32 +7,31 @@ package me.lemire.integercompression; - /** * @author Daniel Lemire - * + * */ public final class JustCopy implements IntegerCODEC { - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - System.arraycopy(in, inpos.get(), out, outpos.get(), inlength); - inpos.add(inlength); - outpos.add(inlength); - } - - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - System.arraycopy(in, inpos.get(), out, outpos.get(), inlength); - inpos.add(inlength); - outpos.add(inlength); - } - - - @Override - public String toString() { - return this.getClass().getSimpleName(); - } - + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + System.arraycopy(in, inpos.get(), out, outpos.get(), inlength); + inpos.add(inlength); + outpos.add(inlength); + } + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + System.arraycopy(in, inpos.get(), out, outpos.get(), inlength); + inpos.add(inlength); + outpos.add(inlength); + } + + @Override + public String toString() { + return this.getClass().getSimpleName(); + } } diff --git a/src/main/java/me/lemire/integercompression/NewPFD.java b/src/main/java/me/lemire/integercompression/NewPFD.java index cca9093..0bb5c02 100644 --- a/src/main/java/me/lemire/integercompression/NewPFD.java +++ b/src/main/java/me/lemire/integercompression/NewPFD.java @@ -8,7 +8,7 @@ package me.lemire.integercompression; /** - * NewPFD/NewPFOR + * NewPFD/NewPFOR *

* Follows: *

@@ -17,151 +17,158 @@ *

* using Simple16 as the secondary coder. * - * Note that this does not use differential coding: if you are working on - * sorted lists, you must compute the deltas separately. (Yes, this is true even - * though the "D" at the end of the name probably stands for delta.) + * Note that this does not use differential coding: if you are working on sorted + * lists, you must compute the deltas separately. (Yes, this is true even though + * the "D" at the end of the name probably stands for delta.) + * + * For multi-threaded applications, each thread should use its own NewPFD + * object. * - * For multi-threaded applications, each thread should use its own NewPFD object. - * * @author Daniel Lemire */ public final class NewPFD implements IntegerCODEC { - final int PageSize; - final static int BlockSize = 128; + final int PageSize; + final static int BlockSize = 128; - int[] exceptbuffer = new int[2 * BlockSize]; - - /** - * Constructor for the NewPFD CODEC. - */ - public NewPFD() { - PageSize = 65536; - } + int[] exceptbuffer = new int[2 * BlockSize]; - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - inlength = inlength / BlockSize * BlockSize; - if(inlength == 0) return; - final int finalinpos = inpos.get() + inlength; - out[outpos.get()] = inlength; - outpos.increment(); - while (inpos.get() != finalinpos) { - int thissize = finalinpos > PageSize + inpos.get() ? PageSize - : (finalinpos - inpos.get()); - encodePage(in, inpos, thissize, out, outpos); + /** + * Constructor for the NewPFD CODEC. + */ + public NewPFD() { + PageSize = 65536; } - } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + inlength = inlength / BlockSize * BlockSize; + if (inlength == 0) + return; + final int finalinpos = inpos.get() + inlength; + out[outpos.get()] = inlength; + outpos.increment(); + while (inpos.get() != finalinpos) { + int thissize = finalinpos > PageSize + inpos.get() ? PageSize + : (finalinpos - inpos.get()); + encodePage(in, inpos, thissize, out, outpos); + } + + } - protected static final int[] bits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 16, 20, 32}; - protected static final int[] invbits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16}; + protected static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 16, 20, 32 }; + protected static final int[] invbits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16 }; - protected static void getBestBFromData(int[] in, int pos, IntWrapper bestb, - IntWrapper bestexcept) { - final int mb = Util.maxbits(in, pos, BlockSize); - int mini = 0; - if (mini + 28 < bits[invbits[mb]]) - mini = bits[invbits[mb]] - 28; // 28 is the max for exceptions - int besti = bits.length - 1; - int exceptcounter = 0; - for (int i = mini; i < bits.length - 1; ++i) { - int tmpcounter = 0; - for (int k = pos; k < BlockSize + pos; ++k) - if ((in[k] >>> bits[i]) != 0) - ++tmpcounter; - if (tmpcounter * 10 <= BlockSize) { - besti = i; - exceptcounter = tmpcounter; - break; - } + protected static void getBestBFromData(int[] in, int pos, + IntWrapper bestb, IntWrapper bestexcept) { + final int mb = Util.maxbits(in, pos, BlockSize); + int mini = 0; + if (mini + 28 < bits[invbits[mb]]) + mini = bits[invbits[mb]] - 28; // 28 is the max for + // exceptions + int besti = bits.length - 1; + int exceptcounter = 0; + for (int i = mini; i < bits.length - 1; ++i) { + int tmpcounter = 0; + for (int k = pos; k < BlockSize + pos; ++k) + if ((in[k] >>> bits[i]) != 0) + ++tmpcounter; + if (tmpcounter * 10 <= BlockSize) { + besti = i; + exceptcounter = tmpcounter; + break; + } + } + bestb.set(besti); + bestexcept.set(exceptcounter); } - bestb.set(besti); - bestexcept.set(exceptcounter); - } - private void encodePage(int[] in, IntWrapper inpos, int thissize, - int[] out, IntWrapper outpos) { - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); - IntWrapper bestb = new IntWrapper(); - IntWrapper bestexcept = new IntWrapper(); - for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { - getBestBFromData(in, tmpinpos, bestb, bestexcept); - final int tmpbestb = bestb.get(); - final int nbrexcept = bestexcept.get(); - int exceptsize = 0; - final int remember = tmpoutpos; - tmpoutpos++; - if (nbrexcept > 0) { - for (int i = 0, c = 0; i < BlockSize; ++i) { - if ((in[tmpinpos + i] >>> bits[tmpbestb])!=0) { - exceptbuffer[c + nbrexcept] = i; - exceptbuffer[c] = in[tmpinpos + i] >>> bits[tmpbestb]; - ++c; - } + private void encodePage(int[] in, IntWrapper inpos, int thissize, + int[] out, IntWrapper outpos) { + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); + IntWrapper bestb = new IntWrapper(); + IntWrapper bestexcept = new IntWrapper(); + for (final int finalinpos = tmpinpos + thissize; tmpinpos + + BlockSize <= finalinpos; tmpinpos += BlockSize) { + getBestBFromData(in, tmpinpos, bestb, bestexcept); + final int tmpbestb = bestb.get(); + final int nbrexcept = bestexcept.get(); + int exceptsize = 0; + final int remember = tmpoutpos; + tmpoutpos++; + if (nbrexcept > 0) { + for (int i = 0, c = 0; i < BlockSize; ++i) { + if ((in[tmpinpos + i] >>> bits[tmpbestb]) != 0) { + exceptbuffer[c + nbrexcept] = i; + exceptbuffer[c] = in[tmpinpos + + i] >>> bits[tmpbestb]; + ++c; + } + } + exceptsize = S16.compress(exceptbuffer, 0, + 2 * nbrexcept, out, tmpoutpos); + tmpoutpos += exceptsize; + } + out[remember] = tmpbestb | (nbrexcept << 8) + | (exceptsize << 16); + for (int k = 0; k < BlockSize; k += 32) { + BitPacking.fastpack(in, tmpinpos + k, out, + tmpoutpos, bits[tmpbestb]); + tmpoutpos += bits[tmpbestb]; + } } - exceptsize = S16.compress(exceptbuffer, 0, 2 * nbrexcept, out, - tmpoutpos); - tmpoutpos += exceptsize; - } - out[remember] = tmpbestb | (nbrexcept << 8) | (exceptsize << 16); - for (int k = 0; k < BlockSize; k += 32) { - BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, - bits[tmpbestb]); - tmpoutpos += bits[tmpbestb]; - } + inpos.set(tmpinpos); + outpos.set(tmpoutpos); } - inpos.set(tmpinpos); - outpos.set(tmpoutpos); - } - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - if(inlength == 0) return; - int mynvalue = in[inpos.get()]; - inpos.increment(); - final int finalout = outpos.get() + mynvalue; - while (outpos.get() != finalout) { - int thissize = finalout > PageSize + outpos.get() ? PageSize - : (finalout - outpos.get()); - decodePage(in, inpos, out, outpos, thissize); + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + if (inlength == 0) + return; + int mynvalue = in[inpos.get()]; + inpos.increment(); + final int finalout = outpos.get() + mynvalue; + while (outpos.get() != finalout) { + int thissize = finalout > PageSize + outpos.get() ? PageSize + : (finalout - outpos.get()); + decodePage(in, inpos, out, outpos, thissize); + } } - } - private void decodePage(int[] in, IntWrapper inpos, int[] out, - IntWrapper outpos, int thissize) { - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); + private void decodePage(int[] in, IntWrapper inpos, int[] out, + IntWrapper outpos, int thissize) { + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); - for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { - final int b = in[tmpinpos] & 0xFF; - final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; - final int exceptsize = (in[tmpinpos] >>> 16); - ++tmpinpos; - S16.uncompress(in, tmpinpos, exceptsize, exceptbuffer, 0, - 2 * cexcept); - tmpinpos += exceptsize; - for (int k = 0; k < BlockSize; k += 32) { - BitPacking - .fastunpack(in, tmpinpos, out, tmpoutpos + k, bits[b]); - tmpinpos += bits[b]; - } - for (int k = 0; k < cexcept; ++k) { - out[tmpoutpos + exceptbuffer[k + cexcept]] |= (exceptbuffer[k] << bits[b]); - } + for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { + final int b = in[tmpinpos] & 0xFF; + final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; + final int exceptsize = (in[tmpinpos] >>> 16); + ++tmpinpos; + S16.uncompress(in, tmpinpos, exceptsize, exceptbuffer, + 0, 2 * cexcept); + tmpinpos += exceptsize; + for (int k = 0; k < BlockSize; k += 32) { + BitPacking.fastunpack(in, tmpinpos, out, + tmpoutpos + k, bits[b]); + tmpinpos += bits[b]; + } + for (int k = 0; k < cexcept; ++k) { + out[tmpoutpos + exceptbuffer[k + cexcept]] |= (exceptbuffer[k] << bits[b]); + } + } + outpos.set(tmpoutpos); + inpos.set(tmpinpos); } - outpos.set(tmpoutpos); - inpos.set(tmpinpos); - } - @Override - public String toString() { - return this.getClass().getSimpleName(); - } + @Override + public String toString() { + return this.getClass().getSimpleName(); + } } diff --git a/src/main/java/me/lemire/integercompression/NewPFDS16.java b/src/main/java/me/lemire/integercompression/NewPFDS16.java index fd444ba..ab6ad71 100644 --- a/src/main/java/me/lemire/integercompression/NewPFDS16.java +++ b/src/main/java/me/lemire/integercompression/NewPFDS16.java @@ -8,7 +8,7 @@ package me.lemire.integercompression; /** - * NewPFD/NewPFOR + * NewPFD/NewPFOR *

* Follows: *

@@ -17,150 +17,157 @@ *

* using Simple16 as the secondary coder. * - * Note that this does not use differential coding: if you are working on - * sorted lists, you must compute the deltas separately. + * Note that this does not use differential coding: if you are working on sorted + * lists, you must compute the deltas separately. + * + * For multi-threaded applications, each thread should use its own NewPFDS16 + * object. * - * For multi-threaded applications, each thread should use its own NewPFDS16 object. - * * @author Daniel Lemire */ public final class NewPFDS16 implements IntegerCODEC { - final int PageSize; - final static int BlockSize = 128; - - int[] exceptbuffer = new int[2 * BlockSize]; + final int PageSize; + final static int BlockSize = 128; - /** - * Constructor for the NewPFDS16 CODEC. - */ - public NewPFDS16() { - PageSize = 65536; - } + int[] exceptbuffer = new int[2 * BlockSize]; - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - inlength = inlength / BlockSize * BlockSize; - if(inlength == 0) return; - final int finalinpos = inpos.get() + inlength; - out[outpos.get()] = inlength; - outpos.increment(); - while (inpos.get() != finalinpos) { - int thissize = finalinpos > PageSize + inpos.get() ? PageSize - : (finalinpos - inpos.get()); - encodePage(in, inpos, thissize, out, outpos); + /** + * Constructor for the NewPFDS16 CODEC. + */ + public NewPFDS16() { + PageSize = 65536; } - } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + inlength = inlength / BlockSize * BlockSize; + if (inlength == 0) + return; + final int finalinpos = inpos.get() + inlength; + out[outpos.get()] = inlength; + outpos.increment(); + while (inpos.get() != finalinpos) { + int thissize = finalinpos > PageSize + inpos.get() ? PageSize + : (finalinpos - inpos.get()); + encodePage(in, inpos, thissize, out, outpos); + } + + } - protected static final int[] bits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 16, 20, 32}; - protected static final int[] invbits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16}; + protected static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 16, 20, 32 }; + protected static final int[] invbits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16 }; - protected static void getBestBFromData(int[] in, int pos, IntWrapper bestb, - IntWrapper bestexcept) { - final int mb = Util.maxbits(in, pos, BlockSize); - int mini = 0; - if (mini + 28 < bits[invbits[mb]]) - mini = bits[invbits[mb]] - 28; // 28 is the max for exceptions - int besti = bits.length - 1; - int exceptcounter = 0; - for (int i = mini; i < bits.length - 1; ++i) { - int tmpcounter = 0; - for (int k = pos; k < BlockSize + pos; ++k) - if ((in[k] >>> bits[i])!=0) - ++tmpcounter; - if (tmpcounter * 10 <= BlockSize) { - besti = i; - exceptcounter = tmpcounter; - break; - } + protected static void getBestBFromData(int[] in, int pos, + IntWrapper bestb, IntWrapper bestexcept) { + final int mb = Util.maxbits(in, pos, BlockSize); + int mini = 0; + if (mini + 28 < bits[invbits[mb]]) + mini = bits[invbits[mb]] - 28; // 28 is the max for + // exceptions + int besti = bits.length - 1; + int exceptcounter = 0; + for (int i = mini; i < bits.length - 1; ++i) { + int tmpcounter = 0; + for (int k = pos; k < BlockSize + pos; ++k) + if ((in[k] >>> bits[i]) != 0) + ++tmpcounter; + if (tmpcounter * 10 <= BlockSize) { + besti = i; + exceptcounter = tmpcounter; + break; + } + } + bestb.set(besti); + bestexcept.set(exceptcounter); } - bestb.set(besti); - bestexcept.set(exceptcounter); - } - private void encodePage(int[] in, IntWrapper inpos, int thissize, - int[] out, IntWrapper outpos) { - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); - IntWrapper bestb = new IntWrapper(); - IntWrapper bestexcept = new IntWrapper(); - for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { - getBestBFromData(in, tmpinpos, bestb, bestexcept); - final int tmpbestb = bestb.get(); - final int nbrexcept = bestexcept.get(); - int exceptsize = 0; - final int remember = tmpoutpos; - tmpoutpos++; - if (nbrexcept > 0) { - for (int i = 0, c = 0; i < BlockSize; ++i) { - if ((in[tmpinpos + i]>>> bits[tmpbestb])!= 0) { - exceptbuffer[c + nbrexcept] = i; - exceptbuffer[c] = in[tmpinpos + i] >>> bits[tmpbestb]; - ++c; - } + private void encodePage(int[] in, IntWrapper inpos, int thissize, + int[] out, IntWrapper outpos) { + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); + IntWrapper bestb = new IntWrapper(); + IntWrapper bestexcept = new IntWrapper(); + for (final int finalinpos = tmpinpos + thissize; tmpinpos + + BlockSize <= finalinpos; tmpinpos += BlockSize) { + getBestBFromData(in, tmpinpos, bestb, bestexcept); + final int tmpbestb = bestb.get(); + final int nbrexcept = bestexcept.get(); + int exceptsize = 0; + final int remember = tmpoutpos; + tmpoutpos++; + if (nbrexcept > 0) { + for (int i = 0, c = 0; i < BlockSize; ++i) { + if ((in[tmpinpos + i] >>> bits[tmpbestb]) != 0) { + exceptbuffer[c + nbrexcept] = i; + exceptbuffer[c] = in[tmpinpos + + i] >>> bits[tmpbestb]; + ++c; + } + } + exceptsize = S16.compress(exceptbuffer, 0, + 2 * nbrexcept, out, tmpoutpos); + tmpoutpos += exceptsize; + } + out[remember] = tmpbestb | (nbrexcept << 8) + | (exceptsize << 16); + for (int k = 0; k < BlockSize; k += 32) { + BitPacking.fastpack(in, tmpinpos + k, out, + tmpoutpos, bits[tmpbestb]); + tmpoutpos += bits[tmpbestb]; + } } - exceptsize = S16.compress(exceptbuffer, 0, 2 * nbrexcept, out, - tmpoutpos); - tmpoutpos += exceptsize; - } - out[remember] = tmpbestb | (nbrexcept << 8) | (exceptsize << 16); - for (int k = 0; k < BlockSize; k += 32) { - BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, - bits[tmpbestb]); - tmpoutpos += bits[tmpbestb]; - } + inpos.set(tmpinpos); + outpos.set(tmpoutpos); } - inpos.set(tmpinpos); - outpos.set(tmpoutpos); - } - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - if(inlength == 0) return; - final int mynvalue = in[inpos.get()]; - inpos.increment(); - int finalout = outpos.get() + mynvalue; - while (outpos.get() != finalout) { - int thissize = finalout > PageSize + outpos.get() ? PageSize - : (finalout - outpos.get()); - decodePage(in, inpos, out, outpos, thissize); + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + if (inlength == 0) + return; + final int mynvalue = in[inpos.get()]; + inpos.increment(); + int finalout = outpos.get() + mynvalue; + while (outpos.get() != finalout) { + int thissize = finalout > PageSize + outpos.get() ? PageSize + : (finalout - outpos.get()); + decodePage(in, inpos, out, outpos, thissize); + } } - } - private void decodePage(int[] in, IntWrapper inpos, int[] out, - IntWrapper outpos, int thissize) { - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); + private void decodePage(int[] in, IntWrapper inpos, int[] out, + IntWrapper outpos, int thissize) { + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); - for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { - final int b = in[tmpinpos] & 0xFF; - final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; - final int exceptsize = (in[tmpinpos] >>> 16); - ++tmpinpos; - S16.uncompress(in, tmpinpos, exceptsize, exceptbuffer, 0, - 2 * cexcept); - tmpinpos += exceptsize; - for (int k = 0; k < BlockSize; k += 32) { - BitPacking - .fastunpack(in, tmpinpos, out, tmpoutpos + k, bits[b]); - tmpinpos += bits[b]; - } - for (int k = 0; k < cexcept; ++k) { - out[tmpoutpos + exceptbuffer[k + cexcept]] |= (exceptbuffer[k] << bits[b]); - } + for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { + final int b = in[tmpinpos] & 0xFF; + final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; + final int exceptsize = (in[tmpinpos] >>> 16); + ++tmpinpos; + S16.uncompress(in, tmpinpos, exceptsize, exceptbuffer, + 0, 2 * cexcept); + tmpinpos += exceptsize; + for (int k = 0; k < BlockSize; k += 32) { + BitPacking.fastunpack(in, tmpinpos, out, + tmpoutpos + k, bits[b]); + tmpinpos += bits[b]; + } + for (int k = 0; k < cexcept; ++k) { + out[tmpoutpos + exceptbuffer[k + cexcept]] |= (exceptbuffer[k] << bits[b]); + } + } + outpos.set(tmpoutpos); + inpos.set(tmpinpos); } - outpos.set(tmpoutpos); - inpos.set(tmpinpos); - } - @Override - public String toString() { - return this.getClass().getSimpleName(); - } + @Override + public String toString() { + return this.getClass().getSimpleName(); + } } diff --git a/src/main/java/me/lemire/integercompression/NewPFDS9.java b/src/main/java/me/lemire/integercompression/NewPFDS9.java index f651e84..e4a4040 100644 --- a/src/main/java/me/lemire/integercompression/NewPFDS9.java +++ b/src/main/java/me/lemire/integercompression/NewPFDS9.java @@ -17,150 +17,157 @@ *

* using Simple9 as the secondary coder. * - * Note that this does not use differential coding: if you are working on - * sorted lists, you must compute the deltas separately. + * Note that this does not use differential coding: if you are working on sorted + * lists, you must compute the deltas separately. + * + * For multi-threaded applications, each thread should use its own NewPFDS9 + * object. * - * For multi-threaded applications, each thread should use its own NewPFDS9 object. - * * @author Daniel Lemire */ public final class NewPFDS9 implements IntegerCODEC { - final int PageSize; - final static int BlockSize = 128; - - int[] exceptbuffer = new int[2 * BlockSize]; + final int PageSize; + final static int BlockSize = 128; - /** - * Constructor for the NewPFDS9 CODEC. - */ - public NewPFDS9() { - PageSize = 65536; - } + int[] exceptbuffer = new int[2 * BlockSize]; - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - inlength = inlength / BlockSize * BlockSize; - if(inlength == 0) return; - final int finalinpos = inpos.get() + inlength; - out[outpos.get()] = inlength; - outpos.increment(); - while (inpos.get() != finalinpos) { - int thissize = finalinpos > PageSize + inpos.get() ? PageSize - : (finalinpos - inpos.get()); - encodePage(in, inpos, thissize, out, outpos); + /** + * Constructor for the NewPFDS9 CODEC. + */ + public NewPFDS9() { + PageSize = 65536; } - } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + inlength = inlength / BlockSize * BlockSize; + if (inlength == 0) + return; + final int finalinpos = inpos.get() + inlength; + out[outpos.get()] = inlength; + outpos.increment(); + while (inpos.get() != finalinpos) { + int thissize = finalinpos > PageSize + inpos.get() ? PageSize + : (finalinpos - inpos.get()); + encodePage(in, inpos, thissize, out, outpos); + } + + } - protected static final int[] bits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 16, 20, 32}; - protected static final int[] invbits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16}; + protected static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 16, 20, 32 }; + protected static final int[] invbits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16 }; - protected static void getBestBFromData(int[] in, int pos, IntWrapper bestb, - IntWrapper bestexcept) { - final int mb = Util.maxbits(in, pos, BlockSize); - int mini = 0; - if (mini + 28 < bits[invbits[mb]]) - mini = bits[invbits[mb]] - 28; // 28 is the max for exceptions - int besti = bits.length - 1; - int exceptcounter = 0; - for (int i = mini; i < bits.length - 1; ++i) { - int tmpcounter = 0; - for (int k = pos; k < BlockSize + pos; ++k) - if ((in[k] >>> bits[i])!=0) - ++tmpcounter; - if (tmpcounter * 10 <= BlockSize) { - besti = i; - exceptcounter = tmpcounter; - break; - } + protected static void getBestBFromData(int[] in, int pos, + IntWrapper bestb, IntWrapper bestexcept) { + final int mb = Util.maxbits(in, pos, BlockSize); + int mini = 0; + if (mini + 28 < bits[invbits[mb]]) + mini = bits[invbits[mb]] - 28; // 28 is the max for + // exceptions + int besti = bits.length - 1; + int exceptcounter = 0; + for (int i = mini; i < bits.length - 1; ++i) { + int tmpcounter = 0; + for (int k = pos; k < BlockSize + pos; ++k) + if ((in[k] >>> bits[i]) != 0) + ++tmpcounter; + if (tmpcounter * 10 <= BlockSize) { + besti = i; + exceptcounter = tmpcounter; + break; + } + } + bestb.set(besti); + bestexcept.set(exceptcounter); } - bestb.set(besti); - bestexcept.set(exceptcounter); - } - private void encodePage(int[] in, IntWrapper inpos, int thissize, - int[] out, IntWrapper outpos) { - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); - IntWrapper bestb = new IntWrapper(); - IntWrapper bestexcept = new IntWrapper(); - for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { - getBestBFromData(in, tmpinpos, bestb, bestexcept); - final int tmpbestb = bestb.get(); - final int nbrexcept = bestexcept.get(); - int exceptsize = 0; - final int remember = tmpoutpos; - tmpoutpos++; - if (nbrexcept > 0) { - for (int i = 0, c = 0; i < BlockSize; ++i) { - if ((in[tmpinpos + i]>>> bits[tmpbestb])!= 0) { - exceptbuffer[c + nbrexcept] = i; - exceptbuffer[c] = in[tmpinpos + i] >>> bits[tmpbestb]; - ++c; - } + private void encodePage(int[] in, IntWrapper inpos, int thissize, + int[] out, IntWrapper outpos) { + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); + IntWrapper bestb = new IntWrapper(); + IntWrapper bestexcept = new IntWrapper(); + for (final int finalinpos = tmpinpos + thissize; tmpinpos + + BlockSize <= finalinpos; tmpinpos += BlockSize) { + getBestBFromData(in, tmpinpos, bestb, bestexcept); + final int tmpbestb = bestb.get(); + final int nbrexcept = bestexcept.get(); + int exceptsize = 0; + final int remember = tmpoutpos; + tmpoutpos++; + if (nbrexcept > 0) { + for (int i = 0, c = 0; i < BlockSize; ++i) { + if ((in[tmpinpos + i] >>> bits[tmpbestb]) != 0) { + exceptbuffer[c + nbrexcept] = i; + exceptbuffer[c] = in[tmpinpos + + i] >>> bits[tmpbestb]; + ++c; + } + } + exceptsize = S9.compress(exceptbuffer, 0, + 2 * nbrexcept, out, tmpoutpos); + tmpoutpos += exceptsize; + } + out[remember] = tmpbestb | (nbrexcept << 8) + | (exceptsize << 16); + for (int k = 0; k < BlockSize; k += 32) { + BitPacking.fastpack(in, tmpinpos + k, out, + tmpoutpos, bits[tmpbestb]); + tmpoutpos += bits[tmpbestb]; + } } - exceptsize = S9.compress(exceptbuffer, 0, 2 * nbrexcept, out, - tmpoutpos); - tmpoutpos += exceptsize; - } - out[remember] = tmpbestb | (nbrexcept << 8) | (exceptsize << 16); - for (int k = 0; k < BlockSize; k += 32) { - BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, - bits[tmpbestb]); - tmpoutpos += bits[tmpbestb]; - } + inpos.set(tmpinpos); + outpos.set(tmpoutpos); } - inpos.set(tmpinpos); - outpos.set(tmpoutpos); - } - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - if(inlength == 0) return; - final int mynvalue = in[inpos.get()]; - inpos.increment(); - int finalout = outpos.get() + mynvalue; - while (outpos.get() != finalout) { - int thissize = finalout > PageSize + outpos.get() ? PageSize - : (finalout - outpos.get()); - decodePage(in, inpos, out, outpos, thissize); + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + if (inlength == 0) + return; + final int mynvalue = in[inpos.get()]; + inpos.increment(); + int finalout = outpos.get() + mynvalue; + while (outpos.get() != finalout) { + int thissize = finalout > PageSize + outpos.get() ? PageSize + : (finalout - outpos.get()); + decodePage(in, inpos, out, outpos, thissize); + } } - } - private void decodePage(int[] in, IntWrapper inpos, int[] out, - IntWrapper outpos, int thissize) { - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); + private void decodePage(int[] in, IntWrapper inpos, int[] out, + IntWrapper outpos, int thissize) { + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); - for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { - final int b = in[tmpinpos] & 0xFF; - final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; - final int exceptsize = (in[tmpinpos] >>> 16); - ++tmpinpos; - S9.uncompress(in, tmpinpos, exceptsize, exceptbuffer, 0, - 2 * cexcept); - tmpinpos += exceptsize; - for (int k = 0; k < BlockSize; k += 32) { - BitPacking - .fastunpack(in, tmpinpos, out, tmpoutpos + k, bits[b]); - tmpinpos += bits[b]; - } - for (int k = 0; k < cexcept; ++k) { - out[tmpoutpos + exceptbuffer[k + cexcept]] |= (exceptbuffer[k] << bits[b]); - } + for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { + final int b = in[tmpinpos] & 0xFF; + final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; + final int exceptsize = (in[tmpinpos] >>> 16); + ++tmpinpos; + S9.uncompress(in, tmpinpos, exceptsize, exceptbuffer, + 0, 2 * cexcept); + tmpinpos += exceptsize; + for (int k = 0; k < BlockSize; k += 32) { + BitPacking.fastunpack(in, tmpinpos, out, + tmpoutpos + k, bits[b]); + tmpinpos += bits[b]; + } + for (int k = 0; k < cexcept; ++k) { + out[tmpoutpos + exceptbuffer[k + cexcept]] |= (exceptbuffer[k] << bits[b]); + } + } + outpos.set(tmpoutpos); + inpos.set(tmpinpos); } - outpos.set(tmpoutpos); - inpos.set(tmpinpos); - } - @Override - public String toString() { - return this.getClass().getSimpleName(); - } + @Override + public String toString() { + return this.getClass().getSimpleName(); + } } diff --git a/src/main/java/me/lemire/integercompression/OptPFD.java b/src/main/java/me/lemire/integercompression/OptPFD.java index 8e02ac7..4fed157 100644 --- a/src/main/java/me/lemire/integercompression/OptPFD.java +++ b/src/main/java/me/lemire/integercompression/OptPFD.java @@ -7,7 +7,7 @@ package me.lemire.integercompression; /** - * OptPFD + * OptPFD *

* Follows: *

@@ -15,168 +15,177 @@ * with optimized document ordering, in: WWW �09, 2009, pp. 401�410. *

* using Simple16 as the secondary coder. - * - * Note that this does not use differential coding: if you are working on - * sorted lists, you must compute the deltas separately. (Yes, this is true even - * though the "D" at the end of the name probably stands for delta.) - * - * For multi-threaded applications, each thread should use its own OptPFD object. + * + * Note that this does not use differential coding: if you are working on sorted + * lists, you must compute the deltas separately. (Yes, this is true even though + * the "D" at the end of the name probably stands for delta.) + * + * For multi-threaded applications, each thread should use its own OptPFD + * object. * * @author Daniel Lemire */ public final class OptPFD implements IntegerCODEC { - final int PageSize; - final static int BlockSize = 128; + final int PageSize; + final static int BlockSize = 128; + + int[] exceptbuffer = new int[2 * BlockSize]; + int[] sillybuffer = new int[2 * BlockSize]; - int[] exceptbuffer = new int[2 * BlockSize]; - int[] sillybuffer = new int[2 * BlockSize]; + /** + * Constructor for the OptPFD CODEC. + */ + public OptPFD() { + PageSize = 65536; + } - /** - * Constructor for the OptPFD CODEC. - */ - public OptPFD() { - PageSize = 65536; - } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + inlength = inlength / BlockSize * BlockSize; + if (inlength == 0) + return; + final int finalinpos = inpos.get() + inlength; + out[outpos.get()] = inlength; + outpos.increment(); + while (inpos.get() != finalinpos) { + int thissize = finalinpos > PageSize + inpos.get() ? PageSize + : (finalinpos - inpos.get()); + encodePage(in, inpos, thissize, out, outpos); + } - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - inlength = inlength / BlockSize * BlockSize; - if(inlength == 0) return; - final int finalinpos = inpos.get() + inlength; - out[outpos.get()] = inlength; - outpos.increment(); - while (inpos.get() != finalinpos) { - int thissize = finalinpos > PageSize + inpos.get() ? PageSize - : (finalinpos - inpos.get()); - encodePage(in, inpos, thissize, out, outpos); } - } + protected static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 16, 20, 32 }; + protected static final int[] invbits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16 }; - protected static final int[] bits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 16, 20, 32}; - protected static final int[] invbits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16}; + void getBestBFromData(int[] in, int pos, IntWrapper bestb, + IntWrapper bestexcept) { + final int mb = Util.maxbits(in, pos, BlockSize); + int mini = 0; + if (mini + 28 < bits[invbits[mb]]) + mini = bits[invbits[mb]] - 28; // 28 is the max for + // exceptions + int besti = bits.length - 1; + int bestcost = bits[besti] * 4; + int exceptcounter = 0; + for (int i = mini; i < bits.length - 1; ++i) { + int tmpcounter = 0; + for (int k = pos; k < BlockSize + pos; ++k) + if ((in[k] >>> bits[i]) != 0) { + ++tmpcounter; + } + if (tmpcounter == BlockSize) + continue; // no need + for (int k = pos, c = 0; k < pos + BlockSize; ++k) + if ((in[k] >>> bits[i]) != 0) { + exceptbuffer[tmpcounter + c] = k - pos; + exceptbuffer[c] = in[k] >>> bits[i]; + ++c; + } - void getBestBFromData(int[] in, int pos, IntWrapper bestb, - IntWrapper bestexcept) { - final int mb = Util.maxbits(in, pos, BlockSize); - int mini = 0; - if (mini + 28 < bits[invbits[mb]]) - mini = bits[invbits[mb]] - 28; // 28 is the max for exceptions - int besti = bits.length - 1; - int bestcost = bits[besti] * 4; - int exceptcounter = 0; - for (int i = mini; i < bits.length - 1; ++i) { - int tmpcounter = 0; - for (int k = pos; k < BlockSize + pos; ++k) - if ((in[k] >>> bits[i])!=0) { - ++tmpcounter; - } - if (tmpcounter == BlockSize) - continue; // no need - for (int k = pos, c = 0; k < pos + BlockSize; ++k) - if ((in[k] >>> bits[i])!=0) { - exceptbuffer[tmpcounter + c] = k - pos; - exceptbuffer[c] = in[k] >>> bits[i]; - ++c; + final int thiscost = bits[i] + * 4 + + S16.estimatecompress(exceptbuffer, 0, + 2 * tmpcounter); + if (thiscost <= bestcost) { + bestcost = thiscost; + besti = i; + exceptcounter = tmpcounter; + } } - final int thiscost = bits[i] * 4 - + S16.estimatecompress(exceptbuffer, 0, 2 * tmpcounter); - if (thiscost <= bestcost) { - bestcost = thiscost; - besti = i; - exceptcounter = tmpcounter; - } + bestb.set(besti); + bestexcept.set(exceptcounter); } - bestb.set(besti); - bestexcept.set(exceptcounter); - } - - private void encodePage(int[] in, IntWrapper inpos, int thissize, - int[] out, IntWrapper outpos) { - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); - IntWrapper bestb = new IntWrapper(); - IntWrapper bestexcept = new IntWrapper(); - for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { - getBestBFromData(in, tmpinpos, bestb, bestexcept); - final int tmpbestb = bestb.get(); - final int nbrexcept = bestexcept.get(); - int exceptsize = 0; - final int remember = tmpoutpos; - tmpoutpos++; - if (nbrexcept > 0) { - int c = 0; - for (int i = 0; i < BlockSize; ++i) { - if ((in[tmpinpos + i] >>> bits[tmpbestb])!=0) { - exceptbuffer[c + nbrexcept] = i; - exceptbuffer[c] = in[tmpinpos + i] >>> bits[tmpbestb]; - ++c; - } + private void encodePage(int[] in, IntWrapper inpos, int thissize, + int[] out, IntWrapper outpos) { + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); + IntWrapper bestb = new IntWrapper(); + IntWrapper bestexcept = new IntWrapper(); + for (final int finalinpos = tmpinpos + thissize; tmpinpos + + BlockSize <= finalinpos; tmpinpos += BlockSize) { + getBestBFromData(in, tmpinpos, bestb, bestexcept); + final int tmpbestb = bestb.get(); + final int nbrexcept = bestexcept.get(); + int exceptsize = 0; + final int remember = tmpoutpos; + tmpoutpos++; + if (nbrexcept > 0) { + int c = 0; + for (int i = 0; i < BlockSize; ++i) { + if ((in[tmpinpos + i] >>> bits[tmpbestb]) != 0) { + exceptbuffer[c + nbrexcept] = i; + exceptbuffer[c] = in[tmpinpos + + i] >>> bits[tmpbestb]; + ++c; + } + } + exceptsize = S16.compress(exceptbuffer, 0, + 2 * nbrexcept, out, tmpoutpos); + tmpoutpos += exceptsize; + } + out[remember] = tmpbestb | (nbrexcept << 8) + | (exceptsize << 16); + for (int k = 0; k < BlockSize; k += 32) { + BitPacking.fastpack(in, tmpinpos + k, out, + tmpoutpos, bits[tmpbestb]); + tmpoutpos += bits[tmpbestb]; + } } - exceptsize = S16.compress(exceptbuffer, 0, 2 * nbrexcept, out, - tmpoutpos); - tmpoutpos += exceptsize; - } - out[remember] = tmpbestb | (nbrexcept << 8) | (exceptsize << 16); - for (int k = 0; k < BlockSize; k += 32) { - BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, - bits[tmpbestb]); - tmpoutpos += bits[tmpbestb]; - } + inpos.set(tmpinpos); + outpos.set(tmpoutpos); } - inpos.set(tmpinpos); - outpos.set(tmpoutpos); - } - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - if(inlength == 0) return; - final int mynvalue = in[inpos.get()]; - inpos.increment(); - final int finalout = outpos.get() + mynvalue; - while (outpos.get() != finalout) { - int thissize = finalout > PageSize + outpos.get() ? PageSize - : (finalout - outpos.get()); - decodePage(in, inpos, out, outpos, thissize); + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + if (inlength == 0) + return; + final int mynvalue = in[inpos.get()]; + inpos.increment(); + final int finalout = outpos.get() + mynvalue; + while (outpos.get() != finalout) { + int thissize = finalout > PageSize + outpos.get() ? PageSize + : (finalout - outpos.get()); + decodePage(in, inpos, out, outpos, thissize); + } } - } - private void decodePage(int[] in, IntWrapper inpos, int[] out, - IntWrapper outpos, int thissize) { - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); + private void decodePage(int[] in, IntWrapper inpos, int[] out, + IntWrapper outpos, int thissize) { + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); - for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { - final int b = in[tmpinpos] & 0xFF; - final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; - final int exceptsize = (in[tmpinpos] >>> 16); - ++tmpinpos; - S16.uncompress(in, tmpinpos, exceptsize, exceptbuffer, 0, - 2 * cexcept); - tmpinpos += exceptsize; - for (int k = 0; k < BlockSize; k += 32) { - BitPacking - .fastunpack(in, tmpinpos, out, tmpoutpos + k, bits[b]); - tmpinpos += bits[b]; - } - for (int k = 0; k < cexcept; ++k) { - out[tmpoutpos + exceptbuffer[k + cexcept]] |= (exceptbuffer[k] << bits[b]); - } + for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { + final int b = in[tmpinpos] & 0xFF; + final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; + final int exceptsize = (in[tmpinpos] >>> 16); + ++tmpinpos; + S16.uncompress(in, tmpinpos, exceptsize, exceptbuffer, + 0, 2 * cexcept); + tmpinpos += exceptsize; + for (int k = 0; k < BlockSize; k += 32) { + BitPacking.fastunpack(in, tmpinpos, out, + tmpoutpos + k, bits[b]); + tmpinpos += bits[b]; + } + for (int k = 0; k < cexcept; ++k) { + out[tmpoutpos + exceptbuffer[k + cexcept]] |= (exceptbuffer[k] << bits[b]); + } + } + outpos.set(tmpoutpos); + inpos.set(tmpinpos); } - outpos.set(tmpoutpos); - inpos.set(tmpinpos); - } - @Override - public String toString() { - return this.getClass().getSimpleName(); - } + @Override + public String toString() { + return this.getClass().getSimpleName(); + } } diff --git a/src/main/java/me/lemire/integercompression/OptPFDS16.java b/src/main/java/me/lemire/integercompression/OptPFDS16.java index 20e2727..ef57214 100644 --- a/src/main/java/me/lemire/integercompression/OptPFDS16.java +++ b/src/main/java/me/lemire/integercompression/OptPFDS16.java @@ -8,7 +8,7 @@ package me.lemire.integercompression; /** - * OptPFD + * OptPFD *

* Follows: *

@@ -16,165 +16,174 @@ * with optimized document ordering, in: WWW 09, 2009, pp. 401--410. *

* using Simple16 as the secondary coder. - * - * Note that this does not use differential coding: if you are working on - * sorted lists, you must compute the deltas separately. - * - * For multi-threaded applications, each thread should use its own OptPFDS16 object. + * + * Note that this does not use differential coding: if you are working on sorted + * lists, you must compute the deltas separately. + * + * For multi-threaded applications, each thread should use its own OptPFDS16 + * object. * * @author Daniel Lemire */ public final class OptPFDS16 implements IntegerCODEC { - final int PageSize; - final static int BlockSize = 128; - int[] exceptbuffer = new int[2 * BlockSize]; + final int PageSize; + final static int BlockSize = 128; + int[] exceptbuffer = new int[2 * BlockSize]; + + /** + * Constructor for the OptPFDS16 CODEC. + */ + public OptPFDS16() { + PageSize = 65536; + } - /** - * Constructor for the OptPFDS16 CODEC. - */ - public OptPFDS16() { - PageSize = 65536; - } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + inlength = inlength / BlockSize * BlockSize; + if (inlength == 0) + return; - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - inlength = inlength / BlockSize * BlockSize; - if(inlength == 0) return; + final int finalinpos = inpos.get() + inlength; + out[outpos.get()] = inlength; + outpos.increment(); + while (inpos.get() != finalinpos) { + int thissize = finalinpos > PageSize + inpos.get() ? PageSize + : (finalinpos - inpos.get()); + encodePage(in, inpos, thissize, out, outpos); + } - final int finalinpos = inpos.get() + inlength; - out[outpos.get()] = inlength; - outpos.increment(); - while (inpos.get() != finalinpos) { - int thissize = finalinpos > PageSize + inpos.get() ? PageSize - : (finalinpos - inpos.get()); - encodePage(in, inpos, thissize, out, outpos); } - } + protected static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 16, 20, 32 }; + protected static final int[] invbits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16 }; - protected static final int[] bits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 16, 20, 32}; - protected static final int[] invbits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16}; + protected void getBestBFromData(int[] in, int pos, IntWrapper bestb, + IntWrapper bestexcept) { + final int mb = Util.maxbits(in, pos, BlockSize); + int mini = 0; + if (mini + 28 < bits[invbits[mb]]) + mini = bits[invbits[mb]] - 28; // 28 is the max for + // exceptions + int besti = bits.length - 1; + int bestcost = bits[besti] * 4; + int exceptcounter = 0; + for (int i = mini; i < bits.length - 1; ++i) { + int tmpcounter = 0; + for (int k = pos; k < BlockSize + pos; ++k) + if ((in[k] >>> bits[i]) != 0) { + ++tmpcounter; + } + if (tmpcounter == BlockSize) + continue; // no need + for (int k = pos, c = 0; k < pos + BlockSize; ++k) + if ((in[k] >>> bits[i]) != 0) { + exceptbuffer[tmpcounter + c] = k - pos; + exceptbuffer[c] = in[k] >>> bits[i]; + ++c; + } - protected void getBestBFromData(int[] in, int pos, IntWrapper bestb, - IntWrapper bestexcept) { - final int mb = Util.maxbits(in, pos, BlockSize); - int mini = 0; - if (mini + 28 < bits[invbits[mb]]) - mini = bits[invbits[mb]] - 28; // 28 is the max for exceptions - int besti = bits.length - 1; - int bestcost = bits[besti] * 4; - int exceptcounter = 0; - for (int i = mini; i < bits.length - 1; ++i) { - int tmpcounter = 0; - for (int k = pos; k < BlockSize + pos; ++k) - if ((in[k] >>> bits[i]) !=0) { - ++tmpcounter; - } - if (tmpcounter == BlockSize) - continue; // no need - for (int k = pos, c = 0; k < pos + BlockSize; ++k) - if ((in[k] >>> bits[i]) !=0) { - exceptbuffer[tmpcounter + c] = k - pos; - exceptbuffer[c] = in[k] >>> bits[i]; - ++c; + final int thiscost = bits[i] + * 4 + + S16.estimatecompress(exceptbuffer, 0, + 2 * tmpcounter); + if (thiscost <= bestcost) { + bestcost = thiscost; + besti = i; + exceptcounter = tmpcounter; + } } - - final int thiscost = bits[i] * 4 - + S16.estimatecompress(exceptbuffer, 0, 2 * tmpcounter); - if (thiscost <= bestcost) { - bestcost = thiscost; - besti = i; - exceptcounter = tmpcounter; - } + bestb.set(besti); + bestexcept.set(exceptcounter); } - bestb.set(besti); - bestexcept.set(exceptcounter); - } - private void encodePage(int[] in, IntWrapper inpos, int thissize, - int[] out, IntWrapper outpos) { - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); - IntWrapper bestb = new IntWrapper(); - IntWrapper bestexcept = new IntWrapper(); - for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { - getBestBFromData(in, tmpinpos, bestb, bestexcept); - final int tmpbestb = bestb.get(); - final int nbrexcept = bestexcept.get(); - int exceptsize = 0; - final int remember = tmpoutpos; - tmpoutpos++; - if (nbrexcept > 0) { - int c = 0; - for (int i = 0; i < BlockSize; ++i) { - if ((in[tmpinpos + i] >>> bits[tmpbestb]) != 0) { - exceptbuffer[c + nbrexcept] = i; - exceptbuffer[c] = in[tmpinpos + i] >>> bits[tmpbestb]; - ++c; - } + private void encodePage(int[] in, IntWrapper inpos, int thissize, + int[] out, IntWrapper outpos) { + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); + IntWrapper bestb = new IntWrapper(); + IntWrapper bestexcept = new IntWrapper(); + for (final int finalinpos = tmpinpos + thissize; tmpinpos + + BlockSize <= finalinpos; tmpinpos += BlockSize) { + getBestBFromData(in, tmpinpos, bestb, bestexcept); + final int tmpbestb = bestb.get(); + final int nbrexcept = bestexcept.get(); + int exceptsize = 0; + final int remember = tmpoutpos; + tmpoutpos++; + if (nbrexcept > 0) { + int c = 0; + for (int i = 0; i < BlockSize; ++i) { + if ((in[tmpinpos + i] >>> bits[tmpbestb]) != 0) { + exceptbuffer[c + nbrexcept] = i; + exceptbuffer[c] = in[tmpinpos + + i] >>> bits[tmpbestb]; + ++c; + } + } + exceptsize = S16.compress(exceptbuffer, 0, + 2 * nbrexcept, out, tmpoutpos); + tmpoutpos += exceptsize; + } + out[remember] = tmpbestb | (nbrexcept << 8) + | (exceptsize << 16); + for (int k = 0; k < BlockSize; k += 32) { + BitPacking.fastpack(in, tmpinpos + k, out, + tmpoutpos, bits[tmpbestb]); + tmpoutpos += bits[tmpbestb]; + } } - exceptsize = S16.compress(exceptbuffer, 0, 2 * nbrexcept, out, - tmpoutpos); - tmpoutpos += exceptsize; - } - out[remember] = tmpbestb | (nbrexcept << 8) | (exceptsize << 16); - for (int k = 0; k < BlockSize; k += 32) { - BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, - bits[tmpbestb]); - tmpoutpos += bits[tmpbestb]; - } + inpos.set(tmpinpos); + outpos.set(tmpoutpos); } - inpos.set(tmpinpos); - outpos.set(tmpoutpos); - } - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - if(inlength == 0) return; - final int mynvalue = in[inpos.get()]; - inpos.increment(); - final int finalout = outpos.get() + mynvalue; - while (outpos.get() != finalout) { - int thissize = finalout > PageSize + outpos.get() ? PageSize - : (finalout - outpos.get()); - decodePage(in, inpos, out, outpos, thissize); + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + if (inlength == 0) + return; + final int mynvalue = in[inpos.get()]; + inpos.increment(); + final int finalout = outpos.get() + mynvalue; + while (outpos.get() != finalout) { + int thissize = finalout > PageSize + outpos.get() ? PageSize + : (finalout - outpos.get()); + decodePage(in, inpos, out, outpos, thissize); + } } - } - private void decodePage(int[] in, IntWrapper inpos, int[] out, - IntWrapper outpos, int thissize) { - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); + private void decodePage(int[] in, IntWrapper inpos, int[] out, + IntWrapper outpos, int thissize) { + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); - for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { - final int b = in[tmpinpos] & 0xFF; - final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; - final int exceptsize = (in[tmpinpos] >>> 16); - ++tmpinpos; - S16.uncompress(in, tmpinpos, exceptsize, exceptbuffer, 0, - 2 * cexcept); - tmpinpos += exceptsize; - for (int k = 0; k < BlockSize; k += 32) { - BitPacking - .fastunpack(in, tmpinpos, out, tmpoutpos + k, bits[b]); - tmpinpos += bits[b]; - } - for (int k = 0; k < cexcept; ++k) { - out[tmpoutpos + exceptbuffer[k + cexcept]] |= (exceptbuffer[k] << bits[b]); - } + for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { + final int b = in[tmpinpos] & 0xFF; + final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; + final int exceptsize = (in[tmpinpos] >>> 16); + ++tmpinpos; + S16.uncompress(in, tmpinpos, exceptsize, exceptbuffer, + 0, 2 * cexcept); + tmpinpos += exceptsize; + for (int k = 0; k < BlockSize; k += 32) { + BitPacking.fastunpack(in, tmpinpos, out, + tmpoutpos + k, bits[b]); + tmpinpos += bits[b]; + } + for (int k = 0; k < cexcept; ++k) { + out[tmpoutpos + exceptbuffer[k + cexcept]] |= (exceptbuffer[k] << bits[b]); + } + } + outpos.set(tmpoutpos); + inpos.set(tmpinpos); } - outpos.set(tmpoutpos); - inpos.set(tmpinpos); - } - @Override - public String toString() { - return this.getClass().getSimpleName(); - } + @Override + public String toString() { + return this.getClass().getSimpleName(); + } } \ No newline at end of file diff --git a/src/main/java/me/lemire/integercompression/OptPFDS9.java b/src/main/java/me/lemire/integercompression/OptPFDS9.java index 0cbcf7a..ba70e53 100644 --- a/src/main/java/me/lemire/integercompression/OptPFDS9.java +++ b/src/main/java/me/lemire/integercompression/OptPFDS9.java @@ -16,166 +16,175 @@ * with optimized document ordering, in: WWW 09, 2009, pp. 401--410. *

* using Simple9 as the secondary coder. - * - * - * Note that this does not use differential coding: if you are working on - * sorted lists, you must compute the deltas separately. - * - * For multi-threaded applications, each thread should use its own OptPFDS9 object. - * + * + * + * Note that this does not use differential coding: if you are working on sorted + * lists, you must compute the deltas separately. + * + * For multi-threaded applications, each thread should use its own OptPFDS9 + * object. + * * @author Daniel Lemire */ public final class OptPFDS9 implements IntegerCODEC { - final int PageSize; - final static int BlockSize = 128; - int[] exceptbuffer = new int[2 * BlockSize]; + final int PageSize; + final static int BlockSize = 128; + int[] exceptbuffer = new int[2 * BlockSize]; + + /** + * Constructor for the OptPFDS9 CODEC. + */ + public OptPFDS9() { + PageSize = 65536; + } - /** - * Constructor for the OptPFDS9 CODEC. - */ - public OptPFDS9() { - PageSize = 65536; - } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + inlength = inlength / BlockSize * BlockSize; + if (inlength == 0) + return; - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - inlength = inlength / BlockSize * BlockSize; - if(inlength == 0) return; + final int finalinpos = inpos.get() + inlength; + out[outpos.get()] = inlength; + outpos.increment(); + while (inpos.get() != finalinpos) { + int thissize = finalinpos > PageSize + inpos.get() ? PageSize + : (finalinpos - inpos.get()); + encodePage(in, inpos, thissize, out, outpos); + } - final int finalinpos = inpos.get() + inlength; - out[outpos.get()] = inlength; - outpos.increment(); - while (inpos.get() != finalinpos) { - int thissize = finalinpos > PageSize + inpos.get() ? PageSize - : (finalinpos - inpos.get()); - encodePage(in, inpos, thissize, out, outpos); } - } + protected static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 16, 20, 32 }; + protected static final int[] invbits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16 }; - protected static final int[] bits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 16, 20, 32}; - protected static final int[] invbits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16}; + protected void getBestBFromData(int[] in, int pos, IntWrapper bestb, + IntWrapper bestexcept) { + final int mb = Util.maxbits(in, pos, BlockSize); + int mini = 0; + if (mini + 28 < bits[invbits[mb]]) + mini = bits[invbits[mb]] - 28; // 28 is the max for + // exceptions + int besti = bits.length - 1; + int bestcost = bits[besti] * 4; + int exceptcounter = 0; + for (int i = mini; i < bits.length - 1; ++i) { + int tmpcounter = 0; + for (int k = pos; k < BlockSize + pos; ++k) + if ((in[k] >>> bits[i]) != 0) { + ++tmpcounter; + } + if (tmpcounter == BlockSize) + continue; // no need + for (int k = pos, c = 0; k < pos + BlockSize; ++k) + if ((in[k] >>> bits[i]) != 0) { + exceptbuffer[tmpcounter + c] = k - pos; + exceptbuffer[c] = in[k] >>> bits[i]; + ++c; + } - protected void getBestBFromData(int[] in, int pos, IntWrapper bestb, - IntWrapper bestexcept) { - final int mb = Util.maxbits(in, pos, BlockSize); - int mini = 0; - if (mini + 28 < bits[invbits[mb]]) - mini = bits[invbits[mb]] - 28; // 28 is the max for exceptions - int besti = bits.length - 1; - int bestcost = bits[besti] * 4; - int exceptcounter = 0; - for (int i = mini; i < bits.length - 1; ++i) { - int tmpcounter = 0; - for (int k = pos; k < BlockSize + pos; ++k) - if ((in[k] >>> bits[i]) !=0) { - ++tmpcounter; - } - if (tmpcounter == BlockSize) - continue; // no need - for (int k = pos, c = 0; k < pos + BlockSize; ++k) - if ((in[k] >>> bits[i]) !=0) { - exceptbuffer[tmpcounter + c] = k - pos; - exceptbuffer[c] = in[k] >>> bits[i]; - ++c; + final int thiscost = bits[i] + * 4 + + S9.estimatecompress(exceptbuffer, 0, + 2 * tmpcounter); + if (thiscost <= bestcost) { + bestcost = thiscost; + besti = i; + exceptcounter = tmpcounter; + } } - - final int thiscost = bits[i] * 4 - + S9.estimatecompress(exceptbuffer, 0, 2 * tmpcounter); - if (thiscost <= bestcost) { - bestcost = thiscost; - besti = i; - exceptcounter = tmpcounter; - } + bestb.set(besti); + bestexcept.set(exceptcounter); } - bestb.set(besti); - bestexcept.set(exceptcounter); - } - private void encodePage(int[] in, IntWrapper inpos, int thissize, - int[] out, IntWrapper outpos) { - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); - IntWrapper bestb = new IntWrapper(); - IntWrapper bestexcept = new IntWrapper(); - for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { - getBestBFromData(in, tmpinpos, bestb, bestexcept); - final int tmpbestb = bestb.get(); - final int nbrexcept = bestexcept.get(); - int exceptsize = 0; - final int remember = tmpoutpos; - tmpoutpos++; - if (nbrexcept > 0) { - int c = 0; - for (int i = 0; i < BlockSize; ++i) { - if ((in[tmpinpos + i] >>> bits[tmpbestb]) != 0) { - exceptbuffer[c + nbrexcept] = i; - exceptbuffer[c] = in[tmpinpos + i] >>> bits[tmpbestb]; - ++c; - } + private void encodePage(int[] in, IntWrapper inpos, int thissize, + int[] out, IntWrapper outpos) { + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); + IntWrapper bestb = new IntWrapper(); + IntWrapper bestexcept = new IntWrapper(); + for (final int finalinpos = tmpinpos + thissize; tmpinpos + + BlockSize <= finalinpos; tmpinpos += BlockSize) { + getBestBFromData(in, tmpinpos, bestb, bestexcept); + final int tmpbestb = bestb.get(); + final int nbrexcept = bestexcept.get(); + int exceptsize = 0; + final int remember = tmpoutpos; + tmpoutpos++; + if (nbrexcept > 0) { + int c = 0; + for (int i = 0; i < BlockSize; ++i) { + if ((in[tmpinpos + i] >>> bits[tmpbestb]) != 0) { + exceptbuffer[c + nbrexcept] = i; + exceptbuffer[c] = in[tmpinpos + + i] >>> bits[tmpbestb]; + ++c; + } + } + exceptsize = S9.compress(exceptbuffer, 0, + 2 * nbrexcept, out, tmpoutpos); + tmpoutpos += exceptsize; + } + out[remember] = tmpbestb | (nbrexcept << 8) + | (exceptsize << 16); + for (int k = 0; k < BlockSize; k += 32) { + BitPacking.fastpack(in, tmpinpos + k, out, + tmpoutpos, bits[tmpbestb]); + tmpoutpos += bits[tmpbestb]; + } } - exceptsize = S9.compress(exceptbuffer, 0, 2 * nbrexcept, out, - tmpoutpos); - tmpoutpos += exceptsize; - } - out[remember] = tmpbestb | (nbrexcept << 8) | (exceptsize << 16); - for (int k = 0; k < BlockSize; k += 32) { - BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, - bits[tmpbestb]); - tmpoutpos += bits[tmpbestb]; - } + inpos.set(tmpinpos); + outpos.set(tmpoutpos); } - inpos.set(tmpinpos); - outpos.set(tmpoutpos); - } - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - if(inlength == 0) return; - final int mynvalue = in[inpos.get()]; - inpos.increment(); - final int finalout = outpos.get() + mynvalue; - while (outpos.get() != finalout) { - int thissize = finalout > PageSize + outpos.get() ? PageSize - : (finalout - outpos.get()); - decodePage(in, inpos, out, outpos, thissize); + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + if (inlength == 0) + return; + final int mynvalue = in[inpos.get()]; + inpos.increment(); + final int finalout = outpos.get() + mynvalue; + while (outpos.get() != finalout) { + int thissize = finalout > PageSize + outpos.get() ? PageSize + : (finalout - outpos.get()); + decodePage(in, inpos, out, outpos, thissize); + } } - } - private void decodePage(int[] in, IntWrapper inpos, int[] out, - IntWrapper outpos, int thissize) { - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); + private void decodePage(int[] in, IntWrapper inpos, int[] out, + IntWrapper outpos, int thissize) { + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); - for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { - final int b = in[tmpinpos] & 0xFF; - final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; - final int exceptsize = (in[tmpinpos] >>> 16); - ++tmpinpos; - S9.uncompress(in, tmpinpos, exceptsize, exceptbuffer, 0, - 2 * cexcept); - tmpinpos += exceptsize; - for (int k = 0; k < BlockSize; k += 32) { - BitPacking - .fastunpack(in, tmpinpos, out, tmpoutpos + k, bits[b]); - tmpinpos += bits[b]; - } - for (int k = 0; k < cexcept; ++k) { - out[tmpoutpos + exceptbuffer[k + cexcept]] |= (exceptbuffer[k] << bits[b]); - } + for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { + final int b = in[tmpinpos] & 0xFF; + final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; + final int exceptsize = (in[tmpinpos] >>> 16); + ++tmpinpos; + S9.uncompress(in, tmpinpos, exceptsize, exceptbuffer, + 0, 2 * cexcept); + tmpinpos += exceptsize; + for (int k = 0; k < BlockSize; k += 32) { + BitPacking.fastunpack(in, tmpinpos, out, + tmpoutpos + k, bits[b]); + tmpinpos += bits[b]; + } + for (int k = 0; k < cexcept; ++k) { + out[tmpoutpos + exceptbuffer[k + cexcept]] |= (exceptbuffer[k] << bits[b]); + } + } + outpos.set(tmpoutpos); + inpos.set(tmpinpos); } - outpos.set(tmpoutpos); - inpos.set(tmpinpos); - } - @Override - public String toString() { - return this.getClass().getSimpleName(); - } + @Override + public String toString() { + return this.getClass().getSimpleName(); + } } \ No newline at end of file diff --git a/src/main/java/me/lemire/integercompression/PerformanceLogger.java b/src/main/java/me/lemire/integercompression/PerformanceLogger.java deleted file mode 100644 index 0f80917..0000000 --- a/src/main/java/me/lemire/integercompression/PerformanceLogger.java +++ /dev/null @@ -1,72 +0,0 @@ -/** - * This code is released under the - * Apache License Version 2.0 http://www.apache.org/licenses/. - */ -package me.lemire.integercompression; - -/** - * PerformanceLogger for IntegerCODEC. - * - * @author MURAOKA Taro http://github.com/koron - */ -public final class PerformanceLogger -{ - public static class Timer { - private long startNano; - private long duration = 0; - - public Timer() {} - - public void start() { - this.startNano = System.nanoTime(); - } - - public long end() { - return this.duration += System.nanoTime() - this.startNano; - } - - public long getDuration() { - return this.duration; - } - } - - public final Timer compressionTimer = new Timer(); - - public final Timer decompressionTimer = new Timer(); - - private long originalSize = 0; - - private long compressedSize = 0; - - public long addOriginalSize(long value) { - return this.originalSize += value; - } - - public long addCompressedSize(long value) { - return this.compressedSize += value; - } - - public long getOriginalSize() { - return this.originalSize; - } - - public long getCompressedSize() { - return this.compressedSize; - } - - public double getBitPerInt() { - return this.compressedSize * 32.0 / this.originalSize; - } - - private static double getMiS(long size, long nanoTime) { - return (size * 1e-6) / (nanoTime * 1.0e-9); - } - - public double getCompressSpeed() { - return getMiS(this.originalSize, this.compressionTimer.getDuration()); - } - - public double getDecompressSpeed() { - return getMiS(this.originalSize, this.decompressionTimer.getDuration()); - } -} diff --git a/src/main/java/me/lemire/integercompression/S16.java b/src/main/java/me/lemire/integercompression/S16.java index f4ca39c..3d65b7b 100644 --- a/src/main/java/me/lemire/integercompression/S16.java +++ b/src/main/java/me/lemire/integercompression/S16.java @@ -15,157 +15,174 @@ */ public final class S16 { - - protected static int compress(final int[] in, int currentPos, int inlength, - final int out[], final int tmpoutpos) { - int outpos = tmpoutpos; - final int finalin = currentPos + inlength; - while (currentPos < finalin) { - int inoffset = compressblock(out, outpos++, in, currentPos, - inlength); - if (inoffset == -1) - throw new RuntimeException("Too big a number"); - currentPos += inoffset; - inlength -= inoffset; + protected static int compress(final int[] in, int currentPos, + int inlength, final int out[], final int tmpoutpos) { + int outpos = tmpoutpos; + final int finalin = currentPos + inlength; + while (currentPos < finalin) { + int inoffset = compressblock(out, outpos++, in, + currentPos, inlength); + if (inoffset == -1) + throw new RuntimeException("Too big a number"); + currentPos += inoffset; + inlength -= inoffset; + } + return outpos - tmpoutpos; } - return outpos - tmpoutpos; - } - /** - * Estimate size of the compressed output. - * - * @param in array to compress - * @param currentPos where to start reading - * @param inlength how many integers to read - * @return estimated size of the output (in 32-bit integers) - */ - public static int estimatecompress(final int[] in, int currentPos, int inlength) { - final int finalin = currentPos + inlength; - int counter = 0; - while (currentPos < finalin) { - int inoffset = fakecompressblock(in, currentPos, inlength); - if (inoffset == -1) - throw new RuntimeException("Too big a number"); - currentPos += inoffset; - inlength -= inoffset; - ++counter; + + /** + * Estimate size of the compressed output. + * + * @param in + * array to compress + * @param currentPos + * where to start reading + * @param inlength + * how many integers to read + * @return estimated size of the output (in 32-bit integers) + */ + public static int estimatecompress(final int[] in, int currentPos, + int inlength) { + final int finalin = currentPos + inlength; + int counter = 0; + while (currentPos < finalin) { + int inoffset = fakecompressblock(in, currentPos, + inlength); + if (inoffset == -1) + throw new RuntimeException("Too big a number"); + currentPos += inoffset; + inlength -= inoffset; + ++counter; + } + return counter; } - return counter; - } - - /** - * Compress an integer array using Simple16 - * - * @param out the compressed output - * @param outOffset the offset of the output in the number of integers - * @param in the integer input array - * @param inOffset the offset of the input in the number of integers - * @param n the number of elements to be compressed - * @return the size of the outputs in 32-bit integers - * - */ - public static final int compressblock(int[] out, int outOffset, int[] in, - int inOffset, int n) { - int numIdx, j, num, bits; - for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { - out[outOffset] = numIdx << S16_BITSSIZE; - num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; - - for (j = 0, bits = 0; (j < num) - && (in[inOffset + j] < SHIFTED_S16_BITS[numIdx][j]); ) { - out[outOffset] |= (in[inOffset + j] << bits); - bits += S16_BITS[numIdx][j]; - j++; - } - - if (j == num) { - return num; - } + + /** + * Compress an integer array using Simple16 + * + * @param out + * the compressed output + * @param outOffset + * the offset of the output in the number of integers + * @param in + * the integer input array + * @param inOffset + * the offset of the input in the number of integers + * @param n + * the number of elements to be compressed + * @return the size of the outputs in 32-bit integers + * + */ + public static final int compressblock(int[] out, int outOffset, + int[] in, int inOffset, int n) { + int numIdx, j, num, bits; + for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { + out[outOffset] = numIdx << S16_BITSSIZE; + num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; + + for (j = 0, bits = 0; (j < num) + && (in[inOffset + j] < SHIFTED_S16_BITS[numIdx][j]);) { + out[outOffset] |= (in[inOffset + j] << bits); + bits += S16_BITS[numIdx][j]; + j++; + } + + if (j == num) { + return num; + } + } + + return -1; } - return -1; - } + private static final int fakecompressblock(int[] in, int inOffset, int n) { + int numIdx, j, num; + for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { + num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; - private static final int fakecompressblock(int[] in, int inOffset, int n) { - int numIdx, j, num; - for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { - num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; + for (j = 0; (j < num) + && (in[inOffset + j] < SHIFTED_S16_BITS[numIdx][j]);) { + j++; + } - for (j = 0; (j < num) - && (in[inOffset + j] < SHIFTED_S16_BITS[numIdx][j]); ) { - j++; - } + if (j == num) { + return num; + } + } - if (j == num) { - return num; - } + return -1; } - return -1; - } - - /** - * Decompress an integer array using Simple16 - * - * @param out the decompressed output - * @param outOffset the offset of the output in the number of integers - * @param in the compressed input array - * @param inOffset the offset of the input in the number of integers - * @param n the number of elements to be compressed - * @return the number of processed integers - */ - public static final int decompressblock(int[] out, int outOffset, int[] in, - int inOffset, int n) { - int numIdx, j = 0, bits = 0; - numIdx = in[inOffset] >>> S16_BITSSIZE; - int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; - for (j = 0, bits = 0; j < num; j++) { - out[outOffset + j] = (in[inOffset] >>> bits) - & (0xffffffff >>> (32 - S16_BITS[numIdx][j])); - bits += S16_BITS[numIdx][j]; - } - return num; - } - - protected static void uncompress(final int[] in, int tmpinpos, final int inlength, - final int[] out, int currentPos, int outlength) { - final int finalpos = tmpinpos + inlength; - while (tmpinpos < finalpos) { - final int howmany = decompressblock(out, currentPos, in, tmpinpos, - outlength); - outlength -= howmany; - currentPos += howmany; - tmpinpos += 1; + /** + * Decompress an integer array using Simple16 + * + * @param out + * the decompressed output + * @param outOffset + * the offset of the output in the number of integers + * @param in + * the compressed input array + * @param inOffset + * the offset of the input in the number of integers + * @param n + * the number of elements to be compressed + * @return the number of processed integers + */ + public static final int decompressblock(int[] out, int outOffset, + int[] in, int inOffset, int n) { + int numIdx, j = 0, bits = 0; + numIdx = in[inOffset] >>> S16_BITSSIZE; + int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; + for (j = 0, bits = 0; j < num; j++) { + out[outOffset + j] = (in[inOffset] >>> bits) + & (0xffffffff >>> (32 - S16_BITS[numIdx][j])); + bits += S16_BITS[numIdx][j]; + } + return num; } - } + protected static void uncompress(final int[] in, int tmpinpos, + final int inlength, final int[] out, int currentPos, + int outlength) { + final int finalpos = tmpinpos + inlength; + while (tmpinpos < finalpos) { + final int howmany = decompressblock(out, currentPos, + in, tmpinpos, outlength); + outlength -= howmany; + currentPos += howmany; + tmpinpos += 1; + } - private static int[][] shiftme(int[][] x) { - int[][] answer = new int[x.length][]; - for (int k = 0; k < x.length; ++k) { - answer[k] = new int[x[k].length]; - for (int z = 0; z < answer[k].length; ++z) - answer[k][z] = 1 << x[k][z]; } - return answer; - } - - private static final int S16_NUMSIZE = 16; - private static final int S16_BITSSIZE = 28; - // the possible number of bits used to represent one integer - private static final int[] S16_NUM = {28, 21, 21, 21, 14, 9, 8, 7, 6, 6, - 5, 5, 4, 3, 2, 1}; - // the corresponding number of elements for each value of the number of bits - private static final int[][] S16_BITS = { - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1}, - {2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2}, - {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, - {4, 3, 3, 3, 3, 3, 3, 3, 3}, {3, 4, 4, 4, 4, 3, 3, 3}, - {4, 4, 4, 4, 4, 4, 4}, {5, 5, 5, 5, 4, 4}, - {4, 4, 5, 5, 5, 5}, {6, 6, 6, 5, 5}, {5, 5, 6, 6, 6}, - {7, 7, 7, 7}, {10, 9, 9,}, {14, 14}, {28}}; - private static final int[][] SHIFTED_S16_BITS = shiftme(S16_BITS); + + private static int[][] shiftme(int[][] x) { + int[][] answer = new int[x.length][]; + for (int k = 0; k < x.length; ++k) { + answer[k] = new int[x[k].length]; + for (int z = 0; z < answer[k].length; ++z) + answer[k][z] = 1 << x[k][z]; + } + return answer; + } + + private static final int S16_NUMSIZE = 16; + private static final int S16_BITSSIZE = 28; + // the possible number of bits used to represent one integer + private static final int[] S16_NUM = { 28, 21, 21, 21, 14, 9, 8, 7, 6, + 6, 5, 5, 4, 3, 2, 1 }; + // the corresponding number of elements for each value of the number of + // bits + private static final int[][] S16_BITS = { + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1 }, + { 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2 }, + { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, + { 4, 3, 3, 3, 3, 3, 3, 3, 3 }, { 3, 4, 4, 4, 4, 3, 3, 3 }, + { 4, 4, 4, 4, 4, 4, 4 }, { 5, 5, 5, 5, 4, 4 }, + { 4, 4, 5, 5, 5, 5 }, { 6, 6, 6, 5, 5 }, { 5, 5, 6, 6, 6 }, + { 7, 7, 7, 7 }, { 10, 9, 9, }, { 14, 14 }, { 28 } }; + private static final int[][] SHIFTED_S16_BITS = shiftme(S16_BITS); } diff --git a/src/main/java/me/lemire/integercompression/S9.java b/src/main/java/me/lemire/integercompression/S9.java index 72fc062..d8a7121 100644 --- a/src/main/java/me/lemire/integercompression/S9.java +++ b/src/main/java/me/lemire/integercompression/S9.java @@ -8,171 +8,179 @@ /** * This is a version of Simple9 optimized for NewPFOR, OptPFOR - * + * * @author Daniel Lemire */ public final class S9 { - /** - * Estimate size of the compressed output. - * - * @param in array to compress - * @param currentPos where to start reading - * @param inlength how many integers to read - * @return estimated size of the output (in 32-bit integers) - */ - public static int estimatecompress(int[] in, int currentPos, int inlength) { - int tmpoutpos = 0; - int finalpos = currentPos + inlength; - outer: - while (currentPos < finalpos) { - mainloop: - for (int selector = 0; selector < 8; selector++) { + /** + * Estimate size of the compressed output. + * + * @param in + * array to compress + * @param currentPos + * where to start reading + * @param inlength + * how many integers to read + * @return estimated size of the output (in 32-bit integers) + */ + public static int estimatecompress(int[] in, int currentPos, + int inlength) { + int tmpoutpos = 0; + int finalpos = currentPos + inlength; + outer: while (currentPos < finalpos) { + mainloop: for (int selector = 0; selector < 8; selector++) { - int compressedNum = codeNum[selector]; - if (finalpos <= currentPos + compressedNum - 1) - compressedNum = finalpos - currentPos; - int b = bitLength[selector]; - int max = 1 << b; - int i = 0; - for (; i < compressedNum; i++) - if (max <= in[currentPos + i]) - continue mainloop; - currentPos += compressedNum; - ++tmpoutpos; - continue outer; - } - final int selector = 8; - if (in[currentPos] >= 1 << bitLength[selector]) - throw new RuntimeException("Too big a number"); - tmpoutpos++; - currentPos++; + int compressedNum = codeNum[selector]; + if (finalpos <= currentPos + compressedNum - 1) + compressedNum = finalpos - currentPos; + int b = bitLength[selector]; + int max = 1 << b; + int i = 0; + for (; i < compressedNum; i++) + if (max <= in[currentPos + i]) + continue mainloop; + currentPos += compressedNum; + ++tmpoutpos; + continue outer; + } + final int selector = 8; + if (in[currentPos] >= 1 << bitLength[selector]) + throw new RuntimeException("Too big a number"); + tmpoutpos++; + currentPos++; + } + return tmpoutpos; } - return tmpoutpos; - } - protected static int compress(int[] in, int currentPos, int inlength, int out[], - int tmpoutpos) { - int origtmpoutpos = tmpoutpos; - int finalpos = currentPos + inlength; - outer: - while (currentPos < finalpos) { - mainloop: - for (int selector = 0; selector < 8; selector++) { - int res = 0; - int compressedNum = codeNum[selector]; - if (finalpos <= currentPos + compressedNum - 1) - compressedNum = finalpos - currentPos; - int b = bitLength[selector]; - int max = 1 << b; - int i = 0; - for (; i < compressedNum; i++) { - if (max <= in[currentPos + i]) - continue mainloop; - res = (res << b) + in[currentPos + i]; + protected static int compress(int[] in, int currentPos, int inlength, + int out[], int tmpoutpos) { + int origtmpoutpos = tmpoutpos; + int finalpos = currentPos + inlength; + outer: while (currentPos < finalpos) { + mainloop: for (int selector = 0; selector < 8; selector++) { + int res = 0; + int compressedNum = codeNum[selector]; + if (finalpos <= currentPos + compressedNum - 1) + compressedNum = finalpos - currentPos; + int b = bitLength[selector]; + int max = 1 << b; + int i = 0; + for (; i < compressedNum; i++) { + if (max <= in[currentPos + i]) + continue mainloop; + res = (res << b) + in[currentPos + i]; + } + if (compressedNum != codeNum[selector]) + res <<= (codeNum[selector] - compressedNum) + * b; + res |= selector << 28; + out[tmpoutpos++] = res; + currentPos += compressedNum; + continue outer; + } + final int selector = 8; + if (in[currentPos] >= 1 << bitLength[selector]) + throw new RuntimeException("Too big a number"); + out[tmpoutpos++] = in[currentPos++] | (selector << 28); } - if (compressedNum != codeNum[selector]) - res <<= (codeNum[selector] - compressedNum) * b; - res |= selector << 28; - out[tmpoutpos++] = res; - currentPos += compressedNum; - continue outer; - } - final int selector = 8; - if (in[currentPos] >= 1 << bitLength[selector]) - throw new RuntimeException("Too big a number"); - out[tmpoutpos++] = in[currentPos++] | (selector << 28); + return tmpoutpos - origtmpoutpos; } - return tmpoutpos - origtmpoutpos; - } - protected static void uncompress(int[] in, int tmpinpos, int inlength, - int[] out, int currentPos, int outlength) { - int finallength = currentPos + outlength; + protected static void uncompress(int[] in, int tmpinpos, int inlength, + int[] out, int currentPos, int outlength) { + int finallength = currentPos + outlength; - while (currentPos < finallength) { - int val = in[tmpinpos++]; - int header = val >>> 28; - switch (header) { - case 0: { // number : 28, bitwidth : 1 - final int howmany = finallength - currentPos < 28 ? finallength - - currentPos : 28; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (k + 4)) >>> 31; - } - break; - } - case 1: { // number : 14, bitwidth : 2 - final int howmany = finallength - currentPos < 14 ? finallength - - currentPos : 14; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (2 * k + 4)) >>> 30; - } - break; - } - case 2: { // number : 9, bitwidth : 3 - final int howmany = finallength - currentPos < 9 ? finallength - - currentPos : 9; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (3 * k + 5)) >>> 29; - } - break; - } - case 3: { // number : 7, bitwidth : 4 - final int howmany = finallength - currentPos < 7 ? finallength - - currentPos : 7; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (4 * k + 4)) >>> 28; - } - break; - } - case 4: { // number : 5, bitwidth : 5 - final int howmany = finallength - currentPos < 5 ? finallength - - currentPos : 5; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (5 * k + 7)) >>> 27; - } - break; - } - case 5: { // number : 4, bitwidth : 7 - final int howmany = finallength - currentPos < 4 ? finallength - - currentPos : 4; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (7 * k + 4)) >>> 25; - } - break; + while (currentPos < finallength) { + int val = in[tmpinpos++]; + int header = val >>> 28; + switch (header) { + case 0: { // number : 28, bitwidth : 1 + final int howmany = finallength - currentPos < 28 ? finallength + - currentPos + : 28; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (k + 4)) >>> 31; + } + break; + } + case 1: { // number : 14, bitwidth : 2 + final int howmany = finallength - currentPos < 14 ? finallength + - currentPos + : 14; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (2 * k + 4)) >>> 30; + } + break; + } + case 2: { // number : 9, bitwidth : 3 + final int howmany = finallength - currentPos < 9 ? finallength + - currentPos + : 9; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (3 * k + 5)) >>> 29; + } + break; + } + case 3: { // number : 7, bitwidth : 4 + final int howmany = finallength - currentPos < 7 ? finallength + - currentPos + : 7; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (4 * k + 4)) >>> 28; + } + break; + } + case 4: { // number : 5, bitwidth : 5 + final int howmany = finallength - currentPos < 5 ? finallength + - currentPos + : 5; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (5 * k + 7)) >>> 27; + } + break; + } + case 5: { // number : 4, bitwidth : 7 + final int howmany = finallength - currentPos < 4 ? finallength + - currentPos + : 4; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (7 * k + 4)) >>> 25; + } + break; + } + case 6: { // number : 3, bitwidth : 9 + final int howmany = finallength - currentPos < 3 ? finallength + - currentPos + : 3; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (9 * k + 5)) >>> 23; + } + break; + } + case 7: { // number : 2, bitwidth : 14 + final int howmany = finallength - currentPos < 2 ? finallength + - currentPos + : 2; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (14 * k + 4)) >>> 18; + } + break; + } + case 8: { // number : 1, bitwidth : 28 + out[currentPos++] = (val << 4) >>> 4; + break; + } + default: { + throw new RuntimeException("shouldn't happen"); + } + } } - case 6: { // number : 3, bitwidth : 9 - final int howmany = finallength - currentPos < 3 ? finallength - - currentPos : 3; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (9 * k + 5)) >>> 23; - } - break; - } - case 7: { // number : 2, bitwidth : 14 - final int howmany = finallength - currentPos < 2 ? finallength - - currentPos : 2; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (14 * k + 4)) >>> 18; - } - break; - } - case 8: { // number : 1, bitwidth : 28 - out[currentPos++] = (val << 4) >>> 4; - break; - } - default: { - throw new RuntimeException("shouldn't happen"); - } - } - } - - } - private final static int bitLength[] = {1, 2, 3, 4, 5, 7, 9, 14, 28}; + } - private final static int codeNum[] = {28, 14, 9, 7, 5, 4, 3, 2, 1}; + private final static int bitLength[] = { 1, 2, 3, 4, 5, 7, 9, 14, 28 }; + private final static int codeNum[] = { 28, 14, 9, 7, 5, 4, 3, 2, 1 }; } diff --git a/src/main/java/me/lemire/integercompression/Simple9.java b/src/main/java/me/lemire/integercompression/Simple9.java index 280f20a..1fba23a 100644 --- a/src/main/java/me/lemire/integercompression/Simple9.java +++ b/src/main/java/me/lemire/integercompression/Simple9.java @@ -7,286 +7,288 @@ package me.lemire.integercompression; - /** * This is an implementation of the popular Simple9 scheme. * - * Note that this does not use differential coding: if you are working on - * sorted lists, you must compute the deltas separately. + * Note that this does not use differential coding: if you are working on sorted + * lists, you must compute the deltas separately. * * @author Daniel Lemire - * + * */ public final class Simple9 implements IntegerCODEC { - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int out[], - IntWrapper outpos) { - int tmpoutpos = outpos.get(); - int currentPos = inpos.get(); - out[tmpoutpos++] = inlength; - final int finalin = currentPos + inlength; - outer: - while (currentPos < finalin - 28) { - mainloop: - for (int selector = 0; selector < 8; selector++) { + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, + int out[], IntWrapper outpos) { + int tmpoutpos = outpos.get(); + int currentPos = inpos.get(); + out[tmpoutpos++] = inlength; + final int finalin = currentPos + inlength; + outer: while (currentPos < finalin - 28) { + mainloop: for (int selector = 0; selector < 8; selector++) { - int res = 0; - int compressedNum = codeNum[selector]; - int b = bitLength[selector]; - int max = 1 << b; - int i = 0; - for (; i < compressedNum; i++) { - if (max <= in[currentPos + i]) - continue mainloop; - res = (res << b) + in[currentPos + i]; - } - res |= selector << 28; - out[tmpoutpos++] = res; - currentPos += compressedNum; - continue outer; - } - final int selector = 8; - if (in[currentPos] >= 1 << bitLength[selector]) - throw new RuntimeException("Too big a number"); - out[tmpoutpos++] = in[currentPos++] | (selector << 28); - } - outer: - while (currentPos < finalin) { - mainloop: - for (int selector = 0; selector < 8; selector++) { - int res = 0; - int compressedNum = codeNum[selector]; - if (finalin <= currentPos + compressedNum - 1) - compressedNum = finalin - currentPos; - int b = bitLength[selector]; - int max = 1 << b; - int i = 0; - for (; i < compressedNum; i++) { - if (max <= in[currentPos + i]) - continue mainloop; - res = (res << b) + in[currentPos + i]; + int res = 0; + int compressedNum = codeNum[selector]; + int b = bitLength[selector]; + int max = 1 << b; + int i = 0; + for (; i < compressedNum; i++) { + if (max <= in[currentPos + i]) + continue mainloop; + res = (res << b) + in[currentPos + i]; + } + res |= selector << 28; + out[tmpoutpos++] = res; + currentPos += compressedNum; + continue outer; + } + final int selector = 8; + if (in[currentPos] >= 1 << bitLength[selector]) + throw new RuntimeException("Too big a number"); + out[tmpoutpos++] = in[currentPos++] | (selector << 28); } + outer: while (currentPos < finalin) { + mainloop: for (int selector = 0; selector < 8; selector++) { + int res = 0; + int compressedNum = codeNum[selector]; + if (finalin <= currentPos + compressedNum - 1) + compressedNum = finalin - currentPos; + int b = bitLength[selector]; + int max = 1 << b; + int i = 0; + for (; i < compressedNum; i++) { + if (max <= in[currentPos + i]) + continue mainloop; + res = (res << b) + in[currentPos + i]; + } - if (compressedNum != codeNum[selector]) - res <<= (codeNum[selector] - compressedNum) * b; - res |= selector << 28; - out[tmpoutpos++] = res; - currentPos += compressedNum; - continue outer; - } - final int selector = 8; - if (in[currentPos] >= 1 << bitLength[selector]) - throw new RuntimeException("Too big a number"); - out[tmpoutpos++] = in[currentPos++] | (selector << 28); - } - inpos.set(currentPos); - outpos.set(tmpoutpos); - } - - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { - int currentPos = outpos.get(); - int tmpinpos = inpos.get(); - final int finalout = currentPos + in[tmpinpos++]; - while (currentPos < finalout - 28) { - int val = in[tmpinpos++]; - int header = val >>> 28; - switch (header) { - case 0: { // number : 28, bitwidth : 1 - out[currentPos++] = (val << 4) >>> 31; - out[currentPos++] = (val << 5) >>> 31; - out[currentPos++] = (val << 6) >>> 31; - out[currentPos++] = (val << 7) >>> 31; - out[currentPos++] = (val << 8) >>> 31; - out[currentPos++] = (val << 9) >>> 31; - out[currentPos++] = (val << 10) >>> 31; - out[currentPos++] = (val << 11) >>> 31; - out[currentPos++] = (val << 12) >>> 31; - out[currentPos++] = (val << 13) >>> 31; // 10 - out[currentPos++] = (val << 14) >>> 31; - out[currentPos++] = (val << 15) >>> 31; - out[currentPos++] = (val << 16) >>> 31; - out[currentPos++] = (val << 17) >>> 31; - out[currentPos++] = (val << 18) >>> 31; - out[currentPos++] = (val << 19) >>> 31; - out[currentPos++] = (val << 20) >>> 31; - out[currentPos++] = (val << 21) >>> 31; - out[currentPos++] = (val << 22) >>> 31; - out[currentPos++] = (val << 23) >>> 31; // 20 - out[currentPos++] = (val << 24) >>> 31; - out[currentPos++] = (val << 25) >>> 31; - out[currentPos++] = (val << 26) >>> 31; - out[currentPos++] = (val << 27) >>> 31; - out[currentPos++] = (val << 28) >>> 31; - out[currentPos++] = (val << 29) >>> 31; - out[currentPos++] = (val << 30) >>> 31; - out[currentPos++] = (val << 31) >>> 31; - break; - } - case 1: { // number : 14, bitwidth : 2 - out[currentPos++] = (val << 4) >>> 30; - out[currentPos++] = (val << 6) >>> 30; - out[currentPos++] = (val << 8) >>> 30; - out[currentPos++] = (val << 10) >>> 30; - out[currentPos++] = (val << 12) >>> 30; - out[currentPos++] = (val << 14) >>> 30; - out[currentPos++] = (val << 16) >>> 30; - out[currentPos++] = (val << 18) >>> 30; - out[currentPos++] = (val << 20) >>> 30; - out[currentPos++] = (val << 22) >>> 30; // 10 - out[currentPos++] = (val << 24) >>> 30; - out[currentPos++] = (val << 26) >>> 30; - out[currentPos++] = (val << 28) >>> 30; - out[currentPos++] = (val << 30) >>> 30; - break; - } - case 2: { // number : 9, bitwidth : 3 - out[currentPos++] = (val << 5) >>> 29; - out[currentPos++] = (val << 8) >>> 29; - out[currentPos++] = (val << 11) >>> 29; - out[currentPos++] = (val << 14) >>> 29; - out[currentPos++] = (val << 17) >>> 29; - out[currentPos++] = (val << 20) >>> 29; - out[currentPos++] = (val << 23) >>> 29; - out[currentPos++] = (val << 26) >>> 29; - out[currentPos++] = (val << 29) >>> 29; - break; - } - case 3: { // number : 7, bitwidth : 4 - out[currentPos++] = (val << 4) >>> 28; - out[currentPos++] = (val << 8) >>> 28; - out[currentPos++] = (val << 12) >>> 28; - out[currentPos++] = (val << 16) >>> 28; - out[currentPos++] = (val << 20) >>> 28; - out[currentPos++] = (val << 24) >>> 28; - out[currentPos++] = (val << 28) >>> 28; - break; - } - case 4: { // number : 5, bitwidth : 5 - out[currentPos++] = (val << 7) >>> 27; - out[currentPos++] = (val << 12) >>> 27; - out[currentPos++] = (val << 17) >>> 27; - out[currentPos++] = (val << 22) >>> 27; - out[currentPos++] = (val << 27) >>> 27; - break; - } - case 5: { // number : 4, bitwidth : 7 - out[currentPos++] = (val << 4) >>> 25; - out[currentPos++] = (val << 11) >>> 25; - out[currentPos++] = (val << 18) >>> 25; - out[currentPos++] = (val << 25) >>> 25; - break; - } - case 6: { // number : 3, bitwidth : 9 - out[currentPos++] = (val << 5) >>> 23; - out[currentPos++] = (val << 14) >>> 23; - out[currentPos++] = (val << 23) >>> 23; - break; - } - case 7: { // number : 2, bitwidth : 14 - out[currentPos++] = (val << 4) >>> 18; - out[currentPos++] = (val << 18) >>> 18; - break; - } - case 8: { // number : 1, bitwidth : 28 - out[currentPos++] = (val << 4) >>> 4; - break; + if (compressedNum != codeNum[selector]) + res <<= (codeNum[selector] - compressedNum) + * b; + res |= selector << 28; + out[tmpoutpos++] = res; + currentPos += compressedNum; + continue outer; + } + final int selector = 8; + if (in[currentPos] >= 1 << bitLength[selector]) + throw new RuntimeException("Too big a number"); + out[tmpoutpos++] = in[currentPos++] | (selector << 28); } - default: { - throw new RuntimeException("shouldn't happen"); - } - } + inpos.set(currentPos); + outpos.set(tmpoutpos); } - while (currentPos < finalout) { - int val = in[tmpinpos++]; - int header = val >>> 28; - switch (header) { - case 0: { // number : 28, bitwidth : 1 - final int howmany = finalout - currentPos; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (k + 4)) >>> 31; - } - break; - } - case 1: { // number : 14, bitwidth : 2 - final int howmany = finalout - currentPos < 14 ? finalout - currentPos - : 14; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (2 * k + 4)) >>> 30; - } - break; - } - case 2: { // number : 9, bitwidth : 3 - final int howmany = finalout - currentPos < 9 ? finalout - currentPos - : 9; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (3 * k + 5)) >>> 29; - } - break; - } - case 3: { // number : 7, bitwidth : 4 - final int howmany = finalout - currentPos < 7 ? finalout - currentPos - : 7; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (4 * k + 4)) >>> 28; - } - break; - } - case 4: { // number : 5, bitwidth : 5 - final int howmany = finalout - currentPos < 5 ? finalout - currentPos - : 5; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (5 * k + 7)) >>> 27; - } - break; - } - case 5: { // number : 4, bitwidth : 7 - final int howmany = finalout - currentPos < 4 ? finalout - currentPos - : 4; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (7 * k + 4)) >>> 25; - } - break; - } - case 6: { // number : 3, bitwidth : 9 - final int howmany = finalout - currentPos < 3 ? finalout - currentPos - : 3; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (9 * k + 5)) >>> 23; - } - break; - } - case 7: { // number : 2, bitwidth : 14 - final int howmany = finalout - currentPos < 2 ? finalout - currentPos - : 2; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (14 * k + 4)) >>> 18; - } - break; - } - case 8: { // number : 1, bitwidth : 28 - out[currentPos++] = (val << 4) >>> 4; - break; + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + int currentPos = outpos.get(); + int tmpinpos = inpos.get(); + final int finalout = currentPos + in[tmpinpos++]; + while (currentPos < finalout - 28) { + int val = in[tmpinpos++]; + int header = val >>> 28; + switch (header) { + case 0: { // number : 28, bitwidth : 1 + out[currentPos++] = (val << 4) >>> 31; + out[currentPos++] = (val << 5) >>> 31; + out[currentPos++] = (val << 6) >>> 31; + out[currentPos++] = (val << 7) >>> 31; + out[currentPos++] = (val << 8) >>> 31; + out[currentPos++] = (val << 9) >>> 31; + out[currentPos++] = (val << 10) >>> 31; + out[currentPos++] = (val << 11) >>> 31; + out[currentPos++] = (val << 12) >>> 31; + out[currentPos++] = (val << 13) >>> 31; // 10 + out[currentPos++] = (val << 14) >>> 31; + out[currentPos++] = (val << 15) >>> 31; + out[currentPos++] = (val << 16) >>> 31; + out[currentPos++] = (val << 17) >>> 31; + out[currentPos++] = (val << 18) >>> 31; + out[currentPos++] = (val << 19) >>> 31; + out[currentPos++] = (val << 20) >>> 31; + out[currentPos++] = (val << 21) >>> 31; + out[currentPos++] = (val << 22) >>> 31; + out[currentPos++] = (val << 23) >>> 31; // 20 + out[currentPos++] = (val << 24) >>> 31; + out[currentPos++] = (val << 25) >>> 31; + out[currentPos++] = (val << 26) >>> 31; + out[currentPos++] = (val << 27) >>> 31; + out[currentPos++] = (val << 28) >>> 31; + out[currentPos++] = (val << 29) >>> 31; + out[currentPos++] = (val << 30) >>> 31; + out[currentPos++] = (val << 31) >>> 31; + break; + } + case 1: { // number : 14, bitwidth : 2 + out[currentPos++] = (val << 4) >>> 30; + out[currentPos++] = (val << 6) >>> 30; + out[currentPos++] = (val << 8) >>> 30; + out[currentPos++] = (val << 10) >>> 30; + out[currentPos++] = (val << 12) >>> 30; + out[currentPos++] = (val << 14) >>> 30; + out[currentPos++] = (val << 16) >>> 30; + out[currentPos++] = (val << 18) >>> 30; + out[currentPos++] = (val << 20) >>> 30; + out[currentPos++] = (val << 22) >>> 30; // 10 + out[currentPos++] = (val << 24) >>> 30; + out[currentPos++] = (val << 26) >>> 30; + out[currentPos++] = (val << 28) >>> 30; + out[currentPos++] = (val << 30) >>> 30; + break; + } + case 2: { // number : 9, bitwidth : 3 + out[currentPos++] = (val << 5) >>> 29; + out[currentPos++] = (val << 8) >>> 29; + out[currentPos++] = (val << 11) >>> 29; + out[currentPos++] = (val << 14) >>> 29; + out[currentPos++] = (val << 17) >>> 29; + out[currentPos++] = (val << 20) >>> 29; + out[currentPos++] = (val << 23) >>> 29; + out[currentPos++] = (val << 26) >>> 29; + out[currentPos++] = (val << 29) >>> 29; + break; + } + case 3: { // number : 7, bitwidth : 4 + out[currentPos++] = (val << 4) >>> 28; + out[currentPos++] = (val << 8) >>> 28; + out[currentPos++] = (val << 12) >>> 28; + out[currentPos++] = (val << 16) >>> 28; + out[currentPos++] = (val << 20) >>> 28; + out[currentPos++] = (val << 24) >>> 28; + out[currentPos++] = (val << 28) >>> 28; + break; + } + case 4: { // number : 5, bitwidth : 5 + out[currentPos++] = (val << 7) >>> 27; + out[currentPos++] = (val << 12) >>> 27; + out[currentPos++] = (val << 17) >>> 27; + out[currentPos++] = (val << 22) >>> 27; + out[currentPos++] = (val << 27) >>> 27; + break; + } + case 5: { // number : 4, bitwidth : 7 + out[currentPos++] = (val << 4) >>> 25; + out[currentPos++] = (val << 11) >>> 25; + out[currentPos++] = (val << 18) >>> 25; + out[currentPos++] = (val << 25) >>> 25; + break; + } + case 6: { // number : 3, bitwidth : 9 + out[currentPos++] = (val << 5) >>> 23; + out[currentPos++] = (val << 14) >>> 23; + out[currentPos++] = (val << 23) >>> 23; + break; + } + case 7: { // number : 2, bitwidth : 14 + out[currentPos++] = (val << 4) >>> 18; + out[currentPos++] = (val << 18) >>> 18; + break; + } + case 8: { // number : 1, bitwidth : 28 + out[currentPos++] = (val << 4) >>> 4; + break; + } + default: { + throw new RuntimeException("shouldn't happen"); + } + } } - default: { - throw new RuntimeException("shouldn't happen"); + while (currentPos < finalout) { + int val = in[tmpinpos++]; + int header = val >>> 28; + switch (header) { + case 0: { // number : 28, bitwidth : 1 + final int howmany = finalout - currentPos; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (k + 4)) >>> 31; + } + break; + } + case 1: { // number : 14, bitwidth : 2 + final int howmany = finalout - currentPos < 14 ? finalout + - currentPos + : 14; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (2 * k + 4)) >>> 30; + } + break; + } + case 2: { // number : 9, bitwidth : 3 + final int howmany = finalout - currentPos < 9 ? finalout + - currentPos + : 9; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (3 * k + 5)) >>> 29; + } + break; + } + case 3: { // number : 7, bitwidth : 4 + final int howmany = finalout - currentPos < 7 ? finalout + - currentPos + : 7; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (4 * k + 4)) >>> 28; + } + break; + } + case 4: { // number : 5, bitwidth : 5 + final int howmany = finalout - currentPos < 5 ? finalout + - currentPos + : 5; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (5 * k + 7)) >>> 27; + } + break; + } + case 5: { // number : 4, bitwidth : 7 + final int howmany = finalout - currentPos < 4 ? finalout + - currentPos + : 4; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (7 * k + 4)) >>> 25; + } + break; + } + case 6: { // number : 3, bitwidth : 9 + final int howmany = finalout - currentPos < 3 ? finalout + - currentPos + : 3; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (9 * k + 5)) >>> 23; + } + break; + } + case 7: { // number : 2, bitwidth : 14 + final int howmany = finalout - currentPos < 2 ? finalout + - currentPos + : 2; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (14 * k + 4)) >>> 18; + } + break; + } + case 8: { // number : 1, bitwidth : 28 + out[currentPos++] = (val << 4) >>> 4; + break; + } + default: { + throw new RuntimeException("shouldn't happen"); + } + } } - } - } - outpos.set(currentPos); - inpos.set(tmpinpos); + outpos.set(currentPos); + inpos.set(tmpinpos); - } - - private final static int bitLength[] = {1, 2, 3, 4, 5, 7, 9, 14, 28}; + } - private final static int codeNum[] = {28, 14, 9, 7, 5, 4, 3, 2, 1}; + private final static int bitLength[] = { 1, 2, 3, 4, 5, 7, 9, 14, 28 }; + private final static int codeNum[] = { 28, 14, 9, 7, 5, 4, 3, 2, 1 }; - @Override - public String toString() { - return this.getClass().getSimpleName(); - } + @Override + public String toString() { + return this.getClass().getSimpleName(); + } } diff --git a/src/main/java/me/lemire/integercompression/Util.java b/src/main/java/me/lemire/integercompression/Util.java index a1b5677..ba47bfc 100644 --- a/src/main/java/me/lemire/integercompression/Util.java +++ b/src/main/java/me/lemire/integercompression/Util.java @@ -10,66 +10,67 @@ * Routine utility functions. * * @author Daniel Lemire - * + * */ public final class Util { - protected static int maxbits(int[] i, int pos, int length) { - int mask = 0; - for (int k = pos; k < pos + length; ++k) - mask |= i[k]; - return bits(mask); - } + protected static int maxbits(int[] i, int pos, int length) { + int mask = 0; + for (int k = pos; k < pos + length; ++k) + mask |= i[k]; + return bits(mask); + } - protected static int maxbits32(int[] i, int pos) { - int mask = i[pos]; - mask |= i[pos + 1]; - mask |= i[pos + 2]; - mask |= i[pos + 3]; - mask |= i[pos + 4]; - mask |= i[pos + 5]; - mask |= i[pos + 6]; - mask |= i[pos + 7]; - mask |= i[pos + 8]; - mask |= i[pos + 9]; - mask |= i[pos + 10]; - mask |= i[pos + 11]; - mask |= i[pos + 12]; - mask |= i[pos + 13]; - mask |= i[pos + 14]; - mask |= i[pos + 15]; - mask |= i[pos + 16]; - mask |= i[pos + 17]; - mask |= i[pos + 18]; - mask |= i[pos + 19]; - mask |= i[pos + 20]; - mask |= i[pos + 21]; - mask |= i[pos + 22]; - mask |= i[pos + 23]; - mask |= i[pos + 24]; - mask |= i[pos + 25]; - mask |= i[pos + 26]; - mask |= i[pos + 27]; - mask |= i[pos + 28]; - mask |= i[pos + 29]; - mask |= i[pos + 30]; - mask |= i[pos + 31]; - return bits(mask); - } + protected static int maxbits32(int[] i, int pos) { + int mask = i[pos]; + mask |= i[pos + 1]; + mask |= i[pos + 2]; + mask |= i[pos + 3]; + mask |= i[pos + 4]; + mask |= i[pos + 5]; + mask |= i[pos + 6]; + mask |= i[pos + 7]; + mask |= i[pos + 8]; + mask |= i[pos + 9]; + mask |= i[pos + 10]; + mask |= i[pos + 11]; + mask |= i[pos + 12]; + mask |= i[pos + 13]; + mask |= i[pos + 14]; + mask |= i[pos + 15]; + mask |= i[pos + 16]; + mask |= i[pos + 17]; + mask |= i[pos + 18]; + mask |= i[pos + 19]; + mask |= i[pos + 20]; + mask |= i[pos + 21]; + mask |= i[pos + 22]; + mask |= i[pos + 23]; + mask |= i[pos + 24]; + mask |= i[pos + 25]; + mask |= i[pos + 26]; + mask |= i[pos + 27]; + mask |= i[pos + 28]; + mask |= i[pos + 29]; + mask |= i[pos + 30]; + mask |= i[pos + 31]; + return bits(mask); + } - protected static int maxdiffbits(int initoffset, int[] i, int pos, int length) { - int mask = 0; - mask |= (i[pos] - initoffset); - for (int k = pos + 1; k < pos + length; ++k) { - mask |= i[k] - i[k - 1]; + protected static int maxdiffbits(int initoffset, int[] i, int pos, + int length) { + int mask = 0; + mask |= (i[pos] - initoffset); + for (int k = pos + 1; k < pos + length; ++k) { + mask |= i[k] - i[k - 1]; + } + return bits(mask); } - return bits(mask); - } - protected static int bits(int i) { - return 32 - Integer.numberOfLeadingZeros(i); - } + protected static int bits(int i) { + return 32 - Integer.numberOfLeadingZeros(i); + } - protected static int floorBy(int value, int factor) { - return value - value % factor; - } + protected static int floorBy(int value, int factor) { + return value - value % factor; + } } diff --git a/src/main/java/me/lemire/integercompression/VariableByte.java b/src/main/java/me/lemire/integercompression/VariableByte.java index 206ec53..599d7c6 100644 --- a/src/main/java/me/lemire/integercompression/VariableByte.java +++ b/src/main/java/me/lemire/integercompression/VariableByte.java @@ -13,110 +13,111 @@ * Implementation of variable-byte. For best performance, use it using the * ByteIntegerCODEC interface. * - * Note that this does not use differential coding: if you are working on - * sorted lists, you must compute the deltas separately. - * + * Note that this does not use differential coding: if you are working on sorted + * lists, you must compute the deltas separately. + * * @author Daniel Lemire */ public class VariableByte implements IntegerCODEC, ByteIntegerCODEC { - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - if(inlength == 0) return; - ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); - for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { - int val = in[k]; - do { - int b = (val & 127); - val >>>= 7; - if (val != 0) { - b |= 128; + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + if (inlength == 0) + return; + ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); + for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { + int val = in[k]; + do { + int b = (val & 127); + val >>>= 7; + if (val != 0) { + b |= 128; + } + buf.put((byte) b); + } while (val != 0); } - buf.put((byte) b); - } while (val != 0); + while (buf.position() % 4 != 0) + buf.put((byte) 128); + final int length = buf.position(); + buf.flip(); + IntBuffer ibuf = buf.asIntBuffer(); + ibuf.get(out, outpos.get(), length / 4); + outpos.add(length / 4); + inpos.add(inlength); } - while (buf.position() % 4 != 0) - buf.put((byte) 128); - final int length = buf.position(); - buf.flip(); - IntBuffer ibuf = buf.asIntBuffer(); - ibuf.get(out, outpos.get(), length / 4); - outpos.add(length / 4); - inpos.add(inlength); - } - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, byte[] out, - IntWrapper outpos) { - if(inlength == 0) return; - int outp = outpos.get(); - for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { - int val = in[k]; - do { - int b = (val & 127); - val >>>= 7; - if (val != 0) { - b |= 128; + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, + byte[] out, IntWrapper outpos) { + if (inlength == 0) + return; + int outp = outpos.get(); + for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { + int val = in[k]; + do { + int b = (val & 127); + val >>>= 7; + if (val != 0) { + b |= 128; + } + out[outp++] = (byte) b; + } while (val != 0); } - out[outp++]= (byte) b; - } while (val != 0); + outpos.set(outp); + inpos.add(inlength); } - outpos.set(outp); - inpos.add(inlength); - } - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { - int s = 0; - int p = inpos.get(); - int finalp = inpos.get() + inlength; - int tmpoutpos = outpos.get(); - for (int v = 0, shift = 0; p < finalp; ) { - int c = (byte) (in[p] >>> (24 - s)); - s += 8; - if (s == 32) { - s = 0; - p++; - } - v += ((c & 127) << shift); - if ((c & 128) == 0) { - out[tmpoutpos++] = v; - v = 0; - shift = 0; - } else - shift += 7; + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + int s = 0; + int p = inpos.get(); + int finalp = inpos.get() + inlength; + int tmpoutpos = outpos.get(); + for (int v = 0, shift = 0; p < finalp;) { + int c = (byte) (in[p] >>> (24 - s)); + s += 8; + if (s == 32) { + s = 0; + p++; + } + v += ((c & 127) << shift); + if ((c & 128) == 0) { + out[tmpoutpos++] = v; + v = 0; + shift = 0; + } else + shift += 7; + } + outpos.set(tmpoutpos); + inpos.add(inlength); } - outpos.set(tmpoutpos); - inpos.add(inlength); - } - @Override - public void uncompress(byte[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { - int s = 0; - int p = inpos.get(); - int finalp = inpos.get() + inlength; - int tmpoutpos = outpos.get(); - int v = 0; - int shift = 0; - for (; p < finalp; ++p) { - int c = in[p]; - v += ((c & 127) << shift); - if ((c & 128) == 0) { - out[tmpoutpos++] = v; - v = 0; - shift = 0; - } else - shift += 7; + + @Override + public void uncompress(byte[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + int p = inpos.get(); + int finalp = inpos.get() + inlength; + int tmpoutpos = outpos.get(); + int v = 0; + int shift = 0; + for (; p < finalp; ++p) { + int c = in[p]; + v += ((c & 127) << shift); + if ((c & 128) == 0) { + out[tmpoutpos++] = v; + v = 0; + shift = 0; + } else + shift += 7; + } + outpos.set(tmpoutpos); + inpos.add(p); } - outpos.set(tmpoutpos); - inpos.add(p); - } - - @Override - public String toString() { - return this.getClass().getSimpleName(); - } + @Override + public String toString() { + return this.getClass().getSimpleName(); + } } diff --git a/src/main/java/me/lemire/integercompression/XorBinaryPacking.java b/src/main/java/me/lemire/integercompression/XorBinaryPacking.java index 31f7556..ea0d9ce 100644 --- a/src/main/java/me/lemire/integercompression/XorBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/XorBinaryPacking.java @@ -6,141 +6,128 @@ /** * XOR + BinaryPacking. - * + * * @author MURAOKA Taro http://github.com/koron */ public final class XorBinaryPacking implements IntegratedIntegerCODEC { - /** A flag for debugging. */ - public static final boolean DEBUG_DISABLE_BITPACKING = false; - - public static final int BLOCK_LENGTH = 128; - - public void compress( - int[] inBuf, IntWrapper inPos, int inLen, - int[] outBuf, IntWrapper outPos) - { - inLen = inLen - inLen % BLOCK_LENGTH; - if (inLen == 0) - return; - - outBuf[outPos.get()] = inLen; - outPos.increment(); - - int context = 0; - final int[] work = new int[32]; - - int op = outPos.get(); - int ip = inPos.get(); - final int inPosLast = ip + inLen; - for (; ip < inPosLast; ip += BLOCK_LENGTH) { - final int bits1 = xorMaxBits(inBuf, ip + 0, 32, context); - final int bits2 = xorMaxBits(inBuf, ip + 32, 32, inBuf[ip + 31]); - final int bits3 = xorMaxBits(inBuf, ip + 64, 32, inBuf[ip + 63]); - final int bits4 = xorMaxBits(inBuf, ip + 96, 32, inBuf[ip + 95]); - outBuf[op++] = (bits1 << 24) | (bits2 << 16) | - (bits3 << 8) | (bits4 << 0); - op += xorPack(inBuf, ip + 0, outBuf, op, bits1, context, work); - op += xorPack(inBuf, ip + 32, outBuf, op, bits2, inBuf[ip + 31], - work); - op += xorPack(inBuf, ip + 64, outBuf, op, bits3, inBuf[ip + 63], - work); - op += xorPack(inBuf, ip + 96, outBuf, op, bits4, inBuf[ip + 95], - work); - context = inBuf[ip + 127]; + private static final int BLOCK_LENGTH = 128; + + @Override + public void compress(final int[] inBuf, final IntWrapper inPos, + int inLen, final int[] outBuf, final IntWrapper outPos) { + inLen = inLen - inLen % BLOCK_LENGTH; + if (inLen == 0) + return; + + outBuf[outPos.get()] = inLen; + outPos.increment(); + + int context = 0; + final int[] work = new int[32]; + + int op = outPos.get(); + int ip = inPos.get(); + final int inPosLast = ip + inLen; + for (; ip < inPosLast; ip += BLOCK_LENGTH) { + final int bits1 = xorMaxBits(inBuf, ip + 0, 32, context); + final int bits2 = xorMaxBits(inBuf, ip + 32, 32, + inBuf[ip + 31]); + final int bits3 = xorMaxBits(inBuf, ip + 64, 32, + inBuf[ip + 63]); + final int bits4 = xorMaxBits(inBuf, ip + 96, 32, + inBuf[ip + 95]); + outBuf[op++] = (bits1 << 24) | (bits2 << 16) + | (bits3 << 8) | (bits4 << 0); + op += xorPack(inBuf, ip + 0, outBuf, op, bits1, + context, work); + op += xorPack(inBuf, ip + 32, outBuf, op, bits2, + inBuf[ip + 31], work); + op += xorPack(inBuf, ip + 64, outBuf, op, bits3, + inBuf[ip + 63], work); + op += xorPack(inBuf, ip + 96, outBuf, op, bits4, + inBuf[ip + 95], work); + context = inBuf[ip + 127]; + } + + inPos.add(inLen); + outPos.set(op); } - inPos.add(inLen); - outPos.set(op); - } - - public void uncompress( - int[] inBuf, IntWrapper inPos, int inLen, - int[] outBuf, IntWrapper outPos) - { - if (inLen == 0) - return; - - final int outLen = inBuf[inPos.get()]; - inPos.increment(); - - int context = 0; - final int[] work = new int[32]; - - int ip = inPos.get(); - int op = outPos.get(); - final int outPosLast = op + outLen; - for (; op < outPosLast; op += BLOCK_LENGTH) { - final int bits1 = (inBuf[ip] >>> 24); - final int bits2 = (inBuf[ip] >>> 16) & 0xFF; - final int bits3 = (inBuf[ip] >>> 8) & 0xFF; - final int bits4 = (inBuf[ip] >>> 0) & 0xFF; - ++ip; - ip += xorUnpack(inBuf, ip, outBuf, op + 0, bits1, context, work); - ip += xorUnpack(inBuf, ip, outBuf, op + 32, bits2, outBuf[op + 31], - work); - ip += xorUnpack(inBuf, ip, outBuf, op + 64, bits3, outBuf[op + 63], - work); - ip += xorUnpack(inBuf, ip, outBuf, op + 96, bits4, outBuf[op + 95], - work); - context = outBuf[op + 127]; + @Override + public void uncompress(int[] inBuf, IntWrapper inPos, int inLen, + int[] outBuf, IntWrapper outPos) { + if (inLen == 0) + return; + + final int outLen = inBuf[inPos.get()]; + inPos.increment(); + + int context = 0; + final int[] work = new int[32]; + + int ip = inPos.get(); + int op = outPos.get(); + final int outPosLast = op + outLen; + for (; op < outPosLast; op += BLOCK_LENGTH) { + final int bits1 = (inBuf[ip] >>> 24); + final int bits2 = (inBuf[ip] >>> 16) & 0xFF; + final int bits3 = (inBuf[ip] >>> 8) & 0xFF; + final int bits4 = (inBuf[ip] >>> 0) & 0xFF; + ++ip; + ip += xorUnpack(inBuf, ip, outBuf, op + 0, bits1, + context, work); + ip += xorUnpack(inBuf, ip, outBuf, op + 32, bits2, + outBuf[op + 31], work); + ip += xorUnpack(inBuf, ip, outBuf, op + 64, bits3, + outBuf[op + 63], work); + ip += xorUnpack(inBuf, ip, outBuf, op + 96, bits4, + outBuf[op + 95], work); + context = outBuf[op + 127]; + } + + outPos.add(outLen); + inPos.set(ip); } - outPos.add(outLen); - inPos.set(ip); - } - - @Override - public String toString() { - return this.getClass().getSimpleName(); - } - - public static int xorMaxBits(int[] buf, int offset, int length, - int context) - { - int mask = buf[offset] ^ context; - final int M = offset + length; - for (int i = offset + 1, prev = offset; i < M; ++i, ++prev) { - mask |= buf[i] ^ buf[prev]; + @Override + public String toString() { + return this.getClass().getSimpleName(); } - if (DEBUG_DISABLE_BITPACKING) { - return 32; - } else { - return 32 - Integer.numberOfLeadingZeros(mask); - } - } - - public static int xorPack(int[] inBuf, int inOff, - int[] outBuf, int outOff, int validBits, int context, int[] work) - { - work[0] = inBuf[inOff] ^ context; - for (int i = 1, p = inOff + 1; i < 32; ++i, ++p) { - work[i] = inBuf[p] ^ inBuf[p - 1]; - } - if (DEBUG_DISABLE_BITPACKING) { - for (int i = 0; i < 32; ++i) { - outBuf[outOff + i] = work[i]; - } - } else { - BitPacking.fastpackwithoutmask(work, 0, outBuf, outOff, validBits); + + private static int xorMaxBits(final int[] buf, final int offset, + final int length, final int context) { + int mask = buf[offset] ^ context; + final int M = offset + length; + for (int i = offset + 1, prev = offset; i < M; ++i, ++prev) { + mask |= buf[i] ^ buf[prev]; + } + + return 32 - Integer.numberOfLeadingZeros(mask); } - return validBits; - } - - public static int xorUnpack(int[] inBuf, int inOff, - int[] outBuf, int outOff, int validBits, int context, int[] work) - { - if (DEBUG_DISABLE_BITPACKING) { - for (int i = 0; i < 32; ++i) { - work[i] = inBuf[inOff + i]; - } - } else { - BitPacking.fastunpack(inBuf, inOff, work, 0, validBits); + + private static int xorPack(final int[] inBuf, final int inOff, + final int[] outBuf, final int outOff, final int validBits, + final int context, final int[] work) { + work[0] = inBuf[inOff] ^ context; + for (int i = 1, p = inOff + 1; i < 32; ++i, ++p) { + work[i] = inBuf[p] ^ inBuf[p - 1]; + } + BitPacking.fastpackwithoutmask(work, 0, outBuf, outOff, + validBits); + + return validBits; } - outBuf[outOff] = context = work[0] ^ context; - for (int i = 1, p = outOff + 1; i < 32; ++i, ++p) { - outBuf[p] = context = work[i] ^ context; + + private static int xorUnpack(final int[] inBuf, final int inOff, + final int[] outBuf, final int outOff, final int validBits, + int context, final int[] work) { + + BitPacking.fastunpack(inBuf, inOff, work, 0, validBits); + outBuf[outOff] = context = work[0] ^ context; + for (int i = 1, p = outOff + 1; i < 32; ++i, ++p) { + outBuf[p] = context = work[i] ^ context; + } + return validBits; } - return validBits; - } } diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java index 565fecd..6d0efc9 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java @@ -16,131 +16,151 @@ public class BenchmarkCSV { new IntegratedComposition(new IntegratedFastPFOR(), new IntegratedVariableByte()), new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()) - }; - static IntegratedByteIntegerCODEC bcodecs[]= { - new IntegratedVariableByte() - }; + new IntegratedVariableByte()) }; + static IntegratedByteIntegerCODEC bcodecs[] = { new IntegratedVariableByte() }; static IntegerCODEC regcodecs[] = { - new Composition(new FastPFOR(), - new VariableByte()), - new Composition(new BinaryPacking(), - new VariableByte()) - }; - static ByteIntegerCODEC regbcodecs[]= { - new VariableByte() - }; - - - public static ArrayList loadIntegers(String filename,Format f) throws IOException { - int misparsed = 0; - if(f== Format.ONEARRAYPERLINE) { - ArrayList answer = new ArrayList(); - BufferedReader br = new BufferedReader(new FileReader(filename)); - String s; - while((s = br.readLine())!= null) { - String[] numbers = s.split("[,;;]"); // that's slow - int[] a = new int[numbers.length]; - for (int k = 0; k < numbers.length; ++k) { - try { - a[k] = Integer.parseInt(numbers[k].trim()); - } catch(java.lang.NumberFormatException nfe) { - if(misparsed==0) - System.err.println(nfe); - ++misparsed; - } - } - answer.add(a); - } - if(misparsed > 0) System.out.println("Failed to parse "+misparsed+" entries"); - return answer; - } else if(f==Format.ONEARRAYPERFILE) { + new Composition(new FastPFOR(), new VariableByte()), + new Composition(new BinaryPacking(), new VariableByte()) }; + static ByteIntegerCODEC regbcodecs[] = { new VariableByte() }; + + private static ArrayList loadIntegers(final String filename, final Format f) + throws IOException { + int misparsed = 0; + if (f == Format.ONEARRAYPERLINE) { + ArrayList answer = new ArrayList(); + BufferedReader br = new BufferedReader(new FileReader( + filename)); + String s; + while ((s = br.readLine()) != null) { + String[] numbers = s.split("[,;;]"); // that's + // slow + int[] a = new int[numbers.length]; + for (int k = 0; k < numbers.length; ++k) { + try { + a[k] = Integer + .parseInt(numbers[k] + .trim()); + } catch (java.lang.NumberFormatException nfe) { + if (misparsed == 0) + System.err.println(nfe); + ++misparsed; + } + } + answer.add(a); + } + if (misparsed > 0) + System.out.println("Failed to parse " + + misparsed + " entries"); + return answer; + } else if (f == Format.ONEARRAYPERFILE) { ArrayList answer = new ArrayList(); - BufferedReader br = new BufferedReader(new FileReader(filename)); + BufferedReader br = new BufferedReader(new FileReader( + filename)); String s; - while((s = br.readLine())!= null) { - String[] numbers = s.split("[,;;]");// that's slow + while ((s = br.readLine()) != null) { + String[] numbers = s.split("[,;;]");// that's + // slow for (int k = 0; k < numbers.length; ++k) { - try { - answer.add(Integer.parseInt(numbers[k].trim())); - } catch(java.lang.NumberFormatException nfe) { - if(misparsed==0) - System.err.println(nfe); - ++misparsed; - } - } - } + try { + answer.add(Integer + .parseInt(numbers[k] + .trim())); + } catch (java.lang.NumberFormatException nfe) { + if (misparsed == 0) + System.err.println(nfe); + ++misparsed; + } + } + } int[] actualanswer = new int[answer.size()]; - for(int i = 0; i < answer.size(); ++i) + for (int i = 0; i < answer.size(); ++i) actualanswer[i] = answer.get(i); ArrayList wrap = new ArrayList(); wrap.add(actualanswer); - if(misparsed > 0) System.out.println("Failed to parse "+misparsed+" entries"); - return wrap; + if (misparsed > 0) + System.out.println("Failed to parse " + + misparsed + " entries"); + return wrap; } else { ArrayList answer = new ArrayList(); - BufferedReader br = new BufferedReader(new FileReader(filename)); + BufferedReader br = new BufferedReader(new FileReader( + filename)); String s; - while((s = br.readLine())!= null) { - try { - answer.add(Integer.parseInt(s.trim())); - } catch(java.lang.NumberFormatException nfe) { - if(misparsed==0) - System.err.println(nfe); - ++misparsed; - } - } + while ((s = br.readLine()) != null) { + try { + answer.add(Integer.parseInt(s.trim())); + } catch (java.lang.NumberFormatException nfe) { + if (misparsed == 0) + System.err.println(nfe); + ++misparsed; + } + } int[] actualanswer = new int[answer.size()]; - for(int i = 0; i < answer.size(); ++i) + for (int i = 0; i < answer.size(); ++i) actualanswer[i] = answer.get(i); ArrayList wrap = new ArrayList(); wrap.add(actualanswer); - if(misparsed > 0) System.out.println("Failed to parse "+misparsed+" entries"); - return wrap; + if (misparsed > 0) + System.out.println("Failed to parse " + + misparsed + " entries"); + return wrap; } } - public enum Format { - ONEARRAYPERLINE, ONEARRAYPERFILE,ONEINTPERLINE + + private enum Format { + ONEARRAYPERLINE, ONEARRAYPERFILE, ONEINTPERLINE } - public enum CompressionMode { + private enum CompressionMode { AS_IS, DELTA } - public static void main(String[] args) throws IOException { + + /** + * @param args + * @throws IOException + */ + public static void main(final String[] args) throws IOException { Format myformat = Format.ONEARRAYPERLINE; CompressionMode cm = CompressionMode.DELTA; ArrayList files = new ArrayList(); - for(String s : args) { - if(s.startsWith("-")) {// it is a flag - if(s.equals("--onearrayperfile")) + for (String s : args) { + if (s.startsWith("-")) {// it is a flag + if (s.equals("--onearrayperfile")) myformat = Format.ONEARRAYPERFILE; - else if(s.equals("--nodelta")) + else if (s.equals("--nodelta")) cm = CompressionMode.AS_IS; - else if(s.equals("--oneintperline")) + else if (s.equals("--oneintperline")) myformat = Format.ONEINTPERLINE; - else throw new RuntimeException("I don't understand: "+s); + else + throw new RuntimeException( + "I don't understand: " + s); } else {// it is a filename files.add(s); } } - if(myformat == Format.ONEARRAYPERFILE) + if (myformat == Format.ONEARRAYPERFILE) System.out.println("Treating each file as one array."); - else if(myformat == Format.ONEARRAYPERLINE) - System.out.println("Each line of each file is an array: use --onearrayperfile or --oneintperline to change."); - else if(myformat == Format.ONEINTPERLINE) - System.out.println("Treating each file as one array, with one integer per line."); - if(cm == CompressionMode.AS_IS) - System.out.println("Compressing the integers 'as is' (no differential coding)"); - else - System.out.println("Using differential coding (arrays will be sorted): use --nodelta to prevent sorting"); + else if (myformat == Format.ONEARRAYPERLINE) + System.out + .println("Each line of each file is an array: use --onearrayperfile or --oneintperline to change."); + else if (myformat == Format.ONEINTPERLINE) + System.out + .println("Treating each file as one array, with one integer per line."); + if (cm == CompressionMode.AS_IS) + System.out + .println("Compressing the integers 'as is' (no differential coding)"); + else + System.out + .println("Using differential coding (arrays will be sorted): use --nodelta to prevent sorting"); ArrayList data = new ArrayList(); - for (String fn: files) - for(int[] x: loadIntegers(fn,myformat)) + for (String fn : files) + for (int[] x : loadIntegers(fn, myformat)) data.add(x); System.out.println("Loaded " + data.size() + " array(s)"); - if(cm == CompressionMode.DELTA) { - System.out.println("Sorting the arrray(s) because you are using differential coding"); - for(int[] x: data) + if (cm == CompressionMode.DELTA) { + System.out + .println("Sorting the arrray(s) because you are using differential coding"); + for (int[] x : data) Arrays.sort(x); } bench(data, cm, false); @@ -151,17 +171,20 @@ else if(myformat == Format.ONEINTPERLINE) bytebench(data, cm, true); } - public static void bench(ArrayList postings, CompressionMode cm, boolean verbose) { + private static void bench(ArrayList postings, CompressionMode cm, + boolean verbose) { int maxlength = 0; for (int[] x : postings) if (maxlength < x.length) maxlength = x.length; - if (verbose) System.out.println("Max array length: " + maxlength); - int[] compbuffer = new int[2*maxlength + 1024]; + if (verbose) + System.out.println("Max array length: " + maxlength); + int[] compbuffer = new int[2 * maxlength + 1024]; int[] decompbuffer = new int[maxlength]; - if(verbose) + if (verbose) System.out.println("Scheme -- bits/int -- speed (mis)"); - for (IntegerCODEC c : (cm == CompressionMode.DELTA ? codecs: regcodecs)) { + for (IntegerCODEC c : (cm == CompressionMode.DELTA ? codecs + : regcodecs)) { long bef = 0; long aft = 0; long decomptime = 0; @@ -214,17 +237,20 @@ public static void bench(ArrayList postings, CompressionMode cm, boolean } } - public static void bytebench(ArrayList postings, CompressionMode cm, boolean verbose) { + private static void bytebench(ArrayList postings, + CompressionMode cm, boolean verbose) { int maxlength = 0; for (int[] x : postings) if (maxlength < x.length) maxlength = x.length; - if (verbose) System.out.println("Max array length: " + maxlength); - byte[] compbuffer = new byte[6*(maxlength + 1024)]; + if (verbose) + System.out.println("Max array length: " + maxlength); + byte[] compbuffer = new byte[6 * (maxlength + 1024)]; int[] decompbuffer = new int[maxlength]; - if(verbose) + if (verbose) System.out.println("Scheme -- bits/int -- speed (mis)"); - for (ByteIntegerCODEC c : (cm == CompressionMode.DELTA ? bcodecs: regbcodecs)) { + for (ByteIntegerCODEC c : (cm == CompressionMode.DELTA ? bcodecs + : regbcodecs)) { long bef = 0; long aft = 0; long decomptime = 0; diff --git a/src/main/java/me/lemire/integercompression/synth/ClusteredDataGenerator.java b/src/main/java/me/lemire/integercompression/synth/ClusteredDataGenerator.java index 1c48da9..12bf550 100644 --- a/src/main/java/me/lemire/integercompression/synth/ClusteredDataGenerator.java +++ b/src/main/java/me/lemire/integercompression/synth/ClusteredDataGenerator.java @@ -7,77 +7,82 @@ package me.lemire.integercompression.synth; /** - * This class will generate lists of random integers based on the clustered model: + * This class will generate lists of random integers based on the clustered + * model: * - * Reference: - * Vo Ngoc Anh and Alistair Moffat. 2010. Index compression using 64-bit words. - * Softw. Pract. Exper.40, 2 (February 2010), 131-147. + * Reference: Vo Ngoc Anh and Alistair Moffat. 2010. Index compression using + * 64-bit words. Softw. Pract. Exper.40, 2 (February 2010), 131-147. * * @author Daniel Lemire */ public class ClusteredDataGenerator { - UniformDataGenerator unidg = new UniformDataGenerator(); + UniformDataGenerator unidg = new UniformDataGenerator(); - /** - * Creating random array generator. - */ - public ClusteredDataGenerator() { - } - - void fillUniform(int[] array, int offset, int length, int Min, int Max) { - int[] v = this.unidg.generateUniform(length, Max - Min); - for (int k = 0; k < v.length; ++k) - array[k + offset] = Min + v[k]; - } + /** + * Creating random array generator. + */ + public ClusteredDataGenerator() { + } - void fillClustered(int[] array, int offset, int length, int Min, int Max) { - final int range = Max - Min; - if ((range == length) || (length <= 10)) { - fillUniform(array, offset, length, Min, Max); - return; + void fillUniform(int[] array, int offset, int length, int Min, int Max) { + int[] v = this.unidg.generateUniform(length, Max - Min); + for (int k = 0; k < v.length; ++k) + array[k + offset] = Min + v[k]; } - final int cut = length - / 2 - + ((range - length - 1 > 0) ? this.unidg.rand.nextInt(range - length - 1) - : 0); - final double p = this.unidg.rand.nextDouble(); - if (p < 0.25) { - fillUniform(array, offset, length / 2, Min, Min + cut); - fillClustered(array, offset + length / 2, length - length / 2, Min + cut, - Max); - } else if (p < 0.5) { - fillClustered(array, offset, length / 2, Min, Min + cut); - fillUniform(array, offset + length / 2, length - length / 2, Min + cut, - Max); - } else { - fillClustered(array, offset, length / 2, Min, Min + cut); - fillClustered(array, offset + length / 2, length - length / 2, Min + cut, - Max); + + void fillClustered(int[] array, int offset, int length, int Min, int Max) { + final int range = Max - Min; + if ((range == length) || (length <= 10)) { + fillUniform(array, offset, length, Min, Max); + return; + } + final int cut = length + / 2 + + ((range - length - 1 > 0) ? this.unidg.rand + .nextInt(range - length - 1) : 0); + final double p = this.unidg.rand.nextDouble(); + if (p < 0.25) { + fillUniform(array, offset, length / 2, Min, Min + cut); + fillClustered(array, offset + length / 2, length + - length / 2, Min + cut, Max); + } else if (p < 0.5) { + fillClustered(array, offset, length / 2, Min, Min + cut); + fillUniform(array, offset + length / 2, length - length + / 2, Min + cut, Max); + } else { + fillClustered(array, offset, length / 2, Min, Min + cut); + fillClustered(array, offset + length / 2, length + - length / 2, Min + cut, Max); + } } - } - /** - * generates randomly N distinct integers from 0 to Max. - * @param N number of integers to generate - * @param Max maximal value of the integers - * @return array containing the integers - */ - public int[] generateClustered(int N, int Max) { - int[] array = new int[N]; - fillClustered(array, 0, N, 0, Max); - return array; - } + /** + * generates randomly N distinct integers from 0 to Max. + * + * @param N + * number of integers to generate + * @param Max + * maximal value of the integers + * @return array containing the integers + */ + public int[] generateClustered(int N, int Max) { + int[] array = new int[N]; + fillClustered(array, 0, N, 0, Max); + return array; + } - /** - * Little test program. - * - * @param args arguments are ignored - */ - public static void main(final String[] args) { - int[] example = (new ClusteredDataGenerator()).generateClustered(20, 1000); - for (int k = 0; k < example.length; ++k) - System.out.println(example[k]); - } + /** + * Little test program. + * + * @param args + * arguments are ignored + */ + public static void main(final String[] args) { + int[] example = (new ClusteredDataGenerator()) + .generateClustered(20, 1000); + for (int k = 0; k < example.length; ++k) + System.out.println(example[k]); + } } diff --git a/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java b/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java index 5fde6f0..bbd386a 100644 --- a/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java +++ b/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java @@ -13,8 +13,8 @@ import java.util.Random; /** - * This class will generate "uniform" lists of random integers. - * + * This class will generate "uniform" lists of random integers. + * * @author Daniel Lemire */ public class UniformDataGenerator { @@ -26,7 +26,8 @@ public UniformDataGenerator() { } /** - * @param seed random seed + * @param seed + * random seed */ public UniformDataGenerator(final int seed) { this.rand = new Random(seed); @@ -50,9 +51,8 @@ int[] generateUniformHash(int N, int Max) { } /** - * output all integers from the range [0,Max) that are not - * in the array - */ + * output all integers from the range [0,Max) that are not in the array + */ static int[] negate(int[] x, int Max) { int[] ans = new int[Max - x.length]; int i = 0; @@ -68,16 +68,18 @@ static int[] negate(int[] x, int Max) { return ans; } - /** * generates randomly N distinct integers from 0 to Max. - * @param N number of integers to generate - * @param Max bound on the value of integers + * + * @param N + * number of integers to generate + * @param Max + * bound on the value of integers * @return an array containing randomly selected integers */ public int[] generateUniform(int N, int Max) { - if(N * 2 > Max) { - return negate( generateUniform(Max - N, Max), Max ); + if (N * 2 > Max) { + return negate(generateUniform(Max - N, Max), Max); } if (2048 * N > Max) return generateUniformBitmap(N, Max); diff --git a/src/test/java/me/lemire/integercompression/AdhocTest.java b/src/test/java/me/lemire/integercompression/AdhocTest.java index 59241de..d076b44 100644 --- a/src/test/java/me/lemire/integercompression/AdhocTest.java +++ b/src/test/java/me/lemire/integercompression/AdhocTest.java @@ -1,15 +1,12 @@ package me.lemire.integercompression; -import java.util.Arrays; - import org.junit.Test; -import static org.junit.Assert.*; - import static me.lemire.integercompression.TestUtils.*; /** * Collection of adhoc tests. */ +@SuppressWarnings({ "javadoc", "static-method" }) public class AdhocTest { @@ -34,14 +31,5 @@ public void biggerCompressedArray2() { assertSymmetry(c, 65535, 65535); } - // NOTE: This require bigger 2 items for compressed array than original. - /* - @Test - public void overflowVariableByte() { - IntegerCODEC c = new VariableByte(); - int[] d = new int[8]; - Arrays.fill(d, -1); - assertSymmetry(c, d); - } - */ + } diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index ccf69b6..ef25851 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -120,7 +120,6 @@ public void checkXorBinaryPacking3() { /** * Verify bitpacking. */ - @SuppressWarnings("static-method") @Test public void verifyBitPacking() { final int N = 32; @@ -144,7 +143,6 @@ public void verifyBitPacking() { /** * Verify bitpacking without mask. */ - @SuppressWarnings("static-method") @Test public void verifyWithoutMask() { final int N = 32; @@ -174,7 +172,6 @@ public static void maskArray(int[] array, int mask) { /** * Verify bitpacking with exception. */ - @SuppressWarnings("static-method") @Test public void verifyWithExceptions() { final int N = 32; @@ -201,7 +198,6 @@ public void verifyWithExceptions() { /** * check that the codecs can be inverted. */ - @SuppressWarnings("static-method") @Test public void basictest() { test(5, 10); @@ -212,7 +208,6 @@ public void basictest() { /** * check that there is no spurious output. */ - @SuppressWarnings("static-method") @Test public void spuriousouttest() { testSpurious(new IntegratedBinaryPacking()); @@ -230,7 +225,6 @@ public void spuriousouttest() { * check that an empty array generates an empty array * after compression. */ - @SuppressWarnings("static-method") @Test public void zeroinzerouttest() { testZeroInZeroOut(new IntegratedBinaryPacking()); @@ -370,7 +364,6 @@ private static void testCodec(IntegerCODEC c, int[][] data, int max) { /** * Test for unsorted array. */ - @SuppressWarnings("static-method") @Test public void testUnsortedExample() { testUnsorted(new VariableByte()); diff --git a/src/test/java/me/lemire/integercompression/DeltaZigzagEncodingTest.java b/src/test/java/me/lemire/integercompression/DeltaZigzagEncodingTest.java index 1429c94..872c6ac 100644 --- a/src/test/java/me/lemire/integercompression/DeltaZigzagEncodingTest.java +++ b/src/test/java/me/lemire/integercompression/DeltaZigzagEncodingTest.java @@ -7,6 +7,7 @@ import org.junit.Test; import static org.junit.Assert.*; +@SuppressWarnings({ "javadoc", "static-method" }) public class DeltaZigzagEncodingTest { public static int zigzagEncode(DeltaZigzagEncoding.Encoder e, int value) { @@ -40,7 +41,7 @@ public static void checkDecode( @Test public void checkZigzagEncode() { - DeltaZigzagEncoding.Encoder e = new DeltaZigzagEncoding.Encoder(); + DeltaZigzagEncoding.Encoder e = new DeltaZigzagEncoding.Encoder(0); assertEquals(0, zigzagEncode(e, 0)); assertEquals(2, zigzagEncode(e, 1)); assertEquals(4, zigzagEncode(e, 2)); @@ -52,7 +53,7 @@ public void checkZigzagEncode() { @Test public void checkZigzagDecoder() { - DeltaZigzagEncoding.Decoder d = new DeltaZigzagEncoding.Decoder(); + DeltaZigzagEncoding.Decoder d = new DeltaZigzagEncoding.Decoder(0); assertEquals( 0, zigzagDecode(d, 0)); assertEquals(-1, zigzagDecode(d, 1)); assertEquals( 1, zigzagDecode(d, 2)); @@ -63,7 +64,7 @@ public void checkZigzagDecoder() { @Test public void checkEncodeSimple() { - DeltaZigzagEncoding.Encoder e = new DeltaZigzagEncoding.Encoder(); + DeltaZigzagEncoding.Encoder e = new DeltaZigzagEncoding.Encoder(0); checkEncode(e, new int[]{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, new int[]{ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2 }); @@ -71,7 +72,7 @@ public void checkEncodeSimple() { @Test public void checkDecodeSimple() { - DeltaZigzagEncoding.Decoder d = new DeltaZigzagEncoding.Decoder(); + DeltaZigzagEncoding.Decoder d = new DeltaZigzagEncoding.Decoder(0); checkDecode(d, new int[]{ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, new int[]{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }); @@ -80,15 +81,15 @@ public void checkDecodeSimple() { public static class SpotChecker { private final static DeltaZigzagEncoding.Encoder encoder = - new DeltaZigzagEncoding.Encoder(); + new DeltaZigzagEncoding.Encoder(0); private final static DeltaZigzagEncoding.Decoder decoder = - new DeltaZigzagEncoding.Decoder(); + new DeltaZigzagEncoding.Decoder(0); public void check(int value) { - this.encoder.setContextValue(0); - this.decoder.setContextValue(0); - int value2 = this.decoder.decodeInt(this.encoder.encodeInt(value)); + SpotChecker.encoder.setContextValue(0); + SpotChecker.decoder.setContextValue(0); + int value2 = SpotChecker.decoder.decodeInt(SpotChecker.encoder.encodeInt(value)); assertEquals(value, value2); } } diff --git a/src/test/java/me/lemire/integercompression/TestUtils.java b/src/test/java/me/lemire/integercompression/TestUtils.java index 7c2d7ee..69fde8a 100644 --- a/src/test/java/me/lemire/integercompression/TestUtils.java +++ b/src/test/java/me/lemire/integercompression/TestUtils.java @@ -7,6 +7,7 @@ /** * Static utility methods for test. */ +@SuppressWarnings({ "javadoc"}) public class TestUtils { public static void dumpIntArray(int[] data, String label) { diff --git a/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java b/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java index 1348f0f..35dde4e 100644 --- a/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java +++ b/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java @@ -9,82 +9,19 @@ import org.junit.Test; import static org.junit.Assert.*; +@SuppressWarnings({ "javadoc", "static-method" }) public final class XorBinaryPackingTest { - @Test - public void packAndUnpack0() { - int[] data = new int[] { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - }; - checkPack(data, 6, 0); - } - - @Test - public void packAndUnpack1() { - int[] data = new int[32]; - Arrays.fill(data, 1); - checkPack(data, 1, 0); - Arrays.fill(data, 2); - checkPack(data, 2, 1); - Arrays.fill(data, 4); - checkPack(data, 3, 2); - Arrays.fill(data, 8); - checkPack(data, 4, 4); - } - - public void checkPack(int[] data, int validBits, int context) { - int[] work = new int[32]; - - int[] packBuf = new int[validBits]; - int packRetval = XorBinaryPacking.xorPack(data, 0, packBuf, 0, - validBits, context, work); - assertEquals(validBits, packRetval); - int[] unpackBuf = new int[32]; - int unpackRetval = XorBinaryPacking.xorUnpack(packBuf, 0, unpackBuf, 0, - validBits, context, work); - assertEquals(validBits, unpackRetval); - assertArrayEquals(data, unpackBuf); - } - @Test - public void maxBits0() { - int[] data = { 0 }; - assertEquals(0, XorBinaryPacking.xorMaxBits(data, 0, data.length, 0)); - assertEquals(1, XorBinaryPacking.xorMaxBits(data, 0, data.length, 1)); - assertEquals(2, XorBinaryPacking.xorMaxBits(data, 0, data.length, 2)); - assertEquals(2, XorBinaryPacking.xorMaxBits(data, 0, data.length, 3)); - assertEquals(3, XorBinaryPacking.xorMaxBits(data, 0, data.length, 4)); - assertEquals(3, XorBinaryPacking.xorMaxBits(data, 0, data.length, 5)); - assertEquals(3, XorBinaryPacking.xorMaxBits(data, 0, data.length, 6)); - assertEquals(3, XorBinaryPacking.xorMaxBits(data, 0, data.length, 7)); - assertEquals(4, XorBinaryPacking.xorMaxBits(data, 0, data.length, 8)); - for (int i = 5; i <= 32; ++i) { - assertEquals(i, XorBinaryPacking.xorMaxBits(data, 0, data.length, - 1 << (i - 1))); - } - } - @Test - public void maxBits1() { - int[] data = { 0 }; - for (int i = 1; i <= 32; ++i) { - data[0] = 1 << (i - 1); - assertEquals(i, - XorBinaryPacking.xorMaxBits(data, 0, data.length, 0)); - } - } public static void checkCompressAndUncompress(String label, int[] data) { - //TestUtils.dumpIntArrayAsHex(data, label + " - original"); XorBinaryPacking codec = new XorBinaryPacking(); int[] compBuf = TestUtils.compress(codec, data); - //TestUtils.dumpIntArrayAsHex(compBuf, label + " - compBuf"); int[] decompBuf = TestUtils.uncompress(codec, compBuf, data.length); - //TestUtils.dumpIntArrayAsHex(decompBuf, label + " - decompBuf"); assertArrayEquals(data, decompBuf); } From c98c0f091513cd33766137bf1d8f0dacce507b33 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Sat, 25 Jan 2014 20:25:31 -0500 Subject: [PATCH 133/412] Saving... --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2ec046a..f0cc91f 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ the following code in your pom.xml file: me.lemire.integercompression JavaFastPFOR - 0.0.9 + 0.0.10 From 718204d5a0167c36a16fbdee7dfe73fe07668466 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Sat, 25 Jan 2014 20:27:00 -0500 Subject: [PATCH 134/412] [maven-release-plugin] prepare release JavaFastPFOR-0.0.10 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9ad6c75..2be5f59 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.10-SNAPSHOT + 0.0.10 jar From c93421b79faa62c5fbc8ea35fd2ff9799971b2a4 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Sat, 25 Jan 2014 20:27:04 -0500 Subject: [PATCH 135/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2be5f59..a4a592b 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.10 + 0.0.11-SNAPSHOT jar From d7769049c6b30590e19b834d3083b6268b7b849a Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Sat, 25 Jan 2014 20:34:14 -0500 Subject: [PATCH 136/412] Putting back the moved files. --- build.xml | 2 +- .../benchmarktools/Benchmark.java | 674 ++++++++++++++++++ .../benchmarktools/BenchmarkBitPacking.java | 154 ++++ .../BenchmarkOffsettedSeries.java | 294 ++++++++ .../benchmarktools/PerformanceLogger.java | 75 ++ 5 files changed, 1198 insertions(+), 1 deletion(-) create mode 100644 src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java create mode 100644 src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkBitPacking.java create mode 100644 src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkOffsettedSeries.java create mode 100644 src/main/java/me/lemire/integercompression/benchmarktools/PerformanceLogger.java diff --git a/build.xml b/build.xml index 2f964d5..974a14c 100644 --- a/build.xml +++ b/build.xml @@ -14,7 +14,7 @@ diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java b/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java new file mode 100644 index 0000000..7429892 --- /dev/null +++ b/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java @@ -0,0 +1,674 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ +package me.lemire.integercompression.benchmarktools; + +import com.kamikaze.pfordelta.PForDelta; + +import me.lemire.integercompression.BinaryPacking; +import me.lemire.integercompression.ByteIntegerCODEC; +import me.lemire.integercompression.Composition; +import me.lemire.integercompression.Delta; +import me.lemire.integercompression.DeltaZigzagBinaryPacking; +import me.lemire.integercompression.DeltaZigzagVariableByte; +import me.lemire.integercompression.FastPFOR; +import me.lemire.integercompression.IntWrapper; +import me.lemire.integercompression.IntegerCODEC; +import me.lemire.integercompression.IntegratedBinaryPacking; +import me.lemire.integercompression.IntegratedByteIntegerCODEC; +import me.lemire.integercompression.IntegratedComposition; +import me.lemire.integercompression.IntegratedFastPFOR; +import me.lemire.integercompression.IntegratedIntegerCODEC; +import me.lemire.integercompression.IntegratedVariableByte; +import me.lemire.integercompression.JustCopy; +import me.lemire.integercompression.NewPFD; +import me.lemire.integercompression.NewPFDS16; +import me.lemire.integercompression.NewPFDS9; +import me.lemire.integercompression.OptPFD; +import me.lemire.integercompression.OptPFDS16; +import me.lemire.integercompression.OptPFDS9; +import me.lemire.integercompression.Simple9; +import me.lemire.integercompression.VariableByte; +import me.lemire.integercompression.XorBinaryPacking; +import me.lemire.integercompression.synth.ClusteredDataGenerator; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.PrintWriter; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.Arrays; + +/** + * + * Simple class meant to compare the speed of different schemes. + * + * @author Daniel Lemire + * + */ +public class Benchmark { + + /** + * Standard benchmark + * + * @param csvLog + * Writer for CSV log. + * @param c + * the codec + * @param data + * arrays of input data + * @param repeat + * How many times to repeat the test + * @param verbose + * whether to output result on screen + */ + private static void testCodec(PrintWriter csvLog, int sparsity, + IntegerCODEC c, int[][] data, int repeat, boolean verbose) { + if (verbose) { + System.out.println("# " + c.toString()); + System.out + .println("# bits per int, compress speed (mis), decompression speed (mis) "); + } + + int N = data.length; + + int totalSize = 0; + int maxLength = 0; + for (int k = 0; k < N; ++k) { + totalSize += data[k].length; + if (data[k].length > maxLength) { + maxLength = data[k].length; + } + } + + // 4x + 1024 to account for the possibility of some negative + // compression. + int[] compressBuffer = new int[4 * maxLength + 1024]; + int[] decompressBuffer = new int[maxLength + 1024]; + + // These variables hold time in microseconds (10^-6). + long compressTime = 0; + long decompressTime = 0; + + int size = 0; + IntWrapper inpos = new IntWrapper(); + IntWrapper outpos = new IntWrapper(); + + for (int r = 0; r < repeat; ++r) { + size = 0; + for (int k = 0; k < N; ++k) { + int[] backupdata = Arrays.copyOf(data[k], + data[k].length); + + // compress data. + long beforeCompress = System.nanoTime() / 1000; + inpos.set(1); + outpos.set(0); + if (!(c instanceof IntegratedIntegerCODEC)) { + Delta.delta(backupdata); + } + c.compress(backupdata, inpos, backupdata.length + - inpos.get(), compressBuffer, outpos); + long afterCompress = System.nanoTime() / 1000; + + // measure time of compression. + compressTime += afterCompress - beforeCompress; + final int thiscompsize = outpos.get() + 1; + size += thiscompsize; + + // extract (uncompress) data + long beforeDecompress = System.nanoTime() / 1000; + inpos.set(0); + outpos.set(1); + decompressBuffer[0] = backupdata[0]; + c.uncompress(compressBuffer, inpos, + thiscompsize - 1, decompressBuffer, + outpos); + if (!(c instanceof IntegratedIntegerCODEC)) + Delta.fastinverseDelta(decompressBuffer); + long afterDecompress = System.nanoTime() / 1000; + + // measure time of extraction (uncompression). + decompressTime += afterDecompress + - beforeDecompress; + if (outpos.get() != data[k].length) + throw new RuntimeException( + "we have a bug (diff length) " + + c + " expected " + + data[k].length + + " got " + + outpos.get()); + + // verify: compare original array with + // compressed and + // uncompressed. + for (int m = 0; m < outpos.get(); ++m) { + if (decompressBuffer[m] != data[k][m]) { + throw new RuntimeException( + "we have a bug (actual difference), expected " + + data[k][m] + + " found " + + decompressBuffer[m] + + " at " + m); + } + } + } + } + + if (verbose) { + double bitsPerInt = size * 32.0 / totalSize; + long compressSpeed = totalSize * repeat + / (compressTime); + long decompressSpeed = totalSize * repeat + / (decompressTime); + System.out.println(String.format( + "\t%1$.2f\t%2$d\t%3$d", bitsPerInt, + compressSpeed, decompressSpeed)); + csvLog.format("\"%1$s\",%2$d,%3$.2f,%4$d,%5$d\n", + c.toString(), sparsity, bitsPerInt, + compressSpeed, decompressSpeed); + csvLog.flush(); + } + } + + /** + * Standard benchmark byte byte-aligned schemes + * + * @param csvLog + * Writer for CSV log. + * @param c + * the codec + * @param data + * arrays of input data + * @param repeat + * How many times to repeat the test + * @param verbose + * whether to output result on screen + */ + private static void testByteCodec(PrintWriter csvLog, int sparsity, + ByteIntegerCODEC c, int[][] data, int repeat, boolean verbose) { + if (verbose) { + System.out.println("# " + c.toString()); + System.out + .println("# bits per int, compress speed (mis), decompression speed (mis) "); + } + + int N = data.length; + + int totalSize = 0; + int maxLength = 0; + for (int k = 0; k < N; ++k) { + totalSize += data[k].length; + if (data[k].length > maxLength) { + maxLength = data[k].length; + } + } + + byte[] compressBuffer = new byte[8 * maxLength + 1024]; + int[] decompressBuffer = new int[maxLength + 1024]; + + // These variables hold time in microseconds (10^-6). + long compressTime = 0; + long decompressTime = 0; + + int size = 0; + IntWrapper inpos = new IntWrapper(); + IntWrapper outpos = new IntWrapper(); + + for (int r = 0; r < repeat; ++r) { + size = 0; + for (int k = 0; k < N; ++k) { + int[] backupdata = Arrays.copyOf(data[k], + data[k].length); + + // compress data. + long beforeCompress = System.nanoTime() / 1000; + inpos.set(1); + outpos.set(0); + if (!(c instanceof IntegratedByteIntegerCODEC)) { + Delta.delta(backupdata); + } + c.compress(backupdata, inpos, backupdata.length + - inpos.get(), compressBuffer, outpos); + long afterCompress = System.nanoTime() / 1000; + + // measure time of compression. + compressTime += afterCompress - beforeCompress; + final int thiscompsize = outpos.get() + 1; + size += thiscompsize; + + // extract (uncompress) data + long beforeDecompress = System.nanoTime() / 1000; + inpos.set(0); + outpos.set(1); + decompressBuffer[0] = backupdata[0]; + c.uncompress(compressBuffer, inpos, + thiscompsize - 1, decompressBuffer, + outpos); + if (!(c instanceof IntegratedByteIntegerCODEC)) + Delta.fastinverseDelta(decompressBuffer); + long afterDecompress = System.nanoTime() / 1000; + + // measure time of extraction (uncompression). + decompressTime += afterDecompress + - beforeDecompress; + if (outpos.get() != data[k].length) + throw new RuntimeException( + "we have a bug (diff length) " + + c + " expected " + + data[k].length + + " got " + + outpos.get()); + + // verify: compare original array with + // compressed and + // uncompressed. + for (int m = 0; m < outpos.get(); ++m) { + if (decompressBuffer[m] != data[k][m]) { + throw new RuntimeException( + "we have a bug (actual difference), expected " + + data[k][m] + + " found " + + decompressBuffer[m] + + " at " + m); + } + } + } + } + + if (verbose) { + double bitsPerInt = size * 8.0 / totalSize; + long compressSpeed = totalSize * repeat + / (compressTime); + long decompressSpeed = totalSize * repeat + / (decompressTime); + System.out.println(String.format( + "\t%1$.2f\t%2$d\t%3$d", bitsPerInt, + compressSpeed, decompressSpeed)); + csvLog.format("\"%1$s\",%2$d,%3$.2f,%4$d,%5$d\n", + c.toString(), sparsity, bitsPerInt, + compressSpeed, decompressSpeed); + csvLog.flush(); + } + } + + /** + * Main method. + * + * @param args + * command-line arguments + * @throws FileNotFoundException + */ + public static void main(String args[]) throws FileNotFoundException { + System.out + .println("# benchmark based on the ClusterData model from:"); + System.out.println("# Vo Ngoc Anh and Alistair Moffat. "); + System.out.println("# Index compression using 64-bit words."); + System.out + .println("# Softw. Pract. Exper.40, 2 (February 2010), 131-147. "); + System.out.println(); + + PrintWriter writer = null; + try { + File csvFile = new File( + String.format( + "benchmark-%1$tY%1$tm%1$tdT%1$tH%1$tM%1$tS.csv", + System.currentTimeMillis())); + writer = new PrintWriter(csvFile); + System.out + .println("# Results will be written into a CSV file: " + + csvFile.getName()); + System.out.println(); + test(writer, 20, 18, 10); + System.out.println(); + System.out + .println("Results were written into a CSV file: " + + csvFile.getName()); + } finally { + if (writer != null) { + writer.close(); + } + } + } + + /** + * Standard test for the Kamikaze library + * + * @param data + * input data + * @param repeat + * how many times to repeat + * @param verbose + * whether to output data on screen + */ + public static void testKamikaze(int[][] data, int repeat, + boolean verbose) { + DecimalFormat df = new DecimalFormat("0.00"); + DecimalFormat dfspeed = new DecimalFormat("0"); + if (verbose) + System.out.println("# kamikaze PForDelta"); + if (verbose) + System.out + .println("# bits per int, compress speed (mis), decompression speed (mis) "); + long bef, aft; + String line = ""; + int N = data.length; + int totalsize = 0; + int maxlength = 0; + for (int k = 0; k < N; ++k) { + totalsize += data[k].length; + if (data[k].length > maxlength) + maxlength = data[k].length; + } + int[] buffer = new int[maxlength + 1024]; + /* + * 4x + 1024 to account for the possibility of some negative + * compression + */ + int size = 0; + int comptime = 0; + long decomptime = 0; + for (int r = 0; r < repeat; ++r) { + size = 0; + for (int k = 0; k < N; ++k) { + int outpos = 0; + int[] backupdata = Arrays.copyOf(data[k], + data[k].length); + // + bef = System.nanoTime() / 1000; + Delta.delta(backupdata); + ArrayList dataout = new ArrayList( + data[k].length / 128); + for (int K = 0; K < data[k].length; K += 128) { + final int[] compressedbuf = PForDelta + .compressOneBlockOpt(Arrays + .copyOfRange( + backupdata, K, + K + 128), 128); + dataout.add(compressedbuf); + outpos += compressedbuf.length; + } + aft = System.nanoTime() / 1000; + // + comptime += aft - bef; + final int thiscompsize = outpos; + size += thiscompsize; + // + bef = System.nanoTime() / 1000; + // buffer[0] = backupdata[0]; + ArrayList datauncomp = new ArrayList( + dataout.size()); + int deltaoffset = 0; + + for (int[] compbuf : dataout) { + int[] tmpbuf = new int[128]; + PForDelta.decompressOneBlock(tmpbuf, + compbuf, 128); + tmpbuf[0] += deltaoffset; + Delta.fastinverseDelta(tmpbuf); + deltaoffset = tmpbuf[127]; + datauncomp.add(tmpbuf); + } + aft = System.nanoTime() / 1000; + // + decomptime += aft - bef; + if (datauncomp.size() * 128 != data[k].length) + throw new RuntimeException( + "we have a bug (diff length) " + + " expected " + + data[k].length + + " got " + + datauncomp.size() + * 128); + for (int m = 0; m < data[k].length; ++m) + if (datauncomp.get(m / 128)[m % 128] != data[k][m]) { + throw new RuntimeException( + "we have a bug (actual difference), expected " + + data[k][m] + + " found " + + buffer[m] + + " at " + m); + } + + } + } + + line += "\t" + df.format(size * 32.0 / totalsize); + line += "\t" + dfspeed.format(totalsize * repeat / (comptime)); + line += "\t" + + dfspeed.format(totalsize * repeat / (decomptime)); + if (verbose) + System.out.println(line); + } + + /** + * Generate test data. + * + * @param N + * How many input arrays to generate + * @param nbr + * How big (in log2) should the arrays be + * @param sparsity + * How sparse test data generated + */ + private static int[][] generateTestData(ClusteredDataGenerator dataGen, + int N, int nbr, int sparsity) { + final int[][] data = new int[N][]; + final int dataSize = (1 << (nbr + sparsity)); + for (int i = 0; i < N; ++i) { + data[i] = dataGen.generateClustered((1 << nbr), + dataSize); + } + return data; + } + + /** + * Generates data and calls other tests. + * + * @param csvLog + * Writer for CSV log. + * @param N + * How many input arrays to generate + * @param nbr + * how big (in log2) should the arrays be + * @param repeat + * How many times should we repeat tests. + */ + private static void test(PrintWriter csvLog, int N, int nbr, int repeat) { + csvLog.format("\"Algorithm\",\"Sparsity\",\"Bits per int\",\"Compress speed (MiS)\",\"Decompress speed (MiS)\"\n"); + ClusteredDataGenerator cdg = new ClusteredDataGenerator(); + final int max_sparsity = 31 - nbr; + for (int sparsity = 1; sparsity < max_sparsity; ++sparsity) { + System.out.println("# sparsity " + sparsity); + System.out.println("# generating random data..."); + int[][] data = generateTestData(cdg, N, nbr, sparsity); + System.out.println("# generating random data... ok."); + + // TODO: support CSV log output. + testKamikaze(data, repeat, false); + testKamikaze(data, repeat, false); + testKamikaze(data, repeat, true); + System.out.println(); + + testCodec(csvLog, sparsity, new IntegratedComposition( + new IntegratedBinaryPacking(), + new IntegratedVariableByte()), data, repeat, + false); + testCodec(csvLog, sparsity, new IntegratedComposition( + new IntegratedBinaryPacking(), + new IntegratedVariableByte()), data, repeat, + false); + testCodec(csvLog, sparsity, new IntegratedComposition( + new IntegratedBinaryPacking(), + new IntegratedVariableByte()), data, repeat, + true); + System.out.println(); + + testCodec(csvLog, sparsity, new JustCopy(), data, + repeat, false); + testCodec(csvLog, sparsity, new JustCopy(), data, + repeat, false); + testCodec(csvLog, sparsity, new JustCopy(), data, + repeat, true); + System.out.println(); + + testByteCodec(csvLog, sparsity, new VariableByte(), + data, repeat, false); + testByteCodec(csvLog, sparsity, new VariableByte(), + data, repeat, false); + testByteCodec(csvLog, sparsity, new VariableByte(), + data, repeat, true); + System.out.println(); + + testByteCodec(csvLog, sparsity, + new IntegratedVariableByte(), data, repeat, + false); + testByteCodec(csvLog, sparsity, + new IntegratedVariableByte(), data, repeat, + false); + testByteCodec(csvLog, sparsity, + new IntegratedVariableByte(), data, repeat, + true); + System.out.println(); + + testCodec(csvLog, sparsity, new Composition( + new BinaryPacking(), new VariableByte()), data, + repeat, false); + testCodec(csvLog, sparsity, new Composition( + new BinaryPacking(), new VariableByte()), data, + repeat, false); + testCodec(csvLog, sparsity, new Composition( + new BinaryPacking(), new VariableByte()), data, + repeat, true); + System.out.println(); + + testCodec(csvLog, sparsity, new Composition( + new NewPFD(), new VariableByte()), data, + repeat, false); + testCodec(csvLog, sparsity, new Composition( + new NewPFD(), new VariableByte()), data, + repeat, false); + testCodec(csvLog, sparsity, new Composition( + new NewPFD(), new VariableByte()), data, + repeat, true); + System.out.println(); + + testCodec(csvLog, sparsity, new Composition( + new NewPFDS9(), new VariableByte()), data, + repeat, false); + testCodec(csvLog, sparsity, new Composition( + new NewPFDS9(), new VariableByte()), data, + repeat, false); + testCodec(csvLog, sparsity, new Composition( + new NewPFDS9(), new VariableByte()), data, + repeat, true); + System.out.println(); + + testCodec(csvLog, sparsity, new Composition( + new NewPFDS16(), new VariableByte()), data, + repeat, false); + testCodec(csvLog, sparsity, new Composition( + new NewPFDS16(), new VariableByte()), data, + repeat, false); + testCodec(csvLog, sparsity, new Composition( + new NewPFDS16(), new VariableByte()), data, + repeat, true); + System.out.println(); + + testCodec(csvLog, sparsity, new Composition( + new OptPFD(), new VariableByte()), data, + repeat, false); + testCodec(csvLog, sparsity, new Composition( + new OptPFD(), new VariableByte()), data, + repeat, false); + testCodec(csvLog, sparsity, new Composition( + new OptPFD(), new VariableByte()), data, + repeat, true); + System.out.println(); + + testCodec(csvLog, sparsity, new Composition( + new OptPFDS9(), new VariableByte()), data, + repeat, false); + testCodec(csvLog, sparsity, new Composition( + new OptPFDS9(), new VariableByte()), data, + repeat, false); + testCodec(csvLog, sparsity, new Composition( + new OptPFDS9(), new VariableByte()), data, + repeat, true); + System.out.println(); + + testCodec(csvLog, sparsity, new Composition( + new OptPFDS16(), new VariableByte()), data, + repeat, false); + testCodec(csvLog, sparsity, new Composition( + new OptPFDS16(), new VariableByte()), data, + repeat, false); + testCodec(csvLog, sparsity, new Composition( + new OptPFDS16(), new VariableByte()), data, + repeat, true); + System.out.println(); + + { + IntegerCODEC c = new IntegratedComposition( + new IntegratedFastPFOR(), + new IntegratedVariableByte()); + testCodec(csvLog, sparsity, c, data, repeat, + false); + testCodec(csvLog, sparsity, c, data, repeat, + false); + testCodec(csvLog, sparsity, c, data, repeat, + true); + System.out.println(); + } + + testCodec(csvLog, sparsity, new Composition( + new FastPFOR(), new VariableByte()), data, + repeat, false); + testCodec(csvLog, sparsity, new Composition( + new FastPFOR(), new VariableByte()), data, + repeat, false); + testCodec(csvLog, sparsity, new Composition( + new FastPFOR(), new VariableByte()), data, + repeat, true); + System.out.println(); + + testCodec(csvLog, sparsity, new Simple9(), data, + repeat, false); + testCodec(csvLog, sparsity, new Simple9(), data, + repeat, false); + testCodec(csvLog, sparsity, new Simple9(), data, + repeat, true); + System.out.println(); + + { + IntegerCODEC c = new Composition( + new XorBinaryPacking(), + new VariableByte()); + testCodec(csvLog, sparsity, c, data, repeat, + false); + testCodec(csvLog, sparsity, c, data, repeat, + false); + testCodec(csvLog, sparsity, c, data, repeat, + true); + System.out.println(); + } + + { + IntegerCODEC c = new Composition( + new DeltaZigzagBinaryPacking(), + new DeltaZigzagVariableByte()); + testCodec(csvLog, sparsity, c, data, repeat, + false); + testCodec(csvLog, sparsity, c, data, repeat, + false); + testCodec(csvLog, sparsity, c, data, repeat, + true); + System.out.println(); + } + + } + } +} diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkBitPacking.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkBitPacking.java new file mode 100644 index 0000000..2a05dcb --- /dev/null +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkBitPacking.java @@ -0,0 +1,154 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ +package me.lemire.integercompression.benchmarktools; + +import java.text.DecimalFormat; +import java.util.Arrays; +import java.util.Random; + +import me.lemire.integercompression.BitPacking; +import me.lemire.integercompression.Delta; +import me.lemire.integercompression.IntegratedBitPacking; + +/** + * Class used to benchmark the speed of bit packing. (For expert use.) + * + * @author Daniel Lemire + * + */ +public class BenchmarkBitPacking { + + private static void test(boolean verbose) { + DecimalFormat dfspeed = new DecimalFormat("0"); + final int N = 32; + final int times = 100000; + Random r = new Random(0); + int[] data = new int[N]; + int[] compressed = new int[N]; + int[] uncompressed = new int[N]; + for (int bit = 0; bit < 31; ++bit) { + long comp = 0; + long compwm = 0; + long decomp = 0; + for (int t = 0; t < times; ++t) { + for (int k = 0; k < N; ++k) { + data[k] = r.nextInt(1 << bit); + } + long time1 = System.nanoTime(); + BitPacking + .fastpack(data, 0, compressed, 0, bit); + long time2 = System.nanoTime(); + BitPacking.fastpackwithoutmask(data, 0, + compressed, 0, bit); + long time3 = System.nanoTime(); + BitPacking.fastunpack(compressed, 0, + uncompressed, 0, bit); + long time4 = System.nanoTime(); + comp += time2 - time1; + compwm += time3 - time2; + decomp += time4 - time3; + } + if (verbose) + System.out.println("bit = " + + bit + + " comp. speed = " + + dfspeed.format(N * times * 1000.0 + / (comp)) + + " comp. speed wm = " + + dfspeed.format(N * times * 1000.0 + / (compwm)) + + " decomp. speed = " + + dfspeed.format(N * times * 1000.0 + / (decomp))); + } + } + + private static void testWithDeltas(boolean verbose) { + DecimalFormat dfspeed = new DecimalFormat("0"); + final int N = 32; + final int times = 100000; + Random r = new Random(0); + int[] data = new int[N]; + int[] compressed = new int[N]; + int[] icompressed = new int[N]; + int[] uncompressed = new int[N]; + for (int bit = 1; bit < 31; ++bit) { + long comp = 0; + long decomp = 0; + long icomp = 0; + long idecomp = 0; + for (int t = 0; t < times; ++t) { + data[0] = r.nextInt(1 << bit); + for (int k = 1; k < N; ++k) { + data[k] = r.nextInt(1 << bit) + + data[k - 1]; + } + int[] tmpdata = Arrays + .copyOf(data, data.length); + long time1 = System.nanoTime(); + Delta.delta(tmpdata); + BitPacking.fastpackwithoutmask(tmpdata, 0, + compressed, 0, bit); + long time2 = System.nanoTime(); + BitPacking.fastunpack(compressed, 0, + uncompressed, 0, bit); + Delta.fastinverseDelta(uncompressed); + long time3 = System.nanoTime(); + if (!Arrays.equals(data, uncompressed)) + throw new RuntimeException("bug"); + comp += time2 - time1; + decomp += time3 - time2; + tmpdata = Arrays.copyOf(data, data.length); + time1 = System.nanoTime(); + IntegratedBitPacking.integratedpack(0, tmpdata, + 0, icompressed, 0, bit); + time2 = System.nanoTime(); + IntegratedBitPacking.integratedunpack(0, + icompressed, 0, uncompressed, 0, bit); + time3 = System.nanoTime(); + if (!Arrays.equals(icompressed, compressed)) + throw new RuntimeException("ibug " + + bit); + if (!Arrays.equals(data, uncompressed)) + throw new RuntimeException("bug " + bit); + icomp += time2 - time1; + idecomp += time3 - time2; + } + if (verbose) + System.out.println("bit = " + + bit + + " comp. speed = " + + dfspeed.format(N * times * 1000.0 + / (comp)) + + " decomp. speed = " + + dfspeed.format(N * times * 1000.0 + / (decomp)) + + " icomp. speed = " + + dfspeed.format(N * times * 1000.0 + / (icomp)) + + " idecomp. speed = " + + dfspeed.format(N * times * 1000.0 + / (idecomp))); + } + } + + /** + * Main method + * + * @param args + * command-line arguments + */ + public static void main(String[] args) { + System.out.println("Testing packing and delta "); + testWithDeltas(false); + testWithDeltas(true); + System.out.println("Testing packing alone "); + test(false); + test(true); + } + +} diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkOffsettedSeries.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkOffsettedSeries.java new file mode 100644 index 0000000..9975ebc --- /dev/null +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkOffsettedSeries.java @@ -0,0 +1,294 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + */ +package me.lemire.integercompression.benchmarktools; + +import java.io.File; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.Random; + +import me.lemire.integercompression.BinaryPacking; +import me.lemire.integercompression.DeltaZigzagBinaryPacking; +import me.lemire.integercompression.DeltaZigzagVariableByte; +import me.lemire.integercompression.FastPFOR; +import me.lemire.integercompression.IntWrapper; +import me.lemire.integercompression.IntegerCODEC; +import me.lemire.integercompression.IntegratedBinaryPacking; +import me.lemire.integercompression.JustCopy; +import me.lemire.integercompression.XorBinaryPacking; + +/** + * Simple synthetic benchmark + * + */ +public class BenchmarkOffsettedSeries { + private static final int DEFAULT_MEAN = 1 << 20; + private static final int DEFAULT_RANGE = 1 << 10; + private static final int DEFAULT_REPEAT = 5; + private static final int DEFAULT_WARMUP = 2; + + + /** + * Run benchmark. + * + * @param csvWriter + * Write for results in CSV. + * @param count + * Count of data chunks. + * @param length + * Length of a data chunk. + */ + public static void run(final PrintWriter csvWriter, final int count, final int length) { + IntegerCODEC[] codecs = { new JustCopy(), new BinaryPacking(), + new DeltaZigzagBinaryPacking(), + new DeltaZigzagVariableByte(), + new IntegratedBinaryPacking(), new XorBinaryPacking(), + new FastPFOR(), }; + + csvWriter + .format("\"Dataset\",\"CODEC\",\"Bits per int\"," + + "\"Compress speed (MiS)\",\"Decompress speed (MiS)\"\n"); + + benchmark(csvWriter, codecs, count, length, DEFAULT_MEAN, + DEFAULT_RANGE); + benchmark(csvWriter, codecs, count, length, DEFAULT_MEAN >> 5, + DEFAULT_RANGE); + + IntegerCODEC[] codecs2 = { new JustCopy(), new BinaryPacking(), + new DeltaZigzagBinaryPacking(), + new DeltaZigzagVariableByte(), + new IntegratedBinaryPacking(), new XorBinaryPacking(), + new FastPFOR(), }; + + int freq = length / 4; + benchmarkSine(csvWriter, codecs2, count, length, + DEFAULT_MEAN >> 0, DEFAULT_RANGE >> 0, freq); + benchmarkSine(csvWriter, codecs2, count, length, + DEFAULT_MEAN >> 5, DEFAULT_RANGE >> 0, freq); + benchmarkSine(csvWriter, codecs2, count, length, + DEFAULT_MEAN >> 10, DEFAULT_RANGE >> 0, freq); + benchmarkSine(csvWriter, codecs2, count, length, + DEFAULT_MEAN >> 0, DEFAULT_RANGE >> 2, freq); + benchmarkSine(csvWriter, codecs2, count, length, + DEFAULT_MEAN >> 5, DEFAULT_RANGE >> 2, freq); + benchmarkSine(csvWriter, codecs2, count, length, + DEFAULT_MEAN >> 10, DEFAULT_RANGE >> 2, freq); + benchmarkSine(csvWriter, codecs2, count, length, + DEFAULT_MEAN >> 0, DEFAULT_RANGE >> 4, freq); + benchmarkSine(csvWriter, codecs2, count, length, + DEFAULT_MEAN >> 5, DEFAULT_RANGE >> 4, freq); + benchmarkSine(csvWriter, codecs2, count, length, + DEFAULT_MEAN >> 10, DEFAULT_RANGE >> 4, freq); + } + + private static void benchmarkSine(final PrintWriter csvWriter, + final IntegerCODEC[] codecs, final int count, final int length, final int mean, + final int range, final int freq) { + String dataProp = String.format( + "(mean=%1$d range=%2$d freq=%2$d)", mean, range, freq); + int[][] data = generateSineDataChunks(0, count, length, mean, + range, freq); + benchmark(csvWriter, "Sine " + dataProp, codecs, data, + DEFAULT_REPEAT, DEFAULT_WARMUP); + benchmark(csvWriter, "Sine+delta " + dataProp, codecs, data, + DEFAULT_REPEAT, DEFAULT_WARMUP); + } + + private static void benchmark(final PrintWriter csvWriter, final IntegerCODEC[] codecs, + final int count, final int length, final int mean, final int range) { + String dataProp = String.format("(mean=%1$d range=%2$d)", mean, + range); + + int[][] randData = generateDataChunks(0, count, length, mean, + range); + int[][] deltaData = deltaDataChunks(randData); + int[][] sortedData = sortDataChunks(randData); + int[][] sortedDeltaData = deltaDataChunks(sortedData); + + benchmark(csvWriter, "Random " + dataProp, codecs, randData, + DEFAULT_REPEAT, DEFAULT_WARMUP); + benchmark(csvWriter, "Random+delta " + dataProp, codecs, + deltaData, DEFAULT_REPEAT, DEFAULT_WARMUP); + benchmark(csvWriter, "Sorted " + dataProp, codecs, sortedData, + DEFAULT_REPEAT, DEFAULT_WARMUP); + benchmark(csvWriter, "Sorted+delta " + dataProp, codecs, + sortedDeltaData, DEFAULT_REPEAT, DEFAULT_WARMUP); + } + + private static void benchmark(final PrintWriter csvWriter, final String dataName, + final IntegerCODEC[] codecs, final int[][] data, final int repeat, final int warmup) { + System.out.println("Processing: " + dataName); + for (IntegerCODEC codec : codecs) { + String codecName = codec.toString(); + for (int i = 0; i < warmup; ++i) { + benchmark(null, null, null, codec, data, repeat); + } + benchmark(csvWriter, dataName, codecName, codec, data, + repeat); + } + } + + private static void benchmark(PrintWriter csvWriter, String dataName, + String codecName, IntegerCODEC codec, int[][] data, int repeat) { + PerformanceLogger logger = new PerformanceLogger(); + + int maxLen = getMaxLen(data); + int[] compressBuffer = new int[4 * maxLen + 1024]; + int[] decompressBuffer = new int[maxLen]; + + for (int i = 0; i < repeat; ++i) { + for (int[] array : data) { + int compSize = compress(logger, codec, array, + compressBuffer); + int decompSize = decompress(logger, codec, + compressBuffer, compSize, + decompressBuffer); + checkArray(array, decompressBuffer, decompSize, + codec); + } + } + + if (csvWriter != null) { + csvWriter.format( + "\"%1$s\",\"%2$s\",%3$.2f,%4$.0f,%5$.0f\n", + dataName, codecName, logger.getBitPerInt(), + logger.getCompressSpeed(), + logger.getDecompressSpeed()); + } + } + + private static void checkArray(int[] expected, int[] actualArray, + int actualLen, IntegerCODEC codec) { + if (actualLen != expected.length) { + throw new RuntimeException("Length mismatch:" + + " expected=" + expected.length + " actual=" + + actualLen + " codec=" + codec.toString()); + } + for (int i = 0; i < expected.length; ++i) { + if (actualArray[i] != expected[i]) { + throw new RuntimeException("Value mismatch: " + + " where=" + i + " expected=" + + expected[i] + " actual=" + + actualArray[i] + " codec=" + + codec.toString()); + } + } + } + + private static int compress(PerformanceLogger logger, IntegerCODEC codec, + int[] src, int[] dst) { + IntWrapper inpos = new IntWrapper(); + IntWrapper outpos = new IntWrapper(); + logger.compressionTimer.start(); + codec.compress(src, inpos, src.length, dst, outpos); + logger.compressionTimer.end(); + int outSize = outpos.get(); + logger.addOriginalSize(src.length); + logger.addCompressedSize(outSize); + return outSize; + } + + private static int decompress(PerformanceLogger logger, IntegerCODEC codec, + int[] src, int srcLen, int[] dst) { + IntWrapper inpos = new IntWrapper(); + IntWrapper outpos = new IntWrapper(); + logger.decompressionTimer.start(); + codec.uncompress(src, inpos, srcLen, dst, outpos); + logger.decompressionTimer.end(); + return outpos.get(); + } + + private static int getMaxLen(int[][] data) { + int maxLen = 0; + for (int[] array : data) { + if (array.length > maxLen) { + maxLen = array.length; + } + } + return maxLen; + } + + private static int[][] generateSineDataChunks(long seed, int count, + int length, int mean, int range, int freq) { + int[][] chunks = new int[count][]; + Random r = new Random(seed); + for (int i = 0; i < count; ++i) { + int[] chunk = chunks[i] = new int[length]; + int phase = r.nextInt(2 * freq); + for (int j = 0; j < length; ++j) { + double angle = 2.0 * Math.PI * (j + phase) + / freq; + chunk[j] = (int) (mean + Math.sin(angle) + * range); + } + } + return chunks; + } + + private static int[][] generateDataChunks(long seed, int count, + int length, int mean, int range) { + int offset = mean - range / 2; + int[][] chunks = new int[count][]; + Random r = new Random(seed); + for (int i = 0; i < count; ++i) { + int[] chunk = chunks[i] = new int[length]; + for (int j = 0; j < length; ++j) { + chunk[j] = r.nextInt(range) + offset; + } + } + return chunks; + } + + private static int[][] deltaDataChunks(int[][] src) { + int[][] dst = new int[src.length][]; + for (int i = 0; i < src.length; ++i) { + int[] s = src[i]; + int[] d = dst[i] = new int[s.length]; + int prev = 0; + for (int j = 0; j < s.length; ++j) { + d[j] = s[j] - prev; + prev = s[j]; + } + } + return dst; + } + + private static int[][] sortDataChunks(int[][] src) { + int[][] dst = new int[src.length][]; + for (int i = 0; i < src.length; ++i) { + dst[i] = Arrays.copyOf(src[i], src[i].length); + Arrays.sort(dst[i]); + } + return dst; + } + + /** + * @param args + * @throws Exception + */ + public static void main(final String[] args) throws Exception { + File csvFile = new File( + String.format( + "benchmark-offsetted-%1$tY%1$tm%1$tdT%1$tH%1$tM%1$tS.csv", + System.currentTimeMillis())); + PrintWriter writer = null; + try { + writer = new PrintWriter(csvFile); + System.out + .println("# Results will be written into a CSV file: " + + csvFile.getName()); + System.out.println(); + BenchmarkOffsettedSeries.run(writer, 8 * 1024, 1280); + System.out.println(); + System.out + .println("# Results were written into a CSV file: " + + csvFile.getName()); + } finally { + if (writer != null) { + writer.close(); + } + } + } +} diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/PerformanceLogger.java b/src/main/java/me/lemire/integercompression/benchmarktools/PerformanceLogger.java new file mode 100644 index 0000000..ca97144 --- /dev/null +++ b/src/main/java/me/lemire/integercompression/benchmarktools/PerformanceLogger.java @@ -0,0 +1,75 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + */ +package me.lemire.integercompression.benchmarktools; + +/** + * PerformanceLogger for IntegerCODEC. + * + * @author MURAOKA Taro http://github.com/koron + */ +public final class PerformanceLogger { + static class Timer { + private long startNano; + private long duration = 0; + + public Timer() { + } + + public void start() { + this.startNano = System.nanoTime(); + } + + public long end() { + return this.duration += System.nanoTime() + - this.startNano; + } + + public long getDuration() { + return this.duration; + } + } + + final Timer compressionTimer = new Timer(); + + final Timer decompressionTimer = new Timer(); + + private long originalSize = 0; + + private long compressedSize = 0; + + long addOriginalSize(long value) { + return this.originalSize += value; + } + + long addCompressedSize(long value) { + return this.compressedSize += value; + } + + long getOriginalSize() { + return this.originalSize; + } + + long getCompressedSize() { + return this.compressedSize; + } + + double getBitPerInt() { + return this.compressedSize * 32.0 / this.originalSize; + } + + private static double getMiS(long size, long nanoTime) { + return (size * 1e-6) / (nanoTime * 1.0e-9); + } + + double getCompressSpeed() { + return getMiS(this.originalSize, + this.compressionTimer.getDuration()); + } + + double getDecompressSpeed() { + return getMiS(this.originalSize, + this.decompressionTimer.getDuration()); + } +} From 60243a3abad88e281e02ada135eedb4d6c4d191d Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Sat, 25 Jan 2014 20:51:24 -0500 Subject: [PATCH 137/412] Upgrading API documentation --- src/main/java/me/lemire/integercompression/BinaryPacking.java | 2 +- src/main/java/me/lemire/integercompression/FastPFOR.java | 2 +- .../me/lemire/integercompression/IntegratedBinaryPacking.java | 2 +- src/main/java/me/lemire/integercompression/NewPFD.java | 2 +- src/main/java/me/lemire/integercompression/NewPFDS16.java | 2 +- src/main/java/me/lemire/integercompression/NewPFDS9.java | 2 +- src/main/java/me/lemire/integercompression/OptPFD.java | 2 +- src/main/java/me/lemire/integercompression/OptPFDS16.java | 2 +- src/main/java/me/lemire/integercompression/OptPFDS9.java | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/BinaryPacking.java b/src/main/java/me/lemire/integercompression/BinaryPacking.java index c6b491c..75bacc0 100644 --- a/src/main/java/me/lemire/integercompression/BinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/BinaryPacking.java @@ -7,7 +7,7 @@ package me.lemire.integercompression; /** - * Scheme designed by D. Lemire based on a commonly used idea. + * Scheme based on a commonly used idea. * * Note that this does not use differential coding: if you are working on sorted * lists, use IntegratedBinaryPacking instead. diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 4753d19..1094ff3 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -10,7 +10,7 @@ import java.util.Arrays; /** - * This is a PFOR Scheme designed by D. Lemire called FastPFOR. + * This is a patching scheme designed for speed. *

* For details, please see *

diff --git a/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java b/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java index d19bf53..911671c 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java @@ -8,7 +8,7 @@ package me.lemire.integercompression; /** - * Scheme designed by D. Lemire based on a commonly used idea. + * Scheme based on a commonly used idea: can be extremely fast. * * You should only use this scheme on sorted arrays. Use BinaryPacking if you * have unsorted arrays. diff --git a/src/main/java/me/lemire/integercompression/NewPFD.java b/src/main/java/me/lemire/integercompression/NewPFD.java index 0bb5c02..c104459 100644 --- a/src/main/java/me/lemire/integercompression/NewPFD.java +++ b/src/main/java/me/lemire/integercompression/NewPFD.java @@ -8,7 +8,7 @@ package me.lemire.integercompression; /** - * NewPFD/NewPFOR + * NewPFD/NewPFOR: fast patching scheme by Yan et al. *

* Follows: *

diff --git a/src/main/java/me/lemire/integercompression/NewPFDS16.java b/src/main/java/me/lemire/integercompression/NewPFDS16.java index ab6ad71..fee03d9 100644 --- a/src/main/java/me/lemire/integercompression/NewPFDS16.java +++ b/src/main/java/me/lemire/integercompression/NewPFDS16.java @@ -8,7 +8,7 @@ package me.lemire.integercompression; /** - * NewPFD/NewPFOR + * NewPFD/NewPFOR based on Simple16 by Yan et al. *

* Follows: *

diff --git a/src/main/java/me/lemire/integercompression/NewPFDS9.java b/src/main/java/me/lemire/integercompression/NewPFDS9.java index e4a4040..d664d3d 100644 --- a/src/main/java/me/lemire/integercompression/NewPFDS9.java +++ b/src/main/java/me/lemire/integercompression/NewPFDS9.java @@ -8,7 +8,7 @@ package me.lemire.integercompression; /** - * NewPFD/NewPFOR + * NewPFD/NewPFOR based on Simple9 by Yan et al. *

* Follows: *

diff --git a/src/main/java/me/lemire/integercompression/OptPFD.java b/src/main/java/me/lemire/integercompression/OptPFD.java index 4fed157..5c561de 100644 --- a/src/main/java/me/lemire/integercompression/OptPFD.java +++ b/src/main/java/me/lemire/integercompression/OptPFD.java @@ -7,7 +7,7 @@ package me.lemire.integercompression; /** - * OptPFD + * OptPFD: fast patching scheme by Yan et al. *

* Follows: *

diff --git a/src/main/java/me/lemire/integercompression/OptPFDS16.java b/src/main/java/me/lemire/integercompression/OptPFDS16.java index ef57214..5832b89 100644 --- a/src/main/java/me/lemire/integercompression/OptPFDS16.java +++ b/src/main/java/me/lemire/integercompression/OptPFDS16.java @@ -8,7 +8,7 @@ package me.lemire.integercompression; /** - * OptPFD + * OptPFD based on Simple16 by Yan et al. *

* Follows: *

diff --git a/src/main/java/me/lemire/integercompression/OptPFDS9.java b/src/main/java/me/lemire/integercompression/OptPFDS9.java index ba70e53..1659f9a 100644 --- a/src/main/java/me/lemire/integercompression/OptPFDS9.java +++ b/src/main/java/me/lemire/integercompression/OptPFDS9.java @@ -8,7 +8,7 @@ package me.lemire.integercompression; /** - * OptPFD implemented by Daniel Lemire + * OptPFD based on Simple9 by Yan et al. *

* Follows: *

From 0d65ea5b119a27222ef1bc70de8e92536fe044b0 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Sat, 25 Jan 2014 20:59:46 -0500 Subject: [PATCH 138/412] Linking to API documentation --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index f0cc91f..ca929dc 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,11 @@ or: $ ant Benchmark -Dbenchmark.target=BenchmarkBitPacking +API Documentation +----------------- + +http://lemire.me/docs/javafastpfor/ + Want to read more? ------------------ From 81a86c9c57557410e9ff8f0f7c018e802a339ac3 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 27 Jan 2014 09:12:49 -0500 Subject: [PATCH 139/412] Adding ref. --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index ca929dc..2ddd551 100644 --- a/README.md +++ b/README.md @@ -138,6 +138,9 @@ Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second throu http://arxiv.org/abs/1209.2137 +Daniel Lemire, Leonid Boytsov, Nathan Kurz, SIMD Compression and the Intersection of Sorted Integers, arXiv:1401.6399, 2014 +http://arxiv.org/abs/1401.6399 + Ikhtear Sharif wrote his M.Sc. thesis on this library: Ikhtear Sharif, Performance Evaluation of Fast Integer Compression Techniques Over Tables, M.Sc. thesis, UNB 2013. From 60351c57fa93504bbad136e1fbe6b215edf40b88 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 14 Feb 2014 16:26:06 -0500 Subject: [PATCH 140/412] Better docs for Simple9 --- .../integercompression/BinaryPacking.java | 2 +- .../me/lemire/integercompression/Simple9.java | 3 +- .../lemire/integercompression/BasicTest.java | 34 +++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/BinaryPacking.java b/src/main/java/me/lemire/integercompression/BinaryPacking.java index 75bacc0..07eebe7 100644 --- a/src/main/java/me/lemire/integercompression/BinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/BinaryPacking.java @@ -7,7 +7,7 @@ package me.lemire.integercompression; /** - * Scheme based on a commonly used idea. + * Scheme based on a commonly used idea: can be extremely fast. * * Note that this does not use differential coding: if you are working on sorted * lists, use IntegratedBinaryPacking instead. diff --git a/src/main/java/me/lemire/integercompression/Simple9.java b/src/main/java/me/lemire/integercompression/Simple9.java index 1fba23a..073521c 100644 --- a/src/main/java/me/lemire/integercompression/Simple9.java +++ b/src/main/java/me/lemire/integercompression/Simple9.java @@ -9,6 +9,7 @@ /** * This is an implementation of the popular Simple9 scheme. + * It is limited to 28-bit integers (between 0 and 2^28-1). * * Note that this does not use differential coding: if you are working on sorted * lists, you must compute the deltas separately. @@ -190,7 +191,7 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, break; } default: { - throw new RuntimeException("shouldn't happen"); + throw new RuntimeException("shouldn't happen: limited to 28-bit integers"); } } } diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index ef25851..3e2c861 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -62,6 +62,40 @@ public void varyingLengthTest() { } } + @Test + public void varyingLengthTest2() { + int N = 128; + int[] data = new int[N]; + data[127] = -1; + for (IntegerCODEC c : codecs) { + try { + // CODEC Simple9 is limited to "small" integers. + if(c.getClass().equals(Class.forName("me.lemire.integercompression.Simple9"))) + continue; + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + for (int L = 1; L <= 128; L++) { + int[] comp = TestUtils.compress(c, + Arrays.copyOf(data, L)); + int[] answer = TestUtils.uncompress(c, comp, L); + for (int k = 0; k < L; ++k) + if (answer[k] != data[k]) + throw new RuntimeException( + "bug"); + } + for (int L = 128; L <= N; L*=2) { + int[] comp = TestUtils.compress(c, + Arrays.copyOf(data, L)); + int[] answer = TestUtils.uncompress(c, comp, L); + for (int k = 0; k < L; ++k) + if (answer[k] != data[k]) + throw new RuntimeException( + "bug"); + } + + } + } @Test public void checkDeltaZigzagVB() { From 629577a3243c4361f09295e5e3389a86eb242586 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 14 Feb 2014 22:07:42 -0500 Subject: [PATCH 141/412] Preparing new release --- CHANGELOG | 4 + .../integercompression/BinaryPacking.java | 21 ++++ .../DeltaZigzagBinaryPacking.java | 7 ++ .../lemire/integercompression/FastPFOR.java | 9 +- .../IntegratedBinaryPacking.java | 23 +++++ .../IntegratedFastPFOR.java | 16 ++- .../IntegratedVariableByte.java | 1 - .../me/lemire/integercompression/NewPFD.java | 7 ++ .../lemire/integercompression/NewPFDS16.java | 7 ++ .../lemire/integercompression/NewPFDS9.java | 6 ++ .../me/lemire/integercompression/OptPFD.java | 6 ++ .../lemire/integercompression/OptPFDS16.java | 6 ++ .../lemire/integercompression/OptPFDS9.java | 5 + .../integercompression/XorBinaryPacking.java | 5 +- .../lemire/integercompression/BasicTest.java | 97 +++++++++++++++---- 15 files changed, 193 insertions(+), 27 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index e8b1651..49921bb 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +0.0.11 (Feb. 14th 2014) + - Fix rare bug in FastPFOR (reported by Stefan Ackermann (https://github.com/Stivo)) + - Improved API documentation + 0.0.10 (Jan. 25th 2014) - cleaning the code and improving the documentation diff --git a/src/main/java/me/lemire/integercompression/BinaryPacking.java b/src/main/java/me/lemire/integercompression/BinaryPacking.java index 07eebe7..133ab9b 100644 --- a/src/main/java/me/lemire/integercompression/BinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/BinaryPacking.java @@ -8,9 +8,30 @@ /** * Scheme based on a commonly used idea: can be extremely fast. + * It encodes integers in blocks of 128 integers. For arrays containing + * an arbitrary number of integers, you should use it in conjunction + * with another CODEC: + * + *

IntegerCODEC ic = 
+ *  new Composition(new BinaryPacking(), new VariableByte()).
* * Note that this does not use differential coding: if you are working on sorted * lists, use IntegratedBinaryPacking instead. + * + *

+ * For details, please see + *

+ *

+ * Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second + * through vectorization Software: Practice & Experience + * http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract + * http://arxiv.org/abs/1209.2137 + *

+ *

+ * Daniel Lemire, Leonid Boytsov, Nathan Kurz, + * SIMD Compression and the Intersection of Sorted Integers + * http://arxiv.org/abs/1401.6399 + *

* * @author Daniel Lemire */ diff --git a/src/main/java/me/lemire/integercompression/DeltaZigzagBinaryPacking.java b/src/main/java/me/lemire/integercompression/DeltaZigzagBinaryPacking.java index 59c6881..a774836 100644 --- a/src/main/java/me/lemire/integercompression/DeltaZigzagBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/DeltaZigzagBinaryPacking.java @@ -8,6 +8,13 @@ /** * BinaryPacking with Delta+Zigzag Encoding. * + * It encodes integers in blocks of 128 integers. For arrays containing + * an arbitrary number of integers, you should use it in conjunction + * with another CODEC: + * + *
IntegerCODEC ic = new Composition(new DeltaZigzagBinaryPacking(),
+ *                      new DeltaZigzagVariableByte()).
+ * * @author MURAOKA Taro http://github.com/koron */ public final class DeltaZigzagBinaryPacking implements IntegerCODEC { diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 1094ff3..f2aa102 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -11,6 +11,11 @@ /** * This is a patching scheme designed for speed. + * It encodes integers in blocks of 128 integers. For arrays containing + * an arbitrary number of integers, you should use it in conjunction + * with another CODEC: + * + * IntegerCODEC ic = new Composition(new FastPFOR(), new VariableByte()). *

* For details, please see *

@@ -189,7 +194,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, bitmap |= (1 << (k - 1)); } out[tmpoutpos++] = bitmap; - for (int k = 1; k <= 31; ++k) { + for (int k = 1; k <= 32; ++k) { if (dataPointers[k] != 0) { out[tmpoutpos++] = dataPointers[k];// size for (int j = 0; j < dataPointers[k]; j += 32) { @@ -242,7 +247,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, inexcept += bytesize / 4; final int bitmap = in[inexcept++]; - for (int k = 1; k <= 31; ++k) { + for (int k = 1; k <= 32; ++k) { if ((bitmap & (1 << (k - 1))) != 0) { int size = in[inexcept++]; if (dataTobePacked[k].length < size) diff --git a/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java b/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java index 911671c..37c3732 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java @@ -13,6 +13,29 @@ * You should only use this scheme on sorted arrays. Use BinaryPacking if you * have unsorted arrays. * + * It encodes integers in blocks of 128 integers. For arrays containing + * an arbitrary number of integers, you should use it in conjunction + * with another CODEC: + * + *

IntegratedIntegerCODEC is = 
+ * new IntegratedComposition(new IntegratedBinaryPacking(), 
+ * new IntegratedVariableByte())
+ * + *

+ * For details, please see + *

+ *

+ * Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second + * through vectorization Software: Practice & Experience + * http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract + * http://arxiv.org/abs/1209.2137 + *

+ *

+ * Daniel Lemire, Leonid Boytsov, Nathan Kurz, + * SIMD Compression and the Intersection of Sorted Integers + * http://arxiv.org/abs/1401.6399 + *

+ * * @author Daniel Lemire * */ diff --git a/src/main/java/me/lemire/integercompression/IntegratedFastPFOR.java b/src/main/java/me/lemire/integercompression/IntegratedFastPFOR.java index 2f8bf40..159629c 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedFastPFOR.java +++ b/src/main/java/me/lemire/integercompression/IntegratedFastPFOR.java @@ -15,6 +15,13 @@ * differential coding as part of the compression. *

* + * It encodes integers in blocks of 128 integers. For arrays containing + * an arbitrary number of integers, you should use it in conjunction + * with another CODEC: + *
IntegratedIntegerCODEC is =  
+ *  new IntegratedComposition(new IntegratedFastPFOR(),
+ *               new IntegratedVariableByte())
+ * *

* For details, please see *

@@ -25,6 +32,11 @@ * http://arxiv.org/abs/1209.2137 *

*

+ * Daniel Lemire, Leonid Boytsov, Nathan Kurz, + * SIMD Compression and the Intersection of Sorted Integers + * http://arxiv.org/abs/1401.6399 + *

+ *

* For multi-threaded applications, each thread should use its own * IntegratedFastPFOR object. *

@@ -199,7 +211,7 @@ private void encodePage(int[] constin, IntWrapper constinpos, bitmap |= (1 << (k - 1)); } out[tmpoutpos++] = bitmap; - for (int k = 1; k <= 31; ++k) { + for (int k = 1; k <= 32; ++k) { if (dataPointers[k] != 0) { out[tmpoutpos++] = dataPointers[k];// size for (int j = 0; j < dataPointers[k]; j += 32) { @@ -253,7 +265,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, inexcept += bytesize / 4; final int bitmap = in[inexcept++]; - for (int k = 1; k <= 31; ++k) { + for (int k = 1; k <= 32; ++k) { if ((bitmap & (1 << (k - 1))) != 0) { int size = in[inexcept++]; if (dataTobePacked[k].length < size) diff --git a/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java b/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java index 8403776..e085327 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java +++ b/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java @@ -16,7 +16,6 @@ * You should only use this scheme on sorted arrays. Use VariableByte if you * have unsorted arrays. * - * * @author Daniel Lemire */ public class IntegratedVariableByte implements IntegratedIntegerCODEC, diff --git a/src/main/java/me/lemire/integercompression/NewPFD.java b/src/main/java/me/lemire/integercompression/NewPFD.java index c104459..bd575e9 100644 --- a/src/main/java/me/lemire/integercompression/NewPFD.java +++ b/src/main/java/me/lemire/integercompression/NewPFD.java @@ -17,6 +17,13 @@ *

* using Simple16 as the secondary coder. * + * It encodes integers in blocks of 128 integers. For arrays containing + * an arbitrary number of integers, you should use it in conjunction + * with another CODEC: + * + *

IntegerCODEC ic = 
+ *  new Composition(new NewPDF(), new VariableByte()).
+ * * Note that this does not use differential coding: if you are working on sorted * lists, you must compute the deltas separately. (Yes, this is true even though * the "D" at the end of the name probably stands for delta.) diff --git a/src/main/java/me/lemire/integercompression/NewPFDS16.java b/src/main/java/me/lemire/integercompression/NewPFDS16.java index fee03d9..0c045d9 100644 --- a/src/main/java/me/lemire/integercompression/NewPFDS16.java +++ b/src/main/java/me/lemire/integercompression/NewPFDS16.java @@ -17,6 +17,13 @@ *

* using Simple16 as the secondary coder. * + * It encodes integers in blocks of 128 integers. For arrays containing + * an arbitrary number of integers, you should use it in conjunction + * with another CODEC: + * + *

IntegerCODEC ic =
+ *   new Composition(new PDFS16(), new VariableByte()).
+ * * Note that this does not use differential coding: if you are working on sorted * lists, you must compute the deltas separately. * diff --git a/src/main/java/me/lemire/integercompression/NewPFDS9.java b/src/main/java/me/lemire/integercompression/NewPFDS9.java index d664d3d..1078a41 100644 --- a/src/main/java/me/lemire/integercompression/NewPFDS9.java +++ b/src/main/java/me/lemire/integercompression/NewPFDS9.java @@ -17,6 +17,12 @@ *

* using Simple9 as the secondary coder. * + * It encodes integers in blocks of 128 integers. For arrays containing + * an arbitrary number of integers, you should use it in conjunction + * with another CODEC: + * + *

IntegerCODEC ic = new Composition(new PDFS9(), new VariableByte()).
+ * * Note that this does not use differential coding: if you are working on sorted * lists, you must compute the deltas separately. * diff --git a/src/main/java/me/lemire/integercompression/OptPFD.java b/src/main/java/me/lemire/integercompression/OptPFD.java index 5c561de..b01c7d5 100644 --- a/src/main/java/me/lemire/integercompression/OptPFD.java +++ b/src/main/java/me/lemire/integercompression/OptPFD.java @@ -16,6 +16,12 @@ *

* using Simple16 as the secondary coder. * + * It encodes integers in blocks of 128 integers. For arrays containing + * an arbitrary number of integers, you should use it in conjunction + * with another CODEC: + * + *

IntegerCODEC ic = new Composition(new OptPFD(), new VariableByte()).
+ * * Note that this does not use differential coding: if you are working on sorted * lists, you must compute the deltas separately. (Yes, this is true even though * the "D" at the end of the name probably stands for delta.) diff --git a/src/main/java/me/lemire/integercompression/OptPFDS16.java b/src/main/java/me/lemire/integercompression/OptPFDS16.java index 5832b89..4334412 100644 --- a/src/main/java/me/lemire/integercompression/OptPFDS16.java +++ b/src/main/java/me/lemire/integercompression/OptPFDS16.java @@ -17,6 +17,12 @@ *

* using Simple16 as the secondary coder. * + * It encodes integers in blocks of 128 integers. For arrays containing + * an arbitrary number of integers, you should use it in conjunction + * with another CODEC: + * + *

IntegerCODEC ic = new Composition(new OptPFDS16(), new VariableByte()).
+ * * Note that this does not use differential coding: if you are working on sorted * lists, you must compute the deltas separately. * diff --git a/src/main/java/me/lemire/integercompression/OptPFDS9.java b/src/main/java/me/lemire/integercompression/OptPFDS9.java index 1659f9a..100fb43 100644 --- a/src/main/java/me/lemire/integercompression/OptPFDS9.java +++ b/src/main/java/me/lemire/integercompression/OptPFDS9.java @@ -17,6 +17,11 @@ *

* using Simple9 as the secondary coder. * + * It encodes integers in blocks of 128 integers. For arrays containing + * an arbitrary number of integers, you should use it in conjunction + * with another CODEC: + * + *

 IntegerCODEC ic = new Composition(new OptPFDS9(), new VariableByte()).
* * Note that this does not use differential coding: if you are working on sorted * lists, you must compute the deltas separately. diff --git a/src/main/java/me/lemire/integercompression/XorBinaryPacking.java b/src/main/java/me/lemire/integercompression/XorBinaryPacking.java index ea0d9ce..131db4b 100644 --- a/src/main/java/me/lemire/integercompression/XorBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/XorBinaryPacking.java @@ -5,7 +5,10 @@ package me.lemire.integercompression; /** - * XOR + BinaryPacking. + * BinaryPacking over XOR differential. + * + *
IntegratedIntegerCODEC is = 
+ * new Composition(new XorBinaryPacking(), new VariableByte())
* * @author MURAOKA Taro http://github.com/koron */ diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 3e2c861..7835adf 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -100,10 +100,12 @@ public void varyingLengthTest2() { @Test public void checkDeltaZigzagVB() { DeltaZigzagVariableByte codec = new DeltaZigzagVariableByte(); + DeltaZigzagVariableByte codeco = new DeltaZigzagVariableByte(); + testZeroInZeroOut(codec); - test(codec, 5, 10); - test(codec, 5, 14); - test(codec, 2, 18); + test(codec, codeco, 5, 10); + test(codec, codeco, 5, 14); + test(codec, codeco, 2, 18); } @Test @@ -115,11 +117,15 @@ public void checkDeltaZigzagPacking() { IntegerCODEC compo = new Composition( new DeltaZigzagBinaryPacking(), new VariableByte()); + IntegerCODEC compo2 = new Composition( + new DeltaZigzagBinaryPacking(), + new VariableByte()); + testZeroInZeroOut(compo); testUnsorted(compo); - test(compo, 5, 10); - test(compo, 5, 14); - test(compo, 2, 18); + test(compo, compo2, 5, 10); + test(compo, compo2, 5, 14); + test(compo, compo2, 2, 18); } @Test @@ -146,9 +152,11 @@ public void checkXorBinaryPacking2() { public void checkXorBinaryPacking3() { IntegerCODEC c = new IntegratedComposition(new XorBinaryPacking(), new IntegratedVariableByte()); - test(c, 5, 10); - test(c, 5, 14); - test(c, 2, 18); + IntegerCODEC co = new IntegratedComposition(new XorBinaryPacking(), + new IntegratedVariableByte()); + test(c, co, 5, 10); + test(c, co, 5, 14); + test(c, co, 2, 18); } /** @@ -310,7 +318,7 @@ private static void testZeroInZeroOut(IntegerCODEC c) { assertEquals(0, outpos.intValue()); } - private static void test(IntegerCODEC c, int N, int nbr) { + private static void test(IntegerCODEC c,IntegerCODEC co, int N, int nbr) { ClusteredDataGenerator cdg = new ClusteredDataGenerator(); for (int sparsity = 1; sparsity < 31 - nbr; sparsity += 4) { int[][] data = new int[N][]; @@ -318,7 +326,7 @@ private static void test(IntegerCODEC c, int N, int nbr) { for (int k = 0; k < N; ++k) { data[k] = cdg.generateClustered((1 << nbr), max); } - testCodec(c, data, max); + testCodec(c, co, data, max); } } @@ -332,31 +340,40 @@ private static void test(int N, int nbr) { } testCodec(new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()), data, max); - testCodec(new JustCopy(), data, max); - testCodec(new VariableByte(), data, max); - testCodec(new IntegratedVariableByte(), data, max); + new IntegratedVariableByte()),new IntegratedComposition(new IntegratedBinaryPacking(), + new IntegratedVariableByte()), data, max); + testCodec(new JustCopy(),new JustCopy(), data, max); + testCodec(new VariableByte(), new VariableByte(), data, max); + testCodec(new IntegratedVariableByte(),new IntegratedVariableByte(), data, max); testCodec(new Composition(new BinaryPacking(), new VariableByte()), + new Composition(new BinaryPacking(), new VariableByte()), data, max); - testCodec(new Composition(new NewPFD(), new VariableByte()), data, + testCodec(new Composition(new NewPFD(), new VariableByte()), + new Composition(new NewPFD(), new VariableByte()), data, max); testCodec(new Composition(new NewPFDS9(), new VariableByte()), + new Composition(new NewPFDS9(), new VariableByte()), data, max); testCodec(new Composition(new NewPFDS16(), new VariableByte()), + new Composition(new NewPFDS16(), new VariableByte()), data, max); - testCodec(new Composition(new OptPFD(), new VariableByte()), data, + testCodec(new Composition(new OptPFD(), new VariableByte()), + new Composition(new OptPFD(), new VariableByte()),data, max); testCodec(new Composition(new OptPFDS9(), new VariableByte()), + new Composition(new OptPFDS9(), new VariableByte()), data, max); testCodec(new Composition(new OptPFDS16(), new VariableByte()), + new Composition(new OptPFDS16(), new VariableByte()), data, max); testCodec(new Composition(new FastPFOR(), new VariableByte()), + new Composition(new FastPFOR(), new VariableByte()), data, max); - testCodec(new Simple9(), data, max); + testCodec(new Simple9(),new Simple9(), data, max); } } - private static void testCodec(IntegerCODEC c, int[][] data, int max) { + private static void testCodec(IntegerCODEC c,IntegerCODEC co, int[][] data, int max) { int N = data.length; int maxlength = 0; for (int k = 0; k < N; ++k) { @@ -383,7 +400,7 @@ private static void testCodec(IntegerCODEC c, int[][] data, int max) { inpos.set(0); outpos.set(1); buffer[0] = backupdata[0]; - c.uncompress(dataout, inpos, thiscompsize - 1, buffer, outpos); + co.uncompress(dataout, inpos, thiscompsize - 1, buffer, outpos); if (!(c instanceof IntegratedIntegerCODEC)) Delta.fastinverseDelta(buffer); @@ -517,5 +534,43 @@ public void testUnsorted3(IntegerCODEC codec) { compressed.length, recovered, recoffset); assertArrayEquals(data, recovered); } - + + + @Test + public void fastPforTest() { + // proposed by Stefan Ackermann (https://github.com/Stivo) + FastPFOR codec1 = new FastPFOR(); + FastPFOR codec2 = new FastPFOR(); + int N = 128; + int[] data = new int[N]; + for (int i = 0; i < N; i++) + data[i] = 0; + data[126] = -1; + int[] comp = TestUtils.compress(codec1, + Arrays.copyOf(data, N)); + int[] answer = TestUtils.uncompress(codec2, comp, N); + for (int k = 0; k < N; ++k) + if (answer[k] != data[k]) + throw new RuntimeException( + "bug "+k+" "+answer[k]+" != "+data[k]); + } + @Test + public void ifastPforTest() { + // inspired by Stefan Ackermann (https://github.com/Stivo) + IntegratedFastPFOR codec1 = new IntegratedFastPFOR(); + IntegratedFastPFOR codec2 = new IntegratedFastPFOR(); + int N = 128; + int[] data = new int[N]; + for (int i = 0; i < N; i++) + data[i] = 0; + data[126] = -1; + int[] comp = TestUtils.compress(codec1, + Arrays.copyOf(data, N)); + int[] answer = TestUtils.uncompress(codec2, comp, N); + for (int k = 0; k < N; ++k) + if (answer[k] != data[k]) + throw new RuntimeException( + "bug "+k+" "+answer[k]+" != "+data[k]); + } + } From 2dbfc6d8d4c3d9a3027353d6c14e20ef90ae1693 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 14 Feb 2014 22:09:01 -0500 Subject: [PATCH 142/412] Preparing new release --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2ddd551..e0689c8 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ the following code in your pom.xml file: me.lemire.integercompression JavaFastPFOR - 0.0.10 + 0.0.11 @@ -70,7 +70,7 @@ Main contributors with contributions by * Di Wu, http://www.facebook.com/diwu1989 - +* Stefan Ackermann, https://github.com/Stivo How does it compare to the Kamikaze PForDelta library? ------------------------------------------------------ From fe6adf41747d5c7a5730c9cb320cfbf07960d833 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 14 Feb 2014 22:10:21 -0500 Subject: [PATCH 143/412] [maven-release-plugin] prepare release JavaFastPFOR-0.0.11 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a4a592b..4857a7d 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.11-SNAPSHOT + 0.0.11 jar From 520f5e49c06a62e67aae398d15ff04cce4915196 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 14 Feb 2014 22:10:24 -0500 Subject: [PATCH 144/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4857a7d..946c13f 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.11 + 0.0.12-SNAPSHOT jar From 5a7cefb91e2d27e31b7ed6ef4f4bca12d236c6fc Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 19 Feb 2014 20:05:51 -0500 Subject: [PATCH 145/412] Using actual hyperlinks --- .../java/me/lemire/integercompression/BinaryPacking.java | 4 ++-- src/main/java/me/lemire/integercompression/FastPFOR.java | 4 ++-- .../lemire/integercompression/IntegratedBinaryPacking.java | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/BinaryPacking.java b/src/main/java/me/lemire/integercompression/BinaryPacking.java index 133ab9b..f2c66c6 100644 --- a/src/main/java/me/lemire/integercompression/BinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/BinaryPacking.java @@ -24,8 +24,8 @@ *
*

* Daniel Lemire, Leonid Boytsov, Nathan Kurz, diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index f2aa102..a0794df 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -21,8 +21,8 @@ *

* Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second * through vectorization Software: Practice & Experience - * http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract - * http://arxiv.org/abs/1209.2137 + * http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract + * http://arxiv.org/abs/1209.2137 *

* For sufficiently compressible arrays, it is faster and better than other PFOR * schemes. diff --git a/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java b/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java index 37c3732..478f98c 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java @@ -27,13 +27,13 @@ *

* Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second * through vectorization Software: Practice & Experience - * http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract - * http://arxiv.org/abs/1209.2137 + * http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract + * http://arxiv.org/abs/1209.2137 *

*

* Daniel Lemire, Leonid Boytsov, Nathan Kurz, * SIMD Compression and the Intersection of Sorted Integers - * http://arxiv.org/abs/1401.6399 + * http://arxiv.org/abs/1401.6399 *

* * @author Daniel Lemire From d27cc0eb688eb59e2053046579fcbdb1b3487930 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 19 Feb 2014 20:06:27 -0500 Subject: [PATCH 146/412] More hyperlinks --- .../me/lemire/integercompression/IntegratedFastPFOR.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/IntegratedFastPFOR.java b/src/main/java/me/lemire/integercompression/IntegratedFastPFOR.java index 159629c..fe9fcab 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedFastPFOR.java +++ b/src/main/java/me/lemire/integercompression/IntegratedFastPFOR.java @@ -28,13 +28,13 @@ *

* Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second * through vectorization Software: Practice & Experience - * http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract - * http://arxiv.org/abs/1209.2137 + * http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract + * http://arxiv.org/abs/1209.2137 *

*

* Daniel Lemire, Leonid Boytsov, Nathan Kurz, * SIMD Compression and the Intersection of Sorted Integers - * http://arxiv.org/abs/1401.6399 + * http://arxiv.org/abs/1401.6399 *

*

* For multi-threaded applications, each thread should use its own From 98df8654e81b69f7195dbfea390f90d8a4771520 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 4 Mar 2014 10:34:18 -0500 Subject: [PATCH 147/412] Adding funding ack. --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index e0689c8..e0802d6 100644 --- a/README.md +++ b/README.md @@ -147,3 +147,9 @@ Ikhtear Sharif, Performance Evaluation of Fast Integer Compression Techniques Ov http://hdl.handle.net/1882/45703 He also posted his slides online: http://www.slideshare.net/ikhtearSharif/ikhtear-defense + + +Funding +----------- + +This work was supported by NSERC grant number 26143. From af0d1522c84c0515f4526eaca04777c458ac13c8 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Thu, 10 Apr 2014 16:17:32 -0400 Subject: [PATCH 148/412] Reference --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index e0802d6..ff647b0 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,8 @@ when using differential coding in databases and information retrieval (e.g., in inverted indexes or column stores). This libary is used by ClueWeb Tools (https://github.com/lintool/clueweb). +This library inspired a compression scheme used by Apache Lucene (e.g., see +http://lucene.apache.org/core/4_6_1/core/org/apache/lucene/util/PForDeltaDocIdSet.html ). It is a java port of the fastpfor C++ library (https://github.com/lemire/FastPFor). There is also a Go port (https://github.com/reducedb/encoding). The C++ From cc7343023843b55f8873c33a9607b2c6dfd68dfc Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 16 Apr 2014 14:17:40 -0400 Subject: [PATCH 149/412] Adding a reference to recent paper --- .gitignore | 1 + README.md | 7 ++++++- .../integercompression/benchmarktools/Benchmark.java | 1 - .../integercompression/benchmarktools/BenchmarkCSV.java | 3 +++ 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index dd87c31..83f4d77 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ tags target/ tmp/ +/bin diff --git a/README.md b/README.md index ff647b0..306c2cc 100644 --- a/README.md +++ b/README.md @@ -134,12 +134,17 @@ http://lemire.me/docs/javafastpfor/ Want to read more? ------------------ +This library was a key ingredient in the best paper at ECIR 2014 : + +Matteo Catena, Craig Macdonald, Iadh Ounis, On Inverted Index Compression for Search Engine Efficiency, Lecture Notes in Computer Science 8416 (ECIR 2014), 2014. +http://dx.doi.org/10.1007/978-3-319-06028-6_30 + + We wrote a research paper which documents many of the CODECs implemented here: Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second through vectorization, Software Pratice & Experience (to appear) http://arxiv.org/abs/1209.2137 - Daniel Lemire, Leonid Boytsov, Nathan Kurz, SIMD Compression and the Intersection of Sorted Integers, arXiv:1401.6399, 2014 http://arxiv.org/abs/1401.6399 diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java b/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java index 7429892..3e60c9e 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java @@ -398,7 +398,6 @@ public static void testKamikaze(int[][] data, int repeat, size += thiscompsize; // bef = System.nanoTime() / 1000; - // buffer[0] = backupdata[0]; ArrayList datauncomp = new ArrayList( dataout.size()); int deltaoffset = 0; diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java index 6d0efc9..e301d8f 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java @@ -51,6 +51,7 @@ private static ArrayList loadIntegers(final String filename, final Format if (misparsed > 0) System.out.println("Failed to parse " + misparsed + " entries"); + br.close(); return answer; } else if (f == Format.ONEARRAYPERFILE) { ArrayList answer = new ArrayList(); @@ -80,6 +81,7 @@ private static ArrayList loadIntegers(final String filename, final Format if (misparsed > 0) System.out.println("Failed to parse " + misparsed + " entries"); + br.close(); return wrap; } else { ArrayList answer = new ArrayList(); @@ -103,6 +105,7 @@ private static ArrayList loadIntegers(final String filename, final Format if (misparsed > 0) System.out.println("Failed to parse " + misparsed + " entries"); + br.close(); return wrap; } } From a5c358a55fa2ddd13b69a0b25dd750cb3de42ddf Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 18 Apr 2014 15:41:30 -0400 Subject: [PATCH 150/412] Clarifying --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 306c2cc..c02c539 100644 --- a/README.md +++ b/README.md @@ -77,11 +77,16 @@ with contributions by How does it compare to the Kamikaze PForDelta library? ------------------------------------------------------ -In our tests, Kamikaze PForDelta does not fare well. See +In our tests, Kamikaze PForDelta is slower than our implementations. See the benchmarkresults directory for some results. https://github.com/lemire/JavaFastPFOR/blob/master/benchmarkresults/benchmarkresults_icore7_10may2013.txt + +Reference: + http://sna-projects.com/kamikaze/ + + Requirements ------------ From 31ca70660db295f05bf850fa8a63ac6c94390f8d Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 28 May 2014 21:08:05 -0400 Subject: [PATCH 151/412] Updated readme --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c02c539..77ddd36 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,11 @@ your array use less than 32 bits. These sort of arrays often come up when using differential coding in databases and information retrieval (e.g., in inverted indexes or column stores). +It can decompress integers at a rate of over 1.2 billions per second +(4.5 GB/s). It is significantly faster than generic codecs (such +as Snappy, LZ4 and so on) when compressing arrays of integers. + +Part of this library has been integrated in Parquet (http://parquet.io/). This libary is used by ClueWeb Tools (https://github.com/lintool/clueweb). This library inspired a compression scheme used by Apache Lucene (e.g., see http://lucene.apache.org/core/4_6_1/core/org/apache/lucene/util/PForDeltaDocIdSet.html ). @@ -156,7 +161,7 @@ http://arxiv.org/abs/1401.6399 Ikhtear Sharif wrote his M.Sc. thesis on this library: Ikhtear Sharif, Performance Evaluation of Fast Integer Compression Techniques Over Tables, M.Sc. thesis, UNB 2013. -http://hdl.handle.net/1882/45703 +http://lemire.me/fr/documents/thesis/IkhtearThesis.pdf He also posted his slides online: http://www.slideshare.net/ikhtearSharif/ikhtear-defense From d54d2cbfc56c37b7cff0eb867494381b38e8a372 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 9 Jun 2014 09:44:54 -0400 Subject: [PATCH 152/412] Better documentation --- .../lemire/integercompression/BitPacking.java | 5036 ++++++++-------- .../lemire/integercompression/FastPFOR.java | 8 +- .../IntegratedBitPacking.java | 5276 +++++++++-------- .../IntegratedFastPFOR.java | 9 +- 4 files changed, 5174 insertions(+), 5155 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/BitPacking.java b/src/main/java/me/lemire/integercompression/BitPacking.java index 490d971..e36291b 100644 --- a/src/main/java/me/lemire/integercompression/BitPacking.java +++ b/src/main/java/me/lemire/integercompression/BitPacking.java @@ -12,1305 +12,1453 @@ /** * Bitpacking routines * + * For details, please see + *

+ * Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second + * through vectorization Software: Practice & Experience + * http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract + * http://arxiv.org/abs/1209.2137 + *

+ * * @author Daniel Lemire * */ public final class BitPacking { - protected static void fastpackwithoutmask1(final int[] in, int inpos, - final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 1) - | ((in[2 + inpos]) << 2) | ((in[3 + inpos]) << 3) - | ((in[4 + inpos]) << 4) | ((in[5 + inpos]) << 5) - | ((in[6 + inpos]) << 6) | ((in[7 + inpos]) << 7) - | ((in[8 + inpos]) << 8) | ((in[9 + inpos]) << 9) - | ((in[10 + inpos]) << 10) | ((in[11 + inpos]) << 11) - | ((in[12 + inpos]) << 12) | ((in[13 + inpos]) << 13) - | ((in[14 + inpos]) << 14) | ((in[15 + inpos]) << 15) - | ((in[16 + inpos]) << 16) | ((in[17 + inpos]) << 17) - | ((in[18 + inpos]) << 18) | ((in[19 + inpos]) << 19) - | ((in[20 + inpos]) << 20) | ((in[21 + inpos]) << 21) - | ((in[22 + inpos]) << 22) | ((in[23 + inpos]) << 23) - | ((in[24 + inpos]) << 24) | ((in[25 + inpos]) << 25) - | ((in[26 + inpos]) << 26) | ((in[27 + inpos]) << 27) - | ((in[28 + inpos]) << 28) | ((in[29 + inpos]) << 29) - | ((in[30 + inpos]) << 30) | ((in[31 + inpos]) << 31); - } - - protected static void fastpackwithoutmask2(final int[] in, int inpos, - final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 2) - | ((in[2 + inpos]) << 4) | ((in[3 + inpos]) << 6) - | ((in[4 + inpos]) << 8) | ((in[5 + inpos]) << 10) - | ((in[6 + inpos]) << 12) | ((in[7 + inpos]) << 14) - | ((in[8 + inpos]) << 16) | ((in[9 + inpos]) << 18) - | ((in[10 + inpos]) << 20) | ((in[11 + inpos]) << 22) - | ((in[12 + inpos]) << 24) | ((in[13 + inpos]) << 26) - | ((in[14 + inpos]) << 28) | ((in[15 + inpos]) << 30); - out[1 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 2) - | ((in[18 + inpos]) << 4) | ((in[19 + inpos]) << 6) - | ((in[20 + inpos]) << 8) | ((in[21 + inpos]) << 10) - | ((in[22 + inpos]) << 12) | ((in[23 + inpos]) << 14) - | ((in[24 + inpos]) << 16) | ((in[25 + inpos]) << 18) - | ((in[26 + inpos]) << 20) | ((in[27 + inpos]) << 22) - | ((in[28 + inpos]) << 24) | ((in[29 + inpos]) << 26) - | ((in[30 + inpos]) << 28) | ((in[31 + inpos]) << 30); + /** + * Pack 32 integers + * + * @param in + * source array + * @param inpos + * position in source array + * @param out + * output array + * @param outpos + * position in output array + * @param bit + * number of bits to use per integer + */ + public static void fastpack(final int[] in, final int inpos, + final int[] out, final int outpos, final int bit) { + switch (bit) { + case 0: + fastpack0(in, inpos, out, outpos); + break; + case 1: + fastpack1(in, inpos, out, outpos); + break; + case 2: + fastpack2(in, inpos, out, outpos); + break; + case 3: + fastpack3(in, inpos, out, outpos); + break; + case 4: + fastpack4(in, inpos, out, outpos); + break; + case 5: + fastpack5(in, inpos, out, outpos); + break; + case 6: + fastpack6(in, inpos, out, outpos); + break; + case 7: + fastpack7(in, inpos, out, outpos); + break; + case 8: + fastpack8(in, inpos, out, outpos); + break; + case 9: + fastpack9(in, inpos, out, outpos); + break; + case 10: + fastpack10(in, inpos, out, outpos); + break; + case 11: + fastpack11(in, inpos, out, outpos); + break; + case 12: + fastpack12(in, inpos, out, outpos); + break; + case 13: + fastpack13(in, inpos, out, outpos); + break; + case 14: + fastpack14(in, inpos, out, outpos); + break; + case 15: + fastpack15(in, inpos, out, outpos); + break; + case 16: + fastpack16(in, inpos, out, outpos); + break; + case 17: + fastpack17(in, inpos, out, outpos); + break; + case 18: + fastpack18(in, inpos, out, outpos); + break; + case 19: + fastpack19(in, inpos, out, outpos); + break; + case 20: + fastpack20(in, inpos, out, outpos); + break; + case 21: + fastpack21(in, inpos, out, outpos); + break; + case 22: + fastpack22(in, inpos, out, outpos); + break; + case 23: + fastpack23(in, inpos, out, outpos); + break; + case 24: + fastpack24(in, inpos, out, outpos); + break; + case 25: + fastpack25(in, inpos, out, outpos); + break; + case 26: + fastpack26(in, inpos, out, outpos); + break; + case 27: + fastpack27(in, inpos, out, outpos); + break; + case 28: + fastpack28(in, inpos, out, outpos); + break; + case 29: + fastpack29(in, inpos, out, outpos); + break; + case 30: + fastpack30(in, inpos, out, outpos); + break; + case 31: + fastpack31(in, inpos, out, outpos); + break; + case 32: + fastpack32(in, inpos, out, outpos); + break; + default: + throw new IllegalArgumentException( + "Unsupported bit width."); + /** + * @param in + * @param inpos + * @param out + * @param outpos + * @param bit + */ + } } - protected static void fastpackwithoutmask3(final int[] in, int inpos, + protected static void fastpack0(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 3) - | ((in[2 + inpos]) << 6) | ((in[3 + inpos]) << 9) - | ((in[4 + inpos]) << 12) | ((in[5 + inpos]) << 15) - | ((in[6 + inpos]) << 18) | ((in[7 + inpos]) << 21) - | ((in[8 + inpos]) << 24) | ((in[9 + inpos]) << 27) - | ((in[10 + inpos]) << 30); - out[1 + outpos] = ((in[10 + inpos]) >>> (3 - 1)) - | ((in[11 + inpos]) << 1) | ((in[12 + inpos]) << 4) - | ((in[13 + inpos]) << 7) | ((in[14 + inpos]) << 10) - | ((in[15 + inpos]) << 13) | ((in[16 + inpos]) << 16) - | ((in[17 + inpos]) << 19) | ((in[18 + inpos]) << 22) - | ((in[19 + inpos]) << 25) | ((in[20 + inpos]) << 28) - | ((in[21 + inpos]) << 31); - out[2 + outpos] = ((in[21 + inpos]) >>> (3 - 2)) - | ((in[22 + inpos]) << 2) | ((in[23 + inpos]) << 5) - | ((in[24 + inpos]) << 8) | ((in[25 + inpos]) << 11) - | ((in[26 + inpos]) << 14) | ((in[27 + inpos]) << 17) - | ((in[28 + inpos]) << 20) | ((in[29 + inpos]) << 23) - | ((in[30 + inpos]) << 26) | ((in[31 + inpos]) << 29); + // nothing } - protected static void fastpackwithoutmask4(final int[] in, int inpos, + protected static void fastpack1(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 4) - | ((in[2 + inpos]) << 8) | ((in[3 + inpos]) << 12) - | ((in[4 + inpos]) << 16) | ((in[5 + inpos]) << 20) - | ((in[6 + inpos]) << 24) | ((in[7 + inpos]) << 28); - out[1 + outpos] = in[8 + inpos] | ((in[9 + inpos]) << 4) - | ((in[10 + inpos]) << 8) | ((in[11 + inpos]) << 12) - | ((in[12 + inpos]) << 16) | ((in[13 + inpos]) << 20) - | ((in[14 + inpos]) << 24) | ((in[15 + inpos]) << 28); - out[2 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 4) - | ((in[18 + inpos]) << 8) | ((in[19 + inpos]) << 12) - | ((in[20 + inpos]) << 16) | ((in[21 + inpos]) << 20) - | ((in[22 + inpos]) << 24) | ((in[23 + inpos]) << 28); - out[3 + outpos] = in[24 + inpos] | ((in[25 + inpos]) << 4) - | ((in[26 + inpos]) << 8) | ((in[27 + inpos]) << 12) - | ((in[28 + inpos]) << 16) | ((in[29 + inpos]) << 20) - | ((in[30 + inpos]) << 24) | ((in[31 + inpos]) << 28); + out[0 + outpos] = (in[0 + inpos] & 1) + | ((in[1 + inpos] & 1) << 1) + | ((in[2 + inpos] & 1) << 2) + | ((in[3 + inpos] & 1) << 3) + | ((in[4 + inpos] & 1) << 4) + | ((in[5 + inpos] & 1) << 5) + | ((in[6 + inpos] & 1) << 6) + | ((in[7 + inpos] & 1) << 7) + | ((in[8 + inpos] & 1) << 8) + | ((in[9 + inpos] & 1) << 9) + | ((in[10 + inpos] & 1) << 10) + | ((in[11 + inpos] & 1) << 11) + | ((in[12 + inpos] & 1) << 12) + | ((in[13 + inpos] & 1) << 13) + | ((in[14 + inpos] & 1) << 14) + | ((in[15 + inpos] & 1) << 15) + | ((in[16 + inpos] & 1) << 16) + | ((in[17 + inpos] & 1) << 17) + | ((in[18 + inpos] & 1) << 18) + | ((in[19 + inpos] & 1) << 19) + | ((in[20 + inpos] & 1) << 20) + | ((in[21 + inpos] & 1) << 21) + | ((in[22 + inpos] & 1) << 22) + | ((in[23 + inpos] & 1) << 23) + | ((in[24 + inpos] & 1) << 24) + | ((in[25 + inpos] & 1) << 25) + | ((in[26 + inpos] & 1) << 26) + | ((in[27 + inpos] & 1) << 27) + | ((in[28 + inpos] & 1) << 28) + | ((in[29 + inpos] & 1) << 29) + | ((in[30 + inpos] & 1) << 30) + | ((in[31 + inpos]) << 31); } - protected static void fastpackwithoutmask5(final int[] in, int inpos, + protected static void fastpack10(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 5) - | ((in[2 + inpos]) << 10) | ((in[3 + inpos]) << 15) - | ((in[4 + inpos]) << 20) | ((in[5 + inpos]) << 25) - | ((in[6 + inpos]) << 30); - out[1 + outpos] = ((in[6 + inpos]) >>> (5 - 3)) - | ((in[7 + inpos]) << 3) | ((in[8 + inpos]) << 8) - | ((in[9 + inpos]) << 13) | ((in[10 + inpos]) << 18) - | ((in[11 + inpos]) << 23) | ((in[12 + inpos]) << 28); - out[2 + outpos] = ((in[12 + inpos]) >>> (5 - 1)) - | ((in[13 + inpos]) << 1) | ((in[14 + inpos]) << 6) - | ((in[15 + inpos]) << 11) | ((in[16 + inpos]) << 16) - | ((in[17 + inpos]) << 21) | ((in[18 + inpos]) << 26) - | ((in[19 + inpos]) << 31); - out[3 + outpos] = ((in[19 + inpos]) >>> (5 - 4)) - | ((in[20 + inpos]) << 4) | ((in[21 + inpos]) << 9) - | ((in[22 + inpos]) << 14) | ((in[23 + inpos]) << 19) - | ((in[24 + inpos]) << 24) | ((in[25 + inpos]) << 29); - out[4 + outpos] = ((in[25 + inpos]) >>> (5 - 2)) - | ((in[26 + inpos]) << 2) | ((in[27 + inpos]) << 7) - | ((in[28 + inpos]) << 12) | ((in[29 + inpos]) << 17) - | ((in[30 + inpos]) << 22) | ((in[31 + inpos]) << 27); - } - - protected static void fastpackwithoutmask6(final int[] in, int inpos, - final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 6) - | ((in[2 + inpos]) << 12) | ((in[3 + inpos]) << 18) - | ((in[4 + inpos]) << 24) | ((in[5 + inpos]) << 30); - out[1 + outpos] = ((in[5 + inpos]) >>> (6 - 4)) - | ((in[6 + inpos]) << 4) | ((in[7 + inpos]) << 10) - | ((in[8 + inpos]) << 16) | ((in[9 + inpos]) << 22) - | ((in[10 + inpos]) << 28); - out[2 + outpos] = ((in[10 + inpos]) >>> (6 - 2)) - | ((in[11 + inpos]) << 2) | ((in[12 + inpos]) << 8) - | ((in[13 + inpos]) << 14) | ((in[14 + inpos]) << 20) - | ((in[15 + inpos]) << 26); - out[3 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 6) - | ((in[18 + inpos]) << 12) | ((in[19 + inpos]) << 18) - | ((in[20 + inpos]) << 24) | ((in[21 + inpos]) << 30); - out[4 + outpos] = ((in[21 + inpos]) >>> (6 - 4)) - | ((in[22 + inpos]) << 4) | ((in[23 + inpos]) << 10) - | ((in[24 + inpos]) << 16) | ((in[25 + inpos]) << 22) - | ((in[26 + inpos]) << 28); - out[5 + outpos] = ((in[26 + inpos]) >>> (6 - 2)) - | ((in[27 + inpos]) << 2) | ((in[28 + inpos]) << 8) - | ((in[29 + inpos]) << 14) | ((in[30 + inpos]) << 20) - | ((in[31 + inpos]) << 26); - } - - protected static void fastpackwithoutmask7(final int[] in, int inpos, - final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 7) - | ((in[2 + inpos]) << 14) | ((in[3 + inpos]) << 21) - | ((in[4 + inpos]) << 28); - out[1 + outpos] = ((in[4 + inpos]) >>> (7 - 3)) - | ((in[5 + inpos]) << 3) | ((in[6 + inpos]) << 10) - | ((in[7 + inpos]) << 17) | ((in[8 + inpos]) << 24) - | ((in[9 + inpos]) << 31); - out[2 + outpos] = ((in[9 + inpos]) >>> (7 - 6)) - | ((in[10 + inpos]) << 6) | ((in[11 + inpos]) << 13) - | ((in[12 + inpos]) << 20) | ((in[13 + inpos]) << 27); - out[3 + outpos] = ((in[13 + inpos]) >>> (7 - 2)) - | ((in[14 + inpos]) << 2) | ((in[15 + inpos]) << 9) - | ((in[16 + inpos]) << 16) | ((in[17 + inpos]) << 23) - | ((in[18 + inpos]) << 30); - out[4 + outpos] = ((in[18 + inpos]) >>> (7 - 5)) - | ((in[19 + inpos]) << 5) | ((in[20 + inpos]) << 12) - | ((in[21 + inpos]) << 19) | ((in[22 + inpos]) << 26); - out[5 + outpos] = ((in[22 + inpos]) >>> (7 - 1)) - | ((in[23 + inpos]) << 1) | ((in[24 + inpos]) << 8) - | ((in[25 + inpos]) << 15) | ((in[26 + inpos]) << 22) - | ((in[27 + inpos]) << 29); - out[6 + outpos] = ((in[27 + inpos]) >>> (7 - 4)) - | ((in[28 + inpos]) << 4) | ((in[29 + inpos]) << 11) - | ((in[30 + inpos]) << 18) | ((in[31 + inpos]) << 25); - } - - protected static void fastpackwithoutmask8(final int[] in, int inpos, - final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 8) - | ((in[2 + inpos]) << 16) | ((in[3 + inpos]) << 24); - out[1 + outpos] = in[4 + inpos] | ((in[5 + inpos]) << 8) - | ((in[6 + inpos]) << 16) | ((in[7 + inpos]) << 24); - out[2 + outpos] = in[8 + inpos] | ((in[9 + inpos]) << 8) - | ((in[10 + inpos]) << 16) | ((in[11 + inpos]) << 24); - out[3 + outpos] = in[12 + inpos] | ((in[13 + inpos]) << 8) - | ((in[14 + inpos]) << 16) | ((in[15 + inpos]) << 24); - out[4 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 8) - | ((in[18 + inpos]) << 16) | ((in[19 + inpos]) << 24); - out[5 + outpos] = in[20 + inpos] | ((in[21 + inpos]) << 8) - | ((in[22 + inpos]) << 16) | ((in[23 + inpos]) << 24); - out[6 + outpos] = in[24 + inpos] | ((in[25 + inpos]) << 8) - | ((in[26 + inpos]) << 16) | ((in[27 + inpos]) << 24); - out[7 + outpos] = in[28 + inpos] | ((in[29 + inpos]) << 8) - | ((in[30 + inpos]) << 16) | ((in[31 + inpos]) << 24); - } - - protected static void fastpackwithoutmask9(final int[] in, int inpos, - final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 9) - | ((in[2 + inpos]) << 18) | ((in[3 + inpos]) << 27); - out[1 + outpos] = ((in[3 + inpos]) >>> (9 - 4)) - | ((in[4 + inpos]) << 4) | ((in[5 + inpos]) << 13) - | ((in[6 + inpos]) << 22) | ((in[7 + inpos]) << 31); - out[2 + outpos] = ((in[7 + inpos]) >>> (9 - 8)) - | ((in[8 + inpos]) << 8) | ((in[9 + inpos]) << 17) - | ((in[10 + inpos]) << 26); - out[3 + outpos] = ((in[10 + inpos]) >>> (9 - 3)) - | ((in[11 + inpos]) << 3) | ((in[12 + inpos]) << 12) - | ((in[13 + inpos]) << 21) | ((in[14 + inpos]) << 30); - out[4 + outpos] = ((in[14 + inpos]) >>> (9 - 7)) - | ((in[15 + inpos]) << 7) | ((in[16 + inpos]) << 16) - | ((in[17 + inpos]) << 25); - out[5 + outpos] = ((in[17 + inpos]) >>> (9 - 2)) - | ((in[18 + inpos]) << 2) | ((in[19 + inpos]) << 11) - | ((in[20 + inpos]) << 20) | ((in[21 + inpos]) << 29); - out[6 + outpos] = ((in[21 + inpos]) >>> (9 - 6)) - | ((in[22 + inpos]) << 6) | ((in[23 + inpos]) << 15) - | ((in[24 + inpos]) << 24); - out[7 + outpos] = ((in[24 + inpos]) >>> (9 - 1)) - | ((in[25 + inpos]) << 1) | ((in[26 + inpos]) << 10) - | ((in[27 + inpos]) << 19) | ((in[28 + inpos]) << 28); - out[8 + outpos] = ((in[28 + inpos]) >>> (9 - 5)) - | ((in[29 + inpos]) << 5) | ((in[30 + inpos]) << 14) - | ((in[31 + inpos]) << 23); - } - - protected static void fastpackwithoutmask10(final int[] in, int inpos, - final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 10) - | ((in[2 + inpos]) << 20) | ((in[3 + inpos]) << 30); - out[1 + outpos] = ((in[3 + inpos]) >>> (10 - 8)) - | ((in[4 + inpos]) << 8) | ((in[5 + inpos]) << 18) + out[0 + outpos] = (in[0 + inpos] & 1023) + | ((in[1 + inpos] & 1023) << 10) + | ((in[2 + inpos] & 1023) << 20) + | ((in[3 + inpos]) << 30); + out[1 + outpos] = ((in[3 + inpos] & 1023) >>> (10 - 8)) + | ((in[4 + inpos] & 1023) << 8) + | ((in[5 + inpos] & 1023) << 18) | ((in[6 + inpos]) << 28); - out[2 + outpos] = ((in[6 + inpos]) >>> (10 - 6)) - | ((in[7 + inpos]) << 6) | ((in[8 + inpos]) << 16) + out[2 + outpos] = ((in[6 + inpos] & 1023) >>> (10 - 6)) + | ((in[7 + inpos] & 1023) << 6) + | ((in[8 + inpos] & 1023) << 16) | ((in[9 + inpos]) << 26); - out[3 + outpos] = ((in[9 + inpos]) >>> (10 - 4)) - | ((in[10 + inpos]) << 4) | ((in[11 + inpos]) << 14) + out[3 + outpos] = ((in[9 + inpos] & 1023) >>> (10 - 4)) + | ((in[10 + inpos] & 1023) << 4) + | ((in[11 + inpos] & 1023) << 14) | ((in[12 + inpos]) << 24); - out[4 + outpos] = ((in[12 + inpos]) >>> (10 - 2)) - | ((in[13 + inpos]) << 2) | ((in[14 + inpos]) << 12) + out[4 + outpos] = ((in[12 + inpos] & 1023) >>> (10 - 2)) + | ((in[13 + inpos] & 1023) << 2) + | ((in[14 + inpos] & 1023) << 12) | ((in[15 + inpos]) << 22); - out[5 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 10) - | ((in[18 + inpos]) << 20) | ((in[19 + inpos]) << 30); - out[6 + outpos] = ((in[19 + inpos]) >>> (10 - 8)) - | ((in[20 + inpos]) << 8) | ((in[21 + inpos]) << 18) + out[5 + outpos] = (in[16 + inpos] & 1023) + | ((in[17 + inpos] & 1023) << 10) + | ((in[18 + inpos] & 1023) << 20) + | ((in[19 + inpos]) << 30); + out[6 + outpos] = ((in[19 + inpos] & 1023) >>> (10 - 8)) + | ((in[20 + inpos] & 1023) << 8) + | ((in[21 + inpos] & 1023) << 18) | ((in[22 + inpos]) << 28); - out[7 + outpos] = ((in[22 + inpos]) >>> (10 - 6)) - | ((in[23 + inpos]) << 6) | ((in[24 + inpos]) << 16) + out[7 + outpos] = ((in[22 + inpos] & 1023) >>> (10 - 6)) + | ((in[23 + inpos] & 1023) << 6) + | ((in[24 + inpos] & 1023) << 16) | ((in[25 + inpos]) << 26); - out[8 + outpos] = ((in[25 + inpos]) >>> (10 - 4)) - | ((in[26 + inpos]) << 4) | ((in[27 + inpos]) << 14) + out[8 + outpos] = ((in[25 + inpos] & 1023) >>> (10 - 4)) + | ((in[26 + inpos] & 1023) << 4) + | ((in[27 + inpos] & 1023) << 14) | ((in[28 + inpos]) << 24); - out[9 + outpos] = ((in[28 + inpos]) >>> (10 - 2)) - | ((in[29 + inpos]) << 2) | ((in[30 + inpos]) << 12) + out[9 + outpos] = ((in[28 + inpos] & 1023) >>> (10 - 2)) + | ((in[29 + inpos] & 1023) << 2) + | ((in[30 + inpos] & 1023) << 12) | ((in[31 + inpos]) << 22); } - protected static void fastpackwithoutmask11(final int[] in, int inpos, + protected static void fastpack11(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 11) + out[0 + outpos] = (in[0 + inpos] & 2047) + | ((in[1 + inpos] & 2047) << 11) | ((in[2 + inpos]) << 22); - out[1 + outpos] = ((in[2 + inpos]) >>> (11 - 1)) - | ((in[3 + inpos]) << 1) | ((in[4 + inpos]) << 12) + out[1 + outpos] = ((in[2 + inpos] & 2047) >>> (11 - 1)) + | ((in[3 + inpos] & 2047) << 1) + | ((in[4 + inpos] & 2047) << 12) | ((in[5 + inpos]) << 23); - out[2 + outpos] = ((in[5 + inpos]) >>> (11 - 2)) - | ((in[6 + inpos]) << 2) | ((in[7 + inpos]) << 13) + out[2 + outpos] = ((in[5 + inpos] & 2047) >>> (11 - 2)) + | ((in[6 + inpos] & 2047) << 2) + | ((in[7 + inpos] & 2047) << 13) | ((in[8 + inpos]) << 24); - out[3 + outpos] = ((in[8 + inpos]) >>> (11 - 3)) - | ((in[9 + inpos]) << 3) | ((in[10 + inpos]) << 14) + out[3 + outpos] = ((in[8 + inpos] & 2047) >>> (11 - 3)) + | ((in[9 + inpos] & 2047) << 3) + | ((in[10 + inpos] & 2047) << 14) | ((in[11 + inpos]) << 25); - out[4 + outpos] = ((in[11 + inpos]) >>> (11 - 4)) - | ((in[12 + inpos]) << 4) | ((in[13 + inpos]) << 15) + out[4 + outpos] = ((in[11 + inpos] & 2047) >>> (11 - 4)) + | ((in[12 + inpos] & 2047) << 4) + | ((in[13 + inpos] & 2047) << 15) | ((in[14 + inpos]) << 26); - out[5 + outpos] = ((in[14 + inpos]) >>> (11 - 5)) - | ((in[15 + inpos]) << 5) | ((in[16 + inpos]) << 16) + out[5 + outpos] = ((in[14 + inpos] & 2047) >>> (11 - 5)) + | ((in[15 + inpos] & 2047) << 5) + | ((in[16 + inpos] & 2047) << 16) | ((in[17 + inpos]) << 27); - out[6 + outpos] = ((in[17 + inpos]) >>> (11 - 6)) - | ((in[18 + inpos]) << 6) | ((in[19 + inpos]) << 17) + out[6 + outpos] = ((in[17 + inpos] & 2047) >>> (11 - 6)) + | ((in[18 + inpos] & 2047) << 6) + | ((in[19 + inpos] & 2047) << 17) | ((in[20 + inpos]) << 28); - out[7 + outpos] = ((in[20 + inpos]) >>> (11 - 7)) - | ((in[21 + inpos]) << 7) | ((in[22 + inpos]) << 18) + out[7 + outpos] = ((in[20 + inpos] & 2047) >>> (11 - 7)) + | ((in[21 + inpos] & 2047) << 7) + | ((in[22 + inpos] & 2047) << 18) | ((in[23 + inpos]) << 29); - out[8 + outpos] = ((in[23 + inpos]) >>> (11 - 8)) - | ((in[24 + inpos]) << 8) | ((in[25 + inpos]) << 19) + out[8 + outpos] = ((in[23 + inpos] & 2047) >>> (11 - 8)) + | ((in[24 + inpos] & 2047) << 8) + | ((in[25 + inpos] & 2047) << 19) | ((in[26 + inpos]) << 30); - out[9 + outpos] = ((in[26 + inpos]) >>> (11 - 9)) - | ((in[27 + inpos]) << 9) | ((in[28 + inpos]) << 20) + out[9 + outpos] = ((in[26 + inpos] & 2047) >>> (11 - 9)) + | ((in[27 + inpos] & 2047) << 9) + | ((in[28 + inpos] & 2047) << 20) | ((in[29 + inpos]) << 31); - out[10 + outpos] = ((in[29 + inpos]) >>> (11 - 10)) - | ((in[30 + inpos]) << 10) | ((in[31 + inpos]) << 21); + out[10 + outpos] = ((in[29 + inpos] & 2047) >>> (11 - 10)) + | ((in[30 + inpos] & 2047) << 10) + | ((in[31 + inpos]) << 21); } - protected static void fastpackwithoutmask12(final int[] in, int inpos, + protected static void fastpack12(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 12) + out[0 + outpos] = (in[0 + inpos] & 4095) + | ((in[1 + inpos] & 4095) << 12) | ((in[2 + inpos]) << 24); - out[1 + outpos] = ((in[2 + inpos]) >>> (12 - 4)) - | ((in[3 + inpos]) << 4) | ((in[4 + inpos]) << 16) + out[1 + outpos] = ((in[2 + inpos] & 4095) >>> (12 - 4)) + | ((in[3 + inpos] & 4095) << 4) + | ((in[4 + inpos] & 4095) << 16) | ((in[5 + inpos]) << 28); - out[2 + outpos] = ((in[5 + inpos]) >>> (12 - 8)) - | ((in[6 + inpos]) << 8) | ((in[7 + inpos]) << 20); - out[3 + outpos] = in[8 + inpos] | ((in[9 + inpos]) << 12) + out[2 + outpos] = ((in[5 + inpos] & 4095) >>> (12 - 8)) + | ((in[6 + inpos] & 4095) << 8) + | ((in[7 + inpos]) << 20); + out[3 + outpos] = (in[8 + inpos] & 4095) + | ((in[9 + inpos] & 4095) << 12) | ((in[10 + inpos]) << 24); - out[4 + outpos] = ((in[10 + inpos]) >>> (12 - 4)) - | ((in[11 + inpos]) << 4) | ((in[12 + inpos]) << 16) + out[4 + outpos] = ((in[10 + inpos] & 4095) >>> (12 - 4)) + | ((in[11 + inpos] & 4095) << 4) + | ((in[12 + inpos] & 4095) << 16) | ((in[13 + inpos]) << 28); - out[5 + outpos] = ((in[13 + inpos]) >>> (12 - 8)) - | ((in[14 + inpos]) << 8) | ((in[15 + inpos]) << 20); - out[6 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 12) + out[5 + outpos] = ((in[13 + inpos] & 4095) >>> (12 - 8)) + | ((in[14 + inpos] & 4095) << 8) + | ((in[15 + inpos]) << 20); + out[6 + outpos] = (in[16 + inpos] & 4095) + | ((in[17 + inpos] & 4095) << 12) | ((in[18 + inpos]) << 24); - out[7 + outpos] = ((in[18 + inpos]) >>> (12 - 4)) - | ((in[19 + inpos]) << 4) | ((in[20 + inpos]) << 16) + out[7 + outpos] = ((in[18 + inpos] & 4095) >>> (12 - 4)) + | ((in[19 + inpos] & 4095) << 4) + | ((in[20 + inpos] & 4095) << 16) | ((in[21 + inpos]) << 28); - out[8 + outpos] = ((in[21 + inpos]) >>> (12 - 8)) - | ((in[22 + inpos]) << 8) | ((in[23 + inpos]) << 20); - out[9 + outpos] = in[24 + inpos] | ((in[25 + inpos]) << 12) + out[8 + outpos] = ((in[21 + inpos] & 4095) >>> (12 - 8)) + | ((in[22 + inpos] & 4095) << 8) + | ((in[23 + inpos]) << 20); + out[9 + outpos] = (in[24 + inpos] & 4095) + | ((in[25 + inpos] & 4095) << 12) | ((in[26 + inpos]) << 24); - out[10 + outpos] = ((in[26 + inpos]) >>> (12 - 4)) - | ((in[27 + inpos]) << 4) | ((in[28 + inpos]) << 16) + out[10 + outpos] = ((in[26 + inpos] & 4095) >>> (12 - 4)) + | ((in[27 + inpos] & 4095) << 4) + | ((in[28 + inpos] & 4095) << 16) | ((in[29 + inpos]) << 28); - out[11 + outpos] = ((in[29 + inpos]) >>> (12 - 8)) - | ((in[30 + inpos]) << 8) | ((in[31 + inpos]) << 20); + out[11 + outpos] = ((in[29 + inpos] & 4095) >>> (12 - 8)) + | ((in[30 + inpos] & 4095) << 8) + | ((in[31 + inpos]) << 20); } - protected static void fastpackwithoutmask13(final int[] in, int inpos, + protected static void fastpack13(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 13) + out[0 + outpos] = (in[0 + inpos] & 8191) + | ((in[1 + inpos] & 8191) << 13) | ((in[2 + inpos]) << 26); - out[1 + outpos] = ((in[2 + inpos]) >>> (13 - 7)) - | ((in[3 + inpos]) << 7) | ((in[4 + inpos]) << 20); - out[2 + outpos] = ((in[4 + inpos]) >>> (13 - 1)) - | ((in[5 + inpos]) << 1) | ((in[6 + inpos]) << 14) + out[1 + outpos] = ((in[2 + inpos] & 8191) >>> (13 - 7)) + | ((in[3 + inpos] & 8191) << 7) + | ((in[4 + inpos]) << 20); + out[2 + outpos] = ((in[4 + inpos] & 8191) >>> (13 - 1)) + | ((in[5 + inpos] & 8191) << 1) + | ((in[6 + inpos] & 8191) << 14) | ((in[7 + inpos]) << 27); - out[3 + outpos] = ((in[7 + inpos]) >>> (13 - 8)) - | ((in[8 + inpos]) << 8) | ((in[9 + inpos]) << 21); - out[4 + outpos] = ((in[9 + inpos]) >>> (13 - 2)) - | ((in[10 + inpos]) << 2) | ((in[11 + inpos]) << 15) + out[3 + outpos] = ((in[7 + inpos] & 8191) >>> (13 - 8)) + | ((in[8 + inpos] & 8191) << 8) + | ((in[9 + inpos]) << 21); + out[4 + outpos] = ((in[9 + inpos] & 8191) >>> (13 - 2)) + | ((in[10 + inpos] & 8191) << 2) + | ((in[11 + inpos] & 8191) << 15) | ((in[12 + inpos]) << 28); - out[5 + outpos] = ((in[12 + inpos]) >>> (13 - 9)) - | ((in[13 + inpos]) << 9) | ((in[14 + inpos]) << 22); - out[6 + outpos] = ((in[14 + inpos]) >>> (13 - 3)) - | ((in[15 + inpos]) << 3) | ((in[16 + inpos]) << 16) + out[5 + outpos] = ((in[12 + inpos] & 8191) >>> (13 - 9)) + | ((in[13 + inpos] & 8191) << 9) + | ((in[14 + inpos]) << 22); + out[6 + outpos] = ((in[14 + inpos] & 8191) >>> (13 - 3)) + | ((in[15 + inpos] & 8191) << 3) + | ((in[16 + inpos] & 8191) << 16) | ((in[17 + inpos]) << 29); - out[7 + outpos] = ((in[17 + inpos]) >>> (13 - 10)) - | ((in[18 + inpos]) << 10) | ((in[19 + inpos]) << 23); - out[8 + outpos] = ((in[19 + inpos]) >>> (13 - 4)) - | ((in[20 + inpos]) << 4) | ((in[21 + inpos]) << 17) + out[7 + outpos] = ((in[17 + inpos] & 8191) >>> (13 - 10)) + | ((in[18 + inpos] & 8191) << 10) + | ((in[19 + inpos]) << 23); + out[8 + outpos] = ((in[19 + inpos] & 8191) >>> (13 - 4)) + | ((in[20 + inpos] & 8191) << 4) + | ((in[21 + inpos] & 8191) << 17) | ((in[22 + inpos]) << 30); - out[9 + outpos] = ((in[22 + inpos]) >>> (13 - 11)) - | ((in[23 + inpos]) << 11) | ((in[24 + inpos]) << 24); - out[10 + outpos] = ((in[24 + inpos]) >>> (13 - 5)) - | ((in[25 + inpos]) << 5) | ((in[26 + inpos]) << 18) + out[9 + outpos] = ((in[22 + inpos] & 8191) >>> (13 - 11)) + | ((in[23 + inpos] & 8191) << 11) + | ((in[24 + inpos]) << 24); + out[10 + outpos] = ((in[24 + inpos] & 8191) >>> (13 - 5)) + | ((in[25 + inpos] & 8191) << 5) + | ((in[26 + inpos] & 8191) << 18) | ((in[27 + inpos]) << 31); - out[11 + outpos] = ((in[27 + inpos]) >>> (13 - 12)) - | ((in[28 + inpos]) << 12) | ((in[29 + inpos]) << 25); - out[12 + outpos] = ((in[29 + inpos]) >>> (13 - 6)) - | ((in[30 + inpos]) << 6) | ((in[31 + inpos]) << 19); + out[11 + outpos] = ((in[27 + inpos] & 8191) >>> (13 - 12)) + | ((in[28 + inpos] & 8191) << 12) + | ((in[29 + inpos]) << 25); + out[12 + outpos] = ((in[29 + inpos] & 8191) >>> (13 - 6)) + | ((in[30 + inpos] & 8191) << 6) + | ((in[31 + inpos]) << 19); } - protected static void fastpackwithoutmask14(final int[] in, int inpos, + protected static void fastpack14(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 14) + out[0 + outpos] = (in[0 + inpos] & 16383) + | ((in[1 + inpos] & 16383) << 14) | ((in[2 + inpos]) << 28); - out[1 + outpos] = ((in[2 + inpos]) >>> (14 - 10)) - | ((in[3 + inpos]) << 10) | ((in[4 + inpos]) << 24); - out[2 + outpos] = ((in[4 + inpos]) >>> (14 - 6)) - | ((in[5 + inpos]) << 6) | ((in[6 + inpos]) << 20); - out[3 + outpos] = ((in[6 + inpos]) >>> (14 - 2)) - | ((in[7 + inpos]) << 2) | ((in[8 + inpos]) << 16) + out[1 + outpos] = ((in[2 + inpos] & 16383) >>> (14 - 10)) + | ((in[3 + inpos] & 16383) << 10) + | ((in[4 + inpos]) << 24); + out[2 + outpos] = ((in[4 + inpos] & 16383) >>> (14 - 6)) + | ((in[5 + inpos] & 16383) << 6) + | ((in[6 + inpos]) << 20); + out[3 + outpos] = ((in[6 + inpos] & 16383) >>> (14 - 2)) + | ((in[7 + inpos] & 16383) << 2) + | ((in[8 + inpos] & 16383) << 16) | ((in[9 + inpos]) << 30); - out[4 + outpos] = ((in[9 + inpos]) >>> (14 - 12)) - | ((in[10 + inpos]) << 12) | ((in[11 + inpos]) << 26); - out[5 + outpos] = ((in[11 + inpos]) >>> (14 - 8)) - | ((in[12 + inpos]) << 8) | ((in[13 + inpos]) << 22); - out[6 + outpos] = ((in[13 + inpos]) >>> (14 - 4)) - | ((in[14 + inpos]) << 4) | ((in[15 + inpos]) << 18); - out[7 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 14) + out[4 + outpos] = ((in[9 + inpos] & 16383) >>> (14 - 12)) + | ((in[10 + inpos] & 16383) << 12) + | ((in[11 + inpos]) << 26); + out[5 + outpos] = ((in[11 + inpos] & 16383) >>> (14 - 8)) + | ((in[12 + inpos] & 16383) << 8) + | ((in[13 + inpos]) << 22); + out[6 + outpos] = ((in[13 + inpos] & 16383) >>> (14 - 4)) + | ((in[14 + inpos] & 16383) << 4) + | ((in[15 + inpos]) << 18); + out[7 + outpos] = (in[16 + inpos] & 16383) + | ((in[17 + inpos] & 16383) << 14) | ((in[18 + inpos]) << 28); - out[8 + outpos] = ((in[18 + inpos]) >>> (14 - 10)) - | ((in[19 + inpos]) << 10) | ((in[20 + inpos]) << 24); - out[9 + outpos] = ((in[20 + inpos]) >>> (14 - 6)) - | ((in[21 + inpos]) << 6) | ((in[22 + inpos]) << 20); - out[10 + outpos] = ((in[22 + inpos]) >>> (14 - 2)) - | ((in[23 + inpos]) << 2) | ((in[24 + inpos]) << 16) + out[8 + outpos] = ((in[18 + inpos] & 16383) >>> (14 - 10)) + | ((in[19 + inpos] & 16383) << 10) + | ((in[20 + inpos]) << 24); + out[9 + outpos] = ((in[20 + inpos] & 16383) >>> (14 - 6)) + | ((in[21 + inpos] & 16383) << 6) + | ((in[22 + inpos]) << 20); + out[10 + outpos] = ((in[22 + inpos] & 16383) >>> (14 - 2)) + | ((in[23 + inpos] & 16383) << 2) + | ((in[24 + inpos] & 16383) << 16) | ((in[25 + inpos]) << 30); - out[11 + outpos] = ((in[25 + inpos]) >>> (14 - 12)) - | ((in[26 + inpos]) << 12) | ((in[27 + inpos]) << 26); - out[12 + outpos] = ((in[27 + inpos]) >>> (14 - 8)) - | ((in[28 + inpos]) << 8) | ((in[29 + inpos]) << 22); - out[13 + outpos] = ((in[29 + inpos]) >>> (14 - 4)) - | ((in[30 + inpos]) << 4) | ((in[31 + inpos]) << 18); + out[11 + outpos] = ((in[25 + inpos] & 16383) >>> (14 - 12)) + | ((in[26 + inpos] & 16383) << 12) + | ((in[27 + inpos]) << 26); + out[12 + outpos] = ((in[27 + inpos] & 16383) >>> (14 - 8)) + | ((in[28 + inpos] & 16383) << 8) + | ((in[29 + inpos]) << 22); + out[13 + outpos] = ((in[29 + inpos] & 16383) >>> (14 - 4)) + | ((in[30 + inpos] & 16383) << 4) + | ((in[31 + inpos]) << 18); } - protected static void fastpackwithoutmask15(final int[] in, int inpos, + protected static void fastpack15(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 15) + out[0 + outpos] = (in[0 + inpos] & 32767) + | ((in[1 + inpos] & 32767) << 15) | ((in[2 + inpos]) << 30); - out[1 + outpos] = ((in[2 + inpos]) >>> (15 - 13)) - | ((in[3 + inpos]) << 13) | ((in[4 + inpos]) << 28); - out[2 + outpos] = ((in[4 + inpos]) >>> (15 - 11)) - | ((in[5 + inpos]) << 11) | ((in[6 + inpos]) << 26); - out[3 + outpos] = ((in[6 + inpos]) >>> (15 - 9)) - | ((in[7 + inpos]) << 9) | ((in[8 + inpos]) << 24); - out[4 + outpos] = ((in[8 + inpos]) >>> (15 - 7)) - | ((in[9 + inpos]) << 7) | ((in[10 + inpos]) << 22); - out[5 + outpos] = ((in[10 + inpos]) >>> (15 - 5)) - | ((in[11 + inpos]) << 5) | ((in[12 + inpos]) << 20); - out[6 + outpos] = ((in[12 + inpos]) >>> (15 - 3)) - | ((in[13 + inpos]) << 3) | ((in[14 + inpos]) << 18); - out[7 + outpos] = ((in[14 + inpos]) >>> (15 - 1)) - | ((in[15 + inpos]) << 1) | ((in[16 + inpos]) << 16) + out[1 + outpos] = ((in[2 + inpos] & 32767) >>> (15 - 13)) + | ((in[3 + inpos] & 32767) << 13) + | ((in[4 + inpos]) << 28); + out[2 + outpos] = ((in[4 + inpos] & 32767) >>> (15 - 11)) + | ((in[5 + inpos] & 32767) << 11) + | ((in[6 + inpos]) << 26); + out[3 + outpos] = ((in[6 + inpos] & 32767) >>> (15 - 9)) + | ((in[7 + inpos] & 32767) << 9) + | ((in[8 + inpos]) << 24); + out[4 + outpos] = ((in[8 + inpos] & 32767) >>> (15 - 7)) + | ((in[9 + inpos] & 32767) << 7) + | ((in[10 + inpos]) << 22); + out[5 + outpos] = ((in[10 + inpos] & 32767) >>> (15 - 5)) + | ((in[11 + inpos] & 32767) << 5) + | ((in[12 + inpos]) << 20); + out[6 + outpos] = ((in[12 + inpos] & 32767) >>> (15 - 3)) + | ((in[13 + inpos] & 32767) << 3) + | ((in[14 + inpos]) << 18); + out[7 + outpos] = ((in[14 + inpos] & 32767) >>> (15 - 1)) + | ((in[15 + inpos] & 32767) << 1) + | ((in[16 + inpos] & 32767) << 16) | ((in[17 + inpos]) << 31); - out[8 + outpos] = ((in[17 + inpos]) >>> (15 - 14)) - | ((in[18 + inpos]) << 14) | ((in[19 + inpos]) << 29); - out[9 + outpos] = ((in[19 + inpos]) >>> (15 - 12)) - | ((in[20 + inpos]) << 12) | ((in[21 + inpos]) << 27); - out[10 + outpos] = ((in[21 + inpos]) >>> (15 - 10)) - | ((in[22 + inpos]) << 10) | ((in[23 + inpos]) << 25); - out[11 + outpos] = ((in[23 + inpos]) >>> (15 - 8)) - | ((in[24 + inpos]) << 8) | ((in[25 + inpos]) << 23); - out[12 + outpos] = ((in[25 + inpos]) >>> (15 - 6)) - | ((in[26 + inpos]) << 6) | ((in[27 + inpos]) << 21); - out[13 + outpos] = ((in[27 + inpos]) >>> (15 - 4)) - | ((in[28 + inpos]) << 4) | ((in[29 + inpos]) << 19); - out[14 + outpos] = ((in[29 + inpos]) >>> (15 - 2)) - | ((in[30 + inpos]) << 2) | ((in[31 + inpos]) << 17); - } - - protected static void fastpackwithoutmask16(final int[] in, int inpos, - final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 16); - out[1 + outpos] = in[2 + inpos] | ((in[3 + inpos]) << 16); - out[2 + outpos] = in[4 + inpos] | ((in[5 + inpos]) << 16); - out[3 + outpos] = in[6 + inpos] | ((in[7 + inpos]) << 16); - out[4 + outpos] = in[8 + inpos] | ((in[9 + inpos]) << 16); - out[5 + outpos] = in[10 + inpos] | ((in[11 + inpos]) << 16); - out[6 + outpos] = in[12 + inpos] | ((in[13 + inpos]) << 16); - out[7 + outpos] = in[14 + inpos] | ((in[15 + inpos]) << 16); - out[8 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 16); - out[9 + outpos] = in[18 + inpos] | ((in[19 + inpos]) << 16); - out[10 + outpos] = in[20 + inpos] | ((in[21 + inpos]) << 16); - out[11 + outpos] = in[22 + inpos] | ((in[23 + inpos]) << 16); - out[12 + outpos] = in[24 + inpos] | ((in[25 + inpos]) << 16); - out[13 + outpos] = in[26 + inpos] | ((in[27 + inpos]) << 16); - out[14 + outpos] = in[28 + inpos] | ((in[29 + inpos]) << 16); - out[15 + outpos] = in[30 + inpos] | ((in[31 + inpos]) << 16); + out[8 + outpos] = ((in[17 + inpos] & 32767) >>> (15 - 14)) + | ((in[18 + inpos] & 32767) << 14) + | ((in[19 + inpos]) << 29); + out[9 + outpos] = ((in[19 + inpos] & 32767) >>> (15 - 12)) + | ((in[20 + inpos] & 32767) << 12) + | ((in[21 + inpos]) << 27); + out[10 + outpos] = ((in[21 + inpos] & 32767) >>> (15 - 10)) + | ((in[22 + inpos] & 32767) << 10) + | ((in[23 + inpos]) << 25); + out[11 + outpos] = ((in[23 + inpos] & 32767) >>> (15 - 8)) + | ((in[24 + inpos] & 32767) << 8) + | ((in[25 + inpos]) << 23); + out[12 + outpos] = ((in[25 + inpos] & 32767) >>> (15 - 6)) + | ((in[26 + inpos] & 32767) << 6) + | ((in[27 + inpos]) << 21); + out[13 + outpos] = ((in[27 + inpos] & 32767) >>> (15 - 4)) + | ((in[28 + inpos] & 32767) << 4) + | ((in[29 + inpos]) << 19); + out[14 + outpos] = ((in[29 + inpos] & 32767) >>> (15 - 2)) + | ((in[30 + inpos] & 32767) << 2) + | ((in[31 + inpos]) << 17); } - protected static void fastpackwithoutmask17(final int[] in, int inpos, + protected static void fastpack16(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 17); - out[1 + outpos] = ((in[1 + inpos]) >>> (17 - 2)) - | ((in[2 + inpos]) << 2) | ((in[3 + inpos]) << 19); - out[2 + outpos] = ((in[3 + inpos]) >>> (17 - 4)) - | ((in[4 + inpos]) << 4) | ((in[5 + inpos]) << 21); - out[3 + outpos] = ((in[5 + inpos]) >>> (17 - 6)) - | ((in[6 + inpos]) << 6) | ((in[7 + inpos]) << 23); - out[4 + outpos] = ((in[7 + inpos]) >>> (17 - 8)) - | ((in[8 + inpos]) << 8) | ((in[9 + inpos]) << 25); - out[5 + outpos] = ((in[9 + inpos]) >>> (17 - 10)) - | ((in[10 + inpos]) << 10) | ((in[11 + inpos]) << 27); - out[6 + outpos] = ((in[11 + inpos]) >>> (17 - 12)) - | ((in[12 + inpos]) << 12) | ((in[13 + inpos]) << 29); - out[7 + outpos] = ((in[13 + inpos]) >>> (17 - 14)) - | ((in[14 + inpos]) << 14) | ((in[15 + inpos]) << 31); - out[8 + outpos] = ((in[15 + inpos]) >>> (17 - 16)) + out[0 + outpos] = (in[0 + inpos] & 65535) + | ((in[1 + inpos]) << 16); + out[1 + outpos] = (in[2 + inpos] & 65535) + | ((in[3 + inpos]) << 16); + out[2 + outpos] = (in[4 + inpos] & 65535) + | ((in[5 + inpos]) << 16); + out[3 + outpos] = (in[6 + inpos] & 65535) + | ((in[7 + inpos]) << 16); + out[4 + outpos] = (in[8 + inpos] & 65535) + | ((in[9 + inpos]) << 16); + out[5 + outpos] = (in[10 + inpos] & 65535) + | ((in[11 + inpos]) << 16); + out[6 + outpos] = (in[12 + inpos] & 65535) + | ((in[13 + inpos]) << 16); + out[7 + outpos] = (in[14 + inpos] & 65535) + | ((in[15 + inpos]) << 16); + out[8 + outpos] = (in[16 + inpos] & 65535) + | ((in[17 + inpos]) << 16); + out[9 + outpos] = (in[18 + inpos] & 65535) + | ((in[19 + inpos]) << 16); + out[10 + outpos] = (in[20 + inpos] & 65535) + | ((in[21 + inpos]) << 16); + out[11 + outpos] = (in[22 + inpos] & 65535) + | ((in[23 + inpos]) << 16); + out[12 + outpos] = (in[24 + inpos] & 65535) + | ((in[25 + inpos]) << 16); + out[13 + outpos] = (in[26 + inpos] & 65535) + | ((in[27 + inpos]) << 16); + out[14 + outpos] = (in[28 + inpos] & 65535) + | ((in[29 + inpos]) << 16); + out[15 + outpos] = (in[30 + inpos] & 65535) + | ((in[31 + inpos]) << 16); + } + + protected static void fastpack17(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 131071) + | ((in[1 + inpos]) << 17); + out[1 + outpos] = ((in[1 + inpos] & 131071) >>> (17 - 2)) + | ((in[2 + inpos] & 131071) << 2) + | ((in[3 + inpos]) << 19); + out[2 + outpos] = ((in[3 + inpos] & 131071) >>> (17 - 4)) + | ((in[4 + inpos] & 131071) << 4) + | ((in[5 + inpos]) << 21); + out[3 + outpos] = ((in[5 + inpos] & 131071) >>> (17 - 6)) + | ((in[6 + inpos] & 131071) << 6) + | ((in[7 + inpos]) << 23); + out[4 + outpos] = ((in[7 + inpos] & 131071) >>> (17 - 8)) + | ((in[8 + inpos] & 131071) << 8) + | ((in[9 + inpos]) << 25); + out[5 + outpos] = ((in[9 + inpos] & 131071) >>> (17 - 10)) + | ((in[10 + inpos] & 131071) << 10) + | ((in[11 + inpos]) << 27); + out[6 + outpos] = ((in[11 + inpos] & 131071) >>> (17 - 12)) + | ((in[12 + inpos] & 131071) << 12) + | ((in[13 + inpos]) << 29); + out[7 + outpos] = ((in[13 + inpos] & 131071) >>> (17 - 14)) + | ((in[14 + inpos] & 131071) << 14) + | ((in[15 + inpos]) << 31); + out[8 + outpos] = ((in[15 + inpos] & 131071) >>> (17 - 16)) | ((in[16 + inpos]) << 16); - out[9 + outpos] = ((in[16 + inpos]) >>> (17 - 1)) - | ((in[17 + inpos]) << 1) | ((in[18 + inpos]) << 18); - out[10 + outpos] = ((in[18 + inpos]) >>> (17 - 3)) - | ((in[19 + inpos]) << 3) | ((in[20 + inpos]) << 20); - out[11 + outpos] = ((in[20 + inpos]) >>> (17 - 5)) - | ((in[21 + inpos]) << 5) | ((in[22 + inpos]) << 22); - out[12 + outpos] = ((in[22 + inpos]) >>> (17 - 7)) - | ((in[23 + inpos]) << 7) | ((in[24 + inpos]) << 24); - out[13 + outpos] = ((in[24 + inpos]) >>> (17 - 9)) - | ((in[25 + inpos]) << 9) | ((in[26 + inpos]) << 26); - out[14 + outpos] = ((in[26 + inpos]) >>> (17 - 11)) - | ((in[27 + inpos]) << 11) | ((in[28 + inpos]) << 28); - out[15 + outpos] = ((in[28 + inpos]) >>> (17 - 13)) - | ((in[29 + inpos]) << 13) | ((in[30 + inpos]) << 30); - out[16 + outpos] = ((in[30 + inpos]) >>> (17 - 15)) + out[9 + outpos] = ((in[16 + inpos] & 131071) >>> (17 - 1)) + | ((in[17 + inpos] & 131071) << 1) + | ((in[18 + inpos]) << 18); + out[10 + outpos] = ((in[18 + inpos] & 131071) >>> (17 - 3)) + | ((in[19 + inpos] & 131071) << 3) + | ((in[20 + inpos]) << 20); + out[11 + outpos] = ((in[20 + inpos] & 131071) >>> (17 - 5)) + | ((in[21 + inpos] & 131071) << 5) + | ((in[22 + inpos]) << 22); + out[12 + outpos] = ((in[22 + inpos] & 131071) >>> (17 - 7)) + | ((in[23 + inpos] & 131071) << 7) + | ((in[24 + inpos]) << 24); + out[13 + outpos] = ((in[24 + inpos] & 131071) >>> (17 - 9)) + | ((in[25 + inpos] & 131071) << 9) + | ((in[26 + inpos]) << 26); + out[14 + outpos] = ((in[26 + inpos] & 131071) >>> (17 - 11)) + | ((in[27 + inpos] & 131071) << 11) + | ((in[28 + inpos]) << 28); + out[15 + outpos] = ((in[28 + inpos] & 131071) >>> (17 - 13)) + | ((in[29 + inpos] & 131071) << 13) + | ((in[30 + inpos]) << 30); + out[16 + outpos] = ((in[30 + inpos] & 131071) >>> (17 - 15)) | ((in[31 + inpos]) << 15); } - protected static void fastpackwithoutmask18(final int[] in, int inpos, + protected static void fastpack18(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 18); - out[1 + outpos] = ((in[1 + inpos]) >>> (18 - 4)) - | ((in[2 + inpos]) << 4) | ((in[3 + inpos]) << 22); - out[2 + outpos] = ((in[3 + inpos]) >>> (18 - 8)) - | ((in[4 + inpos]) << 8) | ((in[5 + inpos]) << 26); - out[3 + outpos] = ((in[5 + inpos]) >>> (18 - 12)) - | ((in[6 + inpos]) << 12) | ((in[7 + inpos]) << 30); - out[4 + outpos] = ((in[7 + inpos]) >>> (18 - 16)) + out[0 + outpos] = (in[0 + inpos] & 262143) + | ((in[1 + inpos]) << 18); + out[1 + outpos] = ((in[1 + inpos] & 262143) >>> (18 - 4)) + | ((in[2 + inpos] & 262143) << 4) + | ((in[3 + inpos]) << 22); + out[2 + outpos] = ((in[3 + inpos] & 262143) >>> (18 - 8)) + | ((in[4 + inpos] & 262143) << 8) + | ((in[5 + inpos]) << 26); + out[3 + outpos] = ((in[5 + inpos] & 262143) >>> (18 - 12)) + | ((in[6 + inpos] & 262143) << 12) + | ((in[7 + inpos]) << 30); + out[4 + outpos] = ((in[7 + inpos] & 262143) >>> (18 - 16)) | ((in[8 + inpos]) << 16); - out[5 + outpos] = ((in[8 + inpos]) >>> (18 - 2)) - | ((in[9 + inpos]) << 2) | ((in[10 + inpos]) << 20); - out[6 + outpos] = ((in[10 + inpos]) >>> (18 - 6)) - | ((in[11 + inpos]) << 6) | ((in[12 + inpos]) << 24); - out[7 + outpos] = ((in[12 + inpos]) >>> (18 - 10)) - | ((in[13 + inpos]) << 10) | ((in[14 + inpos]) << 28); - out[8 + outpos] = ((in[14 + inpos]) >>> (18 - 14)) + out[5 + outpos] = ((in[8 + inpos] & 262143) >>> (18 - 2)) + | ((in[9 + inpos] & 262143) << 2) + | ((in[10 + inpos]) << 20); + out[6 + outpos] = ((in[10 + inpos] & 262143) >>> (18 - 6)) + | ((in[11 + inpos] & 262143) << 6) + | ((in[12 + inpos]) << 24); + out[7 + outpos] = ((in[12 + inpos] & 262143) >>> (18 - 10)) + | ((in[13 + inpos] & 262143) << 10) + | ((in[14 + inpos]) << 28); + out[8 + outpos] = ((in[14 + inpos] & 262143) >>> (18 - 14)) | ((in[15 + inpos]) << 14); - out[9 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 18); - out[10 + outpos] = ((in[17 + inpos]) >>> (18 - 4)) - | ((in[18 + inpos]) << 4) | ((in[19 + inpos]) << 22); - out[11 + outpos] = ((in[19 + inpos]) >>> (18 - 8)) - | ((in[20 + inpos]) << 8) | ((in[21 + inpos]) << 26); - out[12 + outpos] = ((in[21 + inpos]) >>> (18 - 12)) - | ((in[22 + inpos]) << 12) | ((in[23 + inpos]) << 30); - out[13 + outpos] = ((in[23 + inpos]) >>> (18 - 16)) + out[9 + outpos] = (in[16 + inpos] & 262143) + | ((in[17 + inpos]) << 18); + out[10 + outpos] = ((in[17 + inpos] & 262143) >>> (18 - 4)) + | ((in[18 + inpos] & 262143) << 4) + | ((in[19 + inpos]) << 22); + out[11 + outpos] = ((in[19 + inpos] & 262143) >>> (18 - 8)) + | ((in[20 + inpos] & 262143) << 8) + | ((in[21 + inpos]) << 26); + out[12 + outpos] = ((in[21 + inpos] & 262143) >>> (18 - 12)) + | ((in[22 + inpos] & 262143) << 12) + | ((in[23 + inpos]) << 30); + out[13 + outpos] = ((in[23 + inpos] & 262143) >>> (18 - 16)) | ((in[24 + inpos]) << 16); - out[14 + outpos] = ((in[24 + inpos]) >>> (18 - 2)) - | ((in[25 + inpos]) << 2) | ((in[26 + inpos]) << 20); - out[15 + outpos] = ((in[26 + inpos]) >>> (18 - 6)) - | ((in[27 + inpos]) << 6) | ((in[28 + inpos]) << 24); - out[16 + outpos] = ((in[28 + inpos]) >>> (18 - 10)) - | ((in[29 + inpos]) << 10) | ((in[30 + inpos]) << 28); - out[17 + outpos] = ((in[30 + inpos]) >>> (18 - 14)) + out[14 + outpos] = ((in[24 + inpos] & 262143) >>> (18 - 2)) + | ((in[25 + inpos] & 262143) << 2) + | ((in[26 + inpos]) << 20); + out[15 + outpos] = ((in[26 + inpos] & 262143) >>> (18 - 6)) + | ((in[27 + inpos] & 262143) << 6) + | ((in[28 + inpos]) << 24); + out[16 + outpos] = ((in[28 + inpos] & 262143) >>> (18 - 10)) + | ((in[29 + inpos] & 262143) << 10) + | ((in[30 + inpos]) << 28); + out[17 + outpos] = ((in[30 + inpos] & 262143) >>> (18 - 14)) | ((in[31 + inpos]) << 14); } - protected static void fastpackwithoutmask19(final int[] in, int inpos, + protected static void fastpack19(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 19); - out[1 + outpos] = ((in[1 + inpos]) >>> (19 - 6)) - | ((in[2 + inpos]) << 6) | ((in[3 + inpos]) << 25); - out[2 + outpos] = ((in[3 + inpos]) >>> (19 - 12)) - | ((in[4 + inpos]) << 12) | ((in[5 + inpos]) << 31); - out[3 + outpos] = ((in[5 + inpos]) >>> (19 - 18)) + out[0 + outpos] = (in[0 + inpos] & 524287) + | ((in[1 + inpos]) << 19); + out[1 + outpos] = ((in[1 + inpos] & 524287) >>> (19 - 6)) + | ((in[2 + inpos] & 524287) << 6) + | ((in[3 + inpos]) << 25); + out[2 + outpos] = ((in[3 + inpos] & 524287) >>> (19 - 12)) + | ((in[4 + inpos] & 524287) << 12) + | ((in[5 + inpos]) << 31); + out[3 + outpos] = ((in[5 + inpos] & 524287) >>> (19 - 18)) | ((in[6 + inpos]) << 18); - out[4 + outpos] = ((in[6 + inpos]) >>> (19 - 5)) - | ((in[7 + inpos]) << 5) | ((in[8 + inpos]) << 24); - out[5 + outpos] = ((in[8 + inpos]) >>> (19 - 11)) - | ((in[9 + inpos]) << 11) | ((in[10 + inpos]) << 30); - out[6 + outpos] = ((in[10 + inpos]) >>> (19 - 17)) + out[4 + outpos] = ((in[6 + inpos] & 524287) >>> (19 - 5)) + | ((in[7 + inpos] & 524287) << 5) + | ((in[8 + inpos]) << 24); + out[5 + outpos] = ((in[8 + inpos] & 524287) >>> (19 - 11)) + | ((in[9 + inpos] & 524287) << 11) + | ((in[10 + inpos]) << 30); + out[6 + outpos] = ((in[10 + inpos] & 524287) >>> (19 - 17)) | ((in[11 + inpos]) << 17); - out[7 + outpos] = ((in[11 + inpos]) >>> (19 - 4)) - | ((in[12 + inpos]) << 4) | ((in[13 + inpos]) << 23); - out[8 + outpos] = ((in[13 + inpos]) >>> (19 - 10)) - | ((in[14 + inpos]) << 10) | ((in[15 + inpos]) << 29); - out[9 + outpos] = ((in[15 + inpos]) >>> (19 - 16)) + out[7 + outpos] = ((in[11 + inpos] & 524287) >>> (19 - 4)) + | ((in[12 + inpos] & 524287) << 4) + | ((in[13 + inpos]) << 23); + out[8 + outpos] = ((in[13 + inpos] & 524287) >>> (19 - 10)) + | ((in[14 + inpos] & 524287) << 10) + | ((in[15 + inpos]) << 29); + out[9 + outpos] = ((in[15 + inpos] & 524287) >>> (19 - 16)) | ((in[16 + inpos]) << 16); - out[10 + outpos] = ((in[16 + inpos]) >>> (19 - 3)) - | ((in[17 + inpos]) << 3) | ((in[18 + inpos]) << 22); - out[11 + outpos] = ((in[18 + inpos]) >>> (19 - 9)) - | ((in[19 + inpos]) << 9) | ((in[20 + inpos]) << 28); - out[12 + outpos] = ((in[20 + inpos]) >>> (19 - 15)) + out[10 + outpos] = ((in[16 + inpos] & 524287) >>> (19 - 3)) + | ((in[17 + inpos] & 524287) << 3) + | ((in[18 + inpos]) << 22); + out[11 + outpos] = ((in[18 + inpos] & 524287) >>> (19 - 9)) + | ((in[19 + inpos] & 524287) << 9) + | ((in[20 + inpos]) << 28); + out[12 + outpos] = ((in[20 + inpos] & 524287) >>> (19 - 15)) | ((in[21 + inpos]) << 15); - out[13 + outpos] = ((in[21 + inpos]) >>> (19 - 2)) - | ((in[22 + inpos]) << 2) | ((in[23 + inpos]) << 21); - out[14 + outpos] = ((in[23 + inpos]) >>> (19 - 8)) - | ((in[24 + inpos]) << 8) | ((in[25 + inpos]) << 27); - out[15 + outpos] = ((in[25 + inpos]) >>> (19 - 14)) + out[13 + outpos] = ((in[21 + inpos] & 524287) >>> (19 - 2)) + | ((in[22 + inpos] & 524287) << 2) + | ((in[23 + inpos]) << 21); + out[14 + outpos] = ((in[23 + inpos] & 524287) >>> (19 - 8)) + | ((in[24 + inpos] & 524287) << 8) + | ((in[25 + inpos]) << 27); + out[15 + outpos] = ((in[25 + inpos] & 524287) >>> (19 - 14)) | ((in[26 + inpos]) << 14); - out[16 + outpos] = ((in[26 + inpos]) >>> (19 - 1)) - | ((in[27 + inpos]) << 1) | ((in[28 + inpos]) << 20); - out[17 + outpos] = ((in[28 + inpos]) >>> (19 - 7)) - | ((in[29 + inpos]) << 7) | ((in[30 + inpos]) << 26); - out[18 + outpos] = ((in[30 + inpos]) >>> (19 - 13)) - | ((in[31 + inpos]) << 13); - } - - protected static void fastpackwithoutmask20(final int[] in, int inpos, - final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 20); - out[1 + outpos] = ((in[1 + inpos]) >>> (20 - 8)) - | ((in[2 + inpos]) << 8) | ((in[3 + inpos]) << 28); - out[2 + outpos] = ((in[3 + inpos]) >>> (20 - 16)) + out[16 + outpos] = ((in[26 + inpos] & 524287) >>> (19 - 1)) + | ((in[27 + inpos] & 524287) << 1) + | ((in[28 + inpos]) << 20); + out[17 + outpos] = ((in[28 + inpos] & 524287) >>> (19 - 7)) + | ((in[29 + inpos] & 524287) << 7) + | ((in[30 + inpos]) << 26); + out[18 + outpos] = ((in[30 + inpos] & 524287) >>> (19 - 13)) + | ((in[31 + inpos]) << 13); + } + + protected static void fastpack2(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 3) + | ((in[1 + inpos] & 3) << 2) + | ((in[2 + inpos] & 3) << 4) + | ((in[3 + inpos] & 3) << 6) + | ((in[4 + inpos] & 3) << 8) + | ((in[5 + inpos] & 3) << 10) + | ((in[6 + inpos] & 3) << 12) + | ((in[7 + inpos] & 3) << 14) + | ((in[8 + inpos] & 3) << 16) + | ((in[9 + inpos] & 3) << 18) + | ((in[10 + inpos] & 3) << 20) + | ((in[11 + inpos] & 3) << 22) + | ((in[12 + inpos] & 3) << 24) + | ((in[13 + inpos] & 3) << 26) + | ((in[14 + inpos] & 3) << 28) + | ((in[15 + inpos]) << 30); + out[1 + outpos] = (in[16 + inpos] & 3) + | ((in[17 + inpos] & 3) << 2) + | ((in[18 + inpos] & 3) << 4) + | ((in[19 + inpos] & 3) << 6) + | ((in[20 + inpos] & 3) << 8) + | ((in[21 + inpos] & 3) << 10) + | ((in[22 + inpos] & 3) << 12) + | ((in[23 + inpos] & 3) << 14) + | ((in[24 + inpos] & 3) << 16) + | ((in[25 + inpos] & 3) << 18) + | ((in[26 + inpos] & 3) << 20) + | ((in[27 + inpos] & 3) << 22) + | ((in[28 + inpos] & 3) << 24) + | ((in[29 + inpos] & 3) << 26) + | ((in[30 + inpos] & 3) << 28) + | ((in[31 + inpos]) << 30); + } + + protected static void fastpack20(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 1048575) + | ((in[1 + inpos]) << 20); + out[1 + outpos] = ((in[1 + inpos] & 1048575) >>> (20 - 8)) + | ((in[2 + inpos] & 1048575) << 8) + | ((in[3 + inpos]) << 28); + out[2 + outpos] = ((in[3 + inpos] & 1048575) >>> (20 - 16)) | ((in[4 + inpos]) << 16); - out[3 + outpos] = ((in[4 + inpos]) >>> (20 - 4)) - | ((in[5 + inpos]) << 4) | ((in[6 + inpos]) << 24); - out[4 + outpos] = ((in[6 + inpos]) >>> (20 - 12)) + out[3 + outpos] = ((in[4 + inpos] & 1048575) >>> (20 - 4)) + | ((in[5 + inpos] & 1048575) << 4) + | ((in[6 + inpos]) << 24); + out[4 + outpos] = ((in[6 + inpos] & 1048575) >>> (20 - 12)) | ((in[7 + inpos]) << 12); - out[5 + outpos] = in[8 + inpos] | ((in[9 + inpos]) << 20); - out[6 + outpos] = ((in[9 + inpos]) >>> (20 - 8)) - | ((in[10 + inpos]) << 8) | ((in[11 + inpos]) << 28); - out[7 + outpos] = ((in[11 + inpos]) >>> (20 - 16)) + out[5 + outpos] = (in[8 + inpos] & 1048575) + | ((in[9 + inpos]) << 20); + out[6 + outpos] = ((in[9 + inpos] & 1048575) >>> (20 - 8)) + | ((in[10 + inpos] & 1048575) << 8) + | ((in[11 + inpos]) << 28); + out[7 + outpos] = ((in[11 + inpos] & 1048575) >>> (20 - 16)) | ((in[12 + inpos]) << 16); - out[8 + outpos] = ((in[12 + inpos]) >>> (20 - 4)) - | ((in[13 + inpos]) << 4) | ((in[14 + inpos]) << 24); - out[9 + outpos] = ((in[14 + inpos]) >>> (20 - 12)) + out[8 + outpos] = ((in[12 + inpos] & 1048575) >>> (20 - 4)) + | ((in[13 + inpos] & 1048575) << 4) + | ((in[14 + inpos]) << 24); + out[9 + outpos] = ((in[14 + inpos] & 1048575) >>> (20 - 12)) | ((in[15 + inpos]) << 12); - out[10 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 20); - out[11 + outpos] = ((in[17 + inpos]) >>> (20 - 8)) - | ((in[18 + inpos]) << 8) | ((in[19 + inpos]) << 28); - out[12 + outpos] = ((in[19 + inpos]) >>> (20 - 16)) + out[10 + outpos] = (in[16 + inpos] & 1048575) + | ((in[17 + inpos]) << 20); + out[11 + outpos] = ((in[17 + inpos] & 1048575) >>> (20 - 8)) + | ((in[18 + inpos] & 1048575) << 8) + | ((in[19 + inpos]) << 28); + out[12 + outpos] = ((in[19 + inpos] & 1048575) >>> (20 - 16)) | ((in[20 + inpos]) << 16); - out[13 + outpos] = ((in[20 + inpos]) >>> (20 - 4)) - | ((in[21 + inpos]) << 4) | ((in[22 + inpos]) << 24); - out[14 + outpos] = ((in[22 + inpos]) >>> (20 - 12)) + out[13 + outpos] = ((in[20 + inpos] & 1048575) >>> (20 - 4)) + | ((in[21 + inpos] & 1048575) << 4) + | ((in[22 + inpos]) << 24); + out[14 + outpos] = ((in[22 + inpos] & 1048575) >>> (20 - 12)) | ((in[23 + inpos]) << 12); - out[15 + outpos] = in[24 + inpos] | ((in[25 + inpos]) << 20); - out[16 + outpos] = ((in[25 + inpos]) >>> (20 - 8)) - | ((in[26 + inpos]) << 8) | ((in[27 + inpos]) << 28); - out[17 + outpos] = ((in[27 + inpos]) >>> (20 - 16)) + out[15 + outpos] = (in[24 + inpos] & 1048575) + | ((in[25 + inpos]) << 20); + out[16 + outpos] = ((in[25 + inpos] & 1048575) >>> (20 - 8)) + | ((in[26 + inpos] & 1048575) << 8) + | ((in[27 + inpos]) << 28); + out[17 + outpos] = ((in[27 + inpos] & 1048575) >>> (20 - 16)) | ((in[28 + inpos]) << 16); - out[18 + outpos] = ((in[28 + inpos]) >>> (20 - 4)) - | ((in[29 + inpos]) << 4) | ((in[30 + inpos]) << 24); - out[19 + outpos] = ((in[30 + inpos]) >>> (20 - 12)) + out[18 + outpos] = ((in[28 + inpos] & 1048575) >>> (20 - 4)) + | ((in[29 + inpos] & 1048575) << 4) + | ((in[30 + inpos]) << 24); + out[19 + outpos] = ((in[30 + inpos] & 1048575) >>> (20 - 12)) | ((in[31 + inpos]) << 12); } - protected static void fastpackwithoutmask21(final int[] in, int inpos, + protected static void fastpack21(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 21); - out[1 + outpos] = ((in[1 + inpos]) >>> (21 - 10)) - | ((in[2 + inpos]) << 10) | ((in[3 + inpos]) << 31); - out[2 + outpos] = ((in[3 + inpos]) >>> (21 - 20)) + out[0 + outpos] = (in[0 + inpos] & 2097151) + | ((in[1 + inpos]) << 21); + out[1 + outpos] = ((in[1 + inpos] & 2097151) >>> (21 - 10)) + | ((in[2 + inpos] & 2097151) << 10) + | ((in[3 + inpos]) << 31); + out[2 + outpos] = ((in[3 + inpos] & 2097151) >>> (21 - 20)) | ((in[4 + inpos]) << 20); - out[3 + outpos] = ((in[4 + inpos]) >>> (21 - 9)) - | ((in[5 + inpos]) << 9) | ((in[6 + inpos]) << 30); - out[4 + outpos] = ((in[6 + inpos]) >>> (21 - 19)) + out[3 + outpos] = ((in[4 + inpos] & 2097151) >>> (21 - 9)) + | ((in[5 + inpos] & 2097151) << 9) + | ((in[6 + inpos]) << 30); + out[4 + outpos] = ((in[6 + inpos] & 2097151) >>> (21 - 19)) | ((in[7 + inpos]) << 19); - out[5 + outpos] = ((in[7 + inpos]) >>> (21 - 8)) - | ((in[8 + inpos]) << 8) | ((in[9 + inpos]) << 29); - out[6 + outpos] = ((in[9 + inpos]) >>> (21 - 18)) + out[5 + outpos] = ((in[7 + inpos] & 2097151) >>> (21 - 8)) + | ((in[8 + inpos] & 2097151) << 8) + | ((in[9 + inpos]) << 29); + out[6 + outpos] = ((in[9 + inpos] & 2097151) >>> (21 - 18)) | ((in[10 + inpos]) << 18); - out[7 + outpos] = ((in[10 + inpos]) >>> (21 - 7)) - | ((in[11 + inpos]) << 7) | ((in[12 + inpos]) << 28); - out[8 + outpos] = ((in[12 + inpos]) >>> (21 - 17)) + out[7 + outpos] = ((in[10 + inpos] & 2097151) >>> (21 - 7)) + | ((in[11 + inpos] & 2097151) << 7) + | ((in[12 + inpos]) << 28); + out[8 + outpos] = ((in[12 + inpos] & 2097151) >>> (21 - 17)) | ((in[13 + inpos]) << 17); - out[9 + outpos] = ((in[13 + inpos]) >>> (21 - 6)) - | ((in[14 + inpos]) << 6) | ((in[15 + inpos]) << 27); - out[10 + outpos] = ((in[15 + inpos]) >>> (21 - 16)) + out[9 + outpos] = ((in[13 + inpos] & 2097151) >>> (21 - 6)) + | ((in[14 + inpos] & 2097151) << 6) + | ((in[15 + inpos]) << 27); + out[10 + outpos] = ((in[15 + inpos] & 2097151) >>> (21 - 16)) | ((in[16 + inpos]) << 16); - out[11 + outpos] = ((in[16 + inpos]) >>> (21 - 5)) - | ((in[17 + inpos]) << 5) | ((in[18 + inpos]) << 26); - out[12 + outpos] = ((in[18 + inpos]) >>> (21 - 15)) + out[11 + outpos] = ((in[16 + inpos] & 2097151) >>> (21 - 5)) + | ((in[17 + inpos] & 2097151) << 5) + | ((in[18 + inpos]) << 26); + out[12 + outpos] = ((in[18 + inpos] & 2097151) >>> (21 - 15)) | ((in[19 + inpos]) << 15); - out[13 + outpos] = ((in[19 + inpos]) >>> (21 - 4)) - | ((in[20 + inpos]) << 4) | ((in[21 + inpos]) << 25); - out[14 + outpos] = ((in[21 + inpos]) >>> (21 - 14)) + out[13 + outpos] = ((in[19 + inpos] & 2097151) >>> (21 - 4)) + | ((in[20 + inpos] & 2097151) << 4) + | ((in[21 + inpos]) << 25); + out[14 + outpos] = ((in[21 + inpos] & 2097151) >>> (21 - 14)) | ((in[22 + inpos]) << 14); - out[15 + outpos] = ((in[22 + inpos]) >>> (21 - 3)) - | ((in[23 + inpos]) << 3) | ((in[24 + inpos]) << 24); - out[16 + outpos] = ((in[24 + inpos]) >>> (21 - 13)) + out[15 + outpos] = ((in[22 + inpos] & 2097151) >>> (21 - 3)) + | ((in[23 + inpos] & 2097151) << 3) + | ((in[24 + inpos]) << 24); + out[16 + outpos] = ((in[24 + inpos] & 2097151) >>> (21 - 13)) | ((in[25 + inpos]) << 13); - out[17 + outpos] = ((in[25 + inpos]) >>> (21 - 2)) - | ((in[26 + inpos]) << 2) | ((in[27 + inpos]) << 23); - out[18 + outpos] = ((in[27 + inpos]) >>> (21 - 12)) + out[17 + outpos] = ((in[25 + inpos] & 2097151) >>> (21 - 2)) + | ((in[26 + inpos] & 2097151) << 2) + | ((in[27 + inpos]) << 23); + out[18 + outpos] = ((in[27 + inpos] & 2097151) >>> (21 - 12)) | ((in[28 + inpos]) << 12); - out[19 + outpos] = ((in[28 + inpos]) >>> (21 - 1)) - | ((in[29 + inpos]) << 1) | ((in[30 + inpos]) << 22); - out[20 + outpos] = ((in[30 + inpos]) >>> (21 - 11)) + out[19 + outpos] = ((in[28 + inpos] & 2097151) >>> (21 - 1)) + | ((in[29 + inpos] & 2097151) << 1) + | ((in[30 + inpos]) << 22); + out[20 + outpos] = ((in[30 + inpos] & 2097151) >>> (21 - 11)) | ((in[31 + inpos]) << 11); } - protected static void fastpackwithoutmask22(final int[] in, int inpos, + protected static void fastpack22(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 22); - out[1 + outpos] = ((in[1 + inpos]) >>> (22 - 12)) + out[0 + outpos] = (in[0 + inpos] & 4194303) + | ((in[1 + inpos]) << 22); + out[1 + outpos] = ((in[1 + inpos] & 4194303) >>> (22 - 12)) | ((in[2 + inpos]) << 12); - out[2 + outpos] = ((in[2 + inpos]) >>> (22 - 2)) - | ((in[3 + inpos]) << 2) | ((in[4 + inpos]) << 24); - out[3 + outpos] = ((in[4 + inpos]) >>> (22 - 14)) + out[2 + outpos] = ((in[2 + inpos] & 4194303) >>> (22 - 2)) + | ((in[3 + inpos] & 4194303) << 2) + | ((in[4 + inpos]) << 24); + out[3 + outpos] = ((in[4 + inpos] & 4194303) >>> (22 - 14)) | ((in[5 + inpos]) << 14); - out[4 + outpos] = ((in[5 + inpos]) >>> (22 - 4)) - | ((in[6 + inpos]) << 4) | ((in[7 + inpos]) << 26); - out[5 + outpos] = ((in[7 + inpos]) >>> (22 - 16)) + out[4 + outpos] = ((in[5 + inpos] & 4194303) >>> (22 - 4)) + | ((in[6 + inpos] & 4194303) << 4) + | ((in[7 + inpos]) << 26); + out[5 + outpos] = ((in[7 + inpos] & 4194303) >>> (22 - 16)) | ((in[8 + inpos]) << 16); - out[6 + outpos] = ((in[8 + inpos]) >>> (22 - 6)) - | ((in[9 + inpos]) << 6) | ((in[10 + inpos]) << 28); - out[7 + outpos] = ((in[10 + inpos]) >>> (22 - 18)) + out[6 + outpos] = ((in[8 + inpos] & 4194303) >>> (22 - 6)) + | ((in[9 + inpos] & 4194303) << 6) + | ((in[10 + inpos]) << 28); + out[7 + outpos] = ((in[10 + inpos] & 4194303) >>> (22 - 18)) | ((in[11 + inpos]) << 18); - out[8 + outpos] = ((in[11 + inpos]) >>> (22 - 8)) - | ((in[12 + inpos]) << 8) | ((in[13 + inpos]) << 30); - out[9 + outpos] = ((in[13 + inpos]) >>> (22 - 20)) + out[8 + outpos] = ((in[11 + inpos] & 4194303) >>> (22 - 8)) + | ((in[12 + inpos] & 4194303) << 8) + | ((in[13 + inpos]) << 30); + out[9 + outpos] = ((in[13 + inpos] & 4194303) >>> (22 - 20)) | ((in[14 + inpos]) << 20); - out[10 + outpos] = ((in[14 + inpos]) >>> (22 - 10)) + out[10 + outpos] = ((in[14 + inpos] & 4194303) >>> (22 - 10)) | ((in[15 + inpos]) << 10); - out[11 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 22); - out[12 + outpos] = ((in[17 + inpos]) >>> (22 - 12)) + out[11 + outpos] = (in[16 + inpos] & 4194303) + | ((in[17 + inpos]) << 22); + out[12 + outpos] = ((in[17 + inpos] & 4194303) >>> (22 - 12)) | ((in[18 + inpos]) << 12); - out[13 + outpos] = ((in[18 + inpos]) >>> (22 - 2)) - | ((in[19 + inpos]) << 2) | ((in[20 + inpos]) << 24); - out[14 + outpos] = ((in[20 + inpos]) >>> (22 - 14)) + out[13 + outpos] = ((in[18 + inpos] & 4194303) >>> (22 - 2)) + | ((in[19 + inpos] & 4194303) << 2) + | ((in[20 + inpos]) << 24); + out[14 + outpos] = ((in[20 + inpos] & 4194303) >>> (22 - 14)) | ((in[21 + inpos]) << 14); - out[15 + outpos] = ((in[21 + inpos]) >>> (22 - 4)) - | ((in[22 + inpos]) << 4) | ((in[23 + inpos]) << 26); - out[16 + outpos] = ((in[23 + inpos]) >>> (22 - 16)) + out[15 + outpos] = ((in[21 + inpos] & 4194303) >>> (22 - 4)) + | ((in[22 + inpos] & 4194303) << 4) + | ((in[23 + inpos]) << 26); + out[16 + outpos] = ((in[23 + inpos] & 4194303) >>> (22 - 16)) | ((in[24 + inpos]) << 16); - out[17 + outpos] = ((in[24 + inpos]) >>> (22 - 6)) - | ((in[25 + inpos]) << 6) | ((in[26 + inpos]) << 28); - out[18 + outpos] = ((in[26 + inpos]) >>> (22 - 18)) + out[17 + outpos] = ((in[24 + inpos] & 4194303) >>> (22 - 6)) + | ((in[25 + inpos] & 4194303) << 6) + | ((in[26 + inpos]) << 28); + out[18 + outpos] = ((in[26 + inpos] & 4194303) >>> (22 - 18)) | ((in[27 + inpos]) << 18); - out[19 + outpos] = ((in[27 + inpos]) >>> (22 - 8)) - | ((in[28 + inpos]) << 8) | ((in[29 + inpos]) << 30); - out[20 + outpos] = ((in[29 + inpos]) >>> (22 - 20)) + out[19 + outpos] = ((in[27 + inpos] & 4194303) >>> (22 - 8)) + | ((in[28 + inpos] & 4194303) << 8) + | ((in[29 + inpos]) << 30); + out[20 + outpos] = ((in[29 + inpos] & 4194303) >>> (22 - 20)) | ((in[30 + inpos]) << 20); - out[21 + outpos] = ((in[30 + inpos]) >>> (22 - 10)) + out[21 + outpos] = ((in[30 + inpos] & 4194303) >>> (22 - 10)) | ((in[31 + inpos]) << 10); } - protected static void fastpackwithoutmask23(final int[] in, int inpos, + protected static void fastpack23(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 23); - out[1 + outpos] = ((in[1 + inpos]) >>> (23 - 14)) + out[0 + outpos] = (in[0 + inpos] & 8388607) + | ((in[1 + inpos]) << 23); + out[1 + outpos] = ((in[1 + inpos] & 8388607) >>> (23 - 14)) | ((in[2 + inpos]) << 14); - out[2 + outpos] = ((in[2 + inpos]) >>> (23 - 5)) - | ((in[3 + inpos]) << 5) | ((in[4 + inpos]) << 28); - out[3 + outpos] = ((in[4 + inpos]) >>> (23 - 19)) + out[2 + outpos] = ((in[2 + inpos] & 8388607) >>> (23 - 5)) + | ((in[3 + inpos] & 8388607) << 5) + | ((in[4 + inpos]) << 28); + out[3 + outpos] = ((in[4 + inpos] & 8388607) >>> (23 - 19)) | ((in[5 + inpos]) << 19); - out[4 + outpos] = ((in[5 + inpos]) >>> (23 - 10)) + out[4 + outpos] = ((in[5 + inpos] & 8388607) >>> (23 - 10)) | ((in[6 + inpos]) << 10); - out[5 + outpos] = ((in[6 + inpos]) >>> (23 - 1)) - | ((in[7 + inpos]) << 1) | ((in[8 + inpos]) << 24); - out[6 + outpos] = ((in[8 + inpos]) >>> (23 - 15)) + out[5 + outpos] = ((in[6 + inpos] & 8388607) >>> (23 - 1)) + | ((in[7 + inpos] & 8388607) << 1) + | ((in[8 + inpos]) << 24); + out[6 + outpos] = ((in[8 + inpos] & 8388607) >>> (23 - 15)) | ((in[9 + inpos]) << 15); - out[7 + outpos] = ((in[9 + inpos]) >>> (23 - 6)) - | ((in[10 + inpos]) << 6) | ((in[11 + inpos]) << 29); - out[8 + outpos] = ((in[11 + inpos]) >>> (23 - 20)) + out[7 + outpos] = ((in[9 + inpos] & 8388607) >>> (23 - 6)) + | ((in[10 + inpos] & 8388607) << 6) + | ((in[11 + inpos]) << 29); + out[8 + outpos] = ((in[11 + inpos] & 8388607) >>> (23 - 20)) | ((in[12 + inpos]) << 20); - out[9 + outpos] = ((in[12 + inpos]) >>> (23 - 11)) + out[9 + outpos] = ((in[12 + inpos] & 8388607) >>> (23 - 11)) | ((in[13 + inpos]) << 11); - out[10 + outpos] = ((in[13 + inpos]) >>> (23 - 2)) - | ((in[14 + inpos]) << 2) | ((in[15 + inpos]) << 25); - out[11 + outpos] = ((in[15 + inpos]) >>> (23 - 16)) + out[10 + outpos] = ((in[13 + inpos] & 8388607) >>> (23 - 2)) + | ((in[14 + inpos] & 8388607) << 2) + | ((in[15 + inpos]) << 25); + out[11 + outpos] = ((in[15 + inpos] & 8388607) >>> (23 - 16)) | ((in[16 + inpos]) << 16); - out[12 + outpos] = ((in[16 + inpos]) >>> (23 - 7)) - | ((in[17 + inpos]) << 7) | ((in[18 + inpos]) << 30); - out[13 + outpos] = ((in[18 + inpos]) >>> (23 - 21)) + out[12 + outpos] = ((in[16 + inpos] & 8388607) >>> (23 - 7)) + | ((in[17 + inpos] & 8388607) << 7) + | ((in[18 + inpos]) << 30); + out[13 + outpos] = ((in[18 + inpos] & 8388607) >>> (23 - 21)) | ((in[19 + inpos]) << 21); - out[14 + outpos] = ((in[19 + inpos]) >>> (23 - 12)) + out[14 + outpos] = ((in[19 + inpos] & 8388607) >>> (23 - 12)) | ((in[20 + inpos]) << 12); - out[15 + outpos] = ((in[20 + inpos]) >>> (23 - 3)) - | ((in[21 + inpos]) << 3) | ((in[22 + inpos]) << 26); - out[16 + outpos] = ((in[22 + inpos]) >>> (23 - 17)) + out[15 + outpos] = ((in[20 + inpos] & 8388607) >>> (23 - 3)) + | ((in[21 + inpos] & 8388607) << 3) + | ((in[22 + inpos]) << 26); + out[16 + outpos] = ((in[22 + inpos] & 8388607) >>> (23 - 17)) | ((in[23 + inpos]) << 17); - out[17 + outpos] = ((in[23 + inpos]) >>> (23 - 8)) - | ((in[24 + inpos]) << 8) | ((in[25 + inpos]) << 31); - out[18 + outpos] = ((in[25 + inpos]) >>> (23 - 22)) + out[17 + outpos] = ((in[23 + inpos] & 8388607) >>> (23 - 8)) + | ((in[24 + inpos] & 8388607) << 8) + | ((in[25 + inpos]) << 31); + out[18 + outpos] = ((in[25 + inpos] & 8388607) >>> (23 - 22)) | ((in[26 + inpos]) << 22); - out[19 + outpos] = ((in[26 + inpos]) >>> (23 - 13)) + out[19 + outpos] = ((in[26 + inpos] & 8388607) >>> (23 - 13)) | ((in[27 + inpos]) << 13); - out[20 + outpos] = ((in[27 + inpos]) >>> (23 - 4)) - | ((in[28 + inpos]) << 4) | ((in[29 + inpos]) << 27); - out[21 + outpos] = ((in[29 + inpos]) >>> (23 - 18)) + out[20 + outpos] = ((in[27 + inpos] & 8388607) >>> (23 - 4)) + | ((in[28 + inpos] & 8388607) << 4) + | ((in[29 + inpos]) << 27); + out[21 + outpos] = ((in[29 + inpos] & 8388607) >>> (23 - 18)) | ((in[30 + inpos]) << 18); - out[22 + outpos] = ((in[30 + inpos]) >>> (23 - 9)) + out[22 + outpos] = ((in[30 + inpos] & 8388607) >>> (23 - 9)) | ((in[31 + inpos]) << 9); } - protected static void fastpackwithoutmask24(final int[] in, int inpos, + protected static void fastpack24(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 24); - out[1 + outpos] = ((in[1 + inpos]) >>> (24 - 16)) + out[0 + outpos] = (in[0 + inpos] & 16777215) + | ((in[1 + inpos]) << 24); + out[1 + outpos] = ((in[1 + inpos] & 16777215) >>> (24 - 16)) | ((in[2 + inpos]) << 16); - out[2 + outpos] = ((in[2 + inpos]) >>> (24 - 8)) + out[2 + outpos] = ((in[2 + inpos] & 16777215) >>> (24 - 8)) | ((in[3 + inpos]) << 8); - out[3 + outpos] = in[4 + inpos] | ((in[5 + inpos]) << 24); - out[4 + outpos] = ((in[5 + inpos]) >>> (24 - 16)) + out[3 + outpos] = (in[4 + inpos] & 16777215) + | ((in[5 + inpos]) << 24); + out[4 + outpos] = ((in[5 + inpos] & 16777215) >>> (24 - 16)) | ((in[6 + inpos]) << 16); - out[5 + outpos] = ((in[6 + inpos]) >>> (24 - 8)) + out[5 + outpos] = ((in[6 + inpos] & 16777215) >>> (24 - 8)) | ((in[7 + inpos]) << 8); - out[6 + outpos] = in[8 + inpos] | ((in[9 + inpos]) << 24); - out[7 + outpos] = ((in[9 + inpos]) >>> (24 - 16)) + out[6 + outpos] = (in[8 + inpos] & 16777215) + | ((in[9 + inpos]) << 24); + out[7 + outpos] = ((in[9 + inpos] & 16777215) >>> (24 - 16)) | ((in[10 + inpos]) << 16); - out[8 + outpos] = ((in[10 + inpos]) >>> (24 - 8)) + out[8 + outpos] = ((in[10 + inpos] & 16777215) >>> (24 - 8)) | ((in[11 + inpos]) << 8); - out[9 + outpos] = in[12 + inpos] | ((in[13 + inpos]) << 24); - out[10 + outpos] = ((in[13 + inpos]) >>> (24 - 16)) + out[9 + outpos] = (in[12 + inpos] & 16777215) + | ((in[13 + inpos]) << 24); + out[10 + outpos] = ((in[13 + inpos] & 16777215) >>> (24 - 16)) | ((in[14 + inpos]) << 16); - out[11 + outpos] = ((in[14 + inpos]) >>> (24 - 8)) + out[11 + outpos] = ((in[14 + inpos] & 16777215) >>> (24 - 8)) | ((in[15 + inpos]) << 8); - out[12 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 24); - out[13 + outpos] = ((in[17 + inpos]) >>> (24 - 16)) + out[12 + outpos] = (in[16 + inpos] & 16777215) + | ((in[17 + inpos]) << 24); + out[13 + outpos] = ((in[17 + inpos] & 16777215) >>> (24 - 16)) | ((in[18 + inpos]) << 16); - out[14 + outpos] = ((in[18 + inpos]) >>> (24 - 8)) + out[14 + outpos] = ((in[18 + inpos] & 16777215) >>> (24 - 8)) | ((in[19 + inpos]) << 8); - out[15 + outpos] = in[20 + inpos] | ((in[21 + inpos]) << 24); - out[16 + outpos] = ((in[21 + inpos]) >>> (24 - 16)) + out[15 + outpos] = (in[20 + inpos] & 16777215) + | ((in[21 + inpos]) << 24); + out[16 + outpos] = ((in[21 + inpos] & 16777215) >>> (24 - 16)) | ((in[22 + inpos]) << 16); - out[17 + outpos] = ((in[22 + inpos]) >>> (24 - 8)) + out[17 + outpos] = ((in[22 + inpos] & 16777215) >>> (24 - 8)) | ((in[23 + inpos]) << 8); - out[18 + outpos] = in[24 + inpos] | ((in[25 + inpos]) << 24); - out[19 + outpos] = ((in[25 + inpos]) >>> (24 - 16)) + out[18 + outpos] = (in[24 + inpos] & 16777215) + | ((in[25 + inpos]) << 24); + out[19 + outpos] = ((in[25 + inpos] & 16777215) >>> (24 - 16)) | ((in[26 + inpos]) << 16); - out[20 + outpos] = ((in[26 + inpos]) >>> (24 - 8)) + out[20 + outpos] = ((in[26 + inpos] & 16777215) >>> (24 - 8)) | ((in[27 + inpos]) << 8); - out[21 + outpos] = in[28 + inpos] | ((in[29 + inpos]) << 24); - out[22 + outpos] = ((in[29 + inpos]) >>> (24 - 16)) + out[21 + outpos] = (in[28 + inpos] & 16777215) + | ((in[29 + inpos]) << 24); + out[22 + outpos] = ((in[29 + inpos] & 16777215) >>> (24 - 16)) | ((in[30 + inpos]) << 16); - out[23 + outpos] = ((in[30 + inpos]) >>> (24 - 8)) + out[23 + outpos] = ((in[30 + inpos] & 16777215) >>> (24 - 8)) | ((in[31 + inpos]) << 8); } - protected static void fastpackwithoutmask25(final int[] in, int inpos, + protected static void fastpack25(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 25); - out[1 + outpos] = ((in[1 + inpos]) >>> (25 - 18)) + out[0 + outpos] = (in[0 + inpos] & 33554431) + | ((in[1 + inpos]) << 25); + out[1 + outpos] = ((in[1 + inpos] & 33554431) >>> (25 - 18)) | ((in[2 + inpos]) << 18); - out[2 + outpos] = ((in[2 + inpos]) >>> (25 - 11)) + out[2 + outpos] = ((in[2 + inpos] & 33554431) >>> (25 - 11)) | ((in[3 + inpos]) << 11); - out[3 + outpos] = ((in[3 + inpos]) >>> (25 - 4)) - | ((in[4 + inpos]) << 4) | ((in[5 + inpos]) << 29); - out[4 + outpos] = ((in[5 + inpos]) >>> (25 - 22)) + out[3 + outpos] = ((in[3 + inpos] & 33554431) >>> (25 - 4)) + | ((in[4 + inpos] & 33554431) << 4) + | ((in[5 + inpos]) << 29); + out[4 + outpos] = ((in[5 + inpos] & 33554431) >>> (25 - 22)) | ((in[6 + inpos]) << 22); - out[5 + outpos] = ((in[6 + inpos]) >>> (25 - 15)) + out[5 + outpos] = ((in[6 + inpos] & 33554431) >>> (25 - 15)) | ((in[7 + inpos]) << 15); - out[6 + outpos] = ((in[7 + inpos]) >>> (25 - 8)) + out[6 + outpos] = ((in[7 + inpos] & 33554431) >>> (25 - 8)) | ((in[8 + inpos]) << 8); - out[7 + outpos] = ((in[8 + inpos]) >>> (25 - 1)) - | ((in[9 + inpos]) << 1) | ((in[10 + inpos]) << 26); - out[8 + outpos] = ((in[10 + inpos]) >>> (25 - 19)) + out[7 + outpos] = ((in[8 + inpos] & 33554431) >>> (25 - 1)) + | ((in[9 + inpos] & 33554431) << 1) + | ((in[10 + inpos]) << 26); + out[8 + outpos] = ((in[10 + inpos] & 33554431) >>> (25 - 19)) | ((in[11 + inpos]) << 19); - out[9 + outpos] = ((in[11 + inpos]) >>> (25 - 12)) + out[9 + outpos] = ((in[11 + inpos] & 33554431) >>> (25 - 12)) | ((in[12 + inpos]) << 12); - out[10 + outpos] = ((in[12 + inpos]) >>> (25 - 5)) - | ((in[13 + inpos]) << 5) | ((in[14 + inpos]) << 30); - out[11 + outpos] = ((in[14 + inpos]) >>> (25 - 23)) + out[10 + outpos] = ((in[12 + inpos] & 33554431) >>> (25 - 5)) + | ((in[13 + inpos] & 33554431) << 5) + | ((in[14 + inpos]) << 30); + out[11 + outpos] = ((in[14 + inpos] & 33554431) >>> (25 - 23)) | ((in[15 + inpos]) << 23); - out[12 + outpos] = ((in[15 + inpos]) >>> (25 - 16)) + out[12 + outpos] = ((in[15 + inpos] & 33554431) >>> (25 - 16)) | ((in[16 + inpos]) << 16); - out[13 + outpos] = ((in[16 + inpos]) >>> (25 - 9)) + out[13 + outpos] = ((in[16 + inpos] & 33554431) >>> (25 - 9)) | ((in[17 + inpos]) << 9); - out[14 + outpos] = ((in[17 + inpos]) >>> (25 - 2)) - | ((in[18 + inpos]) << 2) | ((in[19 + inpos]) << 27); - out[15 + outpos] = ((in[19 + inpos]) >>> (25 - 20)) + out[14 + outpos] = ((in[17 + inpos] & 33554431) >>> (25 - 2)) + | ((in[18 + inpos] & 33554431) << 2) + | ((in[19 + inpos]) << 27); + out[15 + outpos] = ((in[19 + inpos] & 33554431) >>> (25 - 20)) | ((in[20 + inpos]) << 20); - out[16 + outpos] = ((in[20 + inpos]) >>> (25 - 13)) + out[16 + outpos] = ((in[20 + inpos] & 33554431) >>> (25 - 13)) | ((in[21 + inpos]) << 13); - out[17 + outpos] = ((in[21 + inpos]) >>> (25 - 6)) - | ((in[22 + inpos]) << 6) | ((in[23 + inpos]) << 31); - out[18 + outpos] = ((in[23 + inpos]) >>> (25 - 24)) + out[17 + outpos] = ((in[21 + inpos] & 33554431) >>> (25 - 6)) + | ((in[22 + inpos] & 33554431) << 6) + | ((in[23 + inpos]) << 31); + out[18 + outpos] = ((in[23 + inpos] & 33554431) >>> (25 - 24)) | ((in[24 + inpos]) << 24); - out[19 + outpos] = ((in[24 + inpos]) >>> (25 - 17)) + out[19 + outpos] = ((in[24 + inpos] & 33554431) >>> (25 - 17)) | ((in[25 + inpos]) << 17); - out[20 + outpos] = ((in[25 + inpos]) >>> (25 - 10)) + out[20 + outpos] = ((in[25 + inpos] & 33554431) >>> (25 - 10)) | ((in[26 + inpos]) << 10); - out[21 + outpos] = ((in[26 + inpos]) >>> (25 - 3)) - | ((in[27 + inpos]) << 3) | ((in[28 + inpos]) << 28); - out[22 + outpos] = ((in[28 + inpos]) >>> (25 - 21)) + out[21 + outpos] = ((in[26 + inpos] & 33554431) >>> (25 - 3)) + | ((in[27 + inpos] & 33554431) << 3) + | ((in[28 + inpos]) << 28); + out[22 + outpos] = ((in[28 + inpos] & 33554431) >>> (25 - 21)) | ((in[29 + inpos]) << 21); - out[23 + outpos] = ((in[29 + inpos]) >>> (25 - 14)) + out[23 + outpos] = ((in[29 + inpos] & 33554431) >>> (25 - 14)) | ((in[30 + inpos]) << 14); - out[24 + outpos] = ((in[30 + inpos]) >>> (25 - 7)) + out[24 + outpos] = ((in[30 + inpos] & 33554431) >>> (25 - 7)) | ((in[31 + inpos]) << 7); } - protected static void fastpackwithoutmask26(final int[] in, int inpos, + protected static void fastpack26(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 26); - out[1 + outpos] = ((in[1 + inpos]) >>> (26 - 20)) + out[0 + outpos] = (in[0 + inpos] & 67108863) + | ((in[1 + inpos]) << 26); + out[1 + outpos] = ((in[1 + inpos] & 67108863) >>> (26 - 20)) | ((in[2 + inpos]) << 20); - out[2 + outpos] = ((in[2 + inpos]) >>> (26 - 14)) + out[2 + outpos] = ((in[2 + inpos] & 67108863) >>> (26 - 14)) | ((in[3 + inpos]) << 14); - out[3 + outpos] = ((in[3 + inpos]) >>> (26 - 8)) + out[3 + outpos] = ((in[3 + inpos] & 67108863) >>> (26 - 8)) | ((in[4 + inpos]) << 8); - out[4 + outpos] = ((in[4 + inpos]) >>> (26 - 2)) - | ((in[5 + inpos]) << 2) | ((in[6 + inpos]) << 28); - out[5 + outpos] = ((in[6 + inpos]) >>> (26 - 22)) + out[4 + outpos] = ((in[4 + inpos] & 67108863) >>> (26 - 2)) + | ((in[5 + inpos] & 67108863) << 2) + | ((in[6 + inpos]) << 28); + out[5 + outpos] = ((in[6 + inpos] & 67108863) >>> (26 - 22)) | ((in[7 + inpos]) << 22); - out[6 + outpos] = ((in[7 + inpos]) >>> (26 - 16)) + out[6 + outpos] = ((in[7 + inpos] & 67108863) >>> (26 - 16)) | ((in[8 + inpos]) << 16); - out[7 + outpos] = ((in[8 + inpos]) >>> (26 - 10)) + out[7 + outpos] = ((in[8 + inpos] & 67108863) >>> (26 - 10)) | ((in[9 + inpos]) << 10); - out[8 + outpos] = ((in[9 + inpos]) >>> (26 - 4)) - | ((in[10 + inpos]) << 4) | ((in[11 + inpos]) << 30); - out[9 + outpos] = ((in[11 + inpos]) >>> (26 - 24)) + out[8 + outpos] = ((in[9 + inpos] & 67108863) >>> (26 - 4)) + | ((in[10 + inpos] & 67108863) << 4) + | ((in[11 + inpos]) << 30); + out[9 + outpos] = ((in[11 + inpos] & 67108863) >>> (26 - 24)) | ((in[12 + inpos]) << 24); - out[10 + outpos] = ((in[12 + inpos]) >>> (26 - 18)) + out[10 + outpos] = ((in[12 + inpos] & 67108863) >>> (26 - 18)) | ((in[13 + inpos]) << 18); - out[11 + outpos] = ((in[13 + inpos]) >>> (26 - 12)) + out[11 + outpos] = ((in[13 + inpos] & 67108863) >>> (26 - 12)) | ((in[14 + inpos]) << 12); - out[12 + outpos] = ((in[14 + inpos]) >>> (26 - 6)) + out[12 + outpos] = ((in[14 + inpos] & 67108863) >>> (26 - 6)) | ((in[15 + inpos]) << 6); - out[13 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 26); - out[14 + outpos] = ((in[17 + inpos]) >>> (26 - 20)) + out[13 + outpos] = (in[16 + inpos] & 67108863) + | ((in[17 + inpos]) << 26); + out[14 + outpos] = ((in[17 + inpos] & 67108863) >>> (26 - 20)) | ((in[18 + inpos]) << 20); - out[15 + outpos] = ((in[18 + inpos]) >>> (26 - 14)) + out[15 + outpos] = ((in[18 + inpos] & 67108863) >>> (26 - 14)) | ((in[19 + inpos]) << 14); - out[16 + outpos] = ((in[19 + inpos]) >>> (26 - 8)) + out[16 + outpos] = ((in[19 + inpos] & 67108863) >>> (26 - 8)) | ((in[20 + inpos]) << 8); - out[17 + outpos] = ((in[20 + inpos]) >>> (26 - 2)) - | ((in[21 + inpos]) << 2) | ((in[22 + inpos]) << 28); - out[18 + outpos] = ((in[22 + inpos]) >>> (26 - 22)) + out[17 + outpos] = ((in[20 + inpos] & 67108863) >>> (26 - 2)) + | ((in[21 + inpos] & 67108863) << 2) + | ((in[22 + inpos]) << 28); + out[18 + outpos] = ((in[22 + inpos] & 67108863) >>> (26 - 22)) | ((in[23 + inpos]) << 22); - out[19 + outpos] = ((in[23 + inpos]) >>> (26 - 16)) + out[19 + outpos] = ((in[23 + inpos] & 67108863) >>> (26 - 16)) | ((in[24 + inpos]) << 16); - out[20 + outpos] = ((in[24 + inpos]) >>> (26 - 10)) + out[20 + outpos] = ((in[24 + inpos] & 67108863) >>> (26 - 10)) | ((in[25 + inpos]) << 10); - out[21 + outpos] = ((in[25 + inpos]) >>> (26 - 4)) - | ((in[26 + inpos]) << 4) | ((in[27 + inpos]) << 30); - out[22 + outpos] = ((in[27 + inpos]) >>> (26 - 24)) + out[21 + outpos] = ((in[25 + inpos] & 67108863) >>> (26 - 4)) + | ((in[26 + inpos] & 67108863) << 4) + | ((in[27 + inpos]) << 30); + out[22 + outpos] = ((in[27 + inpos] & 67108863) >>> (26 - 24)) | ((in[28 + inpos]) << 24); - out[23 + outpos] = ((in[28 + inpos]) >>> (26 - 18)) + out[23 + outpos] = ((in[28 + inpos] & 67108863) >>> (26 - 18)) | ((in[29 + inpos]) << 18); - out[24 + outpos] = ((in[29 + inpos]) >>> (26 - 12)) + out[24 + outpos] = ((in[29 + inpos] & 67108863) >>> (26 - 12)) | ((in[30 + inpos]) << 12); - out[25 + outpos] = ((in[30 + inpos]) >>> (26 - 6)) + out[25 + outpos] = ((in[30 + inpos] & 67108863) >>> (26 - 6)) | ((in[31 + inpos]) << 6); } - protected static void fastpackwithoutmask27(final int[] in, int inpos, + protected static void fastpack27(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 27); - out[1 + outpos] = ((in[1 + inpos]) >>> (27 - 22)) + out[0 + outpos] = (in[0 + inpos] & 134217727) + | ((in[1 + inpos]) << 27); + out[1 + outpos] = ((in[1 + inpos] & 134217727) >>> (27 - 22)) | ((in[2 + inpos]) << 22); - out[2 + outpos] = ((in[2 + inpos]) >>> (27 - 17)) + out[2 + outpos] = ((in[2 + inpos] & 134217727) >>> (27 - 17)) | ((in[3 + inpos]) << 17); - out[3 + outpos] = ((in[3 + inpos]) >>> (27 - 12)) + out[3 + outpos] = ((in[3 + inpos] & 134217727) >>> (27 - 12)) | ((in[4 + inpos]) << 12); - out[4 + outpos] = ((in[4 + inpos]) >>> (27 - 7)) + out[4 + outpos] = ((in[4 + inpos] & 134217727) >>> (27 - 7)) | ((in[5 + inpos]) << 7); - out[5 + outpos] = ((in[5 + inpos]) >>> (27 - 2)) - | ((in[6 + inpos]) << 2) | ((in[7 + inpos]) << 29); - out[6 + outpos] = ((in[7 + inpos]) >>> (27 - 24)) + out[5 + outpos] = ((in[5 + inpos] & 134217727) >>> (27 - 2)) + | ((in[6 + inpos] & 134217727) << 2) + | ((in[7 + inpos]) << 29); + out[6 + outpos] = ((in[7 + inpos] & 134217727) >>> (27 - 24)) | ((in[8 + inpos]) << 24); - out[7 + outpos] = ((in[8 + inpos]) >>> (27 - 19)) + out[7 + outpos] = ((in[8 + inpos] & 134217727) >>> (27 - 19)) | ((in[9 + inpos]) << 19); - out[8 + outpos] = ((in[9 + inpos]) >>> (27 - 14)) + out[8 + outpos] = ((in[9 + inpos] & 134217727) >>> (27 - 14)) | ((in[10 + inpos]) << 14); - out[9 + outpos] = ((in[10 + inpos]) >>> (27 - 9)) + out[9 + outpos] = ((in[10 + inpos] & 134217727) >>> (27 - 9)) | ((in[11 + inpos]) << 9); - out[10 + outpos] = ((in[11 + inpos]) >>> (27 - 4)) - | ((in[12 + inpos]) << 4) | ((in[13 + inpos]) << 31); - out[11 + outpos] = ((in[13 + inpos]) >>> (27 - 26)) + out[10 + outpos] = ((in[11 + inpos] & 134217727) >>> (27 - 4)) + | ((in[12 + inpos] & 134217727) << 4) + | ((in[13 + inpos]) << 31); + out[11 + outpos] = ((in[13 + inpos] & 134217727) >>> (27 - 26)) | ((in[14 + inpos]) << 26); - out[12 + outpos] = ((in[14 + inpos]) >>> (27 - 21)) + out[12 + outpos] = ((in[14 + inpos] & 134217727) >>> (27 - 21)) | ((in[15 + inpos]) << 21); - out[13 + outpos] = ((in[15 + inpos]) >>> (27 - 16)) + out[13 + outpos] = ((in[15 + inpos] & 134217727) >>> (27 - 16)) | ((in[16 + inpos]) << 16); - out[14 + outpos] = ((in[16 + inpos]) >>> (27 - 11)) + out[14 + outpos] = ((in[16 + inpos] & 134217727) >>> (27 - 11)) | ((in[17 + inpos]) << 11); - out[15 + outpos] = ((in[17 + inpos]) >>> (27 - 6)) + out[15 + outpos] = ((in[17 + inpos] & 134217727) >>> (27 - 6)) | ((in[18 + inpos]) << 6); - out[16 + outpos] = ((in[18 + inpos]) >>> (27 - 1)) - | ((in[19 + inpos]) << 1) | ((in[20 + inpos]) << 28); - out[17 + outpos] = ((in[20 + inpos]) >>> (27 - 23)) + out[16 + outpos] = ((in[18 + inpos] & 134217727) >>> (27 - 1)) + | ((in[19 + inpos] & 134217727) << 1) + | ((in[20 + inpos]) << 28); + out[17 + outpos] = ((in[20 + inpos] & 134217727) >>> (27 - 23)) | ((in[21 + inpos]) << 23); - out[18 + outpos] = ((in[21 + inpos]) >>> (27 - 18)) + out[18 + outpos] = ((in[21 + inpos] & 134217727) >>> (27 - 18)) | ((in[22 + inpos]) << 18); - out[19 + outpos] = ((in[22 + inpos]) >>> (27 - 13)) + out[19 + outpos] = ((in[22 + inpos] & 134217727) >>> (27 - 13)) | ((in[23 + inpos]) << 13); - out[20 + outpos] = ((in[23 + inpos]) >>> (27 - 8)) + out[20 + outpos] = ((in[23 + inpos] & 134217727) >>> (27 - 8)) | ((in[24 + inpos]) << 8); - out[21 + outpos] = ((in[24 + inpos]) >>> (27 - 3)) - | ((in[25 + inpos]) << 3) | ((in[26 + inpos]) << 30); - out[22 + outpos] = ((in[26 + inpos]) >>> (27 - 25)) + out[21 + outpos] = ((in[24 + inpos] & 134217727) >>> (27 - 3)) + | ((in[25 + inpos] & 134217727) << 3) + | ((in[26 + inpos]) << 30); + out[22 + outpos] = ((in[26 + inpos] & 134217727) >>> (27 - 25)) | ((in[27 + inpos]) << 25); - out[23 + outpos] = ((in[27 + inpos]) >>> (27 - 20)) + out[23 + outpos] = ((in[27 + inpos] & 134217727) >>> (27 - 20)) | ((in[28 + inpos]) << 20); - out[24 + outpos] = ((in[28 + inpos]) >>> (27 - 15)) + out[24 + outpos] = ((in[28 + inpos] & 134217727) >>> (27 - 15)) | ((in[29 + inpos]) << 15); - out[25 + outpos] = ((in[29 + inpos]) >>> (27 - 10)) + out[25 + outpos] = ((in[29 + inpos] & 134217727) >>> (27 - 10)) | ((in[30 + inpos]) << 10); - out[26 + outpos] = ((in[30 + inpos]) >>> (27 - 5)) + out[26 + outpos] = ((in[30 + inpos] & 134217727) >>> (27 - 5)) | ((in[31 + inpos]) << 5); } - protected static void fastpackwithoutmask28(final int[] in, int inpos, + protected static void fastpack28(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 28); - out[1 + outpos] = ((in[1 + inpos]) >>> (28 - 24)) + out[0 + outpos] = (in[0 + inpos] & 268435455) + | ((in[1 + inpos]) << 28); + out[1 + outpos] = ((in[1 + inpos] & 268435455) >>> (28 - 24)) | ((in[2 + inpos]) << 24); - out[2 + outpos] = ((in[2 + inpos]) >>> (28 - 20)) + out[2 + outpos] = ((in[2 + inpos] & 268435455) >>> (28 - 20)) | ((in[3 + inpos]) << 20); - out[3 + outpos] = ((in[3 + inpos]) >>> (28 - 16)) + out[3 + outpos] = ((in[3 + inpos] & 268435455) >>> (28 - 16)) | ((in[4 + inpos]) << 16); - out[4 + outpos] = ((in[4 + inpos]) >>> (28 - 12)) + out[4 + outpos] = ((in[4 + inpos] & 268435455) >>> (28 - 12)) | ((in[5 + inpos]) << 12); - out[5 + outpos] = ((in[5 + inpos]) >>> (28 - 8)) + out[5 + outpos] = ((in[5 + inpos] & 268435455) >>> (28 - 8)) | ((in[6 + inpos]) << 8); - out[6 + outpos] = ((in[6 + inpos]) >>> (28 - 4)) + out[6 + outpos] = ((in[6 + inpos] & 268435455) >>> (28 - 4)) | ((in[7 + inpos]) << 4); - out[7 + outpos] = in[8 + inpos] | ((in[9 + inpos]) << 28); - out[8 + outpos] = ((in[9 + inpos]) >>> (28 - 24)) + out[7 + outpos] = (in[8 + inpos] & 268435455) + | ((in[9 + inpos]) << 28); + out[8 + outpos] = ((in[9 + inpos] & 268435455) >>> (28 - 24)) | ((in[10 + inpos]) << 24); - out[9 + outpos] = ((in[10 + inpos]) >>> (28 - 20)) + out[9 + outpos] = ((in[10 + inpos] & 268435455) >>> (28 - 20)) | ((in[11 + inpos]) << 20); - out[10 + outpos] = ((in[11 + inpos]) >>> (28 - 16)) + out[10 + outpos] = ((in[11 + inpos] & 268435455) >>> (28 - 16)) | ((in[12 + inpos]) << 16); - out[11 + outpos] = ((in[12 + inpos]) >>> (28 - 12)) + out[11 + outpos] = ((in[12 + inpos] & 268435455) >>> (28 - 12)) | ((in[13 + inpos]) << 12); - out[12 + outpos] = ((in[13 + inpos]) >>> (28 - 8)) + out[12 + outpos] = ((in[13 + inpos] & 268435455) >>> (28 - 8)) | ((in[14 + inpos]) << 8); - out[13 + outpos] = ((in[14 + inpos]) >>> (28 - 4)) + out[13 + outpos] = ((in[14 + inpos] & 268435455) >>> (28 - 4)) | ((in[15 + inpos]) << 4); - out[14 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 28); - out[15 + outpos] = ((in[17 + inpos]) >>> (28 - 24)) + out[14 + outpos] = (in[16 + inpos] & 268435455) + | ((in[17 + inpos]) << 28); + out[15 + outpos] = ((in[17 + inpos] & 268435455) >>> (28 - 24)) | ((in[18 + inpos]) << 24); - out[16 + outpos] = ((in[18 + inpos]) >>> (28 - 20)) + out[16 + outpos] = ((in[18 + inpos] & 268435455) >>> (28 - 20)) | ((in[19 + inpos]) << 20); - out[17 + outpos] = ((in[19 + inpos]) >>> (28 - 16)) + out[17 + outpos] = ((in[19 + inpos] & 268435455) >>> (28 - 16)) | ((in[20 + inpos]) << 16); - out[18 + outpos] = ((in[20 + inpos]) >>> (28 - 12)) + out[18 + outpos] = ((in[20 + inpos] & 268435455) >>> (28 - 12)) | ((in[21 + inpos]) << 12); - out[19 + outpos] = ((in[21 + inpos]) >>> (28 - 8)) + out[19 + outpos] = ((in[21 + inpos] & 268435455) >>> (28 - 8)) | ((in[22 + inpos]) << 8); - out[20 + outpos] = ((in[22 + inpos]) >>> (28 - 4)) + out[20 + outpos] = ((in[22 + inpos] & 268435455) >>> (28 - 4)) | ((in[23 + inpos]) << 4); - out[21 + outpos] = in[24 + inpos] | ((in[25 + inpos]) << 28); - out[22 + outpos] = ((in[25 + inpos]) >>> (28 - 24)) + out[21 + outpos] = (in[24 + inpos] & 268435455) + | ((in[25 + inpos]) << 28); + out[22 + outpos] = ((in[25 + inpos] & 268435455) >>> (28 - 24)) | ((in[26 + inpos]) << 24); - out[23 + outpos] = ((in[26 + inpos]) >>> (28 - 20)) + out[23 + outpos] = ((in[26 + inpos] & 268435455) >>> (28 - 20)) | ((in[27 + inpos]) << 20); - out[24 + outpos] = ((in[27 + inpos]) >>> (28 - 16)) + out[24 + outpos] = ((in[27 + inpos] & 268435455) >>> (28 - 16)) | ((in[28 + inpos]) << 16); - out[25 + outpos] = ((in[28 + inpos]) >>> (28 - 12)) + out[25 + outpos] = ((in[28 + inpos] & 268435455) >>> (28 - 12)) | ((in[29 + inpos]) << 12); - out[26 + outpos] = ((in[29 + inpos]) >>> (28 - 8)) + out[26 + outpos] = ((in[29 + inpos] & 268435455) >>> (28 - 8)) | ((in[30 + inpos]) << 8); - out[27 + outpos] = ((in[30 + inpos]) >>> (28 - 4)) + out[27 + outpos] = ((in[30 + inpos] & 268435455) >>> (28 - 4)) | ((in[31 + inpos]) << 4); } - protected static void fastpackwithoutmask29(final int[] in, int inpos, + protected static void fastpack29(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 29); - out[1 + outpos] = ((in[1 + inpos]) >>> (29 - 26)) + out[0 + outpos] = (in[0 + inpos] & 536870911) + | ((in[1 + inpos]) << 29); + out[1 + outpos] = ((in[1 + inpos] & 536870911) >>> (29 - 26)) | ((in[2 + inpos]) << 26); - out[2 + outpos] = ((in[2 + inpos]) >>> (29 - 23)) + out[2 + outpos] = ((in[2 + inpos] & 536870911) >>> (29 - 23)) | ((in[3 + inpos]) << 23); - out[3 + outpos] = ((in[3 + inpos]) >>> (29 - 20)) + out[3 + outpos] = ((in[3 + inpos] & 536870911) >>> (29 - 20)) | ((in[4 + inpos]) << 20); - out[4 + outpos] = ((in[4 + inpos]) >>> (29 - 17)) + out[4 + outpos] = ((in[4 + inpos] & 536870911) >>> (29 - 17)) | ((in[5 + inpos]) << 17); - out[5 + outpos] = ((in[5 + inpos]) >>> (29 - 14)) + out[5 + outpos] = ((in[5 + inpos] & 536870911) >>> (29 - 14)) | ((in[6 + inpos]) << 14); - out[6 + outpos] = ((in[6 + inpos]) >>> (29 - 11)) + out[6 + outpos] = ((in[6 + inpos] & 536870911) >>> (29 - 11)) | ((in[7 + inpos]) << 11); - out[7 + outpos] = ((in[7 + inpos]) >>> (29 - 8)) + out[7 + outpos] = ((in[7 + inpos] & 536870911) >>> (29 - 8)) | ((in[8 + inpos]) << 8); - out[8 + outpos] = ((in[8 + inpos]) >>> (29 - 5)) + out[8 + outpos] = ((in[8 + inpos] & 536870911) >>> (29 - 5)) | ((in[9 + inpos]) << 5); - out[9 + outpos] = ((in[9 + inpos]) >>> (29 - 2)) - | ((in[10 + inpos]) << 2) | ((in[11 + inpos]) << 31); - out[10 + outpos] = ((in[11 + inpos]) >>> (29 - 28)) + out[9 + outpos] = ((in[9 + inpos] & 536870911) >>> (29 - 2)) + | ((in[10 + inpos] & 536870911) << 2) + | ((in[11 + inpos]) << 31); + out[10 + outpos] = ((in[11 + inpos] & 536870911) >>> (29 - 28)) | ((in[12 + inpos]) << 28); - out[11 + outpos] = ((in[12 + inpos]) >>> (29 - 25)) + out[11 + outpos] = ((in[12 + inpos] & 536870911) >>> (29 - 25)) | ((in[13 + inpos]) << 25); - out[12 + outpos] = ((in[13 + inpos]) >>> (29 - 22)) + out[12 + outpos] = ((in[13 + inpos] & 536870911) >>> (29 - 22)) | ((in[14 + inpos]) << 22); - out[13 + outpos] = ((in[14 + inpos]) >>> (29 - 19)) + out[13 + outpos] = ((in[14 + inpos] & 536870911) >>> (29 - 19)) | ((in[15 + inpos]) << 19); - out[14 + outpos] = ((in[15 + inpos]) >>> (29 - 16)) + out[14 + outpos] = ((in[15 + inpos] & 536870911) >>> (29 - 16)) | ((in[16 + inpos]) << 16); - out[15 + outpos] = ((in[16 + inpos]) >>> (29 - 13)) + out[15 + outpos] = ((in[16 + inpos] & 536870911) >>> (29 - 13)) | ((in[17 + inpos]) << 13); - out[16 + outpos] = ((in[17 + inpos]) >>> (29 - 10)) + out[16 + outpos] = ((in[17 + inpos] & 536870911) >>> (29 - 10)) | ((in[18 + inpos]) << 10); - out[17 + outpos] = ((in[18 + inpos]) >>> (29 - 7)) + out[17 + outpos] = ((in[18 + inpos] & 536870911) >>> (29 - 7)) | ((in[19 + inpos]) << 7); - out[18 + outpos] = ((in[19 + inpos]) >>> (29 - 4)) + out[18 + outpos] = ((in[19 + inpos] & 536870911) >>> (29 - 4)) | ((in[20 + inpos]) << 4); - out[19 + outpos] = ((in[20 + inpos]) >>> (29 - 1)) - | ((in[21 + inpos]) << 1) | ((in[22 + inpos]) << 30); - out[20 + outpos] = ((in[22 + inpos]) >>> (29 - 27)) + out[19 + outpos] = ((in[20 + inpos] & 536870911) >>> (29 - 1)) + | ((in[21 + inpos] & 536870911) << 1) + | ((in[22 + inpos]) << 30); + out[20 + outpos] = ((in[22 + inpos] & 536870911) >>> (29 - 27)) | ((in[23 + inpos]) << 27); - out[21 + outpos] = ((in[23 + inpos]) >>> (29 - 24)) + out[21 + outpos] = ((in[23 + inpos] & 536870911) >>> (29 - 24)) | ((in[24 + inpos]) << 24); - out[22 + outpos] = ((in[24 + inpos]) >>> (29 - 21)) + out[22 + outpos] = ((in[24 + inpos] & 536870911) >>> (29 - 21)) | ((in[25 + inpos]) << 21); - out[23 + outpos] = ((in[25 + inpos]) >>> (29 - 18)) + out[23 + outpos] = ((in[25 + inpos] & 536870911) >>> (29 - 18)) | ((in[26 + inpos]) << 18); - out[24 + outpos] = ((in[26 + inpos]) >>> (29 - 15)) + out[24 + outpos] = ((in[26 + inpos] & 536870911) >>> (29 - 15)) | ((in[27 + inpos]) << 15); - out[25 + outpos] = ((in[27 + inpos]) >>> (29 - 12)) + out[25 + outpos] = ((in[27 + inpos] & 536870911) >>> (29 - 12)) | ((in[28 + inpos]) << 12); - out[26 + outpos] = ((in[28 + inpos]) >>> (29 - 9)) + out[26 + outpos] = ((in[28 + inpos] & 536870911) >>> (29 - 9)) | ((in[29 + inpos]) << 9); - out[27 + outpos] = ((in[29 + inpos]) >>> (29 - 6)) + out[27 + outpos] = ((in[29 + inpos] & 536870911) >>> (29 - 6)) | ((in[30 + inpos]) << 6); - out[28 + outpos] = ((in[30 + inpos]) >>> (29 - 3)) + out[28 + outpos] = ((in[30 + inpos] & 536870911) >>> (29 - 3)) | ((in[31 + inpos]) << 3); } - protected static void fastpackwithoutmask30(final int[] in, int inpos, + protected static void fastpack3(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 30); - out[1 + outpos] = ((in[1 + inpos]) >>> (30 - 28)) - | ((in[2 + inpos]) << 28); - out[2 + outpos] = ((in[2 + inpos]) >>> (30 - 26)) - | ((in[3 + inpos]) << 26); - out[3 + outpos] = ((in[3 + inpos]) >>> (30 - 24)) - | ((in[4 + inpos]) << 24); - out[4 + outpos] = ((in[4 + inpos]) >>> (30 - 22)) - | ((in[5 + inpos]) << 22); - out[5 + outpos] = ((in[5 + inpos]) >>> (30 - 20)) - | ((in[6 + inpos]) << 20); - out[6 + outpos] = ((in[6 + inpos]) >>> (30 - 18)) - | ((in[7 + inpos]) << 18); - out[7 + outpos] = ((in[7 + inpos]) >>> (30 - 16)) - | ((in[8 + inpos]) << 16); - out[8 + outpos] = ((in[8 + inpos]) >>> (30 - 14)) - | ((in[9 + inpos]) << 14); - out[9 + outpos] = ((in[9 + inpos]) >>> (30 - 12)) - | ((in[10 + inpos]) << 12); - out[10 + outpos] = ((in[10 + inpos]) >>> (30 - 10)) - | ((in[11 + inpos]) << 10); - out[11 + outpos] = ((in[11 + inpos]) >>> (30 - 8)) - | ((in[12 + inpos]) << 8); - out[12 + outpos] = ((in[12 + inpos]) >>> (30 - 6)) - | ((in[13 + inpos]) << 6); - out[13 + outpos] = ((in[13 + inpos]) >>> (30 - 4)) - | ((in[14 + inpos]) << 4); - out[14 + outpos] = ((in[14 + inpos]) >>> (30 - 2)) - | ((in[15 + inpos]) << 2); - out[15 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 30); - out[16 + outpos] = ((in[17 + inpos]) >>> (30 - 28)) - | ((in[18 + inpos]) << 28); - out[17 + outpos] = ((in[18 + inpos]) >>> (30 - 26)) - | ((in[19 + inpos]) << 26); - out[18 + outpos] = ((in[19 + inpos]) >>> (30 - 24)) + out[0 + outpos] = (in[0 + inpos] & 7) + | ((in[1 + inpos] & 7) << 3) + | ((in[2 + inpos] & 7) << 6) + | ((in[3 + inpos] & 7) << 9) + | ((in[4 + inpos] & 7) << 12) + | ((in[5 + inpos] & 7) << 15) + | ((in[6 + inpos] & 7) << 18) + | ((in[7 + inpos] & 7) << 21) + | ((in[8 + inpos] & 7) << 24) + | ((in[9 + inpos] & 7) << 27) + | ((in[10 + inpos]) << 30); + out[1 + outpos] = ((in[10 + inpos] & 7) >>> (3 - 1)) + | ((in[11 + inpos] & 7) << 1) + | ((in[12 + inpos] & 7) << 4) + | ((in[13 + inpos] & 7) << 7) + | ((in[14 + inpos] & 7) << 10) + | ((in[15 + inpos] & 7) << 13) + | ((in[16 + inpos] & 7) << 16) + | ((in[17 + inpos] & 7) << 19) + | ((in[18 + inpos] & 7) << 22) + | ((in[19 + inpos] & 7) << 25) + | ((in[20 + inpos] & 7) << 28) + | ((in[21 + inpos]) << 31); + out[2 + outpos] = ((in[21 + inpos] & 7) >>> (3 - 2)) + | ((in[22 + inpos] & 7) << 2) + | ((in[23 + inpos] & 7) << 5) + | ((in[24 + inpos] & 7) << 8) + | ((in[25 + inpos] & 7) << 11) + | ((in[26 + inpos] & 7) << 14) + | ((in[27 + inpos] & 7) << 17) + | ((in[28 + inpos] & 7) << 20) + | ((in[29 + inpos] & 7) << 23) + | ((in[30 + inpos] & 7) << 26) + | ((in[31 + inpos]) << 29); + } + + protected static void fastpack30(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] & 1073741823) + | ((in[1 + inpos]) << 30); + out[1 + outpos] = ((in[1 + inpos] & 1073741823) >>> (30 - 28)) + | ((in[2 + inpos]) << 28); + out[2 + outpos] = ((in[2 + inpos] & 1073741823) >>> (30 - 26)) + | ((in[3 + inpos]) << 26); + out[3 + outpos] = ((in[3 + inpos] & 1073741823) >>> (30 - 24)) + | ((in[4 + inpos]) << 24); + out[4 + outpos] = ((in[4 + inpos] & 1073741823) >>> (30 - 22)) + | ((in[5 + inpos]) << 22); + out[5 + outpos] = ((in[5 + inpos] & 1073741823) >>> (30 - 20)) + | ((in[6 + inpos]) << 20); + out[6 + outpos] = ((in[6 + inpos] & 1073741823) >>> (30 - 18)) + | ((in[7 + inpos]) << 18); + out[7 + outpos] = ((in[7 + inpos] & 1073741823) >>> (30 - 16)) + | ((in[8 + inpos]) << 16); + out[8 + outpos] = ((in[8 + inpos] & 1073741823) >>> (30 - 14)) + | ((in[9 + inpos]) << 14); + out[9 + outpos] = ((in[9 + inpos] & 1073741823) >>> (30 - 12)) + | ((in[10 + inpos]) << 12); + out[10 + outpos] = ((in[10 + inpos] & 1073741823) >>> (30 - 10)) + | ((in[11 + inpos]) << 10); + out[11 + outpos] = ((in[11 + inpos] & 1073741823) >>> (30 - 8)) + | ((in[12 + inpos]) << 8); + out[12 + outpos] = ((in[12 + inpos] & 1073741823) >>> (30 - 6)) + | ((in[13 + inpos]) << 6); + out[13 + outpos] = ((in[13 + inpos] & 1073741823) >>> (30 - 4)) + | ((in[14 + inpos]) << 4); + out[14 + outpos] = ((in[14 + inpos] & 1073741823) >>> (30 - 2)) + | ((in[15 + inpos]) << 2); + out[15 + outpos] = (in[16 + inpos] & 1073741823) + | ((in[17 + inpos]) << 30); + out[16 + outpos] = ((in[17 + inpos] & 1073741823) >>> (30 - 28)) + | ((in[18 + inpos]) << 28); + out[17 + outpos] = ((in[18 + inpos] & 1073741823) >>> (30 - 26)) + | ((in[19 + inpos]) << 26); + out[18 + outpos] = ((in[19 + inpos] & 1073741823) >>> (30 - 24)) | ((in[20 + inpos]) << 24); - out[19 + outpos] = ((in[20 + inpos]) >>> (30 - 22)) + out[19 + outpos] = ((in[20 + inpos] & 1073741823) >>> (30 - 22)) | ((in[21 + inpos]) << 22); - out[20 + outpos] = ((in[21 + inpos]) >>> (30 - 20)) + out[20 + outpos] = ((in[21 + inpos] & 1073741823) >>> (30 - 20)) | ((in[22 + inpos]) << 20); - out[21 + outpos] = ((in[22 + inpos]) >>> (30 - 18)) + out[21 + outpos] = ((in[22 + inpos] & 1073741823) >>> (30 - 18)) | ((in[23 + inpos]) << 18); - out[22 + outpos] = ((in[23 + inpos]) >>> (30 - 16)) + out[22 + outpos] = ((in[23 + inpos] & 1073741823) >>> (30 - 16)) | ((in[24 + inpos]) << 16); - out[23 + outpos] = ((in[24 + inpos]) >>> (30 - 14)) + out[23 + outpos] = ((in[24 + inpos] & 1073741823) >>> (30 - 14)) | ((in[25 + inpos]) << 14); - out[24 + outpos] = ((in[25 + inpos]) >>> (30 - 12)) + out[24 + outpos] = ((in[25 + inpos] & 1073741823) >>> (30 - 12)) | ((in[26 + inpos]) << 12); - out[25 + outpos] = ((in[26 + inpos]) >>> (30 - 10)) + out[25 + outpos] = ((in[26 + inpos] & 1073741823) >>> (30 - 10)) | ((in[27 + inpos]) << 10); - out[26 + outpos] = ((in[27 + inpos]) >>> (30 - 8)) + out[26 + outpos] = ((in[27 + inpos] & 1073741823) >>> (30 - 8)) | ((in[28 + inpos]) << 8); - out[27 + outpos] = ((in[28 + inpos]) >>> (30 - 6)) + out[27 + outpos] = ((in[28 + inpos] & 1073741823) >>> (30 - 6)) | ((in[29 + inpos]) << 6); - out[28 + outpos] = ((in[29 + inpos]) >>> (30 - 4)) + out[28 + outpos] = ((in[29 + inpos] & 1073741823) >>> (30 - 4)) | ((in[30 + inpos]) << 4); - out[29 + outpos] = ((in[30 + inpos]) >>> (30 - 2)) + out[29 + outpos] = ((in[30 + inpos] & 1073741823) >>> (30 - 2)) | ((in[31 + inpos]) << 2); } - protected static void fastpackwithoutmask31(final int[] in, int inpos, + protected static void fastpack31(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 31); - out[1 + outpos] = ((in[1 + inpos]) >>> (31 - 30)) + out[0 + outpos] = (in[0 + inpos] & 2147483647) + | ((in[1 + inpos]) << 31); + out[1 + outpos] = ((in[1 + inpos] & 2147483647) >>> (31 - 30)) | ((in[2 + inpos]) << 30); - out[2 + outpos] = ((in[2 + inpos]) >>> (31 - 29)) + out[2 + outpos] = ((in[2 + inpos] & 2147483647) >>> (31 - 29)) | ((in[3 + inpos]) << 29); - out[3 + outpos] = ((in[3 + inpos]) >>> (31 - 28)) + out[3 + outpos] = ((in[3 + inpos] & 2147483647) >>> (31 - 28)) | ((in[4 + inpos]) << 28); - out[4 + outpos] = ((in[4 + inpos]) >>> (31 - 27)) + out[4 + outpos] = ((in[4 + inpos] & 2147483647) >>> (31 - 27)) | ((in[5 + inpos]) << 27); - out[5 + outpos] = ((in[5 + inpos]) >>> (31 - 26)) + out[5 + outpos] = ((in[5 + inpos] & 2147483647) >>> (31 - 26)) | ((in[6 + inpos]) << 26); - out[6 + outpos] = ((in[6 + inpos]) >>> (31 - 25)) + out[6 + outpos] = ((in[6 + inpos] & 2147483647) >>> (31 - 25)) | ((in[7 + inpos]) << 25); - out[7 + outpos] = ((in[7 + inpos]) >>> (31 - 24)) + out[7 + outpos] = ((in[7 + inpos] & 2147483647) >>> (31 - 24)) | ((in[8 + inpos]) << 24); - out[8 + outpos] = ((in[8 + inpos]) >>> (31 - 23)) + out[8 + outpos] = ((in[8 + inpos] & 2147483647) >>> (31 - 23)) | ((in[9 + inpos]) << 23); - out[9 + outpos] = ((in[9 + inpos]) >>> (31 - 22)) + out[9 + outpos] = ((in[9 + inpos] & 2147483647) >>> (31 - 22)) | ((in[10 + inpos]) << 22); - out[10 + outpos] = ((in[10 + inpos]) >>> (31 - 21)) + out[10 + outpos] = ((in[10 + inpos] & 2147483647) >>> (31 - 21)) | ((in[11 + inpos]) << 21); - out[11 + outpos] = ((in[11 + inpos]) >>> (31 - 20)) + out[11 + outpos] = ((in[11 + inpos] & 2147483647) >>> (31 - 20)) | ((in[12 + inpos]) << 20); - out[12 + outpos] = ((in[12 + inpos]) >>> (31 - 19)) + out[12 + outpos] = ((in[12 + inpos] & 2147483647) >>> (31 - 19)) | ((in[13 + inpos]) << 19); - out[13 + outpos] = ((in[13 + inpos]) >>> (31 - 18)) + out[13 + outpos] = ((in[13 + inpos] & 2147483647) >>> (31 - 18)) | ((in[14 + inpos]) << 18); - out[14 + outpos] = ((in[14 + inpos]) >>> (31 - 17)) + out[14 + outpos] = ((in[14 + inpos] & 2147483647) >>> (31 - 17)) | ((in[15 + inpos]) << 17); - out[15 + outpos] = ((in[15 + inpos]) >>> (31 - 16)) + out[15 + outpos] = ((in[15 + inpos] & 2147483647) >>> (31 - 16)) | ((in[16 + inpos]) << 16); - out[16 + outpos] = ((in[16 + inpos]) >>> (31 - 15)) + out[16 + outpos] = ((in[16 + inpos] & 2147483647) >>> (31 - 15)) | ((in[17 + inpos]) << 15); - out[17 + outpos] = ((in[17 + inpos]) >>> (31 - 14)) + out[17 + outpos] = ((in[17 + inpos] & 2147483647) >>> (31 - 14)) | ((in[18 + inpos]) << 14); - out[18 + outpos] = ((in[18 + inpos]) >>> (31 - 13)) + out[18 + outpos] = ((in[18 + inpos] & 2147483647) >>> (31 - 13)) | ((in[19 + inpos]) << 13); - out[19 + outpos] = ((in[19 + inpos]) >>> (31 - 12)) + out[19 + outpos] = ((in[19 + inpos] & 2147483647) >>> (31 - 12)) | ((in[20 + inpos]) << 12); - out[20 + outpos] = ((in[20 + inpos]) >>> (31 - 11)) + out[20 + outpos] = ((in[20 + inpos] & 2147483647) >>> (31 - 11)) | ((in[21 + inpos]) << 11); - out[21 + outpos] = ((in[21 + inpos]) >>> (31 - 10)) + out[21 + outpos] = ((in[21 + inpos] & 2147483647) >>> (31 - 10)) | ((in[22 + inpos]) << 10); - out[22 + outpos] = ((in[22 + inpos]) >>> (31 - 9)) + out[22 + outpos] = ((in[22 + inpos] & 2147483647) >>> (31 - 9)) | ((in[23 + inpos]) << 9); - out[23 + outpos] = ((in[23 + inpos]) >>> (31 - 8)) + out[23 + outpos] = ((in[23 + inpos] & 2147483647) >>> (31 - 8)) | ((in[24 + inpos]) << 8); - out[24 + outpos] = ((in[24 + inpos]) >>> (31 - 7)) + out[24 + outpos] = ((in[24 + inpos] & 2147483647) >>> (31 - 7)) | ((in[25 + inpos]) << 7); - out[25 + outpos] = ((in[25 + inpos]) >>> (31 - 6)) + out[25 + outpos] = ((in[25 + inpos] & 2147483647) >>> (31 - 6)) | ((in[26 + inpos]) << 6); - out[26 + outpos] = ((in[26 + inpos]) >>> (31 - 5)) + out[26 + outpos] = ((in[26 + inpos] & 2147483647) >>> (31 - 5)) | ((in[27 + inpos]) << 5); - out[27 + outpos] = ((in[27 + inpos]) >>> (31 - 4)) + out[27 + outpos] = ((in[27 + inpos] & 2147483647) >>> (31 - 4)) | ((in[28 + inpos]) << 4); - out[28 + outpos] = ((in[28 + inpos]) >>> (31 - 3)) + out[28 + outpos] = ((in[28 + inpos] & 2147483647) >>> (31 - 3)) | ((in[29 + inpos]) << 3); - out[29 + outpos] = ((in[29 + inpos]) >>> (31 - 2)) + out[29 + outpos] = ((in[29 + inpos] & 2147483647) >>> (31 - 2)) | ((in[30 + inpos]) << 2); - out[30 + outpos] = ((in[30 + inpos]) >>> (31 - 1)) + out[30 + outpos] = ((in[30 + inpos] & 2147483647) >>> (31 - 1)) | ((in[31 + inpos]) << 1); } - protected static void fastpack1(final int[] in, int inpos, - final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 1) - | ((in[1 + inpos] & 1) << 1) - | ((in[2 + inpos] & 1) << 2) - | ((in[3 + inpos] & 1) << 3) - | ((in[4 + inpos] & 1) << 4) - | ((in[5 + inpos] & 1) << 5) - | ((in[6 + inpos] & 1) << 6) - | ((in[7 + inpos] & 1) << 7) - | ((in[8 + inpos] & 1) << 8) - | ((in[9 + inpos] & 1) << 9) - | ((in[10 + inpos] & 1) << 10) - | ((in[11 + inpos] & 1) << 11) - | ((in[12 + inpos] & 1) << 12) - | ((in[13 + inpos] & 1) << 13) - | ((in[14 + inpos] & 1) << 14) - | ((in[15 + inpos] & 1) << 15) - | ((in[16 + inpos] & 1) << 16) - | ((in[17 + inpos] & 1) << 17) - | ((in[18 + inpos] & 1) << 18) - | ((in[19 + inpos] & 1) << 19) - | ((in[20 + inpos] & 1) << 20) - | ((in[21 + inpos] & 1) << 21) - | ((in[22 + inpos] & 1) << 22) - | ((in[23 + inpos] & 1) << 23) - | ((in[24 + inpos] & 1) << 24) - | ((in[25 + inpos] & 1) << 25) - | ((in[26 + inpos] & 1) << 26) - | ((in[27 + inpos] & 1) << 27) - | ((in[28 + inpos] & 1) << 28) - | ((in[29 + inpos] & 1) << 29) - | ((in[30 + inpos] & 1) << 30) - | ((in[31 + inpos]) << 31); - } - - protected static void fastpack2(final int[] in, int inpos, + protected static void fastpack32(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 3) - | ((in[1 + inpos] & 3) << 2) - | ((in[2 + inpos] & 3) << 4) - | ((in[3 + inpos] & 3) << 6) - | ((in[4 + inpos] & 3) << 8) - | ((in[5 + inpos] & 3) << 10) - | ((in[6 + inpos] & 3) << 12) - | ((in[7 + inpos] & 3) << 14) - | ((in[8 + inpos] & 3) << 16) - | ((in[9 + inpos] & 3) << 18) - | ((in[10 + inpos] & 3) << 20) - | ((in[11 + inpos] & 3) << 22) - | ((in[12 + inpos] & 3) << 24) - | ((in[13 + inpos] & 3) << 26) - | ((in[14 + inpos] & 3) << 28) - | ((in[15 + inpos]) << 30); - out[1 + outpos] = (in[16 + inpos] & 3) - | ((in[17 + inpos] & 3) << 2) - | ((in[18 + inpos] & 3) << 4) - | ((in[19 + inpos] & 3) << 6) - | ((in[20 + inpos] & 3) << 8) - | ((in[21 + inpos] & 3) << 10) - | ((in[22 + inpos] & 3) << 12) - | ((in[23 + inpos] & 3) << 14) - | ((in[24 + inpos] & 3) << 16) - | ((in[25 + inpos] & 3) << 18) - | ((in[26 + inpos] & 3) << 20) - | ((in[27 + inpos] & 3) << 22) - | ((in[28 + inpos] & 3) << 24) - | ((in[29 + inpos] & 3) << 26) - | ((in[30 + inpos] & 3) << 28) - | ((in[31 + inpos]) << 30); + System.arraycopy(in, inpos, out, outpos, 32); } - protected static void fastpack3(final int[] in, int inpos, - final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 7) - | ((in[1 + inpos] & 7) << 3) - | ((in[2 + inpos] & 7) << 6) - | ((in[3 + inpos] & 7) << 9) - | ((in[4 + inpos] & 7) << 12) - | ((in[5 + inpos] & 7) << 15) - | ((in[6 + inpos] & 7) << 18) - | ((in[7 + inpos] & 7) << 21) - | ((in[8 + inpos] & 7) << 24) - | ((in[9 + inpos] & 7) << 27) - | ((in[10 + inpos]) << 30); - out[1 + outpos] = ((in[10 + inpos] & 7) >>> (3 - 1)) - | ((in[11 + inpos] & 7) << 1) - | ((in[12 + inpos] & 7) << 4) - | ((in[13 + inpos] & 7) << 7) - | ((in[14 + inpos] & 7) << 10) - | ((in[15 + inpos] & 7) << 13) - | ((in[16 + inpos] & 7) << 16) - | ((in[17 + inpos] & 7) << 19) - | ((in[18 + inpos] & 7) << 22) - | ((in[19 + inpos] & 7) << 25) - | ((in[20 + inpos] & 7) << 28) - | ((in[21 + inpos]) << 31); - out[2 + outpos] = ((in[21 + inpos] & 7) >>> (3 - 2)) - | ((in[22 + inpos] & 7) << 2) - | ((in[23 + inpos] & 7) << 5) - | ((in[24 + inpos] & 7) << 8) - | ((in[25 + inpos] & 7) << 11) - | ((in[26 + inpos] & 7) << 14) - | ((in[27 + inpos] & 7) << 17) - | ((in[28 + inpos] & 7) << 20) - | ((in[29 + inpos] & 7) << 23) - | ((in[30 + inpos] & 7) << 26) - | ((in[31 + inpos]) << 29); - } - - protected static void fastpack4(final int[] in, int inpos, + protected static void fastpack4(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] & 15) | ((in[1 + inpos] & 15) << 4) @@ -1548,1536 +1696,1482 @@ protected static void fastpack9(final int[] in, int inpos, | ((in[31 + inpos]) << 23); } - protected static void fastpack10(final int[] in, int inpos, + /** + * Unpack 32 integers + * + * @param in + * source array + * @param inpos + * position in source array + * @param out + * output array + * @param outpos + * position in output array + * @param bit + * number of bits to use per integer + */ + public static void fastpackwithoutmask(final int[] in, final int inpos, + final int[] out, final int outpos, final int bit) { + switch (bit) { + case 0: + fastpackwithoutmask0(in, inpos, out, outpos); + break; + case 1: + fastpackwithoutmask1(in, inpos, out, outpos); + break; + case 2: + fastpackwithoutmask2(in, inpos, out, outpos); + break; + case 3: + fastpackwithoutmask3(in, inpos, out, outpos); + break; + case 4: + fastpackwithoutmask4(in, inpos, out, outpos); + break; + case 5: + fastpackwithoutmask5(in, inpos, out, outpos); + break; + case 6: + fastpackwithoutmask6(in, inpos, out, outpos); + break; + case 7: + fastpackwithoutmask7(in, inpos, out, outpos); + break; + case 8: + fastpackwithoutmask8(in, inpos, out, outpos); + break; + case 9: + fastpackwithoutmask9(in, inpos, out, outpos); + break; + case 10: + fastpackwithoutmask10(in, inpos, out, outpos); + break; + case 11: + fastpackwithoutmask11(in, inpos, out, outpos); + break; + case 12: + fastpackwithoutmask12(in, inpos, out, outpos); + break; + case 13: + fastpackwithoutmask13(in, inpos, out, outpos); + break; + case 14: + fastpackwithoutmask14(in, inpos, out, outpos); + break; + case 15: + fastpackwithoutmask15(in, inpos, out, outpos); + break; + case 16: + fastpackwithoutmask16(in, inpos, out, outpos); + break; + case 17: + fastpackwithoutmask17(in, inpos, out, outpos); + break; + case 18: + fastpackwithoutmask18(in, inpos, out, outpos); + break; + case 19: + fastpackwithoutmask19(in, inpos, out, outpos); + break; + case 20: + fastpackwithoutmask20(in, inpos, out, outpos); + break; + case 21: + fastpackwithoutmask21(in, inpos, out, outpos); + break; + case 22: + fastpackwithoutmask22(in, inpos, out, outpos); + break; + case 23: + fastpackwithoutmask23(in, inpos, out, outpos); + break; + case 24: + fastpackwithoutmask24(in, inpos, out, outpos); + break; + case 25: + fastpackwithoutmask25(in, inpos, out, outpos); + break; + case 26: + fastpackwithoutmask26(in, inpos, out, outpos); + break; + case 27: + fastpackwithoutmask27(in, inpos, out, outpos); + break; + case 28: + fastpackwithoutmask28(in, inpos, out, outpos); + break; + case 29: + fastpackwithoutmask29(in, inpos, out, outpos); + break; + case 30: + fastpackwithoutmask30(in, inpos, out, outpos); + break; + case 31: + fastpackwithoutmask31(in, inpos, out, outpos); + break; + case 32: + fastpackwithoutmask32(in, inpos, out, outpos); + break; + default: + throw new IllegalArgumentException( + "Unsupported bit width."); + } + } + + protected static void fastpackwithoutmask0(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 1023) - | ((in[1 + inpos] & 1023) << 10) - | ((in[2 + inpos] & 1023) << 20) - | ((in[3 + inpos]) << 30); - out[1 + outpos] = ((in[3 + inpos] & 1023) >>> (10 - 8)) - | ((in[4 + inpos] & 1023) << 8) - | ((in[5 + inpos] & 1023) << 18) + // nothing + } + + protected static void fastpackwithoutmask1(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 1) + | ((in[2 + inpos]) << 2) | ((in[3 + inpos]) << 3) + | ((in[4 + inpos]) << 4) | ((in[5 + inpos]) << 5) + | ((in[6 + inpos]) << 6) | ((in[7 + inpos]) << 7) + | ((in[8 + inpos]) << 8) | ((in[9 + inpos]) << 9) + | ((in[10 + inpos]) << 10) | ((in[11 + inpos]) << 11) + | ((in[12 + inpos]) << 12) | ((in[13 + inpos]) << 13) + | ((in[14 + inpos]) << 14) | ((in[15 + inpos]) << 15) + | ((in[16 + inpos]) << 16) | ((in[17 + inpos]) << 17) + | ((in[18 + inpos]) << 18) | ((in[19 + inpos]) << 19) + | ((in[20 + inpos]) << 20) | ((in[21 + inpos]) << 21) + | ((in[22 + inpos]) << 22) | ((in[23 + inpos]) << 23) + | ((in[24 + inpos]) << 24) | ((in[25 + inpos]) << 25) + | ((in[26 + inpos]) << 26) | ((in[27 + inpos]) << 27) + | ((in[28 + inpos]) << 28) | ((in[29 + inpos]) << 29) + | ((in[30 + inpos]) << 30) | ((in[31 + inpos]) << 31); + } + + protected static void fastpackwithoutmask10(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 10) + | ((in[2 + inpos]) << 20) | ((in[3 + inpos]) << 30); + out[1 + outpos] = ((in[3 + inpos]) >>> (10 - 8)) + | ((in[4 + inpos]) << 8) | ((in[5 + inpos]) << 18) | ((in[6 + inpos]) << 28); - out[2 + outpos] = ((in[6 + inpos] & 1023) >>> (10 - 6)) - | ((in[7 + inpos] & 1023) << 6) - | ((in[8 + inpos] & 1023) << 16) + out[2 + outpos] = ((in[6 + inpos]) >>> (10 - 6)) + | ((in[7 + inpos]) << 6) | ((in[8 + inpos]) << 16) | ((in[9 + inpos]) << 26); - out[3 + outpos] = ((in[9 + inpos] & 1023) >>> (10 - 4)) - | ((in[10 + inpos] & 1023) << 4) - | ((in[11 + inpos] & 1023) << 14) + out[3 + outpos] = ((in[9 + inpos]) >>> (10 - 4)) + | ((in[10 + inpos]) << 4) | ((in[11 + inpos]) << 14) | ((in[12 + inpos]) << 24); - out[4 + outpos] = ((in[12 + inpos] & 1023) >>> (10 - 2)) - | ((in[13 + inpos] & 1023) << 2) - | ((in[14 + inpos] & 1023) << 12) + out[4 + outpos] = ((in[12 + inpos]) >>> (10 - 2)) + | ((in[13 + inpos]) << 2) | ((in[14 + inpos]) << 12) | ((in[15 + inpos]) << 22); - out[5 + outpos] = (in[16 + inpos] & 1023) - | ((in[17 + inpos] & 1023) << 10) - | ((in[18 + inpos] & 1023) << 20) - | ((in[19 + inpos]) << 30); - out[6 + outpos] = ((in[19 + inpos] & 1023) >>> (10 - 8)) - | ((in[20 + inpos] & 1023) << 8) - | ((in[21 + inpos] & 1023) << 18) + out[5 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 10) + | ((in[18 + inpos]) << 20) | ((in[19 + inpos]) << 30); + out[6 + outpos] = ((in[19 + inpos]) >>> (10 - 8)) + | ((in[20 + inpos]) << 8) | ((in[21 + inpos]) << 18) | ((in[22 + inpos]) << 28); - out[7 + outpos] = ((in[22 + inpos] & 1023) >>> (10 - 6)) - | ((in[23 + inpos] & 1023) << 6) - | ((in[24 + inpos] & 1023) << 16) + out[7 + outpos] = ((in[22 + inpos]) >>> (10 - 6)) + | ((in[23 + inpos]) << 6) | ((in[24 + inpos]) << 16) | ((in[25 + inpos]) << 26); - out[8 + outpos] = ((in[25 + inpos] & 1023) >>> (10 - 4)) - | ((in[26 + inpos] & 1023) << 4) - | ((in[27 + inpos] & 1023) << 14) + out[8 + outpos] = ((in[25 + inpos]) >>> (10 - 4)) + | ((in[26 + inpos]) << 4) | ((in[27 + inpos]) << 14) | ((in[28 + inpos]) << 24); - out[9 + outpos] = ((in[28 + inpos] & 1023) >>> (10 - 2)) - | ((in[29 + inpos] & 1023) << 2) - | ((in[30 + inpos] & 1023) << 12) + out[9 + outpos] = ((in[28 + inpos]) >>> (10 - 2)) + | ((in[29 + inpos]) << 2) | ((in[30 + inpos]) << 12) | ((in[31 + inpos]) << 22); } - protected static void fastpack11(final int[] in, int inpos, + protected static void fastpackwithoutmask11(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 2047) - | ((in[1 + inpos] & 2047) << 11) + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 11) | ((in[2 + inpos]) << 22); - out[1 + outpos] = ((in[2 + inpos] & 2047) >>> (11 - 1)) - | ((in[3 + inpos] & 2047) << 1) - | ((in[4 + inpos] & 2047) << 12) + out[1 + outpos] = ((in[2 + inpos]) >>> (11 - 1)) + | ((in[3 + inpos]) << 1) | ((in[4 + inpos]) << 12) | ((in[5 + inpos]) << 23); - out[2 + outpos] = ((in[5 + inpos] & 2047) >>> (11 - 2)) - | ((in[6 + inpos] & 2047) << 2) - | ((in[7 + inpos] & 2047) << 13) + out[2 + outpos] = ((in[5 + inpos]) >>> (11 - 2)) + | ((in[6 + inpos]) << 2) | ((in[7 + inpos]) << 13) | ((in[8 + inpos]) << 24); - out[3 + outpos] = ((in[8 + inpos] & 2047) >>> (11 - 3)) - | ((in[9 + inpos] & 2047) << 3) - | ((in[10 + inpos] & 2047) << 14) + out[3 + outpos] = ((in[8 + inpos]) >>> (11 - 3)) + | ((in[9 + inpos]) << 3) | ((in[10 + inpos]) << 14) | ((in[11 + inpos]) << 25); - out[4 + outpos] = ((in[11 + inpos] & 2047) >>> (11 - 4)) - | ((in[12 + inpos] & 2047) << 4) - | ((in[13 + inpos] & 2047) << 15) + out[4 + outpos] = ((in[11 + inpos]) >>> (11 - 4)) + | ((in[12 + inpos]) << 4) | ((in[13 + inpos]) << 15) | ((in[14 + inpos]) << 26); - out[5 + outpos] = ((in[14 + inpos] & 2047) >>> (11 - 5)) - | ((in[15 + inpos] & 2047) << 5) - | ((in[16 + inpos] & 2047) << 16) + out[5 + outpos] = ((in[14 + inpos]) >>> (11 - 5)) + | ((in[15 + inpos]) << 5) | ((in[16 + inpos]) << 16) | ((in[17 + inpos]) << 27); - out[6 + outpos] = ((in[17 + inpos] & 2047) >>> (11 - 6)) - | ((in[18 + inpos] & 2047) << 6) - | ((in[19 + inpos] & 2047) << 17) + out[6 + outpos] = ((in[17 + inpos]) >>> (11 - 6)) + | ((in[18 + inpos]) << 6) | ((in[19 + inpos]) << 17) | ((in[20 + inpos]) << 28); - out[7 + outpos] = ((in[20 + inpos] & 2047) >>> (11 - 7)) - | ((in[21 + inpos] & 2047) << 7) - | ((in[22 + inpos] & 2047) << 18) + out[7 + outpos] = ((in[20 + inpos]) >>> (11 - 7)) + | ((in[21 + inpos]) << 7) | ((in[22 + inpos]) << 18) | ((in[23 + inpos]) << 29); - out[8 + outpos] = ((in[23 + inpos] & 2047) >>> (11 - 8)) - | ((in[24 + inpos] & 2047) << 8) - | ((in[25 + inpos] & 2047) << 19) + out[8 + outpos] = ((in[23 + inpos]) >>> (11 - 8)) + | ((in[24 + inpos]) << 8) | ((in[25 + inpos]) << 19) | ((in[26 + inpos]) << 30); - out[9 + outpos] = ((in[26 + inpos] & 2047) >>> (11 - 9)) - | ((in[27 + inpos] & 2047) << 9) - | ((in[28 + inpos] & 2047) << 20) + out[9 + outpos] = ((in[26 + inpos]) >>> (11 - 9)) + | ((in[27 + inpos]) << 9) | ((in[28 + inpos]) << 20) | ((in[29 + inpos]) << 31); - out[10 + outpos] = ((in[29 + inpos] & 2047) >>> (11 - 10)) - | ((in[30 + inpos] & 2047) << 10) - | ((in[31 + inpos]) << 21); + out[10 + outpos] = ((in[29 + inpos]) >>> (11 - 10)) + | ((in[30 + inpos]) << 10) | ((in[31 + inpos]) << 21); } - protected static void fastpack12(final int[] in, int inpos, + protected static void fastpackwithoutmask12(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 4095) - | ((in[1 + inpos] & 4095) << 12) + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 12) | ((in[2 + inpos]) << 24); - out[1 + outpos] = ((in[2 + inpos] & 4095) >>> (12 - 4)) - | ((in[3 + inpos] & 4095) << 4) - | ((in[4 + inpos] & 4095) << 16) + out[1 + outpos] = ((in[2 + inpos]) >>> (12 - 4)) + | ((in[3 + inpos]) << 4) | ((in[4 + inpos]) << 16) | ((in[5 + inpos]) << 28); - out[2 + outpos] = ((in[5 + inpos] & 4095) >>> (12 - 8)) - | ((in[6 + inpos] & 4095) << 8) - | ((in[7 + inpos]) << 20); - out[3 + outpos] = (in[8 + inpos] & 4095) - | ((in[9 + inpos] & 4095) << 12) + out[2 + outpos] = ((in[5 + inpos]) >>> (12 - 8)) + | ((in[6 + inpos]) << 8) | ((in[7 + inpos]) << 20); + out[3 + outpos] = in[8 + inpos] | ((in[9 + inpos]) << 12) | ((in[10 + inpos]) << 24); - out[4 + outpos] = ((in[10 + inpos] & 4095) >>> (12 - 4)) - | ((in[11 + inpos] & 4095) << 4) - | ((in[12 + inpos] & 4095) << 16) + out[4 + outpos] = ((in[10 + inpos]) >>> (12 - 4)) + | ((in[11 + inpos]) << 4) | ((in[12 + inpos]) << 16) | ((in[13 + inpos]) << 28); - out[5 + outpos] = ((in[13 + inpos] & 4095) >>> (12 - 8)) - | ((in[14 + inpos] & 4095) << 8) - | ((in[15 + inpos]) << 20); - out[6 + outpos] = (in[16 + inpos] & 4095) - | ((in[17 + inpos] & 4095) << 12) + out[5 + outpos] = ((in[13 + inpos]) >>> (12 - 8)) + | ((in[14 + inpos]) << 8) | ((in[15 + inpos]) << 20); + out[6 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 12) | ((in[18 + inpos]) << 24); - out[7 + outpos] = ((in[18 + inpos] & 4095) >>> (12 - 4)) - | ((in[19 + inpos] & 4095) << 4) - | ((in[20 + inpos] & 4095) << 16) + out[7 + outpos] = ((in[18 + inpos]) >>> (12 - 4)) + | ((in[19 + inpos]) << 4) | ((in[20 + inpos]) << 16) | ((in[21 + inpos]) << 28); - out[8 + outpos] = ((in[21 + inpos] & 4095) >>> (12 - 8)) - | ((in[22 + inpos] & 4095) << 8) - | ((in[23 + inpos]) << 20); - out[9 + outpos] = (in[24 + inpos] & 4095) - | ((in[25 + inpos] & 4095) << 12) + out[8 + outpos] = ((in[21 + inpos]) >>> (12 - 8)) + | ((in[22 + inpos]) << 8) | ((in[23 + inpos]) << 20); + out[9 + outpos] = in[24 + inpos] | ((in[25 + inpos]) << 12) | ((in[26 + inpos]) << 24); - out[10 + outpos] = ((in[26 + inpos] & 4095) >>> (12 - 4)) - | ((in[27 + inpos] & 4095) << 4) - | ((in[28 + inpos] & 4095) << 16) + out[10 + outpos] = ((in[26 + inpos]) >>> (12 - 4)) + | ((in[27 + inpos]) << 4) | ((in[28 + inpos]) << 16) | ((in[29 + inpos]) << 28); - out[11 + outpos] = ((in[29 + inpos] & 4095) >>> (12 - 8)) - | ((in[30 + inpos] & 4095) << 8) - | ((in[31 + inpos]) << 20); + out[11 + outpos] = ((in[29 + inpos]) >>> (12 - 8)) + | ((in[30 + inpos]) << 8) | ((in[31 + inpos]) << 20); } - protected static void fastpack13(final int[] in, int inpos, + protected static void fastpackwithoutmask13(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 8191) - | ((in[1 + inpos] & 8191) << 13) + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 13) | ((in[2 + inpos]) << 26); - out[1 + outpos] = ((in[2 + inpos] & 8191) >>> (13 - 7)) - | ((in[3 + inpos] & 8191) << 7) - | ((in[4 + inpos]) << 20); - out[2 + outpos] = ((in[4 + inpos] & 8191) >>> (13 - 1)) - | ((in[5 + inpos] & 8191) << 1) - | ((in[6 + inpos] & 8191) << 14) + out[1 + outpos] = ((in[2 + inpos]) >>> (13 - 7)) + | ((in[3 + inpos]) << 7) | ((in[4 + inpos]) << 20); + out[2 + outpos] = ((in[4 + inpos]) >>> (13 - 1)) + | ((in[5 + inpos]) << 1) | ((in[6 + inpos]) << 14) | ((in[7 + inpos]) << 27); - out[3 + outpos] = ((in[7 + inpos] & 8191) >>> (13 - 8)) - | ((in[8 + inpos] & 8191) << 8) - | ((in[9 + inpos]) << 21); - out[4 + outpos] = ((in[9 + inpos] & 8191) >>> (13 - 2)) - | ((in[10 + inpos] & 8191) << 2) - | ((in[11 + inpos] & 8191) << 15) + out[3 + outpos] = ((in[7 + inpos]) >>> (13 - 8)) + | ((in[8 + inpos]) << 8) | ((in[9 + inpos]) << 21); + out[4 + outpos] = ((in[9 + inpos]) >>> (13 - 2)) + | ((in[10 + inpos]) << 2) | ((in[11 + inpos]) << 15) | ((in[12 + inpos]) << 28); - out[5 + outpos] = ((in[12 + inpos] & 8191) >>> (13 - 9)) - | ((in[13 + inpos] & 8191) << 9) - | ((in[14 + inpos]) << 22); - out[6 + outpos] = ((in[14 + inpos] & 8191) >>> (13 - 3)) - | ((in[15 + inpos] & 8191) << 3) - | ((in[16 + inpos] & 8191) << 16) + out[5 + outpos] = ((in[12 + inpos]) >>> (13 - 9)) + | ((in[13 + inpos]) << 9) | ((in[14 + inpos]) << 22); + out[6 + outpos] = ((in[14 + inpos]) >>> (13 - 3)) + | ((in[15 + inpos]) << 3) | ((in[16 + inpos]) << 16) | ((in[17 + inpos]) << 29); - out[7 + outpos] = ((in[17 + inpos] & 8191) >>> (13 - 10)) - | ((in[18 + inpos] & 8191) << 10) - | ((in[19 + inpos]) << 23); - out[8 + outpos] = ((in[19 + inpos] & 8191) >>> (13 - 4)) - | ((in[20 + inpos] & 8191) << 4) - | ((in[21 + inpos] & 8191) << 17) + out[7 + outpos] = ((in[17 + inpos]) >>> (13 - 10)) + | ((in[18 + inpos]) << 10) | ((in[19 + inpos]) << 23); + out[8 + outpos] = ((in[19 + inpos]) >>> (13 - 4)) + | ((in[20 + inpos]) << 4) | ((in[21 + inpos]) << 17) | ((in[22 + inpos]) << 30); - out[9 + outpos] = ((in[22 + inpos] & 8191) >>> (13 - 11)) - | ((in[23 + inpos] & 8191) << 11) - | ((in[24 + inpos]) << 24); - out[10 + outpos] = ((in[24 + inpos] & 8191) >>> (13 - 5)) - | ((in[25 + inpos] & 8191) << 5) - | ((in[26 + inpos] & 8191) << 18) + out[9 + outpos] = ((in[22 + inpos]) >>> (13 - 11)) + | ((in[23 + inpos]) << 11) | ((in[24 + inpos]) << 24); + out[10 + outpos] = ((in[24 + inpos]) >>> (13 - 5)) + | ((in[25 + inpos]) << 5) | ((in[26 + inpos]) << 18) | ((in[27 + inpos]) << 31); - out[11 + outpos] = ((in[27 + inpos] & 8191) >>> (13 - 12)) - | ((in[28 + inpos] & 8191) << 12) - | ((in[29 + inpos]) << 25); - out[12 + outpos] = ((in[29 + inpos] & 8191) >>> (13 - 6)) - | ((in[30 + inpos] & 8191) << 6) - | ((in[31 + inpos]) << 19); + out[11 + outpos] = ((in[27 + inpos]) >>> (13 - 12)) + | ((in[28 + inpos]) << 12) | ((in[29 + inpos]) << 25); + out[12 + outpos] = ((in[29 + inpos]) >>> (13 - 6)) + | ((in[30 + inpos]) << 6) | ((in[31 + inpos]) << 19); } - protected static void fastpack14(final int[] in, int inpos, + protected static void fastpackwithoutmask14(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 16383) - | ((in[1 + inpos] & 16383) << 14) + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 14) | ((in[2 + inpos]) << 28); - out[1 + outpos] = ((in[2 + inpos] & 16383) >>> (14 - 10)) - | ((in[3 + inpos] & 16383) << 10) - | ((in[4 + inpos]) << 24); - out[2 + outpos] = ((in[4 + inpos] & 16383) >>> (14 - 6)) - | ((in[5 + inpos] & 16383) << 6) - | ((in[6 + inpos]) << 20); - out[3 + outpos] = ((in[6 + inpos] & 16383) >>> (14 - 2)) - | ((in[7 + inpos] & 16383) << 2) - | ((in[8 + inpos] & 16383) << 16) + out[1 + outpos] = ((in[2 + inpos]) >>> (14 - 10)) + | ((in[3 + inpos]) << 10) | ((in[4 + inpos]) << 24); + out[2 + outpos] = ((in[4 + inpos]) >>> (14 - 6)) + | ((in[5 + inpos]) << 6) | ((in[6 + inpos]) << 20); + out[3 + outpos] = ((in[6 + inpos]) >>> (14 - 2)) + | ((in[7 + inpos]) << 2) | ((in[8 + inpos]) << 16) | ((in[9 + inpos]) << 30); - out[4 + outpos] = ((in[9 + inpos] & 16383) >>> (14 - 12)) - | ((in[10 + inpos] & 16383) << 12) - | ((in[11 + inpos]) << 26); - out[5 + outpos] = ((in[11 + inpos] & 16383) >>> (14 - 8)) - | ((in[12 + inpos] & 16383) << 8) - | ((in[13 + inpos]) << 22); - out[6 + outpos] = ((in[13 + inpos] & 16383) >>> (14 - 4)) - | ((in[14 + inpos] & 16383) << 4) - | ((in[15 + inpos]) << 18); - out[7 + outpos] = (in[16 + inpos] & 16383) - | ((in[17 + inpos] & 16383) << 14) + out[4 + outpos] = ((in[9 + inpos]) >>> (14 - 12)) + | ((in[10 + inpos]) << 12) | ((in[11 + inpos]) << 26); + out[5 + outpos] = ((in[11 + inpos]) >>> (14 - 8)) + | ((in[12 + inpos]) << 8) | ((in[13 + inpos]) << 22); + out[6 + outpos] = ((in[13 + inpos]) >>> (14 - 4)) + | ((in[14 + inpos]) << 4) | ((in[15 + inpos]) << 18); + out[7 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 14) | ((in[18 + inpos]) << 28); - out[8 + outpos] = ((in[18 + inpos] & 16383) >>> (14 - 10)) - | ((in[19 + inpos] & 16383) << 10) - | ((in[20 + inpos]) << 24); - out[9 + outpos] = ((in[20 + inpos] & 16383) >>> (14 - 6)) - | ((in[21 + inpos] & 16383) << 6) - | ((in[22 + inpos]) << 20); - out[10 + outpos] = ((in[22 + inpos] & 16383) >>> (14 - 2)) - | ((in[23 + inpos] & 16383) << 2) - | ((in[24 + inpos] & 16383) << 16) + out[8 + outpos] = ((in[18 + inpos]) >>> (14 - 10)) + | ((in[19 + inpos]) << 10) | ((in[20 + inpos]) << 24); + out[9 + outpos] = ((in[20 + inpos]) >>> (14 - 6)) + | ((in[21 + inpos]) << 6) | ((in[22 + inpos]) << 20); + out[10 + outpos] = ((in[22 + inpos]) >>> (14 - 2)) + | ((in[23 + inpos]) << 2) | ((in[24 + inpos]) << 16) | ((in[25 + inpos]) << 30); - out[11 + outpos] = ((in[25 + inpos] & 16383) >>> (14 - 12)) - | ((in[26 + inpos] & 16383) << 12) - | ((in[27 + inpos]) << 26); - out[12 + outpos] = ((in[27 + inpos] & 16383) >>> (14 - 8)) - | ((in[28 + inpos] & 16383) << 8) - | ((in[29 + inpos]) << 22); - out[13 + outpos] = ((in[29 + inpos] & 16383) >>> (14 - 4)) - | ((in[30 + inpos] & 16383) << 4) - | ((in[31 + inpos]) << 18); + out[11 + outpos] = ((in[25 + inpos]) >>> (14 - 12)) + | ((in[26 + inpos]) << 12) | ((in[27 + inpos]) << 26); + out[12 + outpos] = ((in[27 + inpos]) >>> (14 - 8)) + | ((in[28 + inpos]) << 8) | ((in[29 + inpos]) << 22); + out[13 + outpos] = ((in[29 + inpos]) >>> (14 - 4)) + | ((in[30 + inpos]) << 4) | ((in[31 + inpos]) << 18); } - protected static void fastpack15(final int[] in, int inpos, + protected static void fastpackwithoutmask15(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 32767) - | ((in[1 + inpos] & 32767) << 15) + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 15) | ((in[2 + inpos]) << 30); - out[1 + outpos] = ((in[2 + inpos] & 32767) >>> (15 - 13)) - | ((in[3 + inpos] & 32767) << 13) - | ((in[4 + inpos]) << 28); - out[2 + outpos] = ((in[4 + inpos] & 32767) >>> (15 - 11)) - | ((in[5 + inpos] & 32767) << 11) - | ((in[6 + inpos]) << 26); - out[3 + outpos] = ((in[6 + inpos] & 32767) >>> (15 - 9)) - | ((in[7 + inpos] & 32767) << 9) - | ((in[8 + inpos]) << 24); - out[4 + outpos] = ((in[8 + inpos] & 32767) >>> (15 - 7)) - | ((in[9 + inpos] & 32767) << 7) - | ((in[10 + inpos]) << 22); - out[5 + outpos] = ((in[10 + inpos] & 32767) >>> (15 - 5)) - | ((in[11 + inpos] & 32767) << 5) - | ((in[12 + inpos]) << 20); - out[6 + outpos] = ((in[12 + inpos] & 32767) >>> (15 - 3)) - | ((in[13 + inpos] & 32767) << 3) - | ((in[14 + inpos]) << 18); - out[7 + outpos] = ((in[14 + inpos] & 32767) >>> (15 - 1)) - | ((in[15 + inpos] & 32767) << 1) - | ((in[16 + inpos] & 32767) << 16) + out[1 + outpos] = ((in[2 + inpos]) >>> (15 - 13)) + | ((in[3 + inpos]) << 13) | ((in[4 + inpos]) << 28); + out[2 + outpos] = ((in[4 + inpos]) >>> (15 - 11)) + | ((in[5 + inpos]) << 11) | ((in[6 + inpos]) << 26); + out[3 + outpos] = ((in[6 + inpos]) >>> (15 - 9)) + | ((in[7 + inpos]) << 9) | ((in[8 + inpos]) << 24); + out[4 + outpos] = ((in[8 + inpos]) >>> (15 - 7)) + | ((in[9 + inpos]) << 7) | ((in[10 + inpos]) << 22); + out[5 + outpos] = ((in[10 + inpos]) >>> (15 - 5)) + | ((in[11 + inpos]) << 5) | ((in[12 + inpos]) << 20); + out[6 + outpos] = ((in[12 + inpos]) >>> (15 - 3)) + | ((in[13 + inpos]) << 3) | ((in[14 + inpos]) << 18); + out[7 + outpos] = ((in[14 + inpos]) >>> (15 - 1)) + | ((in[15 + inpos]) << 1) | ((in[16 + inpos]) << 16) | ((in[17 + inpos]) << 31); - out[8 + outpos] = ((in[17 + inpos] & 32767) >>> (15 - 14)) - | ((in[18 + inpos] & 32767) << 14) - | ((in[19 + inpos]) << 29); - out[9 + outpos] = ((in[19 + inpos] & 32767) >>> (15 - 12)) - | ((in[20 + inpos] & 32767) << 12) - | ((in[21 + inpos]) << 27); - out[10 + outpos] = ((in[21 + inpos] & 32767) >>> (15 - 10)) - | ((in[22 + inpos] & 32767) << 10) - | ((in[23 + inpos]) << 25); - out[11 + outpos] = ((in[23 + inpos] & 32767) >>> (15 - 8)) - | ((in[24 + inpos] & 32767) << 8) - | ((in[25 + inpos]) << 23); - out[12 + outpos] = ((in[25 + inpos] & 32767) >>> (15 - 6)) - | ((in[26 + inpos] & 32767) << 6) - | ((in[27 + inpos]) << 21); - out[13 + outpos] = ((in[27 + inpos] & 32767) >>> (15 - 4)) - | ((in[28 + inpos] & 32767) << 4) - | ((in[29 + inpos]) << 19); - out[14 + outpos] = ((in[29 + inpos] & 32767) >>> (15 - 2)) - | ((in[30 + inpos] & 32767) << 2) - | ((in[31 + inpos]) << 17); + out[8 + outpos] = ((in[17 + inpos]) >>> (15 - 14)) + | ((in[18 + inpos]) << 14) | ((in[19 + inpos]) << 29); + out[9 + outpos] = ((in[19 + inpos]) >>> (15 - 12)) + | ((in[20 + inpos]) << 12) | ((in[21 + inpos]) << 27); + out[10 + outpos] = ((in[21 + inpos]) >>> (15 - 10)) + | ((in[22 + inpos]) << 10) | ((in[23 + inpos]) << 25); + out[11 + outpos] = ((in[23 + inpos]) >>> (15 - 8)) + | ((in[24 + inpos]) << 8) | ((in[25 + inpos]) << 23); + out[12 + outpos] = ((in[25 + inpos]) >>> (15 - 6)) + | ((in[26 + inpos]) << 6) | ((in[27 + inpos]) << 21); + out[13 + outpos] = ((in[27 + inpos]) >>> (15 - 4)) + | ((in[28 + inpos]) << 4) | ((in[29 + inpos]) << 19); + out[14 + outpos] = ((in[29 + inpos]) >>> (15 - 2)) + | ((in[30 + inpos]) << 2) | ((in[31 + inpos]) << 17); } - protected static void fastpack16(final int[] in, int inpos, + protected static void fastpackwithoutmask16(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 65535) - | ((in[1 + inpos]) << 16); - out[1 + outpos] = (in[2 + inpos] & 65535) - | ((in[3 + inpos]) << 16); - out[2 + outpos] = (in[4 + inpos] & 65535) - | ((in[5 + inpos]) << 16); - out[3 + outpos] = (in[6 + inpos] & 65535) - | ((in[7 + inpos]) << 16); - out[4 + outpos] = (in[8 + inpos] & 65535) - | ((in[9 + inpos]) << 16); - out[5 + outpos] = (in[10 + inpos] & 65535) - | ((in[11 + inpos]) << 16); - out[6 + outpos] = (in[12 + inpos] & 65535) - | ((in[13 + inpos]) << 16); - out[7 + outpos] = (in[14 + inpos] & 65535) - | ((in[15 + inpos]) << 16); - out[8 + outpos] = (in[16 + inpos] & 65535) - | ((in[17 + inpos]) << 16); - out[9 + outpos] = (in[18 + inpos] & 65535) - | ((in[19 + inpos]) << 16); - out[10 + outpos] = (in[20 + inpos] & 65535) - | ((in[21 + inpos]) << 16); - out[11 + outpos] = (in[22 + inpos] & 65535) - | ((in[23 + inpos]) << 16); - out[12 + outpos] = (in[24 + inpos] & 65535) - | ((in[25 + inpos]) << 16); - out[13 + outpos] = (in[26 + inpos] & 65535) - | ((in[27 + inpos]) << 16); - out[14 + outpos] = (in[28 + inpos] & 65535) - | ((in[29 + inpos]) << 16); - out[15 + outpos] = (in[30 + inpos] & 65535) - | ((in[31 + inpos]) << 16); + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 16); + out[1 + outpos] = in[2 + inpos] | ((in[3 + inpos]) << 16); + out[2 + outpos] = in[4 + inpos] | ((in[5 + inpos]) << 16); + out[3 + outpos] = in[6 + inpos] | ((in[7 + inpos]) << 16); + out[4 + outpos] = in[8 + inpos] | ((in[9 + inpos]) << 16); + out[5 + outpos] = in[10 + inpos] | ((in[11 + inpos]) << 16); + out[6 + outpos] = in[12 + inpos] | ((in[13 + inpos]) << 16); + out[7 + outpos] = in[14 + inpos] | ((in[15 + inpos]) << 16); + out[8 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 16); + out[9 + outpos] = in[18 + inpos] | ((in[19 + inpos]) << 16); + out[10 + outpos] = in[20 + inpos] | ((in[21 + inpos]) << 16); + out[11 + outpos] = in[22 + inpos] | ((in[23 + inpos]) << 16); + out[12 + outpos] = in[24 + inpos] | ((in[25 + inpos]) << 16); + out[13 + outpos] = in[26 + inpos] | ((in[27 + inpos]) << 16); + out[14 + outpos] = in[28 + inpos] | ((in[29 + inpos]) << 16); + out[15 + outpos] = in[30 + inpos] | ((in[31 + inpos]) << 16); } - protected static void fastpack17(final int[] in, int inpos, + protected static void fastpackwithoutmask17(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 131071) - | ((in[1 + inpos]) << 17); - out[1 + outpos] = ((in[1 + inpos] & 131071) >>> (17 - 2)) - | ((in[2 + inpos] & 131071) << 2) - | ((in[3 + inpos]) << 19); - out[2 + outpos] = ((in[3 + inpos] & 131071) >>> (17 - 4)) - | ((in[4 + inpos] & 131071) << 4) - | ((in[5 + inpos]) << 21); - out[3 + outpos] = ((in[5 + inpos] & 131071) >>> (17 - 6)) - | ((in[6 + inpos] & 131071) << 6) - | ((in[7 + inpos]) << 23); - out[4 + outpos] = ((in[7 + inpos] & 131071) >>> (17 - 8)) - | ((in[8 + inpos] & 131071) << 8) - | ((in[9 + inpos]) << 25); - out[5 + outpos] = ((in[9 + inpos] & 131071) >>> (17 - 10)) - | ((in[10 + inpos] & 131071) << 10) - | ((in[11 + inpos]) << 27); - out[6 + outpos] = ((in[11 + inpos] & 131071) >>> (17 - 12)) - | ((in[12 + inpos] & 131071) << 12) - | ((in[13 + inpos]) << 29); - out[7 + outpos] = ((in[13 + inpos] & 131071) >>> (17 - 14)) - | ((in[14 + inpos] & 131071) << 14) - | ((in[15 + inpos]) << 31); - out[8 + outpos] = ((in[15 + inpos] & 131071) >>> (17 - 16)) + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 17); + out[1 + outpos] = ((in[1 + inpos]) >>> (17 - 2)) + | ((in[2 + inpos]) << 2) | ((in[3 + inpos]) << 19); + out[2 + outpos] = ((in[3 + inpos]) >>> (17 - 4)) + | ((in[4 + inpos]) << 4) | ((in[5 + inpos]) << 21); + out[3 + outpos] = ((in[5 + inpos]) >>> (17 - 6)) + | ((in[6 + inpos]) << 6) | ((in[7 + inpos]) << 23); + out[4 + outpos] = ((in[7 + inpos]) >>> (17 - 8)) + | ((in[8 + inpos]) << 8) | ((in[9 + inpos]) << 25); + out[5 + outpos] = ((in[9 + inpos]) >>> (17 - 10)) + | ((in[10 + inpos]) << 10) | ((in[11 + inpos]) << 27); + out[6 + outpos] = ((in[11 + inpos]) >>> (17 - 12)) + | ((in[12 + inpos]) << 12) | ((in[13 + inpos]) << 29); + out[7 + outpos] = ((in[13 + inpos]) >>> (17 - 14)) + | ((in[14 + inpos]) << 14) | ((in[15 + inpos]) << 31); + out[8 + outpos] = ((in[15 + inpos]) >>> (17 - 16)) | ((in[16 + inpos]) << 16); - out[9 + outpos] = ((in[16 + inpos] & 131071) >>> (17 - 1)) - | ((in[17 + inpos] & 131071) << 1) - | ((in[18 + inpos]) << 18); - out[10 + outpos] = ((in[18 + inpos] & 131071) >>> (17 - 3)) - | ((in[19 + inpos] & 131071) << 3) - | ((in[20 + inpos]) << 20); - out[11 + outpos] = ((in[20 + inpos] & 131071) >>> (17 - 5)) - | ((in[21 + inpos] & 131071) << 5) - | ((in[22 + inpos]) << 22); - out[12 + outpos] = ((in[22 + inpos] & 131071) >>> (17 - 7)) - | ((in[23 + inpos] & 131071) << 7) - | ((in[24 + inpos]) << 24); - out[13 + outpos] = ((in[24 + inpos] & 131071) >>> (17 - 9)) - | ((in[25 + inpos] & 131071) << 9) - | ((in[26 + inpos]) << 26); - out[14 + outpos] = ((in[26 + inpos] & 131071) >>> (17 - 11)) - | ((in[27 + inpos] & 131071) << 11) - | ((in[28 + inpos]) << 28); - out[15 + outpos] = ((in[28 + inpos] & 131071) >>> (17 - 13)) - | ((in[29 + inpos] & 131071) << 13) - | ((in[30 + inpos]) << 30); - out[16 + outpos] = ((in[30 + inpos] & 131071) >>> (17 - 15)) + out[9 + outpos] = ((in[16 + inpos]) >>> (17 - 1)) + | ((in[17 + inpos]) << 1) | ((in[18 + inpos]) << 18); + out[10 + outpos] = ((in[18 + inpos]) >>> (17 - 3)) + | ((in[19 + inpos]) << 3) | ((in[20 + inpos]) << 20); + out[11 + outpos] = ((in[20 + inpos]) >>> (17 - 5)) + | ((in[21 + inpos]) << 5) | ((in[22 + inpos]) << 22); + out[12 + outpos] = ((in[22 + inpos]) >>> (17 - 7)) + | ((in[23 + inpos]) << 7) | ((in[24 + inpos]) << 24); + out[13 + outpos] = ((in[24 + inpos]) >>> (17 - 9)) + | ((in[25 + inpos]) << 9) | ((in[26 + inpos]) << 26); + out[14 + outpos] = ((in[26 + inpos]) >>> (17 - 11)) + | ((in[27 + inpos]) << 11) | ((in[28 + inpos]) << 28); + out[15 + outpos] = ((in[28 + inpos]) >>> (17 - 13)) + | ((in[29 + inpos]) << 13) | ((in[30 + inpos]) << 30); + out[16 + outpos] = ((in[30 + inpos]) >>> (17 - 15)) | ((in[31 + inpos]) << 15); } - protected static void fastpack18(final int[] in, int inpos, + protected static void fastpackwithoutmask18(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 262143) - | ((in[1 + inpos]) << 18); - out[1 + outpos] = ((in[1 + inpos] & 262143) >>> (18 - 4)) - | ((in[2 + inpos] & 262143) << 4) - | ((in[3 + inpos]) << 22); - out[2 + outpos] = ((in[3 + inpos] & 262143) >>> (18 - 8)) - | ((in[4 + inpos] & 262143) << 8) - | ((in[5 + inpos]) << 26); - out[3 + outpos] = ((in[5 + inpos] & 262143) >>> (18 - 12)) - | ((in[6 + inpos] & 262143) << 12) - | ((in[7 + inpos]) << 30); - out[4 + outpos] = ((in[7 + inpos] & 262143) >>> (18 - 16)) + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 18); + out[1 + outpos] = ((in[1 + inpos]) >>> (18 - 4)) + | ((in[2 + inpos]) << 4) | ((in[3 + inpos]) << 22); + out[2 + outpos] = ((in[3 + inpos]) >>> (18 - 8)) + | ((in[4 + inpos]) << 8) | ((in[5 + inpos]) << 26); + out[3 + outpos] = ((in[5 + inpos]) >>> (18 - 12)) + | ((in[6 + inpos]) << 12) | ((in[7 + inpos]) << 30); + out[4 + outpos] = ((in[7 + inpos]) >>> (18 - 16)) | ((in[8 + inpos]) << 16); - out[5 + outpos] = ((in[8 + inpos] & 262143) >>> (18 - 2)) - | ((in[9 + inpos] & 262143) << 2) - | ((in[10 + inpos]) << 20); - out[6 + outpos] = ((in[10 + inpos] & 262143) >>> (18 - 6)) - | ((in[11 + inpos] & 262143) << 6) - | ((in[12 + inpos]) << 24); - out[7 + outpos] = ((in[12 + inpos] & 262143) >>> (18 - 10)) - | ((in[13 + inpos] & 262143) << 10) - | ((in[14 + inpos]) << 28); - out[8 + outpos] = ((in[14 + inpos] & 262143) >>> (18 - 14)) + out[5 + outpos] = ((in[8 + inpos]) >>> (18 - 2)) + | ((in[9 + inpos]) << 2) | ((in[10 + inpos]) << 20); + out[6 + outpos] = ((in[10 + inpos]) >>> (18 - 6)) + | ((in[11 + inpos]) << 6) | ((in[12 + inpos]) << 24); + out[7 + outpos] = ((in[12 + inpos]) >>> (18 - 10)) + | ((in[13 + inpos]) << 10) | ((in[14 + inpos]) << 28); + out[8 + outpos] = ((in[14 + inpos]) >>> (18 - 14)) | ((in[15 + inpos]) << 14); - out[9 + outpos] = (in[16 + inpos] & 262143) - | ((in[17 + inpos]) << 18); - out[10 + outpos] = ((in[17 + inpos] & 262143) >>> (18 - 4)) - | ((in[18 + inpos] & 262143) << 4) - | ((in[19 + inpos]) << 22); - out[11 + outpos] = ((in[19 + inpos] & 262143) >>> (18 - 8)) - | ((in[20 + inpos] & 262143) << 8) - | ((in[21 + inpos]) << 26); - out[12 + outpos] = ((in[21 + inpos] & 262143) >>> (18 - 12)) - | ((in[22 + inpos] & 262143) << 12) - | ((in[23 + inpos]) << 30); - out[13 + outpos] = ((in[23 + inpos] & 262143) >>> (18 - 16)) + out[9 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 18); + out[10 + outpos] = ((in[17 + inpos]) >>> (18 - 4)) + | ((in[18 + inpos]) << 4) | ((in[19 + inpos]) << 22); + out[11 + outpos] = ((in[19 + inpos]) >>> (18 - 8)) + | ((in[20 + inpos]) << 8) | ((in[21 + inpos]) << 26); + out[12 + outpos] = ((in[21 + inpos]) >>> (18 - 12)) + | ((in[22 + inpos]) << 12) | ((in[23 + inpos]) << 30); + out[13 + outpos] = ((in[23 + inpos]) >>> (18 - 16)) | ((in[24 + inpos]) << 16); - out[14 + outpos] = ((in[24 + inpos] & 262143) >>> (18 - 2)) - | ((in[25 + inpos] & 262143) << 2) - | ((in[26 + inpos]) << 20); - out[15 + outpos] = ((in[26 + inpos] & 262143) >>> (18 - 6)) - | ((in[27 + inpos] & 262143) << 6) - | ((in[28 + inpos]) << 24); - out[16 + outpos] = ((in[28 + inpos] & 262143) >>> (18 - 10)) - | ((in[29 + inpos] & 262143) << 10) - | ((in[30 + inpos]) << 28); - out[17 + outpos] = ((in[30 + inpos] & 262143) >>> (18 - 14)) + out[14 + outpos] = ((in[24 + inpos]) >>> (18 - 2)) + | ((in[25 + inpos]) << 2) | ((in[26 + inpos]) << 20); + out[15 + outpos] = ((in[26 + inpos]) >>> (18 - 6)) + | ((in[27 + inpos]) << 6) | ((in[28 + inpos]) << 24); + out[16 + outpos] = ((in[28 + inpos]) >>> (18 - 10)) + | ((in[29 + inpos]) << 10) | ((in[30 + inpos]) << 28); + out[17 + outpos] = ((in[30 + inpos]) >>> (18 - 14)) | ((in[31 + inpos]) << 14); } - protected static void fastpack19(final int[] in, int inpos, + protected static void fastpackwithoutmask19(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 524287) - | ((in[1 + inpos]) << 19); - out[1 + outpos] = ((in[1 + inpos] & 524287) >>> (19 - 6)) - | ((in[2 + inpos] & 524287) << 6) - | ((in[3 + inpos]) << 25); - out[2 + outpos] = ((in[3 + inpos] & 524287) >>> (19 - 12)) - | ((in[4 + inpos] & 524287) << 12) - | ((in[5 + inpos]) << 31); - out[3 + outpos] = ((in[5 + inpos] & 524287) >>> (19 - 18)) + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 19); + out[1 + outpos] = ((in[1 + inpos]) >>> (19 - 6)) + | ((in[2 + inpos]) << 6) | ((in[3 + inpos]) << 25); + out[2 + outpos] = ((in[3 + inpos]) >>> (19 - 12)) + | ((in[4 + inpos]) << 12) | ((in[5 + inpos]) << 31); + out[3 + outpos] = ((in[5 + inpos]) >>> (19 - 18)) | ((in[6 + inpos]) << 18); - out[4 + outpos] = ((in[6 + inpos] & 524287) >>> (19 - 5)) - | ((in[7 + inpos] & 524287) << 5) - | ((in[8 + inpos]) << 24); - out[5 + outpos] = ((in[8 + inpos] & 524287) >>> (19 - 11)) - | ((in[9 + inpos] & 524287) << 11) - | ((in[10 + inpos]) << 30); - out[6 + outpos] = ((in[10 + inpos] & 524287) >>> (19 - 17)) - | ((in[11 + inpos]) << 17); - out[7 + outpos] = ((in[11 + inpos] & 524287) >>> (19 - 4)) - | ((in[12 + inpos] & 524287) << 4) - | ((in[13 + inpos]) << 23); - out[8 + outpos] = ((in[13 + inpos] & 524287) >>> (19 - 10)) - | ((in[14 + inpos] & 524287) << 10) - | ((in[15 + inpos]) << 29); - out[9 + outpos] = ((in[15 + inpos] & 524287) >>> (19 - 16)) + out[4 + outpos] = ((in[6 + inpos]) >>> (19 - 5)) + | ((in[7 + inpos]) << 5) | ((in[8 + inpos]) << 24); + out[5 + outpos] = ((in[8 + inpos]) >>> (19 - 11)) + | ((in[9 + inpos]) << 11) | ((in[10 + inpos]) << 30); + out[6 + outpos] = ((in[10 + inpos]) >>> (19 - 17)) + | ((in[11 + inpos]) << 17); + out[7 + outpos] = ((in[11 + inpos]) >>> (19 - 4)) + | ((in[12 + inpos]) << 4) | ((in[13 + inpos]) << 23); + out[8 + outpos] = ((in[13 + inpos]) >>> (19 - 10)) + | ((in[14 + inpos]) << 10) | ((in[15 + inpos]) << 29); + out[9 + outpos] = ((in[15 + inpos]) >>> (19 - 16)) | ((in[16 + inpos]) << 16); - out[10 + outpos] = ((in[16 + inpos] & 524287) >>> (19 - 3)) - | ((in[17 + inpos] & 524287) << 3) - | ((in[18 + inpos]) << 22); - out[11 + outpos] = ((in[18 + inpos] & 524287) >>> (19 - 9)) - | ((in[19 + inpos] & 524287) << 9) - | ((in[20 + inpos]) << 28); - out[12 + outpos] = ((in[20 + inpos] & 524287) >>> (19 - 15)) + out[10 + outpos] = ((in[16 + inpos]) >>> (19 - 3)) + | ((in[17 + inpos]) << 3) | ((in[18 + inpos]) << 22); + out[11 + outpos] = ((in[18 + inpos]) >>> (19 - 9)) + | ((in[19 + inpos]) << 9) | ((in[20 + inpos]) << 28); + out[12 + outpos] = ((in[20 + inpos]) >>> (19 - 15)) | ((in[21 + inpos]) << 15); - out[13 + outpos] = ((in[21 + inpos] & 524287) >>> (19 - 2)) - | ((in[22 + inpos] & 524287) << 2) - | ((in[23 + inpos]) << 21); - out[14 + outpos] = ((in[23 + inpos] & 524287) >>> (19 - 8)) - | ((in[24 + inpos] & 524287) << 8) - | ((in[25 + inpos]) << 27); - out[15 + outpos] = ((in[25 + inpos] & 524287) >>> (19 - 14)) + out[13 + outpos] = ((in[21 + inpos]) >>> (19 - 2)) + | ((in[22 + inpos]) << 2) | ((in[23 + inpos]) << 21); + out[14 + outpos] = ((in[23 + inpos]) >>> (19 - 8)) + | ((in[24 + inpos]) << 8) | ((in[25 + inpos]) << 27); + out[15 + outpos] = ((in[25 + inpos]) >>> (19 - 14)) | ((in[26 + inpos]) << 14); - out[16 + outpos] = ((in[26 + inpos] & 524287) >>> (19 - 1)) - | ((in[27 + inpos] & 524287) << 1) - | ((in[28 + inpos]) << 20); - out[17 + outpos] = ((in[28 + inpos] & 524287) >>> (19 - 7)) - | ((in[29 + inpos] & 524287) << 7) - | ((in[30 + inpos]) << 26); - out[18 + outpos] = ((in[30 + inpos] & 524287) >>> (19 - 13)) + out[16 + outpos] = ((in[26 + inpos]) >>> (19 - 1)) + | ((in[27 + inpos]) << 1) | ((in[28 + inpos]) << 20); + out[17 + outpos] = ((in[28 + inpos]) >>> (19 - 7)) + | ((in[29 + inpos]) << 7) | ((in[30 + inpos]) << 26); + out[18 + outpos] = ((in[30 + inpos]) >>> (19 - 13)) | ((in[31 + inpos]) << 13); } - protected static void fastpack20(final int[] in, int inpos, + protected static void fastpackwithoutmask2(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 1048575) - | ((in[1 + inpos]) << 20); - out[1 + outpos] = ((in[1 + inpos] & 1048575) >>> (20 - 8)) - | ((in[2 + inpos] & 1048575) << 8) - | ((in[3 + inpos]) << 28); - out[2 + outpos] = ((in[3 + inpos] & 1048575) >>> (20 - 16)) + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 2) + | ((in[2 + inpos]) << 4) | ((in[3 + inpos]) << 6) + | ((in[4 + inpos]) << 8) | ((in[5 + inpos]) << 10) + | ((in[6 + inpos]) << 12) | ((in[7 + inpos]) << 14) + | ((in[8 + inpos]) << 16) | ((in[9 + inpos]) << 18) + | ((in[10 + inpos]) << 20) | ((in[11 + inpos]) << 22) + | ((in[12 + inpos]) << 24) | ((in[13 + inpos]) << 26) + | ((in[14 + inpos]) << 28) | ((in[15 + inpos]) << 30); + out[1 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 2) + | ((in[18 + inpos]) << 4) | ((in[19 + inpos]) << 6) + | ((in[20 + inpos]) << 8) | ((in[21 + inpos]) << 10) + | ((in[22 + inpos]) << 12) | ((in[23 + inpos]) << 14) + | ((in[24 + inpos]) << 16) | ((in[25 + inpos]) << 18) + | ((in[26 + inpos]) << 20) | ((in[27 + inpos]) << 22) + | ((in[28 + inpos]) << 24) | ((in[29 + inpos]) << 26) + | ((in[30 + inpos]) << 28) | ((in[31 + inpos]) << 30); + } + + protected static void fastpackwithoutmask20(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 20); + out[1 + outpos] = ((in[1 + inpos]) >>> (20 - 8)) + | ((in[2 + inpos]) << 8) | ((in[3 + inpos]) << 28); + out[2 + outpos] = ((in[3 + inpos]) >>> (20 - 16)) | ((in[4 + inpos]) << 16); - out[3 + outpos] = ((in[4 + inpos] & 1048575) >>> (20 - 4)) - | ((in[5 + inpos] & 1048575) << 4) - | ((in[6 + inpos]) << 24); - out[4 + outpos] = ((in[6 + inpos] & 1048575) >>> (20 - 12)) + out[3 + outpos] = ((in[4 + inpos]) >>> (20 - 4)) + | ((in[5 + inpos]) << 4) | ((in[6 + inpos]) << 24); + out[4 + outpos] = ((in[6 + inpos]) >>> (20 - 12)) | ((in[7 + inpos]) << 12); - out[5 + outpos] = (in[8 + inpos] & 1048575) - | ((in[9 + inpos]) << 20); - out[6 + outpos] = ((in[9 + inpos] & 1048575) >>> (20 - 8)) - | ((in[10 + inpos] & 1048575) << 8) - | ((in[11 + inpos]) << 28); - out[7 + outpos] = ((in[11 + inpos] & 1048575) >>> (20 - 16)) + out[5 + outpos] = in[8 + inpos] | ((in[9 + inpos]) << 20); + out[6 + outpos] = ((in[9 + inpos]) >>> (20 - 8)) + | ((in[10 + inpos]) << 8) | ((in[11 + inpos]) << 28); + out[7 + outpos] = ((in[11 + inpos]) >>> (20 - 16)) | ((in[12 + inpos]) << 16); - out[8 + outpos] = ((in[12 + inpos] & 1048575) >>> (20 - 4)) - | ((in[13 + inpos] & 1048575) << 4) - | ((in[14 + inpos]) << 24); - out[9 + outpos] = ((in[14 + inpos] & 1048575) >>> (20 - 12)) + out[8 + outpos] = ((in[12 + inpos]) >>> (20 - 4)) + | ((in[13 + inpos]) << 4) | ((in[14 + inpos]) << 24); + out[9 + outpos] = ((in[14 + inpos]) >>> (20 - 12)) | ((in[15 + inpos]) << 12); - out[10 + outpos] = (in[16 + inpos] & 1048575) - | ((in[17 + inpos]) << 20); - out[11 + outpos] = ((in[17 + inpos] & 1048575) >>> (20 - 8)) - | ((in[18 + inpos] & 1048575) << 8) - | ((in[19 + inpos]) << 28); - out[12 + outpos] = ((in[19 + inpos] & 1048575) >>> (20 - 16)) + out[10 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 20); + out[11 + outpos] = ((in[17 + inpos]) >>> (20 - 8)) + | ((in[18 + inpos]) << 8) | ((in[19 + inpos]) << 28); + out[12 + outpos] = ((in[19 + inpos]) >>> (20 - 16)) | ((in[20 + inpos]) << 16); - out[13 + outpos] = ((in[20 + inpos] & 1048575) >>> (20 - 4)) - | ((in[21 + inpos] & 1048575) << 4) - | ((in[22 + inpos]) << 24); - out[14 + outpos] = ((in[22 + inpos] & 1048575) >>> (20 - 12)) + out[13 + outpos] = ((in[20 + inpos]) >>> (20 - 4)) + | ((in[21 + inpos]) << 4) | ((in[22 + inpos]) << 24); + out[14 + outpos] = ((in[22 + inpos]) >>> (20 - 12)) | ((in[23 + inpos]) << 12); - out[15 + outpos] = (in[24 + inpos] & 1048575) - | ((in[25 + inpos]) << 20); - out[16 + outpos] = ((in[25 + inpos] & 1048575) >>> (20 - 8)) - | ((in[26 + inpos] & 1048575) << 8) - | ((in[27 + inpos]) << 28); - out[17 + outpos] = ((in[27 + inpos] & 1048575) >>> (20 - 16)) + out[15 + outpos] = in[24 + inpos] | ((in[25 + inpos]) << 20); + out[16 + outpos] = ((in[25 + inpos]) >>> (20 - 8)) + | ((in[26 + inpos]) << 8) | ((in[27 + inpos]) << 28); + out[17 + outpos] = ((in[27 + inpos]) >>> (20 - 16)) | ((in[28 + inpos]) << 16); - out[18 + outpos] = ((in[28 + inpos] & 1048575) >>> (20 - 4)) - | ((in[29 + inpos] & 1048575) << 4) - | ((in[30 + inpos]) << 24); - out[19 + outpos] = ((in[30 + inpos] & 1048575) >>> (20 - 12)) + out[18 + outpos] = ((in[28 + inpos]) >>> (20 - 4)) + | ((in[29 + inpos]) << 4) | ((in[30 + inpos]) << 24); + out[19 + outpos] = ((in[30 + inpos]) >>> (20 - 12)) | ((in[31 + inpos]) << 12); } - protected static void fastpack21(final int[] in, int inpos, + protected static void fastpackwithoutmask21(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 2097151) - | ((in[1 + inpos]) << 21); - out[1 + outpos] = ((in[1 + inpos] & 2097151) >>> (21 - 10)) - | ((in[2 + inpos] & 2097151) << 10) - | ((in[3 + inpos]) << 31); - out[2 + outpos] = ((in[3 + inpos] & 2097151) >>> (21 - 20)) + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 21); + out[1 + outpos] = ((in[1 + inpos]) >>> (21 - 10)) + | ((in[2 + inpos]) << 10) | ((in[3 + inpos]) << 31); + out[2 + outpos] = ((in[3 + inpos]) >>> (21 - 20)) | ((in[4 + inpos]) << 20); - out[3 + outpos] = ((in[4 + inpos] & 2097151) >>> (21 - 9)) - | ((in[5 + inpos] & 2097151) << 9) - | ((in[6 + inpos]) << 30); - out[4 + outpos] = ((in[6 + inpos] & 2097151) >>> (21 - 19)) + out[3 + outpos] = ((in[4 + inpos]) >>> (21 - 9)) + | ((in[5 + inpos]) << 9) | ((in[6 + inpos]) << 30); + out[4 + outpos] = ((in[6 + inpos]) >>> (21 - 19)) | ((in[7 + inpos]) << 19); - out[5 + outpos] = ((in[7 + inpos] & 2097151) >>> (21 - 8)) - | ((in[8 + inpos] & 2097151) << 8) - | ((in[9 + inpos]) << 29); - out[6 + outpos] = ((in[9 + inpos] & 2097151) >>> (21 - 18)) + out[5 + outpos] = ((in[7 + inpos]) >>> (21 - 8)) + | ((in[8 + inpos]) << 8) | ((in[9 + inpos]) << 29); + out[6 + outpos] = ((in[9 + inpos]) >>> (21 - 18)) | ((in[10 + inpos]) << 18); - out[7 + outpos] = ((in[10 + inpos] & 2097151) >>> (21 - 7)) - | ((in[11 + inpos] & 2097151) << 7) - | ((in[12 + inpos]) << 28); - out[8 + outpos] = ((in[12 + inpos] & 2097151) >>> (21 - 17)) + out[7 + outpos] = ((in[10 + inpos]) >>> (21 - 7)) + | ((in[11 + inpos]) << 7) | ((in[12 + inpos]) << 28); + out[8 + outpos] = ((in[12 + inpos]) >>> (21 - 17)) | ((in[13 + inpos]) << 17); - out[9 + outpos] = ((in[13 + inpos] & 2097151) >>> (21 - 6)) - | ((in[14 + inpos] & 2097151) << 6) - | ((in[15 + inpos]) << 27); - out[10 + outpos] = ((in[15 + inpos] & 2097151) >>> (21 - 16)) + out[9 + outpos] = ((in[13 + inpos]) >>> (21 - 6)) + | ((in[14 + inpos]) << 6) | ((in[15 + inpos]) << 27); + out[10 + outpos] = ((in[15 + inpos]) >>> (21 - 16)) | ((in[16 + inpos]) << 16); - out[11 + outpos] = ((in[16 + inpos] & 2097151) >>> (21 - 5)) - | ((in[17 + inpos] & 2097151) << 5) - | ((in[18 + inpos]) << 26); - out[12 + outpos] = ((in[18 + inpos] & 2097151) >>> (21 - 15)) + out[11 + outpos] = ((in[16 + inpos]) >>> (21 - 5)) + | ((in[17 + inpos]) << 5) | ((in[18 + inpos]) << 26); + out[12 + outpos] = ((in[18 + inpos]) >>> (21 - 15)) | ((in[19 + inpos]) << 15); - out[13 + outpos] = ((in[19 + inpos] & 2097151) >>> (21 - 4)) - | ((in[20 + inpos] & 2097151) << 4) - | ((in[21 + inpos]) << 25); - out[14 + outpos] = ((in[21 + inpos] & 2097151) >>> (21 - 14)) + out[13 + outpos] = ((in[19 + inpos]) >>> (21 - 4)) + | ((in[20 + inpos]) << 4) | ((in[21 + inpos]) << 25); + out[14 + outpos] = ((in[21 + inpos]) >>> (21 - 14)) | ((in[22 + inpos]) << 14); - out[15 + outpos] = ((in[22 + inpos] & 2097151) >>> (21 - 3)) - | ((in[23 + inpos] & 2097151) << 3) - | ((in[24 + inpos]) << 24); - out[16 + outpos] = ((in[24 + inpos] & 2097151) >>> (21 - 13)) + out[15 + outpos] = ((in[22 + inpos]) >>> (21 - 3)) + | ((in[23 + inpos]) << 3) | ((in[24 + inpos]) << 24); + out[16 + outpos] = ((in[24 + inpos]) >>> (21 - 13)) | ((in[25 + inpos]) << 13); - out[17 + outpos] = ((in[25 + inpos] & 2097151) >>> (21 - 2)) - | ((in[26 + inpos] & 2097151) << 2) - | ((in[27 + inpos]) << 23); - out[18 + outpos] = ((in[27 + inpos] & 2097151) >>> (21 - 12)) + out[17 + outpos] = ((in[25 + inpos]) >>> (21 - 2)) + | ((in[26 + inpos]) << 2) | ((in[27 + inpos]) << 23); + out[18 + outpos] = ((in[27 + inpos]) >>> (21 - 12)) | ((in[28 + inpos]) << 12); - out[19 + outpos] = ((in[28 + inpos] & 2097151) >>> (21 - 1)) - | ((in[29 + inpos] & 2097151) << 1) - | ((in[30 + inpos]) << 22); - out[20 + outpos] = ((in[30 + inpos] & 2097151) >>> (21 - 11)) + out[19 + outpos] = ((in[28 + inpos]) >>> (21 - 1)) + | ((in[29 + inpos]) << 1) | ((in[30 + inpos]) << 22); + out[20 + outpos] = ((in[30 + inpos]) >>> (21 - 11)) | ((in[31 + inpos]) << 11); } - protected static void fastpack22(final int[] in, int inpos, + protected static void fastpackwithoutmask22(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 4194303) - | ((in[1 + inpos]) << 22); - out[1 + outpos] = ((in[1 + inpos] & 4194303) >>> (22 - 12)) + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 22); + out[1 + outpos] = ((in[1 + inpos]) >>> (22 - 12)) | ((in[2 + inpos]) << 12); - out[2 + outpos] = ((in[2 + inpos] & 4194303) >>> (22 - 2)) - | ((in[3 + inpos] & 4194303) << 2) - | ((in[4 + inpos]) << 24); - out[3 + outpos] = ((in[4 + inpos] & 4194303) >>> (22 - 14)) + out[2 + outpos] = ((in[2 + inpos]) >>> (22 - 2)) + | ((in[3 + inpos]) << 2) | ((in[4 + inpos]) << 24); + out[3 + outpos] = ((in[4 + inpos]) >>> (22 - 14)) | ((in[5 + inpos]) << 14); - out[4 + outpos] = ((in[5 + inpos] & 4194303) >>> (22 - 4)) - | ((in[6 + inpos] & 4194303) << 4) - | ((in[7 + inpos]) << 26); - out[5 + outpos] = ((in[7 + inpos] & 4194303) >>> (22 - 16)) + out[4 + outpos] = ((in[5 + inpos]) >>> (22 - 4)) + | ((in[6 + inpos]) << 4) | ((in[7 + inpos]) << 26); + out[5 + outpos] = ((in[7 + inpos]) >>> (22 - 16)) | ((in[8 + inpos]) << 16); - out[6 + outpos] = ((in[8 + inpos] & 4194303) >>> (22 - 6)) - | ((in[9 + inpos] & 4194303) << 6) - | ((in[10 + inpos]) << 28); - out[7 + outpos] = ((in[10 + inpos] & 4194303) >>> (22 - 18)) + out[6 + outpos] = ((in[8 + inpos]) >>> (22 - 6)) + | ((in[9 + inpos]) << 6) | ((in[10 + inpos]) << 28); + out[7 + outpos] = ((in[10 + inpos]) >>> (22 - 18)) | ((in[11 + inpos]) << 18); - out[8 + outpos] = ((in[11 + inpos] & 4194303) >>> (22 - 8)) - | ((in[12 + inpos] & 4194303) << 8) - | ((in[13 + inpos]) << 30); - out[9 + outpos] = ((in[13 + inpos] & 4194303) >>> (22 - 20)) + out[8 + outpos] = ((in[11 + inpos]) >>> (22 - 8)) + | ((in[12 + inpos]) << 8) | ((in[13 + inpos]) << 30); + out[9 + outpos] = ((in[13 + inpos]) >>> (22 - 20)) | ((in[14 + inpos]) << 20); - out[10 + outpos] = ((in[14 + inpos] & 4194303) >>> (22 - 10)) + out[10 + outpos] = ((in[14 + inpos]) >>> (22 - 10)) | ((in[15 + inpos]) << 10); - out[11 + outpos] = (in[16 + inpos] & 4194303) - | ((in[17 + inpos]) << 22); - out[12 + outpos] = ((in[17 + inpos] & 4194303) >>> (22 - 12)) + out[11 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 22); + out[12 + outpos] = ((in[17 + inpos]) >>> (22 - 12)) | ((in[18 + inpos]) << 12); - out[13 + outpos] = ((in[18 + inpos] & 4194303) >>> (22 - 2)) - | ((in[19 + inpos] & 4194303) << 2) - | ((in[20 + inpos]) << 24); - out[14 + outpos] = ((in[20 + inpos] & 4194303) >>> (22 - 14)) + out[13 + outpos] = ((in[18 + inpos]) >>> (22 - 2)) + | ((in[19 + inpos]) << 2) | ((in[20 + inpos]) << 24); + out[14 + outpos] = ((in[20 + inpos]) >>> (22 - 14)) | ((in[21 + inpos]) << 14); - out[15 + outpos] = ((in[21 + inpos] & 4194303) >>> (22 - 4)) - | ((in[22 + inpos] & 4194303) << 4) - | ((in[23 + inpos]) << 26); - out[16 + outpos] = ((in[23 + inpos] & 4194303) >>> (22 - 16)) + out[15 + outpos] = ((in[21 + inpos]) >>> (22 - 4)) + | ((in[22 + inpos]) << 4) | ((in[23 + inpos]) << 26); + out[16 + outpos] = ((in[23 + inpos]) >>> (22 - 16)) | ((in[24 + inpos]) << 16); - out[17 + outpos] = ((in[24 + inpos] & 4194303) >>> (22 - 6)) - | ((in[25 + inpos] & 4194303) << 6) - | ((in[26 + inpos]) << 28); - out[18 + outpos] = ((in[26 + inpos] & 4194303) >>> (22 - 18)) + out[17 + outpos] = ((in[24 + inpos]) >>> (22 - 6)) + | ((in[25 + inpos]) << 6) | ((in[26 + inpos]) << 28); + out[18 + outpos] = ((in[26 + inpos]) >>> (22 - 18)) | ((in[27 + inpos]) << 18); - out[19 + outpos] = ((in[27 + inpos] & 4194303) >>> (22 - 8)) - | ((in[28 + inpos] & 4194303) << 8) - | ((in[29 + inpos]) << 30); - out[20 + outpos] = ((in[29 + inpos] & 4194303) >>> (22 - 20)) + out[19 + outpos] = ((in[27 + inpos]) >>> (22 - 8)) + | ((in[28 + inpos]) << 8) | ((in[29 + inpos]) << 30); + out[20 + outpos] = ((in[29 + inpos]) >>> (22 - 20)) | ((in[30 + inpos]) << 20); - out[21 + outpos] = ((in[30 + inpos] & 4194303) >>> (22 - 10)) + out[21 + outpos] = ((in[30 + inpos]) >>> (22 - 10)) | ((in[31 + inpos]) << 10); } - protected static void fastpack23(final int[] in, int inpos, + protected static void fastpackwithoutmask23(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 8388607) - | ((in[1 + inpos]) << 23); - out[1 + outpos] = ((in[1 + inpos] & 8388607) >>> (23 - 14)) + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 23); + out[1 + outpos] = ((in[1 + inpos]) >>> (23 - 14)) | ((in[2 + inpos]) << 14); - out[2 + outpos] = ((in[2 + inpos] & 8388607) >>> (23 - 5)) - | ((in[3 + inpos] & 8388607) << 5) - | ((in[4 + inpos]) << 28); - out[3 + outpos] = ((in[4 + inpos] & 8388607) >>> (23 - 19)) + out[2 + outpos] = ((in[2 + inpos]) >>> (23 - 5)) + | ((in[3 + inpos]) << 5) | ((in[4 + inpos]) << 28); + out[3 + outpos] = ((in[4 + inpos]) >>> (23 - 19)) | ((in[5 + inpos]) << 19); - out[4 + outpos] = ((in[5 + inpos] & 8388607) >>> (23 - 10)) + out[4 + outpos] = ((in[5 + inpos]) >>> (23 - 10)) | ((in[6 + inpos]) << 10); - out[5 + outpos] = ((in[6 + inpos] & 8388607) >>> (23 - 1)) - | ((in[7 + inpos] & 8388607) << 1) - | ((in[8 + inpos]) << 24); - out[6 + outpos] = ((in[8 + inpos] & 8388607) >>> (23 - 15)) + out[5 + outpos] = ((in[6 + inpos]) >>> (23 - 1)) + | ((in[7 + inpos]) << 1) | ((in[8 + inpos]) << 24); + out[6 + outpos] = ((in[8 + inpos]) >>> (23 - 15)) | ((in[9 + inpos]) << 15); - out[7 + outpos] = ((in[9 + inpos] & 8388607) >>> (23 - 6)) - | ((in[10 + inpos] & 8388607) << 6) - | ((in[11 + inpos]) << 29); - out[8 + outpos] = ((in[11 + inpos] & 8388607) >>> (23 - 20)) + out[7 + outpos] = ((in[9 + inpos]) >>> (23 - 6)) + | ((in[10 + inpos]) << 6) | ((in[11 + inpos]) << 29); + out[8 + outpos] = ((in[11 + inpos]) >>> (23 - 20)) | ((in[12 + inpos]) << 20); - out[9 + outpos] = ((in[12 + inpos] & 8388607) >>> (23 - 11)) + out[9 + outpos] = ((in[12 + inpos]) >>> (23 - 11)) | ((in[13 + inpos]) << 11); - out[10 + outpos] = ((in[13 + inpos] & 8388607) >>> (23 - 2)) - | ((in[14 + inpos] & 8388607) << 2) - | ((in[15 + inpos]) << 25); - out[11 + outpos] = ((in[15 + inpos] & 8388607) >>> (23 - 16)) + out[10 + outpos] = ((in[13 + inpos]) >>> (23 - 2)) + | ((in[14 + inpos]) << 2) | ((in[15 + inpos]) << 25); + out[11 + outpos] = ((in[15 + inpos]) >>> (23 - 16)) | ((in[16 + inpos]) << 16); - out[12 + outpos] = ((in[16 + inpos] & 8388607) >>> (23 - 7)) - | ((in[17 + inpos] & 8388607) << 7) - | ((in[18 + inpos]) << 30); - out[13 + outpos] = ((in[18 + inpos] & 8388607) >>> (23 - 21)) + out[12 + outpos] = ((in[16 + inpos]) >>> (23 - 7)) + | ((in[17 + inpos]) << 7) | ((in[18 + inpos]) << 30); + out[13 + outpos] = ((in[18 + inpos]) >>> (23 - 21)) | ((in[19 + inpos]) << 21); - out[14 + outpos] = ((in[19 + inpos] & 8388607) >>> (23 - 12)) + out[14 + outpos] = ((in[19 + inpos]) >>> (23 - 12)) | ((in[20 + inpos]) << 12); - out[15 + outpos] = ((in[20 + inpos] & 8388607) >>> (23 - 3)) - | ((in[21 + inpos] & 8388607) << 3) - | ((in[22 + inpos]) << 26); - out[16 + outpos] = ((in[22 + inpos] & 8388607) >>> (23 - 17)) + out[15 + outpos] = ((in[20 + inpos]) >>> (23 - 3)) + | ((in[21 + inpos]) << 3) | ((in[22 + inpos]) << 26); + out[16 + outpos] = ((in[22 + inpos]) >>> (23 - 17)) | ((in[23 + inpos]) << 17); - out[17 + outpos] = ((in[23 + inpos] & 8388607) >>> (23 - 8)) - | ((in[24 + inpos] & 8388607) << 8) - | ((in[25 + inpos]) << 31); - out[18 + outpos] = ((in[25 + inpos] & 8388607) >>> (23 - 22)) + out[17 + outpos] = ((in[23 + inpos]) >>> (23 - 8)) + | ((in[24 + inpos]) << 8) | ((in[25 + inpos]) << 31); + out[18 + outpos] = ((in[25 + inpos]) >>> (23 - 22)) | ((in[26 + inpos]) << 22); - out[19 + outpos] = ((in[26 + inpos] & 8388607) >>> (23 - 13)) + out[19 + outpos] = ((in[26 + inpos]) >>> (23 - 13)) | ((in[27 + inpos]) << 13); - out[20 + outpos] = ((in[27 + inpos] & 8388607) >>> (23 - 4)) - | ((in[28 + inpos] & 8388607) << 4) - | ((in[29 + inpos]) << 27); - out[21 + outpos] = ((in[29 + inpos] & 8388607) >>> (23 - 18)) + out[20 + outpos] = ((in[27 + inpos]) >>> (23 - 4)) + | ((in[28 + inpos]) << 4) | ((in[29 + inpos]) << 27); + out[21 + outpos] = ((in[29 + inpos]) >>> (23 - 18)) | ((in[30 + inpos]) << 18); - out[22 + outpos] = ((in[30 + inpos] & 8388607) >>> (23 - 9)) + out[22 + outpos] = ((in[30 + inpos]) >>> (23 - 9)) | ((in[31 + inpos]) << 9); } - protected static void fastpack24(final int[] in, int inpos, + protected static void fastpackwithoutmask24(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 16777215) - | ((in[1 + inpos]) << 24); - out[1 + outpos] = ((in[1 + inpos] & 16777215) >>> (24 - 16)) + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 24); + out[1 + outpos] = ((in[1 + inpos]) >>> (24 - 16)) | ((in[2 + inpos]) << 16); - out[2 + outpos] = ((in[2 + inpos] & 16777215) >>> (24 - 8)) + out[2 + outpos] = ((in[2 + inpos]) >>> (24 - 8)) | ((in[3 + inpos]) << 8); - out[3 + outpos] = (in[4 + inpos] & 16777215) - | ((in[5 + inpos]) << 24); - out[4 + outpos] = ((in[5 + inpos] & 16777215) >>> (24 - 16)) + out[3 + outpos] = in[4 + inpos] | ((in[5 + inpos]) << 24); + out[4 + outpos] = ((in[5 + inpos]) >>> (24 - 16)) | ((in[6 + inpos]) << 16); - out[5 + outpos] = ((in[6 + inpos] & 16777215) >>> (24 - 8)) + out[5 + outpos] = ((in[6 + inpos]) >>> (24 - 8)) | ((in[7 + inpos]) << 8); - out[6 + outpos] = (in[8 + inpos] & 16777215) - | ((in[9 + inpos]) << 24); - out[7 + outpos] = ((in[9 + inpos] & 16777215) >>> (24 - 16)) + out[6 + outpos] = in[8 + inpos] | ((in[9 + inpos]) << 24); + out[7 + outpos] = ((in[9 + inpos]) >>> (24 - 16)) | ((in[10 + inpos]) << 16); - out[8 + outpos] = ((in[10 + inpos] & 16777215) >>> (24 - 8)) + out[8 + outpos] = ((in[10 + inpos]) >>> (24 - 8)) | ((in[11 + inpos]) << 8); - out[9 + outpos] = (in[12 + inpos] & 16777215) - | ((in[13 + inpos]) << 24); - out[10 + outpos] = ((in[13 + inpos] & 16777215) >>> (24 - 16)) + out[9 + outpos] = in[12 + inpos] | ((in[13 + inpos]) << 24); + out[10 + outpos] = ((in[13 + inpos]) >>> (24 - 16)) | ((in[14 + inpos]) << 16); - out[11 + outpos] = ((in[14 + inpos] & 16777215) >>> (24 - 8)) + out[11 + outpos] = ((in[14 + inpos]) >>> (24 - 8)) | ((in[15 + inpos]) << 8); - out[12 + outpos] = (in[16 + inpos] & 16777215) - | ((in[17 + inpos]) << 24); - out[13 + outpos] = ((in[17 + inpos] & 16777215) >>> (24 - 16)) + out[12 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 24); + out[13 + outpos] = ((in[17 + inpos]) >>> (24 - 16)) | ((in[18 + inpos]) << 16); - out[14 + outpos] = ((in[18 + inpos] & 16777215) >>> (24 - 8)) + out[14 + outpos] = ((in[18 + inpos]) >>> (24 - 8)) | ((in[19 + inpos]) << 8); - out[15 + outpos] = (in[20 + inpos] & 16777215) - | ((in[21 + inpos]) << 24); - out[16 + outpos] = ((in[21 + inpos] & 16777215) >>> (24 - 16)) + out[15 + outpos] = in[20 + inpos] | ((in[21 + inpos]) << 24); + out[16 + outpos] = ((in[21 + inpos]) >>> (24 - 16)) | ((in[22 + inpos]) << 16); - out[17 + outpos] = ((in[22 + inpos] & 16777215) >>> (24 - 8)) + out[17 + outpos] = ((in[22 + inpos]) >>> (24 - 8)) | ((in[23 + inpos]) << 8); - out[18 + outpos] = (in[24 + inpos] & 16777215) - | ((in[25 + inpos]) << 24); - out[19 + outpos] = ((in[25 + inpos] & 16777215) >>> (24 - 16)) + out[18 + outpos] = in[24 + inpos] | ((in[25 + inpos]) << 24); + out[19 + outpos] = ((in[25 + inpos]) >>> (24 - 16)) | ((in[26 + inpos]) << 16); - out[20 + outpos] = ((in[26 + inpos] & 16777215) >>> (24 - 8)) + out[20 + outpos] = ((in[26 + inpos]) >>> (24 - 8)) | ((in[27 + inpos]) << 8); - out[21 + outpos] = (in[28 + inpos] & 16777215) - | ((in[29 + inpos]) << 24); - out[22 + outpos] = ((in[29 + inpos] & 16777215) >>> (24 - 16)) + out[21 + outpos] = in[28 + inpos] | ((in[29 + inpos]) << 24); + out[22 + outpos] = ((in[29 + inpos]) >>> (24 - 16)) | ((in[30 + inpos]) << 16); - out[23 + outpos] = ((in[30 + inpos] & 16777215) >>> (24 - 8)) + out[23 + outpos] = ((in[30 + inpos]) >>> (24 - 8)) | ((in[31 + inpos]) << 8); } - protected static void fastpack25(final int[] in, int inpos, + protected static void fastpackwithoutmask25(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 33554431) - | ((in[1 + inpos]) << 25); - out[1 + outpos] = ((in[1 + inpos] & 33554431) >>> (25 - 18)) + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 25); + out[1 + outpos] = ((in[1 + inpos]) >>> (25 - 18)) | ((in[2 + inpos]) << 18); - out[2 + outpos] = ((in[2 + inpos] & 33554431) >>> (25 - 11)) + out[2 + outpos] = ((in[2 + inpos]) >>> (25 - 11)) | ((in[3 + inpos]) << 11); - out[3 + outpos] = ((in[3 + inpos] & 33554431) >>> (25 - 4)) - | ((in[4 + inpos] & 33554431) << 4) - | ((in[5 + inpos]) << 29); - out[4 + outpos] = ((in[5 + inpos] & 33554431) >>> (25 - 22)) + out[3 + outpos] = ((in[3 + inpos]) >>> (25 - 4)) + | ((in[4 + inpos]) << 4) | ((in[5 + inpos]) << 29); + out[4 + outpos] = ((in[5 + inpos]) >>> (25 - 22)) | ((in[6 + inpos]) << 22); - out[5 + outpos] = ((in[6 + inpos] & 33554431) >>> (25 - 15)) + out[5 + outpos] = ((in[6 + inpos]) >>> (25 - 15)) | ((in[7 + inpos]) << 15); - out[6 + outpos] = ((in[7 + inpos] & 33554431) >>> (25 - 8)) + out[6 + outpos] = ((in[7 + inpos]) >>> (25 - 8)) | ((in[8 + inpos]) << 8); - out[7 + outpos] = ((in[8 + inpos] & 33554431) >>> (25 - 1)) - | ((in[9 + inpos] & 33554431) << 1) - | ((in[10 + inpos]) << 26); - out[8 + outpos] = ((in[10 + inpos] & 33554431) >>> (25 - 19)) + out[7 + outpos] = ((in[8 + inpos]) >>> (25 - 1)) + | ((in[9 + inpos]) << 1) | ((in[10 + inpos]) << 26); + out[8 + outpos] = ((in[10 + inpos]) >>> (25 - 19)) | ((in[11 + inpos]) << 19); - out[9 + outpos] = ((in[11 + inpos] & 33554431) >>> (25 - 12)) + out[9 + outpos] = ((in[11 + inpos]) >>> (25 - 12)) | ((in[12 + inpos]) << 12); - out[10 + outpos] = ((in[12 + inpos] & 33554431) >>> (25 - 5)) - | ((in[13 + inpos] & 33554431) << 5) - | ((in[14 + inpos]) << 30); - out[11 + outpos] = ((in[14 + inpos] & 33554431) >>> (25 - 23)) + out[10 + outpos] = ((in[12 + inpos]) >>> (25 - 5)) + | ((in[13 + inpos]) << 5) | ((in[14 + inpos]) << 30); + out[11 + outpos] = ((in[14 + inpos]) >>> (25 - 23)) | ((in[15 + inpos]) << 23); - out[12 + outpos] = ((in[15 + inpos] & 33554431) >>> (25 - 16)) + out[12 + outpos] = ((in[15 + inpos]) >>> (25 - 16)) | ((in[16 + inpos]) << 16); - out[13 + outpos] = ((in[16 + inpos] & 33554431) >>> (25 - 9)) + out[13 + outpos] = ((in[16 + inpos]) >>> (25 - 9)) | ((in[17 + inpos]) << 9); - out[14 + outpos] = ((in[17 + inpos] & 33554431) >>> (25 - 2)) - | ((in[18 + inpos] & 33554431) << 2) - | ((in[19 + inpos]) << 27); - out[15 + outpos] = ((in[19 + inpos] & 33554431) >>> (25 - 20)) + out[14 + outpos] = ((in[17 + inpos]) >>> (25 - 2)) + | ((in[18 + inpos]) << 2) | ((in[19 + inpos]) << 27); + out[15 + outpos] = ((in[19 + inpos]) >>> (25 - 20)) | ((in[20 + inpos]) << 20); - out[16 + outpos] = ((in[20 + inpos] & 33554431) >>> (25 - 13)) + out[16 + outpos] = ((in[20 + inpos]) >>> (25 - 13)) | ((in[21 + inpos]) << 13); - out[17 + outpos] = ((in[21 + inpos] & 33554431) >>> (25 - 6)) - | ((in[22 + inpos] & 33554431) << 6) - | ((in[23 + inpos]) << 31); - out[18 + outpos] = ((in[23 + inpos] & 33554431) >>> (25 - 24)) + out[17 + outpos] = ((in[21 + inpos]) >>> (25 - 6)) + | ((in[22 + inpos]) << 6) | ((in[23 + inpos]) << 31); + out[18 + outpos] = ((in[23 + inpos]) >>> (25 - 24)) | ((in[24 + inpos]) << 24); - out[19 + outpos] = ((in[24 + inpos] & 33554431) >>> (25 - 17)) + out[19 + outpos] = ((in[24 + inpos]) >>> (25 - 17)) | ((in[25 + inpos]) << 17); - out[20 + outpos] = ((in[25 + inpos] & 33554431) >>> (25 - 10)) + out[20 + outpos] = ((in[25 + inpos]) >>> (25 - 10)) | ((in[26 + inpos]) << 10); - out[21 + outpos] = ((in[26 + inpos] & 33554431) >>> (25 - 3)) - | ((in[27 + inpos] & 33554431) << 3) - | ((in[28 + inpos]) << 28); - out[22 + outpos] = ((in[28 + inpos] & 33554431) >>> (25 - 21)) + out[21 + outpos] = ((in[26 + inpos]) >>> (25 - 3)) + | ((in[27 + inpos]) << 3) | ((in[28 + inpos]) << 28); + out[22 + outpos] = ((in[28 + inpos]) >>> (25 - 21)) | ((in[29 + inpos]) << 21); - out[23 + outpos] = ((in[29 + inpos] & 33554431) >>> (25 - 14)) + out[23 + outpos] = ((in[29 + inpos]) >>> (25 - 14)) | ((in[30 + inpos]) << 14); - out[24 + outpos] = ((in[30 + inpos] & 33554431) >>> (25 - 7)) + out[24 + outpos] = ((in[30 + inpos]) >>> (25 - 7)) | ((in[31 + inpos]) << 7); } - protected static void fastpack26(final int[] in, int inpos, + protected static void fastpackwithoutmask26(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 67108863) - | ((in[1 + inpos]) << 26); - out[1 + outpos] = ((in[1 + inpos] & 67108863) >>> (26 - 20)) + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 26); + out[1 + outpos] = ((in[1 + inpos]) >>> (26 - 20)) | ((in[2 + inpos]) << 20); - out[2 + outpos] = ((in[2 + inpos] & 67108863) >>> (26 - 14)) + out[2 + outpos] = ((in[2 + inpos]) >>> (26 - 14)) | ((in[3 + inpos]) << 14); - out[3 + outpos] = ((in[3 + inpos] & 67108863) >>> (26 - 8)) + out[3 + outpos] = ((in[3 + inpos]) >>> (26 - 8)) | ((in[4 + inpos]) << 8); - out[4 + outpos] = ((in[4 + inpos] & 67108863) >>> (26 - 2)) - | ((in[5 + inpos] & 67108863) << 2) - | ((in[6 + inpos]) << 28); - out[5 + outpos] = ((in[6 + inpos] & 67108863) >>> (26 - 22)) + out[4 + outpos] = ((in[4 + inpos]) >>> (26 - 2)) + | ((in[5 + inpos]) << 2) | ((in[6 + inpos]) << 28); + out[5 + outpos] = ((in[6 + inpos]) >>> (26 - 22)) | ((in[7 + inpos]) << 22); - out[6 + outpos] = ((in[7 + inpos] & 67108863) >>> (26 - 16)) + out[6 + outpos] = ((in[7 + inpos]) >>> (26 - 16)) | ((in[8 + inpos]) << 16); - out[7 + outpos] = ((in[8 + inpos] & 67108863) >>> (26 - 10)) + out[7 + outpos] = ((in[8 + inpos]) >>> (26 - 10)) | ((in[9 + inpos]) << 10); - out[8 + outpos] = ((in[9 + inpos] & 67108863) >>> (26 - 4)) - | ((in[10 + inpos] & 67108863) << 4) - | ((in[11 + inpos]) << 30); - out[9 + outpos] = ((in[11 + inpos] & 67108863) >>> (26 - 24)) + out[8 + outpos] = ((in[9 + inpos]) >>> (26 - 4)) + | ((in[10 + inpos]) << 4) | ((in[11 + inpos]) << 30); + out[9 + outpos] = ((in[11 + inpos]) >>> (26 - 24)) | ((in[12 + inpos]) << 24); - out[10 + outpos] = ((in[12 + inpos] & 67108863) >>> (26 - 18)) + out[10 + outpos] = ((in[12 + inpos]) >>> (26 - 18)) | ((in[13 + inpos]) << 18); - out[11 + outpos] = ((in[13 + inpos] & 67108863) >>> (26 - 12)) + out[11 + outpos] = ((in[13 + inpos]) >>> (26 - 12)) | ((in[14 + inpos]) << 12); - out[12 + outpos] = ((in[14 + inpos] & 67108863) >>> (26 - 6)) + out[12 + outpos] = ((in[14 + inpos]) >>> (26 - 6)) | ((in[15 + inpos]) << 6); - out[13 + outpos] = (in[16 + inpos] & 67108863) - | ((in[17 + inpos]) << 26); - out[14 + outpos] = ((in[17 + inpos] & 67108863) >>> (26 - 20)) + out[13 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 26); + out[14 + outpos] = ((in[17 + inpos]) >>> (26 - 20)) | ((in[18 + inpos]) << 20); - out[15 + outpos] = ((in[18 + inpos] & 67108863) >>> (26 - 14)) + out[15 + outpos] = ((in[18 + inpos]) >>> (26 - 14)) | ((in[19 + inpos]) << 14); - out[16 + outpos] = ((in[19 + inpos] & 67108863) >>> (26 - 8)) + out[16 + outpos] = ((in[19 + inpos]) >>> (26 - 8)) | ((in[20 + inpos]) << 8); - out[17 + outpos] = ((in[20 + inpos] & 67108863) >>> (26 - 2)) - | ((in[21 + inpos] & 67108863) << 2) - | ((in[22 + inpos]) << 28); - out[18 + outpos] = ((in[22 + inpos] & 67108863) >>> (26 - 22)) + out[17 + outpos] = ((in[20 + inpos]) >>> (26 - 2)) + | ((in[21 + inpos]) << 2) | ((in[22 + inpos]) << 28); + out[18 + outpos] = ((in[22 + inpos]) >>> (26 - 22)) | ((in[23 + inpos]) << 22); - out[19 + outpos] = ((in[23 + inpos] & 67108863) >>> (26 - 16)) + out[19 + outpos] = ((in[23 + inpos]) >>> (26 - 16)) | ((in[24 + inpos]) << 16); - out[20 + outpos] = ((in[24 + inpos] & 67108863) >>> (26 - 10)) + out[20 + outpos] = ((in[24 + inpos]) >>> (26 - 10)) | ((in[25 + inpos]) << 10); - out[21 + outpos] = ((in[25 + inpos] & 67108863) >>> (26 - 4)) - | ((in[26 + inpos] & 67108863) << 4) - | ((in[27 + inpos]) << 30); - out[22 + outpos] = ((in[27 + inpos] & 67108863) >>> (26 - 24)) + out[21 + outpos] = ((in[25 + inpos]) >>> (26 - 4)) + | ((in[26 + inpos]) << 4) | ((in[27 + inpos]) << 30); + out[22 + outpos] = ((in[27 + inpos]) >>> (26 - 24)) | ((in[28 + inpos]) << 24); - out[23 + outpos] = ((in[28 + inpos] & 67108863) >>> (26 - 18)) + out[23 + outpos] = ((in[28 + inpos]) >>> (26 - 18)) | ((in[29 + inpos]) << 18); - out[24 + outpos] = ((in[29 + inpos] & 67108863) >>> (26 - 12)) + out[24 + outpos] = ((in[29 + inpos]) >>> (26 - 12)) | ((in[30 + inpos]) << 12); - out[25 + outpos] = ((in[30 + inpos] & 67108863) >>> (26 - 6)) + out[25 + outpos] = ((in[30 + inpos]) >>> (26 - 6)) | ((in[31 + inpos]) << 6); } - protected static void fastpack27(final int[] in, int inpos, + protected static void fastpackwithoutmask27(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 134217727) - | ((in[1 + inpos]) << 27); - out[1 + outpos] = ((in[1 + inpos] & 134217727) >>> (27 - 22)) + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 27); + out[1 + outpos] = ((in[1 + inpos]) >>> (27 - 22)) | ((in[2 + inpos]) << 22); - out[2 + outpos] = ((in[2 + inpos] & 134217727) >>> (27 - 17)) + out[2 + outpos] = ((in[2 + inpos]) >>> (27 - 17)) | ((in[3 + inpos]) << 17); - out[3 + outpos] = ((in[3 + inpos] & 134217727) >>> (27 - 12)) + out[3 + outpos] = ((in[3 + inpos]) >>> (27 - 12)) | ((in[4 + inpos]) << 12); - out[4 + outpos] = ((in[4 + inpos] & 134217727) >>> (27 - 7)) + out[4 + outpos] = ((in[4 + inpos]) >>> (27 - 7)) | ((in[5 + inpos]) << 7); - out[5 + outpos] = ((in[5 + inpos] & 134217727) >>> (27 - 2)) - | ((in[6 + inpos] & 134217727) << 2) - | ((in[7 + inpos]) << 29); - out[6 + outpos] = ((in[7 + inpos] & 134217727) >>> (27 - 24)) + out[5 + outpos] = ((in[5 + inpos]) >>> (27 - 2)) + | ((in[6 + inpos]) << 2) | ((in[7 + inpos]) << 29); + out[6 + outpos] = ((in[7 + inpos]) >>> (27 - 24)) | ((in[8 + inpos]) << 24); - out[7 + outpos] = ((in[8 + inpos] & 134217727) >>> (27 - 19)) + out[7 + outpos] = ((in[8 + inpos]) >>> (27 - 19)) | ((in[9 + inpos]) << 19); - out[8 + outpos] = ((in[9 + inpos] & 134217727) >>> (27 - 14)) + out[8 + outpos] = ((in[9 + inpos]) >>> (27 - 14)) | ((in[10 + inpos]) << 14); - out[9 + outpos] = ((in[10 + inpos] & 134217727) >>> (27 - 9)) + out[9 + outpos] = ((in[10 + inpos]) >>> (27 - 9)) | ((in[11 + inpos]) << 9); - out[10 + outpos] = ((in[11 + inpos] & 134217727) >>> (27 - 4)) - | ((in[12 + inpos] & 134217727) << 4) - | ((in[13 + inpos]) << 31); - out[11 + outpos] = ((in[13 + inpos] & 134217727) >>> (27 - 26)) + out[10 + outpos] = ((in[11 + inpos]) >>> (27 - 4)) + | ((in[12 + inpos]) << 4) | ((in[13 + inpos]) << 31); + out[11 + outpos] = ((in[13 + inpos]) >>> (27 - 26)) | ((in[14 + inpos]) << 26); - out[12 + outpos] = ((in[14 + inpos] & 134217727) >>> (27 - 21)) + out[12 + outpos] = ((in[14 + inpos]) >>> (27 - 21)) | ((in[15 + inpos]) << 21); - out[13 + outpos] = ((in[15 + inpos] & 134217727) >>> (27 - 16)) + out[13 + outpos] = ((in[15 + inpos]) >>> (27 - 16)) | ((in[16 + inpos]) << 16); - out[14 + outpos] = ((in[16 + inpos] & 134217727) >>> (27 - 11)) + out[14 + outpos] = ((in[16 + inpos]) >>> (27 - 11)) | ((in[17 + inpos]) << 11); - out[15 + outpos] = ((in[17 + inpos] & 134217727) >>> (27 - 6)) + out[15 + outpos] = ((in[17 + inpos]) >>> (27 - 6)) | ((in[18 + inpos]) << 6); - out[16 + outpos] = ((in[18 + inpos] & 134217727) >>> (27 - 1)) - | ((in[19 + inpos] & 134217727) << 1) - | ((in[20 + inpos]) << 28); - out[17 + outpos] = ((in[20 + inpos] & 134217727) >>> (27 - 23)) + out[16 + outpos] = ((in[18 + inpos]) >>> (27 - 1)) + | ((in[19 + inpos]) << 1) | ((in[20 + inpos]) << 28); + out[17 + outpos] = ((in[20 + inpos]) >>> (27 - 23)) | ((in[21 + inpos]) << 23); - out[18 + outpos] = ((in[21 + inpos] & 134217727) >>> (27 - 18)) + out[18 + outpos] = ((in[21 + inpos]) >>> (27 - 18)) | ((in[22 + inpos]) << 18); - out[19 + outpos] = ((in[22 + inpos] & 134217727) >>> (27 - 13)) + out[19 + outpos] = ((in[22 + inpos]) >>> (27 - 13)) | ((in[23 + inpos]) << 13); - out[20 + outpos] = ((in[23 + inpos] & 134217727) >>> (27 - 8)) + out[20 + outpos] = ((in[23 + inpos]) >>> (27 - 8)) | ((in[24 + inpos]) << 8); - out[21 + outpos] = ((in[24 + inpos] & 134217727) >>> (27 - 3)) - | ((in[25 + inpos] & 134217727) << 3) - | ((in[26 + inpos]) << 30); - out[22 + outpos] = ((in[26 + inpos] & 134217727) >>> (27 - 25)) + out[21 + outpos] = ((in[24 + inpos]) >>> (27 - 3)) + | ((in[25 + inpos]) << 3) | ((in[26 + inpos]) << 30); + out[22 + outpos] = ((in[26 + inpos]) >>> (27 - 25)) | ((in[27 + inpos]) << 25); - out[23 + outpos] = ((in[27 + inpos] & 134217727) >>> (27 - 20)) + out[23 + outpos] = ((in[27 + inpos]) >>> (27 - 20)) | ((in[28 + inpos]) << 20); - out[24 + outpos] = ((in[28 + inpos] & 134217727) >>> (27 - 15)) + out[24 + outpos] = ((in[28 + inpos]) >>> (27 - 15)) | ((in[29 + inpos]) << 15); - out[25 + outpos] = ((in[29 + inpos] & 134217727) >>> (27 - 10)) + out[25 + outpos] = ((in[29 + inpos]) >>> (27 - 10)) | ((in[30 + inpos]) << 10); - out[26 + outpos] = ((in[30 + inpos] & 134217727) >>> (27 - 5)) + out[26 + outpos] = ((in[30 + inpos]) >>> (27 - 5)) | ((in[31 + inpos]) << 5); } - protected static void fastpack28(final int[] in, int inpos, + protected static void fastpackwithoutmask28(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 268435455) - | ((in[1 + inpos]) << 28); - out[1 + outpos] = ((in[1 + inpos] & 268435455) >>> (28 - 24)) + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 28); + out[1 + outpos] = ((in[1 + inpos]) >>> (28 - 24)) | ((in[2 + inpos]) << 24); - out[2 + outpos] = ((in[2 + inpos] & 268435455) >>> (28 - 20)) + out[2 + outpos] = ((in[2 + inpos]) >>> (28 - 20)) | ((in[3 + inpos]) << 20); - out[3 + outpos] = ((in[3 + inpos] & 268435455) >>> (28 - 16)) + out[3 + outpos] = ((in[3 + inpos]) >>> (28 - 16)) | ((in[4 + inpos]) << 16); - out[4 + outpos] = ((in[4 + inpos] & 268435455) >>> (28 - 12)) + out[4 + outpos] = ((in[4 + inpos]) >>> (28 - 12)) | ((in[5 + inpos]) << 12); - out[5 + outpos] = ((in[5 + inpos] & 268435455) >>> (28 - 8)) + out[5 + outpos] = ((in[5 + inpos]) >>> (28 - 8)) | ((in[6 + inpos]) << 8); - out[6 + outpos] = ((in[6 + inpos] & 268435455) >>> (28 - 4)) + out[6 + outpos] = ((in[6 + inpos]) >>> (28 - 4)) | ((in[7 + inpos]) << 4); - out[7 + outpos] = (in[8 + inpos] & 268435455) - | ((in[9 + inpos]) << 28); - out[8 + outpos] = ((in[9 + inpos] & 268435455) >>> (28 - 24)) + out[7 + outpos] = in[8 + inpos] | ((in[9 + inpos]) << 28); + out[8 + outpos] = ((in[9 + inpos]) >>> (28 - 24)) | ((in[10 + inpos]) << 24); - out[9 + outpos] = ((in[10 + inpos] & 268435455) >>> (28 - 20)) + out[9 + outpos] = ((in[10 + inpos]) >>> (28 - 20)) | ((in[11 + inpos]) << 20); - out[10 + outpos] = ((in[11 + inpos] & 268435455) >>> (28 - 16)) + out[10 + outpos] = ((in[11 + inpos]) >>> (28 - 16)) | ((in[12 + inpos]) << 16); - out[11 + outpos] = ((in[12 + inpos] & 268435455) >>> (28 - 12)) + out[11 + outpos] = ((in[12 + inpos]) >>> (28 - 12)) | ((in[13 + inpos]) << 12); - out[12 + outpos] = ((in[13 + inpos] & 268435455) >>> (28 - 8)) + out[12 + outpos] = ((in[13 + inpos]) >>> (28 - 8)) | ((in[14 + inpos]) << 8); - out[13 + outpos] = ((in[14 + inpos] & 268435455) >>> (28 - 4)) + out[13 + outpos] = ((in[14 + inpos]) >>> (28 - 4)) | ((in[15 + inpos]) << 4); - out[14 + outpos] = (in[16 + inpos] & 268435455) - | ((in[17 + inpos]) << 28); - out[15 + outpos] = ((in[17 + inpos] & 268435455) >>> (28 - 24)) + out[14 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 28); + out[15 + outpos] = ((in[17 + inpos]) >>> (28 - 24)) | ((in[18 + inpos]) << 24); - out[16 + outpos] = ((in[18 + inpos] & 268435455) >>> (28 - 20)) + out[16 + outpos] = ((in[18 + inpos]) >>> (28 - 20)) | ((in[19 + inpos]) << 20); - out[17 + outpos] = ((in[19 + inpos] & 268435455) >>> (28 - 16)) + out[17 + outpos] = ((in[19 + inpos]) >>> (28 - 16)) | ((in[20 + inpos]) << 16); - out[18 + outpos] = ((in[20 + inpos] & 268435455) >>> (28 - 12)) + out[18 + outpos] = ((in[20 + inpos]) >>> (28 - 12)) | ((in[21 + inpos]) << 12); - out[19 + outpos] = ((in[21 + inpos] & 268435455) >>> (28 - 8)) + out[19 + outpos] = ((in[21 + inpos]) >>> (28 - 8)) | ((in[22 + inpos]) << 8); - out[20 + outpos] = ((in[22 + inpos] & 268435455) >>> (28 - 4)) + out[20 + outpos] = ((in[22 + inpos]) >>> (28 - 4)) | ((in[23 + inpos]) << 4); - out[21 + outpos] = (in[24 + inpos] & 268435455) - | ((in[25 + inpos]) << 28); - out[22 + outpos] = ((in[25 + inpos] & 268435455) >>> (28 - 24)) + out[21 + outpos] = in[24 + inpos] | ((in[25 + inpos]) << 28); + out[22 + outpos] = ((in[25 + inpos]) >>> (28 - 24)) | ((in[26 + inpos]) << 24); - out[23 + outpos] = ((in[26 + inpos] & 268435455) >>> (28 - 20)) + out[23 + outpos] = ((in[26 + inpos]) >>> (28 - 20)) | ((in[27 + inpos]) << 20); - out[24 + outpos] = ((in[27 + inpos] & 268435455) >>> (28 - 16)) + out[24 + outpos] = ((in[27 + inpos]) >>> (28 - 16)) | ((in[28 + inpos]) << 16); - out[25 + outpos] = ((in[28 + inpos] & 268435455) >>> (28 - 12)) + out[25 + outpos] = ((in[28 + inpos]) >>> (28 - 12)) | ((in[29 + inpos]) << 12); - out[26 + outpos] = ((in[29 + inpos] & 268435455) >>> (28 - 8)) + out[26 + outpos] = ((in[29 + inpos]) >>> (28 - 8)) | ((in[30 + inpos]) << 8); - out[27 + outpos] = ((in[30 + inpos] & 268435455) >>> (28 - 4)) + out[27 + outpos] = ((in[30 + inpos]) >>> (28 - 4)) | ((in[31 + inpos]) << 4); } - protected static void fastpack29(final int[] in, int inpos, + protected static void fastpackwithoutmask29(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 536870911) - | ((in[1 + inpos]) << 29); - out[1 + outpos] = ((in[1 + inpos] & 536870911) >>> (29 - 26)) + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 29); + out[1 + outpos] = ((in[1 + inpos]) >>> (29 - 26)) | ((in[2 + inpos]) << 26); - out[2 + outpos] = ((in[2 + inpos] & 536870911) >>> (29 - 23)) + out[2 + outpos] = ((in[2 + inpos]) >>> (29 - 23)) | ((in[3 + inpos]) << 23); - out[3 + outpos] = ((in[3 + inpos] & 536870911) >>> (29 - 20)) + out[3 + outpos] = ((in[3 + inpos]) >>> (29 - 20)) | ((in[4 + inpos]) << 20); - out[4 + outpos] = ((in[4 + inpos] & 536870911) >>> (29 - 17)) + out[4 + outpos] = ((in[4 + inpos]) >>> (29 - 17)) | ((in[5 + inpos]) << 17); - out[5 + outpos] = ((in[5 + inpos] & 536870911) >>> (29 - 14)) + out[5 + outpos] = ((in[5 + inpos]) >>> (29 - 14)) | ((in[6 + inpos]) << 14); - out[6 + outpos] = ((in[6 + inpos] & 536870911) >>> (29 - 11)) + out[6 + outpos] = ((in[6 + inpos]) >>> (29 - 11)) | ((in[7 + inpos]) << 11); - out[7 + outpos] = ((in[7 + inpos] & 536870911) >>> (29 - 8)) + out[7 + outpos] = ((in[7 + inpos]) >>> (29 - 8)) | ((in[8 + inpos]) << 8); - out[8 + outpos] = ((in[8 + inpos] & 536870911) >>> (29 - 5)) + out[8 + outpos] = ((in[8 + inpos]) >>> (29 - 5)) | ((in[9 + inpos]) << 5); - out[9 + outpos] = ((in[9 + inpos] & 536870911) >>> (29 - 2)) - | ((in[10 + inpos] & 536870911) << 2) - | ((in[11 + inpos]) << 31); - out[10 + outpos] = ((in[11 + inpos] & 536870911) >>> (29 - 28)) + out[9 + outpos] = ((in[9 + inpos]) >>> (29 - 2)) + | ((in[10 + inpos]) << 2) | ((in[11 + inpos]) << 31); + out[10 + outpos] = ((in[11 + inpos]) >>> (29 - 28)) | ((in[12 + inpos]) << 28); - out[11 + outpos] = ((in[12 + inpos] & 536870911) >>> (29 - 25)) + out[11 + outpos] = ((in[12 + inpos]) >>> (29 - 25)) | ((in[13 + inpos]) << 25); - out[12 + outpos] = ((in[13 + inpos] & 536870911) >>> (29 - 22)) + out[12 + outpos] = ((in[13 + inpos]) >>> (29 - 22)) | ((in[14 + inpos]) << 22); - out[13 + outpos] = ((in[14 + inpos] & 536870911) >>> (29 - 19)) + out[13 + outpos] = ((in[14 + inpos]) >>> (29 - 19)) | ((in[15 + inpos]) << 19); - out[14 + outpos] = ((in[15 + inpos] & 536870911) >>> (29 - 16)) + out[14 + outpos] = ((in[15 + inpos]) >>> (29 - 16)) | ((in[16 + inpos]) << 16); - out[15 + outpos] = ((in[16 + inpos] & 536870911) >>> (29 - 13)) + out[15 + outpos] = ((in[16 + inpos]) >>> (29 - 13)) | ((in[17 + inpos]) << 13); - out[16 + outpos] = ((in[17 + inpos] & 536870911) >>> (29 - 10)) + out[16 + outpos] = ((in[17 + inpos]) >>> (29 - 10)) | ((in[18 + inpos]) << 10); - out[17 + outpos] = ((in[18 + inpos] & 536870911) >>> (29 - 7)) + out[17 + outpos] = ((in[18 + inpos]) >>> (29 - 7)) | ((in[19 + inpos]) << 7); - out[18 + outpos] = ((in[19 + inpos] & 536870911) >>> (29 - 4)) + out[18 + outpos] = ((in[19 + inpos]) >>> (29 - 4)) | ((in[20 + inpos]) << 4); - out[19 + outpos] = ((in[20 + inpos] & 536870911) >>> (29 - 1)) - | ((in[21 + inpos] & 536870911) << 1) - | ((in[22 + inpos]) << 30); - out[20 + outpos] = ((in[22 + inpos] & 536870911) >>> (29 - 27)) + out[19 + outpos] = ((in[20 + inpos]) >>> (29 - 1)) + | ((in[21 + inpos]) << 1) | ((in[22 + inpos]) << 30); + out[20 + outpos] = ((in[22 + inpos]) >>> (29 - 27)) | ((in[23 + inpos]) << 27); - out[21 + outpos] = ((in[23 + inpos] & 536870911) >>> (29 - 24)) + out[21 + outpos] = ((in[23 + inpos]) >>> (29 - 24)) | ((in[24 + inpos]) << 24); - out[22 + outpos] = ((in[24 + inpos] & 536870911) >>> (29 - 21)) + out[22 + outpos] = ((in[24 + inpos]) >>> (29 - 21)) | ((in[25 + inpos]) << 21); - out[23 + outpos] = ((in[25 + inpos] & 536870911) >>> (29 - 18)) + out[23 + outpos] = ((in[25 + inpos]) >>> (29 - 18)) | ((in[26 + inpos]) << 18); - out[24 + outpos] = ((in[26 + inpos] & 536870911) >>> (29 - 15)) + out[24 + outpos] = ((in[26 + inpos]) >>> (29 - 15)) | ((in[27 + inpos]) << 15); - out[25 + outpos] = ((in[27 + inpos] & 536870911) >>> (29 - 12)) + out[25 + outpos] = ((in[27 + inpos]) >>> (29 - 12)) | ((in[28 + inpos]) << 12); - out[26 + outpos] = ((in[28 + inpos] & 536870911) >>> (29 - 9)) + out[26 + outpos] = ((in[28 + inpos]) >>> (29 - 9)) | ((in[29 + inpos]) << 9); - out[27 + outpos] = ((in[29 + inpos] & 536870911) >>> (29 - 6)) + out[27 + outpos] = ((in[29 + inpos]) >>> (29 - 6)) | ((in[30 + inpos]) << 6); - out[28 + outpos] = ((in[30 + inpos] & 536870911) >>> (29 - 3)) + out[28 + outpos] = ((in[30 + inpos]) >>> (29 - 3)) | ((in[31 + inpos]) << 3); } - protected static void fastpack30(final int[] in, int inpos, + protected static void fastpackwithoutmask3(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 1073741823) - | ((in[1 + inpos]) << 30); - out[1 + outpos] = ((in[1 + inpos] & 1073741823) >>> (30 - 28)) - | ((in[2 + inpos]) << 28); - out[2 + outpos] = ((in[2 + inpos] & 1073741823) >>> (30 - 26)) - | ((in[3 + inpos]) << 26); - out[3 + outpos] = ((in[3 + inpos] & 1073741823) >>> (30 - 24)) - | ((in[4 + inpos]) << 24); - out[4 + outpos] = ((in[4 + inpos] & 1073741823) >>> (30 - 22)) - | ((in[5 + inpos]) << 22); - out[5 + outpos] = ((in[5 + inpos] & 1073741823) >>> (30 - 20)) + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 3) + | ((in[2 + inpos]) << 6) | ((in[3 + inpos]) << 9) + | ((in[4 + inpos]) << 12) | ((in[5 + inpos]) << 15) + | ((in[6 + inpos]) << 18) | ((in[7 + inpos]) << 21) + | ((in[8 + inpos]) << 24) | ((in[9 + inpos]) << 27) + | ((in[10 + inpos]) << 30); + out[1 + outpos] = ((in[10 + inpos]) >>> (3 - 1)) + | ((in[11 + inpos]) << 1) | ((in[12 + inpos]) << 4) + | ((in[13 + inpos]) << 7) | ((in[14 + inpos]) << 10) + | ((in[15 + inpos]) << 13) | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 19) | ((in[18 + inpos]) << 22) + | ((in[19 + inpos]) << 25) | ((in[20 + inpos]) << 28) + | ((in[21 + inpos]) << 31); + out[2 + outpos] = ((in[21 + inpos]) >>> (3 - 2)) + | ((in[22 + inpos]) << 2) | ((in[23 + inpos]) << 5) + | ((in[24 + inpos]) << 8) | ((in[25 + inpos]) << 11) + | ((in[26 + inpos]) << 14) | ((in[27 + inpos]) << 17) + | ((in[28 + inpos]) << 20) | ((in[29 + inpos]) << 23) + | ((in[30 + inpos]) << 26) | ((in[31 + inpos]) << 29); + } + + protected static void fastpackwithoutmask30(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 30); + out[1 + outpos] = ((in[1 + inpos]) >>> (30 - 28)) + | ((in[2 + inpos]) << 28); + out[2 + outpos] = ((in[2 + inpos]) >>> (30 - 26)) + | ((in[3 + inpos]) << 26); + out[3 + outpos] = ((in[3 + inpos]) >>> (30 - 24)) + | ((in[4 + inpos]) << 24); + out[4 + outpos] = ((in[4 + inpos]) >>> (30 - 22)) + | ((in[5 + inpos]) << 22); + out[5 + outpos] = ((in[5 + inpos]) >>> (30 - 20)) | ((in[6 + inpos]) << 20); - out[6 + outpos] = ((in[6 + inpos] & 1073741823) >>> (30 - 18)) + out[6 + outpos] = ((in[6 + inpos]) >>> (30 - 18)) | ((in[7 + inpos]) << 18); - out[7 + outpos] = ((in[7 + inpos] & 1073741823) >>> (30 - 16)) + out[7 + outpos] = ((in[7 + inpos]) >>> (30 - 16)) | ((in[8 + inpos]) << 16); - out[8 + outpos] = ((in[8 + inpos] & 1073741823) >>> (30 - 14)) + out[8 + outpos] = ((in[8 + inpos]) >>> (30 - 14)) | ((in[9 + inpos]) << 14); - out[9 + outpos] = ((in[9 + inpos] & 1073741823) >>> (30 - 12)) + out[9 + outpos] = ((in[9 + inpos]) >>> (30 - 12)) | ((in[10 + inpos]) << 12); - out[10 + outpos] = ((in[10 + inpos] & 1073741823) >>> (30 - 10)) + out[10 + outpos] = ((in[10 + inpos]) >>> (30 - 10)) | ((in[11 + inpos]) << 10); - out[11 + outpos] = ((in[11 + inpos] & 1073741823) >>> (30 - 8)) + out[11 + outpos] = ((in[11 + inpos]) >>> (30 - 8)) | ((in[12 + inpos]) << 8); - out[12 + outpos] = ((in[12 + inpos] & 1073741823) >>> (30 - 6)) + out[12 + outpos] = ((in[12 + inpos]) >>> (30 - 6)) | ((in[13 + inpos]) << 6); - out[13 + outpos] = ((in[13 + inpos] & 1073741823) >>> (30 - 4)) + out[13 + outpos] = ((in[13 + inpos]) >>> (30 - 4)) | ((in[14 + inpos]) << 4); - out[14 + outpos] = ((in[14 + inpos] & 1073741823) >>> (30 - 2)) + out[14 + outpos] = ((in[14 + inpos]) >>> (30 - 2)) | ((in[15 + inpos]) << 2); - out[15 + outpos] = (in[16 + inpos] & 1073741823) - | ((in[17 + inpos]) << 30); - out[16 + outpos] = ((in[17 + inpos] & 1073741823) >>> (30 - 28)) + out[15 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 30); + out[16 + outpos] = ((in[17 + inpos]) >>> (30 - 28)) | ((in[18 + inpos]) << 28); - out[17 + outpos] = ((in[18 + inpos] & 1073741823) >>> (30 - 26)) + out[17 + outpos] = ((in[18 + inpos]) >>> (30 - 26)) | ((in[19 + inpos]) << 26); - out[18 + outpos] = ((in[19 + inpos] & 1073741823) >>> (30 - 24)) + out[18 + outpos] = ((in[19 + inpos]) >>> (30 - 24)) | ((in[20 + inpos]) << 24); - out[19 + outpos] = ((in[20 + inpos] & 1073741823) >>> (30 - 22)) + out[19 + outpos] = ((in[20 + inpos]) >>> (30 - 22)) | ((in[21 + inpos]) << 22); - out[20 + outpos] = ((in[21 + inpos] & 1073741823) >>> (30 - 20)) + out[20 + outpos] = ((in[21 + inpos]) >>> (30 - 20)) | ((in[22 + inpos]) << 20); - out[21 + outpos] = ((in[22 + inpos] & 1073741823) >>> (30 - 18)) + out[21 + outpos] = ((in[22 + inpos]) >>> (30 - 18)) | ((in[23 + inpos]) << 18); - out[22 + outpos] = ((in[23 + inpos] & 1073741823) >>> (30 - 16)) + out[22 + outpos] = ((in[23 + inpos]) >>> (30 - 16)) | ((in[24 + inpos]) << 16); - out[23 + outpos] = ((in[24 + inpos] & 1073741823) >>> (30 - 14)) + out[23 + outpos] = ((in[24 + inpos]) >>> (30 - 14)) | ((in[25 + inpos]) << 14); - out[24 + outpos] = ((in[25 + inpos] & 1073741823) >>> (30 - 12)) + out[24 + outpos] = ((in[25 + inpos]) >>> (30 - 12)) | ((in[26 + inpos]) << 12); - out[25 + outpos] = ((in[26 + inpos] & 1073741823) >>> (30 - 10)) + out[25 + outpos] = ((in[26 + inpos]) >>> (30 - 10)) | ((in[27 + inpos]) << 10); - out[26 + outpos] = ((in[27 + inpos] & 1073741823) >>> (30 - 8)) + out[26 + outpos] = ((in[27 + inpos]) >>> (30 - 8)) | ((in[28 + inpos]) << 8); - out[27 + outpos] = ((in[28 + inpos] & 1073741823) >>> (30 - 6)) + out[27 + outpos] = ((in[28 + inpos]) >>> (30 - 6)) | ((in[29 + inpos]) << 6); - out[28 + outpos] = ((in[29 + inpos] & 1073741823) >>> (30 - 4)) + out[28 + outpos] = ((in[29 + inpos]) >>> (30 - 4)) | ((in[30 + inpos]) << 4); - out[29 + outpos] = ((in[30 + inpos] & 1073741823) >>> (30 - 2)) + out[29 + outpos] = ((in[30 + inpos]) >>> (30 - 2)) | ((in[31 + inpos]) << 2); } - protected static void fastpack31(final int[] in, int inpos, + protected static void fastpackwithoutmask31(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] & 2147483647) - | ((in[1 + inpos]) << 31); - out[1 + outpos] = ((in[1 + inpos] & 2147483647) >>> (31 - 30)) + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 31); + out[1 + outpos] = ((in[1 + inpos]) >>> (31 - 30)) | ((in[2 + inpos]) << 30); - out[2 + outpos] = ((in[2 + inpos] & 2147483647) >>> (31 - 29)) + out[2 + outpos] = ((in[2 + inpos]) >>> (31 - 29)) | ((in[3 + inpos]) << 29); - out[3 + outpos] = ((in[3 + inpos] & 2147483647) >>> (31 - 28)) + out[3 + outpos] = ((in[3 + inpos]) >>> (31 - 28)) | ((in[4 + inpos]) << 28); - out[4 + outpos] = ((in[4 + inpos] & 2147483647) >>> (31 - 27)) + out[4 + outpos] = ((in[4 + inpos]) >>> (31 - 27)) | ((in[5 + inpos]) << 27); - out[5 + outpos] = ((in[5 + inpos] & 2147483647) >>> (31 - 26)) + out[5 + outpos] = ((in[5 + inpos]) >>> (31 - 26)) | ((in[6 + inpos]) << 26); - out[6 + outpos] = ((in[6 + inpos] & 2147483647) >>> (31 - 25)) + out[6 + outpos] = ((in[6 + inpos]) >>> (31 - 25)) | ((in[7 + inpos]) << 25); - out[7 + outpos] = ((in[7 + inpos] & 2147483647) >>> (31 - 24)) + out[7 + outpos] = ((in[7 + inpos]) >>> (31 - 24)) | ((in[8 + inpos]) << 24); - out[8 + outpos] = ((in[8 + inpos] & 2147483647) >>> (31 - 23)) + out[8 + outpos] = ((in[8 + inpos]) >>> (31 - 23)) | ((in[9 + inpos]) << 23); - out[9 + outpos] = ((in[9 + inpos] & 2147483647) >>> (31 - 22)) + out[9 + outpos] = ((in[9 + inpos]) >>> (31 - 22)) | ((in[10 + inpos]) << 22); - out[10 + outpos] = ((in[10 + inpos] & 2147483647) >>> (31 - 21)) + out[10 + outpos] = ((in[10 + inpos]) >>> (31 - 21)) | ((in[11 + inpos]) << 21); - out[11 + outpos] = ((in[11 + inpos] & 2147483647) >>> (31 - 20)) + out[11 + outpos] = ((in[11 + inpos]) >>> (31 - 20)) | ((in[12 + inpos]) << 20); - out[12 + outpos] = ((in[12 + inpos] & 2147483647) >>> (31 - 19)) + out[12 + outpos] = ((in[12 + inpos]) >>> (31 - 19)) | ((in[13 + inpos]) << 19); - out[13 + outpos] = ((in[13 + inpos] & 2147483647) >>> (31 - 18)) + out[13 + outpos] = ((in[13 + inpos]) >>> (31 - 18)) | ((in[14 + inpos]) << 18); - out[14 + outpos] = ((in[14 + inpos] & 2147483647) >>> (31 - 17)) + out[14 + outpos] = ((in[14 + inpos]) >>> (31 - 17)) | ((in[15 + inpos]) << 17); - out[15 + outpos] = ((in[15 + inpos] & 2147483647) >>> (31 - 16)) + out[15 + outpos] = ((in[15 + inpos]) >>> (31 - 16)) | ((in[16 + inpos]) << 16); - out[16 + outpos] = ((in[16 + inpos] & 2147483647) >>> (31 - 15)) + out[16 + outpos] = ((in[16 + inpos]) >>> (31 - 15)) | ((in[17 + inpos]) << 15); - out[17 + outpos] = ((in[17 + inpos] & 2147483647) >>> (31 - 14)) + out[17 + outpos] = ((in[17 + inpos]) >>> (31 - 14)) | ((in[18 + inpos]) << 14); - out[18 + outpos] = ((in[18 + inpos] & 2147483647) >>> (31 - 13)) + out[18 + outpos] = ((in[18 + inpos]) >>> (31 - 13)) | ((in[19 + inpos]) << 13); - out[19 + outpos] = ((in[19 + inpos] & 2147483647) >>> (31 - 12)) + out[19 + outpos] = ((in[19 + inpos]) >>> (31 - 12)) | ((in[20 + inpos]) << 12); - out[20 + outpos] = ((in[20 + inpos] & 2147483647) >>> (31 - 11)) + out[20 + outpos] = ((in[20 + inpos]) >>> (31 - 11)) | ((in[21 + inpos]) << 11); - out[21 + outpos] = ((in[21 + inpos] & 2147483647) >>> (31 - 10)) + out[21 + outpos] = ((in[21 + inpos]) >>> (31 - 10)) | ((in[22 + inpos]) << 10); - out[22 + outpos] = ((in[22 + inpos] & 2147483647) >>> (31 - 9)) + out[22 + outpos] = ((in[22 + inpos]) >>> (31 - 9)) | ((in[23 + inpos]) << 9); - out[23 + outpos] = ((in[23 + inpos] & 2147483647) >>> (31 - 8)) + out[23 + outpos] = ((in[23 + inpos]) >>> (31 - 8)) | ((in[24 + inpos]) << 8); - out[24 + outpos] = ((in[24 + inpos] & 2147483647) >>> (31 - 7)) + out[24 + outpos] = ((in[24 + inpos]) >>> (31 - 7)) | ((in[25 + inpos]) << 7); - out[25 + outpos] = ((in[25 + inpos] & 2147483647) >>> (31 - 6)) + out[25 + outpos] = ((in[25 + inpos]) >>> (31 - 6)) | ((in[26 + inpos]) << 6); - out[26 + outpos] = ((in[26 + inpos] & 2147483647) >>> (31 - 5)) + out[26 + outpos] = ((in[26 + inpos]) >>> (31 - 5)) | ((in[27 + inpos]) << 5); - out[27 + outpos] = ((in[27 + inpos] & 2147483647) >>> (31 - 4)) + out[27 + outpos] = ((in[27 + inpos]) >>> (31 - 4)) | ((in[28 + inpos]) << 4); - out[28 + outpos] = ((in[28 + inpos] & 2147483647) >>> (31 - 3)) + out[28 + outpos] = ((in[28 + inpos]) >>> (31 - 3)) | ((in[29 + inpos]) << 3); - out[29 + outpos] = ((in[29 + inpos] & 2147483647) >>> (31 - 2)) + out[29 + outpos] = ((in[29 + inpos]) >>> (31 - 2)) | ((in[30 + inpos]) << 2); - out[30 + outpos] = ((in[30 + inpos] & 2147483647) >>> (31 - 1)) + out[30 + outpos] = ((in[30 + inpos]) >>> (31 - 1)) | ((in[31 + inpos]) << 1); } - protected static void fastunpack1(final int[] in, int inpos, + protected static void fastpackwithoutmask32(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 1); - out[1 + outpos] = ((in[0 + inpos] >>> 1) & 1); - out[2 + outpos] = ((in[0 + inpos] >>> 2) & 1); - out[3 + outpos] = ((in[0 + inpos] >>> 3) & 1); - out[4 + outpos] = ((in[0 + inpos] >>> 4) & 1); - out[5 + outpos] = ((in[0 + inpos] >>> 5) & 1); - out[6 + outpos] = ((in[0 + inpos] >>> 6) & 1); - out[7 + outpos] = ((in[0 + inpos] >>> 7) & 1); - out[8 + outpos] = ((in[0 + inpos] >>> 8) & 1); - out[9 + outpos] = ((in[0 + inpos] >>> 9) & 1); - out[10 + outpos] = ((in[0 + inpos] >>> 10) & 1); - out[11 + outpos] = ((in[0 + inpos] >>> 11) & 1); - out[12 + outpos] = ((in[0 + inpos] >>> 12) & 1); - out[13 + outpos] = ((in[0 + inpos] >>> 13) & 1); - out[14 + outpos] = ((in[0 + inpos] >>> 14) & 1); - out[15 + outpos] = ((in[0 + inpos] >>> 15) & 1); - out[16 + outpos] = ((in[0 + inpos] >>> 16) & 1); - out[17 + outpos] = ((in[0 + inpos] >>> 17) & 1); - out[18 + outpos] = ((in[0 + inpos] >>> 18) & 1); - out[19 + outpos] = ((in[0 + inpos] >>> 19) & 1); - out[20 + outpos] = ((in[0 + inpos] >>> 20) & 1); - out[21 + outpos] = ((in[0 + inpos] >>> 21) & 1); - out[22 + outpos] = ((in[0 + inpos] >>> 22) & 1); - out[23 + outpos] = ((in[0 + inpos] >>> 23) & 1); - out[24 + outpos] = ((in[0 + inpos] >>> 24) & 1); - out[25 + outpos] = ((in[0 + inpos] >>> 25) & 1); - out[26 + outpos] = ((in[0 + inpos] >>> 26) & 1); - out[27 + outpos] = ((in[0 + inpos] >>> 27) & 1); - out[28 + outpos] = ((in[0 + inpos] >>> 28) & 1); - out[29 + outpos] = ((in[0 + inpos] >>> 29) & 1); - out[30 + outpos] = ((in[0 + inpos] >>> 30) & 1); - out[31 + outpos] = (in[0 + inpos] >>> 31); + System.arraycopy(in, inpos, out, outpos, 32); } - protected static void fastunpack2(final int[] in, int inpos, + protected static void fastpackwithoutmask4(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 3); - out[1 + outpos] = ((in[0 + inpos] >>> 2) & 3); - out[2 + outpos] = ((in[0 + inpos] >>> 4) & 3); - out[3 + outpos] = ((in[0 + inpos] >>> 6) & 3); - out[4 + outpos] = ((in[0 + inpos] >>> 8) & 3); - out[5 + outpos] = ((in[0 + inpos] >>> 10) & 3); - out[6 + outpos] = ((in[0 + inpos] >>> 12) & 3); - out[7 + outpos] = ((in[0 + inpos] >>> 14) & 3); - out[8 + outpos] = ((in[0 + inpos] >>> 16) & 3); - out[9 + outpos] = ((in[0 + inpos] >>> 18) & 3); - out[10 + outpos] = ((in[0 + inpos] >>> 20) & 3); - out[11 + outpos] = ((in[0 + inpos] >>> 22) & 3); - out[12 + outpos] = ((in[0 + inpos] >>> 24) & 3); - out[13 + outpos] = ((in[0 + inpos] >>> 26) & 3); - out[14 + outpos] = ((in[0 + inpos] >>> 28) & 3); - out[15 + outpos] = (in[0 + inpos] >>> 30); - out[16 + outpos] = ((in[1 + inpos] >>> 0) & 3); - out[17 + outpos] = ((in[1 + inpos] >>> 2) & 3); - out[18 + outpos] = ((in[1 + inpos] >>> 4) & 3); - out[19 + outpos] = ((in[1 + inpos] >>> 6) & 3); - out[20 + outpos] = ((in[1 + inpos] >>> 8) & 3); - out[21 + outpos] = ((in[1 + inpos] >>> 10) & 3); - out[22 + outpos] = ((in[1 + inpos] >>> 12) & 3); - out[23 + outpos] = ((in[1 + inpos] >>> 14) & 3); - out[24 + outpos] = ((in[1 + inpos] >>> 16) & 3); - out[25 + outpos] = ((in[1 + inpos] >>> 18) & 3); - out[26 + outpos] = ((in[1 + inpos] >>> 20) & 3); - out[27 + outpos] = ((in[1 + inpos] >>> 22) & 3); - out[28 + outpos] = ((in[1 + inpos] >>> 24) & 3); - out[29 + outpos] = ((in[1 + inpos] >>> 26) & 3); - out[30 + outpos] = ((in[1 + inpos] >>> 28) & 3); - out[31 + outpos] = (in[1 + inpos] >>> 30); + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 4) + | ((in[2 + inpos]) << 8) | ((in[3 + inpos]) << 12) + | ((in[4 + inpos]) << 16) | ((in[5 + inpos]) << 20) + | ((in[6 + inpos]) << 24) | ((in[7 + inpos]) << 28); + out[1 + outpos] = in[8 + inpos] | ((in[9 + inpos]) << 4) + | ((in[10 + inpos]) << 8) | ((in[11 + inpos]) << 12) + | ((in[12 + inpos]) << 16) | ((in[13 + inpos]) << 20) + | ((in[14 + inpos]) << 24) | ((in[15 + inpos]) << 28); + out[2 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 4) + | ((in[18 + inpos]) << 8) | ((in[19 + inpos]) << 12) + | ((in[20 + inpos]) << 16) | ((in[21 + inpos]) << 20) + | ((in[22 + inpos]) << 24) | ((in[23 + inpos]) << 28); + out[3 + outpos] = in[24 + inpos] | ((in[25 + inpos]) << 4) + | ((in[26 + inpos]) << 8) | ((in[27 + inpos]) << 12) + | ((in[28 + inpos]) << 16) | ((in[29 + inpos]) << 20) + | ((in[30 + inpos]) << 24) | ((in[31 + inpos]) << 28); } - protected static void fastunpack3(final int[] in, int inpos, + protected static void fastpackwithoutmask5(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 7); - out[1 + outpos] = ((in[0 + inpos] >>> 3) & 7); - out[2 + outpos] = ((in[0 + inpos] >>> 6) & 7); - out[3 + outpos] = ((in[0 + inpos] >>> 9) & 7); - out[4 + outpos] = ((in[0 + inpos] >>> 12) & 7); - out[5 + outpos] = ((in[0 + inpos] >>> 15) & 7); - out[6 + outpos] = ((in[0 + inpos] >>> 18) & 7); - out[7 + outpos] = ((in[0 + inpos] >>> 21) & 7); - out[8 + outpos] = ((in[0 + inpos] >>> 24) & 7); - out[9 + outpos] = ((in[0 + inpos] >>> 27) & 7); - out[10 + outpos] = (in[0 + inpos] >>> 30) - | ((in[1 + inpos] & 1) << (3 - 1)); - out[11 + outpos] = ((in[1 + inpos] >>> 1) & 7); - out[12 + outpos] = ((in[1 + inpos] >>> 4) & 7); - out[13 + outpos] = ((in[1 + inpos] >>> 7) & 7); - out[14 + outpos] = ((in[1 + inpos] >>> 10) & 7); - out[15 + outpos] = ((in[1 + inpos] >>> 13) & 7); - out[16 + outpos] = ((in[1 + inpos] >>> 16) & 7); - out[17 + outpos] = ((in[1 + inpos] >>> 19) & 7); - out[18 + outpos] = ((in[1 + inpos] >>> 22) & 7); - out[19 + outpos] = ((in[1 + inpos] >>> 25) & 7); - out[20 + outpos] = ((in[1 + inpos] >>> 28) & 7); - out[21 + outpos] = (in[1 + inpos] >>> 31) - | ((in[2 + inpos] & 3) << (3 - 2)); - out[22 + outpos] = ((in[2 + inpos] >>> 2) & 7); - out[23 + outpos] = ((in[2 + inpos] >>> 5) & 7); - out[24 + outpos] = ((in[2 + inpos] >>> 8) & 7); - out[25 + outpos] = ((in[2 + inpos] >>> 11) & 7); - out[26 + outpos] = ((in[2 + inpos] >>> 14) & 7); - out[27 + outpos] = ((in[2 + inpos] >>> 17) & 7); - out[28 + outpos] = ((in[2 + inpos] >>> 20) & 7); - out[29 + outpos] = ((in[2 + inpos] >>> 23) & 7); - out[30 + outpos] = ((in[2 + inpos] >>> 26) & 7); - out[31 + outpos] = (in[2 + inpos] >>> 29); - } - - protected static void fastunpack4(final int[] in, int inpos, - final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 15); - out[1 + outpos] = ((in[0 + inpos] >>> 4) & 15); - out[2 + outpos] = ((in[0 + inpos] >>> 8) & 15); - out[3 + outpos] = ((in[0 + inpos] >>> 12) & 15); - out[4 + outpos] = ((in[0 + inpos] >>> 16) & 15); - out[5 + outpos] = ((in[0 + inpos] >>> 20) & 15); - out[6 + outpos] = ((in[0 + inpos] >>> 24) & 15); - out[7 + outpos] = (in[0 + inpos] >>> 28); - out[8 + outpos] = ((in[1 + inpos] >>> 0) & 15); - out[9 + outpos] = ((in[1 + inpos] >>> 4) & 15); - out[10 + outpos] = ((in[1 + inpos] >>> 8) & 15); - out[11 + outpos] = ((in[1 + inpos] >>> 12) & 15); - out[12 + outpos] = ((in[1 + inpos] >>> 16) & 15); - out[13 + outpos] = ((in[1 + inpos] >>> 20) & 15); - out[14 + outpos] = ((in[1 + inpos] >>> 24) & 15); - out[15 + outpos] = (in[1 + inpos] >>> 28); - out[16 + outpos] = ((in[2 + inpos] >>> 0) & 15); - out[17 + outpos] = ((in[2 + inpos] >>> 4) & 15); - out[18 + outpos] = ((in[2 + inpos] >>> 8) & 15); - out[19 + outpos] = ((in[2 + inpos] >>> 12) & 15); - out[20 + outpos] = ((in[2 + inpos] >>> 16) & 15); - out[21 + outpos] = ((in[2 + inpos] >>> 20) & 15); - out[22 + outpos] = ((in[2 + inpos] >>> 24) & 15); - out[23 + outpos] = (in[2 + inpos] >>> 28); - out[24 + outpos] = ((in[3 + inpos] >>> 0) & 15); - out[25 + outpos] = ((in[3 + inpos] >>> 4) & 15); - out[26 + outpos] = ((in[3 + inpos] >>> 8) & 15); - out[27 + outpos] = ((in[3 + inpos] >>> 12) & 15); - out[28 + outpos] = ((in[3 + inpos] >>> 16) & 15); - out[29 + outpos] = ((in[3 + inpos] >>> 20) & 15); - out[30 + outpos] = ((in[3 + inpos] >>> 24) & 15); - out[31 + outpos] = (in[3 + inpos] >>> 28); + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 5) + | ((in[2 + inpos]) << 10) | ((in[3 + inpos]) << 15) + | ((in[4 + inpos]) << 20) | ((in[5 + inpos]) << 25) + | ((in[6 + inpos]) << 30); + out[1 + outpos] = ((in[6 + inpos]) >>> (5 - 3)) + | ((in[7 + inpos]) << 3) | ((in[8 + inpos]) << 8) + | ((in[9 + inpos]) << 13) | ((in[10 + inpos]) << 18) + | ((in[11 + inpos]) << 23) | ((in[12 + inpos]) << 28); + out[2 + outpos] = ((in[12 + inpos]) >>> (5 - 1)) + | ((in[13 + inpos]) << 1) | ((in[14 + inpos]) << 6) + | ((in[15 + inpos]) << 11) | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 21) | ((in[18 + inpos]) << 26) + | ((in[19 + inpos]) << 31); + out[3 + outpos] = ((in[19 + inpos]) >>> (5 - 4)) + | ((in[20 + inpos]) << 4) | ((in[21 + inpos]) << 9) + | ((in[22 + inpos]) << 14) | ((in[23 + inpos]) << 19) + | ((in[24 + inpos]) << 24) | ((in[25 + inpos]) << 29); + out[4 + outpos] = ((in[25 + inpos]) >>> (5 - 2)) + | ((in[26 + inpos]) << 2) | ((in[27 + inpos]) << 7) + | ((in[28 + inpos]) << 12) | ((in[29 + inpos]) << 17) + | ((in[30 + inpos]) << 22) | ((in[31 + inpos]) << 27); } - protected static void fastunpack5(final int[] in, int inpos, + protected static void fastpackwithoutmask6(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 31); - out[1 + outpos] = ((in[0 + inpos] >>> 5) & 31); - out[2 + outpos] = ((in[0 + inpos] >>> 10) & 31); - out[3 + outpos] = ((in[0 + inpos] >>> 15) & 31); - out[4 + outpos] = ((in[0 + inpos] >>> 20) & 31); - out[5 + outpos] = ((in[0 + inpos] >>> 25) & 31); - out[6 + outpos] = (in[0 + inpos] >>> 30) - | ((in[1 + inpos] & 7) << (5 - 3)); - out[7 + outpos] = ((in[1 + inpos] >>> 3) & 31); - out[8 + outpos] = ((in[1 + inpos] >>> 8) & 31); - out[9 + outpos] = ((in[1 + inpos] >>> 13) & 31); - out[10 + outpos] = ((in[1 + inpos] >>> 18) & 31); - out[11 + outpos] = ((in[1 + inpos] >>> 23) & 31); - out[12 + outpos] = (in[1 + inpos] >>> 28) - | ((in[2 + inpos] & 1) << (5 - 1)); - out[13 + outpos] = ((in[2 + inpos] >>> 1) & 31); - out[14 + outpos] = ((in[2 + inpos] >>> 6) & 31); - out[15 + outpos] = ((in[2 + inpos] >>> 11) & 31); - out[16 + outpos] = ((in[2 + inpos] >>> 16) & 31); - out[17 + outpos] = ((in[2 + inpos] >>> 21) & 31); - out[18 + outpos] = ((in[2 + inpos] >>> 26) & 31); - out[19 + outpos] = (in[2 + inpos] >>> 31) - | ((in[3 + inpos] & 15) << (5 - 4)); - out[20 + outpos] = ((in[3 + inpos] >>> 4) & 31); - out[21 + outpos] = ((in[3 + inpos] >>> 9) & 31); - out[22 + outpos] = ((in[3 + inpos] >>> 14) & 31); - out[23 + outpos] = ((in[3 + inpos] >>> 19) & 31); - out[24 + outpos] = ((in[3 + inpos] >>> 24) & 31); - out[25 + outpos] = (in[3 + inpos] >>> 29) - | ((in[4 + inpos] & 3) << (5 - 2)); - out[26 + outpos] = ((in[4 + inpos] >>> 2) & 31); - out[27 + outpos] = ((in[4 + inpos] >>> 7) & 31); - out[28 + outpos] = ((in[4 + inpos] >>> 12) & 31); - out[29 + outpos] = ((in[4 + inpos] >>> 17) & 31); - out[30 + outpos] = ((in[4 + inpos] >>> 22) & 31); - out[31 + outpos] = (in[4 + inpos] >>> 27); + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 6) + | ((in[2 + inpos]) << 12) | ((in[3 + inpos]) << 18) + | ((in[4 + inpos]) << 24) | ((in[5 + inpos]) << 30); + out[1 + outpos] = ((in[5 + inpos]) >>> (6 - 4)) + | ((in[6 + inpos]) << 4) | ((in[7 + inpos]) << 10) + | ((in[8 + inpos]) << 16) | ((in[9 + inpos]) << 22) + | ((in[10 + inpos]) << 28); + out[2 + outpos] = ((in[10 + inpos]) >>> (6 - 2)) + | ((in[11 + inpos]) << 2) | ((in[12 + inpos]) << 8) + | ((in[13 + inpos]) << 14) | ((in[14 + inpos]) << 20) + | ((in[15 + inpos]) << 26); + out[3 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 6) + | ((in[18 + inpos]) << 12) | ((in[19 + inpos]) << 18) + | ((in[20 + inpos]) << 24) | ((in[21 + inpos]) << 30); + out[4 + outpos] = ((in[21 + inpos]) >>> (6 - 4)) + | ((in[22 + inpos]) << 4) | ((in[23 + inpos]) << 10) + | ((in[24 + inpos]) << 16) | ((in[25 + inpos]) << 22) + | ((in[26 + inpos]) << 28); + out[5 + outpos] = ((in[26 + inpos]) >>> (6 - 2)) + | ((in[27 + inpos]) << 2) | ((in[28 + inpos]) << 8) + | ((in[29 + inpos]) << 14) | ((in[30 + inpos]) << 20) + | ((in[31 + inpos]) << 26); } - protected static void fastunpack6(final int[] in, int inpos, + protected static void fastpackwithoutmask7(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 63); - out[1 + outpos] = ((in[0 + inpos] >>> 6) & 63); - out[2 + outpos] = ((in[0 + inpos] >>> 12) & 63); - out[3 + outpos] = ((in[0 + inpos] >>> 18) & 63); - out[4 + outpos] = ((in[0 + inpos] >>> 24) & 63); - out[5 + outpos] = (in[0 + inpos] >>> 30) - | ((in[1 + inpos] & 15) << (6 - 4)); - out[6 + outpos] = ((in[1 + inpos] >>> 4) & 63); - out[7 + outpos] = ((in[1 + inpos] >>> 10) & 63); - out[8 + outpos] = ((in[1 + inpos] >>> 16) & 63); - out[9 + outpos] = ((in[1 + inpos] >>> 22) & 63); - out[10 + outpos] = (in[1 + inpos] >>> 28) - | ((in[2 + inpos] & 3) << (6 - 2)); - out[11 + outpos] = ((in[2 + inpos] >>> 2) & 63); - out[12 + outpos] = ((in[2 + inpos] >>> 8) & 63); - out[13 + outpos] = ((in[2 + inpos] >>> 14) & 63); - out[14 + outpos] = ((in[2 + inpos] >>> 20) & 63); - out[15 + outpos] = (in[2 + inpos] >>> 26); - out[16 + outpos] = ((in[3 + inpos] >>> 0) & 63); - out[17 + outpos] = ((in[3 + inpos] >>> 6) & 63); - out[18 + outpos] = ((in[3 + inpos] >>> 12) & 63); - out[19 + outpos] = ((in[3 + inpos] >>> 18) & 63); - out[20 + outpos] = ((in[3 + inpos] >>> 24) & 63); - out[21 + outpos] = (in[3 + inpos] >>> 30) - | ((in[4 + inpos] & 15) << (6 - 4)); - out[22 + outpos] = ((in[4 + inpos] >>> 4) & 63); - out[23 + outpos] = ((in[4 + inpos] >>> 10) & 63); - out[24 + outpos] = ((in[4 + inpos] >>> 16) & 63); - out[25 + outpos] = ((in[4 + inpos] >>> 22) & 63); - out[26 + outpos] = (in[4 + inpos] >>> 28) - | ((in[5 + inpos] & 3) << (6 - 2)); - out[27 + outpos] = ((in[5 + inpos] >>> 2) & 63); - out[28 + outpos] = ((in[5 + inpos] >>> 8) & 63); - out[29 + outpos] = ((in[5 + inpos] >>> 14) & 63); - out[30 + outpos] = ((in[5 + inpos] >>> 20) & 63); - out[31 + outpos] = (in[5 + inpos] >>> 26); + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 7) + | ((in[2 + inpos]) << 14) | ((in[3 + inpos]) << 21) + | ((in[4 + inpos]) << 28); + out[1 + outpos] = ((in[4 + inpos]) >>> (7 - 3)) + | ((in[5 + inpos]) << 3) | ((in[6 + inpos]) << 10) + | ((in[7 + inpos]) << 17) | ((in[8 + inpos]) << 24) + | ((in[9 + inpos]) << 31); + out[2 + outpos] = ((in[9 + inpos]) >>> (7 - 6)) + | ((in[10 + inpos]) << 6) | ((in[11 + inpos]) << 13) + | ((in[12 + inpos]) << 20) | ((in[13 + inpos]) << 27); + out[3 + outpos] = ((in[13 + inpos]) >>> (7 - 2)) + | ((in[14 + inpos]) << 2) | ((in[15 + inpos]) << 9) + | ((in[16 + inpos]) << 16) | ((in[17 + inpos]) << 23) + | ((in[18 + inpos]) << 30); + out[4 + outpos] = ((in[18 + inpos]) >>> (7 - 5)) + | ((in[19 + inpos]) << 5) | ((in[20 + inpos]) << 12) + | ((in[21 + inpos]) << 19) | ((in[22 + inpos]) << 26); + out[5 + outpos] = ((in[22 + inpos]) >>> (7 - 1)) + | ((in[23 + inpos]) << 1) | ((in[24 + inpos]) << 8) + | ((in[25 + inpos]) << 15) | ((in[26 + inpos]) << 22) + | ((in[27 + inpos]) << 29); + out[6 + outpos] = ((in[27 + inpos]) >>> (7 - 4)) + | ((in[28 + inpos]) << 4) | ((in[29 + inpos]) << 11) + | ((in[30 + inpos]) << 18) | ((in[31 + inpos]) << 25); } - protected static void fastunpack7(final int[] in, int inpos, + protected static void fastpackwithoutmask8(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 127); - out[1 + outpos] = ((in[0 + inpos] >>> 7) & 127); - out[2 + outpos] = ((in[0 + inpos] >>> 14) & 127); - out[3 + outpos] = ((in[0 + inpos] >>> 21) & 127); - out[4 + outpos] = (in[0 + inpos] >>> 28) - | ((in[1 + inpos] & 7) << (7 - 3)); - out[5 + outpos] = ((in[1 + inpos] >>> 3) & 127); - out[6 + outpos] = ((in[1 + inpos] >>> 10) & 127); - out[7 + outpos] = ((in[1 + inpos] >>> 17) & 127); - out[8 + outpos] = ((in[1 + inpos] >>> 24) & 127); - out[9 + outpos] = (in[1 + inpos] >>> 31) - | ((in[2 + inpos] & 63) << (7 - 6)); - out[10 + outpos] = ((in[2 + inpos] >>> 6) & 127); - out[11 + outpos] = ((in[2 + inpos] >>> 13) & 127); - out[12 + outpos] = ((in[2 + inpos] >>> 20) & 127); - out[13 + outpos] = (in[2 + inpos] >>> 27) - | ((in[3 + inpos] & 3) << (7 - 2)); - out[14 + outpos] = ((in[3 + inpos] >>> 2) & 127); - out[15 + outpos] = ((in[3 + inpos] >>> 9) & 127); - out[16 + outpos] = ((in[3 + inpos] >>> 16) & 127); - out[17 + outpos] = ((in[3 + inpos] >>> 23) & 127); - out[18 + outpos] = (in[3 + inpos] >>> 30) - | ((in[4 + inpos] & 31) << (7 - 5)); - out[19 + outpos] = ((in[4 + inpos] >>> 5) & 127); - out[20 + outpos] = ((in[4 + inpos] >>> 12) & 127); - out[21 + outpos] = ((in[4 + inpos] >>> 19) & 127); - out[22 + outpos] = (in[4 + inpos] >>> 26) - | ((in[5 + inpos] & 1) << (7 - 1)); - out[23 + outpos] = ((in[5 + inpos] >>> 1) & 127); - out[24 + outpos] = ((in[5 + inpos] >>> 8) & 127); - out[25 + outpos] = ((in[5 + inpos] >>> 15) & 127); - out[26 + outpos] = ((in[5 + inpos] >>> 22) & 127); - out[27 + outpos] = (in[5 + inpos] >>> 29) - | ((in[6 + inpos] & 15) << (7 - 4)); - out[28 + outpos] = ((in[6 + inpos] >>> 4) & 127); - out[29 + outpos] = ((in[6 + inpos] >>> 11) & 127); - out[30 + outpos] = ((in[6 + inpos] >>> 18) & 127); - out[31 + outpos] = (in[6 + inpos] >>> 25); + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 8) + | ((in[2 + inpos]) << 16) | ((in[3 + inpos]) << 24); + out[1 + outpos] = in[4 + inpos] | ((in[5 + inpos]) << 8) + | ((in[6 + inpos]) << 16) | ((in[7 + inpos]) << 24); + out[2 + outpos] = in[8 + inpos] | ((in[9 + inpos]) << 8) + | ((in[10 + inpos]) << 16) | ((in[11 + inpos]) << 24); + out[3 + outpos] = in[12 + inpos] | ((in[13 + inpos]) << 8) + | ((in[14 + inpos]) << 16) | ((in[15 + inpos]) << 24); + out[4 + outpos] = in[16 + inpos] | ((in[17 + inpos]) << 8) + | ((in[18 + inpos]) << 16) | ((in[19 + inpos]) << 24); + out[5 + outpos] = in[20 + inpos] | ((in[21 + inpos]) << 8) + | ((in[22 + inpos]) << 16) | ((in[23 + inpos]) << 24); + out[6 + outpos] = in[24 + inpos] | ((in[25 + inpos]) << 8) + | ((in[26 + inpos]) << 16) | ((in[27 + inpos]) << 24); + out[7 + outpos] = in[28 + inpos] | ((in[29 + inpos]) << 8) + | ((in[30 + inpos]) << 16) | ((in[31 + inpos]) << 24); } - protected static void fastunpack8(final int[] in, int inpos, + protected static void fastpackwithoutmask9(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 255); - out[1 + outpos] = ((in[0 + inpos] >>> 8) & 255); - out[2 + outpos] = ((in[0 + inpos] >>> 16) & 255); - out[3 + outpos] = (in[0 + inpos] >>> 24); - out[4 + outpos] = ((in[1 + inpos] >>> 0) & 255); - out[5 + outpos] = ((in[1 + inpos] >>> 8) & 255); - out[6 + outpos] = ((in[1 + inpos] >>> 16) & 255); - out[7 + outpos] = (in[1 + inpos] >>> 24); - out[8 + outpos] = ((in[2 + inpos] >>> 0) & 255); - out[9 + outpos] = ((in[2 + inpos] >>> 8) & 255); - out[10 + outpos] = ((in[2 + inpos] >>> 16) & 255); - out[11 + outpos] = (in[2 + inpos] >>> 24); - out[12 + outpos] = ((in[3 + inpos] >>> 0) & 255); - out[13 + outpos] = ((in[3 + inpos] >>> 8) & 255); - out[14 + outpos] = ((in[3 + inpos] >>> 16) & 255); - out[15 + outpos] = (in[3 + inpos] >>> 24); - out[16 + outpos] = ((in[4 + inpos] >>> 0) & 255); - out[17 + outpos] = ((in[4 + inpos] >>> 8) & 255); - out[18 + outpos] = ((in[4 + inpos] >>> 16) & 255); - out[19 + outpos] = (in[4 + inpos] >>> 24); - out[20 + outpos] = ((in[5 + inpos] >>> 0) & 255); - out[21 + outpos] = ((in[5 + inpos] >>> 8) & 255); - out[22 + outpos] = ((in[5 + inpos] >>> 16) & 255); - out[23 + outpos] = (in[5 + inpos] >>> 24); - out[24 + outpos] = ((in[6 + inpos] >>> 0) & 255); - out[25 + outpos] = ((in[6 + inpos] >>> 8) & 255); - out[26 + outpos] = ((in[6 + inpos] >>> 16) & 255); - out[27 + outpos] = (in[6 + inpos] >>> 24); - out[28 + outpos] = ((in[7 + inpos] >>> 0) & 255); - out[29 + outpos] = ((in[7 + inpos] >>> 8) & 255); - out[30 + outpos] = ((in[7 + inpos] >>> 16) & 255); - out[31 + outpos] = (in[7 + inpos] >>> 24); + out[0 + outpos] = in[0 + inpos] | ((in[1 + inpos]) << 9) + | ((in[2 + inpos]) << 18) | ((in[3 + inpos]) << 27); + out[1 + outpos] = ((in[3 + inpos]) >>> (9 - 4)) + | ((in[4 + inpos]) << 4) | ((in[5 + inpos]) << 13) + | ((in[6 + inpos]) << 22) | ((in[7 + inpos]) << 31); + out[2 + outpos] = ((in[7 + inpos]) >>> (9 - 8)) + | ((in[8 + inpos]) << 8) | ((in[9 + inpos]) << 17) + | ((in[10 + inpos]) << 26); + out[3 + outpos] = ((in[10 + inpos]) >>> (9 - 3)) + | ((in[11 + inpos]) << 3) | ((in[12 + inpos]) << 12) + | ((in[13 + inpos]) << 21) | ((in[14 + inpos]) << 30); + out[4 + outpos] = ((in[14 + inpos]) >>> (9 - 7)) + | ((in[15 + inpos]) << 7) | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 25); + out[5 + outpos] = ((in[17 + inpos]) >>> (9 - 2)) + | ((in[18 + inpos]) << 2) | ((in[19 + inpos]) << 11) + | ((in[20 + inpos]) << 20) | ((in[21 + inpos]) << 29); + out[6 + outpos] = ((in[21 + inpos]) >>> (9 - 6)) + | ((in[22 + inpos]) << 6) | ((in[23 + inpos]) << 15) + | ((in[24 + inpos]) << 24); + out[7 + outpos] = ((in[24 + inpos]) >>> (9 - 1)) + | ((in[25 + inpos]) << 1) | ((in[26 + inpos]) << 10) + | ((in[27 + inpos]) << 19) | ((in[28 + inpos]) << 28); + out[8 + outpos] = ((in[28 + inpos]) >>> (9 - 5)) + | ((in[29 + inpos]) << 5) | ((in[30 + inpos]) << 14) + | ((in[31 + inpos]) << 23); } - protected static void fastunpack9(final int[] in, int inpos, + /** + * Pack the 32 integers + * + * @param in + * source array + * @param inpos + * starting point in the source array + * @param out + * output array + * @param outpos + * starting point in the output array + * @param bit + * how many bits to use per integer + */ + public static void fastunpack(final int[] in, final int inpos, + final int[] out, final int outpos, final int bit) { + switch (bit) { + case 0: + fastunpack0(in, inpos, out, outpos); + break; + case 1: + fastunpack1(in, inpos, out, outpos); + break; + case 2: + fastunpack2(in, inpos, out, outpos); + break; + case 3: + fastunpack3(in, inpos, out, outpos); + break; + case 4: + fastunpack4(in, inpos, out, outpos); + break; + case 5: + fastunpack5(in, inpos, out, outpos); + break; + case 6: + fastunpack6(in, inpos, out, outpos); + break; + case 7: + fastunpack7(in, inpos, out, outpos); + break; + case 8: + fastunpack8(in, inpos, out, outpos); + break; + case 9: + fastunpack9(in, inpos, out, outpos); + break; + case 10: + fastunpack10(in, inpos, out, outpos); + break; + case 11: + fastunpack11(in, inpos, out, outpos); + break; + case 12: + fastunpack12(in, inpos, out, outpos); + break; + case 13: + fastunpack13(in, inpos, out, outpos); + break; + case 14: + fastunpack14(in, inpos, out, outpos); + break; + case 15: + fastunpack15(in, inpos, out, outpos); + break; + case 16: + fastunpack16(in, inpos, out, outpos); + break; + case 17: + fastunpack17(in, inpos, out, outpos); + break; + case 18: + fastunpack18(in, inpos, out, outpos); + break; + case 19: + fastunpack19(in, inpos, out, outpos); + break; + case 20: + fastunpack20(in, inpos, out, outpos); + break; + case 21: + fastunpack21(in, inpos, out, outpos); + break; + case 22: + fastunpack22(in, inpos, out, outpos); + break; + case 23: + fastunpack23(in, inpos, out, outpos); + break; + case 24: + fastunpack24(in, inpos, out, outpos); + break; + case 25: + fastunpack25(in, inpos, out, outpos); + break; + case 26: + fastunpack26(in, inpos, out, outpos); + break; + case 27: + fastunpack27(in, inpos, out, outpos); + break; + case 28: + fastunpack28(in, inpos, out, outpos); + break; + case 29: + fastunpack29(in, inpos, out, outpos); + break; + case 30: + fastunpack30(in, inpos, out, outpos); + break; + case 31: + fastunpack31(in, inpos, out, outpos); + break; + case 32: + fastunpack32(in, inpos, out, outpos); + break; + default: + throw new IllegalArgumentException( + "Unsupported bit width."); + } + } + + protected static void fastunpack0(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 511); - out[1 + outpos] = ((in[0 + inpos] >>> 9) & 511); - out[2 + outpos] = ((in[0 + inpos] >>> 18) & 511); - out[3 + outpos] = (in[0 + inpos] >>> 27) - | ((in[1 + inpos] & 15) << (9 - 4)); - out[4 + outpos] = ((in[1 + inpos] >>> 4) & 511); - out[5 + outpos] = ((in[1 + inpos] >>> 13) & 511); - out[6 + outpos] = ((in[1 + inpos] >>> 22) & 511); - out[7 + outpos] = (in[1 + inpos] >>> 31) - | ((in[2 + inpos] & 255) << (9 - 8)); - out[8 + outpos] = ((in[2 + inpos] >>> 8) & 511); - out[9 + outpos] = ((in[2 + inpos] >>> 17) & 511); - out[10 + outpos] = (in[2 + inpos] >>> 26) - | ((in[3 + inpos] & 7) << (9 - 3)); - out[11 + outpos] = ((in[3 + inpos] >>> 3) & 511); - out[12 + outpos] = ((in[3 + inpos] >>> 12) & 511); - out[13 + outpos] = ((in[3 + inpos] >>> 21) & 511); - out[14 + outpos] = (in[3 + inpos] >>> 30) - | ((in[4 + inpos] & 127) << (9 - 7)); - out[15 + outpos] = ((in[4 + inpos] >>> 7) & 511); - out[16 + outpos] = ((in[4 + inpos] >>> 16) & 511); - out[17 + outpos] = (in[4 + inpos] >>> 25) - | ((in[5 + inpos] & 3) << (9 - 2)); - out[18 + outpos] = ((in[5 + inpos] >>> 2) & 511); - out[19 + outpos] = ((in[5 + inpos] >>> 11) & 511); - out[20 + outpos] = ((in[5 + inpos] >>> 20) & 511); - out[21 + outpos] = (in[5 + inpos] >>> 29) - | ((in[6 + inpos] & 63) << (9 - 6)); - out[22 + outpos] = ((in[6 + inpos] >>> 6) & 511); - out[23 + outpos] = ((in[6 + inpos] >>> 15) & 511); - out[24 + outpos] = (in[6 + inpos] >>> 24) - | ((in[7 + inpos] & 1) << (9 - 1)); - out[25 + outpos] = ((in[7 + inpos] >>> 1) & 511); - out[26 + outpos] = ((in[7 + inpos] >>> 10) & 511); - out[27 + outpos] = ((in[7 + inpos] >>> 19) & 511); - out[28 + outpos] = (in[7 + inpos] >>> 28) - | ((in[8 + inpos] & 31) << (9 - 5)); - out[29 + outpos] = ((in[8 + inpos] >>> 5) & 511); - out[30 + outpos] = ((in[8 + inpos] >>> 14) & 511); - out[31 + outpos] = (in[8 + inpos] >>> 23); + Arrays.fill(out, outpos, outpos + 32, 0); + } + + protected static void fastunpack1(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 1); + out[1 + outpos] = ((in[0 + inpos] >>> 1) & 1); + out[2 + outpos] = ((in[0 + inpos] >>> 2) & 1); + out[3 + outpos] = ((in[0 + inpos] >>> 3) & 1); + out[4 + outpos] = ((in[0 + inpos] >>> 4) & 1); + out[5 + outpos] = ((in[0 + inpos] >>> 5) & 1); + out[6 + outpos] = ((in[0 + inpos] >>> 6) & 1); + out[7 + outpos] = ((in[0 + inpos] >>> 7) & 1); + out[8 + outpos] = ((in[0 + inpos] >>> 8) & 1); + out[9 + outpos] = ((in[0 + inpos] >>> 9) & 1); + out[10 + outpos] = ((in[0 + inpos] >>> 10) & 1); + out[11 + outpos] = ((in[0 + inpos] >>> 11) & 1); + out[12 + outpos] = ((in[0 + inpos] >>> 12) & 1); + out[13 + outpos] = ((in[0 + inpos] >>> 13) & 1); + out[14 + outpos] = ((in[0 + inpos] >>> 14) & 1); + out[15 + outpos] = ((in[0 + inpos] >>> 15) & 1); + out[16 + outpos] = ((in[0 + inpos] >>> 16) & 1); + out[17 + outpos] = ((in[0 + inpos] >>> 17) & 1); + out[18 + outpos] = ((in[0 + inpos] >>> 18) & 1); + out[19 + outpos] = ((in[0 + inpos] >>> 19) & 1); + out[20 + outpos] = ((in[0 + inpos] >>> 20) & 1); + out[21 + outpos] = ((in[0 + inpos] >>> 21) & 1); + out[22 + outpos] = ((in[0 + inpos] >>> 22) & 1); + out[23 + outpos] = ((in[0 + inpos] >>> 23) & 1); + out[24 + outpos] = ((in[0 + inpos] >>> 24) & 1); + out[25 + outpos] = ((in[0 + inpos] >>> 25) & 1); + out[26 + outpos] = ((in[0 + inpos] >>> 26) & 1); + out[27 + outpos] = ((in[0 + inpos] >>> 27) & 1); + out[28 + outpos] = ((in[0 + inpos] >>> 28) & 1); + out[29 + outpos] = ((in[0 + inpos] >>> 29) & 1); + out[30 + outpos] = ((in[0 + inpos] >>> 30) & 1); + out[31 + outpos] = (in[0 + inpos] >>> 31); } protected static void fastunpack10(final int[] in, int inpos, @@ -3554,9 +3648,45 @@ protected static void fastunpack19(final int[] in, int inpos, out[31 + outpos] = (in[18 + inpos] >>> 13); } - protected static void fastunpack20(final int[] in, int inpos, + protected static void fastunpack2(final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = ((in[0 + inpos] >>> 0) & 1048575); + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 3); + out[1 + outpos] = ((in[0 + inpos] >>> 2) & 3); + out[2 + outpos] = ((in[0 + inpos] >>> 4) & 3); + out[3 + outpos] = ((in[0 + inpos] >>> 6) & 3); + out[4 + outpos] = ((in[0 + inpos] >>> 8) & 3); + out[5 + outpos] = ((in[0 + inpos] >>> 10) & 3); + out[6 + outpos] = ((in[0 + inpos] >>> 12) & 3); + out[7 + outpos] = ((in[0 + inpos] >>> 14) & 3); + out[8 + outpos] = ((in[0 + inpos] >>> 16) & 3); + out[9 + outpos] = ((in[0 + inpos] >>> 18) & 3); + out[10 + outpos] = ((in[0 + inpos] >>> 20) & 3); + out[11 + outpos] = ((in[0 + inpos] >>> 22) & 3); + out[12 + outpos] = ((in[0 + inpos] >>> 24) & 3); + out[13 + outpos] = ((in[0 + inpos] >>> 26) & 3); + out[14 + outpos] = ((in[0 + inpos] >>> 28) & 3); + out[15 + outpos] = (in[0 + inpos] >>> 30); + out[16 + outpos] = ((in[1 + inpos] >>> 0) & 3); + out[17 + outpos] = ((in[1 + inpos] >>> 2) & 3); + out[18 + outpos] = ((in[1 + inpos] >>> 4) & 3); + out[19 + outpos] = ((in[1 + inpos] >>> 6) & 3); + out[20 + outpos] = ((in[1 + inpos] >>> 8) & 3); + out[21 + outpos] = ((in[1 + inpos] >>> 10) & 3); + out[22 + outpos] = ((in[1 + inpos] >>> 12) & 3); + out[23 + outpos] = ((in[1 + inpos] >>> 14) & 3); + out[24 + outpos] = ((in[1 + inpos] >>> 16) & 3); + out[25 + outpos] = ((in[1 + inpos] >>> 18) & 3); + out[26 + outpos] = ((in[1 + inpos] >>> 20) & 3); + out[27 + outpos] = ((in[1 + inpos] >>> 22) & 3); + out[28 + outpos] = ((in[1 + inpos] >>> 24) & 3); + out[29 + outpos] = ((in[1 + inpos] >>> 26) & 3); + out[30 + outpos] = ((in[1 + inpos] >>> 28) & 3); + out[31 + outpos] = (in[1 + inpos] >>> 30); + } + + protected static void fastunpack20(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 1048575); out[1 + outpos] = (in[0 + inpos] >>> 20) | ((in[1 + inpos] & 255) << (20 - 8)); out[2 + outpos] = ((in[1 + inpos] >>> 8) & 1048575); @@ -4134,6 +4264,44 @@ protected static void fastunpack29(final int[] in, int inpos, out[31 + outpos] = (in[28 + inpos] >>> 3); } + protected static void fastunpack3(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 7); + out[1 + outpos] = ((in[0 + inpos] >>> 3) & 7); + out[2 + outpos] = ((in[0 + inpos] >>> 6) & 7); + out[3 + outpos] = ((in[0 + inpos] >>> 9) & 7); + out[4 + outpos] = ((in[0 + inpos] >>> 12) & 7); + out[5 + outpos] = ((in[0 + inpos] >>> 15) & 7); + out[6 + outpos] = ((in[0 + inpos] >>> 18) & 7); + out[7 + outpos] = ((in[0 + inpos] >>> 21) & 7); + out[8 + outpos] = ((in[0 + inpos] >>> 24) & 7); + out[9 + outpos] = ((in[0 + inpos] >>> 27) & 7); + out[10 + outpos] = (in[0 + inpos] >>> 30) + | ((in[1 + inpos] & 1) << (3 - 1)); + out[11 + outpos] = ((in[1 + inpos] >>> 1) & 7); + out[12 + outpos] = ((in[1 + inpos] >>> 4) & 7); + out[13 + outpos] = ((in[1 + inpos] >>> 7) & 7); + out[14 + outpos] = ((in[1 + inpos] >>> 10) & 7); + out[15 + outpos] = ((in[1 + inpos] >>> 13) & 7); + out[16 + outpos] = ((in[1 + inpos] >>> 16) & 7); + out[17 + outpos] = ((in[1 + inpos] >>> 19) & 7); + out[18 + outpos] = ((in[1 + inpos] >>> 22) & 7); + out[19 + outpos] = ((in[1 + inpos] >>> 25) & 7); + out[20 + outpos] = ((in[1 + inpos] >>> 28) & 7); + out[21 + outpos] = (in[1 + inpos] >>> 31) + | ((in[2 + inpos] & 3) << (3 - 2)); + out[22 + outpos] = ((in[2 + inpos] >>> 2) & 7); + out[23 + outpos] = ((in[2 + inpos] >>> 5) & 7); + out[24 + outpos] = ((in[2 + inpos] >>> 8) & 7); + out[25 + outpos] = ((in[2 + inpos] >>> 11) & 7); + out[26 + outpos] = ((in[2 + inpos] >>> 14) & 7); + out[27 + outpos] = ((in[2 + inpos] >>> 17) & 7); + out[28 + outpos] = ((in[2 + inpos] >>> 20) & 7); + out[29 + outpos] = ((in[2 + inpos] >>> 23) & 7); + out[30 + outpos] = ((in[2 + inpos] >>> 26) & 7); + out[31 + outpos] = (in[2 + inpos] >>> 29); + } + protected static void fastunpack30(final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = ((in[0 + inpos] >>> 0) & 1073741823); @@ -4269,402 +4437,242 @@ protected static void fastunpack32(final int[] in, int inpos, System.arraycopy(in, inpos, out, outpos, 32); } - protected static void fastpack32(final int[] in, int inpos, + protected static void fastunpack4(final int[] in, int inpos, final int[] out, int outpos) { - System.arraycopy(in, inpos, out, outpos, 32); + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 15); + out[1 + outpos] = ((in[0 + inpos] >>> 4) & 15); + out[2 + outpos] = ((in[0 + inpos] >>> 8) & 15); + out[3 + outpos] = ((in[0 + inpos] >>> 12) & 15); + out[4 + outpos] = ((in[0 + inpos] >>> 16) & 15); + out[5 + outpos] = ((in[0 + inpos] >>> 20) & 15); + out[6 + outpos] = ((in[0 + inpos] >>> 24) & 15); + out[7 + outpos] = (in[0 + inpos] >>> 28); + out[8 + outpos] = ((in[1 + inpos] >>> 0) & 15); + out[9 + outpos] = ((in[1 + inpos] >>> 4) & 15); + out[10 + outpos] = ((in[1 + inpos] >>> 8) & 15); + out[11 + outpos] = ((in[1 + inpos] >>> 12) & 15); + out[12 + outpos] = ((in[1 + inpos] >>> 16) & 15); + out[13 + outpos] = ((in[1 + inpos] >>> 20) & 15); + out[14 + outpos] = ((in[1 + inpos] >>> 24) & 15); + out[15 + outpos] = (in[1 + inpos] >>> 28); + out[16 + outpos] = ((in[2 + inpos] >>> 0) & 15); + out[17 + outpos] = ((in[2 + inpos] >>> 4) & 15); + out[18 + outpos] = ((in[2 + inpos] >>> 8) & 15); + out[19 + outpos] = ((in[2 + inpos] >>> 12) & 15); + out[20 + outpos] = ((in[2 + inpos] >>> 16) & 15); + out[21 + outpos] = ((in[2 + inpos] >>> 20) & 15); + out[22 + outpos] = ((in[2 + inpos] >>> 24) & 15); + out[23 + outpos] = (in[2 + inpos] >>> 28); + out[24 + outpos] = ((in[3 + inpos] >>> 0) & 15); + out[25 + outpos] = ((in[3 + inpos] >>> 4) & 15); + out[26 + outpos] = ((in[3 + inpos] >>> 8) & 15); + out[27 + outpos] = ((in[3 + inpos] >>> 12) & 15); + out[28 + outpos] = ((in[3 + inpos] >>> 16) & 15); + out[29 + outpos] = ((in[3 + inpos] >>> 20) & 15); + out[30 + outpos] = ((in[3 + inpos] >>> 24) & 15); + out[31 + outpos] = (in[3 + inpos] >>> 28); } - protected static void fastpackwithoutmask32(final int[] in, int inpos, + protected static void fastunpack5(final int[] in, int inpos, final int[] out, int outpos) { - System.arraycopy(in, inpos, out, outpos, 32); + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 31); + out[1 + outpos] = ((in[0 + inpos] >>> 5) & 31); + out[2 + outpos] = ((in[0 + inpos] >>> 10) & 31); + out[3 + outpos] = ((in[0 + inpos] >>> 15) & 31); + out[4 + outpos] = ((in[0 + inpos] >>> 20) & 31); + out[5 + outpos] = ((in[0 + inpos] >>> 25) & 31); + out[6 + outpos] = (in[0 + inpos] >>> 30) + | ((in[1 + inpos] & 7) << (5 - 3)); + out[7 + outpos] = ((in[1 + inpos] >>> 3) & 31); + out[8 + outpos] = ((in[1 + inpos] >>> 8) & 31); + out[9 + outpos] = ((in[1 + inpos] >>> 13) & 31); + out[10 + outpos] = ((in[1 + inpos] >>> 18) & 31); + out[11 + outpos] = ((in[1 + inpos] >>> 23) & 31); + out[12 + outpos] = (in[1 + inpos] >>> 28) + | ((in[2 + inpos] & 1) << (5 - 1)); + out[13 + outpos] = ((in[2 + inpos] >>> 1) & 31); + out[14 + outpos] = ((in[2 + inpos] >>> 6) & 31); + out[15 + outpos] = ((in[2 + inpos] >>> 11) & 31); + out[16 + outpos] = ((in[2 + inpos] >>> 16) & 31); + out[17 + outpos] = ((in[2 + inpos] >>> 21) & 31); + out[18 + outpos] = ((in[2 + inpos] >>> 26) & 31); + out[19 + outpos] = (in[2 + inpos] >>> 31) + | ((in[3 + inpos] & 15) << (5 - 4)); + out[20 + outpos] = ((in[3 + inpos] >>> 4) & 31); + out[21 + outpos] = ((in[3 + inpos] >>> 9) & 31); + out[22 + outpos] = ((in[3 + inpos] >>> 14) & 31); + out[23 + outpos] = ((in[3 + inpos] >>> 19) & 31); + out[24 + outpos] = ((in[3 + inpos] >>> 24) & 31); + out[25 + outpos] = (in[3 + inpos] >>> 29) + | ((in[4 + inpos] & 3) << (5 - 2)); + out[26 + outpos] = ((in[4 + inpos] >>> 2) & 31); + out[27 + outpos] = ((in[4 + inpos] >>> 7) & 31); + out[28 + outpos] = ((in[4 + inpos] >>> 12) & 31); + out[29 + outpos] = ((in[4 + inpos] >>> 17) & 31); + out[30 + outpos] = ((in[4 + inpos] >>> 22) & 31); + out[31 + outpos] = (in[4 + inpos] >>> 27); } - protected static void fastunpack0(final int[] in, int inpos, + protected static void fastunpack6(final int[] in, int inpos, final int[] out, int outpos) { - Arrays.fill(out, outpos, outpos + 32, 0); + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 63); + out[1 + outpos] = ((in[0 + inpos] >>> 6) & 63); + out[2 + outpos] = ((in[0 + inpos] >>> 12) & 63); + out[3 + outpos] = ((in[0 + inpos] >>> 18) & 63); + out[4 + outpos] = ((in[0 + inpos] >>> 24) & 63); + out[5 + outpos] = (in[0 + inpos] >>> 30) + | ((in[1 + inpos] & 15) << (6 - 4)); + out[6 + outpos] = ((in[1 + inpos] >>> 4) & 63); + out[7 + outpos] = ((in[1 + inpos] >>> 10) & 63); + out[8 + outpos] = ((in[1 + inpos] >>> 16) & 63); + out[9 + outpos] = ((in[1 + inpos] >>> 22) & 63); + out[10 + outpos] = (in[1 + inpos] >>> 28) + | ((in[2 + inpos] & 3) << (6 - 2)); + out[11 + outpos] = ((in[2 + inpos] >>> 2) & 63); + out[12 + outpos] = ((in[2 + inpos] >>> 8) & 63); + out[13 + outpos] = ((in[2 + inpos] >>> 14) & 63); + out[14 + outpos] = ((in[2 + inpos] >>> 20) & 63); + out[15 + outpos] = (in[2 + inpos] >>> 26); + out[16 + outpos] = ((in[3 + inpos] >>> 0) & 63); + out[17 + outpos] = ((in[3 + inpos] >>> 6) & 63); + out[18 + outpos] = ((in[3 + inpos] >>> 12) & 63); + out[19 + outpos] = ((in[3 + inpos] >>> 18) & 63); + out[20 + outpos] = ((in[3 + inpos] >>> 24) & 63); + out[21 + outpos] = (in[3 + inpos] >>> 30) + | ((in[4 + inpos] & 15) << (6 - 4)); + out[22 + outpos] = ((in[4 + inpos] >>> 4) & 63); + out[23 + outpos] = ((in[4 + inpos] >>> 10) & 63); + out[24 + outpos] = ((in[4 + inpos] >>> 16) & 63); + out[25 + outpos] = ((in[4 + inpos] >>> 22) & 63); + out[26 + outpos] = (in[4 + inpos] >>> 28) + | ((in[5 + inpos] & 3) << (6 - 2)); + out[27 + outpos] = ((in[5 + inpos] >>> 2) & 63); + out[28 + outpos] = ((in[5 + inpos] >>> 8) & 63); + out[29 + outpos] = ((in[5 + inpos] >>> 14) & 63); + out[30 + outpos] = ((in[5 + inpos] >>> 20) & 63); + out[31 + outpos] = (in[5 + inpos] >>> 26); } - protected static void fastpack0(final int[] in, int inpos, + protected static void fastunpack7(final int[] in, int inpos, final int[] out, int outpos) { - // nothing + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 127); + out[1 + outpos] = ((in[0 + inpos] >>> 7) & 127); + out[2 + outpos] = ((in[0 + inpos] >>> 14) & 127); + out[3 + outpos] = ((in[0 + inpos] >>> 21) & 127); + out[4 + outpos] = (in[0 + inpos] >>> 28) + | ((in[1 + inpos] & 7) << (7 - 3)); + out[5 + outpos] = ((in[1 + inpos] >>> 3) & 127); + out[6 + outpos] = ((in[1 + inpos] >>> 10) & 127); + out[7 + outpos] = ((in[1 + inpos] >>> 17) & 127); + out[8 + outpos] = ((in[1 + inpos] >>> 24) & 127); + out[9 + outpos] = (in[1 + inpos] >>> 31) + | ((in[2 + inpos] & 63) << (7 - 6)); + out[10 + outpos] = ((in[2 + inpos] >>> 6) & 127); + out[11 + outpos] = ((in[2 + inpos] >>> 13) & 127); + out[12 + outpos] = ((in[2 + inpos] >>> 20) & 127); + out[13 + outpos] = (in[2 + inpos] >>> 27) + | ((in[3 + inpos] & 3) << (7 - 2)); + out[14 + outpos] = ((in[3 + inpos] >>> 2) & 127); + out[15 + outpos] = ((in[3 + inpos] >>> 9) & 127); + out[16 + outpos] = ((in[3 + inpos] >>> 16) & 127); + out[17 + outpos] = ((in[3 + inpos] >>> 23) & 127); + out[18 + outpos] = (in[3 + inpos] >>> 30) + | ((in[4 + inpos] & 31) << (7 - 5)); + out[19 + outpos] = ((in[4 + inpos] >>> 5) & 127); + out[20 + outpos] = ((in[4 + inpos] >>> 12) & 127); + out[21 + outpos] = ((in[4 + inpos] >>> 19) & 127); + out[22 + outpos] = (in[4 + inpos] >>> 26) + | ((in[5 + inpos] & 1) << (7 - 1)); + out[23 + outpos] = ((in[5 + inpos] >>> 1) & 127); + out[24 + outpos] = ((in[5 + inpos] >>> 8) & 127); + out[25 + outpos] = ((in[5 + inpos] >>> 15) & 127); + out[26 + outpos] = ((in[5 + inpos] >>> 22) & 127); + out[27 + outpos] = (in[5 + inpos] >>> 29) + | ((in[6 + inpos] & 15) << (7 - 4)); + out[28 + outpos] = ((in[6 + inpos] >>> 4) & 127); + out[29 + outpos] = ((in[6 + inpos] >>> 11) & 127); + out[30 + outpos] = ((in[6 + inpos] >>> 18) & 127); + out[31 + outpos] = (in[6 + inpos] >>> 25); } - protected static void fastpackwithoutmask0(final int[] in, int inpos, + protected static void fastunpack8(final int[] in, int inpos, final int[] out, int outpos) { - // nothing - } - - /** - * Pack the 32 integers - * - * @param in - * source array - * @param inpos - * starting point in the source array - * @param out - * output array - * @param outpos - * starting point in the output array - * @param bit - * how many bits to use per integer - */ - public static void fastunpack(final int[] in, final int inpos, - final int[] out, final int outpos, final int bit) { - switch (bit) { - case 0: - fastunpack0(in, inpos, out, outpos); - break; - case 1: - fastunpack1(in, inpos, out, outpos); - break; - case 2: - fastunpack2(in, inpos, out, outpos); - break; - case 3: - fastunpack3(in, inpos, out, outpos); - break; - case 4: - fastunpack4(in, inpos, out, outpos); - break; - case 5: - fastunpack5(in, inpos, out, outpos); - break; - case 6: - fastunpack6(in, inpos, out, outpos); - break; - case 7: - fastunpack7(in, inpos, out, outpos); - break; - case 8: - fastunpack8(in, inpos, out, outpos); - break; - case 9: - fastunpack9(in, inpos, out, outpos); - break; - case 10: - fastunpack10(in, inpos, out, outpos); - break; - case 11: - fastunpack11(in, inpos, out, outpos); - break; - case 12: - fastunpack12(in, inpos, out, outpos); - break; - case 13: - fastunpack13(in, inpos, out, outpos); - break; - case 14: - fastunpack14(in, inpos, out, outpos); - break; - case 15: - fastunpack15(in, inpos, out, outpos); - break; - case 16: - fastunpack16(in, inpos, out, outpos); - break; - case 17: - fastunpack17(in, inpos, out, outpos); - break; - case 18: - fastunpack18(in, inpos, out, outpos); - break; - case 19: - fastunpack19(in, inpos, out, outpos); - break; - case 20: - fastunpack20(in, inpos, out, outpos); - break; - case 21: - fastunpack21(in, inpos, out, outpos); - break; - case 22: - fastunpack22(in, inpos, out, outpos); - break; - case 23: - fastunpack23(in, inpos, out, outpos); - break; - case 24: - fastunpack24(in, inpos, out, outpos); - break; - case 25: - fastunpack25(in, inpos, out, outpos); - break; - case 26: - fastunpack26(in, inpos, out, outpos); - break; - case 27: - fastunpack27(in, inpos, out, outpos); - break; - case 28: - fastunpack28(in, inpos, out, outpos); - break; - case 29: - fastunpack29(in, inpos, out, outpos); - break; - case 30: - fastunpack30(in, inpos, out, outpos); - break; - case 31: - fastunpack31(in, inpos, out, outpos); - break; - case 32: - fastunpack32(in, inpos, out, outpos); - break; - default: - throw new IllegalArgumentException( - "Unsupported bit width."); - } - } - - /** - * Pack 32 integers - * - * @param in - * source array - * @param inpos - * position in source array - * @param out - * output array - * @param outpos - * position in output array - * @param bit - * number of bits to use per integer - */ - public static void fastpack(final int[] in, final int inpos, - final int[] out, final int outpos, final int bit) { - switch (bit) { - case 0: - fastpack0(in, inpos, out, outpos); - break; - case 1: - fastpack1(in, inpos, out, outpos); - break; - case 2: - fastpack2(in, inpos, out, outpos); - break; - case 3: - fastpack3(in, inpos, out, outpos); - break; - case 4: - fastpack4(in, inpos, out, outpos); - break; - case 5: - fastpack5(in, inpos, out, outpos); - break; - case 6: - fastpack6(in, inpos, out, outpos); - break; - case 7: - fastpack7(in, inpos, out, outpos); - break; - case 8: - fastpack8(in, inpos, out, outpos); - break; - case 9: - fastpack9(in, inpos, out, outpos); - break; - case 10: - fastpack10(in, inpos, out, outpos); - break; - case 11: - fastpack11(in, inpos, out, outpos); - break; - case 12: - fastpack12(in, inpos, out, outpos); - break; - case 13: - fastpack13(in, inpos, out, outpos); - break; - case 14: - fastpack14(in, inpos, out, outpos); - break; - case 15: - fastpack15(in, inpos, out, outpos); - break; - case 16: - fastpack16(in, inpos, out, outpos); - break; - case 17: - fastpack17(in, inpos, out, outpos); - break; - case 18: - fastpack18(in, inpos, out, outpos); - break; - case 19: - fastpack19(in, inpos, out, outpos); - break; - case 20: - fastpack20(in, inpos, out, outpos); - break; - case 21: - fastpack21(in, inpos, out, outpos); - break; - case 22: - fastpack22(in, inpos, out, outpos); - break; - case 23: - fastpack23(in, inpos, out, outpos); - break; - case 24: - fastpack24(in, inpos, out, outpos); - break; - case 25: - fastpack25(in, inpos, out, outpos); - break; - case 26: - fastpack26(in, inpos, out, outpos); - break; - case 27: - fastpack27(in, inpos, out, outpos); - break; - case 28: - fastpack28(in, inpos, out, outpos); - break; - case 29: - fastpack29(in, inpos, out, outpos); - break; - case 30: - fastpack30(in, inpos, out, outpos); - break; - case 31: - fastpack31(in, inpos, out, outpos); - break; - case 32: - fastpack32(in, inpos, out, outpos); - break; - default: - throw new IllegalArgumentException( - "Unsupported bit width."); - /** - * @param in - * @param inpos - * @param out - * @param outpos - * @param bit - */ - } + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 255); + out[1 + outpos] = ((in[0 + inpos] >>> 8) & 255); + out[2 + outpos] = ((in[0 + inpos] >>> 16) & 255); + out[3 + outpos] = (in[0 + inpos] >>> 24); + out[4 + outpos] = ((in[1 + inpos] >>> 0) & 255); + out[5 + outpos] = ((in[1 + inpos] >>> 8) & 255); + out[6 + outpos] = ((in[1 + inpos] >>> 16) & 255); + out[7 + outpos] = (in[1 + inpos] >>> 24); + out[8 + outpos] = ((in[2 + inpos] >>> 0) & 255); + out[9 + outpos] = ((in[2 + inpos] >>> 8) & 255); + out[10 + outpos] = ((in[2 + inpos] >>> 16) & 255); + out[11 + outpos] = (in[2 + inpos] >>> 24); + out[12 + outpos] = ((in[3 + inpos] >>> 0) & 255); + out[13 + outpos] = ((in[3 + inpos] >>> 8) & 255); + out[14 + outpos] = ((in[3 + inpos] >>> 16) & 255); + out[15 + outpos] = (in[3 + inpos] >>> 24); + out[16 + outpos] = ((in[4 + inpos] >>> 0) & 255); + out[17 + outpos] = ((in[4 + inpos] >>> 8) & 255); + out[18 + outpos] = ((in[4 + inpos] >>> 16) & 255); + out[19 + outpos] = (in[4 + inpos] >>> 24); + out[20 + outpos] = ((in[5 + inpos] >>> 0) & 255); + out[21 + outpos] = ((in[5 + inpos] >>> 8) & 255); + out[22 + outpos] = ((in[5 + inpos] >>> 16) & 255); + out[23 + outpos] = (in[5 + inpos] >>> 24); + out[24 + outpos] = ((in[6 + inpos] >>> 0) & 255); + out[25 + outpos] = ((in[6 + inpos] >>> 8) & 255); + out[26 + outpos] = ((in[6 + inpos] >>> 16) & 255); + out[27 + outpos] = (in[6 + inpos] >>> 24); + out[28 + outpos] = ((in[7 + inpos] >>> 0) & 255); + out[29 + outpos] = ((in[7 + inpos] >>> 8) & 255); + out[30 + outpos] = ((in[7 + inpos] >>> 16) & 255); + out[31 + outpos] = (in[7 + inpos] >>> 24); } - /** - * Unpack 32 integers - * - * @param in - * source array - * @param inpos - * position in source array - * @param out - * output array - * @param outpos - * position in output array - * @param bit - * number of bits to use per integer - */ - public static void fastpackwithoutmask(final int[] in, final int inpos, - final int[] out, final int outpos, final int bit) { - switch (bit) { - case 0: - fastpackwithoutmask0(in, inpos, out, outpos); - break; - case 1: - fastpackwithoutmask1(in, inpos, out, outpos); - break; - case 2: - fastpackwithoutmask2(in, inpos, out, outpos); - break; - case 3: - fastpackwithoutmask3(in, inpos, out, outpos); - break; - case 4: - fastpackwithoutmask4(in, inpos, out, outpos); - break; - case 5: - fastpackwithoutmask5(in, inpos, out, outpos); - break; - case 6: - fastpackwithoutmask6(in, inpos, out, outpos); - break; - case 7: - fastpackwithoutmask7(in, inpos, out, outpos); - break; - case 8: - fastpackwithoutmask8(in, inpos, out, outpos); - break; - case 9: - fastpackwithoutmask9(in, inpos, out, outpos); - break; - case 10: - fastpackwithoutmask10(in, inpos, out, outpos); - break; - case 11: - fastpackwithoutmask11(in, inpos, out, outpos); - break; - case 12: - fastpackwithoutmask12(in, inpos, out, outpos); - break; - case 13: - fastpackwithoutmask13(in, inpos, out, outpos); - break; - case 14: - fastpackwithoutmask14(in, inpos, out, outpos); - break; - case 15: - fastpackwithoutmask15(in, inpos, out, outpos); - break; - case 16: - fastpackwithoutmask16(in, inpos, out, outpos); - break; - case 17: - fastpackwithoutmask17(in, inpos, out, outpos); - break; - case 18: - fastpackwithoutmask18(in, inpos, out, outpos); - break; - case 19: - fastpackwithoutmask19(in, inpos, out, outpos); - break; - case 20: - fastpackwithoutmask20(in, inpos, out, outpos); - break; - case 21: - fastpackwithoutmask21(in, inpos, out, outpos); - break; - case 22: - fastpackwithoutmask22(in, inpos, out, outpos); - break; - case 23: - fastpackwithoutmask23(in, inpos, out, outpos); - break; - case 24: - fastpackwithoutmask24(in, inpos, out, outpos); - break; - case 25: - fastpackwithoutmask25(in, inpos, out, outpos); - break; - case 26: - fastpackwithoutmask26(in, inpos, out, outpos); - break; - case 27: - fastpackwithoutmask27(in, inpos, out, outpos); - break; - case 28: - fastpackwithoutmask28(in, inpos, out, outpos); - break; - case 29: - fastpackwithoutmask29(in, inpos, out, outpos); - break; - case 30: - fastpackwithoutmask30(in, inpos, out, outpos); - break; - case 31: - fastpackwithoutmask31(in, inpos, out, outpos); - break; - case 32: - fastpackwithoutmask32(in, inpos, out, outpos); - break; - default: - throw new IllegalArgumentException( - "Unsupported bit width."); - } + protected static void fastunpack9(final int[] in, int inpos, + final int[] out, int outpos) { + out[0 + outpos] = ((in[0 + inpos] >>> 0) & 511); + out[1 + outpos] = ((in[0 + inpos] >>> 9) & 511); + out[2 + outpos] = ((in[0 + inpos] >>> 18) & 511); + out[3 + outpos] = (in[0 + inpos] >>> 27) + | ((in[1 + inpos] & 15) << (9 - 4)); + out[4 + outpos] = ((in[1 + inpos] >>> 4) & 511); + out[5 + outpos] = ((in[1 + inpos] >>> 13) & 511); + out[6 + outpos] = ((in[1 + inpos] >>> 22) & 511); + out[7 + outpos] = (in[1 + inpos] >>> 31) + | ((in[2 + inpos] & 255) << (9 - 8)); + out[8 + outpos] = ((in[2 + inpos] >>> 8) & 511); + out[9 + outpos] = ((in[2 + inpos] >>> 17) & 511); + out[10 + outpos] = (in[2 + inpos] >>> 26) + | ((in[3 + inpos] & 7) << (9 - 3)); + out[11 + outpos] = ((in[3 + inpos] >>> 3) & 511); + out[12 + outpos] = ((in[3 + inpos] >>> 12) & 511); + out[13 + outpos] = ((in[3 + inpos] >>> 21) & 511); + out[14 + outpos] = (in[3 + inpos] >>> 30) + | ((in[4 + inpos] & 127) << (9 - 7)); + out[15 + outpos] = ((in[4 + inpos] >>> 7) & 511); + out[16 + outpos] = ((in[4 + inpos] >>> 16) & 511); + out[17 + outpos] = (in[4 + inpos] >>> 25) + | ((in[5 + inpos] & 3) << (9 - 2)); + out[18 + outpos] = ((in[5 + inpos] >>> 2) & 511); + out[19 + outpos] = ((in[5 + inpos] >>> 11) & 511); + out[20 + outpos] = ((in[5 + inpos] >>> 20) & 511); + out[21 + outpos] = (in[5 + inpos] >>> 29) + | ((in[6 + inpos] & 63) << (9 - 6)); + out[22 + outpos] = ((in[6 + inpos] >>> 6) & 511); + out[23 + outpos] = ((in[6 + inpos] >>> 15) & 511); + out[24 + outpos] = (in[6 + inpos] >>> 24) + | ((in[7 + inpos] & 1) << (9 - 1)); + out[25 + outpos] = ((in[7 + inpos] >>> 1) & 511); + out[26 + outpos] = ((in[7 + inpos] >>> 10) & 511); + out[27 + outpos] = ((in[7 + inpos] >>> 19) & 511); + out[28 + outpos] = (in[7 + inpos] >>> 28) + | ((in[8 + inpos] & 31) << (9 - 5)); + out[29 + outpos] = ((in[8 + inpos] >>> 5) & 511); + out[30 + outpos] = ((in[8 + inpos] >>> 14) & 511); + out[31 + outpos] = (in[8 + inpos] >>> 23); } } diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index a0794df..3cd6c58 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -11,9 +11,11 @@ /** * This is a patching scheme designed for speed. - * It encodes integers in blocks of 128 integers. For arrays containing - * an arbitrary number of integers, you should use it in conjunction - * with another CODEC: + * It encodes integers in blocks of 128 integers within pages of + * up to 65536 integers. Note that it is important, to get good + * compression and good performance, to use sizeable blocks (greater than 1024 integers). + * For arrays containing a number of integers that is not divisible by 128, you should use + * it in conjunction with another CODEC: * * IntegerCODEC ic = new Composition(new FastPFOR(), new VariableByte()). *

diff --git a/src/main/java/me/lemire/integercompression/IntegratedBitPacking.java b/src/main/java/me/lemire/integercompression/IntegratedBitPacking.java index 5dd2335..a0fd463 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedBitPacking.java +++ b/src/main/java/me/lemire/integercompression/IntegratedBitPacking.java @@ -13,11 +13,142 @@ * "Integrated" bit packing routines: they include both the bit packing and the * differential coding. * + * For details, please see + *

+ * Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second + * through vectorization Software: Practice & Experience + * http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract + * http://arxiv.org/abs/1209.2137 + *

+ * * @author Daniel Lemire * */ public final class IntegratedBitPacking { + /** + * Pack 32 integers as deltas with an initial value + * + * @param initoffset initial value (used to compute first delta) + * @param in input array + * @param inpos initial position in input array + * @param out output array + * @param outpos initial position in output array + * @param bit number of bits to use per integer + */ + public static void integratedpack(final int initoffset, final int[] in, + final int inpos, final int[] out, final int outpos, final int bit) { + switch (bit) { + case 0: + integratedpack0(initoffset, in, inpos, out, outpos); + break; + case 1: + integratedpack1(initoffset, in, inpos, out, outpos); + break; + case 2: + integratedpack2(initoffset, in, inpos, out, outpos); + break; + case 3: + integratedpack3(initoffset, in, inpos, out, outpos); + break; + case 4: + integratedpack4(initoffset, in, inpos, out, outpos); + break; + case 5: + integratedpack5(initoffset, in, inpos, out, outpos); + break; + case 6: + integratedpack6(initoffset, in, inpos, out, outpos); + break; + case 7: + integratedpack7(initoffset, in, inpos, out, outpos); + break; + case 8: + integratedpack8(initoffset, in, inpos, out, outpos); + break; + case 9: + integratedpack9(initoffset, in, inpos, out, outpos); + break; + case 10: + integratedpack10(initoffset, in, inpos, out, outpos); + break; + case 11: + integratedpack11(initoffset, in, inpos, out, outpos); + break; + case 12: + integratedpack12(initoffset, in, inpos, out, outpos); + break; + case 13: + integratedpack13(initoffset, in, inpos, out, outpos); + break; + case 14: + integratedpack14(initoffset, in, inpos, out, outpos); + break; + case 15: + integratedpack15(initoffset, in, inpos, out, outpos); + break; + case 16: + integratedpack16(initoffset, in, inpos, out, outpos); + break; + case 17: + integratedpack17(initoffset, in, inpos, out, outpos); + break; + case 18: + integratedpack18(initoffset, in, inpos, out, outpos); + break; + case 19: + integratedpack19(initoffset, in, inpos, out, outpos); + break; + case 20: + integratedpack20(initoffset, in, inpos, out, outpos); + break; + case 21: + integratedpack21(initoffset, in, inpos, out, outpos); + break; + case 22: + integratedpack22(initoffset, in, inpos, out, outpos); + break; + case 23: + integratedpack23(initoffset, in, inpos, out, outpos); + break; + case 24: + integratedpack24(initoffset, in, inpos, out, outpos); + break; + case 25: + integratedpack25(initoffset, in, inpos, out, outpos); + break; + case 26: + integratedpack26(initoffset, in, inpos, out, outpos); + break; + case 27: + integratedpack27(initoffset, in, inpos, out, outpos); + break; + case 28: + integratedpack28(initoffset, in, inpos, out, outpos); + break; + case 29: + integratedpack29(initoffset, in, inpos, out, outpos); + break; + case 30: + integratedpack30(initoffset, in, inpos, out, outpos); + break; + case 31: + integratedpack31(initoffset, in, inpos, out, outpos); + break; + case 32: + integratedpack32(initoffset, in, inpos, out, outpos); + break; + default: + throw new IllegalArgumentException( + "Unsupported bit width."); + } + } + + protected static void integratedpack0(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + // nothing + } + protected static void integratedpack1(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) @@ -54,3853 +185,3730 @@ protected static void integratedpack1(final int initoffset, | ((in[31 + inpos] - in[31 + inpos - 1]) << 31); } - protected static void integratedpack2(final int initoffset, + protected static void integratedpack10(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 2) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 4) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 6) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 10) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 20) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 30); + out[1 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (10 - 8) | ((in[4 + inpos] - in[4 + inpos - 1]) << 8) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 10) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 12) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 14) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 18) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 28); + out[2 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (10 - 6) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 6) | ((in[8 + inpos] - in[8 + inpos - 1]) << 16) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 18) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 20) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 22) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 24) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 26) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 28) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 30); - out[1 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 2) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 4) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 6) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 26); + out[3 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (10 - 4) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 4) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 14) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 24); + out[4 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (10 - 2) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 2) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 12) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 22); + out[5 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 10) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 20) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 30); + out[6 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (10 - 8) | ((in[20 + inpos] - in[20 + inpos - 1]) << 8) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 10) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 12) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 14) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 18) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 28); + out[7 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (10 - 6) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 6) | ((in[24 + inpos] - in[24 + inpos - 1]) << 16) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 18) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 20) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 22) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 24) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 26) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 28) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 30); + | ((in[25 + inpos] - in[25 + inpos - 1]) << 26); + out[8 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (10 - 4) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 4) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 14) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 24); + out[9 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (10 - 2) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 2) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 12) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 22); } - protected static void integratedpack3(final int initoffset, + protected static void integratedpack11(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 3) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 6) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 9) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 11) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 22); + out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (11 - 1) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 1) | ((in[4 + inpos] - in[4 + inpos - 1]) << 12) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 15) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 18) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 21) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 24) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 27) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 30); - out[1 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (3 - 1) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 1) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 23); + out[2 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (11 - 2) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 2) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 13) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 24); + out[3 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (11 - 3) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 3) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 14) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 25); + out[4 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (11 - 4) | ((in[12 + inpos] - in[12 + inpos - 1]) << 4) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 7) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 10) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 13) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 15) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 26); + out[5 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (11 - 5) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 5) | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 19) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 22) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 25) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 28) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 31); - out[2 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (3 - 2) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 2) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 5) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 27); + out[6 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (11 - 6) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 6) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 17) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 28); + out[7 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (11 - 7) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 7) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 18) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 29); + out[8 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (11 - 8) | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 11) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 14) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 17) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 19) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 30); + out[9 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (11 - 9) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 9) | ((in[28 + inpos] - in[28 + inpos - 1]) << 20) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 23) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 26) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 29); + | ((in[29 + inpos] - in[29 + inpos - 1]) << 31); + out[10 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (11 - 10) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 10) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 21); } - protected static void integratedpack4(final int initoffset, + protected static void integratedpack12(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 4) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 8) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 12) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 12) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 24); + out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (12 - 4) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 4) | ((in[4 + inpos] - in[4 + inpos - 1]) << 16) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 20) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 24) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 28); - out[1 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 4) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 8) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 12) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 28); + out[2 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (12 - 8) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 8) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 20); + out[3 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 12) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 24); + out[4 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (12 - 4) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 4) | ((in[12 + inpos] - in[12 + inpos - 1]) << 16) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 20) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 24) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 28); - out[2 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 4) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 8) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 12) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 28); + out[5 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (12 - 8) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 8) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 20); + out[6 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 12) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 24); + out[7 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (12 - 4) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 4) | ((in[20 + inpos] - in[20 + inpos - 1]) << 16) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 20) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 24) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 28); - out[3 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 4) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 8) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 12) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 28); + out[8 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (12 - 8) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 8) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 20); + out[9 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 12) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 24); + out[10 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (12 - 4) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 4) | ((in[28 + inpos] - in[28 + inpos - 1]) << 16) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 20) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 24) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 28); + | ((in[29 + inpos] - in[29 + inpos - 1]) << 28); + out[11 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (12 - 8) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 8) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 20); } - protected static void integratedpack5(final int initoffset, + protected static void integratedpack13(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 5) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 10) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 15) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 20) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 25) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 30); - out[1 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (5 - 3) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 3) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 13) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 26); + out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (13 - 7) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 7) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 20); + out[2 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (13 - 1) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 1) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 14) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 27); + out[3 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (13 - 8) | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 13) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 18) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 23) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 21); + out[4 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (13 - 2) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 2) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 15) | ((in[12 + inpos] - in[12 + inpos - 1]) << 28); - out[2 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (5 - 1) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 1) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 6) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 11) + out[5 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (13 - 9) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 9) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 22); + out[6 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (13 - 3) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 3) | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 21) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 26) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 31); - out[3 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (5 - 4) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 29); + out[7 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (13 - 10) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 10) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 23); + out[8 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (13 - 4) | ((in[20 + inpos] - in[20 + inpos - 1]) << 4) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 9) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 14) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 19) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 24) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 29); - out[4 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (5 - 2) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 2) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 7) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 17) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 30); + out[9 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (13 - 11) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 11) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 24); + out[10 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (13 - 5) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 5) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 18) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 31); + out[11 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (13 - 12) | ((in[28 + inpos] - in[28 + inpos - 1]) << 12) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 17) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 22) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 27); + | ((in[29 + inpos] - in[29 + inpos - 1]) << 25); + out[12 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (13 - 6) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 6) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 19); } - protected static void integratedpack6(final int initoffset, + protected static void integratedpack14(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 6) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 12) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 18) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 24) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 30); - out[1 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (6 - 4) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 4) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 10) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 14) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 28); + out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (14 - 10) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 10) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 24); + out[2 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (14 - 6) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 6) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 20); + out[3 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (14 - 2) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 2) | ((in[8 + inpos] - in[8 + inpos - 1]) << 16) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 22) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 28); - out[2 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (6 - 2) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 2) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 30); + out[4 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (14 - 12) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 12) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 26); + out[5 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (14 - 8) | ((in[12 + inpos] - in[12 + inpos - 1]) << 8) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 14) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 20) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 26); - out[3 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 6) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 12) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 18) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 24) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 30); - out[4 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (6 - 4) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 4) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 10) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 22); + out[6 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (14 - 4) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 4) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 18); + out[7 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 14) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 28); + out[8 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (14 - 10) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 10) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 24); + out[9 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (14 - 6) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 6) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 20); + out[10 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (14 - 2) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 2) | ((in[24 + inpos] - in[24 + inpos - 1]) << 16) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 22) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 28); - out[5 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (6 - 2) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 2) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 30); + out[11 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (14 - 12) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 12) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 26); + out[12 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (14 - 8) | ((in[28 + inpos] - in[28 + inpos - 1]) << 8) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 14) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 20) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 26); + | ((in[29 + inpos] - in[29 + inpos - 1]) << 22); + out[13 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (14 - 4) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 4) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 18); } - protected static void integratedpack7(final int initoffset, + protected static void integratedpack15(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 7) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 14) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 21) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 15) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 30); + out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (15 - 13) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 13) | ((in[4 + inpos] - in[4 + inpos - 1]) << 28); - out[1 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (7 - 3) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 3) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 10) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 17) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 24) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 31); - out[2 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (7 - 6) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 6) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 13) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 20) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 27); - out[3 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (7 - 2) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 2) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 9) + out[2 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (15 - 11) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 11) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 26); + out[3 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (15 - 9) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 9) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 24); + out[4 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (15 - 7) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 7) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 22); + out[5 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (15 - 5) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 5) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 20); + out[6 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (15 - 3) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 3) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 18); + out[7 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (15 - 1) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 1) | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 23) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 30); - out[4 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (7 - 5) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 5) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 31); + out[8 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (15 - 14) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 14) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 29); + out[9 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (15 - 12) | ((in[20 + inpos] - in[20 + inpos - 1]) << 12) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 19) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 26); - out[5 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (7 - 1) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 1) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 27); + out[10 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (15 - 10) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 10) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 25); + out[11 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (15 - 8) | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 15) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 22) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 29); - out[6 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (7 - 4) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 23); + out[12 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (15 - 6) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 6) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 21); + out[13 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (15 - 4) | ((in[28 + inpos] - in[28 + inpos - 1]) << 4) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 11) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 18) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 25); + | ((in[29 + inpos] - in[29 + inpos - 1]) << 19); + out[14 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (15 - 2) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 2) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 17); } - protected static void integratedpack8(final int initoffset, + protected static void integratedpack16(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 8) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 16) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 24); - out[1 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 8) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 16) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 24); - out[2 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 8) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 16) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 24); - out[3 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 8) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 16) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 24); - out[4 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 8) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 16) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 24); - out[5 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 8) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 16) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 24); - out[6 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 8) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 16) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 24); - out[7 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 8) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 16) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 24); + | ((in[1 + inpos] - in[1 + inpos - 1]) << 16); + out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 16); + out[2 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 16); + out[3 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 16); + out[4 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 16); + out[5 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 16); + out[6 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 16); + out[7 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 16); + out[8 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 16); + out[9 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 16); + out[10 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 16); + out[11 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 16); + out[12 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 16); + out[13 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 16); + out[14 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 16); + out[15 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 16); } - protected static void integratedpack9(final int initoffset, + protected static void integratedpack17(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 9) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 18) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 27); - out[1 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (9 - 4) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 17); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (17 - 2) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 2) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 19); + out[2 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (17 - 4) | ((in[4 + inpos] - in[4 + inpos - 1]) << 4) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 13) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 22) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 31); - out[2 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (9 - 8) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 21); + out[3 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (17 - 6) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 6) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 23); + out[4 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (17 - 8) | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 17) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 26); - out[3 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (9 - 3) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 3) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 25); + out[5 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (17 - 10) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 10) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 27); + out[6 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (17 - 12) | ((in[12 + inpos] - in[12 + inpos - 1]) << 12) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 21) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 30); - out[4 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (9 - 7) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 7) - | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 25); - out[5 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (9 - 2) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 2) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 11) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 20) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 29); - out[6 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (9 - 6) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 6) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 15) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 29); + out[7 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (17 - 14) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 14) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 31); + out[8 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (17 - 16) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16); + out[9 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (17 - 1) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 1) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 18); + out[10 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (17 - 3) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 3) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 20); + out[11 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (17 - 5) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 5) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 22); + out[12 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (17 - 7) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 7) | ((in[24 + inpos] - in[24 + inpos - 1]) << 24); - out[7 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (9 - 1) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 1) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 10) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 19) + out[13 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (17 - 9) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 9) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 26); + out[14 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (17 - 11) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 11) | ((in[28 + inpos] - in[28 + inpos - 1]) << 28); - out[8 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (9 - 5) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 5) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 14) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 23); + out[15 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (17 - 13) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 13) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 30); + out[16 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (17 - 15) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 15); } - protected static void integratedpack10(final int initoffset, + protected static void integratedpack18(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 10) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 20) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 30); - out[1 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (10 - 8) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 18); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (18 - 4) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 4) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 22); + out[2 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (18 - 8) | ((in[4 + inpos] - in[4 + inpos - 1]) << 8) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 18) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 28); - out[2 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (10 - 6) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 6) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 16) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 26); - out[3 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (10 - 4) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 4) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 14) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 26); + out[3 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (18 - 12) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 12) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 30); + out[4 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (18 - 16) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 16); + out[5 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (18 - 2) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 2) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 20); + out[6 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (18 - 6) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 6) | ((in[12 + inpos] - in[12 + inpos - 1]) << 24); - out[4 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (10 - 2) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 2) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 12) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 22); - out[5 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 10) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 20) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 30); - out[6 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (10 - 8) + out[7 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (18 - 10) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 10) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 28); + out[8 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (18 - 14) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 14); + out[9 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 18); + out[10 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (18 - 4) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 4) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 22); + out[11 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (18 - 8) | ((in[20 + inpos] - in[20 + inpos - 1]) << 8) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 18) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 28); - out[7 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (10 - 6) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 6) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 16) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 26); - out[8 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (10 - 4) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 4) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 14) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 26); + out[12 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (18 - 12) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 12) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 30); + out[13 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (18 - 16) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 16); + out[14 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (18 - 2) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 2) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 20); + out[15 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (18 - 6) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 6) | ((in[28 + inpos] - in[28 + inpos - 1]) << 24); - out[9 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (10 - 2) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 2) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 12) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 22); + out[16 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (18 - 10) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 10) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 28); + out[17 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (18 - 14) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 14); } - protected static void integratedpack11(final int initoffset, + protected static void integratedpack19(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 11) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 22); - out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (11 - 1) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 1) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 19); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (19 - 6) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 6) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 25); + out[2 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (19 - 12) | ((in[4 + inpos] - in[4 + inpos - 1]) << 12) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 23); - out[2 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (11 - 2) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 2) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 13) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 31); + out[3 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (19 - 18) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 18); + out[4 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (19 - 5) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 5) | ((in[8 + inpos] - in[8 + inpos - 1]) << 24); - out[3 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (11 - 3) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 3) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 14) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 25); - out[4 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (11 - 4) + out[5 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (19 - 11) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 11) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 30); + out[6 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (19 - 17) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 17); + out[7 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (19 - 4) | ((in[12 + inpos] - in[12 + inpos - 1]) << 4) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 15) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 26); - out[5 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (11 - 5) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 5) - | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 27); - out[6 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (11 - 6) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 6) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 17) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 23); + out[8 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (19 - 10) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 10) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 29); + out[9 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (19 - 16) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16); + out[10 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (19 - 3) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 3) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 22); + out[11 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (19 - 9) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 9) | ((in[20 + inpos] - in[20 + inpos - 1]) << 28); - out[7 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (11 - 7) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 7) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 18) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 29); - out[8 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (11 - 8) + out[12 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (19 - 15) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 15); + out[13 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (19 - 2) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 2) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 21); + out[14 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (19 - 8) | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 19) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 30); - out[9 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (11 - 9) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 9) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 20) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 31); - out[10 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (11 - 10) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 10) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 21); + | ((in[25 + inpos] - in[25 + inpos - 1]) << 27); + out[15 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (19 - 14) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 14); + out[16 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (19 - 1) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 1) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 20); + out[17 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (19 - 7) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 7) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 26); + out[18 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (19 - 13) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 13); } - protected static void integratedpack12(final int initoffset, + protected static void integratedpack2(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 12) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 24); - out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (12 - 4) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 4) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 16) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 28); - out[2 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (12 - 8) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 8) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 20); - out[3 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 12) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 24); - out[4 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (12 - 4) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 4) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 16) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 28); - out[5 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (12 - 8) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 8) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 20); - out[6 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 12) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 24); - out[7 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (12 - 4) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 4) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 16) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 28); - out[8 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (12 - 8) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 8) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 20); - out[9 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 12) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 24); - out[10 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (12 - 4) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 4) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 16) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 28); - out[11 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (12 - 8) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 8) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 20); + | ((in[1 + inpos] - in[1 + inpos - 1]) << 2) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 4) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 6) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 8) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 10) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 12) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 14) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 16) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 18) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 20) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 22) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 24) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 26) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 28) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 30); + out[1 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 2) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 4) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 6) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 8) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 10) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 12) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 14) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 16) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 18) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 20) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 22) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 24) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 26) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 28) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 30); } - protected static void integratedpack13(final int initoffset, + protected static void integratedpack20(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 13) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 26); - out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (13 - 7) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 7) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 20); - out[2 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (13 - 1) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 1) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 14) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 27); - out[3 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (13 - 8) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 21); - out[4 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (13 - 2) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 2) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 15) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 28); - out[5 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (13 - 9) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 9) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 22); - out[6 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (13 - 3) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 3) - | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 29); - out[7 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (13 - 10) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 10) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 23); - out[8 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (13 - 4) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 4) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 17) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 30); - out[9 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (13 - 11) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 11) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 24); - out[10 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (13 - 5) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 5) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 18) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 31); - out[11 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (13 - 12) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 12) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 25); - out[12 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (13 - 6) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 6) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 19); + | ((in[1 + inpos] - in[1 + inpos - 1]) << 20); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (20 - 8) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 8) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 28); + out[2 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (20 - 16) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 16); + out[3 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (20 - 4) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 4) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 24); + out[4 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (20 - 12) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 12); + out[5 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 20); + out[6 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (20 - 8) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 8) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 28); + out[7 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (20 - 16) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 16); + out[8 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (20 - 4) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 4) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 24); + out[9 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (20 - 12) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 12); + out[10 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 20); + out[11 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (20 - 8) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 8) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 28); + out[12 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (20 - 16) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 16); + out[13 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (20 - 4) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 4) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 24); + out[14 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (20 - 12) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 12); + out[15 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 20); + out[16 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (20 - 8) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 8) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 28); + out[17 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (20 - 16) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 16); + out[18 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (20 - 4) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 4) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 24); + out[19 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (20 - 12) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 12); } - protected static void integratedpack14(final int initoffset, + protected static void integratedpack21(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 14) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 28); - out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (14 - 10) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 10) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 24); - out[2 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (14 - 6) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 6) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 20); - out[3 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (14 - 2) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 2) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 16) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 30); - out[4 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (14 - 12) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 12) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 26); - out[5 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (14 - 8) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 8) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 22); - out[6 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (14 - 4) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 4) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 18); - out[7 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 14) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 28); - out[8 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (14 - 10) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 10) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 21); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (21 - 10) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 10) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 31); + out[2 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (21 - 20) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 20); + out[3 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (21 - 9) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 9) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 30); + out[4 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (21 - 19) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 19); + out[5 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (21 - 8) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 29); + out[6 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (21 - 18) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 18); + out[7 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (21 - 7) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 7) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 28); + out[8 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (21 - 17) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 17); + out[9 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (21 - 6) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 6) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 27); + out[10 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (21 - 16) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16); + out[11 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (21 - 5) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 5) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 26); + out[12 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (21 - 15) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 15); + out[13 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (21 - 4) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 4) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 25); + out[14 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (21 - 14) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 14); + out[15 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (21 - 3) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 3) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 24); + out[16 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (21 - 13) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 13); + out[17 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (21 - 2) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 2) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 23); + out[18 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (21 - 12) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 12); + out[19 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (21 - 1) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 1) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 22); + out[20 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (21 - 11) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 11); + } + + protected static void integratedpack22(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 22); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (22 - 12) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 12); + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (22 - 2) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 2) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 24); + out[3 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (22 - 14) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 14); + out[4 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (22 - 4) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 4) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 26); + out[5 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (22 - 16) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 16); + out[6 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (22 - 6) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 6) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 28); + out[7 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (22 - 18) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 18); + out[8 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (22 - 8) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 8) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 30); + out[9 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (22 - 20) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 20); + out[10 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (22 - 10) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 10); + out[11 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 22); + out[12 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (22 - 12) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 12); + out[13 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (22 - 2) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 2) | ((in[20 + inpos] - in[20 + inpos - 1]) << 24); - out[9 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (14 - 6) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 6) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 20); - out[10 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (14 - 2) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 2) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 16) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 30); - out[11 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (14 - 12) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 12) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 26); - out[12 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (14 - 8) + out[14 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (22 - 14) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 14); + out[15 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (22 - 4) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 4) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 26); + out[16 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (22 - 16) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 16); + out[17 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (22 - 6) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 6) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 28); + out[18 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (22 - 18) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 18); + out[19 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (22 - 8) | ((in[28 + inpos] - in[28 + inpos - 1]) << 8) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 22); - out[13 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (14 - 4) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 4) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 18); + | ((in[29 + inpos] - in[29 + inpos - 1]) << 30); + out[20 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (22 - 20) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 20); + out[21 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (22 - 10) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 10); } - protected static void integratedpack15(final int initoffset, + protected static void integratedpack23(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 15) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 30); - out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (15 - 13) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 13) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 23); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (23 - 14) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 14); + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (23 - 5) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 5) | ((in[4 + inpos] - in[4 + inpos - 1]) << 28); - out[2 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (15 - 11) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 11) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 26); - out[3 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (15 - 9) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 9) + out[3 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (23 - 19) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 19); + out[4 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (23 - 10) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 10); + out[5 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (23 - 1) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 1) | ((in[8 + inpos] - in[8 + inpos - 1]) << 24); - out[4 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (15 - 7) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 7) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 22); - out[5 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (15 - 5) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 5) + out[6 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (23 - 15) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 15); + out[7 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (23 - 6) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 6) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 29); + out[8 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (23 - 20) | ((in[12 + inpos] - in[12 + inpos - 1]) << 20); - out[6 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (15 - 3) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 3) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 18); - out[7 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (15 - 1) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 1) - | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 31); - out[8 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (15 - 14) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 14) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 29); - out[9 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (15 - 12) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 12) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 27); - out[10 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (15 - 10) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 10) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 25); - out[11 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (15 - 8) + out[9 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (23 - 11) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 11); + out[10 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (23 - 2) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 2) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 25); + out[11 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (23 - 16) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16); + out[12 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (23 - 7) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 7) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 30); + out[13 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (23 - 21) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 21); + out[14 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (23 - 12) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 12); + out[15 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (23 - 3) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 3) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 26); + out[16 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (23 - 17) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 17); + out[17 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (23 - 8) | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 23); - out[12 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (15 - 6) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 6) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 21); - out[13 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (15 - 4) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 31); + out[18 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (23 - 22) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 22); + out[19 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (23 - 13) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 13); + out[20 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (23 - 4) | ((in[28 + inpos] - in[28 + inpos - 1]) << 4) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 19); - out[14 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (15 - 2) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 2) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 17); - } - - protected static void integratedpack16(final int initoffset, - final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 16); - out[1 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 16); - out[2 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 16); - out[3 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 16); - out[4 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 16); - out[5 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 16); - out[6 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 16); - out[7 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 16); - out[8 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 16); - out[9 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 16); - out[10 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 16); - out[11 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 16); - out[12 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 16); - out[13 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 16); - out[14 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 16); - out[15 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 16); + | ((in[29 + inpos] - in[29 + inpos - 1]) << 27); + out[21 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (23 - 18) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 18); + out[22 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (23 - 9) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 9); } - protected static void integratedpack17(final int initoffset, + protected static void integratedpack24(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 17); - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (17 - 2) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 2) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 19); - out[2 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (17 - 4) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 24); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (24 - 16) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 16); + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (24 - 8) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 8); + out[3 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 24); + out[4 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (24 - 16) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 16); + out[5 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (24 - 8) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 8); + out[6 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 24); + out[7 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (24 - 16) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 16); + out[8 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (24 - 8) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 8); + out[9 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 24); + out[10 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (24 - 16) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 16); + out[11 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (24 - 8) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 8); + out[12 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 24); + out[13 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (24 - 16) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 16); + out[14 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (24 - 8) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 8); + out[15 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 24); + out[16 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (24 - 16) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 16); + out[17 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (24 - 8) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 8); + out[18 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 24); + out[19 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (24 - 16) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 16); + out[20 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (24 - 8) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 8); + out[21 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 24); + out[22 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (24 - 16) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 16); + out[23 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (24 - 8) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 8); + } + + protected static void integratedpack25(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 25); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (25 - 18) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 18); + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (25 - 11) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 11); + out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (25 - 4) | ((in[4 + inpos] - in[4 + inpos - 1]) << 4) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 21); - out[3 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (17 - 6) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 6) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 23); - out[4 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (17 - 8) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 25); - out[5 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (17 - 10) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 10) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 27); - out[6 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (17 - 12) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 12) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 29); - out[7 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (17 - 14) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 14) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 31); - out[8 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (17 - 16) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 29); + out[4 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (25 - 22) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 22); + out[5 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (25 - 15) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 15); + out[6 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (25 - 8) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 8); + out[7 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (25 - 1) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 1) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 26); + out[8 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (25 - 19) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 19); + out[9 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (25 - 12) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 12); + out[10 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (25 - 5) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 5) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 30); + out[11 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (25 - 23) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 23); + out[12 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (25 - 16) | ((in[16 + inpos] - in[16 + inpos - 1]) << 16); - out[9 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (17 - 1) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 1) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 18); - out[10 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (17 - 3) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 3) + out[13 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (25 - 9) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 9); + out[14 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (25 - 2) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 2) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 27); + out[15 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (25 - 20) | ((in[20 + inpos] - in[20 + inpos - 1]) << 20); - out[11 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (17 - 5) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 5) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 22); - out[12 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (17 - 7) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 7) + out[16 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (25 - 13) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 13); + out[17 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (25 - 6) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 6) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 31); + out[18 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (25 - 24) | ((in[24 + inpos] - in[24 + inpos - 1]) << 24); - out[13 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (17 - 9) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 9) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 26); - out[14 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (17 - 11) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 11) + out[19 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (25 - 17) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 17); + out[20 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (25 - 10) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 10); + out[21 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (25 - 3) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 3) | ((in[28 + inpos] - in[28 + inpos - 1]) << 28); - out[15 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (17 - 13) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 13) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 30); - out[16 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (17 - 15) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 15); + out[22 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (25 - 21) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 21); + out[23 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (25 - 14) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 14); + out[24 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (25 - 7) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 7); } - protected static void integratedpack18(final int initoffset, + protected static void integratedpack26(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 18); - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (18 - 4) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 4) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 22); - out[2 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (18 - 8) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 8) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 26); - out[3 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (18 - 12) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 12) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 30); - out[4 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (18 - 16) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 26); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (26 - 20) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 20); + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (26 - 14) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 14); + out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (26 - 8) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 8); + out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (26 - 2) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 2) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 28); + out[5 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (26 - 22) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 22); + out[6 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (26 - 16) | ((in[8 + inpos] - in[8 + inpos - 1]) << 16); - out[5 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (18 - 2) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 2) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 20); - out[6 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (18 - 6) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 6) + out[7 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (26 - 10) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 10); + out[8 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (26 - 4) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 4) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 30); + out[9 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (26 - 24) | ((in[12 + inpos] - in[12 + inpos - 1]) << 24); - out[7 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (18 - 10) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 10) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 28); - out[8 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (18 - 14) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 14); - out[9 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 18); - out[10 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (18 - 4) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 4) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 22); - out[11 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (18 - 8) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 8) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 26); - out[12 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (18 - 12) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 12) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 30); - out[13 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (18 - 16) + out[10 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (26 - 18) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 18); + out[11 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (26 - 12) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 12); + out[12 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (26 - 6) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 6); + out[13 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 26); + out[14 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (26 - 20) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 20); + out[15 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (26 - 14) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 14); + out[16 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (26 - 8) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 8); + out[17 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (26 - 2) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 2) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 28); + out[18 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (26 - 22) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 22); + out[19 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (26 - 16) | ((in[24 + inpos] - in[24 + inpos - 1]) << 16); - out[14 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (18 - 2) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 2) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 20); - out[15 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (18 - 6) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 6) + out[20 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (26 - 10) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 10); + out[21 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (26 - 4) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 4) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 30); + out[22 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (26 - 24) | ((in[28 + inpos] - in[28 + inpos - 1]) << 24); - out[16 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (18 - 10) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 10) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 28); - out[17 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (18 - 14) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 14); + out[23 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (26 - 18) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 18); + out[24 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (26 - 12) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 12); + out[25 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (26 - 6) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 6); } - protected static void integratedpack19(final int initoffset, + protected static void integratedpack27(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 19); - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (19 - 6) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 6) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 25); - out[2 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (19 - 12) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 12) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 31); - out[3 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (19 - 18) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 18); - out[4 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (19 - 5) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 5) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 24); - out[5 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (19 - 11) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 11) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 30); - out[6 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (19 - 17) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 17); - out[7 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (19 - 4) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 27); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (27 - 22) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 22); + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (27 - 17) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 17); + out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (27 - 12) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 12); + out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (27 - 7) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 7); + out[5 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (27 - 2) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 2) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 29); + out[6 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (27 - 24) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 24); + out[7 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (27 - 19) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 19); + out[8 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (27 - 14) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 14); + out[9 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (27 - 9) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 9); + out[10 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (27 - 4) | ((in[12 + inpos] - in[12 + inpos - 1]) << 4) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 23); - out[8 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (19 - 10) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 10) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 29); - out[9 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (19 - 16) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 31); + out[11 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (27 - 26) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 26); + out[12 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (27 - 21) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 21); + out[13 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (27 - 16) | ((in[16 + inpos] - in[16 + inpos - 1]) << 16); - out[10 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (19 - 3) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 3) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 22); - out[11 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (19 - 9) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 9) + out[14 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (27 - 11) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 11); + out[15 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (27 - 6) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 6); + out[16 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (27 - 1) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 1) | ((in[20 + inpos] - in[20 + inpos - 1]) << 28); - out[12 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (19 - 15) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 15); - out[13 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (19 - 2) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 2) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 21); - out[14 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (19 - 8) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 27); - out[15 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (19 - 14) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 14); - out[16 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (19 - 1) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 1) + out[17 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (27 - 23) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 23); + out[18 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (27 - 18) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 18); + out[19 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (27 - 13) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 13); + out[20 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (27 - 8) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 8); + out[21 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (27 - 3) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 3) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 30); + out[22 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (27 - 25) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 25); + out[23 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (27 - 20) | ((in[28 + inpos] - in[28 + inpos - 1]) << 20); - out[17 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (19 - 7) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 7) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 26); - out[18 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (19 - 13) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 13); + out[24 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (27 - 15) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 15); + out[25 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (27 - 10) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 10); + out[26 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (27 - 5) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 5); } - protected static void integratedpack20(final int initoffset, + protected static void integratedpack28(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 20); - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (20 - 8) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 8) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 28); - out[2 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (20 - 16) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 28); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (28 - 24) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 24); + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (28 - 20) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 20); + out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (28 - 16) | ((in[4 + inpos] - in[4 + inpos - 1]) << 16); - out[3 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (20 - 4) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 4) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 24); - out[4 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (20 - 12) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 12); - out[5 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 20); - out[6 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (20 - 8) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 8) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 28); - out[7 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (20 - 16) + out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (28 - 12) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 12); + out[5 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (28 - 8) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 8); + out[6 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (28 - 4) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 4); + out[7 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 28); + out[8 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (28 - 24) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 24); + out[9 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (28 - 20) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 20); + out[10 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (28 - 16) | ((in[12 + inpos] - in[12 + inpos - 1]) << 16); - out[8 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (20 - 4) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 4) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 24); - out[9 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (20 - 12) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 12); - out[10 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 20); - out[11 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (20 - 8) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 8) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 28); - out[12 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (20 - 16) + out[11 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (28 - 12) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 12); + out[12 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (28 - 8) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 8); + out[13 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (28 - 4) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 4); + out[14 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 28); + out[15 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (28 - 24) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 24); + out[16 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (28 - 20) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 20); + out[17 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (28 - 16) | ((in[20 + inpos] - in[20 + inpos - 1]) << 16); - out[13 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (20 - 4) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 4) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 24); - out[14 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (20 - 12) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 12); - out[15 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 20); - out[16 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (20 - 8) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 8) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 28); - out[17 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (20 - 16) + out[18 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (28 - 12) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 12); + out[19 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (28 - 8) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 8); + out[20 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (28 - 4) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 4); + out[21 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 28); + out[22 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (28 - 24) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 24); + out[23 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (28 - 20) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 20); + out[24 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (28 - 16) | ((in[28 + inpos] - in[28 + inpos - 1]) << 16); - out[18 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (20 - 4) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 4) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 24); - out[19 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (20 - 12) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 12); + out[25 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (28 - 12) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 12); + out[26 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (28 - 8) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 8); + out[27 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (28 - 4) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 4); } - protected static void integratedpack21(final int initoffset, + protected static void integratedpack29(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 21); - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (21 - 10) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 10) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 31); - out[2 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (21 - 20) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 29); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (29 - 26) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 26); + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (29 - 23) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 23); + out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (29 - 20) | ((in[4 + inpos] - in[4 + inpos - 1]) << 20); - out[3 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (21 - 9) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 9) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 30); - out[4 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (21 - 19) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 19); - out[5 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (21 - 8) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 29); - out[6 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (21 - 18) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 18); - out[7 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (21 - 7) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 7) + out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (29 - 17) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 17); + out[5 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (29 - 14) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 14); + out[6 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (29 - 11) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 11); + out[7 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (29 - 8) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 8); + out[8 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (29 - 5) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 5); + out[9 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (29 - 2) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 2) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 31); + out[10 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (29 - 28) | ((in[12 + inpos] - in[12 + inpos - 1]) << 28); - out[8 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (21 - 17) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 17); - out[9 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (21 - 6) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 6) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 27); - out[10 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (21 - 16) + out[11 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (29 - 25) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 25); + out[12 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (29 - 22) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 22); + out[13 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (29 - 19) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 19); + out[14 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (29 - 16) | ((in[16 + inpos] - in[16 + inpos - 1]) << 16); - out[11 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (21 - 5) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 5) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 26); - out[12 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (21 - 15) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 15); - out[13 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (21 - 4) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 4) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 25); - out[14 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (21 - 14) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 14); - out[15 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (21 - 3) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 3) + out[15 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (29 - 13) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 13); + out[16 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (29 - 10) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 10); + out[17 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (29 - 7) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 7); + out[18 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (29 - 4) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 4); + out[19 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (29 - 1) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 1) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 30); + out[20 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (29 - 27) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 27); + out[21 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (29 - 24) | ((in[24 + inpos] - in[24 + inpos - 1]) << 24); - out[16 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (21 - 13) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 13); - out[17 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (21 - 2) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 2) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 23); - out[18 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (21 - 12) + out[22 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (29 - 21) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 21); + out[23 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (29 - 18) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 18); + out[24 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (29 - 15) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 15); + out[25 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (29 - 12) | ((in[28 + inpos] - in[28 + inpos - 1]) << 12); - out[19 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (21 - 1) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 1) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 22); - out[20 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (21 - 11) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 11); + out[26 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (29 - 9) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 9); + out[27 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (29 - 6) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 6); + out[28 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (29 - 3) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 3); } - protected static void integratedpack22(final int initoffset, + protected static void integratedpack3(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 22); - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (22 - 12) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 12); - out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (22 - 2) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 2) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 3) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 6) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 9) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 12) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 15) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 18) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 21) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 24) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 27) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 30); + out[1 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (3 - 1) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 1) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 4) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 7) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 10) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 13) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 19) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 22) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 25) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 28) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 31); + out[2 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (3 - 2) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 2) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 5) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 11) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 14) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 17) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 20) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 23) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 26) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 29); + } + + protected static void integratedpack30(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (in[0 + inpos] - initoffset) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 30); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (30 - 28) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 28); + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (30 - 26) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 26); + out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (30 - 24) | ((in[4 + inpos] - in[4 + inpos - 1]) << 24); - out[3 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (22 - 14) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 14); - out[4 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (22 - 4) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 4) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 26); - out[5 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (22 - 16) + out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (30 - 22) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 22); + out[5 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (30 - 20) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 20); + out[6 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (30 - 18) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 18); + out[7 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (30 - 16) | ((in[8 + inpos] - in[8 + inpos - 1]) << 16); - out[6 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (22 - 6) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 6) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 28); - out[7 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (22 - 18) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 18); - out[8 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (22 - 8) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 8) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 30); - out[9 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (22 - 20) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 20); - out[10 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (22 - 10) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 10); - out[11 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 22); - out[12 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (22 - 12) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 12); - out[13 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (22 - 2) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 2) + out[8 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (30 - 14) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 14); + out[9 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (30 - 12) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 12); + out[10 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (30 - 10) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 10); + out[11 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (30 - 8) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 8); + out[12 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (30 - 6) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 6); + out[13 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (30 - 4) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 4); + out[14 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (30 - 2) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 2); + out[15 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 30); + out[16 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (30 - 28) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 28); + out[17 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (30 - 26) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 26); + out[18 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (30 - 24) | ((in[20 + inpos] - in[20 + inpos - 1]) << 24); - out[14 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (22 - 14) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 14); - out[15 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (22 - 4) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 4) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 26); - out[16 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (22 - 16) + out[19 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (30 - 22) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 22); + out[20 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (30 - 20) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 20); + out[21 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (30 - 18) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 18); + out[22 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (30 - 16) | ((in[24 + inpos] - in[24 + inpos - 1]) << 16); - out[17 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (22 - 6) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 6) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 28); - out[18 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (22 - 18) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 18); - out[19 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (22 - 8) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 8) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 30); - out[20 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (22 - 20) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 20); - out[21 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (22 - 10) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 10); + out[23 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (30 - 14) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 14); + out[24 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (30 - 12) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 12); + out[25 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (30 - 10) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 10); + out[26 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (30 - 8) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 8); + out[27 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (30 - 6) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 6); + out[28 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (30 - 4) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 4); + out[29 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (30 - 2) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 2); } - protected static void integratedpack23(final int initoffset, + protected static void integratedpack31(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 23); - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (23 - 14) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 14); - out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (23 - 5) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 5) + | ((in[1 + inpos] - in[1 + inpos - 1]) << 31); + out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (31 - 30) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 30); + out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (31 - 29) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 29); + out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (31 - 28) | ((in[4 + inpos] - in[4 + inpos - 1]) << 28); - out[3 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (23 - 19) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 19); - out[4 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (23 - 10) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 10); - out[5 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (23 - 1) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 1) + out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (31 - 27) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 27); + out[5 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (31 - 26) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 26); + out[6 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (31 - 25) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 25); + out[7 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (31 - 24) | ((in[8 + inpos] - in[8 + inpos - 1]) << 24); - out[6 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (23 - 15) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 15); - out[7 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (23 - 6) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 6) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 29); - out[8 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (23 - 20) + out[8 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (31 - 23) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 23); + out[9 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (31 - 22) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 22); + out[10 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (31 - 21) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 21); + out[11 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (31 - 20) | ((in[12 + inpos] - in[12 + inpos - 1]) << 20); - out[9 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (23 - 11) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 11); - out[10 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (23 - 2) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 2) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 25); - out[11 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (23 - 16) + out[12 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (31 - 19) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 19); + out[13 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (31 - 18) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 18); + out[14 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (31 - 17) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 17); + out[15 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (31 - 16) | ((in[16 + inpos] - in[16 + inpos - 1]) << 16); - out[12 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (23 - 7) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 7) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 30); - out[13 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (23 - 21) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 21); - out[14 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (23 - 12) + out[16 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (31 - 15) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 15); + out[17 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (31 - 14) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 14); + out[18 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (31 - 13) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 13); + out[19 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (31 - 12) | ((in[20 + inpos] - in[20 + inpos - 1]) << 12); - out[15 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (23 - 3) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 3) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 26); - out[16 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (23 - 17) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 17); - out[17 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (23 - 8) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 31); - out[18 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (23 - 22) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 22); - out[19 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (23 - 13) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 13); - out[20 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (23 - 4) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 4) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 27); - out[21 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (23 - 18) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 18); - out[22 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (23 - 9) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 9); - } - - protected static void integratedpack24(final int initoffset, - final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 24); - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (24 - 16) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 16); - out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (24 - 8) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 8); - out[3 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 24); - out[4 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (24 - 16) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 16); - out[5 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (24 - 8) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 8); - out[6 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 24); - out[7 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (24 - 16) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 16); - out[8 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (24 - 8) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 8); - out[9 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 24); - out[10 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (24 - 16) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 16); - out[11 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (24 - 8) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 8); - out[12 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 24); - out[13 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (24 - 16) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 16); - out[14 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (24 - 8) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 8); - out[15 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 24); - out[16 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (24 - 16) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 16); - out[17 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (24 - 8) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 8); - out[18 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 24); - out[19 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (24 - 16) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 16); - out[20 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (24 - 8) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 8); - out[21 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 24); - out[22 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (24 - 16) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 16); - out[23 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (24 - 8) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 8); + out[20 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (31 - 11) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 11); + out[21 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (31 - 10) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 10); + out[22 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (31 - 9) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 9); + out[23 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (31 - 8) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 8); + out[24 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (31 - 7) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 7); + out[25 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (31 - 6) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 6); + out[26 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (31 - 5) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 5); + out[27 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (31 - 4) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 4); + out[28 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (31 - 3) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 3); + out[29 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (31 - 2) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 2); + out[30 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (31 - 1) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 1); } - protected static void integratedpack25(final int initoffset, + protected static void integratedpack32(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 25); - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (25 - 18) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 18); - out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (25 - 11) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 11); - out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (25 - 4) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 4) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 29); - out[4 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (25 - 22) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 22); - out[5 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (25 - 15) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 15); - out[6 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (25 - 8) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 8); - out[7 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (25 - 1) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 1) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 26); - out[8 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (25 - 19) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 19); - out[9 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (25 - 12) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 12); - out[10 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (25 - 5) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 5) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 30); - out[11 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (25 - 23) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 23); - out[12 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (25 - 16) - | ((in[16 + inpos] - in[16 + inpos - 1]) << 16); - out[13 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (25 - 9) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 9); - out[14 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (25 - 2) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 2) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 27); - out[15 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (25 - 20) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 20); - out[16 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (25 - 13) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 13); - out[17 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (25 - 6) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 6) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 31); - out[18 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (25 - 24) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 24); - out[19 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (25 - 17) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 17); - out[20 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (25 - 10) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 10); - out[21 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (25 - 3) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 3) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 28); - out[22 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (25 - 21) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 21); - out[23 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (25 - 14) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 14); - out[24 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (25 - 7) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 7); + System.arraycopy(in, inpos, out, outpos, 32); // no sense in + // doing delta + // coding } - protected static void integratedpack26(final int initoffset, + protected static void integratedpack4(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 26); - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (26 - 20) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 20); - out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (26 - 14) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 14); - out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (26 - 8) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 8); - out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (26 - 2) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 2) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 28); - out[5 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (26 - 22) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 22); - out[6 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (26 - 16) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 16); - out[7 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (26 - 10) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 10); - out[8 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (26 - 4) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 4) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 30); - out[9 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (26 - 24) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 24); - out[10 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (26 - 18) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 18); - out[11 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (26 - 12) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 12); - out[12 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (26 - 6) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 6); - out[13 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 26); - out[14 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (26 - 20) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 20); - out[15 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (26 - 14) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 14); - out[16 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (26 - 8) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 8); - out[17 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (26 - 2) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 2) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 28); - out[18 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (26 - 22) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 22); - out[19 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (26 - 16) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 16); - out[20 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (26 - 10) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 10); - out[21 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (26 - 4) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 4) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 30); - out[22 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (26 - 24) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 24); - out[23 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (26 - 18) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 18); - out[24 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (26 - 12) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 12); - out[25 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (26 - 6) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 6); + | ((in[1 + inpos] - in[1 + inpos - 1]) << 4) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 8) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 12) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 16) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 20) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 24) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 28); + out[1 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 4) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 8) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 12) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 16) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 20) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 24) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 28); + out[2 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 4) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 8) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 12) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 16) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 20) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 24) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 28); + out[3 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 4) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 8) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 12) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 16) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 20) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 24) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 28); } - protected static void integratedpack27(final int initoffset, + protected static void integratedpack5(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 27); - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (27 - 22) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 22); - out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (27 - 17) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 17); - out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (27 - 12) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 12); - out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (27 - 7) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 7); - out[5 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (27 - 2) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 2) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 29); - out[6 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (27 - 24) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 24); - out[7 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (27 - 19) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 19); - out[8 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (27 - 14) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 14); - out[9 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (27 - 9) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 9); - out[10 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (27 - 4) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 4) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 31); - out[11 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (27 - 26) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 26); - out[12 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (27 - 21) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 21); - out[13 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (27 - 16) - | ((in[16 + inpos] - in[16 + inpos - 1]) << 16); - out[14 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (27 - 11) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 11); - out[15 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (27 - 6) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 6); - out[16 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (27 - 1) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 1) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 28); - out[17 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (27 - 23) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 23); - out[18 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (27 - 18) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 18); - out[19 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (27 - 13) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 13); - out[20 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (27 - 8) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 8); - out[21 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (27 - 3) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 3) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 30); - out[22 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (27 - 25) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 25); - out[23 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (27 - 20) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 20); - out[24 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (27 - 15) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 15); - out[25 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (27 - 10) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 10); - out[26 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (27 - 5) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 5); + | ((in[1 + inpos] - in[1 + inpos - 1]) << 5) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 10) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 15) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 20) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 25) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 30); + out[1 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (5 - 3) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 3) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 13) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 18) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 23) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 28); + out[2 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (5 - 1) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 1) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 6) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 11) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 21) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 26) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 31); + out[3 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (5 - 4) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 4) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 9) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 14) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 19) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 24) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 29); + out[4 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (5 - 2) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 2) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 7) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 12) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 17) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 22) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 27); } - protected static void integratedpack28(final int initoffset, + protected static void integratedpack6(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 28); - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (28 - 24) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 24); - out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (28 - 20) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 20); - out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (28 - 16) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 16); - out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (28 - 12) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 12); - out[5 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (28 - 8) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 8); - out[6 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (28 - 4) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 4); - out[7 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 28); - out[8 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (28 - 24) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 24); - out[9 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (28 - 20) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 20); - out[10 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (28 - 16) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 16); - out[11 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (28 - 12) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 12); - out[12 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (28 - 8) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 8); - out[13 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (28 - 4) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 4); - out[14 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 28); - out[15 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (28 - 24) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 24); - out[16 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (28 - 20) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 20); - out[17 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (28 - 16) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 16); - out[18 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (28 - 12) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 12); - out[19 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (28 - 8) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 8); - out[20 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (28 - 4) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 4); - out[21 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 28); - out[22 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (28 - 24) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 24); - out[23 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (28 - 20) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 20); - out[24 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (28 - 16) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 16); - out[25 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (28 - 12) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 12); - out[26 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (28 - 8) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 8); - out[27 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (28 - 4) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 4); + | ((in[1 + inpos] - in[1 + inpos - 1]) << 6) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 12) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 18) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 24) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 30); + out[1 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (6 - 4) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 4) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 10) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 16) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 22) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 28); + out[2 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (6 - 2) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 2) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 8) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 14) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 20) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 26); + out[3 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 6) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 12) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 18) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 24) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 30); + out[4 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (6 - 4) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 4) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 10) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 16) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 22) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 28); + out[5 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (6 - 2) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 2) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 8) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 14) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 20) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 26); } - protected static void integratedpack29(final int initoffset, + protected static void integratedpack7(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 29); - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (29 - 26) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 26); - out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (29 - 23) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 23); - out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (29 - 20) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 20); - out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (29 - 17) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 17); - out[5 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (29 - 14) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 14); - out[6 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (29 - 11) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 11); - out[7 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (29 - 8) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 8); - out[8 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (29 - 5) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 5); - out[9 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (29 - 2) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 2) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 31); - out[10 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (29 - 28) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 28); - out[11 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (29 - 25) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 25); - out[12 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (29 - 22) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 22); - out[13 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (29 - 19) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 19); - out[14 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (29 - 16) - | ((in[16 + inpos] - in[16 + inpos - 1]) << 16); - out[15 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (29 - 13) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 13); - out[16 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (29 - 10) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 10); - out[17 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (29 - 7) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 7); - out[18 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (29 - 4) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 4); - out[19 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (29 - 1) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 1) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 30); - out[20 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (29 - 27) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 27); - out[21 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (29 - 24) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 24); - out[22 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (29 - 21) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 21); - out[23 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (29 - 18) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 18); - out[24 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (29 - 15) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 15); - out[25 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (29 - 12) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 12); - out[26 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (29 - 9) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 9); - out[27 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (29 - 6) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 6); - out[28 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (29 - 3) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 3); + | ((in[1 + inpos] - in[1 + inpos - 1]) << 7) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 14) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 21) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 28); + out[1 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (7 - 3) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 3) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 10) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 17) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 24) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 31); + out[2 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (7 - 6) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 6) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 13) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 20) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 27); + out[3 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (7 - 2) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 2) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 9) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 23) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 30); + out[4 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (7 - 5) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 5) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 12) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 19) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 26); + out[5 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (7 - 1) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 1) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 8) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 15) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 22) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 29); + out[6 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (7 - 4) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 4) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 11) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 18) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 25); } - protected static void integratedpack30(final int initoffset, + protected static void integratedpack8(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 30); - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (30 - 28) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 28); - out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (30 - 26) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 26); - out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (30 - 24) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 24); - out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (30 - 22) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 22); - out[5 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (30 - 20) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 20); - out[6 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (30 - 18) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 18); - out[7 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (30 - 16) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 16); - out[8 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (30 - 14) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 14); - out[9 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (30 - 12) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 12); - out[10 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (30 - 10) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 10); - out[11 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (30 - 8) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 8); - out[12 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (30 - 6) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 6); - out[13 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (30 - 4) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 4); - out[14 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (30 - 2) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 2); - out[15 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 30); - out[16 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (30 - 28) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 28); - out[17 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (30 - 26) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 26); - out[18 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (30 - 24) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 24); - out[19 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (30 - 22) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 22); - out[20 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (30 - 20) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 20); - out[21 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (30 - 18) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 18); - out[22 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (30 - 16) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 16); - out[23 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (30 - 14) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 14); - out[24 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (30 - 12) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 12); - out[25 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (30 - 10) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 10); - out[26 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (30 - 8) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 8); - out[27 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (30 - 6) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 6); - out[28 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (30 - 4) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 4); - out[29 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (30 - 2) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 2); + | ((in[1 + inpos] - in[1 + inpos - 1]) << 8) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 16) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 24); + out[1 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 8) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 16) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 24); + out[2 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 8) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 16) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 24); + out[3 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 8) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 16) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 24); + out[4 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 8) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 16) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 24); + out[5 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 8) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 16) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 24); + out[6 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 8) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 16) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 24); + out[7 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 8) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 16) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 24); } - protected static void integratedpack31(final int initoffset, + protected static void integratedpack9(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { out[0 + outpos] = (in[0 + inpos] - initoffset) - | ((in[1 + inpos] - in[1 + inpos - 1]) << 31); - out[1 + outpos] = (in[1 + inpos] - in[1 + inpos - 1]) >>> (31 - 30) - | ((in[2 + inpos] - in[2 + inpos - 1]) << 30); - out[2 + outpos] = (in[2 + inpos] - in[2 + inpos - 1]) >>> (31 - 29) - | ((in[3 + inpos] - in[3 + inpos - 1]) << 29); - out[3 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (31 - 28) - | ((in[4 + inpos] - in[4 + inpos - 1]) << 28); - out[4 + outpos] = (in[4 + inpos] - in[4 + inpos - 1]) >>> (31 - 27) - | ((in[5 + inpos] - in[5 + inpos - 1]) << 27); - out[5 + outpos] = (in[5 + inpos] - in[5 + inpos - 1]) >>> (31 - 26) - | ((in[6 + inpos] - in[6 + inpos - 1]) << 26); - out[6 + outpos] = (in[6 + inpos] - in[6 + inpos - 1]) >>> (31 - 25) - | ((in[7 + inpos] - in[7 + inpos - 1]) << 25); - out[7 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (31 - 24) - | ((in[8 + inpos] - in[8 + inpos - 1]) << 24); - out[8 + outpos] = (in[8 + inpos] - in[8 + inpos - 1]) >>> (31 - 23) - | ((in[9 + inpos] - in[9 + inpos - 1]) << 23); - out[9 + outpos] = (in[9 + inpos] - in[9 + inpos - 1]) >>> (31 - 22) - | ((in[10 + inpos] - in[10 + inpos - 1]) << 22); - out[10 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (31 - 21) - | ((in[11 + inpos] - in[11 + inpos - 1]) << 21); - out[11 + outpos] = (in[11 + inpos] - in[11 + inpos - 1]) >>> (31 - 20) - | ((in[12 + inpos] - in[12 + inpos - 1]) << 20); - out[12 + outpos] = (in[12 + inpos] - in[12 + inpos - 1]) >>> (31 - 19) - | ((in[13 + inpos] - in[13 + inpos - 1]) << 19); - out[13 + outpos] = (in[13 + inpos] - in[13 + inpos - 1]) >>> (31 - 18) - | ((in[14 + inpos] - in[14 + inpos - 1]) << 18); - out[14 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (31 - 17) - | ((in[15 + inpos] - in[15 + inpos - 1]) << 17); - out[15 + outpos] = (in[15 + inpos] - in[15 + inpos - 1]) >>> (31 - 16) - | ((in[16 + inpos] - in[16 + inpos - 1]) << 16); - out[16 + outpos] = (in[16 + inpos] - in[16 + inpos - 1]) >>> (31 - 15) - | ((in[17 + inpos] - in[17 + inpos - 1]) << 15); - out[17 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (31 - 14) - | ((in[18 + inpos] - in[18 + inpos - 1]) << 14); - out[18 + outpos] = (in[18 + inpos] - in[18 + inpos - 1]) >>> (31 - 13) - | ((in[19 + inpos] - in[19 + inpos - 1]) << 13); - out[19 + outpos] = (in[19 + inpos] - in[19 + inpos - 1]) >>> (31 - 12) - | ((in[20 + inpos] - in[20 + inpos - 1]) << 12); - out[20 + outpos] = (in[20 + inpos] - in[20 + inpos - 1]) >>> (31 - 11) - | ((in[21 + inpos] - in[21 + inpos - 1]) << 11); - out[21 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (31 - 10) - | ((in[22 + inpos] - in[22 + inpos - 1]) << 10); - out[22 + outpos] = (in[22 + inpos] - in[22 + inpos - 1]) >>> (31 - 9) - | ((in[23 + inpos] - in[23 + inpos - 1]) << 9); - out[23 + outpos] = (in[23 + inpos] - in[23 + inpos - 1]) >>> (31 - 8) - | ((in[24 + inpos] - in[24 + inpos - 1]) << 8); - out[24 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (31 - 7) - | ((in[25 + inpos] - in[25 + inpos - 1]) << 7); - out[25 + outpos] = (in[25 + inpos] - in[25 + inpos - 1]) >>> (31 - 6) - | ((in[26 + inpos] - in[26 + inpos - 1]) << 6); - out[26 + outpos] = (in[26 + inpos] - in[26 + inpos - 1]) >>> (31 - 5) - | ((in[27 + inpos] - in[27 + inpos - 1]) << 5); - out[27 + outpos] = (in[27 + inpos] - in[27 + inpos - 1]) >>> (31 - 4) - | ((in[28 + inpos] - in[28 + inpos - 1]) << 4); - out[28 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (31 - 3) - | ((in[29 + inpos] - in[29 + inpos - 1]) << 3); - out[29 + outpos] = (in[29 + inpos] - in[29 + inpos - 1]) >>> (31 - 2) - | ((in[30 + inpos] - in[30 + inpos - 1]) << 2); - out[30 + outpos] = (in[30 + inpos] - in[30 + inpos - 1]) >>> (31 - 1) - | ((in[31 + inpos] - in[31 + inpos - 1]) << 1); - } - - protected static void integratedunpack1(final int initoffset, - final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 1)) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 1) & 1)) - + out[1 + outpos - 1]; - out[2 + outpos] = (((in[0 + inpos] >>> 2) & 1)) - + out[2 + outpos - 1]; - out[3 + outpos] = (((in[0 + inpos] >>> 3) & 1)) - + out[3 + outpos - 1]; - out[4 + outpos] = (((in[0 + inpos] >>> 4) & 1)) - + out[4 + outpos - 1]; - out[5 + outpos] = (((in[0 + inpos] >>> 5) & 1)) - + out[5 + outpos - 1]; - out[6 + outpos] = (((in[0 + inpos] >>> 6) & 1)) - + out[6 + outpos - 1]; - out[7 + outpos] = (((in[0 + inpos] >>> 7) & 1)) - + out[7 + outpos - 1]; - out[8 + outpos] = (((in[0 + inpos] >>> 8) & 1)) - + out[8 + outpos - 1]; - out[9 + outpos] = (((in[0 + inpos] >>> 9) & 1)) - + out[9 + outpos - 1]; - out[10 + outpos] = (((in[0 + inpos] >>> 10) & 1)) - + out[10 + outpos - 1]; - out[11 + outpos] = (((in[0 + inpos] >>> 11) & 1)) - + out[11 + outpos - 1]; - out[12 + outpos] = (((in[0 + inpos] >>> 12) & 1)) - + out[12 + outpos - 1]; - out[13 + outpos] = (((in[0 + inpos] >>> 13) & 1)) - + out[13 + outpos - 1]; - out[14 + outpos] = (((in[0 + inpos] >>> 14) & 1)) - + out[14 + outpos - 1]; - out[15 + outpos] = (((in[0 + inpos] >>> 15) & 1)) - + out[15 + outpos - 1]; - out[16 + outpos] = (((in[0 + inpos] >>> 16) & 1)) - + out[16 + outpos - 1]; - out[17 + outpos] = (((in[0 + inpos] >>> 17) & 1)) - + out[17 + outpos - 1]; - out[18 + outpos] = (((in[0 + inpos] >>> 18) & 1)) - + out[18 + outpos - 1]; - out[19 + outpos] = (((in[0 + inpos] >>> 19) & 1)) - + out[19 + outpos - 1]; - out[20 + outpos] = (((in[0 + inpos] >>> 20) & 1)) - + out[20 + outpos - 1]; - out[21 + outpos] = (((in[0 + inpos] >>> 21) & 1)) - + out[21 + outpos - 1]; - out[22 + outpos] = (((in[0 + inpos] >>> 22) & 1)) - + out[22 + outpos - 1]; - out[23 + outpos] = (((in[0 + inpos] >>> 23) & 1)) - + out[23 + outpos - 1]; - out[24 + outpos] = (((in[0 + inpos] >>> 24) & 1)) - + out[24 + outpos - 1]; - out[25 + outpos] = (((in[0 + inpos] >>> 25) & 1)) - + out[25 + outpos - 1]; - out[26 + outpos] = (((in[0 + inpos] >>> 26) & 1)) - + out[26 + outpos - 1]; - out[27 + outpos] = (((in[0 + inpos] >>> 27) & 1)) - + out[27 + outpos - 1]; - out[28 + outpos] = (((in[0 + inpos] >>> 28) & 1)) - + out[28 + outpos - 1]; - out[29 + outpos] = (((in[0 + inpos] >>> 29) & 1)) - + out[29 + outpos - 1]; - out[30 + outpos] = (((in[0 + inpos] >>> 30) & 1)) - + out[30 + outpos - 1]; - out[31 + outpos] = ((in[0 + inpos] >>> 31)) - + out[31 + outpos - 1]; + | ((in[1 + inpos] - in[1 + inpos - 1]) << 9) + | ((in[2 + inpos] - in[2 + inpos - 1]) << 18) + | ((in[3 + inpos] - in[3 + inpos - 1]) << 27); + out[1 + outpos] = (in[3 + inpos] - in[3 + inpos - 1]) >>> (9 - 4) + | ((in[4 + inpos] - in[4 + inpos - 1]) << 4) + | ((in[5 + inpos] - in[5 + inpos - 1]) << 13) + | ((in[6 + inpos] - in[6 + inpos - 1]) << 22) + | ((in[7 + inpos] - in[7 + inpos - 1]) << 31); + out[2 + outpos] = (in[7 + inpos] - in[7 + inpos - 1]) >>> (9 - 8) + | ((in[8 + inpos] - in[8 + inpos - 1]) << 8) + | ((in[9 + inpos] - in[9 + inpos - 1]) << 17) + | ((in[10 + inpos] - in[10 + inpos - 1]) << 26); + out[3 + outpos] = (in[10 + inpos] - in[10 + inpos - 1]) >>> (9 - 3) + | ((in[11 + inpos] - in[11 + inpos - 1]) << 3) + | ((in[12 + inpos] - in[12 + inpos - 1]) << 12) + | ((in[13 + inpos] - in[13 + inpos - 1]) << 21) + | ((in[14 + inpos] - in[14 + inpos - 1]) << 30); + out[4 + outpos] = (in[14 + inpos] - in[14 + inpos - 1]) >>> (9 - 7) + | ((in[15 + inpos] - in[15 + inpos - 1]) << 7) + | ((in[16 + inpos] - in[16 + inpos - 1]) << 16) + | ((in[17 + inpos] - in[17 + inpos - 1]) << 25); + out[5 + outpos] = (in[17 + inpos] - in[17 + inpos - 1]) >>> (9 - 2) + | ((in[18 + inpos] - in[18 + inpos - 1]) << 2) + | ((in[19 + inpos] - in[19 + inpos - 1]) << 11) + | ((in[20 + inpos] - in[20 + inpos - 1]) << 20) + | ((in[21 + inpos] - in[21 + inpos - 1]) << 29); + out[6 + outpos] = (in[21 + inpos] - in[21 + inpos - 1]) >>> (9 - 6) + | ((in[22 + inpos] - in[22 + inpos - 1]) << 6) + | ((in[23 + inpos] - in[23 + inpos - 1]) << 15) + | ((in[24 + inpos] - in[24 + inpos - 1]) << 24); + out[7 + outpos] = (in[24 + inpos] - in[24 + inpos - 1]) >>> (9 - 1) + | ((in[25 + inpos] - in[25 + inpos - 1]) << 1) + | ((in[26 + inpos] - in[26 + inpos - 1]) << 10) + | ((in[27 + inpos] - in[27 + inpos - 1]) << 19) + | ((in[28 + inpos] - in[28 + inpos - 1]) << 28); + out[8 + outpos] = (in[28 + inpos] - in[28 + inpos - 1]) >>> (9 - 5) + | ((in[29 + inpos] - in[29 + inpos - 1]) << 5) + | ((in[30 + inpos] - in[30 + inpos - 1]) << 14) + | ((in[31 + inpos] - in[31 + inpos - 1]) << 23); } - protected static void integratedunpack2(final int initoffset, - final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 3)) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 2) & 3)) - + out[1 + outpos - 1]; - out[2 + outpos] = (((in[0 + inpos] >>> 4) & 3)) + /** + * Unpack 32 integers along with prefix sum computation + * + * @param initoffset value to add to all outputted values + * @param in source array + * @param inpos initial position in source array + * @param out output array + * @param outpos initial position in output array + * @param bit number of bits to use per integer + */ + public static void integratedunpack(final int initoffset, + final int[] in, final int inpos, final int[] out, final int outpos, + final int bit) { + switch (bit) { + case 0: + integratedunpack0(initoffset, in, inpos, out, outpos); + break; + case 1: + integratedunpack1(initoffset, in, inpos, out, outpos); + break; + case 2: + integratedunpack2(initoffset, in, inpos, out, outpos); + break; + case 3: + integratedunpack3(initoffset, in, inpos, out, outpos); + break; + case 4: + integratedunpack4(initoffset, in, inpos, out, outpos); + break; + case 5: + integratedunpack5(initoffset, in, inpos, out, outpos); + break; + case 6: + integratedunpack6(initoffset, in, inpos, out, outpos); + break; + case 7: + integratedunpack7(initoffset, in, inpos, out, outpos); + break; + case 8: + integratedunpack8(initoffset, in, inpos, out, outpos); + break; + case 9: + integratedunpack9(initoffset, in, inpos, out, outpos); + break; + case 10: + integratedunpack10(initoffset, in, inpos, out, outpos); + break; + case 11: + integratedunpack11(initoffset, in, inpos, out, outpos); + break; + case 12: + integratedunpack12(initoffset, in, inpos, out, outpos); + break; + case 13: + integratedunpack13(initoffset, in, inpos, out, outpos); + break; + case 14: + integratedunpack14(initoffset, in, inpos, out, outpos); + break; + case 15: + integratedunpack15(initoffset, in, inpos, out, outpos); + break; + case 16: + integratedunpack16(initoffset, in, inpos, out, outpos); + break; + case 17: + integratedunpack17(initoffset, in, inpos, out, outpos); + break; + case 18: + integratedunpack18(initoffset, in, inpos, out, outpos); + break; + case 19: + integratedunpack19(initoffset, in, inpos, out, outpos); + break; + case 20: + integratedunpack20(initoffset, in, inpos, out, outpos); + break; + case 21: + integratedunpack21(initoffset, in, inpos, out, outpos); + break; + case 22: + integratedunpack22(initoffset, in, inpos, out, outpos); + break; + case 23: + integratedunpack23(initoffset, in, inpos, out, outpos); + break; + case 24: + integratedunpack24(initoffset, in, inpos, out, outpos); + break; + case 25: + integratedunpack25(initoffset, in, inpos, out, outpos); + break; + case 26: + integratedunpack26(initoffset, in, inpos, out, outpos); + break; + case 27: + integratedunpack27(initoffset, in, inpos, out, outpos); + break; + case 28: + integratedunpack28(initoffset, in, inpos, out, outpos); + break; + case 29: + integratedunpack29(initoffset, in, inpos, out, outpos); + break; + case 30: + integratedunpack30(initoffset, in, inpos, out, outpos); + break; + case 31: + integratedunpack31(initoffset, in, inpos, out, outpos); + break; + case 32: + integratedunpack32(initoffset, in, inpos, out, outpos); + break; + default: + throw new IllegalArgumentException( + "Unsupported bit width."); + } + } + + protected static void integratedunpack0(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + Arrays.fill(out, outpos, outpos + 32, initoffset); + } + + protected static void integratedunpack1(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 1)) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 1) & 1)) + + out[1 + outpos - 1]; + out[2 + outpos] = (((in[0 + inpos] >>> 2) & 1)) + out[2 + outpos - 1]; - out[3 + outpos] = (((in[0 + inpos] >>> 6) & 3)) + out[3 + outpos] = (((in[0 + inpos] >>> 3) & 1)) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[0 + inpos] >>> 8) & 3)) + out[4 + outpos] = (((in[0 + inpos] >>> 4) & 1)) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[0 + inpos] >>> 10) & 3)) + out[5 + outpos] = (((in[0 + inpos] >>> 5) & 1)) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[0 + inpos] >>> 12) & 3)) + out[6 + outpos] = (((in[0 + inpos] >>> 6) & 1)) + out[6 + outpos - 1]; - out[7 + outpos] = (((in[0 + inpos] >>> 14) & 3)) + out[7 + outpos] = (((in[0 + inpos] >>> 7) & 1)) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[0 + inpos] >>> 16) & 3)) + out[8 + outpos] = (((in[0 + inpos] >>> 8) & 1)) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[0 + inpos] >>> 18) & 3)) + out[9 + outpos] = (((in[0 + inpos] >>> 9) & 1)) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[0 + inpos] >>> 20) & 3)) + out[10 + outpos] = (((in[0 + inpos] >>> 10) & 1)) + out[10 + outpos - 1]; - out[11 + outpos] = (((in[0 + inpos] >>> 22) & 3)) + out[11 + outpos] = (((in[0 + inpos] >>> 11) & 1)) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[0 + inpos] >>> 24) & 3)) + out[12 + outpos] = (((in[0 + inpos] >>> 12) & 1)) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[0 + inpos] >>> 26) & 3)) + out[13 + outpos] = (((in[0 + inpos] >>> 13) & 1)) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[0 + inpos] >>> 28) & 3)) + out[14 + outpos] = (((in[0 + inpos] >>> 14) & 1)) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[0 + inpos] >>> 30)) + out[15 + outpos] = (((in[0 + inpos] >>> 15) & 1)) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[1 + inpos] >>> 0) & 3)) + out[16 + outpos] = (((in[0 + inpos] >>> 16) & 1)) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[1 + inpos] >>> 2) & 3)) + out[17 + outpos] = (((in[0 + inpos] >>> 17) & 1)) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[1 + inpos] >>> 4) & 3)) + out[18 + outpos] = (((in[0 + inpos] >>> 18) & 1)) + out[18 + outpos - 1]; - out[19 + outpos] = (((in[1 + inpos] >>> 6) & 3)) + out[19 + outpos] = (((in[0 + inpos] >>> 19) & 1)) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[1 + inpos] >>> 8) & 3)) + out[20 + outpos] = (((in[0 + inpos] >>> 20) & 1)) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[1 + inpos] >>> 10) & 3)) + out[21 + outpos] = (((in[0 + inpos] >>> 21) & 1)) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[1 + inpos] >>> 12) & 3)) + out[22 + outpos] = (((in[0 + inpos] >>> 22) & 1)) + out[22 + outpos - 1]; - out[23 + outpos] = (((in[1 + inpos] >>> 14) & 3)) + out[23 + outpos] = (((in[0 + inpos] >>> 23) & 1)) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[1 + inpos] >>> 16) & 3)) + out[24 + outpos] = (((in[0 + inpos] >>> 24) & 1)) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[1 + inpos] >>> 18) & 3)) + out[25 + outpos] = (((in[0 + inpos] >>> 25) & 1)) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[1 + inpos] >>> 20) & 3)) + out[26 + outpos] = (((in[0 + inpos] >>> 26) & 1)) + out[26 + outpos - 1]; - out[27 + outpos] = (((in[1 + inpos] >>> 22) & 3)) + out[27 + outpos] = (((in[0 + inpos] >>> 27) & 1)) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[1 + inpos] >>> 24) & 3)) + out[28 + outpos] = (((in[0 + inpos] >>> 28) & 1)) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[1 + inpos] >>> 26) & 3)) + out[29 + outpos] = (((in[0 + inpos] >>> 29) & 1)) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[1 + inpos] >>> 28) & 3)) + out[30 + outpos] = (((in[0 + inpos] >>> 30) & 1)) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[1 + inpos] >>> 30)) + out[31 + outpos] = ((in[0 + inpos] >>> 31)) + out[31 + outpos - 1]; } - protected static void integratedunpack3(final int initoffset, + protected static void integratedunpack10(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 7)) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 3) & 7)) + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 1023)) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 10) & 1023)) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[0 + inpos] >>> 6) & 7)) + out[2 + outpos] = (((in[0 + inpos] >>> 20) & 1023)) + out[2 + outpos - 1]; - out[3 + outpos] = (((in[0 + inpos] >>> 9) & 7)) + out[3 + outpos] = ((in[0 + inpos] >>> 30) | ((in[1 + inpos] & 255) << (10 - 8))) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[0 + inpos] >>> 12) & 7)) + out[4 + outpos] = (((in[1 + inpos] >>> 8) & 1023)) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[0 + inpos] >>> 15) & 7)) + out[5 + outpos] = (((in[1 + inpos] >>> 18) & 1023)) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[0 + inpos] >>> 18) & 7)) + out[6 + outpos] = ((in[1 + inpos] >>> 28) | ((in[2 + inpos] & 63) << (10 - 6))) + out[6 + outpos - 1]; - out[7 + outpos] = (((in[0 + inpos] >>> 21) & 7)) + out[7 + outpos] = (((in[2 + inpos] >>> 6) & 1023)) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[0 + inpos] >>> 24) & 7)) + out[8 + outpos] = (((in[2 + inpos] >>> 16) & 1023)) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[0 + inpos] >>> 27) & 7)) + out[9 + outpos] = ((in[2 + inpos] >>> 26) | ((in[3 + inpos] & 15) << (10 - 4))) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[0 + inpos] >>> 30) | ((in[1 + inpos] & 1) << (3 - 1))) + out[10 + outpos] = (((in[3 + inpos] >>> 4) & 1023)) + out[10 + outpos - 1]; - out[11 + outpos] = (((in[1 + inpos] >>> 1) & 7)) + out[11 + outpos] = (((in[3 + inpos] >>> 14) & 1023)) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[1 + inpos] >>> 4) & 7)) + out[12 + outpos] = ((in[3 + inpos] >>> 24) | ((in[4 + inpos] & 3) << (10 - 2))) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[1 + inpos] >>> 7) & 7)) + out[13 + outpos] = (((in[4 + inpos] >>> 2) & 1023)) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[1 + inpos] >>> 10) & 7)) + out[14 + outpos] = (((in[4 + inpos] >>> 12) & 1023)) + out[14 + outpos - 1]; - out[15 + outpos] = (((in[1 + inpos] >>> 13) & 7)) + out[15 + outpos] = ((in[4 + inpos] >>> 22)) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[1 + inpos] >>> 16) & 7)) + out[16 + outpos] = (((in[5 + inpos] >>> 0) & 1023)) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[1 + inpos] >>> 19) & 7)) + out[17 + outpos] = (((in[5 + inpos] >>> 10) & 1023)) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[1 + inpos] >>> 22) & 7)) + out[18 + outpos] = (((in[5 + inpos] >>> 20) & 1023)) + out[18 + outpos - 1]; - out[19 + outpos] = (((in[1 + inpos] >>> 25) & 7)) + out[19 + outpos] = ((in[5 + inpos] >>> 30) | ((in[6 + inpos] & 255) << (10 - 8))) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[1 + inpos] >>> 28) & 7)) + out[20 + outpos] = (((in[6 + inpos] >>> 8) & 1023)) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[1 + inpos] >>> 31) | ((in[2 + inpos] & 3) << (3 - 2))) + out[21 + outpos] = (((in[6 + inpos] >>> 18) & 1023)) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[2 + inpos] >>> 2) & 7)) + out[22 + outpos] = ((in[6 + inpos] >>> 28) | ((in[7 + inpos] & 63) << (10 - 6))) + out[22 + outpos - 1]; - out[23 + outpos] = (((in[2 + inpos] >>> 5) & 7)) + out[23 + outpos] = (((in[7 + inpos] >>> 6) & 1023)) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[2 + inpos] >>> 8) & 7)) + out[24 + outpos] = (((in[7 + inpos] >>> 16) & 1023)) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[2 + inpos] >>> 11) & 7)) + out[25 + outpos] = ((in[7 + inpos] >>> 26) | ((in[8 + inpos] & 15) << (10 - 4))) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[2 + inpos] >>> 14) & 7)) + out[26 + outpos] = (((in[8 + inpos] >>> 4) & 1023)) + out[26 + outpos - 1]; - out[27 + outpos] = (((in[2 + inpos] >>> 17) & 7)) + out[27 + outpos] = (((in[8 + inpos] >>> 14) & 1023)) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[2 + inpos] >>> 20) & 7)) + out[28 + outpos] = ((in[8 + inpos] >>> 24) | ((in[9 + inpos] & 3) << (10 - 2))) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[2 + inpos] >>> 23) & 7)) + out[29 + outpos] = (((in[9 + inpos] >>> 2) & 1023)) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[2 + inpos] >>> 26) & 7)) + out[30 + outpos] = (((in[9 + inpos] >>> 12) & 1023)) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[2 + inpos] >>> 29)) + out[31 + outpos] = ((in[9 + inpos] >>> 22)) + out[31 + outpos - 1]; } - protected static void integratedunpack4(final int initoffset, + protected static void integratedunpack11(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 15)) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 4) & 15)) + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 2047)) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 11) & 2047)) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[0 + inpos] >>> 8) & 15)) + out[2 + outpos] = ((in[0 + inpos] >>> 22) | ((in[1 + inpos] & 1) << (11 - 1))) + out[2 + outpos - 1]; - out[3 + outpos] = (((in[0 + inpos] >>> 12) & 15)) + out[3 + outpos] = (((in[1 + inpos] >>> 1) & 2047)) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[0 + inpos] >>> 16) & 15)) + out[4 + outpos] = (((in[1 + inpos] >>> 12) & 2047)) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[0 + inpos] >>> 20) & 15)) + out[5 + outpos] = ((in[1 + inpos] >>> 23) | ((in[2 + inpos] & 3) << (11 - 2))) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[0 + inpos] >>> 24) & 15)) + out[6 + outpos] = (((in[2 + inpos] >>> 2) & 2047)) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[0 + inpos] >>> 28)) + out[7 + outpos] = (((in[2 + inpos] >>> 13) & 2047)) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[1 + inpos] >>> 0) & 15)) + out[8 + outpos] = ((in[2 + inpos] >>> 24) | ((in[3 + inpos] & 7) << (11 - 3))) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[1 + inpos] >>> 4) & 15)) + out[9 + outpos] = (((in[3 + inpos] >>> 3) & 2047)) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[1 + inpos] >>> 8) & 15)) + out[10 + outpos] = (((in[3 + inpos] >>> 14) & 2047)) + out[10 + outpos - 1]; - out[11 + outpos] = (((in[1 + inpos] >>> 12) & 15)) + out[11 + outpos] = ((in[3 + inpos] >>> 25) | ((in[4 + inpos] & 15) << (11 - 4))) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[1 + inpos] >>> 16) & 15)) + out[12 + outpos] = (((in[4 + inpos] >>> 4) & 2047)) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[1 + inpos] >>> 20) & 15)) + out[13 + outpos] = (((in[4 + inpos] >>> 15) & 2047)) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[1 + inpos] >>> 24) & 15)) + out[14 + outpos] = ((in[4 + inpos] >>> 26) | ((in[5 + inpos] & 31) << (11 - 5))) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[1 + inpos] >>> 28)) + out[15 + outpos] = (((in[5 + inpos] >>> 5) & 2047)) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[2 + inpos] >>> 0) & 15)) + out[16 + outpos] = (((in[5 + inpos] >>> 16) & 2047)) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[2 + inpos] >>> 4) & 15)) + out[17 + outpos] = ((in[5 + inpos] >>> 27) | ((in[6 + inpos] & 63) << (11 - 6))) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[2 + inpos] >>> 8) & 15)) + out[18 + outpos] = (((in[6 + inpos] >>> 6) & 2047)) + out[18 + outpos - 1]; - out[19 + outpos] = (((in[2 + inpos] >>> 12) & 15)) + out[19 + outpos] = (((in[6 + inpos] >>> 17) & 2047)) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[2 + inpos] >>> 16) & 15)) + out[20 + outpos] = ((in[6 + inpos] >>> 28) | ((in[7 + inpos] & 127) << (11 - 7))) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[2 + inpos] >>> 20) & 15)) + out[21 + outpos] = (((in[7 + inpos] >>> 7) & 2047)) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[2 + inpos] >>> 24) & 15)) + out[22 + outpos] = (((in[7 + inpos] >>> 18) & 2047)) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[2 + inpos] >>> 28)) + out[23 + outpos] = ((in[7 + inpos] >>> 29) | ((in[8 + inpos] & 255) << (11 - 8))) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[3 + inpos] >>> 0) & 15)) + out[24 + outpos] = (((in[8 + inpos] >>> 8) & 2047)) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[3 + inpos] >>> 4) & 15)) + out[25 + outpos] = (((in[8 + inpos] >>> 19) & 2047)) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[3 + inpos] >>> 8) & 15)) + out[26 + outpos] = ((in[8 + inpos] >>> 30) | ((in[9 + inpos] & 511) << (11 - 9))) + out[26 + outpos - 1]; - out[27 + outpos] = (((in[3 + inpos] >>> 12) & 15)) + out[27 + outpos] = (((in[9 + inpos] >>> 9) & 2047)) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[3 + inpos] >>> 16) & 15)) + out[28 + outpos] = (((in[9 + inpos] >>> 20) & 2047)) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[3 + inpos] >>> 20) & 15)) + out[29 + outpos] = ((in[9 + inpos] >>> 31) | ((in[10 + inpos] & 1023) << (11 - 10))) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[3 + inpos] >>> 24) & 15)) + out[30 + outpos] = (((in[10 + inpos] >>> 10) & 2047)) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[3 + inpos] >>> 28)) + out[31 + outpos] = ((in[10 + inpos] >>> 21)) + out[31 + outpos - 1]; } - protected static void integratedunpack5(final int initoffset, + protected static void integratedunpack12(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 31)) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 5) & 31)) + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 4095)) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 12) & 4095)) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[0 + inpos] >>> 10) & 31)) + out[2 + outpos] = ((in[0 + inpos] >>> 24) | ((in[1 + inpos] & 15) << (12 - 4))) + out[2 + outpos - 1]; - out[3 + outpos] = (((in[0 + inpos] >>> 15) & 31)) + out[3 + outpos] = (((in[1 + inpos] >>> 4) & 4095)) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[0 + inpos] >>> 20) & 31)) + out[4 + outpos] = (((in[1 + inpos] >>> 16) & 4095)) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[0 + inpos] >>> 25) & 31)) + out[5 + outpos] = ((in[1 + inpos] >>> 28) | ((in[2 + inpos] & 255) << (12 - 8))) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[0 + inpos] >>> 30) | ((in[1 + inpos] & 7) << (5 - 3))) + out[6 + outpos] = (((in[2 + inpos] >>> 8) & 4095)) + out[6 + outpos - 1]; - out[7 + outpos] = (((in[1 + inpos] >>> 3) & 31)) + out[7 + outpos] = ((in[2 + inpos] >>> 20)) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[1 + inpos] >>> 8) & 31)) + out[8 + outpos] = (((in[3 + inpos] >>> 0) & 4095)) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[1 + inpos] >>> 13) & 31)) + out[9 + outpos] = (((in[3 + inpos] >>> 12) & 4095)) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[1 + inpos] >>> 18) & 31)) + out[10 + outpos] = ((in[3 + inpos] >>> 24) | ((in[4 + inpos] & 15) << (12 - 4))) + out[10 + outpos - 1]; - out[11 + outpos] = (((in[1 + inpos] >>> 23) & 31)) + out[11 + outpos] = (((in[4 + inpos] >>> 4) & 4095)) + out[11 + outpos - 1]; - out[12 + outpos] = ((in[1 + inpos] >>> 28) | ((in[2 + inpos] & 1) << (5 - 1))) + out[12 + outpos] = (((in[4 + inpos] >>> 16) & 4095)) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[2 + inpos] >>> 1) & 31)) + out[13 + outpos] = ((in[4 + inpos] >>> 28) | ((in[5 + inpos] & 255) << (12 - 8))) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[2 + inpos] >>> 6) & 31)) + out[14 + outpos] = (((in[5 + inpos] >>> 8) & 4095)) + out[14 + outpos - 1]; - out[15 + outpos] = (((in[2 + inpos] >>> 11) & 31)) + out[15 + outpos] = ((in[5 + inpos] >>> 20)) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[2 + inpos] >>> 16) & 31)) + out[16 + outpos] = (((in[6 + inpos] >>> 0) & 4095)) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[2 + inpos] >>> 21) & 31)) + out[17 + outpos] = (((in[6 + inpos] >>> 12) & 4095)) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[2 + inpos] >>> 26) & 31)) + out[18 + outpos] = ((in[6 + inpos] >>> 24) | ((in[7 + inpos] & 15) << (12 - 4))) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[2 + inpos] >>> 31) | ((in[3 + inpos] & 15) << (5 - 4))) + out[19 + outpos] = (((in[7 + inpos] >>> 4) & 4095)) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[3 + inpos] >>> 4) & 31)) + out[20 + outpos] = (((in[7 + inpos] >>> 16) & 4095)) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[3 + inpos] >>> 9) & 31)) + out[21 + outpos] = ((in[7 + inpos] >>> 28) | ((in[8 + inpos] & 255) << (12 - 8))) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[3 + inpos] >>> 14) & 31)) + out[22 + outpos] = (((in[8 + inpos] >>> 8) & 4095)) + out[22 + outpos - 1]; - out[23 + outpos] = (((in[3 + inpos] >>> 19) & 31)) + out[23 + outpos] = ((in[8 + inpos] >>> 20)) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[3 + inpos] >>> 24) & 31)) + out[24 + outpos] = (((in[9 + inpos] >>> 0) & 4095)) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[3 + inpos] >>> 29) | ((in[4 + inpos] & 3) << (5 - 2))) + out[25 + outpos] = (((in[9 + inpos] >>> 12) & 4095)) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[4 + inpos] >>> 2) & 31)) + out[26 + outpos] = ((in[9 + inpos] >>> 24) | ((in[10 + inpos] & 15) << (12 - 4))) + out[26 + outpos - 1]; - out[27 + outpos] = (((in[4 + inpos] >>> 7) & 31)) + out[27 + outpos] = (((in[10 + inpos] >>> 4) & 4095)) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[4 + inpos] >>> 12) & 31)) + out[28 + outpos] = (((in[10 + inpos] >>> 16) & 4095)) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[4 + inpos] >>> 17) & 31)) + out[29 + outpos] = ((in[10 + inpos] >>> 28) | ((in[11 + inpos] & 255) << (12 - 8))) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[4 + inpos] >>> 22) & 31)) + out[30 + outpos] = (((in[11 + inpos] >>> 8) & 4095)) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[4 + inpos] >>> 27)) + out[31 + outpos] = ((in[11 + inpos] >>> 20)) + out[31 + outpos - 1]; } - protected static void integratedunpack6(final int initoffset, + protected static void integratedunpack13(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 63)) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 6) & 63)) + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 8191)) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 13) & 8191)) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[0 + inpos] >>> 12) & 63)) + out[2 + outpos] = ((in[0 + inpos] >>> 26) | ((in[1 + inpos] & 127) << (13 - 7))) + out[2 + outpos - 1]; - out[3 + outpos] = (((in[0 + inpos] >>> 18) & 63)) + out[3 + outpos] = (((in[1 + inpos] >>> 7) & 8191)) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[0 + inpos] >>> 24) & 63)) + out[4 + outpos] = ((in[1 + inpos] >>> 20) | ((in[2 + inpos] & 1) << (13 - 1))) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[0 + inpos] >>> 30) | ((in[1 + inpos] & 15) << (6 - 4))) + out[5 + outpos] = (((in[2 + inpos] >>> 1) & 8191)) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[1 + inpos] >>> 4) & 63)) + out[6 + outpos] = (((in[2 + inpos] >>> 14) & 8191)) + out[6 + outpos - 1]; - out[7 + outpos] = (((in[1 + inpos] >>> 10) & 63)) + out[7 + outpos] = ((in[2 + inpos] >>> 27) | ((in[3 + inpos] & 255) << (13 - 8))) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[1 + inpos] >>> 16) & 63)) + out[8 + outpos] = (((in[3 + inpos] >>> 8) & 8191)) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[1 + inpos] >>> 22) & 63)) + out[9 + outpos] = ((in[3 + inpos] >>> 21) | ((in[4 + inpos] & 3) << (13 - 2))) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[1 + inpos] >>> 28) | ((in[2 + inpos] & 3) << (6 - 2))) + out[10 + outpos] = (((in[4 + inpos] >>> 2) & 8191)) + out[10 + outpos - 1]; - out[11 + outpos] = (((in[2 + inpos] >>> 2) & 63)) + out[11 + outpos] = (((in[4 + inpos] >>> 15) & 8191)) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[2 + inpos] >>> 8) & 63)) + out[12 + outpos] = ((in[4 + inpos] >>> 28) | ((in[5 + inpos] & 511) << (13 - 9))) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[2 + inpos] >>> 14) & 63)) + out[13 + outpos] = (((in[5 + inpos] >>> 9) & 8191)) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[2 + inpos] >>> 20) & 63)) + out[14 + outpos] = ((in[5 + inpos] >>> 22) | ((in[6 + inpos] & 7) << (13 - 3))) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[2 + inpos] >>> 26)) + out[15 + outpos] = (((in[6 + inpos] >>> 3) & 8191)) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[3 + inpos] >>> 0) & 63)) + out[16 + outpos] = (((in[6 + inpos] >>> 16) & 8191)) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[3 + inpos] >>> 6) & 63)) + out[17 + outpos] = ((in[6 + inpos] >>> 29) | ((in[7 + inpos] & 1023) << (13 - 10))) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[3 + inpos] >>> 12) & 63)) + out[18 + outpos] = (((in[7 + inpos] >>> 10) & 8191)) + out[18 + outpos - 1]; - out[19 + outpos] = (((in[3 + inpos] >>> 18) & 63)) + out[19 + outpos] = ((in[7 + inpos] >>> 23) | ((in[8 + inpos] & 15) << (13 - 4))) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[3 + inpos] >>> 24) & 63)) + out[20 + outpos] = (((in[8 + inpos] >>> 4) & 8191)) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[3 + inpos] >>> 30) | ((in[4 + inpos] & 15) << (6 - 4))) + out[21 + outpos] = (((in[8 + inpos] >>> 17) & 8191)) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[4 + inpos] >>> 4) & 63)) + out[22 + outpos] = ((in[8 + inpos] >>> 30) | ((in[9 + inpos] & 2047) << (13 - 11))) + out[22 + outpos - 1]; - out[23 + outpos] = (((in[4 + inpos] >>> 10) & 63)) + out[23 + outpos] = (((in[9 + inpos] >>> 11) & 8191)) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[4 + inpos] >>> 16) & 63)) + out[24 + outpos] = ((in[9 + inpos] >>> 24) | ((in[10 + inpos] & 31) << (13 - 5))) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[4 + inpos] >>> 22) & 63)) + out[25 + outpos] = (((in[10 + inpos] >>> 5) & 8191)) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[4 + inpos] >>> 28) | ((in[5 + inpos] & 3) << (6 - 2))) + out[26 + outpos] = (((in[10 + inpos] >>> 18) & 8191)) + out[26 + outpos - 1]; - out[27 + outpos] = (((in[5 + inpos] >>> 2) & 63)) + out[27 + outpos] = ((in[10 + inpos] >>> 31) | ((in[11 + inpos] & 4095) << (13 - 12))) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[5 + inpos] >>> 8) & 63)) + out[28 + outpos] = (((in[11 + inpos] >>> 12) & 8191)) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[5 + inpos] >>> 14) & 63)) + out[29 + outpos] = ((in[11 + inpos] >>> 25) | ((in[12 + inpos] & 63) << (13 - 6))) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[5 + inpos] >>> 20) & 63)) + out[30 + outpos] = (((in[12 + inpos] >>> 6) & 8191)) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[5 + inpos] >>> 26)) + out[31 + outpos] = ((in[12 + inpos] >>> 19)) + out[31 + outpos - 1]; } - protected static void integratedunpack7(final int initoffset, + protected static void integratedunpack14(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 127)) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 7) & 127)) + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 16383)) + + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 14) & 16383)) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[0 + inpos] >>> 14) & 127)) + out[2 + outpos] = ((in[0 + inpos] >>> 28) | ((in[1 + inpos] & 1023) << (14 - 10))) + out[2 + outpos - 1]; - out[3 + outpos] = (((in[0 + inpos] >>> 21) & 127)) + out[3 + outpos] = (((in[1 + inpos] >>> 10) & 16383)) + out[3 + outpos - 1]; - out[4 + outpos] = ((in[0 + inpos] >>> 28) | ((in[1 + inpos] & 7) << (7 - 3))) + out[4 + outpos] = ((in[1 + inpos] >>> 24) | ((in[2 + inpos] & 63) << (14 - 6))) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[1 + inpos] >>> 3) & 127)) + out[5 + outpos] = (((in[2 + inpos] >>> 6) & 16383)) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[1 + inpos] >>> 10) & 127)) + out[6 + outpos] = ((in[2 + inpos] >>> 20) | ((in[3 + inpos] & 3) << (14 - 2))) + out[6 + outpos - 1]; - out[7 + outpos] = (((in[1 + inpos] >>> 17) & 127)) + out[7 + outpos] = (((in[3 + inpos] >>> 2) & 16383)) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[1 + inpos] >>> 24) & 127)) + out[8 + outpos] = (((in[3 + inpos] >>> 16) & 16383)) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[1 + inpos] >>> 31) | ((in[2 + inpos] & 63) << (7 - 6))) + out[9 + outpos] = ((in[3 + inpos] >>> 30) | ((in[4 + inpos] & 4095) << (14 - 12))) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[2 + inpos] >>> 6) & 127)) + out[10 + outpos] = (((in[4 + inpos] >>> 12) & 16383)) + out[10 + outpos - 1]; - out[11 + outpos] = (((in[2 + inpos] >>> 13) & 127)) + out[11 + outpos] = ((in[4 + inpos] >>> 26) | ((in[5 + inpos] & 255) << (14 - 8))) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[2 + inpos] >>> 20) & 127)) + out[12 + outpos] = (((in[5 + inpos] >>> 8) & 16383)) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[2 + inpos] >>> 27) | ((in[3 + inpos] & 3) << (7 - 2))) + out[13 + outpos] = ((in[5 + inpos] >>> 22) | ((in[6 + inpos] & 15) << (14 - 4))) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[3 + inpos] >>> 2) & 127)) + out[14 + outpos] = (((in[6 + inpos] >>> 4) & 16383)) + out[14 + outpos - 1]; - out[15 + outpos] = (((in[3 + inpos] >>> 9) & 127)) + out[15 + outpos] = ((in[6 + inpos] >>> 18)) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[3 + inpos] >>> 16) & 127)) + out[16 + outpos] = (((in[7 + inpos] >>> 0) & 16383)) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[3 + inpos] >>> 23) & 127)) + out[17 + outpos] = (((in[7 + inpos] >>> 14) & 16383)) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[3 + inpos] >>> 30) | ((in[4 + inpos] & 31) << (7 - 5))) + out[18 + outpos] = ((in[7 + inpos] >>> 28) | ((in[8 + inpos] & 1023) << (14 - 10))) + out[18 + outpos - 1]; - out[19 + outpos] = (((in[4 + inpos] >>> 5) & 127)) + out[19 + outpos] = (((in[8 + inpos] >>> 10) & 16383)) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[4 + inpos] >>> 12) & 127)) + out[20 + outpos] = ((in[8 + inpos] >>> 24) | ((in[9 + inpos] & 63) << (14 - 6))) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[4 + inpos] >>> 19) & 127)) + out[21 + outpos] = (((in[9 + inpos] >>> 6) & 16383)) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[4 + inpos] >>> 26) | ((in[5 + inpos] & 1) << (7 - 1))) + out[22 + outpos] = ((in[9 + inpos] >>> 20) | ((in[10 + inpos] & 3) << (14 - 2))) + out[22 + outpos - 1]; - out[23 + outpos] = (((in[5 + inpos] >>> 1) & 127)) + out[23 + outpos] = (((in[10 + inpos] >>> 2) & 16383)) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[5 + inpos] >>> 8) & 127)) + out[24 + outpos] = (((in[10 + inpos] >>> 16) & 16383)) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[5 + inpos] >>> 15) & 127)) + out[25 + outpos] = ((in[10 + inpos] >>> 30) | ((in[11 + inpos] & 4095) << (14 - 12))) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[5 + inpos] >>> 22) & 127)) + out[26 + outpos] = (((in[11 + inpos] >>> 12) & 16383)) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[5 + inpos] >>> 29) | ((in[6 + inpos] & 15) << (7 - 4))) + out[27 + outpos] = ((in[11 + inpos] >>> 26) | ((in[12 + inpos] & 255) << (14 - 8))) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[6 + inpos] >>> 4) & 127)) + out[28 + outpos] = (((in[12 + inpos] >>> 8) & 16383)) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[6 + inpos] >>> 11) & 127)) + out[29 + outpos] = ((in[12 + inpos] >>> 22) | ((in[13 + inpos] & 15) << (14 - 4))) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[6 + inpos] >>> 18) & 127)) + out[30 + outpos] = (((in[13 + inpos] >>> 4) & 16383)) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[6 + inpos] >>> 25)) + out[31 + outpos] = ((in[13 + inpos] >>> 18)) + out[31 + outpos - 1]; } - protected static void integratedunpack8(final int initoffset, + protected static void integratedunpack15(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 255)) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 8) & 255)) + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 32767)) + + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 15) & 32767)) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[0 + inpos] >>> 16) & 255)) + out[2 + outpos] = ((in[0 + inpos] >>> 30) | ((in[1 + inpos] & 8191) << (15 - 13))) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[0 + inpos] >>> 24)) + out[3 + outpos] = (((in[1 + inpos] >>> 13) & 32767)) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[1 + inpos] >>> 0) & 255)) + out[4 + outpos] = ((in[1 + inpos] >>> 28) | ((in[2 + inpos] & 2047) << (15 - 11))) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[1 + inpos] >>> 8) & 255)) + out[5 + outpos] = (((in[2 + inpos] >>> 11) & 32767)) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[1 + inpos] >>> 16) & 255)) + out[6 + outpos] = ((in[2 + inpos] >>> 26) | ((in[3 + inpos] & 511) << (15 - 9))) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[1 + inpos] >>> 24)) + out[7 + outpos] = (((in[3 + inpos] >>> 9) & 32767)) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[2 + inpos] >>> 0) & 255)) + out[8 + outpos] = ((in[3 + inpos] >>> 24) | ((in[4 + inpos] & 127) << (15 - 7))) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[2 + inpos] >>> 8) & 255)) + out[9 + outpos] = (((in[4 + inpos] >>> 7) & 32767)) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[2 + inpos] >>> 16) & 255)) + out[10 + outpos] = ((in[4 + inpos] >>> 22) | ((in[5 + inpos] & 31) << (15 - 5))) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[2 + inpos] >>> 24)) + out[11 + outpos] = (((in[5 + inpos] >>> 5) & 32767)) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[3 + inpos] >>> 0) & 255)) + out[12 + outpos] = ((in[5 + inpos] >>> 20) | ((in[6 + inpos] & 7) << (15 - 3))) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[3 + inpos] >>> 8) & 255)) + out[13 + outpos] = (((in[6 + inpos] >>> 3) & 32767)) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[3 + inpos] >>> 16) & 255)) + out[14 + outpos] = ((in[6 + inpos] >>> 18) | ((in[7 + inpos] & 1) << (15 - 1))) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[3 + inpos] >>> 24)) + out[15 + outpos] = (((in[7 + inpos] >>> 1) & 32767)) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[4 + inpos] >>> 0) & 255)) + out[16 + outpos] = (((in[7 + inpos] >>> 16) & 32767)) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[4 + inpos] >>> 8) & 255)) + out[17 + outpos] = ((in[7 + inpos] >>> 31) | ((in[8 + inpos] & 16383) << (15 - 14))) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[4 + inpos] >>> 16) & 255)) + out[18 + outpos] = (((in[8 + inpos] >>> 14) & 32767)) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[4 + inpos] >>> 24)) + out[19 + outpos] = ((in[8 + inpos] >>> 29) | ((in[9 + inpos] & 4095) << (15 - 12))) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[5 + inpos] >>> 0) & 255)) + out[20 + outpos] = (((in[9 + inpos] >>> 12) & 32767)) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[5 + inpos] >>> 8) & 255)) + out[21 + outpos] = ((in[9 + inpos] >>> 27) | ((in[10 + inpos] & 1023) << (15 - 10))) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[5 + inpos] >>> 16) & 255)) + out[22 + outpos] = (((in[10 + inpos] >>> 10) & 32767)) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[5 + inpos] >>> 24)) + out[23 + outpos] = ((in[10 + inpos] >>> 25) | ((in[11 + inpos] & 255) << (15 - 8))) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[6 + inpos] >>> 0) & 255)) + out[24 + outpos] = (((in[11 + inpos] >>> 8) & 32767)) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[6 + inpos] >>> 8) & 255)) + out[25 + outpos] = ((in[11 + inpos] >>> 23) | ((in[12 + inpos] & 63) << (15 - 6))) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[6 + inpos] >>> 16) & 255)) + out[26 + outpos] = (((in[12 + inpos] >>> 6) & 32767)) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[6 + inpos] >>> 24)) + out[27 + outpos] = ((in[12 + inpos] >>> 21) | ((in[13 + inpos] & 15) << (15 - 4))) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[7 + inpos] >>> 0) & 255)) + out[28 + outpos] = (((in[13 + inpos] >>> 4) & 32767)) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[7 + inpos] >>> 8) & 255)) + out[29 + outpos] = ((in[13 + inpos] >>> 19) | ((in[14 + inpos] & 3) << (15 - 2))) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[7 + inpos] >>> 16) & 255)) + out[30 + outpos] = (((in[14 + inpos] >>> 2) & 32767)) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[7 + inpos] >>> 24)) + out[31 + outpos] = ((in[14 + inpos] >>> 17)) + out[31 + outpos - 1]; } - protected static void integratedunpack9(final int initoffset, + protected static void integratedunpack16(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 511)) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 9) & 511)) + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 65535)) + + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 16)) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[0 + inpos] >>> 18) & 511)) + out[2 + outpos] = (((in[1 + inpos] >>> 0) & 65535)) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[0 + inpos] >>> 27) | ((in[1 + inpos] & 15) << (9 - 4))) + out[3 + outpos] = ((in[1 + inpos] >>> 16)) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[1 + inpos] >>> 4) & 511)) + out[4 + outpos] = (((in[2 + inpos] >>> 0) & 65535)) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[1 + inpos] >>> 13) & 511)) + out[5 + outpos] = ((in[2 + inpos] >>> 16)) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[1 + inpos] >>> 22) & 511)) + out[6 + outpos] = (((in[3 + inpos] >>> 0) & 65535)) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[1 + inpos] >>> 31) | ((in[2 + inpos] & 255) << (9 - 8))) + out[7 + outpos] = ((in[3 + inpos] >>> 16)) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[2 + inpos] >>> 8) & 511)) + out[8 + outpos] = (((in[4 + inpos] >>> 0) & 65535)) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[2 + inpos] >>> 17) & 511)) + out[9 + outpos] = ((in[4 + inpos] >>> 16)) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[2 + inpos] >>> 26) | ((in[3 + inpos] & 7) << (9 - 3))) + out[10 + outpos] = (((in[5 + inpos] >>> 0) & 65535)) + out[10 + outpos - 1]; - out[11 + outpos] = (((in[3 + inpos] >>> 3) & 511)) + out[11 + outpos] = ((in[5 + inpos] >>> 16)) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[3 + inpos] >>> 12) & 511)) + out[12 + outpos] = (((in[6 + inpos] >>> 0) & 65535)) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[3 + inpos] >>> 21) & 511)) + out[13 + outpos] = ((in[6 + inpos] >>> 16)) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[3 + inpos] >>> 30) | ((in[4 + inpos] & 127) << (9 - 7))) + out[14 + outpos] = (((in[7 + inpos] >>> 0) & 65535)) + out[14 + outpos - 1]; - out[15 + outpos] = (((in[4 + inpos] >>> 7) & 511)) + out[15 + outpos] = ((in[7 + inpos] >>> 16)) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[4 + inpos] >>> 16) & 511)) + out[16 + outpos] = (((in[8 + inpos] >>> 0) & 65535)) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[4 + inpos] >>> 25) | ((in[5 + inpos] & 3) << (9 - 2))) + out[17 + outpos] = ((in[8 + inpos] >>> 16)) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[5 + inpos] >>> 2) & 511)) + out[18 + outpos] = (((in[9 + inpos] >>> 0) & 65535)) + out[18 + outpos - 1]; - out[19 + outpos] = (((in[5 + inpos] >>> 11) & 511)) + out[19 + outpos] = ((in[9 + inpos] >>> 16)) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[5 + inpos] >>> 20) & 511)) + out[20 + outpos] = (((in[10 + inpos] >>> 0) & 65535)) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[5 + inpos] >>> 29) | ((in[6 + inpos] & 63) << (9 - 6))) + out[21 + outpos] = ((in[10 + inpos] >>> 16)) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[6 + inpos] >>> 6) & 511)) + out[22 + outpos] = (((in[11 + inpos] >>> 0) & 65535)) + out[22 + outpos - 1]; - out[23 + outpos] = (((in[6 + inpos] >>> 15) & 511)) + out[23 + outpos] = ((in[11 + inpos] >>> 16)) + out[23 + outpos - 1]; - out[24 + outpos] = ((in[6 + inpos] >>> 24) | ((in[7 + inpos] & 1) << (9 - 1))) + out[24 + outpos] = (((in[12 + inpos] >>> 0) & 65535)) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[7 + inpos] >>> 1) & 511)) + out[25 + outpos] = ((in[12 + inpos] >>> 16)) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[7 + inpos] >>> 10) & 511)) + out[26 + outpos] = (((in[13 + inpos] >>> 0) & 65535)) + out[26 + outpos - 1]; - out[27 + outpos] = (((in[7 + inpos] >>> 19) & 511)) + out[27 + outpos] = ((in[13 + inpos] >>> 16)) + out[27 + outpos - 1]; - out[28 + outpos] = ((in[7 + inpos] >>> 28) | ((in[8 + inpos] & 31) << (9 - 5))) + out[28 + outpos] = (((in[14 + inpos] >>> 0) & 65535)) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[8 + inpos] >>> 5) & 511)) + out[29 + outpos] = ((in[14 + inpos] >>> 16)) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[8 + inpos] >>> 14) & 511)) + out[30 + outpos] = (((in[15 + inpos] >>> 0) & 65535)) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[8 + inpos] >>> 23)) + out[31 + outpos] = ((in[15 + inpos] >>> 16)) + out[31 + outpos - 1]; } - protected static void integratedunpack10(final int initoffset, + protected static void integratedunpack17(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 1023)) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 10) & 1023)) + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 131071)) + + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 17) | ((in[1 + inpos] & 3) << (17 - 2))) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[0 + inpos] >>> 20) & 1023)) + out[2 + outpos] = (((in[1 + inpos] >>> 2) & 131071)) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[0 + inpos] >>> 30) | ((in[1 + inpos] & 255) << (10 - 8))) + out[3 + outpos] = ((in[1 + inpos] >>> 19) | ((in[2 + inpos] & 15) << (17 - 4))) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[1 + inpos] >>> 8) & 1023)) + out[4 + outpos] = (((in[2 + inpos] >>> 4) & 131071)) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[1 + inpos] >>> 18) & 1023)) + out[5 + outpos] = ((in[2 + inpos] >>> 21) | ((in[3 + inpos] & 63) << (17 - 6))) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[1 + inpos] >>> 28) | ((in[2 + inpos] & 63) << (10 - 6))) + out[6 + outpos] = (((in[3 + inpos] >>> 6) & 131071)) + out[6 + outpos - 1]; - out[7 + outpos] = (((in[2 + inpos] >>> 6) & 1023)) + out[7 + outpos] = ((in[3 + inpos] >>> 23) | ((in[4 + inpos] & 255) << (17 - 8))) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[2 + inpos] >>> 16) & 1023)) + out[8 + outpos] = (((in[4 + inpos] >>> 8) & 131071)) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[2 + inpos] >>> 26) | ((in[3 + inpos] & 15) << (10 - 4))) + out[9 + outpos] = ((in[4 + inpos] >>> 25) | ((in[5 + inpos] & 1023) << (17 - 10))) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[3 + inpos] >>> 4) & 1023)) + out[10 + outpos] = (((in[5 + inpos] >>> 10) & 131071)) + out[10 + outpos - 1]; - out[11 + outpos] = (((in[3 + inpos] >>> 14) & 1023)) + out[11 + outpos] = ((in[5 + inpos] >>> 27) | ((in[6 + inpos] & 4095) << (17 - 12))) + out[11 + outpos - 1]; - out[12 + outpos] = ((in[3 + inpos] >>> 24) | ((in[4 + inpos] & 3) << (10 - 2))) + out[12 + outpos] = (((in[6 + inpos] >>> 12) & 131071)) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[4 + inpos] >>> 2) & 1023)) + out[13 + outpos] = ((in[6 + inpos] >>> 29) | ((in[7 + inpos] & 16383) << (17 - 14))) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[4 + inpos] >>> 12) & 1023)) + out[14 + outpos] = (((in[7 + inpos] >>> 14) & 131071)) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[4 + inpos] >>> 22)) + out[15 + outpos] = ((in[7 + inpos] >>> 31) | ((in[8 + inpos] & 65535) << (17 - 16))) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[5 + inpos] >>> 0) & 1023)) + out[16 + outpos] = ((in[8 + inpos] >>> 16) | ((in[9 + inpos] & 1) << (17 - 1))) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[5 + inpos] >>> 10) & 1023)) + out[17 + outpos] = (((in[9 + inpos] >>> 1) & 131071)) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[5 + inpos] >>> 20) & 1023)) + out[18 + outpos] = ((in[9 + inpos] >>> 18) | ((in[10 + inpos] & 7) << (17 - 3))) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[5 + inpos] >>> 30) | ((in[6 + inpos] & 255) << (10 - 8))) + out[19 + outpos] = (((in[10 + inpos] >>> 3) & 131071)) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[6 + inpos] >>> 8) & 1023)) + out[20 + outpos] = ((in[10 + inpos] >>> 20) | ((in[11 + inpos] & 31) << (17 - 5))) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[6 + inpos] >>> 18) & 1023)) + out[21 + outpos] = (((in[11 + inpos] >>> 5) & 131071)) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[6 + inpos] >>> 28) | ((in[7 + inpos] & 63) << (10 - 6))) + out[22 + outpos] = ((in[11 + inpos] >>> 22) | ((in[12 + inpos] & 127) << (17 - 7))) + out[22 + outpos - 1]; - out[23 + outpos] = (((in[7 + inpos] >>> 6) & 1023)) + out[23 + outpos] = (((in[12 + inpos] >>> 7) & 131071)) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[7 + inpos] >>> 16) & 1023)) + out[24 + outpos] = ((in[12 + inpos] >>> 24) | ((in[13 + inpos] & 511) << (17 - 9))) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[7 + inpos] >>> 26) | ((in[8 + inpos] & 15) << (10 - 4))) + out[25 + outpos] = (((in[13 + inpos] >>> 9) & 131071)) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[8 + inpos] >>> 4) & 1023)) + out[26 + outpos] = ((in[13 + inpos] >>> 26) | ((in[14 + inpos] & 2047) << (17 - 11))) + out[26 + outpos - 1]; - out[27 + outpos] = (((in[8 + inpos] >>> 14) & 1023)) + out[27 + outpos] = (((in[14 + inpos] >>> 11) & 131071)) + out[27 + outpos - 1]; - out[28 + outpos] = ((in[8 + inpos] >>> 24) | ((in[9 + inpos] & 3) << (10 - 2))) + out[28 + outpos] = ((in[14 + inpos] >>> 28) | ((in[15 + inpos] & 8191) << (17 - 13))) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[9 + inpos] >>> 2) & 1023)) + out[29 + outpos] = (((in[15 + inpos] >>> 13) & 131071)) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[9 + inpos] >>> 12) & 1023)) + out[30 + outpos] = ((in[15 + inpos] >>> 30) | ((in[16 + inpos] & 32767) << (17 - 15))) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[9 + inpos] >>> 22)) + out[31 + outpos] = ((in[16 + inpos] >>> 15)) + out[31 + outpos - 1]; } - protected static void integratedunpack11(final int initoffset, + protected static void integratedunpack18(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 2047)) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 11) & 2047)) + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 262143)) + + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 18) | ((in[1 + inpos] & 15) << (18 - 4))) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[0 + inpos] >>> 22) | ((in[1 + inpos] & 1) << (11 - 1))) + out[2 + outpos] = (((in[1 + inpos] >>> 4) & 262143)) + out[2 + outpos - 1]; - out[3 + outpos] = (((in[1 + inpos] >>> 1) & 2047)) + out[3 + outpos] = ((in[1 + inpos] >>> 22) | ((in[2 + inpos] & 255) << (18 - 8))) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[1 + inpos] >>> 12) & 2047)) + out[4 + outpos] = (((in[2 + inpos] >>> 8) & 262143)) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[1 + inpos] >>> 23) | ((in[2 + inpos] & 3) << (11 - 2))) + out[5 + outpos] = ((in[2 + inpos] >>> 26) | ((in[3 + inpos] & 4095) << (18 - 12))) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[2 + inpos] >>> 2) & 2047)) + out[6 + outpos] = (((in[3 + inpos] >>> 12) & 262143)) + out[6 + outpos - 1]; - out[7 + outpos] = (((in[2 + inpos] >>> 13) & 2047)) + out[7 + outpos] = ((in[3 + inpos] >>> 30) | ((in[4 + inpos] & 65535) << (18 - 16))) + out[7 + outpos - 1]; - out[8 + outpos] = ((in[2 + inpos] >>> 24) | ((in[3 + inpos] & 7) << (11 - 3))) + out[8 + outpos] = ((in[4 + inpos] >>> 16) | ((in[5 + inpos] & 3) << (18 - 2))) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[3 + inpos] >>> 3) & 2047)) + out[9 + outpos] = (((in[5 + inpos] >>> 2) & 262143)) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[3 + inpos] >>> 14) & 2047)) + out[10 + outpos] = ((in[5 + inpos] >>> 20) | ((in[6 + inpos] & 63) << (18 - 6))) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[3 + inpos] >>> 25) | ((in[4 + inpos] & 15) << (11 - 4))) + out[11 + outpos] = (((in[6 + inpos] >>> 6) & 262143)) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[4 + inpos] >>> 4) & 2047)) + out[12 + outpos] = ((in[6 + inpos] >>> 24) | ((in[7 + inpos] & 1023) << (18 - 10))) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[4 + inpos] >>> 15) & 2047)) + out[13 + outpos] = (((in[7 + inpos] >>> 10) & 262143)) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[4 + inpos] >>> 26) | ((in[5 + inpos] & 31) << (11 - 5))) + out[14 + outpos] = ((in[7 + inpos] >>> 28) | ((in[8 + inpos] & 16383) << (18 - 14))) + out[14 + outpos - 1]; - out[15 + outpos] = (((in[5 + inpos] >>> 5) & 2047)) + out[15 + outpos] = ((in[8 + inpos] >>> 14)) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[5 + inpos] >>> 16) & 2047)) + out[16 + outpos] = (((in[9 + inpos] >>> 0) & 262143)) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[5 + inpos] >>> 27) | ((in[6 + inpos] & 63) << (11 - 6))) + out[17 + outpos] = ((in[9 + inpos] >>> 18) | ((in[10 + inpos] & 15) << (18 - 4))) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[6 + inpos] >>> 6) & 2047)) + out[18 + outpos] = (((in[10 + inpos] >>> 4) & 262143)) + out[18 + outpos - 1]; - out[19 + outpos] = (((in[6 + inpos] >>> 17) & 2047)) + out[19 + outpos] = ((in[10 + inpos] >>> 22) | ((in[11 + inpos] & 255) << (18 - 8))) + out[19 + outpos - 1]; - out[20 + outpos] = ((in[6 + inpos] >>> 28) | ((in[7 + inpos] & 127) << (11 - 7))) + out[20 + outpos] = (((in[11 + inpos] >>> 8) & 262143)) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[7 + inpos] >>> 7) & 2047)) + out[21 + outpos] = ((in[11 + inpos] >>> 26) | ((in[12 + inpos] & 4095) << (18 - 12))) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[7 + inpos] >>> 18) & 2047)) + out[22 + outpos] = (((in[12 + inpos] >>> 12) & 262143)) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[7 + inpos] >>> 29) | ((in[8 + inpos] & 255) << (11 - 8))) + out[23 + outpos] = ((in[12 + inpos] >>> 30) | ((in[13 + inpos] & 65535) << (18 - 16))) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[8 + inpos] >>> 8) & 2047)) + out[24 + outpos] = ((in[13 + inpos] >>> 16) | ((in[14 + inpos] & 3) << (18 - 2))) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[8 + inpos] >>> 19) & 2047)) + out[25 + outpos] = (((in[14 + inpos] >>> 2) & 262143)) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[8 + inpos] >>> 30) | ((in[9 + inpos] & 511) << (11 - 9))) + out[26 + outpos] = ((in[14 + inpos] >>> 20) | ((in[15 + inpos] & 63) << (18 - 6))) + out[26 + outpos - 1]; - out[27 + outpos] = (((in[9 + inpos] >>> 9) & 2047)) + out[27 + outpos] = (((in[15 + inpos] >>> 6) & 262143)) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[9 + inpos] >>> 20) & 2047)) + out[28 + outpos] = ((in[15 + inpos] >>> 24) | ((in[16 + inpos] & 1023) << (18 - 10))) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[9 + inpos] >>> 31) | ((in[10 + inpos] & 1023) << (11 - 10))) + out[29 + outpos] = (((in[16 + inpos] >>> 10) & 262143)) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[10 + inpos] >>> 10) & 2047)) + out[30 + outpos] = ((in[16 + inpos] >>> 28) | ((in[17 + inpos] & 16383) << (18 - 14))) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[10 + inpos] >>> 21)) + out[31 + outpos] = ((in[17 + inpos] >>> 14)) + out[31 + outpos - 1]; } - protected static void integratedunpack12(final int initoffset, + protected static void integratedunpack19(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 4095)) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 12) & 4095)) + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 524287)) + + initoffset; + out[1 + outpos] = ((in[0 + inpos] >>> 19) | ((in[1 + inpos] & 63) << (19 - 6))) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[0 + inpos] >>> 24) | ((in[1 + inpos] & 15) << (12 - 4))) + out[2 + outpos] = (((in[1 + inpos] >>> 6) & 524287)) + out[2 + outpos - 1]; - out[3 + outpos] = (((in[1 + inpos] >>> 4) & 4095)) + out[3 + outpos] = ((in[1 + inpos] >>> 25) | ((in[2 + inpos] & 4095) << (19 - 12))) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[1 + inpos] >>> 16) & 4095)) + out[4 + outpos] = (((in[2 + inpos] >>> 12) & 524287)) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[1 + inpos] >>> 28) | ((in[2 + inpos] & 255) << (12 - 8))) + out[5 + outpos] = ((in[2 + inpos] >>> 31) | ((in[3 + inpos] & 262143) << (19 - 18))) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[2 + inpos] >>> 8) & 4095)) + out[6 + outpos] = ((in[3 + inpos] >>> 18) | ((in[4 + inpos] & 31) << (19 - 5))) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[2 + inpos] >>> 20)) + out[7 + outpos] = (((in[4 + inpos] >>> 5) & 524287)) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[3 + inpos] >>> 0) & 4095)) + out[8 + outpos] = ((in[4 + inpos] >>> 24) | ((in[5 + inpos] & 2047) << (19 - 11))) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[3 + inpos] >>> 12) & 4095)) + out[9 + outpos] = (((in[5 + inpos] >>> 11) & 524287)) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[3 + inpos] >>> 24) | ((in[4 + inpos] & 15) << (12 - 4))) + out[10 + outpos] = ((in[5 + inpos] >>> 30) | ((in[6 + inpos] & 131071) << (19 - 17))) + out[10 + outpos - 1]; - out[11 + outpos] = (((in[4 + inpos] >>> 4) & 4095)) + out[11 + outpos] = ((in[6 + inpos] >>> 17) | ((in[7 + inpos] & 15) << (19 - 4))) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[4 + inpos] >>> 16) & 4095)) + out[12 + outpos] = (((in[7 + inpos] >>> 4) & 524287)) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[4 + inpos] >>> 28) | ((in[5 + inpos] & 255) << (12 - 8))) + out[13 + outpos] = ((in[7 + inpos] >>> 23) | ((in[8 + inpos] & 1023) << (19 - 10))) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[5 + inpos] >>> 8) & 4095)) + out[14 + outpos] = (((in[8 + inpos] >>> 10) & 524287)) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[5 + inpos] >>> 20)) + out[15 + outpos] = ((in[8 + inpos] >>> 29) | ((in[9 + inpos] & 65535) << (19 - 16))) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[6 + inpos] >>> 0) & 4095)) + out[16 + outpos] = ((in[9 + inpos] >>> 16) | ((in[10 + inpos] & 7) << (19 - 3))) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[6 + inpos] >>> 12) & 4095)) + out[17 + outpos] = (((in[10 + inpos] >>> 3) & 524287)) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[6 + inpos] >>> 24) | ((in[7 + inpos] & 15) << (12 - 4))) + out[18 + outpos] = ((in[10 + inpos] >>> 22) | ((in[11 + inpos] & 511) << (19 - 9))) + out[18 + outpos - 1]; - out[19 + outpos] = (((in[7 + inpos] >>> 4) & 4095)) + out[19 + outpos] = (((in[11 + inpos] >>> 9) & 524287)) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[7 + inpos] >>> 16) & 4095)) + out[20 + outpos] = ((in[11 + inpos] >>> 28) | ((in[12 + inpos] & 32767) << (19 - 15))) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[7 + inpos] >>> 28) | ((in[8 + inpos] & 255) << (12 - 8))) + out[21 + outpos] = ((in[12 + inpos] >>> 15) | ((in[13 + inpos] & 3) << (19 - 2))) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[8 + inpos] >>> 8) & 4095)) + out[22 + outpos] = (((in[13 + inpos] >>> 2) & 524287)) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[8 + inpos] >>> 20)) + out[23 + outpos] = ((in[13 + inpos] >>> 21) | ((in[14 + inpos] & 255) << (19 - 8))) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[9 + inpos] >>> 0) & 4095)) + out[24 + outpos] = (((in[14 + inpos] >>> 8) & 524287)) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[9 + inpos] >>> 12) & 4095)) + out[25 + outpos] = ((in[14 + inpos] >>> 27) | ((in[15 + inpos] & 16383) << (19 - 14))) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[9 + inpos] >>> 24) | ((in[10 + inpos] & 15) << (12 - 4))) + out[26 + outpos] = ((in[15 + inpos] >>> 14) | ((in[16 + inpos] & 1) << (19 - 1))) + out[26 + outpos - 1]; - out[27 + outpos] = (((in[10 + inpos] >>> 4) & 4095)) + out[27 + outpos] = (((in[16 + inpos] >>> 1) & 524287)) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[10 + inpos] >>> 16) & 4095)) + out[28 + outpos] = ((in[16 + inpos] >>> 20) | ((in[17 + inpos] & 127) << (19 - 7))) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[10 + inpos] >>> 28) | ((in[11 + inpos] & 255) << (12 - 8))) + out[29 + outpos] = (((in[17 + inpos] >>> 7) & 524287)) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[11 + inpos] >>> 8) & 4095)) + out[30 + outpos] = ((in[17 + inpos] >>> 26) | ((in[18 + inpos] & 8191) << (19 - 13))) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[11 + inpos] >>> 20)) + out[31 + outpos] = ((in[18 + inpos] >>> 13)) + out[31 + outpos - 1]; } - protected static void integratedunpack13(final int initoffset, + protected static void integratedunpack2(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 8191)) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 13) & 8191)) + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 3)) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 2) & 3)) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[0 + inpos] >>> 26) | ((in[1 + inpos] & 127) << (13 - 7))) + out[2 + outpos] = (((in[0 + inpos] >>> 4) & 3)) + out[2 + outpos - 1]; - out[3 + outpos] = (((in[1 + inpos] >>> 7) & 8191)) + out[3 + outpos] = (((in[0 + inpos] >>> 6) & 3)) + out[3 + outpos - 1]; - out[4 + outpos] = ((in[1 + inpos] >>> 20) | ((in[2 + inpos] & 1) << (13 - 1))) + out[4 + outpos] = (((in[0 + inpos] >>> 8) & 3)) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[2 + inpos] >>> 1) & 8191)) + out[5 + outpos] = (((in[0 + inpos] >>> 10) & 3)) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[2 + inpos] >>> 14) & 8191)) + out[6 + outpos] = (((in[0 + inpos] >>> 12) & 3)) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[2 + inpos] >>> 27) | ((in[3 + inpos] & 255) << (13 - 8))) + out[7 + outpos] = (((in[0 + inpos] >>> 14) & 3)) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[3 + inpos] >>> 8) & 8191)) + out[8 + outpos] = (((in[0 + inpos] >>> 16) & 3)) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[3 + inpos] >>> 21) | ((in[4 + inpos] & 3) << (13 - 2))) + out[9 + outpos] = (((in[0 + inpos] >>> 18) & 3)) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[4 + inpos] >>> 2) & 8191)) + out[10 + outpos] = (((in[0 + inpos] >>> 20) & 3)) + out[10 + outpos - 1]; - out[11 + outpos] = (((in[4 + inpos] >>> 15) & 8191)) + out[11 + outpos] = (((in[0 + inpos] >>> 22) & 3)) + out[11 + outpos - 1]; - out[12 + outpos] = ((in[4 + inpos] >>> 28) | ((in[5 + inpos] & 511) << (13 - 9))) + out[12 + outpos] = (((in[0 + inpos] >>> 24) & 3)) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[5 + inpos] >>> 9) & 8191)) + out[13 + outpos] = (((in[0 + inpos] >>> 26) & 3)) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[5 + inpos] >>> 22) | ((in[6 + inpos] & 7) << (13 - 3))) + out[14 + outpos] = (((in[0 + inpos] >>> 28) & 3)) + out[14 + outpos - 1]; - out[15 + outpos] = (((in[6 + inpos] >>> 3) & 8191)) + out[15 + outpos] = ((in[0 + inpos] >>> 30)) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[6 + inpos] >>> 16) & 8191)) + out[16 + outpos] = (((in[1 + inpos] >>> 0) & 3)) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[6 + inpos] >>> 29) | ((in[7 + inpos] & 1023) << (13 - 10))) + out[17 + outpos] = (((in[1 + inpos] >>> 2) & 3)) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[7 + inpos] >>> 10) & 8191)) + out[18 + outpos] = (((in[1 + inpos] >>> 4) & 3)) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[7 + inpos] >>> 23) | ((in[8 + inpos] & 15) << (13 - 4))) + out[19 + outpos] = (((in[1 + inpos] >>> 6) & 3)) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[8 + inpos] >>> 4) & 8191)) + out[20 + outpos] = (((in[1 + inpos] >>> 8) & 3)) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[8 + inpos] >>> 17) & 8191)) + out[21 + outpos] = (((in[1 + inpos] >>> 10) & 3)) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[8 + inpos] >>> 30) | ((in[9 + inpos] & 2047) << (13 - 11))) + out[22 + outpos] = (((in[1 + inpos] >>> 12) & 3)) + out[22 + outpos - 1]; - out[23 + outpos] = (((in[9 + inpos] >>> 11) & 8191)) + out[23 + outpos] = (((in[1 + inpos] >>> 14) & 3)) + out[23 + outpos - 1]; - out[24 + outpos] = ((in[9 + inpos] >>> 24) | ((in[10 + inpos] & 31) << (13 - 5))) + out[24 + outpos] = (((in[1 + inpos] >>> 16) & 3)) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[10 + inpos] >>> 5) & 8191)) + out[25 + outpos] = (((in[1 + inpos] >>> 18) & 3)) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[10 + inpos] >>> 18) & 8191)) + out[26 + outpos] = (((in[1 + inpos] >>> 20) & 3)) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[10 + inpos] >>> 31) | ((in[11 + inpos] & 4095) << (13 - 12))) + out[27 + outpos] = (((in[1 + inpos] >>> 22) & 3)) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[11 + inpos] >>> 12) & 8191)) + out[28 + outpos] = (((in[1 + inpos] >>> 24) & 3)) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[11 + inpos] >>> 25) | ((in[12 + inpos] & 63) << (13 - 6))) + out[29 + outpos] = (((in[1 + inpos] >>> 26) & 3)) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[12 + inpos] >>> 6) & 8191)) + out[30 + outpos] = (((in[1 + inpos] >>> 28) & 3)) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[12 + inpos] >>> 19)) + out[31 + outpos] = ((in[1 + inpos] >>> 30)) + out[31 + outpos - 1]; } - protected static void integratedunpack14(final int initoffset, + protected static void integratedunpack20(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 16383)) + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 1048575)) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 14) & 16383)) + out[1 + outpos] = ((in[0 + inpos] >>> 20) | ((in[1 + inpos] & 255) << (20 - 8))) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[0 + inpos] >>> 28) | ((in[1 + inpos] & 1023) << (14 - 10))) + out[2 + outpos] = (((in[1 + inpos] >>> 8) & 1048575)) + out[2 + outpos - 1]; - out[3 + outpos] = (((in[1 + inpos] >>> 10) & 16383)) + out[3 + outpos] = ((in[1 + inpos] >>> 28) | ((in[2 + inpos] & 65535) << (20 - 16))) + out[3 + outpos - 1]; - out[4 + outpos] = ((in[1 + inpos] >>> 24) | ((in[2 + inpos] & 63) << (14 - 6))) + out[4 + outpos] = ((in[2 + inpos] >>> 16) | ((in[3 + inpos] & 15) << (20 - 4))) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[2 + inpos] >>> 6) & 16383)) + out[5 + outpos] = (((in[3 + inpos] >>> 4) & 1048575)) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[2 + inpos] >>> 20) | ((in[3 + inpos] & 3) << (14 - 2))) + out[6 + outpos] = ((in[3 + inpos] >>> 24) | ((in[4 + inpos] & 4095) << (20 - 12))) + out[6 + outpos - 1]; - out[7 + outpos] = (((in[3 + inpos] >>> 2) & 16383)) + out[7 + outpos] = ((in[4 + inpos] >>> 12)) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[3 + inpos] >>> 16) & 16383)) + out[8 + outpos] = (((in[5 + inpos] >>> 0) & 1048575)) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[3 + inpos] >>> 30) | ((in[4 + inpos] & 4095) << (14 - 12))) + out[9 + outpos] = ((in[5 + inpos] >>> 20) | ((in[6 + inpos] & 255) << (20 - 8))) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[4 + inpos] >>> 12) & 16383)) + out[10 + outpos] = (((in[6 + inpos] >>> 8) & 1048575)) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[4 + inpos] >>> 26) | ((in[5 + inpos] & 255) << (14 - 8))) + out[11 + outpos] = ((in[6 + inpos] >>> 28) | ((in[7 + inpos] & 65535) << (20 - 16))) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[5 + inpos] >>> 8) & 16383)) + out[12 + outpos] = ((in[7 + inpos] >>> 16) | ((in[8 + inpos] & 15) << (20 - 4))) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[5 + inpos] >>> 22) | ((in[6 + inpos] & 15) << (14 - 4))) + out[13 + outpos] = (((in[8 + inpos] >>> 4) & 1048575)) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[6 + inpos] >>> 4) & 16383)) + out[14 + outpos] = ((in[8 + inpos] >>> 24) | ((in[9 + inpos] & 4095) << (20 - 12))) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[6 + inpos] >>> 18)) + out[15 + outpos] = ((in[9 + inpos] >>> 12)) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[7 + inpos] >>> 0) & 16383)) + out[16 + outpos] = (((in[10 + inpos] >>> 0) & 1048575)) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[7 + inpos] >>> 14) & 16383)) + out[17 + outpos] = ((in[10 + inpos] >>> 20) | ((in[11 + inpos] & 255) << (20 - 8))) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[7 + inpos] >>> 28) | ((in[8 + inpos] & 1023) << (14 - 10))) + out[18 + outpos] = (((in[11 + inpos] >>> 8) & 1048575)) + out[18 + outpos - 1]; - out[19 + outpos] = (((in[8 + inpos] >>> 10) & 16383)) + out[19 + outpos] = ((in[11 + inpos] >>> 28) | ((in[12 + inpos] & 65535) << (20 - 16))) + out[19 + outpos - 1]; - out[20 + outpos] = ((in[8 + inpos] >>> 24) | ((in[9 + inpos] & 63) << (14 - 6))) + out[20 + outpos] = ((in[12 + inpos] >>> 16) | ((in[13 + inpos] & 15) << (20 - 4))) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[9 + inpos] >>> 6) & 16383)) + out[21 + outpos] = (((in[13 + inpos] >>> 4) & 1048575)) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[9 + inpos] >>> 20) | ((in[10 + inpos] & 3) << (14 - 2))) + out[22 + outpos] = ((in[13 + inpos] >>> 24) | ((in[14 + inpos] & 4095) << (20 - 12))) + out[22 + outpos - 1]; - out[23 + outpos] = (((in[10 + inpos] >>> 2) & 16383)) + out[23 + outpos] = ((in[14 + inpos] >>> 12)) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[10 + inpos] >>> 16) & 16383)) + out[24 + outpos] = (((in[15 + inpos] >>> 0) & 1048575)) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[10 + inpos] >>> 30) | ((in[11 + inpos] & 4095) << (14 - 12))) + out[25 + outpos] = ((in[15 + inpos] >>> 20) | ((in[16 + inpos] & 255) << (20 - 8))) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[11 + inpos] >>> 12) & 16383)) + out[26 + outpos] = (((in[16 + inpos] >>> 8) & 1048575)) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[11 + inpos] >>> 26) | ((in[12 + inpos] & 255) << (14 - 8))) + out[27 + outpos] = ((in[16 + inpos] >>> 28) | ((in[17 + inpos] & 65535) << (20 - 16))) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[12 + inpos] >>> 8) & 16383)) + out[28 + outpos] = ((in[17 + inpos] >>> 16) | ((in[18 + inpos] & 15) << (20 - 4))) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[12 + inpos] >>> 22) | ((in[13 + inpos] & 15) << (14 - 4))) + out[29 + outpos] = (((in[18 + inpos] >>> 4) & 1048575)) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[13 + inpos] >>> 4) & 16383)) + out[30 + outpos] = ((in[18 + inpos] >>> 24) | ((in[19 + inpos] & 4095) << (20 - 12))) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[13 + inpos] >>> 18)) + out[31 + outpos] = ((in[19 + inpos] >>> 12)) + out[31 + outpos - 1]; } - protected static void integratedunpack15(final int initoffset, + protected static void integratedunpack21(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 32767)) + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 2097151)) + initoffset; - out[1 + outpos] = (((in[0 + inpos] >>> 15) & 32767)) + out[1 + outpos] = ((in[0 + inpos] >>> 21) | ((in[1 + inpos] & 1023) << (21 - 10))) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[0 + inpos] >>> 30) | ((in[1 + inpos] & 8191) << (15 - 13))) + out[2 + outpos] = (((in[1 + inpos] >>> 10) & 2097151)) + out[2 + outpos - 1]; - out[3 + outpos] = (((in[1 + inpos] >>> 13) & 32767)) + out[3 + outpos] = ((in[1 + inpos] >>> 31) | ((in[2 + inpos] & 1048575) << (21 - 20))) + out[3 + outpos - 1]; - out[4 + outpos] = ((in[1 + inpos] >>> 28) | ((in[2 + inpos] & 2047) << (15 - 11))) + out[4 + outpos] = ((in[2 + inpos] >>> 20) | ((in[3 + inpos] & 511) << (21 - 9))) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[2 + inpos] >>> 11) & 32767)) + out[5 + outpos] = (((in[3 + inpos] >>> 9) & 2097151)) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[2 + inpos] >>> 26) | ((in[3 + inpos] & 511) << (15 - 9))) + out[6 + outpos] = ((in[3 + inpos] >>> 30) | ((in[4 + inpos] & 524287) << (21 - 19))) + out[6 + outpos - 1]; - out[7 + outpos] = (((in[3 + inpos] >>> 9) & 32767)) + out[7 + outpos] = ((in[4 + inpos] >>> 19) | ((in[5 + inpos] & 255) << (21 - 8))) + out[7 + outpos - 1]; - out[8 + outpos] = ((in[3 + inpos] >>> 24) | ((in[4 + inpos] & 127) << (15 - 7))) + out[8 + outpos] = (((in[5 + inpos] >>> 8) & 2097151)) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[4 + inpos] >>> 7) & 32767)) + out[9 + outpos] = ((in[5 + inpos] >>> 29) | ((in[6 + inpos] & 262143) << (21 - 18))) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[4 + inpos] >>> 22) | ((in[5 + inpos] & 31) << (15 - 5))) + out[10 + outpos] = ((in[6 + inpos] >>> 18) | ((in[7 + inpos] & 127) << (21 - 7))) + out[10 + outpos - 1]; - out[11 + outpos] = (((in[5 + inpos] >>> 5) & 32767)) + out[11 + outpos] = (((in[7 + inpos] >>> 7) & 2097151)) + out[11 + outpos - 1]; - out[12 + outpos] = ((in[5 + inpos] >>> 20) | ((in[6 + inpos] & 7) << (15 - 3))) + out[12 + outpos] = ((in[7 + inpos] >>> 28) | ((in[8 + inpos] & 131071) << (21 - 17))) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[6 + inpos] >>> 3) & 32767)) + out[13 + outpos] = ((in[8 + inpos] >>> 17) | ((in[9 + inpos] & 63) << (21 - 6))) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[6 + inpos] >>> 18) | ((in[7 + inpos] & 1) << (15 - 1))) + out[14 + outpos] = (((in[9 + inpos] >>> 6) & 2097151)) + out[14 + outpos - 1]; - out[15 + outpos] = (((in[7 + inpos] >>> 1) & 32767)) + out[15 + outpos] = ((in[9 + inpos] >>> 27) | ((in[10 + inpos] & 65535) << (21 - 16))) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[7 + inpos] >>> 16) & 32767)) + out[16 + outpos] = ((in[10 + inpos] >>> 16) | ((in[11 + inpos] & 31) << (21 - 5))) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[7 + inpos] >>> 31) | ((in[8 + inpos] & 16383) << (15 - 14))) + out[17 + outpos] = (((in[11 + inpos] >>> 5) & 2097151)) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[8 + inpos] >>> 14) & 32767)) + out[18 + outpos] = ((in[11 + inpos] >>> 26) | ((in[12 + inpos] & 32767) << (21 - 15))) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[8 + inpos] >>> 29) | ((in[9 + inpos] & 4095) << (15 - 12))) + out[19 + outpos] = ((in[12 + inpos] >>> 15) | ((in[13 + inpos] & 15) << (21 - 4))) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[9 + inpos] >>> 12) & 32767)) + out[20 + outpos] = (((in[13 + inpos] >>> 4) & 2097151)) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[9 + inpos] >>> 27) | ((in[10 + inpos] & 1023) << (15 - 10))) + out[21 + outpos] = ((in[13 + inpos] >>> 25) | ((in[14 + inpos] & 16383) << (21 - 14))) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[10 + inpos] >>> 10) & 32767)) + out[22 + outpos] = ((in[14 + inpos] >>> 14) | ((in[15 + inpos] & 7) << (21 - 3))) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[10 + inpos] >>> 25) | ((in[11 + inpos] & 255) << (15 - 8))) + out[23 + outpos] = (((in[15 + inpos] >>> 3) & 2097151)) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[11 + inpos] >>> 8) & 32767)) + out[24 + outpos] = ((in[15 + inpos] >>> 24) | ((in[16 + inpos] & 8191) << (21 - 13))) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[11 + inpos] >>> 23) | ((in[12 + inpos] & 63) << (15 - 6))) + out[25 + outpos] = ((in[16 + inpos] >>> 13) | ((in[17 + inpos] & 3) << (21 - 2))) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[12 + inpos] >>> 6) & 32767)) + out[26 + outpos] = (((in[17 + inpos] >>> 2) & 2097151)) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[12 + inpos] >>> 21) | ((in[13 + inpos] & 15) << (15 - 4))) + out[27 + outpos] = ((in[17 + inpos] >>> 23) | ((in[18 + inpos] & 4095) << (21 - 12))) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[13 + inpos] >>> 4) & 32767)) + out[28 + outpos] = ((in[18 + inpos] >>> 12) | ((in[19 + inpos] & 1) << (21 - 1))) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[13 + inpos] >>> 19) | ((in[14 + inpos] & 3) << (15 - 2))) + out[29 + outpos] = (((in[19 + inpos] >>> 1) & 2097151)) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[14 + inpos] >>> 2) & 32767)) + out[30 + outpos] = ((in[19 + inpos] >>> 22) | ((in[20 + inpos] & 2047) << (21 - 11))) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[14 + inpos] >>> 17)) + out[31 + outpos] = ((in[20 + inpos] >>> 11)) + out[31 + outpos - 1]; } - protected static void integratedunpack16(final int initoffset, + protected static void integratedunpack22(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 65535)) + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 4194303)) + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 16)) + out[1 + outpos] = ((in[0 + inpos] >>> 22) | ((in[1 + inpos] & 4095) << (22 - 12))) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[1 + inpos] >>> 0) & 65535)) + out[2 + outpos] = ((in[1 + inpos] >>> 12) | ((in[2 + inpos] & 3) << (22 - 2))) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[1 + inpos] >>> 16)) + out[3 + outpos] = (((in[2 + inpos] >>> 2) & 4194303)) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[2 + inpos] >>> 0) & 65535)) + out[4 + outpos] = ((in[2 + inpos] >>> 24) | ((in[3 + inpos] & 16383) << (22 - 14))) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[2 + inpos] >>> 16)) + out[5 + outpos] = ((in[3 + inpos] >>> 14) | ((in[4 + inpos] & 15) << (22 - 4))) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[3 + inpos] >>> 0) & 65535)) + out[6 + outpos] = (((in[4 + inpos] >>> 4) & 4194303)) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[3 + inpos] >>> 16)) + out[7 + outpos] = ((in[4 + inpos] >>> 26) | ((in[5 + inpos] & 65535) << (22 - 16))) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[4 + inpos] >>> 0) & 65535)) + out[8 + outpos] = ((in[5 + inpos] >>> 16) | ((in[6 + inpos] & 63) << (22 - 6))) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[4 + inpos] >>> 16)) + out[9 + outpos] = (((in[6 + inpos] >>> 6) & 4194303)) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[5 + inpos] >>> 0) & 65535)) + out[10 + outpos] = ((in[6 + inpos] >>> 28) | ((in[7 + inpos] & 262143) << (22 - 18))) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[5 + inpos] >>> 16)) + out[11 + outpos] = ((in[7 + inpos] >>> 18) | ((in[8 + inpos] & 255) << (22 - 8))) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[6 + inpos] >>> 0) & 65535)) + out[12 + outpos] = (((in[8 + inpos] >>> 8) & 4194303)) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[6 + inpos] >>> 16)) + out[13 + outpos] = ((in[8 + inpos] >>> 30) | ((in[9 + inpos] & 1048575) << (22 - 20))) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[7 + inpos] >>> 0) & 65535)) + out[14 + outpos] = ((in[9 + inpos] >>> 20) | ((in[10 + inpos] & 1023) << (22 - 10))) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[7 + inpos] >>> 16)) + out[15 + outpos] = ((in[10 + inpos] >>> 10)) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[8 + inpos] >>> 0) & 65535)) + out[16 + outpos] = (((in[11 + inpos] >>> 0) & 4194303)) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[8 + inpos] >>> 16)) + out[17 + outpos] = ((in[11 + inpos] >>> 22) | ((in[12 + inpos] & 4095) << (22 - 12))) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[9 + inpos] >>> 0) & 65535)) + out[18 + outpos] = ((in[12 + inpos] >>> 12) | ((in[13 + inpos] & 3) << (22 - 2))) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[9 + inpos] >>> 16)) + out[19 + outpos] = (((in[13 + inpos] >>> 2) & 4194303)) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[10 + inpos] >>> 0) & 65535)) + out[20 + outpos] = ((in[13 + inpos] >>> 24) | ((in[14 + inpos] & 16383) << (22 - 14))) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[10 + inpos] >>> 16)) + out[21 + outpos] = ((in[14 + inpos] >>> 14) | ((in[15 + inpos] & 15) << (22 - 4))) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[11 + inpos] >>> 0) & 65535)) + out[22 + outpos] = (((in[15 + inpos] >>> 4) & 4194303)) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[11 + inpos] >>> 16)) + out[23 + outpos] = ((in[15 + inpos] >>> 26) | ((in[16 + inpos] & 65535) << (22 - 16))) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[12 + inpos] >>> 0) & 65535)) + out[24 + outpos] = ((in[16 + inpos] >>> 16) | ((in[17 + inpos] & 63) << (22 - 6))) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[12 + inpos] >>> 16)) + out[25 + outpos] = (((in[17 + inpos] >>> 6) & 4194303)) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[13 + inpos] >>> 0) & 65535)) + out[26 + outpos] = ((in[17 + inpos] >>> 28) | ((in[18 + inpos] & 262143) << (22 - 18))) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[13 + inpos] >>> 16)) + out[27 + outpos] = ((in[18 + inpos] >>> 18) | ((in[19 + inpos] & 255) << (22 - 8))) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[14 + inpos] >>> 0) & 65535)) + out[28 + outpos] = (((in[19 + inpos] >>> 8) & 4194303)) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[14 + inpos] >>> 16)) + out[29 + outpos] = ((in[19 + inpos] >>> 30) | ((in[20 + inpos] & 1048575) << (22 - 20))) + out[29 + outpos - 1]; - out[30 + outpos] = (((in[15 + inpos] >>> 0) & 65535)) + out[30 + outpos] = ((in[20 + inpos] >>> 20) | ((in[21 + inpos] & 1023) << (22 - 10))) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[15 + inpos] >>> 16)) + out[31 + outpos] = ((in[21 + inpos] >>> 10)) + out[31 + outpos - 1]; } - protected static void integratedunpack17(final int initoffset, + protected static void integratedunpack23(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 131071)) + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 8388607)) + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 17) | ((in[1 + inpos] & 3) << (17 - 2))) + out[1 + outpos] = ((in[0 + inpos] >>> 23) | ((in[1 + inpos] & 16383) << (23 - 14))) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[1 + inpos] >>> 2) & 131071)) + out[2 + outpos] = ((in[1 + inpos] >>> 14) | ((in[2 + inpos] & 31) << (23 - 5))) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[1 + inpos] >>> 19) | ((in[2 + inpos] & 15) << (17 - 4))) + out[3 + outpos] = (((in[2 + inpos] >>> 5) & 8388607)) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[2 + inpos] >>> 4) & 131071)) + out[4 + outpos] = ((in[2 + inpos] >>> 28) | ((in[3 + inpos] & 524287) << (23 - 19))) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[2 + inpos] >>> 21) | ((in[3 + inpos] & 63) << (17 - 6))) + out[5 + outpos] = ((in[3 + inpos] >>> 19) | ((in[4 + inpos] & 1023) << (23 - 10))) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[3 + inpos] >>> 6) & 131071)) + out[6 + outpos] = ((in[4 + inpos] >>> 10) | ((in[5 + inpos] & 1) << (23 - 1))) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[3 + inpos] >>> 23) | ((in[4 + inpos] & 255) << (17 - 8))) + out[7 + outpos] = (((in[5 + inpos] >>> 1) & 8388607)) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[4 + inpos] >>> 8) & 131071)) + out[8 + outpos] = ((in[5 + inpos] >>> 24) | ((in[6 + inpos] & 32767) << (23 - 15))) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[4 + inpos] >>> 25) | ((in[5 + inpos] & 1023) << (17 - 10))) + out[9 + outpos] = ((in[6 + inpos] >>> 15) | ((in[7 + inpos] & 63) << (23 - 6))) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[5 + inpos] >>> 10) & 131071)) + out[10 + outpos] = (((in[7 + inpos] >>> 6) & 8388607)) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[5 + inpos] >>> 27) | ((in[6 + inpos] & 4095) << (17 - 12))) + out[11 + outpos] = ((in[7 + inpos] >>> 29) | ((in[8 + inpos] & 1048575) << (23 - 20))) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[6 + inpos] >>> 12) & 131071)) + out[12 + outpos] = ((in[8 + inpos] >>> 20) | ((in[9 + inpos] & 2047) << (23 - 11))) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[6 + inpos] >>> 29) | ((in[7 + inpos] & 16383) << (17 - 14))) + out[13 + outpos] = ((in[9 + inpos] >>> 11) | ((in[10 + inpos] & 3) << (23 - 2))) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[7 + inpos] >>> 14) & 131071)) + out[14 + outpos] = (((in[10 + inpos] >>> 2) & 8388607)) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[7 + inpos] >>> 31) | ((in[8 + inpos] & 65535) << (17 - 16))) + out[15 + outpos] = ((in[10 + inpos] >>> 25) | ((in[11 + inpos] & 65535) << (23 - 16))) + out[15 + outpos - 1]; - out[16 + outpos] = ((in[8 + inpos] >>> 16) | ((in[9 + inpos] & 1) << (17 - 1))) + out[16 + outpos] = ((in[11 + inpos] >>> 16) | ((in[12 + inpos] & 127) << (23 - 7))) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[9 + inpos] >>> 1) & 131071)) + out[17 + outpos] = (((in[12 + inpos] >>> 7) & 8388607)) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[9 + inpos] >>> 18) | ((in[10 + inpos] & 7) << (17 - 3))) + out[18 + outpos] = ((in[12 + inpos] >>> 30) | ((in[13 + inpos] & 2097151) << (23 - 21))) + out[18 + outpos - 1]; - out[19 + outpos] = (((in[10 + inpos] >>> 3) & 131071)) + out[19 + outpos] = ((in[13 + inpos] >>> 21) | ((in[14 + inpos] & 4095) << (23 - 12))) + out[19 + outpos - 1]; - out[20 + outpos] = ((in[10 + inpos] >>> 20) | ((in[11 + inpos] & 31) << (17 - 5))) + out[20 + outpos] = ((in[14 + inpos] >>> 12) | ((in[15 + inpos] & 7) << (23 - 3))) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[11 + inpos] >>> 5) & 131071)) + out[21 + outpos] = (((in[15 + inpos] >>> 3) & 8388607)) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[11 + inpos] >>> 22) | ((in[12 + inpos] & 127) << (17 - 7))) + out[22 + outpos] = ((in[15 + inpos] >>> 26) | ((in[16 + inpos] & 131071) << (23 - 17))) + out[22 + outpos - 1]; - out[23 + outpos] = (((in[12 + inpos] >>> 7) & 131071)) + out[23 + outpos] = ((in[16 + inpos] >>> 17) | ((in[17 + inpos] & 255) << (23 - 8))) + out[23 + outpos - 1]; - out[24 + outpos] = ((in[12 + inpos] >>> 24) | ((in[13 + inpos] & 511) << (17 - 9))) + out[24 + outpos] = (((in[17 + inpos] >>> 8) & 8388607)) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[13 + inpos] >>> 9) & 131071)) + out[25 + outpos] = ((in[17 + inpos] >>> 31) | ((in[18 + inpos] & 4194303) << (23 - 22))) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[13 + inpos] >>> 26) | ((in[14 + inpos] & 2047) << (17 - 11))) + out[26 + outpos] = ((in[18 + inpos] >>> 22) | ((in[19 + inpos] & 8191) << (23 - 13))) + out[26 + outpos - 1]; - out[27 + outpos] = (((in[14 + inpos] >>> 11) & 131071)) + out[27 + outpos] = ((in[19 + inpos] >>> 13) | ((in[20 + inpos] & 15) << (23 - 4))) + out[27 + outpos - 1]; - out[28 + outpos] = ((in[14 + inpos] >>> 28) | ((in[15 + inpos] & 8191) << (17 - 13))) + out[28 + outpos] = (((in[20 + inpos] >>> 4) & 8388607)) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[15 + inpos] >>> 13) & 131071)) + out[29 + outpos] = ((in[20 + inpos] >>> 27) | ((in[21 + inpos] & 262143) << (23 - 18))) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[15 + inpos] >>> 30) | ((in[16 + inpos] & 32767) << (17 - 15))) + out[30 + outpos] = ((in[21 + inpos] >>> 18) | ((in[22 + inpos] & 511) << (23 - 9))) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[16 + inpos] >>> 15)) + out[31 + outpos] = ((in[22 + inpos] >>> 9)) + out[31 + outpos - 1]; } - protected static void integratedunpack18(final int initoffset, + protected static void integratedunpack24(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 262143)) + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 16777215)) + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 18) | ((in[1 + inpos] & 15) << (18 - 4))) + out[1 + outpos] = ((in[0 + inpos] >>> 24) | ((in[1 + inpos] & 65535) << (24 - 16))) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[1 + inpos] >>> 4) & 262143)) + out[2 + outpos] = ((in[1 + inpos] >>> 16) | ((in[2 + inpos] & 255) << (24 - 8))) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[1 + inpos] >>> 22) | ((in[2 + inpos] & 255) << (18 - 8))) - + out[3 + outpos - 1]; - out[4 + outpos] = (((in[2 + inpos] >>> 8) & 262143)) + out[3 + outpos] = ((in[2 + inpos] >>> 8)) + out[3 + outpos - 1]; + out[4 + outpos] = (((in[3 + inpos] >>> 0) & 16777215)) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[2 + inpos] >>> 26) | ((in[3 + inpos] & 4095) << (18 - 12))) + out[5 + outpos] = ((in[3 + inpos] >>> 24) | ((in[4 + inpos] & 65535) << (24 - 16))) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[3 + inpos] >>> 12) & 262143)) + out[6 + outpos] = ((in[4 + inpos] >>> 16) | ((in[5 + inpos] & 255) << (24 - 8))) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[3 + inpos] >>> 30) | ((in[4 + inpos] & 65535) << (18 - 16))) - + out[7 + outpos - 1]; - out[8 + outpos] = ((in[4 + inpos] >>> 16) | ((in[5 + inpos] & 3) << (18 - 2))) + out[7 + outpos] = ((in[5 + inpos] >>> 8)) + out[7 + outpos - 1]; + out[8 + outpos] = (((in[6 + inpos] >>> 0) & 16777215)) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[5 + inpos] >>> 2) & 262143)) + out[9 + outpos] = ((in[6 + inpos] >>> 24) | ((in[7 + inpos] & 65535) << (24 - 16))) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[5 + inpos] >>> 20) | ((in[6 + inpos] & 63) << (18 - 6))) + out[10 + outpos] = ((in[7 + inpos] >>> 16) | ((in[8 + inpos] & 255) << (24 - 8))) + out[10 + outpos - 1]; - out[11 + outpos] = (((in[6 + inpos] >>> 6) & 262143)) + out[11 + outpos] = ((in[8 + inpos] >>> 8)) + out[11 + outpos - 1]; - out[12 + outpos] = ((in[6 + inpos] >>> 24) | ((in[7 + inpos] & 1023) << (18 - 10))) + out[12 + outpos] = (((in[9 + inpos] >>> 0) & 16777215)) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[7 + inpos] >>> 10) & 262143)) + out[13 + outpos] = ((in[9 + inpos] >>> 24) | ((in[10 + inpos] & 65535) << (24 - 16))) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[7 + inpos] >>> 28) | ((in[8 + inpos] & 16383) << (18 - 14))) + out[14 + outpos] = ((in[10 + inpos] >>> 16) | ((in[11 + inpos] & 255) << (24 - 8))) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[8 + inpos] >>> 14)) + out[15 + outpos] = ((in[11 + inpos] >>> 8)) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[9 + inpos] >>> 0) & 262143)) + out[16 + outpos] = (((in[12 + inpos] >>> 0) & 16777215)) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[9 + inpos] >>> 18) | ((in[10 + inpos] & 15) << (18 - 4))) + out[17 + outpos] = ((in[12 + inpos] >>> 24) | ((in[13 + inpos] & 65535) << (24 - 16))) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[10 + inpos] >>> 4) & 262143)) + out[18 + outpos] = ((in[13 + inpos] >>> 16) | ((in[14 + inpos] & 255) << (24 - 8))) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[10 + inpos] >>> 22) | ((in[11 + inpos] & 255) << (18 - 8))) + out[19 + outpos] = ((in[14 + inpos] >>> 8)) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[11 + inpos] >>> 8) & 262143)) + out[20 + outpos] = (((in[15 + inpos] >>> 0) & 16777215)) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[11 + inpos] >>> 26) | ((in[12 + inpos] & 4095) << (18 - 12))) + out[21 + outpos] = ((in[15 + inpos] >>> 24) | ((in[16 + inpos] & 65535) << (24 - 16))) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[12 + inpos] >>> 12) & 262143)) + out[22 + outpos] = ((in[16 + inpos] >>> 16) | ((in[17 + inpos] & 255) << (24 - 8))) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[12 + inpos] >>> 30) | ((in[13 + inpos] & 65535) << (18 - 16))) + out[23 + outpos] = ((in[17 + inpos] >>> 8)) + out[23 + outpos - 1]; - out[24 + outpos] = ((in[13 + inpos] >>> 16) | ((in[14 + inpos] & 3) << (18 - 2))) + out[24 + outpos] = (((in[18 + inpos] >>> 0) & 16777215)) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[14 + inpos] >>> 2) & 262143)) + out[25 + outpos] = ((in[18 + inpos] >>> 24) | ((in[19 + inpos] & 65535) << (24 - 16))) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[14 + inpos] >>> 20) | ((in[15 + inpos] & 63) << (18 - 6))) + out[26 + outpos] = ((in[19 + inpos] >>> 16) | ((in[20 + inpos] & 255) << (24 - 8))) + out[26 + outpos - 1]; - out[27 + outpos] = (((in[15 + inpos] >>> 6) & 262143)) + out[27 + outpos] = ((in[20 + inpos] >>> 8)) + out[27 + outpos - 1]; - out[28 + outpos] = ((in[15 + inpos] >>> 24) | ((in[16 + inpos] & 1023) << (18 - 10))) + out[28 + outpos] = (((in[21 + inpos] >>> 0) & 16777215)) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[16 + inpos] >>> 10) & 262143)) + out[29 + outpos] = ((in[21 + inpos] >>> 24) | ((in[22 + inpos] & 65535) << (24 - 16))) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[16 + inpos] >>> 28) | ((in[17 + inpos] & 16383) << (18 - 14))) + out[30 + outpos] = ((in[22 + inpos] >>> 16) | ((in[23 + inpos] & 255) << (24 - 8))) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[17 + inpos] >>> 14)) + out[31 + outpos] = ((in[23 + inpos] >>> 8)) + out[31 + outpos - 1]; } - protected static void integratedunpack19(final int initoffset, + protected static void integratedunpack25(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 524287)) + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 33554431)) + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 19) | ((in[1 + inpos] & 63) << (19 - 6))) + out[1 + outpos] = ((in[0 + inpos] >>> 25) | ((in[1 + inpos] & 262143) << (25 - 18))) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[1 + inpos] >>> 6) & 524287)) + out[2 + outpos] = ((in[1 + inpos] >>> 18) | ((in[2 + inpos] & 2047) << (25 - 11))) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[1 + inpos] >>> 25) | ((in[2 + inpos] & 4095) << (19 - 12))) + out[3 + outpos] = ((in[2 + inpos] >>> 11) | ((in[3 + inpos] & 15) << (25 - 4))) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[2 + inpos] >>> 12) & 524287)) + out[4 + outpos] = (((in[3 + inpos] >>> 4) & 33554431)) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[2 + inpos] >>> 31) | ((in[3 + inpos] & 262143) << (19 - 18))) + out[5 + outpos] = ((in[3 + inpos] >>> 29) | ((in[4 + inpos] & 4194303) << (25 - 22))) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[3 + inpos] >>> 18) | ((in[4 + inpos] & 31) << (19 - 5))) + out[6 + outpos] = ((in[4 + inpos] >>> 22) | ((in[5 + inpos] & 32767) << (25 - 15))) + out[6 + outpos - 1]; - out[7 + outpos] = (((in[4 + inpos] >>> 5) & 524287)) + out[7 + outpos] = ((in[5 + inpos] >>> 15) | ((in[6 + inpos] & 255) << (25 - 8))) + out[7 + outpos - 1]; - out[8 + outpos] = ((in[4 + inpos] >>> 24) | ((in[5 + inpos] & 2047) << (19 - 11))) + out[8 + outpos] = ((in[6 + inpos] >>> 8) | ((in[7 + inpos] & 1) << (25 - 1))) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[5 + inpos] >>> 11) & 524287)) + out[9 + outpos] = (((in[7 + inpos] >>> 1) & 33554431)) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[5 + inpos] >>> 30) | ((in[6 + inpos] & 131071) << (19 - 17))) + out[10 + outpos] = ((in[7 + inpos] >>> 26) | ((in[8 + inpos] & 524287) << (25 - 19))) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[6 + inpos] >>> 17) | ((in[7 + inpos] & 15) << (19 - 4))) + out[11 + outpos] = ((in[8 + inpos] >>> 19) | ((in[9 + inpos] & 4095) << (25 - 12))) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[7 + inpos] >>> 4) & 524287)) + out[12 + outpos] = ((in[9 + inpos] >>> 12) | ((in[10 + inpos] & 31) << (25 - 5))) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[7 + inpos] >>> 23) | ((in[8 + inpos] & 1023) << (19 - 10))) + out[13 + outpos] = (((in[10 + inpos] >>> 5) & 33554431)) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[8 + inpos] >>> 10) & 524287)) + out[14 + outpos] = ((in[10 + inpos] >>> 30) | ((in[11 + inpos] & 8388607) << (25 - 23))) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[8 + inpos] >>> 29) | ((in[9 + inpos] & 65535) << (19 - 16))) + out[15 + outpos] = ((in[11 + inpos] >>> 23) | ((in[12 + inpos] & 65535) << (25 - 16))) + out[15 + outpos - 1]; - out[16 + outpos] = ((in[9 + inpos] >>> 16) | ((in[10 + inpos] & 7) << (19 - 3))) + out[16 + outpos] = ((in[12 + inpos] >>> 16) | ((in[13 + inpos] & 511) << (25 - 9))) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[10 + inpos] >>> 3) & 524287)) + out[17 + outpos] = ((in[13 + inpos] >>> 9) | ((in[14 + inpos] & 3) << (25 - 2))) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[10 + inpos] >>> 22) | ((in[11 + inpos] & 511) << (19 - 9))) + out[18 + outpos] = (((in[14 + inpos] >>> 2) & 33554431)) + out[18 + outpos - 1]; - out[19 + outpos] = (((in[11 + inpos] >>> 9) & 524287)) + out[19 + outpos] = ((in[14 + inpos] >>> 27) | ((in[15 + inpos] & 1048575) << (25 - 20))) + out[19 + outpos - 1]; - out[20 + outpos] = ((in[11 + inpos] >>> 28) | ((in[12 + inpos] & 32767) << (19 - 15))) + out[20 + outpos] = ((in[15 + inpos] >>> 20) | ((in[16 + inpos] & 8191) << (25 - 13))) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[12 + inpos] >>> 15) | ((in[13 + inpos] & 3) << (19 - 2))) + out[21 + outpos] = ((in[16 + inpos] >>> 13) | ((in[17 + inpos] & 63) << (25 - 6))) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[13 + inpos] >>> 2) & 524287)) + out[22 + outpos] = (((in[17 + inpos] >>> 6) & 33554431)) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[13 + inpos] >>> 21) | ((in[14 + inpos] & 255) << (19 - 8))) + out[23 + outpos] = ((in[17 + inpos] >>> 31) | ((in[18 + inpos] & 16777215) << (25 - 24))) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[14 + inpos] >>> 8) & 524287)) + out[24 + outpos] = ((in[18 + inpos] >>> 24) | ((in[19 + inpos] & 131071) << (25 - 17))) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[14 + inpos] >>> 27) | ((in[15 + inpos] & 16383) << (19 - 14))) + out[25 + outpos] = ((in[19 + inpos] >>> 17) | ((in[20 + inpos] & 1023) << (25 - 10))) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[15 + inpos] >>> 14) | ((in[16 + inpos] & 1) << (19 - 1))) + out[26 + outpos] = ((in[20 + inpos] >>> 10) | ((in[21 + inpos] & 7) << (25 - 3))) + out[26 + outpos - 1]; - out[27 + outpos] = (((in[16 + inpos] >>> 1) & 524287)) + out[27 + outpos] = (((in[21 + inpos] >>> 3) & 33554431)) + out[27 + outpos - 1]; - out[28 + outpos] = ((in[16 + inpos] >>> 20) | ((in[17 + inpos] & 127) << (19 - 7))) + out[28 + outpos] = ((in[21 + inpos] >>> 28) | ((in[22 + inpos] & 2097151) << (25 - 21))) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[17 + inpos] >>> 7) & 524287)) + out[29 + outpos] = ((in[22 + inpos] >>> 21) | ((in[23 + inpos] & 16383) << (25 - 14))) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[17 + inpos] >>> 26) | ((in[18 + inpos] & 8191) << (19 - 13))) + out[30 + outpos] = ((in[23 + inpos] >>> 14) | ((in[24 + inpos] & 127) << (25 - 7))) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[18 + inpos] >>> 13)) + out[31 + outpos] = ((in[24 + inpos] >>> 7)) + out[31 + outpos - 1]; } - protected static void integratedunpack20(final int initoffset, + protected static void integratedunpack26(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 1048575)) + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 67108863)) + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 20) | ((in[1 + inpos] & 255) << (20 - 8))) + out[1 + outpos] = ((in[0 + inpos] >>> 26) | ((in[1 + inpos] & 1048575) << (26 - 20))) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[1 + inpos] >>> 8) & 1048575)) + out[2 + outpos] = ((in[1 + inpos] >>> 20) | ((in[2 + inpos] & 16383) << (26 - 14))) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[1 + inpos] >>> 28) | ((in[2 + inpos] & 65535) << (20 - 16))) + out[3 + outpos] = ((in[2 + inpos] >>> 14) | ((in[3 + inpos] & 255) << (26 - 8))) + out[3 + outpos - 1]; - out[4 + outpos] = ((in[2 + inpos] >>> 16) | ((in[3 + inpos] & 15) << (20 - 4))) + out[4 + outpos] = ((in[3 + inpos] >>> 8) | ((in[4 + inpos] & 3) << (26 - 2))) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[3 + inpos] >>> 4) & 1048575)) + out[5 + outpos] = (((in[4 + inpos] >>> 2) & 67108863)) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[3 + inpos] >>> 24) | ((in[4 + inpos] & 4095) << (20 - 12))) + out[6 + outpos] = ((in[4 + inpos] >>> 28) | ((in[5 + inpos] & 4194303) << (26 - 22))) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[4 + inpos] >>> 12)) + out[7 + outpos] = ((in[5 + inpos] >>> 22) | ((in[6 + inpos] & 65535) << (26 - 16))) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[5 + inpos] >>> 0) & 1048575)) + out[8 + outpos] = ((in[6 + inpos] >>> 16) | ((in[7 + inpos] & 1023) << (26 - 10))) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[5 + inpos] >>> 20) | ((in[6 + inpos] & 255) << (20 - 8))) + out[9 + outpos] = ((in[7 + inpos] >>> 10) | ((in[8 + inpos] & 15) << (26 - 4))) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[6 + inpos] >>> 8) & 1048575)) + out[10 + outpos] = (((in[8 + inpos] >>> 4) & 67108863)) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[6 + inpos] >>> 28) | ((in[7 + inpos] & 65535) << (20 - 16))) + out[11 + outpos] = ((in[8 + inpos] >>> 30) | ((in[9 + inpos] & 16777215) << (26 - 24))) + out[11 + outpos - 1]; - out[12 + outpos] = ((in[7 + inpos] >>> 16) | ((in[8 + inpos] & 15) << (20 - 4))) + out[12 + outpos] = ((in[9 + inpos] >>> 24) | ((in[10 + inpos] & 262143) << (26 - 18))) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[8 + inpos] >>> 4) & 1048575)) + out[13 + outpos] = ((in[10 + inpos] >>> 18) | ((in[11 + inpos] & 4095) << (26 - 12))) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[8 + inpos] >>> 24) | ((in[9 + inpos] & 4095) << (20 - 12))) + out[14 + outpos] = ((in[11 + inpos] >>> 12) | ((in[12 + inpos] & 63) << (26 - 6))) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[9 + inpos] >>> 12)) + out[15 + outpos] = ((in[12 + inpos] >>> 6)) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[10 + inpos] >>> 0) & 1048575)) + out[16 + outpos] = (((in[13 + inpos] >>> 0) & 67108863)) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[10 + inpos] >>> 20) | ((in[11 + inpos] & 255) << (20 - 8))) + out[17 + outpos] = ((in[13 + inpos] >>> 26) | ((in[14 + inpos] & 1048575) << (26 - 20))) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[11 + inpos] >>> 8) & 1048575)) + out[18 + outpos] = ((in[14 + inpos] >>> 20) | ((in[15 + inpos] & 16383) << (26 - 14))) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[11 + inpos] >>> 28) | ((in[12 + inpos] & 65535) << (20 - 16))) + out[19 + outpos] = ((in[15 + inpos] >>> 14) | ((in[16 + inpos] & 255) << (26 - 8))) + out[19 + outpos - 1]; - out[20 + outpos] = ((in[12 + inpos] >>> 16) | ((in[13 + inpos] & 15) << (20 - 4))) + out[20 + outpos] = ((in[16 + inpos] >>> 8) | ((in[17 + inpos] & 3) << (26 - 2))) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[13 + inpos] >>> 4) & 1048575)) + out[21 + outpos] = (((in[17 + inpos] >>> 2) & 67108863)) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[13 + inpos] >>> 24) | ((in[14 + inpos] & 4095) << (20 - 12))) + out[22 + outpos] = ((in[17 + inpos] >>> 28) | ((in[18 + inpos] & 4194303) << (26 - 22))) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[14 + inpos] >>> 12)) + out[23 + outpos] = ((in[18 + inpos] >>> 22) | ((in[19 + inpos] & 65535) << (26 - 16))) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[15 + inpos] >>> 0) & 1048575)) + out[24 + outpos] = ((in[19 + inpos] >>> 16) | ((in[20 + inpos] & 1023) << (26 - 10))) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[15 + inpos] >>> 20) | ((in[16 + inpos] & 255) << (20 - 8))) + out[25 + outpos] = ((in[20 + inpos] >>> 10) | ((in[21 + inpos] & 15) << (26 - 4))) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[16 + inpos] >>> 8) & 1048575)) + out[26 + outpos] = (((in[21 + inpos] >>> 4) & 67108863)) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[16 + inpos] >>> 28) | ((in[17 + inpos] & 65535) << (20 - 16))) + out[27 + outpos] = ((in[21 + inpos] >>> 30) | ((in[22 + inpos] & 16777215) << (26 - 24))) + out[27 + outpos - 1]; - out[28 + outpos] = ((in[17 + inpos] >>> 16) | ((in[18 + inpos] & 15) << (20 - 4))) + out[28 + outpos] = ((in[22 + inpos] >>> 24) | ((in[23 + inpos] & 262143) << (26 - 18))) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[18 + inpos] >>> 4) & 1048575)) + out[29 + outpos] = ((in[23 + inpos] >>> 18) | ((in[24 + inpos] & 4095) << (26 - 12))) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[18 + inpos] >>> 24) | ((in[19 + inpos] & 4095) << (20 - 12))) + out[30 + outpos] = ((in[24 + inpos] >>> 12) | ((in[25 + inpos] & 63) << (26 - 6))) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[19 + inpos] >>> 12)) + out[31 + outpos] = ((in[25 + inpos] >>> 6)) + out[31 + outpos - 1]; } - protected static void integratedunpack21(final int initoffset, + protected static void integratedunpack27(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 2097151)) + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 134217727)) + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 21) | ((in[1 + inpos] & 1023) << (21 - 10))) + out[1 + outpos] = ((in[0 + inpos] >>> 27) | ((in[1 + inpos] & 4194303) << (27 - 22))) + out[1 + outpos - 1]; - out[2 + outpos] = (((in[1 + inpos] >>> 10) & 2097151)) + out[2 + outpos] = ((in[1 + inpos] >>> 22) | ((in[2 + inpos] & 131071) << (27 - 17))) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[1 + inpos] >>> 31) | ((in[2 + inpos] & 1048575) << (21 - 20))) + out[3 + outpos] = ((in[2 + inpos] >>> 17) | ((in[3 + inpos] & 4095) << (27 - 12))) + out[3 + outpos - 1]; - out[4 + outpos] = ((in[2 + inpos] >>> 20) | ((in[3 + inpos] & 511) << (21 - 9))) + out[4 + outpos] = ((in[3 + inpos] >>> 12) | ((in[4 + inpos] & 127) << (27 - 7))) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[3 + inpos] >>> 9) & 2097151)) + out[5 + outpos] = ((in[4 + inpos] >>> 7) | ((in[5 + inpos] & 3) << (27 - 2))) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[3 + inpos] >>> 30) | ((in[4 + inpos] & 524287) << (21 - 19))) + out[6 + outpos] = (((in[5 + inpos] >>> 2) & 134217727)) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[4 + inpos] >>> 19) | ((in[5 + inpos] & 255) << (21 - 8))) + out[7 + outpos] = ((in[5 + inpos] >>> 29) | ((in[6 + inpos] & 16777215) << (27 - 24))) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[5 + inpos] >>> 8) & 2097151)) + out[8 + outpos] = ((in[6 + inpos] >>> 24) | ((in[7 + inpos] & 524287) << (27 - 19))) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[5 + inpos] >>> 29) | ((in[6 + inpos] & 262143) << (21 - 18))) + out[9 + outpos] = ((in[7 + inpos] >>> 19) | ((in[8 + inpos] & 16383) << (27 - 14))) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[6 + inpos] >>> 18) | ((in[7 + inpos] & 127) << (21 - 7))) + out[10 + outpos] = ((in[8 + inpos] >>> 14) | ((in[9 + inpos] & 511) << (27 - 9))) + out[10 + outpos - 1]; - out[11 + outpos] = (((in[7 + inpos] >>> 7) & 2097151)) + out[11 + outpos] = ((in[9 + inpos] >>> 9) | ((in[10 + inpos] & 15) << (27 - 4))) + out[11 + outpos - 1]; - out[12 + outpos] = ((in[7 + inpos] >>> 28) | ((in[8 + inpos] & 131071) << (21 - 17))) + out[12 + outpos] = (((in[10 + inpos] >>> 4) & 134217727)) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[8 + inpos] >>> 17) | ((in[9 + inpos] & 63) << (21 - 6))) + out[13 + outpos] = ((in[10 + inpos] >>> 31) | ((in[11 + inpos] & 67108863) << (27 - 26))) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[9 + inpos] >>> 6) & 2097151)) + out[14 + outpos] = ((in[11 + inpos] >>> 26) | ((in[12 + inpos] & 2097151) << (27 - 21))) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[9 + inpos] >>> 27) | ((in[10 + inpos] & 65535) << (21 - 16))) + out[15 + outpos] = ((in[12 + inpos] >>> 21) | ((in[13 + inpos] & 65535) << (27 - 16))) + out[15 + outpos - 1]; - out[16 + outpos] = ((in[10 + inpos] >>> 16) | ((in[11 + inpos] & 31) << (21 - 5))) + out[16 + outpos] = ((in[13 + inpos] >>> 16) | ((in[14 + inpos] & 2047) << (27 - 11))) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[11 + inpos] >>> 5) & 2097151)) + out[17 + outpos] = ((in[14 + inpos] >>> 11) | ((in[15 + inpos] & 63) << (27 - 6))) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[11 + inpos] >>> 26) | ((in[12 + inpos] & 32767) << (21 - 15))) + out[18 + outpos] = ((in[15 + inpos] >>> 6) | ((in[16 + inpos] & 1) << (27 - 1))) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[12 + inpos] >>> 15) | ((in[13 + inpos] & 15) << (21 - 4))) + out[19 + outpos] = (((in[16 + inpos] >>> 1) & 134217727)) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[13 + inpos] >>> 4) & 2097151)) + out[20 + outpos] = ((in[16 + inpos] >>> 28) | ((in[17 + inpos] & 8388607) << (27 - 23))) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[13 + inpos] >>> 25) | ((in[14 + inpos] & 16383) << (21 - 14))) + out[21 + outpos] = ((in[17 + inpos] >>> 23) | ((in[18 + inpos] & 262143) << (27 - 18))) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[14 + inpos] >>> 14) | ((in[15 + inpos] & 7) << (21 - 3))) + out[22 + outpos] = ((in[18 + inpos] >>> 18) | ((in[19 + inpos] & 8191) << (27 - 13))) + out[22 + outpos - 1]; - out[23 + outpos] = (((in[15 + inpos] >>> 3) & 2097151)) + out[23 + outpos] = ((in[19 + inpos] >>> 13) | ((in[20 + inpos] & 255) << (27 - 8))) + out[23 + outpos - 1]; - out[24 + outpos] = ((in[15 + inpos] >>> 24) | ((in[16 + inpos] & 8191) << (21 - 13))) + out[24 + outpos] = ((in[20 + inpos] >>> 8) | ((in[21 + inpos] & 7) << (27 - 3))) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[16 + inpos] >>> 13) | ((in[17 + inpos] & 3) << (21 - 2))) + out[25 + outpos] = (((in[21 + inpos] >>> 3) & 134217727)) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[17 + inpos] >>> 2) & 2097151)) + out[26 + outpos] = ((in[21 + inpos] >>> 30) | ((in[22 + inpos] & 33554431) << (27 - 25))) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[17 + inpos] >>> 23) | ((in[18 + inpos] & 4095) << (21 - 12))) + out[27 + outpos] = ((in[22 + inpos] >>> 25) | ((in[23 + inpos] & 1048575) << (27 - 20))) + out[27 + outpos - 1]; - out[28 + outpos] = ((in[18 + inpos] >>> 12) | ((in[19 + inpos] & 1) << (21 - 1))) + out[28 + outpos] = ((in[23 + inpos] >>> 20) | ((in[24 + inpos] & 32767) << (27 - 15))) + out[28 + outpos - 1]; - out[29 + outpos] = (((in[19 + inpos] >>> 1) & 2097151)) + out[29 + outpos] = ((in[24 + inpos] >>> 15) | ((in[25 + inpos] & 1023) << (27 - 10))) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[19 + inpos] >>> 22) | ((in[20 + inpos] & 2047) << (21 - 11))) + out[30 + outpos] = ((in[25 + inpos] >>> 10) | ((in[26 + inpos] & 31) << (27 - 5))) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[20 + inpos] >>> 11)) + out[31 + outpos] = ((in[26 + inpos] >>> 5)) + out[31 + outpos - 1]; } - protected static void integratedunpack22(final int initoffset, + protected static void integratedunpack28(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 4194303)) + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 268435455)) + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 22) | ((in[1 + inpos] & 4095) << (22 - 12))) + out[1 + outpos] = ((in[0 + inpos] >>> 28) | ((in[1 + inpos] & 16777215) << (28 - 24))) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[1 + inpos] >>> 12) | ((in[2 + inpos] & 3) << (22 - 2))) + out[2 + outpos] = ((in[1 + inpos] >>> 24) | ((in[2 + inpos] & 1048575) << (28 - 20))) + out[2 + outpos - 1]; - out[3 + outpos] = (((in[2 + inpos] >>> 2) & 4194303)) + out[3 + outpos] = ((in[2 + inpos] >>> 20) | ((in[3 + inpos] & 65535) << (28 - 16))) + out[3 + outpos - 1]; - out[4 + outpos] = ((in[2 + inpos] >>> 24) | ((in[3 + inpos] & 16383) << (22 - 14))) + out[4 + outpos] = ((in[3 + inpos] >>> 16) | ((in[4 + inpos] & 4095) << (28 - 12))) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[3 + inpos] >>> 14) | ((in[4 + inpos] & 15) << (22 - 4))) + out[5 + outpos] = ((in[4 + inpos] >>> 12) | ((in[5 + inpos] & 255) << (28 - 8))) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[4 + inpos] >>> 4) & 4194303)) + out[6 + outpos] = ((in[5 + inpos] >>> 8) | ((in[6 + inpos] & 15) << (28 - 4))) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[4 + inpos] >>> 26) | ((in[5 + inpos] & 65535) << (22 - 16))) - + out[7 + outpos - 1]; - out[8 + outpos] = ((in[5 + inpos] >>> 16) | ((in[6 + inpos] & 63) << (22 - 6))) + out[7 + outpos] = ((in[6 + inpos] >>> 4)) + out[7 + outpos - 1]; + out[8 + outpos] = (((in[7 + inpos] >>> 0) & 268435455)) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[6 + inpos] >>> 6) & 4194303)) + out[9 + outpos] = ((in[7 + inpos] >>> 28) | ((in[8 + inpos] & 16777215) << (28 - 24))) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[6 + inpos] >>> 28) | ((in[7 + inpos] & 262143) << (22 - 18))) + out[10 + outpos] = ((in[8 + inpos] >>> 24) | ((in[9 + inpos] & 1048575) << (28 - 20))) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[7 + inpos] >>> 18) | ((in[8 + inpos] & 255) << (22 - 8))) + out[11 + outpos] = ((in[9 + inpos] >>> 20) | ((in[10 + inpos] & 65535) << (28 - 16))) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[8 + inpos] >>> 8) & 4194303)) + out[12 + outpos] = ((in[10 + inpos] >>> 16) | ((in[11 + inpos] & 4095) << (28 - 12))) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[8 + inpos] >>> 30) | ((in[9 + inpos] & 1048575) << (22 - 20))) + out[13 + outpos] = ((in[11 + inpos] >>> 12) | ((in[12 + inpos] & 255) << (28 - 8))) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[9 + inpos] >>> 20) | ((in[10 + inpos] & 1023) << (22 - 10))) + out[14 + outpos] = ((in[12 + inpos] >>> 8) | ((in[13 + inpos] & 15) << (28 - 4))) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[10 + inpos] >>> 10)) + out[15 + outpos] = ((in[13 + inpos] >>> 4)) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[11 + inpos] >>> 0) & 4194303)) + out[16 + outpos] = (((in[14 + inpos] >>> 0) & 268435455)) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[11 + inpos] >>> 22) | ((in[12 + inpos] & 4095) << (22 - 12))) + out[17 + outpos] = ((in[14 + inpos] >>> 28) | ((in[15 + inpos] & 16777215) << (28 - 24))) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[12 + inpos] >>> 12) | ((in[13 + inpos] & 3) << (22 - 2))) + out[18 + outpos] = ((in[15 + inpos] >>> 24) | ((in[16 + inpos] & 1048575) << (28 - 20))) + out[18 + outpos - 1]; - out[19 + outpos] = (((in[13 + inpos] >>> 2) & 4194303)) + out[19 + outpos] = ((in[16 + inpos] >>> 20) | ((in[17 + inpos] & 65535) << (28 - 16))) + out[19 + outpos - 1]; - out[20 + outpos] = ((in[13 + inpos] >>> 24) | ((in[14 + inpos] & 16383) << (22 - 14))) + out[20 + outpos] = ((in[17 + inpos] >>> 16) | ((in[18 + inpos] & 4095) << (28 - 12))) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[14 + inpos] >>> 14) | ((in[15 + inpos] & 15) << (22 - 4))) + out[21 + outpos] = ((in[18 + inpos] >>> 12) | ((in[19 + inpos] & 255) << (28 - 8))) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[15 + inpos] >>> 4) & 4194303)) + out[22 + outpos] = ((in[19 + inpos] >>> 8) | ((in[20 + inpos] & 15) << (28 - 4))) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[15 + inpos] >>> 26) | ((in[16 + inpos] & 65535) << (22 - 16))) + out[23 + outpos] = ((in[20 + inpos] >>> 4)) + out[23 + outpos - 1]; - out[24 + outpos] = ((in[16 + inpos] >>> 16) | ((in[17 + inpos] & 63) << (22 - 6))) + out[24 + outpos] = (((in[21 + inpos] >>> 0) & 268435455)) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[17 + inpos] >>> 6) & 4194303)) + out[25 + outpos] = ((in[21 + inpos] >>> 28) | ((in[22 + inpos] & 16777215) << (28 - 24))) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[17 + inpos] >>> 28) | ((in[18 + inpos] & 262143) << (22 - 18))) + out[26 + outpos] = ((in[22 + inpos] >>> 24) | ((in[23 + inpos] & 1048575) << (28 - 20))) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[18 + inpos] >>> 18) | ((in[19 + inpos] & 255) << (22 - 8))) + out[27 + outpos] = ((in[23 + inpos] >>> 20) | ((in[24 + inpos] & 65535) << (28 - 16))) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[19 + inpos] >>> 8) & 4194303)) + out[28 + outpos] = ((in[24 + inpos] >>> 16) | ((in[25 + inpos] & 4095) << (28 - 12))) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[19 + inpos] >>> 30) | ((in[20 + inpos] & 1048575) << (22 - 20))) + out[29 + outpos] = ((in[25 + inpos] >>> 12) | ((in[26 + inpos] & 255) << (28 - 8))) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[20 + inpos] >>> 20) | ((in[21 + inpos] & 1023) << (22 - 10))) + out[30 + outpos] = ((in[26 + inpos] >>> 8) | ((in[27 + inpos] & 15) << (28 - 4))) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[21 + inpos] >>> 10)) + out[31 + outpos] = ((in[27 + inpos] >>> 4)) + out[31 + outpos - 1]; } - protected static void integratedunpack23(final int initoffset, + protected static void integratedunpack29(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 8388607)) + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 536870911)) + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 23) | ((in[1 + inpos] & 16383) << (23 - 14))) + out[1 + outpos] = ((in[0 + inpos] >>> 29) | ((in[1 + inpos] & 67108863) << (29 - 26))) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[1 + inpos] >>> 14) | ((in[2 + inpos] & 31) << (23 - 5))) + out[2 + outpos] = ((in[1 + inpos] >>> 26) | ((in[2 + inpos] & 8388607) << (29 - 23))) + out[2 + outpos - 1]; - out[3 + outpos] = (((in[2 + inpos] >>> 5) & 8388607)) + out[3 + outpos] = ((in[2 + inpos] >>> 23) | ((in[3 + inpos] & 1048575) << (29 - 20))) + out[3 + outpos - 1]; - out[4 + outpos] = ((in[2 + inpos] >>> 28) | ((in[3 + inpos] & 524287) << (23 - 19))) + out[4 + outpos] = ((in[3 + inpos] >>> 20) | ((in[4 + inpos] & 131071) << (29 - 17))) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[3 + inpos] >>> 19) | ((in[4 + inpos] & 1023) << (23 - 10))) + out[5 + outpos] = ((in[4 + inpos] >>> 17) | ((in[5 + inpos] & 16383) << (29 - 14))) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[4 + inpos] >>> 10) | ((in[5 + inpos] & 1) << (23 - 1))) + out[6 + outpos] = ((in[5 + inpos] >>> 14) | ((in[6 + inpos] & 2047) << (29 - 11))) + out[6 + outpos - 1]; - out[7 + outpos] = (((in[5 + inpos] >>> 1) & 8388607)) + out[7 + outpos] = ((in[6 + inpos] >>> 11) | ((in[7 + inpos] & 255) << (29 - 8))) + out[7 + outpos - 1]; - out[8 + outpos] = ((in[5 + inpos] >>> 24) | ((in[6 + inpos] & 32767) << (23 - 15))) + out[8 + outpos] = ((in[7 + inpos] >>> 8) | ((in[8 + inpos] & 31) << (29 - 5))) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[6 + inpos] >>> 15) | ((in[7 + inpos] & 63) << (23 - 6))) + out[9 + outpos] = ((in[8 + inpos] >>> 5) | ((in[9 + inpos] & 3) << (29 - 2))) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[7 + inpos] >>> 6) & 8388607)) + out[10 + outpos] = (((in[9 + inpos] >>> 2) & 536870911)) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[7 + inpos] >>> 29) | ((in[8 + inpos] & 1048575) << (23 - 20))) + out[11 + outpos] = ((in[9 + inpos] >>> 31) | ((in[10 + inpos] & 268435455) << (29 - 28))) + out[11 + outpos - 1]; - out[12 + outpos] = ((in[8 + inpos] >>> 20) | ((in[9 + inpos] & 2047) << (23 - 11))) + out[12 + outpos] = ((in[10 + inpos] >>> 28) | ((in[11 + inpos] & 33554431) << (29 - 25))) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[9 + inpos] >>> 11) | ((in[10 + inpos] & 3) << (23 - 2))) + out[13 + outpos] = ((in[11 + inpos] >>> 25) | ((in[12 + inpos] & 4194303) << (29 - 22))) + out[13 + outpos - 1]; - out[14 + outpos] = (((in[10 + inpos] >>> 2) & 8388607)) + out[14 + outpos] = ((in[12 + inpos] >>> 22) | ((in[13 + inpos] & 524287) << (29 - 19))) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[10 + inpos] >>> 25) | ((in[11 + inpos] & 65535) << (23 - 16))) + out[15 + outpos] = ((in[13 + inpos] >>> 19) | ((in[14 + inpos] & 65535) << (29 - 16))) + out[15 + outpos - 1]; - out[16 + outpos] = ((in[11 + inpos] >>> 16) | ((in[12 + inpos] & 127) << (23 - 7))) + out[16 + outpos] = ((in[14 + inpos] >>> 16) | ((in[15 + inpos] & 8191) << (29 - 13))) + out[16 + outpos - 1]; - out[17 + outpos] = (((in[12 + inpos] >>> 7) & 8388607)) + out[17 + outpos] = ((in[15 + inpos] >>> 13) | ((in[16 + inpos] & 1023) << (29 - 10))) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[12 + inpos] >>> 30) | ((in[13 + inpos] & 2097151) << (23 - 21))) + out[18 + outpos] = ((in[16 + inpos] >>> 10) | ((in[17 + inpos] & 127) << (29 - 7))) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[13 + inpos] >>> 21) | ((in[14 + inpos] & 4095) << (23 - 12))) + out[19 + outpos] = ((in[17 + inpos] >>> 7) | ((in[18 + inpos] & 15) << (29 - 4))) + out[19 + outpos - 1]; - out[20 + outpos] = ((in[14 + inpos] >>> 12) | ((in[15 + inpos] & 7) << (23 - 3))) + out[20 + outpos] = ((in[18 + inpos] >>> 4) | ((in[19 + inpos] & 1) << (29 - 1))) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[15 + inpos] >>> 3) & 8388607)) + out[21 + outpos] = (((in[19 + inpos] >>> 1) & 536870911)) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[15 + inpos] >>> 26) | ((in[16 + inpos] & 131071) << (23 - 17))) + out[22 + outpos] = ((in[19 + inpos] >>> 30) | ((in[20 + inpos] & 134217727) << (29 - 27))) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[16 + inpos] >>> 17) | ((in[17 + inpos] & 255) << (23 - 8))) + out[23 + outpos] = ((in[20 + inpos] >>> 27) | ((in[21 + inpos] & 16777215) << (29 - 24))) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[17 + inpos] >>> 8) & 8388607)) + out[24 + outpos] = ((in[21 + inpos] >>> 24) | ((in[22 + inpos] & 2097151) << (29 - 21))) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[17 + inpos] >>> 31) | ((in[18 + inpos] & 4194303) << (23 - 22))) + out[25 + outpos] = ((in[22 + inpos] >>> 21) | ((in[23 + inpos] & 262143) << (29 - 18))) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[18 + inpos] >>> 22) | ((in[19 + inpos] & 8191) << (23 - 13))) + out[26 + outpos] = ((in[23 + inpos] >>> 18) | ((in[24 + inpos] & 32767) << (29 - 15))) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[19 + inpos] >>> 13) | ((in[20 + inpos] & 15) << (23 - 4))) + out[27 + outpos] = ((in[24 + inpos] >>> 15) | ((in[25 + inpos] & 4095) << (29 - 12))) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[20 + inpos] >>> 4) & 8388607)) + out[28 + outpos] = ((in[25 + inpos] >>> 12) | ((in[26 + inpos] & 511) << (29 - 9))) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[20 + inpos] >>> 27) | ((in[21 + inpos] & 262143) << (23 - 18))) + out[29 + outpos] = ((in[26 + inpos] >>> 9) | ((in[27 + inpos] & 63) << (29 - 6))) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[21 + inpos] >>> 18) | ((in[22 + inpos] & 511) << (23 - 9))) + out[30 + outpos] = ((in[27 + inpos] >>> 6) | ((in[28 + inpos] & 7) << (29 - 3))) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[22 + inpos] >>> 9)) + out[31 + outpos] = ((in[28 + inpos] >>> 3)) + out[31 + outpos - 1]; } - protected static void integratedunpack24(final int initoffset, + protected static void integratedunpack3(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 16777215)) - + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 24) | ((in[1 + inpos] & 65535) << (24 - 16))) + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 7)) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 3) & 7)) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[1 + inpos] >>> 16) | ((in[2 + inpos] & 255) << (24 - 8))) + out[2 + outpos] = (((in[0 + inpos] >>> 6) & 7)) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[2 + inpos] >>> 8)) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[3 + inpos] >>> 0) & 16777215)) + out[3 + outpos] = (((in[0 + inpos] >>> 9) & 7)) + + out[3 + outpos - 1]; + out[4 + outpos] = (((in[0 + inpos] >>> 12) & 7)) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[3 + inpos] >>> 24) | ((in[4 + inpos] & 65535) << (24 - 16))) + out[5 + outpos] = (((in[0 + inpos] >>> 15) & 7)) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[4 + inpos] >>> 16) | ((in[5 + inpos] & 255) << (24 - 8))) + out[6 + outpos] = (((in[0 + inpos] >>> 18) & 7)) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[5 + inpos] >>> 8)) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[6 + inpos] >>> 0) & 16777215)) + out[7 + outpos] = (((in[0 + inpos] >>> 21) & 7)) + + out[7 + outpos - 1]; + out[8 + outpos] = (((in[0 + inpos] >>> 24) & 7)) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[6 + inpos] >>> 24) | ((in[7 + inpos] & 65535) << (24 - 16))) + out[9 + outpos] = (((in[0 + inpos] >>> 27) & 7)) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[7 + inpos] >>> 16) | ((in[8 + inpos] & 255) << (24 - 8))) + out[10 + outpos] = ((in[0 + inpos] >>> 30) | ((in[1 + inpos] & 1) << (3 - 1))) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[8 + inpos] >>> 8)) + out[11 + outpos] = (((in[1 + inpos] >>> 1) & 7)) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[9 + inpos] >>> 0) & 16777215)) + out[12 + outpos] = (((in[1 + inpos] >>> 4) & 7)) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[9 + inpos] >>> 24) | ((in[10 + inpos] & 65535) << (24 - 16))) + out[13 + outpos] = (((in[1 + inpos] >>> 7) & 7)) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[10 + inpos] >>> 16) | ((in[11 + inpos] & 255) << (24 - 8))) + out[14 + outpos] = (((in[1 + inpos] >>> 10) & 7)) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[11 + inpos] >>> 8)) + out[15 + outpos] = (((in[1 + inpos] >>> 13) & 7)) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[12 + inpos] >>> 0) & 16777215)) + out[16 + outpos] = (((in[1 + inpos] >>> 16) & 7)) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[12 + inpos] >>> 24) | ((in[13 + inpos] & 65535) << (24 - 16))) + out[17 + outpos] = (((in[1 + inpos] >>> 19) & 7)) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[13 + inpos] >>> 16) | ((in[14 + inpos] & 255) << (24 - 8))) + out[18 + outpos] = (((in[1 + inpos] >>> 22) & 7)) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[14 + inpos] >>> 8)) + out[19 + outpos] = (((in[1 + inpos] >>> 25) & 7)) + out[19 + outpos - 1]; - out[20 + outpos] = (((in[15 + inpos] >>> 0) & 16777215)) + out[20 + outpos] = (((in[1 + inpos] >>> 28) & 7)) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[15 + inpos] >>> 24) | ((in[16 + inpos] & 65535) << (24 - 16))) + out[21 + outpos] = ((in[1 + inpos] >>> 31) | ((in[2 + inpos] & 3) << (3 - 2))) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[16 + inpos] >>> 16) | ((in[17 + inpos] & 255) << (24 - 8))) + out[22 + outpos] = (((in[2 + inpos] >>> 2) & 7)) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[17 + inpos] >>> 8)) + out[23 + outpos] = (((in[2 + inpos] >>> 5) & 7)) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[18 + inpos] >>> 0) & 16777215)) + out[24 + outpos] = (((in[2 + inpos] >>> 8) & 7)) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[18 + inpos] >>> 24) | ((in[19 + inpos] & 65535) << (24 - 16))) + out[25 + outpos] = (((in[2 + inpos] >>> 11) & 7)) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[19 + inpos] >>> 16) | ((in[20 + inpos] & 255) << (24 - 8))) + out[26 + outpos] = (((in[2 + inpos] >>> 14) & 7)) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[20 + inpos] >>> 8)) + out[27 + outpos] = (((in[2 + inpos] >>> 17) & 7)) + out[27 + outpos - 1]; - out[28 + outpos] = (((in[21 + inpos] >>> 0) & 16777215)) + out[28 + outpos] = (((in[2 + inpos] >>> 20) & 7)) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[21 + inpos] >>> 24) | ((in[22 + inpos] & 65535) << (24 - 16))) + out[29 + outpos] = (((in[2 + inpos] >>> 23) & 7)) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[22 + inpos] >>> 16) | ((in[23 + inpos] & 255) << (24 - 8))) + out[30 + outpos] = (((in[2 + inpos] >>> 26) & 7)) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[23 + inpos] >>> 8)) + out[31 + outpos] = ((in[2 + inpos] >>> 29)) + out[31 + outpos - 1]; } - protected static void integratedunpack25(final int initoffset, + protected static void integratedunpack30(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 33554431)) + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 1073741823)) + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 25) | ((in[1 + inpos] & 262143) << (25 - 18))) + out[1 + outpos] = ((in[0 + inpos] >>> 30) | ((in[1 + inpos] & 268435455) << (30 - 28))) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[1 + inpos] >>> 18) | ((in[2 + inpos] & 2047) << (25 - 11))) + out[2 + outpos] = ((in[1 + inpos] >>> 28) | ((in[2 + inpos] & 67108863) << (30 - 26))) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[2 + inpos] >>> 11) | ((in[3 + inpos] & 15) << (25 - 4))) + out[3 + outpos] = ((in[2 + inpos] >>> 26) | ((in[3 + inpos] & 16777215) << (30 - 24))) + out[3 + outpos - 1]; - out[4 + outpos] = (((in[3 + inpos] >>> 4) & 33554431)) + out[4 + outpos] = ((in[3 + inpos] >>> 24) | ((in[4 + inpos] & 4194303) << (30 - 22))) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[3 + inpos] >>> 29) | ((in[4 + inpos] & 4194303) << (25 - 22))) + out[5 + outpos] = ((in[4 + inpos] >>> 22) | ((in[5 + inpos] & 1048575) << (30 - 20))) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[4 + inpos] >>> 22) | ((in[5 + inpos] & 32767) << (25 - 15))) + out[6 + outpos] = ((in[5 + inpos] >>> 20) | ((in[6 + inpos] & 262143) << (30 - 18))) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[5 + inpos] >>> 15) | ((in[6 + inpos] & 255) << (25 - 8))) + out[7 + outpos] = ((in[6 + inpos] >>> 18) | ((in[7 + inpos] & 65535) << (30 - 16))) + out[7 + outpos - 1]; - out[8 + outpos] = ((in[6 + inpos] >>> 8) | ((in[7 + inpos] & 1) << (25 - 1))) + out[8 + outpos] = ((in[7 + inpos] >>> 16) | ((in[8 + inpos] & 16383) << (30 - 14))) + out[8 + outpos - 1]; - out[9 + outpos] = (((in[7 + inpos] >>> 1) & 33554431)) + out[9 + outpos] = ((in[8 + inpos] >>> 14) | ((in[9 + inpos] & 4095) << (30 - 12))) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[7 + inpos] >>> 26) | ((in[8 + inpos] & 524287) << (25 - 19))) + out[10 + outpos] = ((in[9 + inpos] >>> 12) | ((in[10 + inpos] & 1023) << (30 - 10))) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[8 + inpos] >>> 19) | ((in[9 + inpos] & 4095) << (25 - 12))) + out[11 + outpos] = ((in[10 + inpos] >>> 10) | ((in[11 + inpos] & 255) << (30 - 8))) + out[11 + outpos - 1]; - out[12 + outpos] = ((in[9 + inpos] >>> 12) | ((in[10 + inpos] & 31) << (25 - 5))) + out[12 + outpos] = ((in[11 + inpos] >>> 8) | ((in[12 + inpos] & 63) << (30 - 6))) + out[12 + outpos - 1]; - out[13 + outpos] = (((in[10 + inpos] >>> 5) & 33554431)) + out[13 + outpos] = ((in[12 + inpos] >>> 6) | ((in[13 + inpos] & 15) << (30 - 4))) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[10 + inpos] >>> 30) | ((in[11 + inpos] & 8388607) << (25 - 23))) + out[14 + outpos] = ((in[13 + inpos] >>> 4) | ((in[14 + inpos] & 3) << (30 - 2))) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[11 + inpos] >>> 23) | ((in[12 + inpos] & 65535) << (25 - 16))) + out[15 + outpos] = ((in[14 + inpos] >>> 2)) + out[15 + outpos - 1]; - out[16 + outpos] = ((in[12 + inpos] >>> 16) | ((in[13 + inpos] & 511) << (25 - 9))) + out[16 + outpos] = (((in[15 + inpos] >>> 0) & 1073741823)) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[13 + inpos] >>> 9) | ((in[14 + inpos] & 3) << (25 - 2))) + out[17 + outpos] = ((in[15 + inpos] >>> 30) | ((in[16 + inpos] & 268435455) << (30 - 28))) + out[17 + outpos - 1]; - out[18 + outpos] = (((in[14 + inpos] >>> 2) & 33554431)) + out[18 + outpos] = ((in[16 + inpos] >>> 28) | ((in[17 + inpos] & 67108863) << (30 - 26))) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[14 + inpos] >>> 27) | ((in[15 + inpos] & 1048575) << (25 - 20))) + out[19 + outpos] = ((in[17 + inpos] >>> 26) | ((in[18 + inpos] & 16777215) << (30 - 24))) + out[19 + outpos - 1]; - out[20 + outpos] = ((in[15 + inpos] >>> 20) | ((in[16 + inpos] & 8191) << (25 - 13))) + out[20 + outpos] = ((in[18 + inpos] >>> 24) | ((in[19 + inpos] & 4194303) << (30 - 22))) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[16 + inpos] >>> 13) | ((in[17 + inpos] & 63) << (25 - 6))) + out[21 + outpos] = ((in[19 + inpos] >>> 22) | ((in[20 + inpos] & 1048575) << (30 - 20))) + out[21 + outpos - 1]; - out[22 + outpos] = (((in[17 + inpos] >>> 6) & 33554431)) + out[22 + outpos] = ((in[20 + inpos] >>> 20) | ((in[21 + inpos] & 262143) << (30 - 18))) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[17 + inpos] >>> 31) | ((in[18 + inpos] & 16777215) << (25 - 24))) + out[23 + outpos] = ((in[21 + inpos] >>> 18) | ((in[22 + inpos] & 65535) << (30 - 16))) + out[23 + outpos - 1]; - out[24 + outpos] = ((in[18 + inpos] >>> 24) | ((in[19 + inpos] & 131071) << (25 - 17))) + out[24 + outpos] = ((in[22 + inpos] >>> 16) | ((in[23 + inpos] & 16383) << (30 - 14))) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[19 + inpos] >>> 17) | ((in[20 + inpos] & 1023) << (25 - 10))) + out[25 + outpos] = ((in[23 + inpos] >>> 14) | ((in[24 + inpos] & 4095) << (30 - 12))) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[20 + inpos] >>> 10) | ((in[21 + inpos] & 7) << (25 - 3))) + out[26 + outpos] = ((in[24 + inpos] >>> 12) | ((in[25 + inpos] & 1023) << (30 - 10))) + out[26 + outpos - 1]; - out[27 + outpos] = (((in[21 + inpos] >>> 3) & 33554431)) + out[27 + outpos] = ((in[25 + inpos] >>> 10) | ((in[26 + inpos] & 255) << (30 - 8))) + out[27 + outpos - 1]; - out[28 + outpos] = ((in[21 + inpos] >>> 28) | ((in[22 + inpos] & 2097151) << (25 - 21))) + out[28 + outpos] = ((in[26 + inpos] >>> 8) | ((in[27 + inpos] & 63) << (30 - 6))) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[22 + inpos] >>> 21) | ((in[23 + inpos] & 16383) << (25 - 14))) + out[29 + outpos] = ((in[27 + inpos] >>> 6) | ((in[28 + inpos] & 15) << (30 - 4))) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[23 + inpos] >>> 14) | ((in[24 + inpos] & 127) << (25 - 7))) + out[30 + outpos] = ((in[28 + inpos] >>> 4) | ((in[29 + inpos] & 3) << (30 - 2))) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[24 + inpos] >>> 7)) + out[31 + outpos] = ((in[29 + inpos] >>> 2)) + out[31 + outpos - 1]; } - protected static void integratedunpack26(final int initoffset, + protected static void integratedunpack31(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 67108863)) + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 2147483647)) + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 26) | ((in[1 + inpos] & 1048575) << (26 - 20))) + out[1 + outpos] = ((in[0 + inpos] >>> 31) | ((in[1 + inpos] & 1073741823) << (31 - 30))) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[1 + inpos] >>> 20) | ((in[2 + inpos] & 16383) << (26 - 14))) + out[2 + outpos] = ((in[1 + inpos] >>> 30) | ((in[2 + inpos] & 536870911) << (31 - 29))) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[2 + inpos] >>> 14) | ((in[3 + inpos] & 255) << (26 - 8))) + out[3 + outpos] = ((in[2 + inpos] >>> 29) | ((in[3 + inpos] & 268435455) << (31 - 28))) + out[3 + outpos - 1]; - out[4 + outpos] = ((in[3 + inpos] >>> 8) | ((in[4 + inpos] & 3) << (26 - 2))) + out[4 + outpos] = ((in[3 + inpos] >>> 28) | ((in[4 + inpos] & 134217727) << (31 - 27))) + out[4 + outpos - 1]; - out[5 + outpos] = (((in[4 + inpos] >>> 2) & 67108863)) + out[5 + outpos] = ((in[4 + inpos] >>> 27) | ((in[5 + inpos] & 67108863) << (31 - 26))) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[4 + inpos] >>> 28) | ((in[5 + inpos] & 4194303) << (26 - 22))) + out[6 + outpos] = ((in[5 + inpos] >>> 26) | ((in[6 + inpos] & 33554431) << (31 - 25))) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[5 + inpos] >>> 22) | ((in[6 + inpos] & 65535) << (26 - 16))) + out[7 + outpos] = ((in[6 + inpos] >>> 25) | ((in[7 + inpos] & 16777215) << (31 - 24))) + out[7 + outpos - 1]; - out[8 + outpos] = ((in[6 + inpos] >>> 16) | ((in[7 + inpos] & 1023) << (26 - 10))) + out[8 + outpos] = ((in[7 + inpos] >>> 24) | ((in[8 + inpos] & 8388607) << (31 - 23))) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[7 + inpos] >>> 10) | ((in[8 + inpos] & 15) << (26 - 4))) + out[9 + outpos] = ((in[8 + inpos] >>> 23) | ((in[9 + inpos] & 4194303) << (31 - 22))) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[8 + inpos] >>> 4) & 67108863)) + out[10 + outpos] = ((in[9 + inpos] >>> 22) | ((in[10 + inpos] & 2097151) << (31 - 21))) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[8 + inpos] >>> 30) | ((in[9 + inpos] & 16777215) << (26 - 24))) + out[11 + outpos] = ((in[10 + inpos] >>> 21) | ((in[11 + inpos] & 1048575) << (31 - 20))) + out[11 + outpos - 1]; - out[12 + outpos] = ((in[9 + inpos] >>> 24) | ((in[10 + inpos] & 262143) << (26 - 18))) + out[12 + outpos] = ((in[11 + inpos] >>> 20) | ((in[12 + inpos] & 524287) << (31 - 19))) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[10 + inpos] >>> 18) | ((in[11 + inpos] & 4095) << (26 - 12))) + out[13 + outpos] = ((in[12 + inpos] >>> 19) | ((in[13 + inpos] & 262143) << (31 - 18))) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[11 + inpos] >>> 12) | ((in[12 + inpos] & 63) << (26 - 6))) + out[14 + outpos] = ((in[13 + inpos] >>> 18) | ((in[14 + inpos] & 131071) << (31 - 17))) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[12 + inpos] >>> 6)) + out[15 + outpos] = ((in[14 + inpos] >>> 17) | ((in[15 + inpos] & 65535) << (31 - 16))) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[13 + inpos] >>> 0) & 67108863)) + out[16 + outpos] = ((in[15 + inpos] >>> 16) | ((in[16 + inpos] & 32767) << (31 - 15))) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[13 + inpos] >>> 26) | ((in[14 + inpos] & 1048575) << (26 - 20))) + out[17 + outpos] = ((in[16 + inpos] >>> 15) | ((in[17 + inpos] & 16383) << (31 - 14))) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[14 + inpos] >>> 20) | ((in[15 + inpos] & 16383) << (26 - 14))) + out[18 + outpos] = ((in[17 + inpos] >>> 14) | ((in[18 + inpos] & 8191) << (31 - 13))) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[15 + inpos] >>> 14) | ((in[16 + inpos] & 255) << (26 - 8))) + out[19 + outpos] = ((in[18 + inpos] >>> 13) | ((in[19 + inpos] & 4095) << (31 - 12))) + out[19 + outpos - 1]; - out[20 + outpos] = ((in[16 + inpos] >>> 8) | ((in[17 + inpos] & 3) << (26 - 2))) + out[20 + outpos] = ((in[19 + inpos] >>> 12) | ((in[20 + inpos] & 2047) << (31 - 11))) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[17 + inpos] >>> 2) & 67108863)) + out[21 + outpos] = ((in[20 + inpos] >>> 11) | ((in[21 + inpos] & 1023) << (31 - 10))) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[17 + inpos] >>> 28) | ((in[18 + inpos] & 4194303) << (26 - 22))) + out[22 + outpos] = ((in[21 + inpos] >>> 10) | ((in[22 + inpos] & 511) << (31 - 9))) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[18 + inpos] >>> 22) | ((in[19 + inpos] & 65535) << (26 - 16))) + out[23 + outpos] = ((in[22 + inpos] >>> 9) | ((in[23 + inpos] & 255) << (31 - 8))) + out[23 + outpos - 1]; - out[24 + outpos] = ((in[19 + inpos] >>> 16) | ((in[20 + inpos] & 1023) << (26 - 10))) + out[24 + outpos] = ((in[23 + inpos] >>> 8) | ((in[24 + inpos] & 127) << (31 - 7))) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[20 + inpos] >>> 10) | ((in[21 + inpos] & 15) << (26 - 4))) + out[25 + outpos] = ((in[24 + inpos] >>> 7) | ((in[25 + inpos] & 63) << (31 - 6))) + out[25 + outpos - 1]; - out[26 + outpos] = (((in[21 + inpos] >>> 4) & 67108863)) + out[26 + outpos] = ((in[25 + inpos] >>> 6) | ((in[26 + inpos] & 31) << (31 - 5))) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[21 + inpos] >>> 30) | ((in[22 + inpos] & 16777215) << (26 - 24))) + out[27 + outpos] = ((in[26 + inpos] >>> 5) | ((in[27 + inpos] & 15) << (31 - 4))) + out[27 + outpos - 1]; - out[28 + outpos] = ((in[22 + inpos] >>> 24) | ((in[23 + inpos] & 262143) << (26 - 18))) + out[28 + outpos] = ((in[27 + inpos] >>> 4) | ((in[28 + inpos] & 7) << (31 - 3))) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[23 + inpos] >>> 18) | ((in[24 + inpos] & 4095) << (26 - 12))) + out[29 + outpos] = ((in[28 + inpos] >>> 3) | ((in[29 + inpos] & 3) << (31 - 2))) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[24 + inpos] >>> 12) | ((in[25 + inpos] & 63) << (26 - 6))) + out[30 + outpos] = ((in[29 + inpos] >>> 2) | ((in[30 + inpos] & 1) << (31 - 1))) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[25 + inpos] >>> 6)) + out[31 + outpos] = ((in[30 + inpos] >>> 1)) + out[31 + outpos - 1]; } - protected static void integratedunpack27(final int initoffset, + protected static void integratedunpack32(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 134217727)) - + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 27) | ((in[1 + inpos] & 4194303) << (27 - 22))) - + out[1 + outpos - 1]; - out[2 + outpos] = ((in[1 + inpos] >>> 22) | ((in[2 + inpos] & 131071) << (27 - 17))) - + out[2 + outpos - 1]; - out[3 + outpos] = ((in[2 + inpos] >>> 17) | ((in[3 + inpos] & 4095) << (27 - 12))) + System.arraycopy(in, inpos, out, outpos, 32); // no sense in + // doing delta + // coding + } + + protected static void integratedunpack4(final int initoffset, + final int[] in, int inpos, final int[] out, int outpos) { + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 15)) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 4) & 15)) + + out[1 + outpos - 1]; + out[2 + outpos] = (((in[0 + inpos] >>> 8) & 15)) + + out[2 + outpos - 1]; + out[3 + outpos] = (((in[0 + inpos] >>> 12) & 15)) + out[3 + outpos - 1]; - out[4 + outpos] = ((in[3 + inpos] >>> 12) | ((in[4 + inpos] & 127) << (27 - 7))) + out[4 + outpos] = (((in[0 + inpos] >>> 16) & 15)) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[4 + inpos] >>> 7) | ((in[5 + inpos] & 3) << (27 - 2))) + out[5 + outpos] = (((in[0 + inpos] >>> 20) & 15)) + out[5 + outpos - 1]; - out[6 + outpos] = (((in[5 + inpos] >>> 2) & 134217727)) + out[6 + outpos] = (((in[0 + inpos] >>> 24) & 15)) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[5 + inpos] >>> 29) | ((in[6 + inpos] & 16777215) << (27 - 24))) + out[7 + outpos] = ((in[0 + inpos] >>> 28)) + out[7 + outpos - 1]; - out[8 + outpos] = ((in[6 + inpos] >>> 24) | ((in[7 + inpos] & 524287) << (27 - 19))) + out[8 + outpos] = (((in[1 + inpos] >>> 0) & 15)) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[7 + inpos] >>> 19) | ((in[8 + inpos] & 16383) << (27 - 14))) + out[9 + outpos] = (((in[1 + inpos] >>> 4) & 15)) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[8 + inpos] >>> 14) | ((in[9 + inpos] & 511) << (27 - 9))) + out[10 + outpos] = (((in[1 + inpos] >>> 8) & 15)) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[9 + inpos] >>> 9) | ((in[10 + inpos] & 15) << (27 - 4))) + out[11 + outpos] = (((in[1 + inpos] >>> 12) & 15)) + out[11 + outpos - 1]; - out[12 + outpos] = (((in[10 + inpos] >>> 4) & 134217727)) + out[12 + outpos] = (((in[1 + inpos] >>> 16) & 15)) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[10 + inpos] >>> 31) | ((in[11 + inpos] & 67108863) << (27 - 26))) + out[13 + outpos] = (((in[1 + inpos] >>> 20) & 15)) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[11 + inpos] >>> 26) | ((in[12 + inpos] & 2097151) << (27 - 21))) + out[14 + outpos] = (((in[1 + inpos] >>> 24) & 15)) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[12 + inpos] >>> 21) | ((in[13 + inpos] & 65535) << (27 - 16))) + out[15 + outpos] = ((in[1 + inpos] >>> 28)) + out[15 + outpos - 1]; - out[16 + outpos] = ((in[13 + inpos] >>> 16) | ((in[14 + inpos] & 2047) << (27 - 11))) + out[16 + outpos] = (((in[2 + inpos] >>> 0) & 15)) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[14 + inpos] >>> 11) | ((in[15 + inpos] & 63) << (27 - 6))) + out[17 + outpos] = (((in[2 + inpos] >>> 4) & 15)) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[15 + inpos] >>> 6) | ((in[16 + inpos] & 1) << (27 - 1))) + out[18 + outpos] = (((in[2 + inpos] >>> 8) & 15)) + out[18 + outpos - 1]; - out[19 + outpos] = (((in[16 + inpos] >>> 1) & 134217727)) + out[19 + outpos] = (((in[2 + inpos] >>> 12) & 15)) + out[19 + outpos - 1]; - out[20 + outpos] = ((in[16 + inpos] >>> 28) | ((in[17 + inpos] & 8388607) << (27 - 23))) + out[20 + outpos] = (((in[2 + inpos] >>> 16) & 15)) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[17 + inpos] >>> 23) | ((in[18 + inpos] & 262143) << (27 - 18))) + out[21 + outpos] = (((in[2 + inpos] >>> 20) & 15)) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[18 + inpos] >>> 18) | ((in[19 + inpos] & 8191) << (27 - 13))) + out[22 + outpos] = (((in[2 + inpos] >>> 24) & 15)) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[19 + inpos] >>> 13) | ((in[20 + inpos] & 255) << (27 - 8))) + out[23 + outpos] = ((in[2 + inpos] >>> 28)) + out[23 + outpos - 1]; - out[24 + outpos] = ((in[20 + inpos] >>> 8) | ((in[21 + inpos] & 7) << (27 - 3))) + out[24 + outpos] = (((in[3 + inpos] >>> 0) & 15)) + out[24 + outpos - 1]; - out[25 + outpos] = (((in[21 + inpos] >>> 3) & 134217727)) + out[25 + outpos] = (((in[3 + inpos] >>> 4) & 15)) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[21 + inpos] >>> 30) | ((in[22 + inpos] & 33554431) << (27 - 25))) + out[26 + outpos] = (((in[3 + inpos] >>> 8) & 15)) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[22 + inpos] >>> 25) | ((in[23 + inpos] & 1048575) << (27 - 20))) + out[27 + outpos] = (((in[3 + inpos] >>> 12) & 15)) + out[27 + outpos - 1]; - out[28 + outpos] = ((in[23 + inpos] >>> 20) | ((in[24 + inpos] & 32767) << (27 - 15))) + out[28 + outpos] = (((in[3 + inpos] >>> 16) & 15)) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[24 + inpos] >>> 15) | ((in[25 + inpos] & 1023) << (27 - 10))) + out[29 + outpos] = (((in[3 + inpos] >>> 20) & 15)) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[25 + inpos] >>> 10) | ((in[26 + inpos] & 31) << (27 - 5))) + out[30 + outpos] = (((in[3 + inpos] >>> 24) & 15)) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[26 + inpos] >>> 5)) + out[31 + outpos] = ((in[3 + inpos] >>> 28)) + out[31 + outpos - 1]; } - protected static void integratedunpack28(final int initoffset, + protected static void integratedunpack5(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 268435455)) - + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 28) | ((in[1 + inpos] & 16777215) << (28 - 24))) + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 31)) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 5) & 31)) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[1 + inpos] >>> 24) | ((in[2 + inpos] & 1048575) << (28 - 20))) + out[2 + outpos] = (((in[0 + inpos] >>> 10) & 31)) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[2 + inpos] >>> 20) | ((in[3 + inpos] & 65535) << (28 - 16))) + out[3 + outpos] = (((in[0 + inpos] >>> 15) & 31)) + out[3 + outpos - 1]; - out[4 + outpos] = ((in[3 + inpos] >>> 16) | ((in[4 + inpos] & 4095) << (28 - 12))) + out[4 + outpos] = (((in[0 + inpos] >>> 20) & 31)) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[4 + inpos] >>> 12) | ((in[5 + inpos] & 255) << (28 - 8))) + out[5 + outpos] = (((in[0 + inpos] >>> 25) & 31)) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[5 + inpos] >>> 8) | ((in[6 + inpos] & 15) << (28 - 4))) + out[6 + outpos] = ((in[0 + inpos] >>> 30) | ((in[1 + inpos] & 7) << (5 - 3))) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[6 + inpos] >>> 4)) + out[7 + outpos - 1]; - out[8 + outpos] = (((in[7 + inpos] >>> 0) & 268435455)) + out[7 + outpos] = (((in[1 + inpos] >>> 3) & 31)) + + out[7 + outpos - 1]; + out[8 + outpos] = (((in[1 + inpos] >>> 8) & 31)) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[7 + inpos] >>> 28) | ((in[8 + inpos] & 16777215) << (28 - 24))) + out[9 + outpos] = (((in[1 + inpos] >>> 13) & 31)) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[8 + inpos] >>> 24) | ((in[9 + inpos] & 1048575) << (28 - 20))) + out[10 + outpos] = (((in[1 + inpos] >>> 18) & 31)) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[9 + inpos] >>> 20) | ((in[10 + inpos] & 65535) << (28 - 16))) + out[11 + outpos] = (((in[1 + inpos] >>> 23) & 31)) + out[11 + outpos - 1]; - out[12 + outpos] = ((in[10 + inpos] >>> 16) | ((in[11 + inpos] & 4095) << (28 - 12))) + out[12 + outpos] = ((in[1 + inpos] >>> 28) | ((in[2 + inpos] & 1) << (5 - 1))) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[11 + inpos] >>> 12) | ((in[12 + inpos] & 255) << (28 - 8))) + out[13 + outpos] = (((in[2 + inpos] >>> 1) & 31)) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[12 + inpos] >>> 8) | ((in[13 + inpos] & 15) << (28 - 4))) + out[14 + outpos] = (((in[2 + inpos] >>> 6) & 31)) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[13 + inpos] >>> 4)) + out[15 + outpos] = (((in[2 + inpos] >>> 11) & 31)) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[14 + inpos] >>> 0) & 268435455)) + out[16 + outpos] = (((in[2 + inpos] >>> 16) & 31)) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[14 + inpos] >>> 28) | ((in[15 + inpos] & 16777215) << (28 - 24))) + out[17 + outpos] = (((in[2 + inpos] >>> 21) & 31)) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[15 + inpos] >>> 24) | ((in[16 + inpos] & 1048575) << (28 - 20))) + out[18 + outpos] = (((in[2 + inpos] >>> 26) & 31)) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[16 + inpos] >>> 20) | ((in[17 + inpos] & 65535) << (28 - 16))) + out[19 + outpos] = ((in[2 + inpos] >>> 31) | ((in[3 + inpos] & 15) << (5 - 4))) + out[19 + outpos - 1]; - out[20 + outpos] = ((in[17 + inpos] >>> 16) | ((in[18 + inpos] & 4095) << (28 - 12))) + out[20 + outpos] = (((in[3 + inpos] >>> 4) & 31)) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[18 + inpos] >>> 12) | ((in[19 + inpos] & 255) << (28 - 8))) + out[21 + outpos] = (((in[3 + inpos] >>> 9) & 31)) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[19 + inpos] >>> 8) | ((in[20 + inpos] & 15) << (28 - 4))) + out[22 + outpos] = (((in[3 + inpos] >>> 14) & 31)) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[20 + inpos] >>> 4)) + out[23 + outpos] = (((in[3 + inpos] >>> 19) & 31)) + out[23 + outpos - 1]; - out[24 + outpos] = (((in[21 + inpos] >>> 0) & 268435455)) + out[24 + outpos] = (((in[3 + inpos] >>> 24) & 31)) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[21 + inpos] >>> 28) | ((in[22 + inpos] & 16777215) << (28 - 24))) + out[25 + outpos] = ((in[3 + inpos] >>> 29) | ((in[4 + inpos] & 3) << (5 - 2))) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[22 + inpos] >>> 24) | ((in[23 + inpos] & 1048575) << (28 - 20))) + out[26 + outpos] = (((in[4 + inpos] >>> 2) & 31)) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[23 + inpos] >>> 20) | ((in[24 + inpos] & 65535) << (28 - 16))) + out[27 + outpos] = (((in[4 + inpos] >>> 7) & 31)) + out[27 + outpos - 1]; - out[28 + outpos] = ((in[24 + inpos] >>> 16) | ((in[25 + inpos] & 4095) << (28 - 12))) + out[28 + outpos] = (((in[4 + inpos] >>> 12) & 31)) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[25 + inpos] >>> 12) | ((in[26 + inpos] & 255) << (28 - 8))) + out[29 + outpos] = (((in[4 + inpos] >>> 17) & 31)) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[26 + inpos] >>> 8) | ((in[27 + inpos] & 15) << (28 - 4))) + out[30 + outpos] = (((in[4 + inpos] >>> 22) & 31)) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[27 + inpos] >>> 4)) + out[31 + outpos] = ((in[4 + inpos] >>> 27)) + out[31 + outpos - 1]; } - protected static void integratedunpack29(final int initoffset, + protected static void integratedunpack6(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 536870911)) - + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 29) | ((in[1 + inpos] & 67108863) << (29 - 26))) + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 63)) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 6) & 63)) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[1 + inpos] >>> 26) | ((in[2 + inpos] & 8388607) << (29 - 23))) + out[2 + outpos] = (((in[0 + inpos] >>> 12) & 63)) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[2 + inpos] >>> 23) | ((in[3 + inpos] & 1048575) << (29 - 20))) + out[3 + outpos] = (((in[0 + inpos] >>> 18) & 63)) + out[3 + outpos - 1]; - out[4 + outpos] = ((in[3 + inpos] >>> 20) | ((in[4 + inpos] & 131071) << (29 - 17))) + out[4 + outpos] = (((in[0 + inpos] >>> 24) & 63)) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[4 + inpos] >>> 17) | ((in[5 + inpos] & 16383) << (29 - 14))) + out[5 + outpos] = ((in[0 + inpos] >>> 30) | ((in[1 + inpos] & 15) << (6 - 4))) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[5 + inpos] >>> 14) | ((in[6 + inpos] & 2047) << (29 - 11))) + out[6 + outpos] = (((in[1 + inpos] >>> 4) & 63)) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[6 + inpos] >>> 11) | ((in[7 + inpos] & 255) << (29 - 8))) + out[7 + outpos] = (((in[1 + inpos] >>> 10) & 63)) + out[7 + outpos - 1]; - out[8 + outpos] = ((in[7 + inpos] >>> 8) | ((in[8 + inpos] & 31) << (29 - 5))) + out[8 + outpos] = (((in[1 + inpos] >>> 16) & 63)) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[8 + inpos] >>> 5) | ((in[9 + inpos] & 3) << (29 - 2))) + out[9 + outpos] = (((in[1 + inpos] >>> 22) & 63)) + out[9 + outpos - 1]; - out[10 + outpos] = (((in[9 + inpos] >>> 2) & 536870911)) + out[10 + outpos] = ((in[1 + inpos] >>> 28) | ((in[2 + inpos] & 3) << (6 - 2))) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[9 + inpos] >>> 31) | ((in[10 + inpos] & 268435455) << (29 - 28))) + out[11 + outpos] = (((in[2 + inpos] >>> 2) & 63)) + out[11 + outpos - 1]; - out[12 + outpos] = ((in[10 + inpos] >>> 28) | ((in[11 + inpos] & 33554431) << (29 - 25))) + out[12 + outpos] = (((in[2 + inpos] >>> 8) & 63)) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[11 + inpos] >>> 25) | ((in[12 + inpos] & 4194303) << (29 - 22))) + out[13 + outpos] = (((in[2 + inpos] >>> 14) & 63)) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[12 + inpos] >>> 22) | ((in[13 + inpos] & 524287) << (29 - 19))) + out[14 + outpos] = (((in[2 + inpos] >>> 20) & 63)) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[13 + inpos] >>> 19) | ((in[14 + inpos] & 65535) << (29 - 16))) + out[15 + outpos] = ((in[2 + inpos] >>> 26)) + out[15 + outpos - 1]; - out[16 + outpos] = ((in[14 + inpos] >>> 16) | ((in[15 + inpos] & 8191) << (29 - 13))) + out[16 + outpos] = (((in[3 + inpos] >>> 0) & 63)) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[15 + inpos] >>> 13) | ((in[16 + inpos] & 1023) << (29 - 10))) + out[17 + outpos] = (((in[3 + inpos] >>> 6) & 63)) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[16 + inpos] >>> 10) | ((in[17 + inpos] & 127) << (29 - 7))) + out[18 + outpos] = (((in[3 + inpos] >>> 12) & 63)) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[17 + inpos] >>> 7) | ((in[18 + inpos] & 15) << (29 - 4))) + out[19 + outpos] = (((in[3 + inpos] >>> 18) & 63)) + out[19 + outpos - 1]; - out[20 + outpos] = ((in[18 + inpos] >>> 4) | ((in[19 + inpos] & 1) << (29 - 1))) + out[20 + outpos] = (((in[3 + inpos] >>> 24) & 63)) + out[20 + outpos - 1]; - out[21 + outpos] = (((in[19 + inpos] >>> 1) & 536870911)) + out[21 + outpos] = ((in[3 + inpos] >>> 30) | ((in[4 + inpos] & 15) << (6 - 4))) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[19 + inpos] >>> 30) | ((in[20 + inpos] & 134217727) << (29 - 27))) + out[22 + outpos] = (((in[4 + inpos] >>> 4) & 63)) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[20 + inpos] >>> 27) | ((in[21 + inpos] & 16777215) << (29 - 24))) + out[23 + outpos] = (((in[4 + inpos] >>> 10) & 63)) + out[23 + outpos - 1]; - out[24 + outpos] = ((in[21 + inpos] >>> 24) | ((in[22 + inpos] & 2097151) << (29 - 21))) + out[24 + outpos] = (((in[4 + inpos] >>> 16) & 63)) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[22 + inpos] >>> 21) | ((in[23 + inpos] & 262143) << (29 - 18))) + out[25 + outpos] = (((in[4 + inpos] >>> 22) & 63)) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[23 + inpos] >>> 18) | ((in[24 + inpos] & 32767) << (29 - 15))) + out[26 + outpos] = ((in[4 + inpos] >>> 28) | ((in[5 + inpos] & 3) << (6 - 2))) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[24 + inpos] >>> 15) | ((in[25 + inpos] & 4095) << (29 - 12))) + out[27 + outpos] = (((in[5 + inpos] >>> 2) & 63)) + out[27 + outpos - 1]; - out[28 + outpos] = ((in[25 + inpos] >>> 12) | ((in[26 + inpos] & 511) << (29 - 9))) + out[28 + outpos] = (((in[5 + inpos] >>> 8) & 63)) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[26 + inpos] >>> 9) | ((in[27 + inpos] & 63) << (29 - 6))) + out[29 + outpos] = (((in[5 + inpos] >>> 14) & 63)) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[27 + inpos] >>> 6) | ((in[28 + inpos] & 7) << (29 - 3))) + out[30 + outpos] = (((in[5 + inpos] >>> 20) & 63)) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[28 + inpos] >>> 3)) + out[31 + outpos] = ((in[5 + inpos] >>> 26)) + out[31 + outpos - 1]; } - protected static void integratedunpack30(final int initoffset, + protected static void integratedunpack7(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 1073741823)) - + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 30) | ((in[1 + inpos] & 268435455) << (30 - 28))) + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 127)) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 7) & 127)) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[1 + inpos] >>> 28) | ((in[2 + inpos] & 67108863) << (30 - 26))) + out[2 + outpos] = (((in[0 + inpos] >>> 14) & 127)) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[2 + inpos] >>> 26) | ((in[3 + inpos] & 16777215) << (30 - 24))) + out[3 + outpos] = (((in[0 + inpos] >>> 21) & 127)) + out[3 + outpos - 1]; - out[4 + outpos] = ((in[3 + inpos] >>> 24) | ((in[4 + inpos] & 4194303) << (30 - 22))) + out[4 + outpos] = ((in[0 + inpos] >>> 28) | ((in[1 + inpos] & 7) << (7 - 3))) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[4 + inpos] >>> 22) | ((in[5 + inpos] & 1048575) << (30 - 20))) + out[5 + outpos] = (((in[1 + inpos] >>> 3) & 127)) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[5 + inpos] >>> 20) | ((in[6 + inpos] & 262143) << (30 - 18))) + out[6 + outpos] = (((in[1 + inpos] >>> 10) & 127)) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[6 + inpos] >>> 18) | ((in[7 + inpos] & 65535) << (30 - 16))) + out[7 + outpos] = (((in[1 + inpos] >>> 17) & 127)) + out[7 + outpos - 1]; - out[8 + outpos] = ((in[7 + inpos] >>> 16) | ((in[8 + inpos] & 16383) << (30 - 14))) + out[8 + outpos] = (((in[1 + inpos] >>> 24) & 127)) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[8 + inpos] >>> 14) | ((in[9 + inpos] & 4095) << (30 - 12))) + out[9 + outpos] = ((in[1 + inpos] >>> 31) | ((in[2 + inpos] & 63) << (7 - 6))) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[9 + inpos] >>> 12) | ((in[10 + inpos] & 1023) << (30 - 10))) + out[10 + outpos] = (((in[2 + inpos] >>> 6) & 127)) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[10 + inpos] >>> 10) | ((in[11 + inpos] & 255) << (30 - 8))) + out[11 + outpos] = (((in[2 + inpos] >>> 13) & 127)) + out[11 + outpos - 1]; - out[12 + outpos] = ((in[11 + inpos] >>> 8) | ((in[12 + inpos] & 63) << (30 - 6))) + out[12 + outpos] = (((in[2 + inpos] >>> 20) & 127)) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[12 + inpos] >>> 6) | ((in[13 + inpos] & 15) << (30 - 4))) + out[13 + outpos] = ((in[2 + inpos] >>> 27) | ((in[3 + inpos] & 3) << (7 - 2))) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[13 + inpos] >>> 4) | ((in[14 + inpos] & 3) << (30 - 2))) + out[14 + outpos] = (((in[3 + inpos] >>> 2) & 127)) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[14 + inpos] >>> 2)) + out[15 + outpos] = (((in[3 + inpos] >>> 9) & 127)) + out[15 + outpos - 1]; - out[16 + outpos] = (((in[15 + inpos] >>> 0) & 1073741823)) + out[16 + outpos] = (((in[3 + inpos] >>> 16) & 127)) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[15 + inpos] >>> 30) | ((in[16 + inpos] & 268435455) << (30 - 28))) + out[17 + outpos] = (((in[3 + inpos] >>> 23) & 127)) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[16 + inpos] >>> 28) | ((in[17 + inpos] & 67108863) << (30 - 26))) + out[18 + outpos] = ((in[3 + inpos] >>> 30) | ((in[4 + inpos] & 31) << (7 - 5))) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[17 + inpos] >>> 26) | ((in[18 + inpos] & 16777215) << (30 - 24))) + out[19 + outpos] = (((in[4 + inpos] >>> 5) & 127)) + out[19 + outpos - 1]; - out[20 + outpos] = ((in[18 + inpos] >>> 24) | ((in[19 + inpos] & 4194303) << (30 - 22))) + out[20 + outpos] = (((in[4 + inpos] >>> 12) & 127)) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[19 + inpos] >>> 22) | ((in[20 + inpos] & 1048575) << (30 - 20))) + out[21 + outpos] = (((in[4 + inpos] >>> 19) & 127)) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[20 + inpos] >>> 20) | ((in[21 + inpos] & 262143) << (30 - 18))) + out[22 + outpos] = ((in[4 + inpos] >>> 26) | ((in[5 + inpos] & 1) << (7 - 1))) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[21 + inpos] >>> 18) | ((in[22 + inpos] & 65535) << (30 - 16))) + out[23 + outpos] = (((in[5 + inpos] >>> 1) & 127)) + out[23 + outpos - 1]; - out[24 + outpos] = ((in[22 + inpos] >>> 16) | ((in[23 + inpos] & 16383) << (30 - 14))) + out[24 + outpos] = (((in[5 + inpos] >>> 8) & 127)) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[23 + inpos] >>> 14) | ((in[24 + inpos] & 4095) << (30 - 12))) + out[25 + outpos] = (((in[5 + inpos] >>> 15) & 127)) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[24 + inpos] >>> 12) | ((in[25 + inpos] & 1023) << (30 - 10))) + out[26 + outpos] = (((in[5 + inpos] >>> 22) & 127)) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[25 + inpos] >>> 10) | ((in[26 + inpos] & 255) << (30 - 8))) + out[27 + outpos] = ((in[5 + inpos] >>> 29) | ((in[6 + inpos] & 15) << (7 - 4))) + out[27 + outpos - 1]; - out[28 + outpos] = ((in[26 + inpos] >>> 8) | ((in[27 + inpos] & 63) << (30 - 6))) + out[28 + outpos] = (((in[6 + inpos] >>> 4) & 127)) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[27 + inpos] >>> 6) | ((in[28 + inpos] & 15) << (30 - 4))) + out[29 + outpos] = (((in[6 + inpos] >>> 11) & 127)) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[28 + inpos] >>> 4) | ((in[29 + inpos] & 3) << (30 - 2))) + out[30 + outpos] = (((in[6 + inpos] >>> 18) & 127)) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[29 + inpos] >>> 2)) + out[31 + outpos] = ((in[6 + inpos] >>> 25)) + out[31 + outpos - 1]; } - protected static void integratedunpack31(final int initoffset, + protected static void integratedunpack8(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - out[0 + outpos] = (((in[0 + inpos] >>> 0) & 2147483647)) - + initoffset; - out[1 + outpos] = ((in[0 + inpos] >>> 31) | ((in[1 + inpos] & 1073741823) << (31 - 30))) + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 255)) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 8) & 255)) + out[1 + outpos - 1]; - out[2 + outpos] = ((in[1 + inpos] >>> 30) | ((in[2 + inpos] & 536870911) << (31 - 29))) + out[2 + outpos] = (((in[0 + inpos] >>> 16) & 255)) + out[2 + outpos - 1]; - out[3 + outpos] = ((in[2 + inpos] >>> 29) | ((in[3 + inpos] & 268435455) << (31 - 28))) + out[3 + outpos] = ((in[0 + inpos] >>> 24)) + out[3 + outpos - 1]; - out[4 + outpos] = ((in[3 + inpos] >>> 28) | ((in[4 + inpos] & 134217727) << (31 - 27))) + out[4 + outpos] = (((in[1 + inpos] >>> 0) & 255)) + out[4 + outpos - 1]; - out[5 + outpos] = ((in[4 + inpos] >>> 27) | ((in[5 + inpos] & 67108863) << (31 - 26))) + out[5 + outpos] = (((in[1 + inpos] >>> 8) & 255)) + out[5 + outpos - 1]; - out[6 + outpos] = ((in[5 + inpos] >>> 26) | ((in[6 + inpos] & 33554431) << (31 - 25))) + out[6 + outpos] = (((in[1 + inpos] >>> 16) & 255)) + out[6 + outpos - 1]; - out[7 + outpos] = ((in[6 + inpos] >>> 25) | ((in[7 + inpos] & 16777215) << (31 - 24))) + out[7 + outpos] = ((in[1 + inpos] >>> 24)) + out[7 + outpos - 1]; - out[8 + outpos] = ((in[7 + inpos] >>> 24) | ((in[8 + inpos] & 8388607) << (31 - 23))) + out[8 + outpos] = (((in[2 + inpos] >>> 0) & 255)) + out[8 + outpos - 1]; - out[9 + outpos] = ((in[8 + inpos] >>> 23) | ((in[9 + inpos] & 4194303) << (31 - 22))) + out[9 + outpos] = (((in[2 + inpos] >>> 8) & 255)) + out[9 + outpos - 1]; - out[10 + outpos] = ((in[9 + inpos] >>> 22) | ((in[10 + inpos] & 2097151) << (31 - 21))) + out[10 + outpos] = (((in[2 + inpos] >>> 16) & 255)) + out[10 + outpos - 1]; - out[11 + outpos] = ((in[10 + inpos] >>> 21) | ((in[11 + inpos] & 1048575) << (31 - 20))) + out[11 + outpos] = ((in[2 + inpos] >>> 24)) + out[11 + outpos - 1]; - out[12 + outpos] = ((in[11 + inpos] >>> 20) | ((in[12 + inpos] & 524287) << (31 - 19))) + out[12 + outpos] = (((in[3 + inpos] >>> 0) & 255)) + out[12 + outpos - 1]; - out[13 + outpos] = ((in[12 + inpos] >>> 19) | ((in[13 + inpos] & 262143) << (31 - 18))) + out[13 + outpos] = (((in[3 + inpos] >>> 8) & 255)) + out[13 + outpos - 1]; - out[14 + outpos] = ((in[13 + inpos] >>> 18) | ((in[14 + inpos] & 131071) << (31 - 17))) + out[14 + outpos] = (((in[3 + inpos] >>> 16) & 255)) + out[14 + outpos - 1]; - out[15 + outpos] = ((in[14 + inpos] >>> 17) | ((in[15 + inpos] & 65535) << (31 - 16))) + out[15 + outpos] = ((in[3 + inpos] >>> 24)) + out[15 + outpos - 1]; - out[16 + outpos] = ((in[15 + inpos] >>> 16) | ((in[16 + inpos] & 32767) << (31 - 15))) + out[16 + outpos] = (((in[4 + inpos] >>> 0) & 255)) + out[16 + outpos - 1]; - out[17 + outpos] = ((in[16 + inpos] >>> 15) | ((in[17 + inpos] & 16383) << (31 - 14))) + out[17 + outpos] = (((in[4 + inpos] >>> 8) & 255)) + out[17 + outpos - 1]; - out[18 + outpos] = ((in[17 + inpos] >>> 14) | ((in[18 + inpos] & 8191) << (31 - 13))) + out[18 + outpos] = (((in[4 + inpos] >>> 16) & 255)) + out[18 + outpos - 1]; - out[19 + outpos] = ((in[18 + inpos] >>> 13) | ((in[19 + inpos] & 4095) << (31 - 12))) + out[19 + outpos] = ((in[4 + inpos] >>> 24)) + out[19 + outpos - 1]; - out[20 + outpos] = ((in[19 + inpos] >>> 12) | ((in[20 + inpos] & 2047) << (31 - 11))) + out[20 + outpos] = (((in[5 + inpos] >>> 0) & 255)) + out[20 + outpos - 1]; - out[21 + outpos] = ((in[20 + inpos] >>> 11) | ((in[21 + inpos] & 1023) << (31 - 10))) + out[21 + outpos] = (((in[5 + inpos] >>> 8) & 255)) + out[21 + outpos - 1]; - out[22 + outpos] = ((in[21 + inpos] >>> 10) | ((in[22 + inpos] & 511) << (31 - 9))) + out[22 + outpos] = (((in[5 + inpos] >>> 16) & 255)) + out[22 + outpos - 1]; - out[23 + outpos] = ((in[22 + inpos] >>> 9) | ((in[23 + inpos] & 255) << (31 - 8))) + out[23 + outpos] = ((in[5 + inpos] >>> 24)) + out[23 + outpos - 1]; - out[24 + outpos] = ((in[23 + inpos] >>> 8) | ((in[24 + inpos] & 127) << (31 - 7))) + out[24 + outpos] = (((in[6 + inpos] >>> 0) & 255)) + out[24 + outpos - 1]; - out[25 + outpos] = ((in[24 + inpos] >>> 7) | ((in[25 + inpos] & 63) << (31 - 6))) + out[25 + outpos] = (((in[6 + inpos] >>> 8) & 255)) + out[25 + outpos - 1]; - out[26 + outpos] = ((in[25 + inpos] >>> 6) | ((in[26 + inpos] & 31) << (31 - 5))) + out[26 + outpos] = (((in[6 + inpos] >>> 16) & 255)) + out[26 + outpos - 1]; - out[27 + outpos] = ((in[26 + inpos] >>> 5) | ((in[27 + inpos] & 15) << (31 - 4))) + out[27 + outpos] = ((in[6 + inpos] >>> 24)) + out[27 + outpos - 1]; - out[28 + outpos] = ((in[27 + inpos] >>> 4) | ((in[28 + inpos] & 7) << (31 - 3))) + out[28 + outpos] = (((in[7 + inpos] >>> 0) & 255)) + out[28 + outpos - 1]; - out[29 + outpos] = ((in[28 + inpos] >>> 3) | ((in[29 + inpos] & 3) << (31 - 2))) + out[29 + outpos] = (((in[7 + inpos] >>> 8) & 255)) + out[29 + outpos - 1]; - out[30 + outpos] = ((in[29 + inpos] >>> 2) | ((in[30 + inpos] & 1) << (31 - 1))) + out[30 + outpos] = (((in[7 + inpos] >>> 16) & 255)) + out[30 + outpos - 1]; - out[31 + outpos] = ((in[30 + inpos] >>> 1)) + out[31 + outpos] = ((in[7 + inpos] >>> 24)) + out[31 + outpos - 1]; } - protected static void integratedunpack32(final int initoffset, - final int[] in, int inpos, final int[] out, int outpos) { - System.arraycopy(in, inpos, out, outpos, 32); // no sense in - // doing delta - // coding - } - - protected static void integratedpack32(final int initoffset, - final int[] in, int inpos, final int[] out, int outpos) { - System.arraycopy(in, inpos, out, outpos, 32); // no sense in - // doing delta - // coding - } - - protected static void integratedunpack0(final int initoffset, - final int[] in, int inpos, final int[] out, int outpos) { - Arrays.fill(out, outpos, outpos + 32, initoffset); - } - - protected static void integratedpack0(final int initoffset, + protected static void integratedunpack9(final int initoffset, final int[] in, int inpos, final int[] out, int outpos) { - // nothing - } - - /** - * Unpack 32 integers along with prefix sum computation - * - * @param initoffset value to add to all outputted values - * @param in source array - * @param inpos initial position in source array - * @param out output array - * @param outpos initial position in output array - * @param bit number of bits to use per integer - */ - public static void integratedunpack(final int initoffset, - final int[] in, final int inpos, final int[] out, final int outpos, - final int bit) { - switch (bit) { - case 0: - integratedunpack0(initoffset, in, inpos, out, outpos); - break; - case 1: - integratedunpack1(initoffset, in, inpos, out, outpos); - break; - case 2: - integratedunpack2(initoffset, in, inpos, out, outpos); - break; - case 3: - integratedunpack3(initoffset, in, inpos, out, outpos); - break; - case 4: - integratedunpack4(initoffset, in, inpos, out, outpos); - break; - case 5: - integratedunpack5(initoffset, in, inpos, out, outpos); - break; - case 6: - integratedunpack6(initoffset, in, inpos, out, outpos); - break; - case 7: - integratedunpack7(initoffset, in, inpos, out, outpos); - break; - case 8: - integratedunpack8(initoffset, in, inpos, out, outpos); - break; - case 9: - integratedunpack9(initoffset, in, inpos, out, outpos); - break; - case 10: - integratedunpack10(initoffset, in, inpos, out, outpos); - break; - case 11: - integratedunpack11(initoffset, in, inpos, out, outpos); - break; - case 12: - integratedunpack12(initoffset, in, inpos, out, outpos); - break; - case 13: - integratedunpack13(initoffset, in, inpos, out, outpos); - break; - case 14: - integratedunpack14(initoffset, in, inpos, out, outpos); - break; - case 15: - integratedunpack15(initoffset, in, inpos, out, outpos); - break; - case 16: - integratedunpack16(initoffset, in, inpos, out, outpos); - break; - case 17: - integratedunpack17(initoffset, in, inpos, out, outpos); - break; - case 18: - integratedunpack18(initoffset, in, inpos, out, outpos); - break; - case 19: - integratedunpack19(initoffset, in, inpos, out, outpos); - break; - case 20: - integratedunpack20(initoffset, in, inpos, out, outpos); - break; - case 21: - integratedunpack21(initoffset, in, inpos, out, outpos); - break; - case 22: - integratedunpack22(initoffset, in, inpos, out, outpos); - break; - case 23: - integratedunpack23(initoffset, in, inpos, out, outpos); - break; - case 24: - integratedunpack24(initoffset, in, inpos, out, outpos); - break; - case 25: - integratedunpack25(initoffset, in, inpos, out, outpos); - break; - case 26: - integratedunpack26(initoffset, in, inpos, out, outpos); - break; - case 27: - integratedunpack27(initoffset, in, inpos, out, outpos); - break; - case 28: - integratedunpack28(initoffset, in, inpos, out, outpos); - break; - case 29: - integratedunpack29(initoffset, in, inpos, out, outpos); - break; - case 30: - integratedunpack30(initoffset, in, inpos, out, outpos); - break; - case 31: - integratedunpack31(initoffset, in, inpos, out, outpos); - break; - case 32: - integratedunpack32(initoffset, in, inpos, out, outpos); - break; - default: - throw new IllegalArgumentException( - "Unsupported bit width."); - } - } - - /** - * Pack 32 integers as deltas with an initial value - * - * @param initoffset initial value (used to compute first delta) - * @param in input array - * @param inpos initial position in input array - * @param out output array - * @param outpos initial position in output array - * @param bit number of bits to use per integer - */ - public static void integratedpack(final int initoffset, final int[] in, - final int inpos, final int[] out, final int outpos, final int bit) { - switch (bit) { - case 0: - integratedpack0(initoffset, in, inpos, out, outpos); - break; - case 1: - integratedpack1(initoffset, in, inpos, out, outpos); - break; - case 2: - integratedpack2(initoffset, in, inpos, out, outpos); - break; - case 3: - integratedpack3(initoffset, in, inpos, out, outpos); - break; - case 4: - integratedpack4(initoffset, in, inpos, out, outpos); - break; - case 5: - integratedpack5(initoffset, in, inpos, out, outpos); - break; - case 6: - integratedpack6(initoffset, in, inpos, out, outpos); - break; - case 7: - integratedpack7(initoffset, in, inpos, out, outpos); - break; - case 8: - integratedpack8(initoffset, in, inpos, out, outpos); - break; - case 9: - integratedpack9(initoffset, in, inpos, out, outpos); - break; - case 10: - integratedpack10(initoffset, in, inpos, out, outpos); - break; - case 11: - integratedpack11(initoffset, in, inpos, out, outpos); - break; - case 12: - integratedpack12(initoffset, in, inpos, out, outpos); - break; - case 13: - integratedpack13(initoffset, in, inpos, out, outpos); - break; - case 14: - integratedpack14(initoffset, in, inpos, out, outpos); - break; - case 15: - integratedpack15(initoffset, in, inpos, out, outpos); - break; - case 16: - integratedpack16(initoffset, in, inpos, out, outpos); - break; - case 17: - integratedpack17(initoffset, in, inpos, out, outpos); - break; - case 18: - integratedpack18(initoffset, in, inpos, out, outpos); - break; - case 19: - integratedpack19(initoffset, in, inpos, out, outpos); - break; - case 20: - integratedpack20(initoffset, in, inpos, out, outpos); - break; - case 21: - integratedpack21(initoffset, in, inpos, out, outpos); - break; - case 22: - integratedpack22(initoffset, in, inpos, out, outpos); - break; - case 23: - integratedpack23(initoffset, in, inpos, out, outpos); - break; - case 24: - integratedpack24(initoffset, in, inpos, out, outpos); - break; - case 25: - integratedpack25(initoffset, in, inpos, out, outpos); - break; - case 26: - integratedpack26(initoffset, in, inpos, out, outpos); - break; - case 27: - integratedpack27(initoffset, in, inpos, out, outpos); - break; - case 28: - integratedpack28(initoffset, in, inpos, out, outpos); - break; - case 29: - integratedpack29(initoffset, in, inpos, out, outpos); - break; - case 30: - integratedpack30(initoffset, in, inpos, out, outpos); - break; - case 31: - integratedpack31(initoffset, in, inpos, out, outpos); - break; - case 32: - integratedpack32(initoffset, in, inpos, out, outpos); - break; - default: - throw new IllegalArgumentException( - "Unsupported bit width."); - } + out[0 + outpos] = (((in[0 + inpos] >>> 0) & 511)) + initoffset; + out[1 + outpos] = (((in[0 + inpos] >>> 9) & 511)) + + out[1 + outpos - 1]; + out[2 + outpos] = (((in[0 + inpos] >>> 18) & 511)) + + out[2 + outpos - 1]; + out[3 + outpos] = ((in[0 + inpos] >>> 27) | ((in[1 + inpos] & 15) << (9 - 4))) + + out[3 + outpos - 1]; + out[4 + outpos] = (((in[1 + inpos] >>> 4) & 511)) + + out[4 + outpos - 1]; + out[5 + outpos] = (((in[1 + inpos] >>> 13) & 511)) + + out[5 + outpos - 1]; + out[6 + outpos] = (((in[1 + inpos] >>> 22) & 511)) + + out[6 + outpos - 1]; + out[7 + outpos] = ((in[1 + inpos] >>> 31) | ((in[2 + inpos] & 255) << (9 - 8))) + + out[7 + outpos - 1]; + out[8 + outpos] = (((in[2 + inpos] >>> 8) & 511)) + + out[8 + outpos - 1]; + out[9 + outpos] = (((in[2 + inpos] >>> 17) & 511)) + + out[9 + outpos - 1]; + out[10 + outpos] = ((in[2 + inpos] >>> 26) | ((in[3 + inpos] & 7) << (9 - 3))) + + out[10 + outpos - 1]; + out[11 + outpos] = (((in[3 + inpos] >>> 3) & 511)) + + out[11 + outpos - 1]; + out[12 + outpos] = (((in[3 + inpos] >>> 12) & 511)) + + out[12 + outpos - 1]; + out[13 + outpos] = (((in[3 + inpos] >>> 21) & 511)) + + out[13 + outpos - 1]; + out[14 + outpos] = ((in[3 + inpos] >>> 30) | ((in[4 + inpos] & 127) << (9 - 7))) + + out[14 + outpos - 1]; + out[15 + outpos] = (((in[4 + inpos] >>> 7) & 511)) + + out[15 + outpos - 1]; + out[16 + outpos] = (((in[4 + inpos] >>> 16) & 511)) + + out[16 + outpos - 1]; + out[17 + outpos] = ((in[4 + inpos] >>> 25) | ((in[5 + inpos] & 3) << (9 - 2))) + + out[17 + outpos - 1]; + out[18 + outpos] = (((in[5 + inpos] >>> 2) & 511)) + + out[18 + outpos - 1]; + out[19 + outpos] = (((in[5 + inpos] >>> 11) & 511)) + + out[19 + outpos - 1]; + out[20 + outpos] = (((in[5 + inpos] >>> 20) & 511)) + + out[20 + outpos - 1]; + out[21 + outpos] = ((in[5 + inpos] >>> 29) | ((in[6 + inpos] & 63) << (9 - 6))) + + out[21 + outpos - 1]; + out[22 + outpos] = (((in[6 + inpos] >>> 6) & 511)) + + out[22 + outpos - 1]; + out[23 + outpos] = (((in[6 + inpos] >>> 15) & 511)) + + out[23 + outpos - 1]; + out[24 + outpos] = ((in[6 + inpos] >>> 24) | ((in[7 + inpos] & 1) << (9 - 1))) + + out[24 + outpos - 1]; + out[25 + outpos] = (((in[7 + inpos] >>> 1) & 511)) + + out[25 + outpos - 1]; + out[26 + outpos] = (((in[7 + inpos] >>> 10) & 511)) + + out[26 + outpos - 1]; + out[27 + outpos] = (((in[7 + inpos] >>> 19) & 511)) + + out[27 + outpos - 1]; + out[28 + outpos] = ((in[7 + inpos] >>> 28) | ((in[8 + inpos] & 31) << (9 - 5))) + + out[28 + outpos - 1]; + out[29 + outpos] = (((in[8 + inpos] >>> 5) & 511)) + + out[29 + outpos - 1]; + out[30 + outpos] = (((in[8 + inpos] >>> 14) & 511)) + + out[30 + outpos - 1]; + out[31 + outpos] = ((in[8 + inpos] >>> 23)) + + out[31 + outpos - 1]; } } diff --git a/src/main/java/me/lemire/integercompression/IntegratedFastPFOR.java b/src/main/java/me/lemire/integercompression/IntegratedFastPFOR.java index fe9fcab..911d5c2 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedFastPFOR.java +++ b/src/main/java/me/lemire/integercompression/IntegratedFastPFOR.java @@ -14,10 +14,11 @@ * This is an integrated version of FastPFOR meaning that it computes * differential coding as part of the compression. *

- * - * It encodes integers in blocks of 128 integers. For arrays containing - * an arbitrary number of integers, you should use it in conjunction - * with another CODEC: + * It encodes integers in blocks of 128 integers within pages of + * up to 65536 integers. Note that it is important, to get good + * compression and good performance, to use sizeable blocks (greater than 1024 integers). + * For arrays containing a number of integers that is not divisible by 128, + * you should use it in conjunction with another CODEC: *
IntegratedIntegerCODEC is =  
  *  new IntegratedComposition(new IntegratedFastPFOR(),
  *               new IntegratedVariableByte())
From c4cef4c3a56447c5f27cc3d49aa3e8f275c9b77c Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 9 Jun 2014 09:45:58 -0400 Subject: [PATCH 153/412] Preparing new release --- CHANGELOG | 4 ++++ README.md | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 49921bb..d6560fe 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +0.0.12 (June 9th 2014) + - Better API documentation + + 0.0.11 (Feb. 14th 2014) - Fix rare bug in FastPFOR (reported by Stefan Ackermann (https://github.com/Stivo)) - Improved API documentation diff --git a/README.md b/README.md index 77ddd36..03371f1 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ the following code in your pom.xml file: me.lemire.integercompression JavaFastPFOR - 0.0.11 + 0.0.12 From 54f7edcf9f34f3a94893384584f87879cae08e10 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 9 Jun 2014 09:50:34 -0400 Subject: [PATCH 154/412] Avoiding silly errors --- src/test/java/me/lemire/integercompression/TestUtils.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/test/java/me/lemire/integercompression/TestUtils.java b/src/test/java/me/lemire/integercompression/TestUtils.java index 69fde8a..3a581f6 100644 --- a/src/test/java/me/lemire/integercompression/TestUtils.java +++ b/src/test/java/me/lemire/integercompression/TestUtils.java @@ -2,6 +2,8 @@ import java.util.Arrays; +import org.junit.Test; + import static org.junit.Assert.*; /** @@ -9,6 +11,8 @@ */ @SuppressWarnings({ "javadoc"}) public class TestUtils { + @Test + public void bogus() {}// to avoid useless complaining. public static void dumpIntArray(int[] data, String label) { System.out.print(label); From 1a18da88858a71408c425c34a0ec413b4074f762 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 9 Jun 2014 10:03:20 -0400 Subject: [PATCH 155/412] Fixing doc errors --- src/main/java/com/kamikaze/pfordelta/LCPForDelta.java | 8 ++++---- .../com/kamikaze/pfordelta/Simple16WithHardCodes.java | 2 +- .../java/me/lemire/integercompression/BitPacking.java | 6 +++--- .../java/me/lemire/integercompression/FastPFOR.java | 10 +++++----- .../integercompression/IntegratedBitPacking.java | 4 ++-- src/main/java/me/lemire/integercompression/NewPFD.java | 6 +++--- .../java/me/lemire/integercompression/NewPFDS16.java | 6 +++--- .../java/me/lemire/integercompression/NewPFDS9.java | 6 +++--- src/main/java/me/lemire/integercompression/OptPFD.java | 8 ++++---- .../java/me/lemire/integercompression/OptPFDS16.java | 8 ++++---- .../java/me/lemire/integercompression/OptPFDS9.java | 8 ++++---- src/main/java/me/lemire/integercompression/S16.java | 4 ++-- 12 files changed, 38 insertions(+), 38 deletions(-) diff --git a/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java b/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java index ebed219..1e331fc 100644 --- a/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java +++ b/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java @@ -43,7 +43,7 @@ * literature. * * This implementation overcomes the problem that Simple16 cannot deal with - * >2^28 numbers. + * greater than 2^28 numbers. * * This implementation is almost same as PForDelta in the same package, except * that it is tuned especially for Lucene-4.0 Codec to achieve the best @@ -417,7 +417,7 @@ public static int estimateCompressedSize(int[] inputBlock, } /** - * Check if the block contains big numbers that is greater than ((1<< + * Check if the block contains big numbers that is greater than ((1<< * bits)-1) * * @param inputBlock @@ -578,7 +578,7 @@ public static void decompressBlockByS16WithIntBufferIntegrated( * @param outOffset * the start offset in bits in the output array * @param bits - * the number of bits to be written (bits>=0) + * the number of bits to be written (bits greater or equal to 0) */ public static final void writeBits(int[] out, int val, int outOffset, int bits) { @@ -604,7 +604,7 @@ public static final void writeBits(int[] out, int val, int outOffset, * @param bits * the number of bits to be read, unlike writeBits(), * readBits() does not deal with bits==0 and thus bits - * must > 0. When bits ==0, the calling functions will + * must be greater than 0. When bits ==0, the calling functions will * just skip the entire bits-bit slots without decoding * them * @return the bits bits of the input diff --git a/src/main/java/com/kamikaze/pfordelta/Simple16WithHardCodes.java b/src/main/java/com/kamikaze/pfordelta/Simple16WithHardCodes.java index 9ea0bff..03184f2 100644 --- a/src/main/java/com/kamikaze/pfordelta/Simple16WithHardCodes.java +++ b/src/main/java/com/kamikaze/pfordelta/Simple16WithHardCodes.java @@ -14,7 +14,7 @@ * * 2. http://www2009.org/proceedings/pdf/p401.pdf * - * The maximum possible integer value Simple16 can encode is < 2^28 (this is + * The maximum possible integer value Simple16 can encode is less than 2^28 (this is * dertermined by the Simple16 algorithm itself). Therefore, in order to use * Simple16, the application must write their own code to encode numbers in the * range of [2^28, 2^32). A simple way is just write those numbers as 32-bit diff --git a/src/main/java/me/lemire/integercompression/BitPacking.java b/src/main/java/me/lemire/integercompression/BitPacking.java index e36291b..ee71fbd 100644 --- a/src/main/java/me/lemire/integercompression/BitPacking.java +++ b/src/main/java/me/lemire/integercompression/BitPacking.java @@ -12,13 +12,13 @@ /** * Bitpacking routines * - * For details, please see - *

+ *

For details, please see

+ *

* Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second * through vectorization Software: Practice & Experience * http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract * http://arxiv.org/abs/1209.2137 - *

+ *

* * @author Daniel Lemire * diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 3cd6c58..3caa94a 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -18,16 +18,16 @@ * it in conjunction with another CODEC: * * IntegerCODEC ic = new Composition(new FastPFOR(), new VariableByte()). - *

+ *

* For details, please see - *

+ *

* Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second * through vectorization Software: Practice & Experience * http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract * http://arxiv.org/abs/1209.2137 - *

- * For sufficiently compressible arrays, it is faster and better than other PFOR - * schemes. + *

+ *

For sufficiently compressible and long arrays, it is faster and better than other PFOR + * schemes.

* * Note that this does not use differential coding: if you are working on sorted * lists, use IntegratedFastPFOR instead. diff --git a/src/main/java/me/lemire/integercompression/IntegratedBitPacking.java b/src/main/java/me/lemire/integercompression/IntegratedBitPacking.java index a0fd463..71387bb 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedBitPacking.java +++ b/src/main/java/me/lemire/integercompression/IntegratedBitPacking.java @@ -14,12 +14,12 @@ * differential coding. * * For details, please see - *

+ *

* Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second * through vectorization Software: Practice & Experience * http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract * http://arxiv.org/abs/1209.2137 - *

+ *

* * @author Daniel Lemire * diff --git a/src/main/java/me/lemire/integercompression/NewPFD.java b/src/main/java/me/lemire/integercompression/NewPFD.java index bd575e9..28e28a3 100644 --- a/src/main/java/me/lemire/integercompression/NewPFD.java +++ b/src/main/java/me/lemire/integercompression/NewPFD.java @@ -9,12 +9,12 @@ /** * NewPFD/NewPFOR: fast patching scheme by Yan et al. - *

+ *

* Follows: - *

+ *

* H. Yan, S. Ding, T. Suel, Inverted index compression and query processing * with optimized document ordering, in: WWW �09, 2009, pp. 401�410. - *

+ *

* using Simple16 as the secondary coder. * * It encodes integers in blocks of 128 integers. For arrays containing diff --git a/src/main/java/me/lemire/integercompression/NewPFDS16.java b/src/main/java/me/lemire/integercompression/NewPFDS16.java index 0c045d9..bf0b5c6 100644 --- a/src/main/java/me/lemire/integercompression/NewPFDS16.java +++ b/src/main/java/me/lemire/integercompression/NewPFDS16.java @@ -9,12 +9,12 @@ /** * NewPFD/NewPFOR based on Simple16 by Yan et al. - *

+ *

* Follows: - *

+ *

* H. Yan, S. Ding, T. Suel, Inverted index compression and query processing * with optimized document ordering, in: WWW 09, 2009, pp. 401-410. - *

+ *

* using Simple16 as the secondary coder. * * It encodes integers in blocks of 128 integers. For arrays containing diff --git a/src/main/java/me/lemire/integercompression/NewPFDS9.java b/src/main/java/me/lemire/integercompression/NewPFDS9.java index 1078a41..ee671ef 100644 --- a/src/main/java/me/lemire/integercompression/NewPFDS9.java +++ b/src/main/java/me/lemire/integercompression/NewPFDS9.java @@ -9,12 +9,12 @@ /** * NewPFD/NewPFOR based on Simple9 by Yan et al. - *

+ *

* Follows: - *

+ *

* H. Yan, S. Ding, T. Suel, Inverted index compression and query processing * with optimized document ordering, in: WWW 09, 2009, pp. 401-410. - *

+ *

* using Simple9 as the secondary coder. * * It encodes integers in blocks of 128 integers. For arrays containing diff --git a/src/main/java/me/lemire/integercompression/OptPFD.java b/src/main/java/me/lemire/integercompression/OptPFD.java index b01c7d5..2395c3f 100644 --- a/src/main/java/me/lemire/integercompression/OptPFD.java +++ b/src/main/java/me/lemire/integercompression/OptPFD.java @@ -8,12 +8,12 @@ /** * OptPFD: fast patching scheme by Yan et al. - *

+ *

* Follows: - *

+ *

* H. Yan, S. Ding, T. Suel, Inverted index compression and query processing - * with optimized document ordering, in: WWW �09, 2009, pp. 401�410. - *

+ * with optimized document ordering, in: WWW 09, 2009, pp. 401-410. + *

* using Simple16 as the secondary coder. * * It encodes integers in blocks of 128 integers. For arrays containing diff --git a/src/main/java/me/lemire/integercompression/OptPFDS16.java b/src/main/java/me/lemire/integercompression/OptPFDS16.java index 4334412..3f6a6cc 100644 --- a/src/main/java/me/lemire/integercompression/OptPFDS16.java +++ b/src/main/java/me/lemire/integercompression/OptPFDS16.java @@ -9,12 +9,12 @@ /** * OptPFD based on Simple16 by Yan et al. - *

+ *

* Follows: - *

+ *

* H. Yan, S. Ding, T. Suel, Inverted index compression and query processing - * with optimized document ordering, in: WWW 09, 2009, pp. 401--410. - *

+ * with optimized document ordering, in: WWW 09, 2009, pp. 401-410. + *

* using Simple16 as the secondary coder. * * It encodes integers in blocks of 128 integers. For arrays containing diff --git a/src/main/java/me/lemire/integercompression/OptPFDS9.java b/src/main/java/me/lemire/integercompression/OptPFDS9.java index 100fb43..75cf4be 100644 --- a/src/main/java/me/lemire/integercompression/OptPFDS9.java +++ b/src/main/java/me/lemire/integercompression/OptPFDS9.java @@ -9,12 +9,12 @@ /** * OptPFD based on Simple9 by Yan et al. - *

+ *

* Follows: - *

+ *

* H. Yan, S. Ding, T. Suel, Inverted index compression and query processing - * with optimized document ordering, in: WWW 09, 2009, pp. 401--410. - *

+ * with optimized document ordering, in: WWW 09, 2009, pp. 401-410. + *

* using Simple9 as the secondary coder. * * It encodes integers in blocks of 128 integers. For arrays containing diff --git a/src/main/java/me/lemire/integercompression/S16.java b/src/main/java/me/lemire/integercompression/S16.java index 3d65b7b..6829b76 100644 --- a/src/main/java/me/lemire/integercompression/S16.java +++ b/src/main/java/me/lemire/integercompression/S16.java @@ -9,9 +9,9 @@ /** * Version of Simple16 for NewPFD and OptPFD. - *

+ *

* Adapted by D. Lemire from the Apache Lucene project. - * + *

*/ public final class S16 { From 818595ef4c4ff9ebce5087818d4d3af59dc483db Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 9 Jun 2014 10:08:43 -0400 Subject: [PATCH 156/412] More documentation fixes --- src/main/java/com/kamikaze/pfordelta/PForDelta.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/kamikaze/pfordelta/PForDelta.java b/src/main/java/com/kamikaze/pfordelta/PForDelta.java index 6f59700..b17c9cd 100644 --- a/src/main/java/com/kamikaze/pfordelta/PForDelta.java +++ b/src/main/java/com/kamikaze/pfordelta/PForDelta.java @@ -25,7 +25,7 @@ * literatures. * * This implementation overcomes the problem that Simple16 cannot deal with - * >2^28 numbers. + * more than 2^28 numbers. * * Author: hao yan hyan2008@gmail.com */ @@ -181,7 +181,7 @@ public static int estimateCompressedSize(int[] inputBlock, int bits, } /** - * Check if the block contains big numbers that is greater than ((1<< + * Check if the block contains big numbers that is greater than ((1<< * bits)-1) * * @param inputBlock @@ -377,7 +377,7 @@ public static int decompressBlockByS16(int[] outDecompBlock, * @param outOffset * the start offset in bits in the output array * @param bits - * the number of bits to be written (bits>=0) + * the number of bits to be written (bits greater or equal to 0) */ public static final void writeBits(int[] out, int val, int outOffset, int bits) { @@ -426,7 +426,7 @@ static int decompressBBitSlotsWithHardCodes(int[] decompressedSlots, * @param bits * the number of bits to be read, unlike writeBits(), * readBits() does not deal with bits==0 and thus bits - * must > 0. When bits ==0, the calling functions will + * must be greater than 0. When bits ==0, the calling functions will * just skip the entire bits-bit slots without decoding * them * @return the bits bits of the input From fc93eba764956b3f6410812ac8a66efb887f6b22 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 9 Jun 2014 10:11:05 -0400 Subject: [PATCH 157/412] Another doc update --- src/main/java/com/kamikaze/pfordelta/Simple16.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/kamikaze/pfordelta/Simple16.java b/src/main/java/com/kamikaze/pfordelta/Simple16.java index 8b77355..d94ab9c 100644 --- a/src/main/java/com/kamikaze/pfordelta/Simple16.java +++ b/src/main/java/com/kamikaze/pfordelta/Simple16.java @@ -14,7 +14,7 @@ * * 2. http://www2009.org/proceedings/pdf/p401.pdf * - * The maximum possible integer value Simple16 can encode is < 2^28 (this is + * The maximum possible integer value Simple16 can encode is less than 2^28 (this is * dertermined by the Simple16 algorithm itself). Therefore, in order to use * Simple16, the application must write their own code to encode numbers in the * range of [2^28, 2^32). A simple way is just write those numbers as 32-bit From b4178194c142d0acdd3944e13fbdc91367e16caf Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 9 Jun 2014 10:12:02 -0400 Subject: [PATCH 158/412] [maven-release-plugin] prepare release JavaFastPFOR-0.0.12 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 946c13f..860d151 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.12-SNAPSHOT + 0.0.12 jar From 46468b3bfda377129c1d9a2ecd6e504e177de16a Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 9 Jun 2014 10:12:05 -0400 Subject: [PATCH 159/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 860d151..79f9c3d 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.12 + 0.0.13-SNAPSHOT jar From 80d7502e1cb89abf8fa2bda2ca5ad06052ea8b61 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 23 Jul 2014 14:05:33 -0400 Subject: [PATCH 160/412] Preparing new release --- CHANGELOG | 4 +- README.md | 16 +- example.java | 1 + .../com/kamikaze/pfordelta/LCPForDelta.java | 29 +- .../com/kamikaze/pfordelta/PForDelta.java | 9 +- .../pfordelta/PForDeltaUnpack128.java | 2 +- .../PForDeltaUnpack128WIthIntBuffer.java | 2 +- .../java/com/kamikaze/pfordelta/Simple16.java | 1 + .../pfordelta/Simple16WithHardCodes.java | 24 +- .../lemire/integercompression/IntWrapper.java | 3 +- .../me/lemire/integercompression/Util.java | 148 +++--- .../benchmarktools/Benchmark.java | 18 +- .../benchmarktools/BenchmarkBitPacking.java | 4 +- .../benchmarktools/BenchmarkCSV.java | 11 +- .../BenchmarkOffsettedSeries.java | 8 +- .../{ => differential}/Delta.java | 2 +- .../IntegratedBinaryPacking.java | 5 +- .../IntegratedBitPacking.java | 2 +- .../IntegratedByteIntegerCODEC.java | 4 +- .../IntegratedComposition.java | 4 +- .../IntegratedFastPFOR.java | 7 +- .../IntegratedIntegerCODEC.java | 4 +- .../IntegratedVariableByte.java | 4 +- .../{ => differential}/XorBinaryPacking.java | 5 +- .../lemire/integercompression/AdhocTest.java | 9 + .../lemire/integercompression/BasicTest.java | 424 ++++++++++-------- .../integercompression/BoundaryTest.java | 46 +- .../DeltaZigzagEncodingTest.java | 33 +- .../lemire/integercompression/TestUtils.java | 13 +- .../XorBinaryPackingTest.java | 27 +- 30 files changed, 522 insertions(+), 347 deletions(-) rename src/main/java/me/lemire/integercompression/{ => differential}/Delta.java (98%) rename src/main/java/me/lemire/integercompression/{ => differential}/IntegratedBinaryPacking.java (97%) rename src/main/java/me/lemire/integercompression/{ => differential}/IntegratedBitPacking.java (99%) rename src/main/java/me/lemire/integercompression/{ => differential}/IntegratedByteIntegerCODEC.java (78%) rename src/main/java/me/lemire/integercompression/{ => differential}/IntegratedComposition.java (95%) rename src/main/java/me/lemire/integercompression/{ => differential}/IntegratedFastPFOR.java (98%) rename src/main/java/me/lemire/integercompression/{ => differential}/IntegratedIntegerCODEC.java (80%) rename src/main/java/me/lemire/integercompression/{ => differential}/IntegratedVariableByte.java (98%) rename src/main/java/me/lemire/integercompression/{ => differential}/XorBinaryPacking.java (97%) diff --git a/CHANGELOG b/CHANGELOG index d6560fe..8297989 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,7 +1,9 @@ +0.0.13 (July 23rd 2014) + - CODECs using differential coding are now in a separate package (me.lemire.integercompression.differential) + 0.0.12 (June 9th 2014) - Better API documentation - 0.0.11 (Feb. 14th 2014) - Fix rare bug in FastPFOR (reported by Stefan Ackermann (https://github.com/Stivo)) - Improved API documentation diff --git a/README.md b/README.md index 03371f1..230059c 100644 --- a/README.md +++ b/README.md @@ -32,8 +32,15 @@ library is used by the zsearch engine (http://victorparmar.github.com/zsearch/) as well as in GMAP and GSNAP (http://research-pub.gene.com/gmap/). +Usage +------ + +See example.java. + Some CODECs ("integrated codecs") assume that the integers are -in sorted orders. Most others do not. +in sorted orders and use differential coding (they compress deltas). +They can be found in the package me.lemire.integercopression.differential. +Most others do not. Maven central repository @@ -47,7 +54,7 @@ the following code in your pom.xml file: me.lemire.integercompression JavaFastPFOR - 0.0.12 + 0.0.13 @@ -101,11 +108,6 @@ Good instructions on installing Java 7 on Linux: http://forums.linuxmint.com/viewtopic.php?f=42&t=93052 -Usage ------ - -See example.java for a simple demonstration. - How fast is it? --------------- diff --git a/example.java b/example.java index d96ddc4..dbe70d0 100644 --- a/example.java +++ b/example.java @@ -1,4 +1,5 @@ import me.lemire.integercompression.*; +import me.lemire.integercompression.differential.*; import java.util.*; public class example { diff --git a/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java b/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java index 1e331fc..bf5154e 100644 --- a/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java +++ b/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java @@ -82,11 +82,11 @@ public class LCPForDelta { private int[] compBuffer; // buffer to hold the compressed data - public int[] getCompBuffer() { + protected int[] getCompBuffer() { return compBuffer; } - public void setCompBuffer(int[] buffer) { + protected void setCompBuffer(int[] buffer) { compBuffer = buffer; } @@ -141,10 +141,9 @@ public int compress(int[] inBlock, int blockSize) { * @param bits * the the value of the parameter b * @return the size of the compressed block (the number of ints) - * @throws IllegalArgumentException */ public int compressOneBlockCore(int[] inputBlock, int blockSize, - int bits) throws IllegalArgumentException { + int bits) { int outputOffset = HEADER_SIZE; int expUpperBound = 1 << bits; int expNum = 0; @@ -202,7 +201,7 @@ public int compressOneBlockCore(int[] inputBlock, int blockSize, return compressedSizeInInts; } - public int compressOneBlockCore2(int[] inputBlock, int blockSize, + protected int compressOneBlockCore2(int[] inputBlock, int blockSize, int bits) throws IllegalArgumentException { int outputOffset = HEADER_SIZE; int expUpperBound = 1 << bits; @@ -311,7 +310,7 @@ public static void decompressOneBlock(int[] decompBlock, int[] inBlock, } } - public static void decompressOneBlockWithSize(int[] decompBlock, + protected static void decompressOneBlockWithSize(int[] decompBlock, int[] inBlock, int blockSize, int[] expPosBuffer, int[] expHighBitsBuffer, int inBlockLen) { int expNum = inBlock[0] & MASK[31 - POSSIBLE_B_BITS]; @@ -349,7 +348,7 @@ public static void decompressOneBlockWithSize(int[] decompBlock, } } - public static void decompressOneBlockWithSizeWithIntBuffer( + protected static void decompressOneBlockWithSizeWithIntBuffer( final int[] decompBlock, final IntBuffer inBlock, final int blockSize, final int[] expPosBuffer, final int[] expHighBitsBuffer, final int inBlockLen) { @@ -397,10 +396,9 @@ public static void decompressOneBlockWithSizeWithIntBuffer( * @param blockSize * the block size * @return the compressed size in ints - * @throws IllegalArgumentException */ public static int estimateCompressedSize(int[] inputBlock, - int blockSize, int bits) throws IllegalArgumentException { + int blockSize, int bits) { int maxNoExp = (1 << bits) - 1; // Size of the header and the bits-bit slots int outputOffset = HEADER_SIZE + bits * blockSize; @@ -428,10 +426,9 @@ public static int estimateCompressedSize(int[] inputBlock, * @param blockSize * the block size * @return true if there is any big numbers in the block - * @throws IllegalArgumentException */ public static boolean checkBigNumbers(int[] inputBlock, int blockSize, - int bits) throws IllegalArgumentException { + int bits) { int maxNoExp = (1 << bits) - 1; for (int i = 0; i < blockSize; ++i) { if (inputBlock[i] > maxNoExp) @@ -467,7 +464,7 @@ public static int decompressBBitSlots(int[] outDecompSlots, return compressedBitSize; } - public static int decompressBBitSlotsWithHardCodes( + protected static int decompressBBitSlotsWithHardCodes( final int[] outDecompSlots, final int[] inCompBlock, final int blockSize, final int bits) { int compressedBitSize = 0; @@ -476,7 +473,7 @@ public static int decompressBBitSlotsWithHardCodes( return compressedBitSize; } - public static int decompressBBitSlotsWithHardCodesWithIntBuffer( + protected static int decompressBBitSlotsWithHardCodesWithIntBuffer( final int[] outDecompSlots, final IntBuffer inCompBlock, final int blockSize, final int bits) { PForDeltaUnpack128WIthIntBuffer.unpack(outDecompSlots, @@ -541,7 +538,7 @@ public static int decompressBlockByS16(int[] outDecompBlock, return compressedBitSize; } - public static void decompressBlockByS16WithIntBuffer( + protected static void decompressBlockByS16WithIntBuffer( final int[] outDecompBlock, final IntBuffer inCompBlock, final int blockSize) { int num, outOffset = 0, numLeft; @@ -553,7 +550,7 @@ public static void decompressBlockByS16WithIntBuffer( } } - public static void decompressBlockByS16WithIntBufferIntegrated( + protected static void decompressBlockByS16WithIntBufferIntegrated( final int[] outDecompBlock, final IntBuffer inCompBlock, final int blockSize, int[] expPosBuffer, int oribits) { int num, outOffset = 0, numLeft; @@ -620,7 +617,7 @@ public static final int readBits(int[] in, final int inOffset, return val & (0xffffffff >>> (32 - bits)); } - public static final int readBitsWithBuffer(int[] in, + protected static final int readBitsWithBuffer(int[] in, final int inOffset, final int bits) { final int index = inOffset >>> 5; final int skip = inOffset & 0x1f; diff --git a/src/main/java/com/kamikaze/pfordelta/PForDelta.java b/src/main/java/com/kamikaze/pfordelta/PForDelta.java index b17c9cd..9be8e07 100644 --- a/src/main/java/com/kamikaze/pfordelta/PForDelta.java +++ b/src/main/java/com/kamikaze/pfordelta/PForDelta.java @@ -161,10 +161,9 @@ public static int decompressOneBlock(int[] outBlock, int[] inBlock, * @param blockSize * the block size * @return the compressed size in ints - * @throws IllegalArgumentException */ public static int estimateCompressedSize(int[] inputBlock, int bits, - int blockSize) throws IllegalArgumentException { + int blockSize) { int maxNoExp = (1 << bits) - 1; // Size of the header and the bits-bit slots int outputOffset = HEADER_SIZE + bits * blockSize; @@ -192,10 +191,9 @@ public static int estimateCompressedSize(int[] inputBlock, int bits, * @param blockSize * the block size * @return true if there is any big numbers in the block - * @throws IllegalArgumentException */ public static boolean checkBigNumbers(int[] inputBlock, int bits, - int blockSize) throws IllegalArgumentException { + int blockSize) { int maxNoExp = (1 << bits) - 1; for (int i = 0; i < blockSize; ++i) { if (inputBlock[i] > maxNoExp) @@ -215,10 +213,9 @@ public static boolean checkBigNumbers(int[] inputBlock, int bits, * @param blockSize * the block size * @return the compressed block - * @throws IllegalArgumentException */ public static int[] compressOneBlock(int[] inputBlock, int bits, - int blockSize) throws IllegalArgumentException { + int blockSize) { int[] expAux = new int[blockSize * 2]; diff --git a/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128.java b/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128.java index 4da7a61..31b5378 100644 --- a/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128.java +++ b/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128.java @@ -8,7 +8,7 @@ @SuppressWarnings("javadoc") public class PForDeltaUnpack128 { - static public void unpack(int[] out, int[] in, int bits) { + static protected void unpack(int[] out, int[] in, int bits) { switch (bits) { case 0: unpack0(out, in); diff --git a/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128WIthIntBuffer.java b/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128WIthIntBuffer.java index 5596517..2e10e29 100644 --- a/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128WIthIntBuffer.java +++ b/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128WIthIntBuffer.java @@ -15,7 +15,7 @@ @SuppressWarnings("javadoc") public class PForDeltaUnpack128WIthIntBuffer { - static public void unpack(int[] out, IntBuffer in, int bits) { + static protected void unpack(int[] out, IntBuffer in, int bits) { switch (bits) { case 0: unpack0(out, in); diff --git a/src/main/java/com/kamikaze/pfordelta/Simple16.java b/src/main/java/com/kamikaze/pfordelta/Simple16.java index d94ab9c..1ccd315 100644 --- a/src/main/java/com/kamikaze/pfordelta/Simple16.java +++ b/src/main/java/com/kamikaze/pfordelta/Simple16.java @@ -79,6 +79,7 @@ public class Simple16 { * the offset of the input in the number of integers * @param n * the number of elements to be compressed + * @param blockSize block size * @return the number of compressed integers */ public static final int s16Compress(int[] out, int outOffset, int[] in, diff --git a/src/main/java/com/kamikaze/pfordelta/Simple16WithHardCodes.java b/src/main/java/com/kamikaze/pfordelta/Simple16WithHardCodes.java index 03184f2..b1a9f3f 100644 --- a/src/main/java/com/kamikaze/pfordelta/Simple16WithHardCodes.java +++ b/src/main/java/com/kamikaze/pfordelta/Simple16WithHardCodes.java @@ -85,6 +85,9 @@ public class Simple16WithHardCodes { * the offset of the input in the number of integers * @param n * the number of elements to be compressed + * @param blockSize block size + * @param oriBlockSize ori block size + * @param oriInputBlock ori input block * @return the number of compressed integers */ public static final int s16Compress(int[] out, int outOffset, int[] in, @@ -114,7 +117,8 @@ public static final int s16Compress(int[] out, int outOffset, int[] in, return -1; } - public static final int s16CompressBackup(int[] out, int outOffset, + + protected static final int s16CompressBackup(int[] out, int outOffset, int[] in, int inOffset, int n, int blockSize, int oriBlockSize, int[] oriInputBlock) { int numIdx, j, num, bits; @@ -152,7 +156,7 @@ public static final int s16CompressBackup(int[] out, int outOffset, * the number of elements to be compressed * @return the number of processed integers */ - public static final int s16Decompress(int[] out, int outOffset, + protected static final int s16Decompress(int[] out, int outOffset, int[] in, int inOffset, int n) { int numIdx, j = 0, bits = 0; numIdx = in[inOffset] >>> S16_BITSSIZE; @@ -165,7 +169,7 @@ public static final int s16Decompress(int[] out, int outOffset, return num; } - public static final int s16DecompressWithIntBufferBackup( + protected static final int s16DecompressWithIntBufferBackup( final int[] out, int outOffset, final int value, final int n) { int j = 0, shift; final int numIdx = value >>> S16_BITSSIZE; @@ -180,7 +184,7 @@ public static final int s16DecompressWithIntBufferBackup( return num; } - public static final int s16DecompressWithIntBuffer(final int[] out, + protected static final int s16DecompressWithIntBuffer(final int[] out, int outOffset, final int value, final int n) { int j = 0, shift; final int numIdx = value >>> S16_BITSSIZE; @@ -196,14 +200,14 @@ public static final int s16DecompressWithIntBuffer(final int[] out, return num; } - public static final int s16DecompressWithIntBufferWithHardCodes( + protected static final int s16DecompressWithIntBufferWithHardCodes( final int[] out, int outOffset, final int value, final int n) { final int numIdx = value >>> S16_BITSSIZE; return s16DecompressOneNumberWithHardCodes(out, outOffset, value, numIdx); } - public static final int s16DecompressWithIntBufferIntegrated( + protected static final int s16DecompressWithIntBufferIntegrated( final int[] out, int outOffset, final int value, final int n, int[] expPos, int oribits) { int j = 0, shift = 0; @@ -219,7 +223,7 @@ public static final int s16DecompressWithIntBufferIntegrated( return num; } - public static final int s16DecompressWithIntBufferIntegrated2( + protected static final int s16DecompressWithIntBufferIntegrated2( final int[] out, int outOffset, final int value, final int n, int[] expPos, int oribits) { final int numIdx = value >>> S16_BITSSIZE; @@ -227,7 +231,7 @@ public static final int s16DecompressWithIntBufferIntegrated2( outOffset, value, numIdx, oribits, expPos); } - public static final int s16DecompressWithIntBufferIntegratedBackup( + protected static final int s16DecompressWithIntBufferIntegratedBackup( final int[] out, int outOffset, final int value, final int n, int[] expPos, int oribits) { int j = 0, shift = 0; @@ -242,7 +246,7 @@ public static final int s16DecompressWithIntBufferIntegratedBackup( return num; } - public static int s16DecompressOneNumberWithHardCodes(int[] out, + protected static int s16DecompressOneNumberWithHardCodes(int[] out, int outOffset, int value, int numIdx) { switch (numIdx) { case 0: { @@ -459,7 +463,7 @@ public static int s16DecompressOneNumberWithHardCodes(int[] out, } } - public static int s16DecompressOneNumberWithHardCodesIntegrated( + protected static int s16DecompressOneNumberWithHardCodesIntegrated( int[] out, int outOffset, int value, int numIdx, int oribits, int[] expPos) { switch (numIdx) { diff --git a/src/main/java/me/lemire/integercompression/IntWrapper.java b/src/main/java/me/lemire/integercompression/IntWrapper.java index 94968eb..6bd8f0b 100644 --- a/src/main/java/me/lemire/integercompression/IntWrapper.java +++ b/src/main/java/me/lemire/integercompression/IntWrapper.java @@ -33,7 +33,8 @@ public IntWrapper(final int v) { } /** - * @param v + * add the provided value to the integer + * @param v value to add */ public void add(int v) { this.value += v; diff --git a/src/main/java/me/lemire/integercompression/Util.java b/src/main/java/me/lemire/integercompression/Util.java index ba47bfc..573c829 100644 --- a/src/main/java/me/lemire/integercompression/Util.java +++ b/src/main/java/me/lemire/integercompression/Util.java @@ -13,64 +13,102 @@ * */ public final class Util { - protected static int maxbits(int[] i, int pos, int length) { - int mask = 0; - for (int k = pos; k < pos + length; ++k) - mask |= i[k]; - return bits(mask); - } + /** + * Compute the maximum of the integer logarithms (ceil(log(x+1)) of a range + * of value + * + * @param i + * source array + * @param pos + * starting position + * @param length + * number of integers to consider + * @return integer logarithm + */ + public static int maxbits(int[] i, int pos, int length) { + int mask = 0; + for (int k = pos; k < pos + length; ++k) + mask |= i[k]; + return bits(mask); + } - protected static int maxbits32(int[] i, int pos) { - int mask = i[pos]; - mask |= i[pos + 1]; - mask |= i[pos + 2]; - mask |= i[pos + 3]; - mask |= i[pos + 4]; - mask |= i[pos + 5]; - mask |= i[pos + 6]; - mask |= i[pos + 7]; - mask |= i[pos + 8]; - mask |= i[pos + 9]; - mask |= i[pos + 10]; - mask |= i[pos + 11]; - mask |= i[pos + 12]; - mask |= i[pos + 13]; - mask |= i[pos + 14]; - mask |= i[pos + 15]; - mask |= i[pos + 16]; - mask |= i[pos + 17]; - mask |= i[pos + 18]; - mask |= i[pos + 19]; - mask |= i[pos + 20]; - mask |= i[pos + 21]; - mask |= i[pos + 22]; - mask |= i[pos + 23]; - mask |= i[pos + 24]; - mask |= i[pos + 25]; - mask |= i[pos + 26]; - mask |= i[pos + 27]; - mask |= i[pos + 28]; - mask |= i[pos + 29]; - mask |= i[pos + 30]; - mask |= i[pos + 31]; - return bits(mask); - } + protected static int maxbits32(int[] i, int pos) { + int mask = i[pos]; + mask |= i[pos + 1]; + mask |= i[pos + 2]; + mask |= i[pos + 3]; + mask |= i[pos + 4]; + mask |= i[pos + 5]; + mask |= i[pos + 6]; + mask |= i[pos + 7]; + mask |= i[pos + 8]; + mask |= i[pos + 9]; + mask |= i[pos + 10]; + mask |= i[pos + 11]; + mask |= i[pos + 12]; + mask |= i[pos + 13]; + mask |= i[pos + 14]; + mask |= i[pos + 15]; + mask |= i[pos + 16]; + mask |= i[pos + 17]; + mask |= i[pos + 18]; + mask |= i[pos + 19]; + mask |= i[pos + 20]; + mask |= i[pos + 21]; + mask |= i[pos + 22]; + mask |= i[pos + 23]; + mask |= i[pos + 24]; + mask |= i[pos + 25]; + mask |= i[pos + 26]; + mask |= i[pos + 27]; + mask |= i[pos + 28]; + mask |= i[pos + 29]; + mask |= i[pos + 30]; + mask |= i[pos + 31]; + return bits(mask); + } - protected static int maxdiffbits(int initoffset, int[] i, int pos, - int length) { - int mask = 0; - mask |= (i[pos] - initoffset); - for (int k = pos + 1; k < pos + length; ++k) { - mask |= i[k] - i[k - 1]; - } - return bits(mask); + /** + * Compute the maximum of the integer logarithms (ceil(log(x+1)) of a the + * successive differences (deltas) of a range of value + * @param initoffset initial vallue for the computation of the deltas + * @param i + * source array + * @param pos + * starting position + * @param length + * number of integers to consider + * @return integer logarithm + */ + public static int maxdiffbits(int initoffset, int[] i, int pos, int length) { + int mask = 0; + mask |= (i[pos] - initoffset); + for (int k = pos + 1; k < pos + length; ++k) { + mask |= i[k] - i[k - 1]; } + return bits(mask); + } - protected static int bits(int i) { - return 32 - Integer.numberOfLeadingZeros(i); - } + /** + * Compute the integer logarithms (ceil(log(x+1)) of a value + * + * @param i + * source value + * @return integer logarithm + */ + public static int bits(int i) { + return 32 - Integer.numberOfLeadingZeros(i); + } - protected static int floorBy(int value, int factor) { - return value - value % factor; - } + /** + * return floor(value / factor) + * + * @param value numerator + * @param factor denominator + * @return result of the division + */ + public static int floorBy(int value, int factor) { + + return value - value % factor; + } } diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java b/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java index 3e60c9e..7ca21da 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java @@ -11,18 +11,11 @@ import me.lemire.integercompression.BinaryPacking; import me.lemire.integercompression.ByteIntegerCODEC; import me.lemire.integercompression.Composition; -import me.lemire.integercompression.Delta; import me.lemire.integercompression.DeltaZigzagBinaryPacking; import me.lemire.integercompression.DeltaZigzagVariableByte; import me.lemire.integercompression.FastPFOR; import me.lemire.integercompression.IntWrapper; import me.lemire.integercompression.IntegerCODEC; -import me.lemire.integercompression.IntegratedBinaryPacking; -import me.lemire.integercompression.IntegratedByteIntegerCODEC; -import me.lemire.integercompression.IntegratedComposition; -import me.lemire.integercompression.IntegratedFastPFOR; -import me.lemire.integercompression.IntegratedIntegerCODEC; -import me.lemire.integercompression.IntegratedVariableByte; import me.lemire.integercompression.JustCopy; import me.lemire.integercompression.NewPFD; import me.lemire.integercompression.NewPFDS16; @@ -32,7 +25,14 @@ import me.lemire.integercompression.OptPFDS9; import me.lemire.integercompression.Simple9; import me.lemire.integercompression.VariableByte; -import me.lemire.integercompression.XorBinaryPacking; +import me.lemire.integercompression.differential.Delta; +import me.lemire.integercompression.differential.IntegratedBinaryPacking; +import me.lemire.integercompression.differential.IntegratedByteIntegerCODEC; +import me.lemire.integercompression.differential.IntegratedComposition; +import me.lemire.integercompression.differential.IntegratedFastPFOR; +import me.lemire.integercompression.differential.IntegratedIntegerCODEC; +import me.lemire.integercompression.differential.IntegratedVariableByte; +import me.lemire.integercompression.differential.XorBinaryPacking; import me.lemire.integercompression.synth.ClusteredDataGenerator; import java.io.File; @@ -300,7 +300,7 @@ private static void testByteCodec(PrintWriter csvLog, int sparsity, * * @param args * command-line arguments - * @throws FileNotFoundException + * @throws FileNotFoundException when we fail to create a new file */ public static void main(String args[]) throws FileNotFoundException { System.out diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkBitPacking.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkBitPacking.java index 2a05dcb..3380d36 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkBitPacking.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkBitPacking.java @@ -11,8 +11,8 @@ import java.util.Random; import me.lemire.integercompression.BitPacking; -import me.lemire.integercompression.Delta; -import me.lemire.integercompression.IntegratedBitPacking; +import me.lemire.integercompression.differential.Delta; +import me.lemire.integercompression.differential.IntegratedBitPacking; /** * Class used to benchmark the speed of bit packing. (For expert use.) diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java index e301d8f..c0af811 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java @@ -1,6 +1,13 @@ package me.lemire.integercompression.benchmarktools; import me.lemire.integercompression.*; +import me.lemire.integercompression.differential.IntegratedBinaryPacking; +import me.lemire.integercompression.differential.IntegratedByteIntegerCODEC; +import me.lemire.integercompression.differential.IntegratedComposition; +import me.lemire.integercompression.differential.IntegratedFastPFOR; +import me.lemire.integercompression.differential.IntegratedIntegerCODEC; +import me.lemire.integercompression.differential.IntegratedVariableByte; + import java.io.*; import java.util.ArrayList; import java.util.Arrays; @@ -119,8 +126,8 @@ private enum CompressionMode { } /** - * @param args - * @throws IOException + * @param args command-line arguments + * @throws IOException when some IO error occurs */ public static void main(final String[] args) throws IOException { Format myformat = Format.ONEARRAYPERLINE; diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkOffsettedSeries.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkOffsettedSeries.java index 9975ebc..9e25dc6 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkOffsettedSeries.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkOffsettedSeries.java @@ -15,9 +15,9 @@ import me.lemire.integercompression.FastPFOR; import me.lemire.integercompression.IntWrapper; import me.lemire.integercompression.IntegerCODEC; -import me.lemire.integercompression.IntegratedBinaryPacking; import me.lemire.integercompression.JustCopy; -import me.lemire.integercompression.XorBinaryPacking; +import me.lemire.integercompression.differential.IntegratedBinaryPacking; +import me.lemire.integercompression.differential.XorBinaryPacking; /** * Simple synthetic benchmark @@ -265,8 +265,8 @@ private static int[][] sortDataChunks(int[][] src) { } /** - * @param args - * @throws Exception + * @param args command-line arguments + * @throws Exception when some problem occurs */ public static void main(final String[] args) throws Exception { File csvFile = new File( diff --git a/src/main/java/me/lemire/integercompression/Delta.java b/src/main/java/me/lemire/integercompression/differential/Delta.java similarity index 98% rename from src/main/java/me/lemire/integercompression/Delta.java rename to src/main/java/me/lemire/integercompression/differential/Delta.java index 29f0cd2..4f7c144 100644 --- a/src/main/java/me/lemire/integercompression/Delta.java +++ b/src/main/java/me/lemire/integercompression/differential/Delta.java @@ -5,7 +5,7 @@ * (c) Daniel Lemire, http://lemire.me/en/ */ -package me.lemire.integercompression; +package me.lemire.integercompression.differential; /** * Generic class to compute differential coding. diff --git a/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java b/src/main/java/me/lemire/integercompression/differential/IntegratedBinaryPacking.java similarity index 97% rename from src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java rename to src/main/java/me/lemire/integercompression/differential/IntegratedBinaryPacking.java index 478f98c..82f95b2 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedBinaryPacking.java @@ -5,7 +5,10 @@ * (c) Daniel Lemire, http://lemire.me/en/ */ -package me.lemire.integercompression; +package me.lemire.integercompression.differential; + +import me.lemire.integercompression.IntWrapper; +import me.lemire.integercompression.Util; /** * Scheme based on a commonly used idea: can be extremely fast. diff --git a/src/main/java/me/lemire/integercompression/IntegratedBitPacking.java b/src/main/java/me/lemire/integercompression/differential/IntegratedBitPacking.java similarity index 99% rename from src/main/java/me/lemire/integercompression/IntegratedBitPacking.java rename to src/main/java/me/lemire/integercompression/differential/IntegratedBitPacking.java index 71387bb..8b26f6b 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedBitPacking.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedBitPacking.java @@ -5,7 +5,7 @@ * (c) Daniel Lemire, http://lemire.me/en/ */ -package me.lemire.integercompression; +package me.lemire.integercompression.differential; import java.util.Arrays; diff --git a/src/main/java/me/lemire/integercompression/IntegratedByteIntegerCODEC.java b/src/main/java/me/lemire/integercompression/differential/IntegratedByteIntegerCODEC.java similarity index 78% rename from src/main/java/me/lemire/integercompression/IntegratedByteIntegerCODEC.java rename to src/main/java/me/lemire/integercompression/differential/IntegratedByteIntegerCODEC.java index e155b66..b0184b8 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedByteIntegerCODEC.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedByteIntegerCODEC.java @@ -5,7 +5,9 @@ * (c) Daniel Lemire, http://lemire.me/en/ */ -package me.lemire.integercompression; +package me.lemire.integercompression.differential; + +import me.lemire.integercompression.ByteIntegerCODEC; /** * Interface describing a CODEC to compress integers to bytes. diff --git a/src/main/java/me/lemire/integercompression/IntegratedComposition.java b/src/main/java/me/lemire/integercompression/differential/IntegratedComposition.java similarity index 95% rename from src/main/java/me/lemire/integercompression/IntegratedComposition.java rename to src/main/java/me/lemire/integercompression/differential/IntegratedComposition.java index 9cf274b..4843497 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedComposition.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedComposition.java @@ -4,7 +4,9 @@ * * (c) Daniel Lemire, http://lemire.me/en/ */ -package me.lemire.integercompression; +package me.lemire.integercompression.differential; + +import me.lemire.integercompression.IntWrapper; /** * Helper class to compose schemes. diff --git a/src/main/java/me/lemire/integercompression/IntegratedFastPFOR.java b/src/main/java/me/lemire/integercompression/differential/IntegratedFastPFOR.java similarity index 98% rename from src/main/java/me/lemire/integercompression/IntegratedFastPFOR.java rename to src/main/java/me/lemire/integercompression/differential/IntegratedFastPFOR.java index 911d5c2..8b5e499 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedFastPFOR.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedFastPFOR.java @@ -4,11 +4,16 @@ * * (c) Daniel Lemire, http://lemire.me/en/ */ -package me.lemire.integercompression; +package me.lemire.integercompression.differential; import java.nio.ByteBuffer; import java.util.Arrays; +import me.lemire.integercompression.BitPacking; +import me.lemire.integercompression.IntWrapper; +import me.lemire.integercompression.IntegerCODEC; +import me.lemire.integercompression.Util; + /** *

* This is an integrated version of FastPFOR meaning that it computes diff --git a/src/main/java/me/lemire/integercompression/IntegratedIntegerCODEC.java b/src/main/java/me/lemire/integercompression/differential/IntegratedIntegerCODEC.java similarity index 80% rename from src/main/java/me/lemire/integercompression/IntegratedIntegerCODEC.java rename to src/main/java/me/lemire/integercompression/differential/IntegratedIntegerCODEC.java index 7cb07c4..4c03d29 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedIntegerCODEC.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedIntegerCODEC.java @@ -4,7 +4,9 @@ * * (c) Daniel Lemire, http://lemire.me/en/ */ -package me.lemire.integercompression; +package me.lemire.integercompression.differential; + +import me.lemire.integercompression.IntegerCODEC; /** * This is just like IntegerCODEC, except that it indicates that delta coding is diff --git a/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java b/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java similarity index 98% rename from src/main/java/me/lemire/integercompression/IntegratedVariableByte.java rename to src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java index e085327..19be4b8 100644 --- a/src/main/java/me/lemire/integercompression/IntegratedVariableByte.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java @@ -4,11 +4,13 @@ * * (c) Daniel Lemire, http://lemire.me/en/ */ -package me.lemire.integercompression; +package me.lemire.integercompression.differential; import java.nio.ByteBuffer; import java.nio.IntBuffer; +import me.lemire.integercompression.IntWrapper; + /** * Implementation of variable-byte with differential coding. For best * performance, use it using the IntegratedByteIntegerCODEC interface. diff --git a/src/main/java/me/lemire/integercompression/XorBinaryPacking.java b/src/main/java/me/lemire/integercompression/differential/XorBinaryPacking.java similarity index 97% rename from src/main/java/me/lemire/integercompression/XorBinaryPacking.java rename to src/main/java/me/lemire/integercompression/differential/XorBinaryPacking.java index 131db4b..0e2b067 100644 --- a/src/main/java/me/lemire/integercompression/XorBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/differential/XorBinaryPacking.java @@ -2,7 +2,10 @@ * This code is released under the * Apache License Version 2.0 http://www.apache.org/licenses/. */ -package me.lemire.integercompression; +package me.lemire.integercompression.differential; + +import me.lemire.integercompression.BitPacking; +import me.lemire.integercompression.IntWrapper; /** * BinaryPacking over XOR differential. diff --git a/src/test/java/me/lemire/integercompression/AdhocTest.java b/src/test/java/me/lemire/integercompression/AdhocTest.java index d076b44..b82b69b 100644 --- a/src/test/java/me/lemire/integercompression/AdhocTest.java +++ b/src/test/java/me/lemire/integercompression/AdhocTest.java @@ -10,6 +10,9 @@ public class AdhocTest { + /** + * a test + */ @Test public void biggerCompressedArray0() { // No problem: for comparison. @@ -17,6 +20,9 @@ public void biggerCompressedArray0() { assertSymmetry(c, 0, 16384); } + /** + * a test + */ @Test public void biggerCompressedArray1() { // Compressed array is bigger than original, because of VariableByte. @@ -24,6 +30,9 @@ public void biggerCompressedArray1() { assertSymmetry(c, -1); } + /** + * a test + */ @Test public void biggerCompressedArray2() { // Compressed array is bigger than original, because of Composition. diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 7835adf..dc3b255 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -3,9 +3,17 @@ import java.util.Arrays; import java.util.Random; +import me.lemire.integercompression.differential.Delta; +import me.lemire.integercompression.differential.IntegratedBinaryPacking; +import me.lemire.integercompression.differential.IntegratedComposition; +import me.lemire.integercompression.differential.IntegratedFastPFOR; +import me.lemire.integercompression.differential.IntegratedIntegerCODEC; +import me.lemire.integercompression.differential.IntegratedVariableByte; +import me.lemire.integercompression.differential.XorBinaryPacking; import me.lemire.integercompression.synth.ClusteredDataGenerator; import org.junit.Test; + import static org.junit.Assert.*; /** @@ -13,90 +21,93 @@ * * @author Daniel Lemire */ -@SuppressWarnings({"static-method","javadoc"}) -public class BasicTest -{ - IntegerCODEC[] codecs = { - new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()), - new JustCopy(), - new VariableByte(), - new IntegratedVariableByte(), - new Composition(new BinaryPacking(), new VariableByte()), - new Composition(new NewPFD(), new VariableByte()), - new Composition(new NewPFDS16(), new VariableByte()), - new Composition(new OptPFDS9(), new VariableByte()), - new Composition(new OptPFDS16(), new VariableByte()), - new IntegratedComposition(new IntegratedFastPFOR(), - new IntegratedVariableByte()), - new Composition(new FastPFOR(), new VariableByte()), - new Simple9(), - new Composition(new XorBinaryPacking(), new VariableByte()), - new Composition(new DeltaZigzagBinaryPacking(), - new DeltaZigzagVariableByte()) }; +@SuppressWarnings({ "static-method", "javadoc" }) +public class BasicTest { + IntegerCODEC[] codecs = { + new IntegratedComposition(new IntegratedBinaryPacking(), + new IntegratedVariableByte()), + new JustCopy(), + new VariableByte(), + new IntegratedVariableByte(), + new Composition(new BinaryPacking(), new VariableByte()), + new Composition(new NewPFD(), new VariableByte()), + new Composition(new NewPFDS16(), new VariableByte()), + new Composition(new OptPFDS9(), new VariableByte()), + new Composition(new OptPFDS16(), new VariableByte()), + new IntegratedComposition(new IntegratedFastPFOR(), + new IntegratedVariableByte()), + new Composition(new FastPFOR(), new VariableByte()), + new Simple9(), + new Composition(new XorBinaryPacking(), new VariableByte()), + new Composition(new DeltaZigzagBinaryPacking(), + new DeltaZigzagVariableByte()) }; + + /** + * + */ @Test public void varyingLengthTest() { - int N = 4096; - int[] data = new int[N]; - for (int k = 0; k < N; ++k) - data[k] = k; - for (IntegerCODEC c : codecs) { - for (int L = 1; L <= 128; L++) { - int[] comp = TestUtils.compress(c, - Arrays.copyOf(data, L)); - int[] answer = TestUtils.uncompress(c, comp, L); - for (int k = 0; k < L; ++k) - if (answer[k] != data[k]) - throw new RuntimeException( - "bug"); - } - for (int L = 128; L <= N; L*=2) { - int[] comp = TestUtils.compress(c, - Arrays.copyOf(data, L)); - int[] answer = TestUtils.uncompress(c, comp, L); - for (int k = 0; k < L; ++k) - if (answer[k] != data[k]) - throw new RuntimeException( - "bug"); - } + int N = 4096; + int[] data = new int[N]; + for (int k = 0; k < N; ++k) + data[k] = k; + for (IntegerCODEC c : codecs) { + for (int L = 1; L <= 128; L++) { + int[] comp = TestUtils.compress(c, Arrays.copyOf(data, L)); + int[] answer = TestUtils.uncompress(c, comp, L); + for (int k = 0; k < L; ++k) + if (answer[k] != data[k]) + throw new RuntimeException("bug"); + } + for (int L = 128; L <= N; L *= 2) { + int[] comp = TestUtils.compress(c, Arrays.copyOf(data, L)); + int[] answer = TestUtils.uncompress(c, comp, L); + for (int k = 0; k < L; ++k) + if (answer[k] != data[k]) + throw new RuntimeException("bug"); + } - } } + } + + /** + * + */ @Test public void varyingLengthTest2() { - int N = 128; - int[] data = new int[N]; - data[127] = -1; - for (IntegerCODEC c : codecs) { - try { - // CODEC Simple9 is limited to "small" integers. - if(c.getClass().equals(Class.forName("me.lemire.integercompression.Simple9"))) - continue; - } catch (ClassNotFoundException e) { - e.printStackTrace(); - } - for (int L = 1; L <= 128; L++) { - int[] comp = TestUtils.compress(c, - Arrays.copyOf(data, L)); - int[] answer = TestUtils.uncompress(c, comp, L); - for (int k = 0; k < L; ++k) - if (answer[k] != data[k]) - throw new RuntimeException( - "bug"); - } - for (int L = 128; L <= N; L*=2) { - int[] comp = TestUtils.compress(c, - Arrays.copyOf(data, L)); - int[] answer = TestUtils.uncompress(c, comp, L); - for (int k = 0; k < L; ++k) - if (answer[k] != data[k]) - throw new RuntimeException( - "bug"); - } + int N = 128; + int[] data = new int[N]; + data[127] = -1; + for (IntegerCODEC c : codecs) { + try { + // CODEC Simple9 is limited to "small" integers. + if (c.getClass().equals( + Class.forName("me.lemire.integercompression.Simple9"))) + continue; + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + for (int L = 1; L <= 128; L++) { + int[] comp = TestUtils.compress(c, Arrays.copyOf(data, L)); + int[] answer = TestUtils.uncompress(c, comp, L); + for (int k = 0; k < L; ++k) + if (answer[k] != data[k]) + throw new RuntimeException("bug"); + } + for (int L = 128; L <= N; L *= 2) { + int[] comp = TestUtils.compress(c, Arrays.copyOf(data, L)); + int[] answer = TestUtils.uncompress(c, comp, L); + for (int k = 0; k < L; ++k) + if (answer[k] != data[k]) + throw new RuntimeException("bug"); + } - } } - + } + + /** + * + */ @Test public void checkDeltaZigzagVB() { DeltaZigzagVariableByte codec = new DeltaZigzagVariableByte(); @@ -108,17 +119,18 @@ public void checkDeltaZigzagVB() { test(codec, codeco, 2, 18); } + /** + * + */ @Test public void checkDeltaZigzagPacking() { DeltaZigzagBinaryPacking codec = new DeltaZigzagBinaryPacking(); testZeroInZeroOut(codec); testSpurious(codec); - IntegerCODEC compo = new Composition( - new DeltaZigzagBinaryPacking(), + IntegerCODEC compo = new Composition(new DeltaZigzagBinaryPacking(), new VariableByte()); - IntegerCODEC compo2 = new Composition( - new DeltaZigzagBinaryPacking(), + IntegerCODEC compo2 = new Composition(new DeltaZigzagBinaryPacking(), new VariableByte()); testZeroInZeroOut(compo); @@ -128,12 +140,18 @@ public void checkDeltaZigzagPacking() { test(compo, compo2, 2, 18); } + /** + * + */ @Test public void checkXorBinaryPacking() { testZeroInZeroOut(new XorBinaryPacking()); testSpurious(new XorBinaryPacking()); } + /** + * + */ @Test public void checkXorBinaryPacking1() { IntegerCODEC c = new IntegratedComposition(new XorBinaryPacking(), @@ -141,6 +159,9 @@ public void checkXorBinaryPacking1() { testZeroInZeroOut(c); } + /** + * + */ @Test public void checkXorBinaryPacking2() { IntegerCODEC c = new IntegratedComposition(new XorBinaryPacking(), @@ -148,6 +169,9 @@ public void checkXorBinaryPacking2() { testUnsorted(c); } + /** + * + */ @Test public void checkXorBinaryPacking3() { IntegerCODEC c = new IntegratedComposition(new XorBinaryPacking(), @@ -205,6 +229,12 @@ public void verifyWithoutMask() { } } + /** + * @param array + * some array + * @param mask + * provided mask + */ public static void maskArray(int[] array, int mask) { for (int i = 0, end = array.length; i < end; ++i) { array[i] &= mask; @@ -264,8 +294,7 @@ public void spuriousouttest() { } /** - * check that an empty array generates an empty array - * after compression. + * check that an empty array generates an empty array after compression. */ @Test public void zeroinzerouttest() { @@ -280,8 +309,10 @@ public void zeroinzerouttest() { testZeroInZeroOut(new OptPFDS16()); testZeroInZeroOut(new FastPFOR()); testZeroInZeroOut(new VariableByte()); - testZeroInZeroOut(new Composition(new IntegratedBinaryPacking(), new VariableByte())); - testZeroInZeroOut(new Composition(new BinaryPacking(), new VariableByte())); + testZeroInZeroOut(new Composition(new IntegratedBinaryPacking(), + new VariableByte())); + testZeroInZeroOut(new Composition(new BinaryPacking(), + new VariableByte())); testZeroInZeroOut(new Composition(new NewPFD(), new VariableByte())); testZeroInZeroOut(new Composition(new NewPFDS9(), new VariableByte())); testZeroInZeroOut(new Composition(new NewPFDS16(), new VariableByte())); @@ -290,7 +321,8 @@ public void zeroinzerouttest() { testZeroInZeroOut(new Composition(new OptPFDS16(), new VariableByte())); testZeroInZeroOut(new Composition(new FastPFOR(), new VariableByte())); - testZeroInZeroOut(new IntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte())); + testZeroInZeroOut(new IntegratedComposition( + new IntegratedBinaryPacking(), new IntegratedVariableByte())); } private static void testSpurious(IntegerCODEC c) { @@ -318,7 +350,7 @@ private static void testZeroInZeroOut(IntegerCODEC c) { assertEquals(0, outpos.intValue()); } - private static void test(IntegerCODEC c,IntegerCODEC co, int N, int nbr) { + private static void test(IntegerCODEC c, IntegerCODEC co, int N, int nbr) { ClusteredDataGenerator cdg = new ClusteredDataGenerator(); for (int sparsity = 1; sparsity < 31 - nbr; sparsity += 4) { int[][] data = new int[N][]; @@ -340,11 +372,13 @@ private static void test(int N, int nbr) { } testCodec(new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()),new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()), data, max); - testCodec(new JustCopy(),new JustCopy(), data, max); + new IntegratedVariableByte()), + new IntegratedComposition(new IntegratedBinaryPacking(), + new IntegratedVariableByte()), data, max); + testCodec(new JustCopy(), new JustCopy(), data, max); testCodec(new VariableByte(), new VariableByte(), data, max); - testCodec(new IntegratedVariableByte(),new IntegratedVariableByte(), data, max); + testCodec(new IntegratedVariableByte(), + new IntegratedVariableByte(), data, max); testCodec(new Composition(new BinaryPacking(), new VariableByte()), new Composition(new BinaryPacking(), new VariableByte()), data, max); @@ -352,28 +386,29 @@ private static void test(int N, int nbr) { new Composition(new NewPFD(), new VariableByte()), data, max); testCodec(new Composition(new NewPFDS9(), new VariableByte()), - new Composition(new NewPFDS9(), new VariableByte()), - data, max); + new Composition(new NewPFDS9(), new VariableByte()), data, + max); testCodec(new Composition(new NewPFDS16(), new VariableByte()), - new Composition(new NewPFDS16(), new VariableByte()), - data, max); + new Composition(new NewPFDS16(), new VariableByte()), data, + max); testCodec(new Composition(new OptPFD(), new VariableByte()), - new Composition(new OptPFD(), new VariableByte()),data, + new Composition(new OptPFD(), new VariableByte()), data, max); testCodec(new Composition(new OptPFDS9(), new VariableByte()), - new Composition(new OptPFDS9(), new VariableByte()), - data, max); + new Composition(new OptPFDS9(), new VariableByte()), data, + max); testCodec(new Composition(new OptPFDS16(), new VariableByte()), - new Composition(new OptPFDS16(), new VariableByte()), - data, max); + new Composition(new OptPFDS16(), new VariableByte()), data, + max); testCodec(new Composition(new FastPFOR(), new VariableByte()), - new Composition(new FastPFOR(), new VariableByte()), - data, max); - testCodec(new Simple9(),new Simple9(), data, max); + new Composition(new FastPFOR(), new VariableByte()), data, + max); + testCodec(new Simple9(), new Simple9(), data, max); } } - private static void testCodec(IntegerCODEC c,IntegerCODEC co, int[][] data, int max) { + private static void testCodec(IntegerCODEC c, IntegerCODEC co, + int[][] data, int max) { int N = data.length; int maxlength = 0; for (int k = 0; k < N; ++k) { @@ -407,8 +442,8 @@ private static void testCodec(IntegerCODEC c,IntegerCODEC co, int[][] data, int // Check assertions. assertEquals("length is not match", outpos.get(), data[k].length); int[] bufferCutout = Arrays.copyOf(buffer, outpos.get()); - assertArrayEquals("failed to reconstruct original data", - data[k], bufferCutout); + assertArrayEquals("failed to reconstruct original data", data[k], + bufferCutout); } } @@ -429,8 +464,9 @@ public void testUnsortedExample() { testUnsorted(new Composition(new FastPFOR(), new VariableByte())); testUnsorted(new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte())); - testUnsorted(new Composition(new IntegratedBinaryPacking(), new VariableByte())); + new IntegratedVariableByte())); + testUnsorted(new Composition(new IntegratedBinaryPacking(), + new VariableByte())); testUnsorted(new IntegratedComposition(new IntegratedFastPFOR(), new IntegratedVariableByte())); @@ -446,8 +482,9 @@ public void testUnsortedExample() { testUnsorted2(new Composition(new FastPFOR(), new VariableByte())); testUnsorted3(new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte())); - testUnsorted3(new Composition(new IntegratedBinaryPacking(), new VariableByte())); + new IntegratedVariableByte())); + testUnsorted3(new Composition(new IntegratedBinaryPacking(), + new VariableByte())); testUnsorted3(new IntegratedComposition(new IntegratedFastPFOR(), new IntegratedVariableByte())); testUnsorted3(new VariableByte()); @@ -462,15 +499,19 @@ public void testUnsortedExample() { testUnsorted3(new Composition(new FastPFOR(), new VariableByte())); testUnsorted2(new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte())); - testUnsorted2(new Composition(new IntegratedBinaryPacking(), new VariableByte())); + new IntegratedVariableByte())); + testUnsorted2(new Composition(new IntegratedBinaryPacking(), + new VariableByte())); testUnsorted2(new IntegratedComposition(new IntegratedFastPFOR(), new IntegratedVariableByte())); } - public void testUnsorted(IntegerCODEC codec) - { + /** + * @param codec + * provided codec + */ + public void testUnsorted(IntegerCODEC codec) { int[] lengths = { 133, 1333333 }; for (int N : lengths) { int[] data = new int[N]; @@ -487,90 +528,93 @@ public void testUnsorted(IntegerCODEC codec) int[] compressed = new int[(int) Math.ceil(N * 1.01) + 1024]; IntWrapper inputoffset = new IntWrapper(0); IntWrapper outputoffset = new IntWrapper(0); - codec.compress(data, inputoffset, data.length, compressed, outputoffset); + codec.compress(data, inputoffset, data.length, compressed, + outputoffset); // we can repack the data: (optional) compressed = Arrays.copyOf(compressed, outputoffset.intValue()); int[] recovered = new int[N]; IntWrapper recoffset = new IntWrapper(0); - codec.uncompress(compressed, new IntWrapper(0), - compressed.length, recovered, recoffset); + codec.uncompress(compressed, new IntWrapper(0), compressed.length, + recovered, recoffset); assertArrayEquals(data, recovered); } } - - public void testUnsorted2(IntegerCODEC codec) { - int[] data = new int[128]; - data[5] = -1; - int[] compressed = new int[1024]; - IntWrapper inputoffset = new IntWrapper(0); - IntWrapper outputoffset = new IntWrapper(0); - codec.compress(data, inputoffset, data.length, compressed, - outputoffset); - // we can repack the data: (optional) - compressed = Arrays.copyOf(compressed, outputoffset.intValue()); - - int[] recovered = new int[128]; - IntWrapper recoffset = new IntWrapper(0); - codec.uncompress(compressed, new IntWrapper(0), - compressed.length, recovered, recoffset); - assertArrayEquals(data, recovered); - } - public void testUnsorted3(IntegerCODEC codec) { - int[] data = new int[128]; - data[127] = -1; - int[] compressed = new int[1024]; - IntWrapper inputoffset = new IntWrapper(0); - IntWrapper outputoffset = new IntWrapper(0); - codec.compress(data, inputoffset, data.length, compressed, - outputoffset); - // we can repack the data: (optional) - compressed = Arrays.copyOf(compressed, outputoffset.intValue()); - - int[] recovered = new int[128]; - IntWrapper recoffset = new IntWrapper(0); - codec.uncompress(compressed, new IntWrapper(0), - compressed.length, recovered, recoffset); - assertArrayEquals(data, recovered); - } - - - @Test - public void fastPforTest() { - // proposed by Stefan Ackermann (https://github.com/Stivo) - FastPFOR codec1 = new FastPFOR(); - FastPFOR codec2 = new FastPFOR(); - int N = 128; - int[] data = new int[N]; - for (int i = 0; i < N; i++) - data[i] = 0; - data[126] = -1; - int[] comp = TestUtils.compress(codec1, - Arrays.copyOf(data, N)); - int[] answer = TestUtils.uncompress(codec2, comp, N); - for (int k = 0; k < N; ++k) - if (answer[k] != data[k]) - throw new RuntimeException( - "bug "+k+" "+answer[k]+" != "+data[k]); - } - @Test - public void ifastPforTest() { - // inspired by Stefan Ackermann (https://github.com/Stivo) - IntegratedFastPFOR codec1 = new IntegratedFastPFOR(); - IntegratedFastPFOR codec2 = new IntegratedFastPFOR(); - int N = 128; - int[] data = new int[N]; - for (int i = 0; i < N; i++) - data[i] = 0; - data[126] = -1; - int[] comp = TestUtils.compress(codec1, - Arrays.copyOf(data, N)); - int[] answer = TestUtils.uncompress(codec2, comp, N); - for (int k = 0; k < N; ++k) - if (answer[k] != data[k]) - throw new RuntimeException( - "bug "+k+" "+answer[k]+" != "+data[k]); - } - + private void testUnsorted2(IntegerCODEC codec) { + int[] data = new int[128]; + data[5] = -1; + int[] compressed = new int[1024]; + IntWrapper inputoffset = new IntWrapper(0); + IntWrapper outputoffset = new IntWrapper(0); + codec.compress(data, inputoffset, data.length, compressed, outputoffset); + // we can repack the data: (optional) + compressed = Arrays.copyOf(compressed, outputoffset.intValue()); + + int[] recovered = new int[128]; + IntWrapper recoffset = new IntWrapper(0); + codec.uncompress(compressed, new IntWrapper(0), compressed.length, + recovered, recoffset); + assertArrayEquals(data, recovered); + } + + private void testUnsorted3(IntegerCODEC codec) { + int[] data = new int[128]; + data[127] = -1; + int[] compressed = new int[1024]; + IntWrapper inputoffset = new IntWrapper(0); + IntWrapper outputoffset = new IntWrapper(0); + codec.compress(data, inputoffset, data.length, compressed, outputoffset); + // we can repack the data: (optional) + compressed = Arrays.copyOf(compressed, outputoffset.intValue()); + + int[] recovered = new int[128]; + IntWrapper recoffset = new IntWrapper(0); + codec.uncompress(compressed, new IntWrapper(0), compressed.length, + recovered, recoffset); + assertArrayEquals(data, recovered); + } + + /** + * + */ + @Test + public void fastPforTest() { + // proposed by Stefan Ackermann (https://github.com/Stivo) + FastPFOR codec1 = new FastPFOR(); + FastPFOR codec2 = new FastPFOR(); + int N = 128; + int[] data = new int[N]; + for (int i = 0; i < N; i++) + data[i] = 0; + data[126] = -1; + int[] comp = TestUtils.compress(codec1, Arrays.copyOf(data, N)); + int[] answer = TestUtils.uncompress(codec2, comp, N); + for (int k = 0; k < N; ++k) + if (answer[k] != data[k]) + throw new RuntimeException("bug " + k + " " + answer[k] + + " != " + data[k]); + } + + /** + * + */ + @Test + public void ifastPforTest() { + // inspired by Stefan Ackermann (https://github.com/Stivo) + IntegratedFastPFOR codec1 = new IntegratedFastPFOR(); + IntegratedFastPFOR codec2 = new IntegratedFastPFOR(); + int N = 128; + int[] data = new int[N]; + for (int i = 0; i < N; i++) + data[i] = 0; + data[126] = -1; + int[] comp = TestUtils.compress(codec1, Arrays.copyOf(data, N)); + int[] answer = TestUtils.uncompress(codec2, comp, N); + for (int k = 0; k < N; ++k) + if (answer[k] != data[k]) + throw new RuntimeException("bug " + k + " " + answer[k] + + " != " + data[k]); + } + } diff --git a/src/test/java/me/lemire/integercompression/BoundaryTest.java b/src/test/java/me/lemire/integercompression/BoundaryTest.java index f68ae36..99dc931 100644 --- a/src/test/java/me/lemire/integercompression/BoundaryTest.java +++ b/src/test/java/me/lemire/integercompression/BoundaryTest.java @@ -2,12 +2,21 @@ import java.util.Arrays; +import me.lemire.integercompression.differential.IntegratedBinaryPacking; +import me.lemire.integercompression.differential.IntegratedComposition; +import me.lemire.integercompression.differential.IntegratedFastPFOR; +import me.lemire.integercompression.differential.IntegratedVariableByte; + import org.junit.Test; + import static org.junit.Assert.*; +/** + * @author lemire + * + */ @SuppressWarnings({ "static-method", "javadoc" }) -public class BoundaryTest -{ +public class BoundaryTest { private static void compressAndUncompress(int length, IntegerCODEC c) { // Initialize array. int[] source = new int[length]; @@ -26,15 +35,15 @@ private static void compressAndUncompress(int length, IntegerCODEC c) { int[] uncompressed = new int[length]; IntWrapper u_inpos = new IntWrapper(0); IntWrapper u_outpos = new IntWrapper(0); - c.uncompress(compressed, u_inpos, c_outpos.get(), - uncompressed, u_outpos); + c.uncompress(compressed, u_inpos, c_outpos.get(), uncompressed, + u_outpos); // Compare between uncompressed and original arrays. int[] target = Arrays.copyOf(uncompressed, u_outpos.get()); - if(!Arrays.equals(source, target)) { - System.out.println("problem with length = "+length+" and "+c); - System.out.println(Arrays.toString(source)); - System.out.println(Arrays.toString(target)); + if (!Arrays.equals(source, target)) { + System.out.println("problem with length = " + length + " and " + c); + System.out.println(Arrays.toString(source)); + System.out.println(Arrays.toString(target)); } assertArrayEquals(source, target); } @@ -56,23 +65,24 @@ private static void testBoundary(IntegerCODEC c) { around256(c); } + + /** + */ @Test - public void testIntegratedComposition() throws Exception { + public void testIntegratedComposition() { IntegratedComposition c = new IntegratedComposition( - new IntegratedBinaryPacking(), - new IntegratedVariableByte()); + new IntegratedBinaryPacking(), new IntegratedVariableByte()); testBoundary(c); IntegratedComposition c2 = new IntegratedComposition( - new IntegratedFastPFOR(), - new IntegratedVariableByte()); + new IntegratedFastPFOR(), new IntegratedVariableByte()); testBoundary(c2); } - @Test - public void testComposition() throws Exception { - Composition c = new Composition( - new BinaryPacking(), - new VariableByte()); + /** + */ + @Test + public void testComposition() { + Composition c = new Composition(new BinaryPacking(), new VariableByte()); testBoundary(c); } } diff --git a/src/test/java/me/lemire/integercompression/DeltaZigzagEncodingTest.java b/src/test/java/me/lemire/integercompression/DeltaZigzagEncodingTest.java index 872c6ac..76a1e81 100644 --- a/src/test/java/me/lemire/integercompression/DeltaZigzagEncodingTest.java +++ b/src/test/java/me/lemire/integercompression/DeltaZigzagEncodingTest.java @@ -7,20 +7,24 @@ import org.junit.Test; import static org.junit.Assert.*; +/** + * @author lemire + * + */ @SuppressWarnings({ "javadoc", "static-method" }) public class DeltaZigzagEncodingTest { - public static int zigzagEncode(DeltaZigzagEncoding.Encoder e, int value) { + protected static int zigzagEncode(DeltaZigzagEncoding.Encoder e, int value) { e.setContextValue(0); return e.encodeInt(value); } - public static int zigzagDecode(DeltaZigzagEncoding.Decoder d, int value) { + protected static int zigzagDecode(DeltaZigzagEncoding.Decoder d, int value) { d.setContextValue(0); return d.decodeInt(value); } - public static void checkEncode( + protected static void checkEncode( DeltaZigzagEncoding.Encoder e, int[] data, int[] expected) @@ -29,7 +33,7 @@ public static void checkEncode( assertEquals(data[data.length - 1], e.getContextValue()); } - public static void checkDecode( + protected static void checkDecode( DeltaZigzagEncoding.Decoder d, int[] data, int[] expected) @@ -38,7 +42,9 @@ public static void checkDecode( assertArrayEquals(expected, r); assertEquals(r[r.length - 1], d.getContextValue()); } - + /** + * + */ @Test public void checkZigzagEncode() { DeltaZigzagEncoding.Encoder e = new DeltaZigzagEncoding.Encoder(0); @@ -50,7 +56,9 @@ public void checkZigzagEncode() { assertEquals(3, zigzagEncode(e, -2)); assertEquals(5, zigzagEncode(e, -3)); } - + /** + * + */ @Test public void checkZigzagDecoder() { DeltaZigzagEncoding.Decoder d = new DeltaZigzagEncoding.Decoder(0); @@ -61,7 +69,9 @@ public void checkZigzagDecoder() { assertEquals( 2, zigzagDecode(d, 4)); assertEquals(-3, zigzagDecode(d, 5)); } - + /** + * + */ @Test public void checkEncodeSimple() { DeltaZigzagEncoding.Encoder e = new DeltaZigzagEncoding.Encoder(0); @@ -69,7 +79,9 @@ public void checkEncodeSimple() { new int[]{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, new int[]{ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2 }); } - + /** + * + */ @Test public void checkDecodeSimple() { DeltaZigzagEncoding.Decoder d = new DeltaZigzagEncoding.Decoder(0); @@ -78,7 +90,7 @@ public void checkDecodeSimple() { new int[]{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }); } - public static class SpotChecker { + protected static class SpotChecker { private final static DeltaZigzagEncoding.Encoder encoder = new DeltaZigzagEncoding.Encoder(0); @@ -94,6 +106,9 @@ public void check(int value) { } } + /** + * + */ @Test public void checkSpots() { SpotChecker c = new SpotChecker(); diff --git a/src/test/java/me/lemire/integercompression/TestUtils.java b/src/test/java/me/lemire/integercompression/TestUtils.java index 3a581f6..c6ca197 100644 --- a/src/test/java/me/lemire/integercompression/TestUtils.java +++ b/src/test/java/me/lemire/integercompression/TestUtils.java @@ -11,10 +11,13 @@ */ @SuppressWarnings({ "javadoc"}) public class TestUtils { + /** + * + */ @Test public void bogus() {}// to avoid useless complaining. - public static void dumpIntArray(int[] data, String label) { + protected static void dumpIntArray(int[] data, String label) { System.out.print(label); for (int i = 0; i < data.length; ++i) { if (i % 6 == 0) { @@ -25,7 +28,7 @@ public static void dumpIntArray(int[] data, String label) { System.out.println(); } - public static void dumpIntArrayAsHex(int[] data, String label) { + protected static void dumpIntArrayAsHex(int[] data, String label) { System.out.print(label); for (int i = 0; i < data.length; ++i) { if (i % 8 == 0) { @@ -40,7 +43,7 @@ public static void dumpIntArrayAsHex(int[] data, String label) { * Check that compress and uncompress keep original array. * * @param codec CODEC to test. - * @param source Data for test. + * @param orig original integers */ public static void assertSymmetry(IntegerCODEC codec, int... orig) { // There are some cases that compressed array is bigger than original @@ -71,7 +74,7 @@ public static void assertSymmetry(IntegerCODEC codec, int... orig) { assertArrayEquals(orig, target); } - public static int[] compress(IntegerCODEC codec, int[] data) { + protected static int[] compress(IntegerCODEC codec, int[] data) { int[] outBuf = new int[data.length * 4]; IntWrapper inPos = new IntWrapper(); IntWrapper outPos = new IntWrapper(); @@ -79,7 +82,7 @@ public static int[] compress(IntegerCODEC codec, int[] data) { return Arrays.copyOf(outBuf, outPos.get()); } - public static int[] uncompress(IntegerCODEC codec, int[] data, int len) { + protected static int[] uncompress(IntegerCODEC codec, int[] data, int len) { int[] outBuf = new int[len + 1024]; IntWrapper inPos = new IntWrapper(); IntWrapper outPos = new IntWrapper(); diff --git a/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java b/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java index 35dde4e..49351b4 100644 --- a/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java +++ b/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java @@ -6,9 +6,16 @@ import java.util.Arrays; +import me.lemire.integercompression.differential.XorBinaryPacking; + import org.junit.Test; + import static org.junit.Assert.*; +/** + * @author lemire + * + */ @SuppressWarnings({ "javadoc", "static-method" }) public final class XorBinaryPackingTest { @@ -18,13 +25,16 @@ public final class XorBinaryPackingTest - public static void checkCompressAndUncompress(String label, int[] data) { + private static void checkCompressAndUncompress(String label, int[] data) { XorBinaryPacking codec = new XorBinaryPacking(); int[] compBuf = TestUtils.compress(codec, data); int[] decompBuf = TestUtils.uncompress(codec, compBuf, data.length); assertArrayEquals(data, decompBuf); } + /** + * + */ @Test public void compressAndUncompress0() { int[] data = new int[128]; @@ -35,6 +45,9 @@ public void compressAndUncompress0() { checkCompressAndUncompress("compressAndUncompress0", data); } + /** + * + */ @Test public void compressAndUncompress1() { int[] data = new int[128]; @@ -44,6 +57,9 @@ public void compressAndUncompress1() { checkCompressAndUncompress("compressAndUncompress1", data); } + /** + * + */ @Test public void compressAndUncompress2() { int[] data = new int[128]; @@ -53,6 +69,9 @@ public void compressAndUncompress2() { checkCompressAndUncompress("compressAndUncompress2", data); } + /** + * + */ @Test public void compressAndUncompress3() { int[] data = new int[256]; @@ -61,6 +80,9 @@ public void compressAndUncompress3() { checkCompressAndUncompress("compressAndUncompress3", data); } + /** + * + */ @Test public void compressAndUncompress4() { int[] data = new int[256]; @@ -69,6 +91,9 @@ public void compressAndUncompress4() { checkCompressAndUncompress("compressAndUncompress4", data); } + /** + * + */ @Test public void compressAndUncompress5() { int[] data = new int[256]; From addf94f7fc15dfe392c8d79d4b36f4f4be08e2b1 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 23 Jul 2014 14:08:32 -0400 Subject: [PATCH 161/412] [maven-release-plugin] prepare release JavaFastPFOR-0.0.13 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 79f9c3d..0140062 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.13-SNAPSHOT + 0.0.13 jar From bb28899b5817c0b5ac89c029c5de1b648134eda5 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 23 Jul 2014 14:08:34 -0400 Subject: [PATCH 162/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0140062..617a7bc 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.13 + 0.0.14-SNAPSHOT jar From 1365ed0b6357da7ef2cefc6259a4a71a65315352 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 11 Aug 2014 15:58:58 -0400 Subject: [PATCH 163/412] Resolved issue where the java version of FastPFOR differs from the C++ version --- src/main/java/me/lemire/integercompression/FastPFOR.java | 8 ++++---- .../differential/IntegratedFastPFOR.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 3caa94a..2245411 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -182,11 +182,11 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, } inpos.set(tmpinpos); out[headerpos] = tmpoutpos - headerpos; + final int bytesize = byteContainer.position(); while ((byteContainer.position() & 3) != 0) byteContainer.put((byte) 0); - final int bytesize = byteContainer.position(); out[tmpoutpos++] = bytesize; - final int howmanyints = bytesize / 4; + final int howmanyints = byteContainer.position() / 4; byteContainer.flip(); byteContainer.asIntBuffer().get(out, tmpoutpos, howmanyints); tmpoutpos += howmanyints; @@ -245,8 +245,8 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, int inexcept = initpos + wheremeta; final int bytesize = in[inexcept++]; byteContainer.clear(); - byteContainer.asIntBuffer().put(in, inexcept, bytesize / 4); - inexcept += bytesize / 4; + byteContainer.asIntBuffer().put(in, inexcept, (bytesize + 3) / 4); + inexcept += (bytesize + 3)/ 4; final int bitmap = in[inexcept++]; for (int k = 1; k <= 32; ++k) { diff --git a/src/main/java/me/lemire/integercompression/differential/IntegratedFastPFOR.java b/src/main/java/me/lemire/integercompression/differential/IntegratedFastPFOR.java index 8b5e499..4af2f0a 100644 --- a/src/main/java/me/lemire/integercompression/differential/IntegratedFastPFOR.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedFastPFOR.java @@ -203,11 +203,11 @@ private void encodePage(int[] constin, IntWrapper constinpos, } constinpos.set(tmpconstinpos); out[headerpos] = tmpoutpos - headerpos; + final int bytesize = byteContainer.position(); while ((byteContainer.position() & 3) != 0) byteContainer.put((byte) 0); - final int bytesize = byteContainer.position(); out[tmpoutpos++] = bytesize; - final int howmanyints = bytesize / 4; + final int howmanyints = byteContainer.position() / 4; byteContainer.flip(); byteContainer.asIntBuffer().get(out, tmpoutpos, howmanyints); tmpoutpos += howmanyints; @@ -267,8 +267,8 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, int inexcept = initpos + wheremeta; final int bytesize = in[inexcept++]; byteContainer.clear(); - byteContainer.asIntBuffer().put(in, inexcept, bytesize / 4); - inexcept += bytesize / 4; + byteContainer.asIntBuffer().put(in, inexcept, (bytesize + 3) / 4); + inexcept += (bytesize + 3) / 4; final int bitmap = in[inexcept++]; for (int k = 1; k <= 32; ++k) { From 70ac1e80348bcebf54cdbd93ae96f11a695e6684 Mon Sep 17 00:00:00 2001 From: roysamit Date: Mon, 11 Aug 2014 23:33:48 -0500 Subject: [PATCH 164/412] Changed the logic of VariableByte Java version to match the C++ version --- .../integercompression/VariableByte.java | 233 +++++++++++------- 1 file changed, 138 insertions(+), 95 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/VariableByte.java b/src/main/java/me/lemire/integercompression/VariableByte.java index 599d7c6..1fac495 100644 --- a/src/main/java/me/lemire/integercompression/VariableByte.java +++ b/src/main/java/me/lemire/integercompression/VariableByte.java @@ -7,6 +7,7 @@ package me.lemire.integercompression; import java.nio.ByteBuffer; +import java.nio.ByteOrder; import java.nio.IntBuffer; /** @@ -19,105 +20,147 @@ * @author Daniel Lemire */ public class VariableByte implements IntegerCODEC, ByteIntegerCODEC { - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { - if (inlength == 0) - return; - ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); - for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { - int val = in[k]; - do { - int b = (val & 127); - val >>>= 7; - if (val != 0) { - b |= 128; - } - buf.put((byte) b); - } while (val != 0); - } - while (buf.position() % 4 != 0) - buf.put((byte) 128); - final int length = buf.position(); - buf.flip(); - IntBuffer ibuf = buf.asIntBuffer(); - ibuf.get(out, outpos.get(), length / 4); - outpos.add(length / 4); - inpos.add(inlength); - } - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, - byte[] out, IntWrapper outpos) { - if (inlength == 0) - return; - int outp = outpos.get(); - for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { - int val = in[k]; - do { - int b = (val & 127); - val >>>= 7; - if (val != 0) { - b |= 128; - } - out[outp++] = (byte) b; - } while (val != 0); - } - outpos.set(outp); - inpos.add(inlength); - } + private byte extract7bits(int i, long val) { + return (byte)((val >> (7 * i)) & ((1 << 7) - 1)); + } - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { - int s = 0; - int p = inpos.get(); - int finalp = inpos.get() + inlength; - int tmpoutpos = outpos.get(); - for (int v = 0, shift = 0; p < finalp;) { - int c = (byte) (in[p] >>> (24 - s)); - s += 8; - if (s == 32) { - s = 0; - p++; - } - v += ((c & 127) << shift); - if ((c & 128) == 0) { - out[tmpoutpos++] = v; - v = 0; - shift = 0; - } else - shift += 7; - } - outpos.set(tmpoutpos); - inpos.add(inlength); - } + private byte extract7bitsmaskless(int i, long val) { + return (byte)((val >> (7 * i))); + } - @Override - public void uncompress(byte[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { - int p = inpos.get(); - int finalp = inpos.get() + inlength; - int tmpoutpos = outpos.get(); - int v = 0; - int shift = 0; - for (; p < finalp; ++p) { - int c = in[p]; - v += ((c & 127) << shift); - if ((c & 128) == 0) { - out[tmpoutpos++] = v; - v = 0; - shift = 0; - } else - shift += 7; - } - outpos.set(tmpoutpos); - inpos.add(p); - } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + if (inlength == 0) + return; + ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); + for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { + long val = in[k] & 0xFFFFFFFFL; + if (val < (1 << 7)) { + buf.put((byte)(val | (1 << 7))); + } else if (val < (1 << 14)) { + buf.put((byte)extract7bits(0, val)); + buf.put((byte)(extract7bitsmaskless(1, (val)) | (1 << 7))); + } else if (val < (1 << 21)) { + buf.put((byte)extract7bits(0, val)); + buf.put((byte)extract7bits(1, val)); + buf.put((byte)(extract7bitsmaskless(2, (val)) | (1 << 7))); + } else if (val < (1 << 28)) { + buf.put((byte)extract7bits(0, val)); + buf.put((byte)extract7bits(1, val)); + buf.put((byte)extract7bits(2, val)); + buf.put((byte)(extract7bitsmaskless(3, (val)) | (1 << 7))); + } else { + buf.put((byte)extract7bits(0, val)); + buf.put((byte)extract7bits(1, val)); + buf.put((byte)extract7bits(2, val)); + buf.put((byte)extract7bits(3, val)); + buf.put((byte)(extract7bitsmaskless(4, (val)) | (1 << 7))); + } + } + while (buf.position() % 4 != 0) + buf.put((byte) 0); + final int length = buf.position(); + buf.flip(); + IntBuffer ibuf = buf.asIntBuffer(); + ibuf.get(out, outpos.get(), length / 4); + outpos.add(length / 4); + inpos.add(inlength); + } + + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, + byte[] out, IntWrapper outpos) { + if (inlength == 0) + return; + ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); + for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { + long val = in[k] & 0xFFFFFFFFL; + if (val < (1 << 7)) { + buf.put((byte)(val | (1 << 7))); + } else if (val < (1 << 14)) { + buf.put((byte)extract7bits(0, val)); + buf.put((byte)(extract7bitsmaskless(1, (val)) | (1 << 7))); + } else if (val < (1 << 21)) { + buf.put((byte)extract7bits(0, val)); + buf.put((byte)extract7bits(1, val)); + buf.put((byte)(extract7bitsmaskless(2, (val)) | (1 << 7))); + } else if (val < (1 << 28)) { + buf.put((byte)extract7bits(0, val)); + buf.put((byte)extract7bits(1, val)); + buf.put((byte)extract7bits(2, val)); + buf.put((byte)(extract7bitsmaskless(3, (val)) | (1 << 7))); + } else { + buf.put((byte)extract7bits(0, val)); + buf.put((byte)extract7bits(1, val)); + buf.put((byte)extract7bits(2, val)); + buf.put((byte)extract7bits(3, val)); + buf.put((byte)(extract7bitsmaskless(4, (val)) | (1 << 7))); + } + } + while (buf.position() % 4 != 0) + buf.put((byte) 0); + final int length = buf.position(); + buf.flip(); + buf.get(out,0,length); + outpos.set(length); + inpos.add(inlength); + } + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + int s = 0; + int val = 0; + int p = inpos.get(); + int finalp = inpos.get() + inlength; + int tmpoutpos = outpos.get(); + for (int v = 0, shift =0; p < finalp;) { + val = in[p]; + int c = (byte) (val >>> (24 - s)); + s += 8; + if (s == 32) { + s = 0; + p++; + } + v += ((c & 127) << shift); + if ((c & 128) == 128) { + out[tmpoutpos++] = v; + v = 0; + shift = 0; + } else + shift +=7; + } + outpos.set(tmpoutpos); + inpos.add(inlength); + } - @Override - public String toString() { - return this.getClass().getSimpleName(); + @Override + public void uncompress(byte[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + int p = inpos.get(); + int finalp = inpos.get() + inlength; + int tmpoutpos = outpos.get(); + int v = 0; + int shift = 0; + for (; p < finalp; ++p) { + int c = in[p]; + v += ((c & 127) << shift); + if ((c & 128) == 128) { + out[tmpoutpos++] = v; + v = 0; + shift = 0; + } else + shift += 7; } + outpos.set(tmpoutpos); + inpos.add(p); + } + + @Override + public String toString() { + return this.getClass().getSimpleName(); + } } From d7fe1ba89fee9def40a1bc27110e0e117d6f1fff Mon Sep 17 00:00:00 2001 From: roysamit Date: Mon, 11 Aug 2014 23:40:33 -0500 Subject: [PATCH 165/412] Updated the logic of VariableByte Java version to match the C++ version --- .../integercompression/VariableByte.java | 35 +++++++++---------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/VariableByte.java b/src/main/java/me/lemire/integercompression/VariableByte.java index 1fac495..64614d0 100644 --- a/src/main/java/me/lemire/integercompression/VariableByte.java +++ b/src/main/java/me/lemire/integercompression/VariableByte.java @@ -7,7 +7,6 @@ package me.lemire.integercompression; import java.nio.ByteBuffer; -import java.nio.ByteOrder; import java.nio.IntBuffer; /** @@ -140,24 +139,24 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, public void uncompress(byte[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { int p = inpos.get(); - int finalp = inpos.get() + inlength; - int tmpoutpos = outpos.get(); - int v = 0; - int shift = 0; - for (; p < finalp; ++p) { - int c = in[p]; - v += ((c & 127) << shift); - if ((c & 128) == 128) { - out[tmpoutpos++] = v; - v = 0; - shift = 0; - } else - shift += 7; - } - outpos.set(tmpoutpos); - inpos.add(p); + int finalp = inpos.get() + inlength; + int tmpoutpos = outpos.get(); + int v = 0; + int shift = 0; + for (; p < finalp; ++p) { + int c = in[p]; + v += ((c & 127) << shift); + if ((c & 128) == 128) { + out[tmpoutpos++] = v; + v = 0; + shift = 0; + } else + shift += 7; + } + outpos.set(tmpoutpos); + inpos.add(p); } - + @Override public String toString() { return this.getClass().getSimpleName(); From 37b5e11fbb31e1b081815b675465a7f88ab2cb2b Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 12 Aug 2014 08:28:25 -0400 Subject: [PATCH 166/412] Minor consistency checks --- .../integercompression/VariableByte.java | 8 +- .../differential/IntegratedVariableByte.java | 250 ++++++++++-------- 2 files changed, 148 insertions(+), 110 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/VariableByte.java b/src/main/java/me/lemire/integercompression/VariableByte.java index 64614d0..318d46a 100644 --- a/src/main/java/me/lemire/integercompression/VariableByte.java +++ b/src/main/java/me/lemire/integercompression/VariableByte.java @@ -20,11 +20,11 @@ */ public class VariableByte implements IntegerCODEC, ByteIntegerCODEC { - private byte extract7bits(int i, long val) { + private static byte extract7bits(int i, long val) { return (byte)((val >> (7 * i)) & ((1 << 7) - 1)); } - private byte extract7bitsmaskless(int i, long val) { + private static byte extract7bitsmaskless(int i, long val) { return (byte)((val >> (7 * i))); } @@ -35,7 +35,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, return; ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { - long val = in[k] & 0xFFFFFFFFL; + final long val = in[k] & 0xFFFFFFFFL; // To be consistent with unsigned integers in C/C++ if (val < (1 << 7)) { buf.put((byte)(val | (1 << 7))); } else if (val < (1 << 14)) { @@ -75,7 +75,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, return; ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { - long val = in[k] & 0xFFFFFFFFL; + final long val = in[k] & 0xFFFFFFFFL; // To be consistent with unsigned integers in C/C++ if (val < (1 << 7)) { buf.put((byte)(val | (1 << 7))); } else if (val < (1 << 14)) { diff --git a/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java b/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java index 19be4b8..e086e10 100644 --- a/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java @@ -20,120 +20,158 @@ * * @author Daniel Lemire */ -public class IntegratedVariableByte implements IntegratedIntegerCODEC, - IntegratedByteIntegerCODEC { - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { - if (inlength == 0) - return; - int initoffset = 0; - ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); - for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { - int val = in[k] - initoffset; - initoffset = in[k]; - do { - int b = (val & 127); - val >>>= 7; - if (val != 0) { - b |= 128; - } - buf.put((byte) b); - } while (val != 0); - } - while (buf.position() % 4 != 0) - buf.put((byte) 128); - final int length = buf.position(); - buf.flip(); - IntBuffer ibuf = buf.asIntBuffer(); - ibuf.get(out, outpos.get(), length / 4); - outpos.add(length / 4); - inpos.add(inlength); - } +public class IntegratedVariableByte implements IntegratedIntegerCODEC, IntegratedByteIntegerCODEC { + + private static byte extract7bits(int i, long val) { + return (byte)((val >> (7 * i)) & ((1 << 7) - 1)); + } - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, - byte[] out, IntWrapper outpos) { - if (inlength == 0) - return; - int outp = outpos.get(); - int initoffset = 0; + private static byte extract7bitsmaskless(int i, long val) { + return (byte)((val >> (7 * i))); + } - for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { - int val = in[k] - initoffset; - initoffset = in[k]; - do { - int b = (val & 127); - val >>>= 7; - if (val != 0) { - b |= 128; - } - out[outp++] = (byte) b; - } while (val != 0); - } - outpos.set(outp); - inpos.add(inlength); + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + if (inlength == 0) + return; + int initoffset = 0; + ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); + for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { + final long val = (in[k] - initoffset) & 0xFFFFFFFFL; // To be consistent with unsigned integers in C/C++ + initoffset = in[k]; + if (val < (1 << 7)) { + buf.put((byte)(val | (1 << 7))); + } else if (val < (1 << 14)) { + buf.put((byte)extract7bits(0, val)); + buf.put((byte)(extract7bitsmaskless(1, (val)) | (1 << 7))); + } else if (val < (1 << 21)) { + buf.put((byte)extract7bits(0, val)); + buf.put((byte)extract7bits(1, val)); + buf.put((byte)(extract7bitsmaskless(2, (val)) | (1 << 7))); + } else if (val < (1 << 28)) { + buf.put((byte)extract7bits(0, val)); + buf.put((byte)extract7bits(1, val)); + buf.put((byte)extract7bits(2, val)); + buf.put((byte)(extract7bitsmaskless(3, (val)) | (1 << 7))); + } else { + buf.put((byte)extract7bits(0, val)); + buf.put((byte)extract7bits(1, val)); + buf.put((byte)extract7bits(2, val)); + buf.put((byte)extract7bits(3, val)); + buf.put((byte)(extract7bitsmaskless(4, (val)) | (1 << 7))); + } } + while (buf.position() % 4 != 0) + buf.put((byte) 0); + final int length = buf.position(); + buf.flip(); + IntBuffer ibuf = buf.asIntBuffer(); + ibuf.get(out, outpos.get(), length / 4); + outpos.add(length / 4); + inpos.add(inlength); + } - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { - if (inlength == 0) - return; - int s = 0; - int p = inpos.get(); - int finalp = inpos.get() + inlength; - int tmpoutpos = outpos.get(); - int initoffset = 0; - for (int v = 0, shift = 0; p < finalp;) { - int c = (byte) (in[p] >>> (24 - s)); - s += 8; - if (s == 32) { - s = 0; - p++; - } - v += ((c & 127) << shift); - if ((c & 128) == 0) { - out[tmpoutpos] = v + initoffset; - initoffset = out[tmpoutpos]; - tmpoutpos++; - v = 0; - shift = 0; - } else - shift += 7; - } - outpos.set(tmpoutpos); - inpos.add(inlength); + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, + byte[] out, IntWrapper outpos) { + if (inlength == 0) + return; + int initoffset = 0; + ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); + for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { + final long val = (in[k] - initoffset) & 0xFFFFFFFFL; // To be consistent with unsigned integers in C/C++ + initoffset = in[k]; + if (val < (1 << 7)) { + buf.put((byte)(val | (1 << 7))); + } else if (val < (1 << 14)) { + buf.put((byte)extract7bits(0, val)); + buf.put((byte)(extract7bitsmaskless(1, (val)) | (1 << 7))); + } else if (val < (1 << 21)) { + buf.put((byte)extract7bits(0, val)); + buf.put((byte)extract7bits(1, val)); + buf.put((byte)(extract7bitsmaskless(2, (val)) | (1 << 7))); + } else if (val < (1 << 28)) { + buf.put((byte)extract7bits(0, val)); + buf.put((byte)extract7bits(1, val)); + buf.put((byte)extract7bits(2, val)); + buf.put((byte)(extract7bitsmaskless(3, (val)) | (1 << 7))); + } else { + buf.put((byte)extract7bits(0, val)); + buf.put((byte)extract7bits(1, val)); + buf.put((byte)extract7bits(2, val)); + buf.put((byte)extract7bits(3, val)); + buf.put((byte)(extract7bitsmaskless(4, (val)) | (1 << 7))); + } } + while (buf.position() % 4 != 0) + buf.put((byte) 0); + final int length = buf.position(); + buf.flip(); + buf.get(out,0,length); + outpos.set(length); + inpos.add(inlength); + } - @Override - public void uncompress(byte[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { - int p = inpos.get(); - int finalp = inpos.get() + inlength; - int tmpoutpos = outpos.get(); - int v = 0; - int shift = 0; - int initoffset = 0; - for (; p < finalp; ++p) { - byte c = in[p]; - v += ((c & 127) << shift); - if ((c & 128) == 0) { - out[tmpoutpos] = v + initoffset; - initoffset = out[tmpoutpos]; - v = 0; - ++tmpoutpos; - shift = 0; - } else - shift += 7; - } - outpos.set(tmpoutpos); - inpos.add(p); + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + int s = 0; + int val = 0; + int p = inpos.get(); + int finalp = inpos.get() + inlength; + int tmpoutpos = outpos.get(); + int initoffset = 0; + for (int v = 0, shift =0; p < finalp;) { + val = in[p]; + int c = (byte) (val >>> (24 - s)); + s += 8; + if (s == 32) { + s = 0; + p++; + } + v += ((c & 127) << shift); + if ((c & 128) == 128) { + out[tmpoutpos] = v + initoffset; + initoffset = out[tmpoutpos]; + tmpoutpos++; + v = 0; + shift = 0; + } else + shift +=7; } + outpos.set(tmpoutpos); + inpos.add(inlength); + } - @Override - public String toString() { - return this.getClass().getSimpleName(); + @Override + public void uncompress(byte[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + int p = inpos.get(); + int initoffset = 0; + int finalp = inpos.get() + inlength; + int tmpoutpos = outpos.get(); + int v = 0; + int shift = 0; + for (; p < finalp; ++p) { + int c = in[p]; + v += ((c & 127) << shift); + if ((c & 128) == 128) { + out[tmpoutpos] = v + initoffset; + initoffset = out[tmpoutpos]; + tmpoutpos++; + v = 0; + shift = 0; + } else + shift += 7; } + outpos.set(tmpoutpos); + inpos.add(p); + } + + @Override + public String toString() { + return this.getClass().getSimpleName(); + } } From f9e2224455f534371331578c78bc147c3983aba0 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 12 Aug 2014 08:31:00 -0400 Subject: [PATCH 167/412] Book-keeping --- CHANGELOG | 3 +++ README.md | 1 + 2 files changed, 4 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 8297989..843493d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +0.0.14 (upcoming) + - FastPFOR and VariableByte codecs made consistent with C++ version at https://github.com/lemire/FastPFor + 0.0.13 (July 23rd 2014) - CODECs using differential coding are now in a separate package (me.lemire.integercompression.differential) diff --git a/README.md b/README.md index 230059c..fc8994b 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,7 @@ Main contributors with contributions by * Di Wu, http://www.facebook.com/diwu1989 * Stefan Ackermann, https://github.com/Stivo +* Samit Roy, https://github.com/roysamit How does it compare to the Kamikaze PForDelta library? ------------------------------------------------------ From 38d395961fe30dc546b61ffa5f718d56ddffff60 Mon Sep 17 00:00:00 2001 From: Samit Roy Date: Tue, 19 Aug 2014 00:19:11 -0500 Subject: [PATCH 168/412] Modifying the compressed integers byte order of VariableByte to match FastPFor when using both in Composition in Java to work with C++ decompression --- src/main/java/me/lemire/integercompression/VariableByte.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/me/lemire/integercompression/VariableByte.java b/src/main/java/me/lemire/integercompression/VariableByte.java index 318d46a..5c34cb8 100644 --- a/src/main/java/me/lemire/integercompression/VariableByte.java +++ b/src/main/java/me/lemire/integercompression/VariableByte.java @@ -7,6 +7,7 @@ package me.lemire.integercompression; import java.nio.ByteBuffer; +import java.nio.ByteOrder; import java.nio.IntBuffer; /** @@ -34,6 +35,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, if (inlength == 0) return; ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); + buf.order(ByteOrder.LITTLE_ENDIAN); for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { final long val = in[k] & 0xFFFFFFFFL; // To be consistent with unsigned integers in C/C++ if (val < (1 << 7)) { @@ -117,7 +119,7 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, int tmpoutpos = outpos.get(); for (int v = 0, shift =0; p < finalp;) { val = in[p]; - int c = (byte) (val >>> (24 - s)); + int c = (byte) (val >>> s); s += 8; if (s == 32) { s = 0; From d0a008a2bf606a7a29fa792144b3a233bfe30dc1 Mon Sep 17 00:00:00 2001 From: Samit Roy Date: Thu, 21 Aug 2014 00:55:54 -0500 Subject: [PATCH 169/412] Modifying the compressed integers byte order of IntegratedVariableByte to match IntegratedFastPFor when using both in Composition --- .../differential/IntegratedVariableByte.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java b/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java index e086e10..c0a4a0b 100644 --- a/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java @@ -4,9 +4,10 @@ * * (c) Daniel Lemire, http://lemire.me/en/ */ -package me.lemire.integercompression.differential; +package me.lemire.integercompression; import java.nio.ByteBuffer; +import java.nio.ByteOrder; import java.nio.IntBuffer; import me.lemire.integercompression.IntWrapper; @@ -37,6 +38,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, return; int initoffset = 0; ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); + buf.order(ByteOrder.LITTLE_ENDIAN); for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { final long val = (in[k] - initoffset) & 0xFFFFFFFFL; // To be consistent with unsigned integers in C/C++ initoffset = in[k]; @@ -124,7 +126,7 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, int initoffset = 0; for (int v = 0, shift =0; p < finalp;) { val = in[p]; - int c = (byte) (val >>> (24 - s)); + int c = (byte) (val >>> s); s += 8; if (s == 32) { s = 0; From dadded4194072302f698e14d0b76c0b417410c79 Mon Sep 17 00:00:00 2001 From: Samit Roy Date: Thu, 21 Aug 2014 01:07:17 -0500 Subject: [PATCH 170/412] Update IntegratedVariableByte.java --- .../integercompression/differential/IntegratedVariableByte.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java b/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java index c0a4a0b..149fb0f 100644 --- a/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java @@ -4,7 +4,7 @@ * * (c) Daniel Lemire, http://lemire.me/en/ */ -package me.lemire.integercompression; +package me.lemire.integercompression.differential; import java.nio.ByteBuffer; import java.nio.ByteOrder; From 11afd64312914ec8f7177eb0c0f551c9dda38502 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Thu, 21 Aug 2014 15:20:56 -0400 Subject: [PATCH 171/412] Preparing new release --- CHANGELOG | 4 +++- README.md | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 843493d..da36702 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,7 @@ -0.0.14 (upcoming) + +0.0.14 (August 21st 2014) - FastPFOR and VariableByte codecs made consistent with C++ version at https://github.com/lemire/FastPFor + - VariableByte made to use little endian encoding 0.0.13 (July 23rd 2014) - CODECs using differential coding are now in a separate package (me.lemire.integercompression.differential) diff --git a/README.md b/README.md index fc8994b..dc3cd6b 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ the following code in your pom.xml file: me.lemire.integercompression JavaFastPFOR - 0.0.13 + 0.0.14 From 6caf527d496f1f8890c9b3f0ee524e88cbc609ad Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Thu, 21 Aug 2014 15:22:20 -0400 Subject: [PATCH 172/412] [maven-release-plugin] prepare release JavaFastPFOR-0.0.14 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 617a7bc..645de5f 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.14-SNAPSHOT + 0.0.14 jar From 9b6377832f6190578c61cdb44afa7fb46c2867e9 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Thu, 21 Aug 2014 15:22:23 -0400 Subject: [PATCH 173/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 645de5f..a69bb88 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.14 + 0.0.15-SNAPSHOT jar From ece748e925ac5a4db913e7f4fe72428054b5d04f Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 9 Sep 2014 11:34:40 -0400 Subject: [PATCH 174/412] Preparing new release --- CHANGELOG | 2 + README.md | 2 +- .../com/kamikaze/pfordelta/LCPForDelta.java | 1 - .../pfordelta/PForDeltaUnpack128.java | 1 - .../PForDeltaUnpack128WIthIntBuffer.java | 1 - .../java/com/kamikaze/pfordelta/Simple16.java | 1 - .../pfordelta/Simple16WithHardCodes.java | 1 - .../integercompression/VariableByte.java | 281 +++++++++--------- .../differential/IntegratedVariableByte.java | 75 ++--- .../lemire/integercompression/AdhocTest.java | 2 +- .../lemire/integercompression/BasicTest.java | 2 +- .../integercompression/BoundaryTest.java | 2 +- .../DeltaZigzagEncodingTest.java | 2 +- .../lemire/integercompression/TestUtils.java | 20 +- .../XorBinaryPackingTest.java | 2 +- 15 files changed, 212 insertions(+), 183 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index da36702..82dadde 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,5 @@ +0.0.15 (September 9th 2014) + - Improved the performance of VariableByte schemes when used as a ByteIntegerCODEC 0.0.14 (August 21st 2014) - FastPFOR and VariableByte codecs made consistent with C++ version at https://github.com/lemire/FastPFor diff --git a/README.md b/README.md index dc3cd6b..0d896ca 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ the following code in your pom.xml file: me.lemire.integercompression JavaFastPFOR - 0.0.14 + 0.0.15 diff --git a/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java b/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java index bf5154e..a948097 100644 --- a/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java +++ b/src/main/java/com/kamikaze/pfordelta/LCPForDelta.java @@ -51,7 +51,6 @@ * * @author hao yan, hyan2008@gmail.com */ -@SuppressWarnings("javadoc") public class LCPForDelta { // NOTE: we expect the blockSize is always < (1<<(31-POSSIBLE_B_BITS)). diff --git a/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128.java b/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128.java index 31b5378..fe5647c 100644 --- a/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128.java +++ b/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128.java @@ -5,7 +5,6 @@ * up by D. Lemire. It is included in the JavaFastPFOR library for comparison * purposes. As the original */ -@SuppressWarnings("javadoc") public class PForDeltaUnpack128 { static protected void unpack(int[] out, int[] in, int bits) { diff --git a/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128WIthIntBuffer.java b/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128WIthIntBuffer.java index 2e10e29..4b7a483 100644 --- a/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128WIthIntBuffer.java +++ b/src/main/java/com/kamikaze/pfordelta/PForDeltaUnpack128WIthIntBuffer.java @@ -12,7 +12,6 @@ * PForDeltaUnpack128WIthIntBuffer is almost the same as PForDeltaUnpack128, * except that it use IntBuffer as input instead of int[]. */ -@SuppressWarnings("javadoc") public class PForDeltaUnpack128WIthIntBuffer { static protected void unpack(int[] out, IntBuffer in, int bits) { diff --git a/src/main/java/com/kamikaze/pfordelta/Simple16.java b/src/main/java/com/kamikaze/pfordelta/Simple16.java index 1ccd315..c427f4d 100644 --- a/src/main/java/com/kamikaze/pfordelta/Simple16.java +++ b/src/main/java/com/kamikaze/pfordelta/Simple16.java @@ -20,7 +20,6 @@ * range of [2^28, 2^32). A simple way is just write those numbers as 32-bit * integers (that is, no compression for very big numbers). */ -@SuppressWarnings("javadoc") public class Simple16 { private static final int S16_NUMSIZE = 16; diff --git a/src/main/java/com/kamikaze/pfordelta/Simple16WithHardCodes.java b/src/main/java/com/kamikaze/pfordelta/Simple16WithHardCodes.java index b1a9f3f..b371360 100644 --- a/src/main/java/com/kamikaze/pfordelta/Simple16WithHardCodes.java +++ b/src/main/java/com/kamikaze/pfordelta/Simple16WithHardCodes.java @@ -26,7 +26,6 @@ * * Author: Hao Yan, hyan2008@gmail.com */ -@SuppressWarnings("javadoc") public class Simple16WithHardCodes { private static final int S16_NUMSIZE = 16; diff --git a/src/main/java/me/lemire/integercompression/VariableByte.java b/src/main/java/me/lemire/integercompression/VariableByte.java index 5c34cb8..e33fc1f 100644 --- a/src/main/java/me/lemire/integercompression/VariableByte.java +++ b/src/main/java/me/lemire/integercompression/VariableByte.java @@ -21,147 +21,156 @@ */ public class VariableByte implements IntegerCODEC, ByteIntegerCODEC { - private static byte extract7bits(int i, long val) { - return (byte)((val >> (7 * i)) & ((1 << 7) - 1)); - } + private static byte extract7bits(int i, long val) { + return (byte) ((val >> (7 * i)) & ((1 << 7) - 1)); + } - private static byte extract7bitsmaskless(int i, long val) { - return (byte)((val >> (7 * i))); - } + private static byte extract7bitsmaskless(int i, long val) { + return (byte) ((val >> (7 * i))); + } - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { - if (inlength == 0) - return; - ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); - buf.order(ByteOrder.LITTLE_ENDIAN); - for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { - final long val = in[k] & 0xFFFFFFFFL; // To be consistent with unsigned integers in C/C++ - if (val < (1 << 7)) { - buf.put((byte)(val | (1 << 7))); - } else if (val < (1 << 14)) { - buf.put((byte)extract7bits(0, val)); - buf.put((byte)(extract7bitsmaskless(1, (val)) | (1 << 7))); - } else if (val < (1 << 21)) { - buf.put((byte)extract7bits(0, val)); - buf.put((byte)extract7bits(1, val)); - buf.put((byte)(extract7bitsmaskless(2, (val)) | (1 << 7))); - } else if (val < (1 << 28)) { - buf.put((byte)extract7bits(0, val)); - buf.put((byte)extract7bits(1, val)); - buf.put((byte)extract7bits(2, val)); - buf.put((byte)(extract7bitsmaskless(3, (val)) | (1 << 7))); - } else { - buf.put((byte)extract7bits(0, val)); - buf.put((byte)extract7bits(1, val)); - buf.put((byte)extract7bits(2, val)); - buf.put((byte)extract7bits(3, val)); - buf.put((byte)(extract7bitsmaskless(4, (val)) | (1 << 7))); - } - } - while (buf.position() % 4 != 0) - buf.put((byte) 0); - final int length = buf.position(); - buf.flip(); - IntBuffer ibuf = buf.asIntBuffer(); - ibuf.get(out, outpos.get(), length / 4); - outpos.add(length / 4); - inpos.add(inlength); - } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + if (inlength == 0) + return; + ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); + buf.order(ByteOrder.LITTLE_ENDIAN); + for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { + final long val = in[k] & 0xFFFFFFFFL; // To be consistent with + // unsigned integers in C/C++ + if (val < (1 << 7)) { + buf.put((byte) (val | (1 << 7))); + } else if (val < (1 << 14)) { + buf.put((byte) extract7bits(0, val)); + buf.put((byte) (extract7bitsmaskless(1, (val)) | (1 << 7))); + } else if (val < (1 << 21)) { + buf.put((byte) extract7bits(0, val)); + buf.put((byte) extract7bits(1, val)); + buf.put((byte) (extract7bitsmaskless(2, (val)) | (1 << 7))); + } else if (val < (1 << 28)) { + buf.put((byte) extract7bits(0, val)); + buf.put((byte) extract7bits(1, val)); + buf.put((byte) extract7bits(2, val)); + buf.put((byte) (extract7bitsmaskless(3, (val)) | (1 << 7))); + } else { + buf.put((byte) extract7bits(0, val)); + buf.put((byte) extract7bits(1, val)); + buf.put((byte) extract7bits(2, val)); + buf.put((byte) extract7bits(3, val)); + buf.put((byte) (extract7bitsmaskless(4, (val)) | (1 << 7))); + } + } + while (buf.position() % 4 != 0) + buf.put((byte) 0); + final int length = buf.position(); + buf.flip(); + IntBuffer ibuf = buf.asIntBuffer(); + ibuf.get(out, outpos.get(), length / 4); + outpos.add(length / 4); + inpos.add(inlength); + } - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, - byte[] out, IntWrapper outpos) { - if (inlength == 0) - return; - ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); - for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { - final long val = in[k] & 0xFFFFFFFFL; // To be consistent with unsigned integers in C/C++ - if (val < (1 << 7)) { - buf.put((byte)(val | (1 << 7))); - } else if (val < (1 << 14)) { - buf.put((byte)extract7bits(0, val)); - buf.put((byte)(extract7bitsmaskless(1, (val)) | (1 << 7))); - } else if (val < (1 << 21)) { - buf.put((byte)extract7bits(0, val)); - buf.put((byte)extract7bits(1, val)); - buf.put((byte)(extract7bitsmaskless(2, (val)) | (1 << 7))); - } else if (val < (1 << 28)) { - buf.put((byte)extract7bits(0, val)); - buf.put((byte)extract7bits(1, val)); - buf.put((byte)extract7bits(2, val)); - buf.put((byte)(extract7bitsmaskless(3, (val)) | (1 << 7))); - } else { - buf.put((byte)extract7bits(0, val)); - buf.put((byte)extract7bits(1, val)); - buf.put((byte)extract7bits(2, val)); - buf.put((byte)extract7bits(3, val)); - buf.put((byte)(extract7bitsmaskless(4, (val)) | (1 << 7))); - } - } - while (buf.position() % 4 != 0) - buf.put((byte) 0); - final int length = buf.position(); - buf.flip(); - buf.get(out,0,length); - outpos.set(length); - inpos.add(inlength); - } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, byte[] out, + IntWrapper outpos) { + if (inlength == 0) + return; + int outpostmp = outpos.get(); + for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { + final long val = in[k] & 0xFFFFFFFFL; // To be consistent with + // unsigned integers in C/C++ + if (val < (1 << 7)) { + out[outpostmp++] = (byte) (val | (1 << 7)); + } else if (val < (1 << 14)) { + out[outpostmp++] = (byte) extract7bits(0, val); + out[outpostmp++] = (byte) (extract7bitsmaskless(1, (val)) | (1 << 7)); + } else if (val < (1 << 21)) { + out[outpostmp++] = (byte) extract7bits(0, val); + out[outpostmp++] = (byte) extract7bits(1, val); + out[outpostmp++] = (byte) (extract7bitsmaskless(2, (val)) | (1 << 7)); + } else if (val < (1 << 28)) { + out[outpostmp++] = (byte) extract7bits(0, val); + out[outpostmp++] = (byte) extract7bits(1, val); + out[outpostmp++] = (byte) extract7bits(2, val); + out[outpostmp++] = (byte) (extract7bitsmaskless(3, (val)) | (1 << 7)); + } else { + out[outpostmp++] = (byte) extract7bits(0, val); + out[outpostmp++] = (byte) extract7bits(1, val); + out[outpostmp++] = (byte) extract7bits(2, val); + out[outpostmp++] = (byte) extract7bits(3, val); + out[outpostmp++] = (byte) (extract7bitsmaskless(4, (val)) | (1 << 7)); + } + } + outpos.set(outpostmp); + inpos.add(inlength); + } - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { - int s = 0; - int val = 0; - int p = inpos.get(); - int finalp = inpos.get() + inlength; - int tmpoutpos = outpos.get(); - for (int v = 0, shift =0; p < finalp;) { - val = in[p]; - int c = (byte) (val >>> s); - s += 8; - if (s == 32) { - s = 0; - p++; - } - v += ((c & 127) << shift); - if ((c & 128) == 128) { - out[tmpoutpos++] = v; - v = 0; - shift = 0; - } else - shift +=7; - } - outpos.set(tmpoutpos); - inpos.add(inlength); - } + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + int s = 0; + int val = 0; + int p = inpos.get(); + int finalp = inpos.get() + inlength; + int tmpoutpos = outpos.get(); + for (int v = 0, shift = 0; p < finalp;) { + val = in[p]; + int c = (byte) (val >>> s); + s += 8; + if (s == 32) { + s = 0; + p++; + } + v += ((c & 127) << shift); + if ((c & 128) == 128) { + out[tmpoutpos++] = v; + v = 0; + shift = 0; + } else + shift += 7; + } + outpos.set(tmpoutpos); + inpos.add(inlength); + } - @Override - public void uncompress(byte[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { - int p = inpos.get(); - int finalp = inpos.get() + inlength; - int tmpoutpos = outpos.get(); - int v = 0; - int shift = 0; - for (; p < finalp; ++p) { - int c = in[p]; - v += ((c & 127) << shift); - if ((c & 128) == 128) { - out[tmpoutpos++] = v; - v = 0; - shift = 0; - } else - shift += 7; - } - outpos.set(tmpoutpos); - inpos.add(p); - } + @Override + public void uncompress(byte[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + int p = inpos.get(); + int finalp = inpos.get() + inlength; + int tmpoutpos = outpos.get(); + for (int v = 0; p < finalp; out[tmpoutpos++] = v) { + v = in[p] & 0x7F; + if (in[p] < 0) { + p += 1; + continue; + } + v = ((in[p + 1] & 0x7F) << 7) | v; + if (in[p + 1] < 0) { + p += 2; + continue; + } + v = ((in[p + 2] & 0x7F) << 14) | v; + if ((in[p + 2] & 128) == 128) { + p += 3; + continue; + } + v = ((in[p + 3] & 0x7F) << 21) | v; + if ((in[p + 3] & 128) == 128) { + p += 4; + continue; + } + v = ((in[p + 4] & 0x7F) << 28) | v; + p += 5; + } + outpos.set(tmpoutpos); + inpos.add(p); + } - @Override - public String toString() { - return this.getClass().getSimpleName(); - } + @Override + public String toString() { + return this.getClass().getSimpleName(); + } } diff --git a/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java b/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java index 149fb0f..9d3d925 100644 --- a/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java @@ -80,38 +80,33 @@ public void compress(int[] in, IntWrapper inpos, int inlength, if (inlength == 0) return; int initoffset = 0; - ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); + int outpostmp = outpos.get(); for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { final long val = (in[k] - initoffset) & 0xFFFFFFFFL; // To be consistent with unsigned integers in C/C++ initoffset = in[k]; if (val < (1 << 7)) { - buf.put((byte)(val | (1 << 7))); + out[outpostmp++] = (byte)(val | (1 << 7)); } else if (val < (1 << 14)) { - buf.put((byte)extract7bits(0, val)); - buf.put((byte)(extract7bitsmaskless(1, (val)) | (1 << 7))); + out[outpostmp++] = (byte)extract7bits(0, val); + out[outpostmp++] = (byte)(extract7bitsmaskless(1, (val)) | (1 << 7)); } else if (val < (1 << 21)) { - buf.put((byte)extract7bits(0, val)); - buf.put((byte)extract7bits(1, val)); - buf.put((byte)(extract7bitsmaskless(2, (val)) | (1 << 7))); + out[outpostmp++] = (byte)extract7bits(0, val); + out[outpostmp++] = (byte)extract7bits(1, val); + out[outpostmp++] = (byte)(extract7bitsmaskless(2, (val)) | (1 << 7)); } else if (val < (1 << 28)) { - buf.put((byte)extract7bits(0, val)); - buf.put((byte)extract7bits(1, val)); - buf.put((byte)extract7bits(2, val)); - buf.put((byte)(extract7bitsmaskless(3, (val)) | (1 << 7))); + out[outpostmp++] = (byte)extract7bits(0, val); + out[outpostmp++] = (byte)extract7bits(1, val); + out[outpostmp++] = (byte)extract7bits(2, val); + out[outpostmp++] = (byte)(extract7bitsmaskless(3, (val)) | (1 << 7)); } else { - buf.put((byte)extract7bits(0, val)); - buf.put((byte)extract7bits(1, val)); - buf.put((byte)extract7bits(2, val)); - buf.put((byte)extract7bits(3, val)); - buf.put((byte)(extract7bitsmaskless(4, (val)) | (1 << 7))); + out[outpostmp++] = (byte)extract7bits(0, val); + out[outpostmp++] = (byte)extract7bits(1, val); + out[outpostmp++] = (byte)extract7bits(2, val); + out[outpostmp++] = (byte)extract7bits(3, val); + out[outpostmp++] = (byte)(extract7bitsmaskless(4, (val)) | (1 << 7)); } } - while (buf.position() % 4 != 0) - buf.put((byte) 0); - final int length = buf.position(); - buf.flip(); - buf.get(out,0,length); - outpos.set(length); + outpos.set(outpostmp); inpos.add(inlength); } @@ -153,19 +148,29 @@ public void uncompress(byte[] in, IntWrapper inpos, int inlength, int initoffset = 0; int finalp = inpos.get() + inlength; int tmpoutpos = outpos.get(); - int v = 0; - int shift = 0; - for (; p < finalp; ++p) { - int c = in[p]; - v += ((c & 127) << shift); - if ((c & 128) == 128) { - out[tmpoutpos] = v + initoffset; - initoffset = out[tmpoutpos]; - tmpoutpos++; - v = 0; - shift = 0; - } else - shift += 7; + for (int v = 0;p < finalp; out[tmpoutpos++] = (initoffset = initoffset + v)) { + v = in[p] & 0x7F; + if (in[p] <0 ) { + p+= 1; + continue; + } + v = ((in[p+1] & 0x7F)<<7) | v; + if (in[p+1] < 0) { + p+= 2; + continue; + } + v = ((in[p+2] & 0x7F)<<14) | v; + if ((in[p+2]& 128) == 128) { + p+= 3; + continue; + } + v = ((in[p+3] & 0x7F)<<21) | v; + if ((in[p+3] & 128) == 128) { + p+= 4; + continue; + } + v = ((in[p+4] & 0x7F)<<28) | v; + p+= 5; } outpos.set(tmpoutpos); inpos.add(p); diff --git a/src/test/java/me/lemire/integercompression/AdhocTest.java b/src/test/java/me/lemire/integercompression/AdhocTest.java index b82b69b..50c2ad5 100644 --- a/src/test/java/me/lemire/integercompression/AdhocTest.java +++ b/src/test/java/me/lemire/integercompression/AdhocTest.java @@ -6,7 +6,7 @@ /** * Collection of adhoc tests. */ -@SuppressWarnings({ "javadoc", "static-method" }) +@SuppressWarnings({ "static-method" }) public class AdhocTest { diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index dc3b255..91d36e8 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -21,7 +21,7 @@ * * @author Daniel Lemire */ -@SuppressWarnings({ "static-method", "javadoc" }) +@SuppressWarnings({ "static-method" }) public class BasicTest { IntegerCODEC[] codecs = { new IntegratedComposition(new IntegratedBinaryPacking(), diff --git a/src/test/java/me/lemire/integercompression/BoundaryTest.java b/src/test/java/me/lemire/integercompression/BoundaryTest.java index 99dc931..0d6d573 100644 --- a/src/test/java/me/lemire/integercompression/BoundaryTest.java +++ b/src/test/java/me/lemire/integercompression/BoundaryTest.java @@ -15,7 +15,7 @@ * @author lemire * */ -@SuppressWarnings({ "static-method", "javadoc" }) +@SuppressWarnings({ "static-method" }) public class BoundaryTest { private static void compressAndUncompress(int length, IntegerCODEC c) { // Initialize array. diff --git a/src/test/java/me/lemire/integercompression/DeltaZigzagEncodingTest.java b/src/test/java/me/lemire/integercompression/DeltaZigzagEncodingTest.java index 76a1e81..5e0923d 100644 --- a/src/test/java/me/lemire/integercompression/DeltaZigzagEncodingTest.java +++ b/src/test/java/me/lemire/integercompression/DeltaZigzagEncodingTest.java @@ -11,7 +11,7 @@ * @author lemire * */ -@SuppressWarnings({ "javadoc", "static-method" }) +@SuppressWarnings({ "static-method" }) public class DeltaZigzagEncodingTest { protected static int zigzagEncode(DeltaZigzagEncoding.Encoder e, int value) { diff --git a/src/test/java/me/lemire/integercompression/TestUtils.java b/src/test/java/me/lemire/integercompression/TestUtils.java index c6ca197..9217097 100644 --- a/src/test/java/me/lemire/integercompression/TestUtils.java +++ b/src/test/java/me/lemire/integercompression/TestUtils.java @@ -9,7 +9,6 @@ /** * Static utility methods for test. */ -@SuppressWarnings({ "javadoc"}) public class TestUtils { /** * @@ -89,4 +88,23 @@ protected static int[] uncompress(IntegerCODEC codec, int[] data, int len) { codec.uncompress(data, inPos, data.length, outBuf, outPos); return Arrays.copyOf(outBuf, outPos.get()); } + + + + protected static byte[] compress(ByteIntegerCODEC codec, int[] data) { + byte[] outBuf = new byte[data.length * 4 * 4]; + IntWrapper inPos = new IntWrapper(); + IntWrapper outPos = new IntWrapper(); + codec.compress(data, inPos, data.length, outBuf, outPos); + return Arrays.copyOf(outBuf, outPos.get()); + } + + protected static int[] uncompress(ByteIntegerCODEC codec, byte[] data, int len) { + int[] outBuf = new int[len + 1024]; + IntWrapper inPos = new IntWrapper(); + IntWrapper outPos = new IntWrapper(); + codec.uncompress(data, inPos, data.length, outBuf, outPos); + return Arrays.copyOf(outBuf, outPos.get()); + } + } diff --git a/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java b/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java index 49351b4..3201b02 100644 --- a/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java +++ b/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java @@ -16,7 +16,7 @@ * @author lemire * */ -@SuppressWarnings({ "javadoc", "static-method" }) +@SuppressWarnings({ "static-method" }) public final class XorBinaryPackingTest { From e6fa6beb631207204fde213c4c7cb87d043784d2 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 9 Sep 2014 11:35:54 -0400 Subject: [PATCH 175/412] [maven-release-plugin] prepare release JavaFastPFOR-0.0.15 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a69bb88..d032256 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.15-SNAPSHOT + 0.0.15 jar From 6fc1e98cbdd4028ea02db4505017e58b53ba60e3 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 9 Sep 2014 11:35:57 -0400 Subject: [PATCH 176/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d032256..a457116 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.15 + 0.0.16-SNAPSHOT jar From 27d26220ac20b729f9e952d0bbf87164d3f51ef3 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 9 Sep 2014 15:47:07 -0400 Subject: [PATCH 177/412] Updating readme --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0d896ca..0e1844d 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,10 @@ It can decompress integers at a rate of over 1.2 billions per second as Snappy, LZ4 and so on) when compressing arrays of integers. Part of this library has been integrated in Parquet (http://parquet.io/). -This libary is used by ClueWeb Tools (https://github.com/lintool/clueweb). +A modified version of the library is included in the search engine +Terrier (http://terrier.org/). This libary is used by ClueWeb +Tools (https://github.com/lintool/clueweb). + This library inspired a compression scheme used by Apache Lucene (e.g., see http://lucene.apache.org/core/4_6_1/core/org/apache/lucene/util/PForDeltaDocIdSet.html ). From 38475acae1b2b5292a279795120e48426d705e2a Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 10 Sep 2014 16:33:30 -0400 Subject: [PATCH 178/412] Adding skippable codecs (not yet tested) --- CHANGELOG | 3 + .../me/lemire/integercompression/NewPFD.java | 2 +- .../me/lemire/integercompression/S16.java | 28 +- .../java/me/lemire/integercompression/S9.java | 28 +- .../skippable/Kamikaze.java | 46 +++ .../skippable/SkippableComposition.java | 62 ++++ .../skippable/SkippableFastPFOR.java | 262 ++++++++++++++++ .../skippable/SkippableIntegerCODEC.java | 69 +++++ .../skippable/SkippableNewPFD.java | 178 +++++++++++ .../skippable/SkippableOptPFD.java | 198 ++++++++++++ .../skippable/SkippableSimple16.java | 207 +++++++++++++ .../skippable/SkippableSimple9.java | 291 ++++++++++++++++++ 12 files changed, 1369 insertions(+), 5 deletions(-) create mode 100644 src/main/java/me/lemire/integercompression/skippable/Kamikaze.java create mode 100644 src/main/java/me/lemire/integercompression/skippable/SkippableComposition.java create mode 100644 src/main/java/me/lemire/integercompression/skippable/SkippableFastPFOR.java create mode 100644 src/main/java/me/lemire/integercompression/skippable/SkippableIntegerCODEC.java create mode 100644 src/main/java/me/lemire/integercompression/skippable/SkippableNewPFD.java create mode 100644 src/main/java/me/lemire/integercompression/skippable/SkippableOptPFD.java create mode 100644 src/main/java/me/lemire/integercompression/skippable/SkippableSimple16.java create mode 100644 src/main/java/me/lemire/integercompression/skippable/SkippableSimple9.java diff --git a/CHANGELOG b/CHANGELOG index 82dadde..e6db188 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +0.1.0 (upcoming) + - Introduced skippable versions (for use in a search engine like Terrier) + 0.0.15 (September 9th 2014) - Improved the performance of VariableByte schemes when used as a ByteIntegerCODEC diff --git a/src/main/java/me/lemire/integercompression/NewPFD.java b/src/main/java/me/lemire/integercompression/NewPFD.java index 28e28a3..9530c05 100644 --- a/src/main/java/me/lemire/integercompression/NewPFD.java +++ b/src/main/java/me/lemire/integercompression/NewPFD.java @@ -13,7 +13,7 @@ * Follows: *

* H. Yan, S. Ding, T. Suel, Inverted index compression and query processing - * with optimized document ordering, in: WWW �09, 2009, pp. 401�410. + * with optimized document ordering, in: WWW 09, 2009, pp. 401-410. *

* using Simple16 as the secondary coder. * diff --git a/src/main/java/me/lemire/integercompression/S16.java b/src/main/java/me/lemire/integercompression/S16.java index 6829b76..4b3b577 100644 --- a/src/main/java/me/lemire/integercompression/S16.java +++ b/src/main/java/me/lemire/integercompression/S16.java @@ -15,7 +15,21 @@ */ public final class S16 { - protected static int compress(final int[] in, int currentPos, + /** + * Compress an integer array using Simple16 + * + * + * @param in + * array to compress + * @param currentPos + * where to start reading + * @param inlength + * how many integers to read + * @param out output array + * @param tmpoutpos location in the output array + * @return the number of 32-bit words written (in compressed form) + */ + public static int compress(final int[] in, int currentPos, int inlength, final int out[], final int tmpoutpos) { int outpos = tmpoutpos; final int finalin = currentPos + inlength; @@ -141,7 +155,17 @@ public static final int decompressblock(int[] out, int outOffset, return num; } - protected static void uncompress(final int[] in, int tmpinpos, + /** + * Uncompressed data from an input array into an output array + * + * @param in input array (in compressed form) + * @param tmpinpos starting location in the compressed input array + * @param inlength how much data we wish the read (in 32-bit words) + * @param out output array (in decompressed form) + * @param currentPos current position in the output array + * @param outlength available data in the output array + */ + public static void uncompress(final int[] in, int tmpinpos, final int inlength, final int[] out, int currentPos, int outlength) { final int finalpos = tmpinpos + inlength; diff --git a/src/main/java/me/lemire/integercompression/S9.java b/src/main/java/me/lemire/integercompression/S9.java index d8a7121..d5846c7 100644 --- a/src/main/java/me/lemire/integercompression/S9.java +++ b/src/main/java/me/lemire/integercompression/S9.java @@ -53,7 +53,21 @@ public static int estimatecompress(int[] in, int currentPos, return tmpoutpos; } - protected static int compress(int[] in, int currentPos, int inlength, + /** + * Compress an integer array using Simple9 + * + * + * @param in + * array to compress + * @param currentPos + * where to start reading + * @param inlength + * how many integers to read + * @param out output array + * @param tmpoutpos location in the output array + * @return the number of 32-bit words written (in compressed form) + */ + public static int compress(int[] in, int currentPos, int inlength, int out[], int tmpoutpos) { int origtmpoutpos = tmpoutpos; int finalpos = currentPos + inlength; @@ -87,7 +101,17 @@ protected static int compress(int[] in, int currentPos, int inlength, return tmpoutpos - origtmpoutpos; } - protected static void uncompress(int[] in, int tmpinpos, int inlength, + /** + * Uncompressed data from an input array into an output array + * + * @param in input array (in compressed form) + * @param tmpinpos starting location in the compressed input array + * @param inlength how much data we wish the read (in 32-bit words) + * @param out output array (in decompressed form) + * @param currentPos current position in the output array + * @param outlength available data in the output array + */ + public static void uncompress(int[] in, int tmpinpos, int inlength, int[] out, int currentPos, int outlength) { int finallength = currentPos + outlength; diff --git a/src/main/java/me/lemire/integercompression/skippable/Kamikaze.java b/src/main/java/me/lemire/integercompression/skippable/Kamikaze.java new file mode 100644 index 0000000..f5a344e --- /dev/null +++ b/src/main/java/me/lemire/integercompression/skippable/Kamikaze.java @@ -0,0 +1,46 @@ +package me.lemire.integercompression.skippable; + +import me.lemire.integercompression.IntWrapper; +import com.kamikaze.pfordelta.PForDelta; + +/** + * IntegerCODEC wrapper for Kamikaze's PForDelta. + * + * + * @author Matteo Catena + * + */ +public class Kamikaze implements SkippableIntegerCODEC { + + private int BLOCK_SIZE = 128; + + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + + inlength = inlength / BLOCK_SIZE * BLOCK_SIZE; + if (inlength > 0) { + int[] out2 = PForDelta.compressOneBlockOpt(in, inlength); + inpos.add(inlength); + System.arraycopy(out2, 0, out, outpos.get(), out2.length); + outpos.add(out2.length); + } + } + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos, int num) { + + num = num / BLOCK_SIZE * BLOCK_SIZE; + if (num > 0) { + int d = PForDelta.decompressOneBlock(out, in, num); + inpos.add(d / 32); + outpos.add(num); + } + } + + @Override + public String toString() { + return "Kamikaze's PForDelta"; + } +} \ No newline at end of file diff --git a/src/main/java/me/lemire/integercompression/skippable/SkippableComposition.java b/src/main/java/me/lemire/integercompression/skippable/SkippableComposition.java new file mode 100644 index 0000000..b3ba09f --- /dev/null +++ b/src/main/java/me/lemire/integercompression/skippable/SkippableComposition.java @@ -0,0 +1,62 @@ +/** + * This is code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ +package me.lemire.integercompression.skippable; + +import me.lemire.integercompression.*; + +/** + * Helper class to compose schemes. + * + * @author Daniel Lemire + */ +public class SkippableComposition implements SkippableIntegerCODEC { + SkippableIntegerCODEC F1, F2; + + /** + * Compose a scheme from a first one (f1) and a second one (f2). The first + * one is called first and then the second one tries to compress whatever + * remains from the first run. + * + * By convention, the first scheme should be such that if, during decoding, + * a 32-bit zero is first encountered, then there is no output. + * + * @param f1 + * first codec + * @param f2 + * second codec + */ + public SkippableComposition(SkippableIntegerCODEC f1, + SkippableIntegerCODEC f2) { + F1 = f1; + F2 = f2; + } + + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + int init = inpos.get(); + F1.compress(in, inpos, inlength, out, outpos); + inlength -= inpos.get() - init; + F2.compress(in, inpos, inlength, out, outpos); + } + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos, int num) { + int init = inpos.get(); + F1.uncompress(in, inpos, inlength, out, outpos, num); + inlength -= inpos.get() - init; + num -= outpos.get(); + F2.uncompress(in, inpos, inlength, out, outpos, num); + } + + @Override + public String toString() { + return F1.getClass().getName() + "+" + F2.getClass().getName(); + } + +} diff --git a/src/main/java/me/lemire/integercompression/skippable/SkippableFastPFOR.java b/src/main/java/me/lemire/integercompression/skippable/SkippableFastPFOR.java new file mode 100644 index 0000000..34fe3ef --- /dev/null +++ b/src/main/java/me/lemire/integercompression/skippable/SkippableFastPFOR.java @@ -0,0 +1,262 @@ +/** + * This is code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ +package me.lemire.integercompression.skippable; + +import java.nio.ByteBuffer; +import java.util.Arrays; +import me.lemire.integercompression.*; + +/** + * This is a patching scheme designed for speed. It encodes integers in blocks + * of 128 integers within pages of up to 65536 integers. Note that it is + * important, to get good compression and good performance, to use sizeable + * blocks (greater than 1024 integers). For arrays containing a number of + * integers that is not divisible by 128, you should use it in conjunction with + * another CODEC: + * + * IntegerCODEC ic = new Composition(new FastPFOR(), new VariableByte()). + *

+ * For details, please see + *

+ *

+ * Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second + * through vectorization Software: Practice & Experience http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract http://arxiv.org/abs/1209.2137 + *

+ *

+ * For sufficiently compressible and long arrays, it is faster and better than + * other PFOR schemes. + *

+ * + * Note that this does not use differential coding: if you are working on sorted + * lists, use IntegratedFastPFOR instead. + * + * For multi-threaded applications, each thread should use its own FastPFOR + * object. + * + * @author Daniel Lemire + */ +public final class SkippableFastPFOR implements SkippableIntegerCODEC { + int PageSize; + final static int BlockSize = 128; + final static int overheadofeachexcept = 8; + + int[][] datatobepacked = new int[32][]; + ByteBuffer bytecontainer; + + /** + * Constructor for FastPFOR + * + * @param pagesize + * size of the page in number of integers + */ + public SkippableFastPFOR(int pagesize) { + PageSize = pagesize; + initArrays(); + } + + /** + * + */ + public SkippableFastPFOR() { + PageSize = 65536; + initArrays(); + } + + private void initArrays() { + bytecontainer = ByteBuffer.allocateDirect(3 * PageSize / BlockSize + + PageSize); + for (int k = 1; k < 32; ++k) + datatobepacked[k] = new int[PageSize / 32 * 4];// heuristic + } + + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + inlength = inlength / 128 * 128; + + final int finalinpos = inpos.get() + inlength; + while (inpos.get() != finalinpos) { + int thissize = finalinpos > PageSize + inpos.get() ? PageSize + : (finalinpos - inpos.get()); + encodePage(in, inpos, thissize, out, outpos); + } + } + + private static void getBestBFromData(int[] in, int pos, + byte[] bestbbestcexceptmaxb) { + int freqs[] = new int[32]; + for (int k = pos; k < BlockSize + pos; ++k) + freqs[Util.bits(in[k])]++; + bestbbestcexceptmaxb[0] = 31; + while (freqs[bestbbestcexceptmaxb[0]] == 0) + bestbbestcexceptmaxb[0]--; + bestbbestcexceptmaxb[2] = bestbbestcexceptmaxb[0]; + int bestcost = bestbbestcexceptmaxb[0] * BlockSize; + byte cexcept = 0; + bestbbestcexceptmaxb[1] = cexcept; + for (int b = bestbbestcexceptmaxb[0] - 1; b >= 0; --b) { + cexcept += freqs[b + 1]; + if (cexcept < 0) + break; + int thiscost = cexcept * overheadofeachexcept + cexcept + * (bestbbestcexceptmaxb[2] - b) + b * BlockSize + 8;// the + // extra + // 8 is + // the + // cost + // of + // storing + // maxbits + if (thiscost < bestcost) { + bestcost = thiscost; + bestbbestcexceptmaxb[0] = (byte) b; + bestbbestcexceptmaxb[1] = cexcept; + } + } + } + + private void encodePage(int[] in, IntWrapper inpos, int thissize, + int[] out, IntWrapper outpos) { + final int headerpos = outpos.get(); + outpos.increment(); + int tmpoutpos = outpos.get(); + int[] datapointers = new int[32]; + bytecontainer.clear(); + final byte[] bestbbestcexceptmaxb = new byte[3]; + int tmpinpos = inpos.get(); + for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { + getBestBFromData(in, tmpinpos, bestbbestcexceptmaxb); + final int tmpbestb = bestbbestcexceptmaxb[0]; + bytecontainer.put(bestbbestcexceptmaxb[0]); + bytecontainer.put(bestbbestcexceptmaxb[1]); + if (bestbbestcexceptmaxb[1] > 0) { + bytecontainer.put(bestbbestcexceptmaxb[2]); + final int index = bestbbestcexceptmaxb[2] + - bestbbestcexceptmaxb[0]; + if (datapointers[index] + bestbbestcexceptmaxb[1] >= datatobepacked[index].length) { + int newsize = 2 * (datapointers[index] + bestbbestcexceptmaxb[1]); + newsize = (newsize + 31) / 32 * 32;// make sure it is a + // multiple of + // 32 + datatobepacked[index] = Arrays.copyOf( + datatobepacked[index], newsize); + } + final int maxval = 1 << bestbbestcexceptmaxb[0]; + for (int k = 0; k < BlockSize; ++k) { + if (in[k + tmpinpos] >= maxval) { + // we have an exception + bytecontainer.put((byte) k); + datatobepacked[index][datapointers[index]++] = in[k + + tmpinpos] >>> tmpbestb; + } + } + } + for (int k = 0; k < 128; k += 32) { + BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, tmpbestb); + tmpoutpos += tmpbestb; + } + } + inpos.set(tmpinpos); + out[headerpos] = tmpoutpos - headerpos; + while ((bytecontainer.position() & 3) != 0) + bytecontainer.put((byte) 0); + final int bytesize = bytecontainer.position(); + out[tmpoutpos++] = bytesize; + final int howmanyints = bytesize / 4; + bytecontainer.flip(); + bytecontainer.asIntBuffer().get(out, tmpoutpos, howmanyints); + tmpoutpos += howmanyints; + int bitmap = 0; + for (int k = 1; k <= 31; ++k) { + if (datapointers[k] != 0) + bitmap |= (1 << (k - 1)); + } + out[tmpoutpos++] = bitmap; + for (int k = 1; k <= 31; ++k) { + + if (datapointers[k] != 0) { + out[tmpoutpos++] = datapointers[k];// size + for (int j = 0; j < datapointers[k]; j += 32) { + BitPacking + .fastpack(datatobepacked[k], j, out, tmpoutpos, k); + tmpoutpos += k; + } + } + } + outpos.set(tmpoutpos); + } + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos, int num) { + int mynvalue = num / BlockSize * BlockSize; + int finalout = outpos.get() + mynvalue; + while (outpos.get() != finalout) { + int thissize = finalout > PageSize + outpos.get() ? PageSize + : (finalout - outpos.get()); + decodePage(in, inpos, out, outpos, thissize); + } + } + + private void decodePage(int[] in, IntWrapper inpos, int[] out, + IntWrapper outpos, int thissize) { + final int initpos = inpos.get(); + final int wheremeta = in[inpos.get()]; + inpos.increment(); + int inexcept = initpos + wheremeta; + final int bytesize = in[inexcept++]; + bytecontainer.clear(); + bytecontainer.asIntBuffer().put(in, inexcept, bytesize / 4); + inexcept += bytesize / 4; + + final int bitmap = in[inexcept++]; + for (int k = 1; k <= 31; ++k) { + if ((bitmap & (1 << (k - 1))) != 0) { + int size = in[inexcept++]; + if (datatobepacked[k].length < size) + datatobepacked[k] = new int[(size + 31) / 32 * 32]; + for (int j = 0; j < size; j += 32) { + BitPacking + .fastunpack(in, inexcept, datatobepacked[k], j, k); + inexcept += k; + } + } + } + int[] datapointers = new int[32]; + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); + + for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { + final byte b = bytecontainer.get(); + final byte cexcept = bytecontainer.get(); + for (int k = 0; k < 128; k += 32) { + BitPacking.fastunpack(in, tmpinpos, out, tmpoutpos + k, b); + tmpinpos += b; + } + if (cexcept > 0) { + final byte maxbits = bytecontainer.get(); + final int index = maxbits - b; + for (int k = 0; k < cexcept; ++k) { + final byte pos = bytecontainer.get(); + final int exceptvalue = datatobepacked[index][datapointers[index]++]; + out[pos + tmpoutpos] |= exceptvalue << b; + } + + } + } + outpos.set(tmpoutpos); + inpos.set(inexcept); + } + + @Override + public String toString() { + return this.getClass().getName(); + } +} diff --git a/src/main/java/me/lemire/integercompression/skippable/SkippableIntegerCODEC.java b/src/main/java/me/lemire/integercompression/skippable/SkippableIntegerCODEC.java new file mode 100644 index 0000000..6040e95 --- /dev/null +++ b/src/main/java/me/lemire/integercompression/skippable/SkippableIntegerCODEC.java @@ -0,0 +1,69 @@ +/** + * This is code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + +package me.lemire.integercompression.skippable; + +import me.lemire.integercompression.*; + +/** + * Interface describing a standard CODEC to compress integers. This is a + * variation on the IntegerCODEC interface meant to be used for random access. + * + * The main difference is that we must specify the number of integers we wish to + * decode. This information should be stored elsewhere. + * + * This interface was designed by the Terrier team for their search engine. + * + * @author Daniel Lemire + * + */ +public interface SkippableIntegerCODEC { + /** + * Compress data from an array to another array. + * + * Both inpos and outpos are modified to represent how much data was read + * and written to if 12 ints (inlength = 12) are compressed to 3 ints, then + * inpos will be incremented by 12 while outpos will be incremented by 3 we + * use IntWrapper to pass the values by reference. + * + * @param in + * input array + * @param inpos + * location in the input array + * @param inlength + * how many integers to compress + * @param out + * output array + * @param outpos + * where to write in the output array + */ + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos); + + /** + * Uncompress data from an array to another array. + * + * Both inpos and outpos parameters are modified to indicate new positions + * after read/write. + * + * @param in + * array containing data in compressed form + * @param inpos + * where to start reading in the array + * @param inlength + * length of the compressed data (ignored by some schemes) + * @param out + * array where to write the compressed output + * @param outpos + * where to write the compressed output in out + * @param num + * number of integers we want to decode + */ + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos, int num); + +} diff --git a/src/main/java/me/lemire/integercompression/skippable/SkippableNewPFD.java b/src/main/java/me/lemire/integercompression/skippable/SkippableNewPFD.java new file mode 100644 index 0000000..33a733f --- /dev/null +++ b/src/main/java/me/lemire/integercompression/skippable/SkippableNewPFD.java @@ -0,0 +1,178 @@ +/** + * This is code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + +package me.lemire.integercompression.skippable; + +import me.lemire.integercompression.*; + +/** + * NewPFD/NewPFOR: fast patching scheme by Yan et al. + *

+ * Follows: + *

+ *

+ * H. Yan, S. Ding, T. Suel, Inverted index compression and query processing + * with optimized document ordering, in: WWW 09, 2009, pp. 401-410. + *

+ * using Simple16 as the secondary coder. + * + * It encodes integers in blocks of 128 integers. For arrays containing an + * arbitrary number of integers, you should use it in conjunction with another + * CODEC: + * + *
+ * IntegerCODEC ic = 
+ *  new Composition(new NewPDF(), new VariableByte()).
+ * 
+ * + * Note that this does not use differential coding: if you are working on sorted + * lists, you must compute the deltas separately. (Yes, this is true even though + * the "D" at the end of the name probably stands for delta.) + * + * For multi-threaded applications, each thread should use its own NewPFD + * object. + * + * @author Daniel Lemire + */ +public final class SkippableNewPFD implements SkippableIntegerCODEC { + final int PageSize; + final static int BlockSize = 128; + + int[] exceptbuffer = new int[2 * BlockSize]; + + /** + * Constructor for the NewPFD CODEC. + */ + public SkippableNewPFD() { + PageSize = 65536; + } + + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + inlength = inlength / BlockSize * BlockSize; + + final int finalinpos = inpos.get() + inlength; + while (inpos.get() != finalinpos) { + int thissize = finalinpos > PageSize + inpos.get() ? PageSize + : (finalinpos - inpos.get()); + encodePage(in, inpos, thissize, out, outpos); + } + + } + + private static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 16, 20, 32 }; + private static final int[] invbits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16 }; + + private static void getBestBFromData(int[] in, int pos, IntWrapper bestb, + IntWrapper bestexcept) { + final int mb = Util.maxbits(in, pos, BlockSize); + int mini = 0; + if (mini + 28 < bits[invbits[mb]]) + mini = bits[invbits[mb]] - 28; // 28 is the max for exceptions + int besti = bits.length - 1; + int exceptcounter = 0; + for (int i = mini; i < bits.length - 1; ++i) { + int tmpcounter = 0; + final int maxv = 1 << bits[i]; + for (int k = pos; k < BlockSize + pos; ++k) + if (in[k] >= maxv) + ++tmpcounter; + if (tmpcounter * 10 <= BlockSize) { + besti = i; + exceptcounter = tmpcounter; + break; + } + } + bestb.set(besti); + bestexcept.set(exceptcounter); + } + + private void encodePage(int[] in, IntWrapper inpos, int thissize, + int[] out, IntWrapper outpos) { + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); + IntWrapper bestb = new IntWrapper(); + IntWrapper bestexcept = new IntWrapper(); + for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { + getBestBFromData(in, tmpinpos, bestb, bestexcept); + int tmpbestb = bestb.get(); + int nbrexcept = bestexcept.get(); + int exceptsize = 0; + int remember = tmpoutpos; + tmpoutpos++; + if (nbrexcept > 0) { + final int maxv = 1 << bits[tmpbestb]; + for (int i = 0, c = 0; i < BlockSize; ++i) { + if (in[tmpinpos + i] >= maxv) { + exceptbuffer[c + nbrexcept] = i; + exceptbuffer[c] = in[tmpinpos + i] >>> bits[tmpbestb]; + ++c; + } + } + exceptsize = S16.compress(exceptbuffer, 0, 2 * nbrexcept, out, + tmpoutpos); + tmpoutpos += exceptsize; + } + out[remember] = tmpbestb | (nbrexcept << 8) | (exceptsize << 16); + for (int k = 0; k < BlockSize; k += 32) { + BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, + bits[tmpbestb]); + tmpoutpos += bits[tmpbestb]; + } + } + inpos.set(tmpinpos); + outpos.set(tmpoutpos); + } + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos, int num) { + int mynvalue = num / BlockSize * BlockSize; + int finalout = outpos.get() + mynvalue; + while (outpos.get() != finalout) { + int thissize = finalout > PageSize + outpos.get() ? PageSize + : (finalout - outpos.get()); + decodePage(in, inpos, out, outpos, thissize); + } + } + + private void decodePage(int[] in, IntWrapper inpos, int[] out, + IntWrapper outpos, int thissize) { + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); + + for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { + final int b = in[tmpinpos] & 0xFF; + final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; + final int exceptsize = (in[tmpinpos] >>> 16); + ++tmpinpos; + S16.uncompress(in, tmpinpos, exceptsize, exceptbuffer, 0, + 2 * cexcept); + tmpinpos += exceptsize; + for (int k = 0; k < BlockSize; k += 32) { + BitPacking + .fastunpack(in, tmpinpos, out, tmpoutpos + k, bits[b]); + tmpinpos += bits[b]; + } + for (int k = 0; k < cexcept; ++k) { + out[tmpoutpos + exceptbuffer[k + cexcept]] |= (exceptbuffer[k] << bits[b]); + } + } + outpos.set(tmpoutpos); + inpos.set(tmpinpos); + } + + @Override + public String toString() { + return this.getClass().getName(); + } + +} diff --git a/src/main/java/me/lemire/integercompression/skippable/SkippableOptPFD.java b/src/main/java/me/lemire/integercompression/skippable/SkippableOptPFD.java new file mode 100644 index 0000000..d851c82 --- /dev/null +++ b/src/main/java/me/lemire/integercompression/skippable/SkippableOptPFD.java @@ -0,0 +1,198 @@ +/** + * This is code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ +package me.lemire.integercompression.skippable; + +import me.lemire.integercompression.*; + +/** + * OptPFD: fast patching scheme by Yan et al. + *

+ * Follows: + *

+ *

+ * H. Yan, S. Ding, T. Suel, Inverted index compression and query processing + * with optimized document ordering, in: WWW 09, 2009, pp. 401-410. + *

+ * using Simple16 as the secondary coder. + * + * It encodes integers in blocks of 128 integers. For arrays containing an + * arbitrary number of integers, you should use it in conjunction with another + * CODEC: + * + *
+ * IntegerCODEC ic = new Composition(new OptPFD(), new VariableByte()).
+ * 
+ * + * Note that this does not use differential coding: if you are working on sorted + * lists, you must compute the deltas separately. (Yes, this is true even though + * the "D" at the end of the name probably stands for delta.) + * + * For multi-threaded applications, each thread should use its own OptPFD + * object. + * + * @author Daniel Lemire + */ +public final class SkippableOptPFD implements SkippableIntegerCODEC { + final int PageSize; + final static int BlockSize = 128; + + int[] exceptbuffer = new int[2 * BlockSize]; + int[] sillybuffer = new int[2 * BlockSize]; + + /** + * + */ + public SkippableOptPFD() { + PageSize = 65536; + } + + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + // Util.assertTrue(inpos.get()+inlength <= in.length); + inlength = inlength / BlockSize * BlockSize; + + final int finalinpos = inpos.get() + inlength; + // out[outpos.get()] = inlength; + // outpos.increment(); + while (inpos.get() != finalinpos) { + int thissize = finalinpos > PageSize + inpos.get() ? PageSize + : (finalinpos - inpos.get()); + encodePage(in, inpos, thissize, out, outpos); + } + + } + + private static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 16, 20, 32 }; + private static final int[] invbits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16 }; + + void getBestBFromData(int[] in, int pos, IntWrapper bestb, + IntWrapper bestexcept) { + final int mb = Util.maxbits(in, pos, BlockSize); + int mini = 0; + if (mini + 28 < bits[invbits[mb]]) + mini = bits[invbits[mb]] - 28; // 28 is the max for exceptions + int besti = bits.length - 1; + int bestcost = bits[besti] * 4; + int exceptcounter = 0; + for (int i = mini; i < bits.length - 1; ++i) { + int tmpcounter = 0; + final int maxv = 1 << bits[i]; + for (int k = pos; k < BlockSize + pos; ++k) + if (in[k] >= maxv) { + ++tmpcounter; + } + if (tmpcounter == BlockSize) + continue; // no need + for (int k = pos, c = 0; k < pos + BlockSize; ++k) + if (in[k] >= maxv) { + exceptbuffer[tmpcounter + c] = k - pos; + exceptbuffer[c] = in[k] >>> bits[i]; + ++c; + } + + final int thiscost = bits[i] * 4 + + S16.estimatecompress(exceptbuffer, 0, 2 * tmpcounter); + if (thiscost <= bestcost) { + bestcost = thiscost; + besti = i; + exceptcounter = tmpcounter; + } + } + + bestb.set(besti); + bestexcept.set(exceptcounter); + } + + private void encodePage(int[] in, IntWrapper inpos, int thissize, + int[] out, IntWrapper outpos) { + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); + IntWrapper bestb = new IntWrapper(); + IntWrapper bestexcept = new IntWrapper(); + for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { + getBestBFromData(in, tmpinpos, bestb, bestexcept); + int tmpbestb = bestb.get(); + int nbrexcept = bestexcept.get(); + int exceptsize = 0; + int remember = tmpoutpos; + tmpoutpos++; + if (nbrexcept > 0) { + final int maxv = 1 << bits[tmpbestb]; + int c = 0; + for (int i = 0; i < BlockSize; ++i) { + if (in[tmpinpos + i] >= maxv) { + exceptbuffer[c + nbrexcept] = i; + exceptbuffer[c] = in[tmpinpos + i] >>> bits[tmpbestb]; + ++c; + } + } + exceptsize = S16.compress(exceptbuffer, 0, 2 * nbrexcept, out, + tmpoutpos); + tmpoutpos += exceptsize; + } + out[remember] = tmpbestb | (nbrexcept << 8) | (exceptsize << 16); + for (int k = 0; k < BlockSize; k += 32) { + BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, + bits[tmpbestb]); + tmpoutpos += bits[tmpbestb]; + } + } + inpos.set(tmpinpos); + outpos.set(tmpoutpos); + } + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos, int num) { + // Util.assertTrue(inpos.get()+inlength <= in.length); + int mynvalue = num / BlockSize * BlockSize; + // int mynvalue = in[inpos.get()]; + // inpos.increment(); + int finalout = outpos.get() + mynvalue; + while (outpos.get() != finalout) { + int thissize = finalout > PageSize + outpos.get() ? PageSize + : (finalout - outpos.get()); + decodePage(in, inpos, out, outpos, thissize); + } + } + + private void decodePage(int[] in, IntWrapper inpos, int[] out, + IntWrapper outpos, int thissize) { + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); + + for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { + final int b = in[tmpinpos] & 0xFF; + final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; + final int exceptsize = (in[tmpinpos] >>> 16); + ++tmpinpos; + S16.uncompress(in, tmpinpos, exceptsize, exceptbuffer, 0, + 2 * cexcept); + tmpinpos += exceptsize; + for (int k = 0; k < BlockSize; k += 32) { + BitPacking + .fastunpack(in, tmpinpos, out, tmpoutpos + k, bits[b]); + tmpinpos += bits[b]; + } + for (int k = 0; k < cexcept; ++k) { + out[tmpoutpos + exceptbuffer[k + cexcept]] |= (exceptbuffer[k] << bits[b]); + } + } + outpos.set(tmpoutpos); + inpos.set(tmpinpos); + } + + @Override + public String toString() { + return this.getClass().getName(); + } + +} diff --git a/src/main/java/me/lemire/integercompression/skippable/SkippableSimple16.java b/src/main/java/me/lemire/integercompression/skippable/SkippableSimple16.java new file mode 100644 index 0000000..f8adbc0 --- /dev/null +++ b/src/main/java/me/lemire/integercompression/skippable/SkippableSimple16.java @@ -0,0 +1,207 @@ +package me.lemire.integercompression.skippable; + +import me.lemire.integercompression.*; + +/** + * This is an implementation of the popular Simple9 scheme. It is limited to + * 28-bit integers (between 0 and 2^28-1). + * + * Note that this does not use differential coding: if you are working on sorted + * lists, you must compute the deltas separately. + * + * @author Daniel Lemire + * + */ +public final class SkippableSimple16 implements SkippableIntegerCODEC { + + public void compress(int[] in, IntWrapper inpos, int inlength, int out[], + IntWrapper outpos) { + int i_inpos = inpos.get(); + int i_outpos = outpos.get(); + final int finalin = i_inpos + inlength; + while (i_inpos < finalin) { + int inoffset = compressblock(out, i_outpos++, in, i_inpos, inlength); + if (inoffset == -1) + throw new RuntimeException("Too big a number"); + i_inpos += inoffset; + inlength -= inoffset; + } + inpos.set(i_inpos); + outpos.set(i_outpos); + } + + protected static int estimatecompress(int[] in, int currentPos, int inlength) { + final int finalin = currentPos + inlength; + int counter = 0; + while (currentPos < finalin) { + int inoffset = fakecompressblock(in, currentPos, inlength); + if (inoffset == -1) + throw new RuntimeException("Too big a number"); + currentPos += inoffset; + inlength -= inoffset; + ++counter; + } + return counter; + } + + /** + * Compress an integer array using Simple16 + * + * @param out + * the compressed output + * @param outOffset + * the offset of the output in the number of integers + * @param in + * the integer input array + * @param inOffset + * the offset of the input in the number of integers + * @param n + * the number of elements to be compressed + * @return the number of compressed integers + */ + public static final int compressblock(int[] out, int outOffset, int[] in, + int inOffset, int n) { + int numIdx, j, num, bits; + for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { + out[outOffset] = numIdx << S16_BITSSIZE; + num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; + + for (j = 0, bits = 0; (j < num) + && (in[inOffset + j] < SHIFTED_S16_BITS[numIdx][j]);) { + out[outOffset] |= (in[inOffset + j] << bits); + bits += S16_BITS[numIdx][j]; + j++; + } + + if (j == num) { + return num; + } + } + + return -1; + } + + protected static final int fakecompressblock(int[] in, int inOffset, int n) { + int numIdx, j, num; + for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { + num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; + + for (j = 0; (j < num) + && (in[inOffset + j] < SHIFTED_S16_BITS[numIdx][j]);) { + j++; + } + + if (j == num) { + return num; + } + } + + return -1; + } + + /** + * Decompress an integer array using Simple16 + * + * @param out + * the decompressed output + * @param outOffset + * the offset of the output in the number of integers + * @param in + * the compressed input array + * @param inOffset + * the offset of the input in the number of integers + * @param n + * the number of elements to be compressed + * @return the number of processed integers + */ + public static final int decompressblock(int[] out, int outOffset, int[] in, + int inOffset, int n) { + int numIdx, j = 0, bits = 0; + numIdx = in[inOffset] >>> S16_BITSSIZE; + int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; + for (j = 0, bits = 0; j < num; j++) { + out[outOffset + j] = (in[inOffset] >>> bits) + & (0xffffffff >>> (32 - S16_BITS[numIdx][j])); + bits += S16_BITS[numIdx][j]; + } + return num; + } + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos, int num) { + int i_inpos = inpos.get(); + int i_outpos = outpos.get(); + final int finalpos = i_inpos + inlength; + while (i_inpos < finalpos) { + final int howmany = decompressblock(out, i_outpos, in, i_inpos, num); + num -= howmany; + i_outpos += howmany; + i_inpos++; + } + inpos.set(i_inpos); + outpos.set(i_outpos); + } + + /** + * Uncompress data from an array to another array. + * + * Both inpos and outpos parameters are modified to indicate new positions + * after read/write. + * + * @param in + * array containing data in compressed form + * @param tmpinpos + * where to start reading in the array + * @param inlength + * length of the compressed data (ignored by some schemes) + * @param out + * array where to write the compressed output + * @param currentPos + * where to write the compressed output in out + * @param outlength + * number of integers we want to decode + */ + public static void uncompress(int[] in, int tmpinpos, int inlength, + int[] out, int currentPos, int outlength) { + final int finalpos = tmpinpos + inlength; + while (tmpinpos < finalpos) { + final int howmany = decompressblock(out, currentPos, in, tmpinpos, + outlength); + outlength -= howmany; + currentPos += howmany; + tmpinpos += 1; + } + + } + + private static int[][] shiftme(int[][] x) { + int[][] answer = new int[x.length][]; + for (int k = 0; k < x.length; ++k) { + answer[k] = new int[x[k].length]; + for (int z = 0; z < answer[k].length; ++z) + answer[k][z] = 1 << x[k][z]; + } + return answer; + } + + private static final int S16_NUMSIZE = 16; + private static final int S16_BITSSIZE = 28; + // the possible number of bits used to represent one integer + private static final int[] S16_NUM = { 28, 21, 21, 21, 14, 9, 8, 7, 6, 6, + 5, 5, 4, 3, 2, 1 }; + // the corresponding number of elements for each value of the number of bits + private static final int[][] S16_BITS = { + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1 }, + { 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2 }, + { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, + { 4, 3, 3, 3, 3, 3, 3, 3, 3 }, { 3, 4, 4, 4, 4, 3, 3, 3 }, + { 4, 4, 4, 4, 4, 4, 4 }, { 5, 5, 5, 5, 4, 4 }, + { 4, 4, 5, 5, 5, 5 }, { 6, 6, 6, 5, 5 }, { 5, 5, 6, 6, 6 }, + { 7, 7, 7, 7 }, { 10, 9, 9, }, { 14, 14 }, { 28 } }; + private static final int[][] SHIFTED_S16_BITS = shiftme(S16_BITS); + +} diff --git a/src/main/java/me/lemire/integercompression/skippable/SkippableSimple9.java b/src/main/java/me/lemire/integercompression/skippable/SkippableSimple9.java new file mode 100644 index 0000000..bca2b55 --- /dev/null +++ b/src/main/java/me/lemire/integercompression/skippable/SkippableSimple9.java @@ -0,0 +1,291 @@ +/** + * This is code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + +package me.lemire.integercompression.skippable; + +import me.lemire.integercompression.IntWrapper; + +/** + * This is an implementation of the popular Simple9 scheme. It is limited to + * 28-bit integers (between 0 and 2^28-1). + * + * Note that this does not use differential coding: if you are working on sorted + * lists, you must compute the deltas separately. + * + * @author Daniel Lemire + * + */ +public final class SkippableSimple9 implements SkippableIntegerCODEC { + + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int out[], + IntWrapper outpos) { + int tmpoutpos = outpos.get(); + int currentPos = inpos.get(); + final int finalin = currentPos + inlength; + outer: while (currentPos < finalin - 28) { + mainloop: for (int selector = 0; selector < 8; selector++) { + + int res = 0; + int compressedNum = codeNum[selector]; + int b = bitLength[selector]; + int max = 1 << b; + int i = 0; + for (; i < compressedNum; i++) { + if (max <= in[currentPos + i]) + continue mainloop; + res = (res << b) + in[currentPos + i]; + } + res |= selector << 28; + out[tmpoutpos++] = res; + currentPos += compressedNum; + continue outer; + } + final int selector = 8; + if (in[currentPos] >= 1 << bitLength[selector]) + throw new RuntimeException("Too big a number"); + out[tmpoutpos++] = in[currentPos++] | (selector << 28); + } + outer: while (currentPos < finalin) { + mainloop: for (int selector = 0; selector < 8; selector++) { + int res = 0; + int compressedNum = codeNum[selector]; + if (finalin <= currentPos + compressedNum - 1) + compressedNum = finalin - currentPos; + int b = bitLength[selector]; + int max = 1 << b; + int i = 0; + for (; i < compressedNum; i++) { + if (max <= in[currentPos + i]) + continue mainloop; + res = (res << b) + in[currentPos + i]; + } + + if (compressedNum != codeNum[selector]) + res <<= (codeNum[selector] - compressedNum) * b; + res |= selector << 28; + out[tmpoutpos++] = res; + currentPos += compressedNum; + continue outer; + } + final int selector = 8; + // Util.assertTrue(codeNum[selector] == 1); + if (in[currentPos] >= 1 << bitLength[selector]) + throw new RuntimeException("Too big a number"); + out[tmpoutpos++] = in[currentPos++] | (selector << 28); + } + // Util.assertTrue(currentPos == finalin); + inpos.set(currentPos); + outpos.set(tmpoutpos); + } + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos, int num) { + int currentPos = outpos.get(); + int tmpinpos = inpos.get(); + final int finalout = currentPos + num; + while (currentPos < finalout - 28) { + int val = in[tmpinpos++]; + int header = val >>> 28; + switch (header) { + case 0: { // number : 28, bitwidth : 1 + out[currentPos++] = (val << 4) >>> 31; + out[currentPos++] = (val << 5) >>> 31; + out[currentPos++] = (val << 6) >>> 31; + out[currentPos++] = (val << 7) >>> 31; + out[currentPos++] = (val << 8) >>> 31; + out[currentPos++] = (val << 9) >>> 31; + out[currentPos++] = (val << 10) >>> 31; + out[currentPos++] = (val << 11) >>> 31; + out[currentPos++] = (val << 12) >>> 31; + out[currentPos++] = (val << 13) >>> 31; // 10 + out[currentPos++] = (val << 14) >>> 31; + out[currentPos++] = (val << 15) >>> 31; + out[currentPos++] = (val << 16) >>> 31; + out[currentPos++] = (val << 17) >>> 31; + out[currentPos++] = (val << 18) >>> 31; + out[currentPos++] = (val << 19) >>> 31; + out[currentPos++] = (val << 20) >>> 31; + out[currentPos++] = (val << 21) >>> 31; + out[currentPos++] = (val << 22) >>> 31; + out[currentPos++] = (val << 23) >>> 31; // 20 + out[currentPos++] = (val << 24) >>> 31; + out[currentPos++] = (val << 25) >>> 31; + out[currentPos++] = (val << 26) >>> 31; + out[currentPos++] = (val << 27) >>> 31; + out[currentPos++] = (val << 28) >>> 31; + out[currentPos++] = (val << 29) >>> 31; + out[currentPos++] = (val << 30) >>> 31; + out[currentPos++] = (val << 31) >>> 31; + break; + } + case 1: { // number : 14, bitwidth : 2 + out[currentPos++] = (val << 4) >>> 30; + out[currentPos++] = (val << 6) >>> 30; + out[currentPos++] = (val << 8) >>> 30; + out[currentPos++] = (val << 10) >>> 30; + out[currentPos++] = (val << 12) >>> 30; + out[currentPos++] = (val << 14) >>> 30; + out[currentPos++] = (val << 16) >>> 30; + out[currentPos++] = (val << 18) >>> 30; + out[currentPos++] = (val << 20) >>> 30; + out[currentPos++] = (val << 22) >>> 30; // 10 + out[currentPos++] = (val << 24) >>> 30; + out[currentPos++] = (val << 26) >>> 30; + out[currentPos++] = (val << 28) >>> 30; + out[currentPos++] = (val << 30) >>> 30; + break; + } + case 2: { // number : 9, bitwidth : 3 + out[currentPos++] = (val << 5) >>> 29; + out[currentPos++] = (val << 8) >>> 29; + out[currentPos++] = (val << 11) >>> 29; + out[currentPos++] = (val << 14) >>> 29; + out[currentPos++] = (val << 17) >>> 29; + out[currentPos++] = (val << 20) >>> 29; + out[currentPos++] = (val << 23) >>> 29; + out[currentPos++] = (val << 26) >>> 29; + out[currentPos++] = (val << 29) >>> 29; + break; + } + case 3: { // number : 7, bitwidth : 4 + out[currentPos++] = (val << 4) >>> 28; + out[currentPos++] = (val << 8) >>> 28; + out[currentPos++] = (val << 12) >>> 28; + out[currentPos++] = (val << 16) >>> 28; + out[currentPos++] = (val << 20) >>> 28; + out[currentPos++] = (val << 24) >>> 28; + out[currentPos++] = (val << 28) >>> 28; + break; + } + case 4: { // number : 5, bitwidth : 5 + out[currentPos++] = (val << 7) >>> 27; + out[currentPos++] = (val << 12) >>> 27; + out[currentPos++] = (val << 17) >>> 27; + out[currentPos++] = (val << 22) >>> 27; + out[currentPos++] = (val << 27) >>> 27; + break; + } + case 5: { // number : 4, bitwidth : 7 + out[currentPos++] = (val << 4) >>> 25; + out[currentPos++] = (val << 11) >>> 25; + out[currentPos++] = (val << 18) >>> 25; + out[currentPos++] = (val << 25) >>> 25; + break; + } + case 6: { // number : 3, bitwidth : 9 + out[currentPos++] = (val << 5) >>> 23; + out[currentPos++] = (val << 14) >>> 23; + out[currentPos++] = (val << 23) >>> 23; + break; + } + case 7: { // number : 2, bitwidth : 14 + out[currentPos++] = (val << 4) >>> 18; + out[currentPos++] = (val << 18) >>> 18; + break; + } + case 8: { // number : 1, bitwidth : 28 + out[currentPos++] = (val << 4) >>> 4; + break; + } + default: { + throw new RuntimeException("shouldn't happen"); + } + } + } + while (currentPos < finalout) { + int val = in[tmpinpos++]; + int header = val >>> 28; + switch (header) { + case 0: { // number : 28, bitwidth : 1 + final int howmany = finalout - currentPos; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (k + 4)) >>> 31; + } + break; + } + case 1: { // number : 14, bitwidth : 2 + final int howmany = finalout - currentPos < 14 ? finalout + - currentPos : 14; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (2 * k + 4)) >>> 30; + } + break; + } + case 2: { // number : 9, bitwidth : 3 + final int howmany = finalout - currentPos < 9 ? finalout + - currentPos : 9; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (3 * k + 5)) >>> 29; + } + break; + } + case 3: { // number : 7, bitwidth : 4 + final int howmany = finalout - currentPos < 7 ? finalout + - currentPos : 7; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (4 * k + 4)) >>> 28; + } + break; + } + case 4: { // number : 5, bitwidth : 5 + final int howmany = finalout - currentPos < 5 ? finalout + - currentPos : 5; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (5 * k + 7)) >>> 27; + } + break; + } + case 5: { // number : 4, bitwidth : 7 + final int howmany = finalout - currentPos < 4 ? finalout + - currentPos : 4; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (7 * k + 4)) >>> 25; + } + break; + } + case 6: { // number : 3, bitwidth : 9 + final int howmany = finalout - currentPos < 3 ? finalout + - currentPos : 3; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (9 * k + 5)) >>> 23; + } + break; + } + case 7: { // number : 2, bitwidth : 14 + final int howmany = finalout - currentPos < 2 ? finalout + - currentPos : 2; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (14 * k + 4)) >>> 18; + } + break; + } + case 8: { // number : 1, bitwidth : 28 + out[currentPos++] = (val << 4) >>> 4; + break; + } + default: { + throw new RuntimeException("shouldn't happen"); + } + } + } + outpos.set(currentPos); + inpos.set(tmpinpos); + + } + + private final static int bitLength[] = { 1, 2, 3, 4, 5, 7, 9, 14, 28 }; + + private final static int codeNum[] = { 28, 14, 9, 7, 5, 4, 3, 2, 1 }; + + @Override + public String toString() { + return this.getClass().getName(); + } + +} From 6af200a5d89b7b65ccef3a06788b6ef11493143b Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 10 Sep 2014 19:40:59 -0400 Subject: [PATCH 179/412] Now with failing unit tests --- .../lemire/integercompression/JustCopy.java | 13 ++- .../integercompression/VariableByte.java | 32 +++++- .../skippable/SkippableBinaryPacking.java | 91 +++++++++++++++++ .../skippable/SkippableIntegerCODEC.java | 2 +- .../integercompression/ByteBasicTest.java | 86 ++++++++++++++++ .../SkippableBasicTest.java | 99 +++++++++++++++++++ .../lemire/integercompression/TestUtils.java | 18 ++++ 7 files changed, 338 insertions(+), 3 deletions(-) create mode 100644 src/main/java/me/lemire/integercompression/skippable/SkippableBinaryPacking.java create mode 100644 src/test/java/me/lemire/integercompression/ByteBasicTest.java create mode 100644 src/test/java/me/lemire/integercompression/SkippableBasicTest.java diff --git a/src/main/java/me/lemire/integercompression/JustCopy.java b/src/main/java/me/lemire/integercompression/JustCopy.java index a385bde..9a535d4 100644 --- a/src/main/java/me/lemire/integercompression/JustCopy.java +++ b/src/main/java/me/lemire/integercompression/JustCopy.java @@ -7,11 +7,13 @@ package me.lemire.integercompression; +import me.lemire.integercompression.skippable.SkippableIntegerCODEC; + /** * @author Daniel Lemire * */ -public final class JustCopy implements IntegerCODEC { +public final class JustCopy implements IntegerCODEC, SkippableIntegerCODEC { @Override public void compress(int[] in, IntWrapper inpos, int inlength, @@ -34,4 +36,13 @@ public String toString() { return this.getClass().getSimpleName(); } + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos, int num) { + System.arraycopy(in, inpos.get(), out, outpos.get(), num); + inpos.add(num); + outpos.add(num); + + } + } diff --git a/src/main/java/me/lemire/integercompression/VariableByte.java b/src/main/java/me/lemire/integercompression/VariableByte.java index e33fc1f..e95ee0f 100644 --- a/src/main/java/me/lemire/integercompression/VariableByte.java +++ b/src/main/java/me/lemire/integercompression/VariableByte.java @@ -10,6 +10,8 @@ import java.nio.ByteOrder; import java.nio.IntBuffer; +import me.lemire.integercompression.skippable.SkippableIntegerCODEC; + /** * Implementation of variable-byte. For best performance, use it using the * ByteIntegerCODEC interface. @@ -19,7 +21,7 @@ * * @author Daniel Lemire */ -public class VariableByte implements IntegerCODEC, ByteIntegerCODEC { +public class VariableByte implements IntegerCODEC, ByteIntegerCODEC, SkippableIntegerCODEC { private static byte extract7bits(int i, long val) { return (byte) ((val >> (7 * i)) & ((1 << 7) - 1)); @@ -173,4 +175,32 @@ public String toString() { return this.getClass().getSimpleName(); } + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos, int num) { + int s = 0; + int val = 0; + int p = inpos.get(); + int tmpoutpos = outpos.get(); + int finaloutpos = num + tmpoutpos; + for (int v = 0, shift = 0; tmpoutpos < finaloutpos;) { + val = in[p]; + int c = (byte) (val >>> s); + s += 8; + if (s == 32) { + s = 0; + p++; + } + v += ((c & 127) << shift); + if ((c & 128) == 128) { + out[tmpoutpos++] = v; + v = 0; + shift = 0; + } else + shift += 7; + } + outpos.set(tmpoutpos); + inpos.add(inlength); + } + } diff --git a/src/main/java/me/lemire/integercompression/skippable/SkippableBinaryPacking.java b/src/main/java/me/lemire/integercompression/skippable/SkippableBinaryPacking.java new file mode 100644 index 0000000..3d8ae13 --- /dev/null +++ b/src/main/java/me/lemire/integercompression/skippable/SkippableBinaryPacking.java @@ -0,0 +1,91 @@ +/** + * This is code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ +package me.lemire.integercompression.skippable; + +import me.lemire.integercompression.*; + + + +/** + * Scheme based on a commonly used idea: can be extremely fast. + * It encodes integers in blocks of 128 integers. For arrays containing + * an arbitrary number of integers, you should use it in conjunction + * with another CODEC: + * + *
IntegerCODEC ic = 
+ *  new Composition(new BinaryPacking(), new VariableByte()).
+ * + * Note that this does not use differential coding: if you are working on sorted + * lists, use IntegratedBinaryPacking instead. + * + *

+ * For details, please see + *

+ *

+ * Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second + * through vectorization Software: Practice & Experience + * http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract + * http://arxiv.org/abs/1209.2137 + *

+ *

+ * Daniel Lemire, Leonid Boytsov, Nathan Kurz, + * SIMD Compression and the Intersection of Sorted Integers + * http://arxiv.org/abs/1401.6399 + *

+ * + * @author Daniel Lemire + */ +public final class SkippableBinaryPacking implements SkippableIntegerCODEC { + + @Override +public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + inlength = inlength / 128 * 128; + int tmpoutpos = outpos.get(); + for (int s = inpos.get(); s < inpos.get() + inlength; s += 32 * 4) { + final int mbits1 = Util.maxbits(in, s, 32); + final int mbits2 = Util.maxbits(in, s + 32, 32); + final int mbits3 = Util.maxbits(in, s + 2 * 32, 32); + final int mbits4 = Util.maxbits(in, s + 3 * 32, 32); + out[tmpoutpos++] = (mbits1 << 24) | (mbits2 << 16) | (mbits3 << 8) + | (mbits4); + BitPacking.fastpackwithoutmask(in, s, out, tmpoutpos, mbits1); + tmpoutpos += mbits1; + BitPacking.fastpackwithoutmask(in, s + 32, out, tmpoutpos, mbits2); + tmpoutpos += mbits2; + BitPacking.fastpackwithoutmask(in, s + 2 * 32, out, tmpoutpos, mbits3); + tmpoutpos += mbits3; + BitPacking.fastpackwithoutmask(in, s + 3 * 32, out, tmpoutpos, mbits4); + tmpoutpos += mbits4; + } + inpos.add(inlength); + outpos.set(tmpoutpos); + } + + @Override +public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num) { + final int outlength = num / 128 * 128; + int tmpinpos = inpos.get(); + for (int s = outpos.get(); s < outpos.get() + outlength; s += 32 * 4) { + final int mbits1 = (in[tmpinpos] >>> 24); + final int mbits2 = (in[tmpinpos] >>> 16) & 0xFF; + final int mbits3 = (in[tmpinpos] >>> 8) & 0xFF; + final int mbits4 = (in[tmpinpos]) & 0xFF; + ++tmpinpos; + BitPacking.fastunpack(in, tmpinpos, out, s, mbits1); + tmpinpos += mbits1; + BitPacking.fastunpack(in, tmpinpos, out, s + 32, mbits2); + tmpinpos += mbits2; + BitPacking.fastunpack(in, tmpinpos, out, s + 2 * 32, mbits3); + tmpinpos += mbits3; + BitPacking.fastunpack(in, tmpinpos, out, s + 3 * 32, mbits4); + tmpinpos += mbits4; + } + outpos.add(outlength); + inpos.set(tmpinpos); + } + +} diff --git a/src/main/java/me/lemire/integercompression/skippable/SkippableIntegerCODEC.java b/src/main/java/me/lemire/integercompression/skippable/SkippableIntegerCODEC.java index 6040e95..f3d9900 100644 --- a/src/main/java/me/lemire/integercompression/skippable/SkippableIntegerCODEC.java +++ b/src/main/java/me/lemire/integercompression/skippable/SkippableIntegerCODEC.java @@ -61,7 +61,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, * @param outpos * where to write the compressed output in out * @param num - * number of integers we want to decode + * number of integers we want to decode, the actual number of integers decoded can be less */ public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num); diff --git a/src/test/java/me/lemire/integercompression/ByteBasicTest.java b/src/test/java/me/lemire/integercompression/ByteBasicTest.java new file mode 100644 index 0000000..314bdfc --- /dev/null +++ b/src/test/java/me/lemire/integercompression/ByteBasicTest.java @@ -0,0 +1,86 @@ +package me.lemire.integercompression; + +import java.util.Arrays; + +import me.lemire.integercompression.differential.IntegratedVariableByte; + +import org.junit.Test; + + +/** + * Just some basic sanity tests. + * + * @author Daniel Lemire + */ +@SuppressWarnings({ "static-method" }) +public class ByteBasicTest { + ByteIntegerCODEC[] codecs = { + new VariableByte(), + new IntegratedVariableByte(), + }; + + /** + * + */ + @Test + public void varyingLengthTest() { + int N = 4096; + int[] data = new int[N]; + for (int k = 0; k < N; ++k) + data[k] = k; + for (ByteIntegerCODEC c : codecs) { + for (int L = 1; L <= 128; L++) { + byte[] comp = TestUtils.compress(c, Arrays.copyOf(data, L)); + int[] answer = TestUtils.uncompress(c, comp, L); + for (int k = 0; k < L; ++k) + if (answer[k] != data[k]) + throw new RuntimeException("bug "+c.toString()+" "+k+" "+answer[k]+" "+data[k]); + } + for (int L = 128; L <= N; L *= 2) { + byte[] comp = TestUtils.compress(c, Arrays.copyOf(data, L)); + int[] answer = TestUtils.uncompress(c, comp, L); + for (int k = 0; k < L; ++k) + if (answer[k] != data[k]) + throw new RuntimeException("bug"); + } + + } + } + + /** + * + */ + @Test + public void varyingLengthTest2() { + int N = 128; + int[] data = new int[N]; + data[127] = -1; + for (ByteIntegerCODEC c : codecs) { + try { + // CODEC Simple9 is limited to "small" integers. + if (c.getClass().equals( + Class.forName("me.lemire.integercompression.Simple9"))) + continue; + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + for (int L = 1; L <= 128; L++) { + byte[] comp = TestUtils.compress(c, Arrays.copyOf(data, L)); + int[] answer = TestUtils.uncompress(c, comp, L); + for (int k = 0; k < L; ++k) + if (answer[k] != data[k]) + throw new RuntimeException("bug at k = "+k+" "+answer[k]+" "+data[k]); + } + for (int L = 128; L <= N; L *= 2) { + byte[] comp = TestUtils.compress(c, Arrays.copyOf(data, L)); + int[] answer = TestUtils.uncompress(c, comp, L); + for (int k = 0; k < L; ++k) + if (answer[k] != data[k]) + throw new RuntimeException("bug"); + } + + } + } + + +} diff --git a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java new file mode 100644 index 0000000..bcb7322 --- /dev/null +++ b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java @@ -0,0 +1,99 @@ +package me.lemire.integercompression; + +import java.util.Arrays; + +import me.lemire.integercompression.skippable.*; + +import org.junit.Test; + + +/** + * Just some basic sanity tests. + * + * @author Daniel Lemire + */ +@SuppressWarnings({ "static-method" }) +public class SkippableBasicTest { + SkippableIntegerCODEC[] codecs = { + new JustCopy(), + new VariableByte(), + new SkippableComposition(new SkippableBinaryPacking(), new VariableByte()), + // new SkippableComposition(new SkippableNewPFD(), new VariableByte()), + // new SkippableComposition(new SkippableOptPFD(), new VariableByte()), + // new SkippableComposition(new SkippableFastPFOR(), new VariableByte()), + new SkippableSimple9(), + new SkippableSimple16() }; + + /** + * + */ + @Test + public void varyingLengthTest() { + int N = 4096; + int[] data = new int[N]; + for (int k = 0; k < N; ++k) + data[k] = k; + for (SkippableIntegerCODEC c : codecs) { + for (int L = 1; L <= 128; L++) { + int[] comp = TestUtils.compress(c, Arrays.copyOf(data, L)); + int[] answer = TestUtils.uncompress(c, comp, L); + for (int k = 0; k < L; ++k) + if (answer[k] != data[k]) + throw new RuntimeException("bug "+c.toString()+" "+k+" "+answer[k]+" "+data[k]); + } + for (int L = 128; L <= N; L *= 2) { + int[] comp = TestUtils.compress(c, Arrays.copyOf(data, L)); + int[] answer = TestUtils.uncompress(c, comp, L); + for (int k = 0; k < L; ++k) + if (answer[k] != data[k]) + throw new RuntimeException("bug"); + } + + } + } + + /** + * + */ + @Test + public void varyingLengthTest2() { + int N = 128; + int[] data = new int[N]; + data[127] = -1; + for (SkippableIntegerCODEC c : codecs) { + try { + // CODEC Simple9 is limited to "small" integers. + if (c.getClass().equals( + Class.forName("me.lemire.integercompression.skippable.SkippableSimple9"))) + continue; + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + try { + // CODEC Simple16 is limited to "small" integers. + if (c.getClass().equals( + Class.forName("me.lemire.integercompression.skippable.SkippableSimple16"))) + continue; + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + for (int L = 1; L <= 128; L++) { + int[] comp = TestUtils.compress(c, Arrays.copyOf(data, L)); + int[] answer = TestUtils.uncompress(c, comp, L); + for (int k = 0; k < L; ++k) + if (answer[k] != data[k]) + throw new RuntimeException("bug at k = "+k+" "+answer[k]+" "+data[k]+" for "+c.toString()); + } + for (int L = 128; L <= N; L *= 2) { + int[] comp = TestUtils.compress(c, Arrays.copyOf(data, L)); + int[] answer = TestUtils.uncompress(c, comp, L); + for (int k = 0; k < L; ++k) + if (answer[k] != data[k]) + throw new RuntimeException("bug"); + } + + } + } + + +} diff --git a/src/test/java/me/lemire/integercompression/TestUtils.java b/src/test/java/me/lemire/integercompression/TestUtils.java index 9217097..ee296b8 100644 --- a/src/test/java/me/lemire/integercompression/TestUtils.java +++ b/src/test/java/me/lemire/integercompression/TestUtils.java @@ -2,6 +2,8 @@ import java.util.Arrays; +import me.lemire.integercompression.skippable.SkippableIntegerCODEC; + import org.junit.Test; import static org.junit.Assert.*; @@ -107,4 +109,20 @@ protected static int[] uncompress(ByteIntegerCODEC codec, byte[] data, int len) return Arrays.copyOf(outBuf, outPos.get()); } + protected static int[] compress(SkippableIntegerCODEC codec, int[] data) { + int[] outBuf = new int[data.length * 4]; + IntWrapper inPos = new IntWrapper(); + IntWrapper outPos = new IntWrapper(); + codec.compress(data, inPos, data.length, outBuf, outPos); + return Arrays.copyOf(outBuf, outPos.get()); + } + + protected static int[] uncompress(SkippableIntegerCODEC codec, int[] data, int len) { + int[] outBuf = new int[len + 1024]; + IntWrapper inPos = new IntWrapper(); + IntWrapper outPos = new IntWrapper(); + codec.uncompress(data, inPos, data.length, outBuf, outPos,len); + return Arrays.copyOf(outBuf, outPos.get()); + } + } From ad82035bad157633b0de4c88f81cb23c544f2a5f Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 10 Sep 2014 20:24:27 -0400 Subject: [PATCH 180/412] Now test are passing. --- .../java/me/lemire/integercompression/S9.java | 4 +- .../lemire/integercompression/Simple16.java | 179 +++++++++ .../skippable/Kamikaze.java | 2 + .../skippable/SkippableFastPFOR.java | 374 ++++++++++-------- .../skippable/SkippableNewPFD.java | 6 +- .../skippable/SkippableOptPFD.java | 8 +- .../skippable/SkippableSimple16.java | 6 +- .../lemire/integercompression/BasicTest.java | 10 + .../SkippableBasicTest.java | 6 +- .../lemire/integercompression/TestUtils.java | 1 + 10 files changed, 412 insertions(+), 184 deletions(-) create mode 100644 src/main/java/me/lemire/integercompression/Simple16.java diff --git a/src/main/java/me/lemire/integercompression/S9.java b/src/main/java/me/lemire/integercompression/S9.java index d5846c7..a14b1fb 100644 --- a/src/main/java/me/lemire/integercompression/S9.java +++ b/src/main/java/me/lemire/integercompression/S9.java @@ -8,7 +8,9 @@ /** * This is a version of Simple9 optimized for NewPFOR, OptPFOR - * + *

+ * Adapted by D. Lemire from the Apache Lucene project. + *

* @author Daniel Lemire */ public final class S9 { diff --git a/src/main/java/me/lemire/integercompression/Simple16.java b/src/main/java/me/lemire/integercompression/Simple16.java new file mode 100644 index 0000000..5b6098e --- /dev/null +++ b/src/main/java/me/lemire/integercompression/Simple16.java @@ -0,0 +1,179 @@ +package me.lemire.integercompression; + + + +/** + * This is an implementation of the popular Simple16 scheme. It is limited to + * 28-bit integers (between 0 and 2^28-1). + * + * Note that this does not use differential coding: if you are working on sorted + * lists, you must compute the deltas separately. + * + *

+ * Adapted by D. Lemire from the Apache Lucene project. + *

+ */ +public final class Simple16 implements IntegerCODEC { + + public void compress(int[] in, IntWrapper inpos, int inlength, int out[], + IntWrapper outpos) { + int i_inpos = inpos.get(); + int i_outpos = outpos.get(); + out[i_outpos++] = inlength; + final int finalin = i_inpos + inlength; + while (i_inpos < finalin) { + int inoffset = compressblock(out, i_outpos++, in, i_inpos, inlength); + if (inoffset == -1) + throw new RuntimeException("Too big a number"); + i_inpos += inoffset; + inlength -= inoffset; + } + inpos.set(i_inpos); + outpos.set(i_outpos); + } + + /** + * Compress an integer array using Simple16 + * + * @param out + * the compressed output + * @param outOffset + * the offset of the output in the number of integers + * @param in + * the integer input array + * @param inOffset + * the offset of the input in the number of integers + * @param n + * the number of elements to be compressed + * @return the number of compressed integers + */ + public static final int compressblock(int[] out, int outOffset, int[] in, + int inOffset, int n) { + int numIdx, j, num, bits; + for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { + out[outOffset] = numIdx << S16_BITSSIZE; + num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; + + for (j = 0, bits = 0; (j < num) + && (in[inOffset + j] < SHIFTED_S16_BITS[numIdx][j]);) { + out[outOffset] |= (in[inOffset + j] << bits); + bits += S16_BITS[numIdx][j]; + j++; + } + + if (j == num) { + return num; + } + } + + return -1; + } + + + /** + * Decompress an integer array using Simple16 + * + * @param out + * the decompressed output + * @param outOffset + * the offset of the output in the number of integers + * @param in + * the compressed input array + * @param inOffset + * the offset of the input in the number of integers + * @param n + * the number of elements to be compressed + * @return the number of processed integers + */ + public static final int decompressblock(int[] out, int outOffset, int[] in, + int inOffset, int n) { + int numIdx, j = 0, bits = 0; + numIdx = in[inOffset] >>> S16_BITSSIZE; + int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; + for (j = 0, bits = 0; j < num; j++) { + out[outOffset + j] = (in[inOffset] >>> bits) + & (0xffffffff >>> (32 - S16_BITS[numIdx][j])); + bits += S16_BITS[numIdx][j]; + } + return num; + } + + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + int i_inpos = inpos.get(); + int num = in[i_inpos++]; + int i_outpos = outpos.get(); + while (num > 0) { + final int howmany = decompressblock(out, i_outpos, in, i_inpos, num); + num -= howmany; + i_outpos += howmany; + i_inpos++; + } + inpos.set(i_inpos); + outpos.set(i_outpos); + } + + /** + * Uncompress data from an array to another array. + * + * Both inpos and outpos parameters are modified to indicate new positions + * after read/write. + * + * @param in + * array containing data in compressed form + * @param tmpinpos + * where to start reading in the array + * @param inlength + * length of the compressed data (ignored by some schemes) + * @param out + * array where to write the compressed output + * @param currentPos + * where to write the compressed output in out + * @param outlength + * number of integers we want to decode + */ + public static void uncompress(int[] in, int tmpinpos, int inlength, + int[] out, int currentPos, int outlength) { + final int finalpos = tmpinpos + inlength; + while (tmpinpos < finalpos) { + final int howmany = decompressblock(out, currentPos, in, tmpinpos, + outlength); + outlength -= howmany; + currentPos += howmany; + tmpinpos += 1; + } + + } + + private static int[][] shiftme(int[][] x) { + int[][] answer = new int[x.length][]; + for (int k = 0; k < x.length; ++k) { + answer[k] = new int[x[k].length]; + for (int z = 0; z < answer[k].length; ++z) + answer[k][z] = 1 << x[k][z]; + } + return answer; + } + + private static final int S16_NUMSIZE = 16; + private static final int S16_BITSSIZE = 28; + // the possible number of bits used to represent one integer + private static final int[] S16_NUM = { 28, 21, 21, 21, 14, 9, 8, 7, 6, 6, + 5, 5, 4, 3, 2, 1 }; + // the corresponding number of elements for each value of the number of bits + private static final int[][] S16_BITS = { + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1 }, + { 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2 }, + { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, + { 4, 3, 3, 3, 3, 3, 3, 3, 3 }, { 3, 4, 4, 4, 4, 3, 3, 3 }, + { 4, 4, 4, 4, 4, 4, 4 }, { 5, 5, 5, 5, 4, 4 }, + { 4, 4, 5, 5, 5, 5 }, { 6, 6, 6, 5, 5 }, { 5, 5, 6, 6, 6 }, + { 7, 7, 7, 7 }, { 10, 9, 9, }, { 14, 14 }, { 28 } }; + private static final int[][] SHIFTED_S16_BITS = shiftme(S16_BITS); + +} \ No newline at end of file diff --git a/src/main/java/me/lemire/integercompression/skippable/Kamikaze.java b/src/main/java/me/lemire/integercompression/skippable/Kamikaze.java index f5a344e..c1909f4 100644 --- a/src/main/java/me/lemire/integercompression/skippable/Kamikaze.java +++ b/src/main/java/me/lemire/integercompression/skippable/Kamikaze.java @@ -6,6 +6,8 @@ /** * IntegerCODEC wrapper for Kamikaze's PForDelta. * + * Note: this class is only included for speed benchmarks. + * It is not recommended. Use at your own risks. * * @author Matteo Catena * diff --git a/src/main/java/me/lemire/integercompression/skippable/SkippableFastPFOR.java b/src/main/java/me/lemire/integercompression/skippable/SkippableFastPFOR.java index 34fe3ef..94d0af8 100644 --- a/src/main/java/me/lemire/integercompression/skippable/SkippableFastPFOR.java +++ b/src/main/java/me/lemire/integercompression/skippable/SkippableFastPFOR.java @@ -8,6 +8,7 @@ import java.nio.ByteBuffer; import java.util.Arrays; + import me.lemire.integercompression.*; /** @@ -43,220 +44,255 @@ * @author Daniel Lemire */ public final class SkippableFastPFOR implements SkippableIntegerCODEC { - int PageSize; - final static int BlockSize = 128; - final static int overheadofeachexcept = 8; + final static int BLOCK_SIZE = 128; + final static int OVERHEAD_OF_EACH_EXCEPT = 8; + final static int DEFAULT_PAGE_SIZE = 65536; + + int pageSize; + final int[][] dataTobePacked = new int[33][]; + final ByteBuffer byteContainer; - int[][] datatobepacked = new int[32][]; - ByteBuffer bytecontainer; + // Working area for compress and uncompress. + int[] dataPointers; + int[] freqs; + byte[] bestbbestcexceptmaxb; /** - * Constructor for FastPFOR + * Construct the FastPFOR CODEC. * * @param pagesize - * size of the page in number of integers + * the desired page size (for expert use) */ public SkippableFastPFOR(int pagesize) { - PageSize = pagesize; - initArrays(); + pageSize = pagesize; + // Initiate arrrays. + byteContainer = ByteBuffer.allocateDirect(3 * pageSize + / BLOCK_SIZE + pageSize); + for (int k = 1; k < dataTobePacked.length; ++k) + dataTobePacked[k] = new int[pageSize / 32 * 4]; // heuristic } /** - * - */ + * Construct the fastPFOR CODEC with default parameters. + */ public SkippableFastPFOR() { - PageSize = 65536; - initArrays(); - } - - private void initArrays() { - bytecontainer = ByteBuffer.allocateDirect(3 * PageSize / BlockSize - + PageSize); - for (int k = 1; k < 32; ++k) - datatobepacked[k] = new int[PageSize / 32 * 4];// heuristic + this(DEFAULT_PAGE_SIZE); } + /** + * Compress data in blocks of 128 integers (if fewer than 128 integers + * are provided, nothing is done). + * + * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) + */ @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = inlength / 128 * 128; + inlength = Util.floorBy(inlength, 128); + if (inlength == 0) + return; - final int finalinpos = inpos.get() + inlength; - while (inpos.get() != finalinpos) { - int thissize = finalinpos > PageSize + inpos.get() ? PageSize - : (finalinpos - inpos.get()); - encodePage(in, inpos, thissize, out, outpos); - } + // Allocate memory for working area. + dataPointers = new int[33]; + freqs = new int[33]; + bestbbestcexceptmaxb = new byte[3]; + + final int finalinpos = inpos.get() + inlength; + while (inpos.get() != finalinpos) { + int thissize = Math.min(pageSize, + finalinpos - inpos.get()); + encodePage(in, inpos, thissize, out, outpos); + } + + dataPointers = null; + freqs = null; + bestbbestcexceptmaxb = null; } - private static void getBestBFromData(int[] in, int pos, - byte[] bestbbestcexceptmaxb) { - int freqs[] = new int[32]; - for (int k = pos; k < BlockSize + pos; ++k) - freqs[Util.bits(in[k])]++; - bestbbestcexceptmaxb[0] = 31; - while (freqs[bestbbestcexceptmaxb[0]] == 0) - bestbbestcexceptmaxb[0]--; - bestbbestcexceptmaxb[2] = bestbbestcexceptmaxb[0]; - int bestcost = bestbbestcexceptmaxb[0] * BlockSize; - byte cexcept = 0; - bestbbestcexceptmaxb[1] = cexcept; - for (int b = bestbbestcexceptmaxb[0] - 1; b >= 0; --b) { - cexcept += freqs[b + 1]; - if (cexcept < 0) - break; - int thiscost = cexcept * overheadofeachexcept + cexcept - * (bestbbestcexceptmaxb[2] - b) + b * BlockSize + 8;// the - // extra - // 8 is - // the - // cost - // of - // storing - // maxbits - if (thiscost < bestcost) { - bestcost = thiscost; - bestbbestcexceptmaxb[0] = (byte) b; - bestbbestcexceptmaxb[1] = cexcept; + private void getBestBFromData(int[] in, int pos) { + Arrays.fill(freqs, 0); + for (int k = pos, k_end = pos + BLOCK_SIZE; k < k_end; ++k) { + freqs[Util.bits(in[k])]++; + } + bestbbestcexceptmaxb[0] = 32; + while (freqs[bestbbestcexceptmaxb[0]] == 0) + bestbbestcexceptmaxb[0]--; + bestbbestcexceptmaxb[2] = bestbbestcexceptmaxb[0]; + int bestcost = bestbbestcexceptmaxb[0] * BLOCK_SIZE; + byte cexcept = 0; + bestbbestcexceptmaxb[1] = cexcept; + for (int b = bestbbestcexceptmaxb[0] - 1; b >= 0; --b) { + cexcept += freqs[b + 1]; + if (cexcept < 0) + break; + // the extra 8 is the cost of storing maxbits + int thiscost = cexcept * OVERHEAD_OF_EACH_EXCEPT + + cexcept * (bestbbestcexceptmaxb[2] - b) + b + * BLOCK_SIZE + 8; + if (thiscost < bestcost) { + bestcost = thiscost; + bestbbestcexceptmaxb[0] = (byte) b; + bestbbestcexceptmaxb[1] = cexcept; + } } - } } private void encodePage(int[] in, IntWrapper inpos, int thissize, int[] out, IntWrapper outpos) { - final int headerpos = outpos.get(); - outpos.increment(); - int tmpoutpos = outpos.get(); - int[] datapointers = new int[32]; - bytecontainer.clear(); - final byte[] bestbbestcexceptmaxb = new byte[3]; - int tmpinpos = inpos.get(); - for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { - getBestBFromData(in, tmpinpos, bestbbestcexceptmaxb); - final int tmpbestb = bestbbestcexceptmaxb[0]; - bytecontainer.put(bestbbestcexceptmaxb[0]); - bytecontainer.put(bestbbestcexceptmaxb[1]); - if (bestbbestcexceptmaxb[1] > 0) { - bytecontainer.put(bestbbestcexceptmaxb[2]); - final int index = bestbbestcexceptmaxb[2] - - bestbbestcexceptmaxb[0]; - if (datapointers[index] + bestbbestcexceptmaxb[1] >= datatobepacked[index].length) { - int newsize = 2 * (datapointers[index] + bestbbestcexceptmaxb[1]); - newsize = (newsize + 31) / 32 * 32;// make sure it is a - // multiple of - // 32 - datatobepacked[index] = Arrays.copyOf( - datatobepacked[index], newsize); - } - final int maxval = 1 << bestbbestcexceptmaxb[0]; - for (int k = 0; k < BlockSize; ++k) { - if (in[k + tmpinpos] >= maxval) { - // we have an exception - bytecontainer.put((byte) k); - datatobepacked[index][datapointers[index]++] = in[k - + tmpinpos] >>> tmpbestb; + final int headerpos = outpos.get(); + outpos.increment(); + int tmpoutpos = outpos.get(); + + // Clear working area. + Arrays.fill(dataPointers, 0); + // Arrays.fill(bestbbestcexceptmaxb, (byte)0);//DL:unncessary + byteContainer.clear(); + + int tmpinpos = inpos.get(); + for (final int finalinpos = tmpinpos + thissize - BLOCK_SIZE; tmpinpos <= finalinpos; tmpinpos += BLOCK_SIZE) { + getBestBFromData(in, tmpinpos); + final int tmpbestb = bestbbestcexceptmaxb[0]; + byteContainer.put(bestbbestcexceptmaxb[0]); + byteContainer.put(bestbbestcexceptmaxb[1]); + if (bestbbestcexceptmaxb[1] > 0) { + byteContainer.put(bestbbestcexceptmaxb[2]); + final int index = bestbbestcexceptmaxb[2] + - bestbbestcexceptmaxb[0]; + if (dataPointers[index] + + bestbbestcexceptmaxb[1] >= dataTobePacked[index].length) { + int newsize = 2 * (dataPointers[index] + bestbbestcexceptmaxb[1]); + // make sure it is a multiple of 32 + newsize = Util + .floorBy(newsize + 31, 32); + dataTobePacked[index] = Arrays.copyOf( + dataTobePacked[index], newsize); + } + for (int k = 0; k < BLOCK_SIZE; ++k) { + if ((in[k + tmpinpos] >>> bestbbestcexceptmaxb[0]) != 0) { + // we have an exception + byteContainer.put((byte) k); + dataTobePacked[index][dataPointers[index]++] = in[k + + tmpinpos] >>> tmpbestb; + } + } + + } + for (int k = 0; k < 128; k += 32) { + BitPacking.fastpack(in, tmpinpos + k, out, + tmpoutpos, tmpbestb); + tmpoutpos += tmpbestb; } - } } - for (int k = 0; k < 128; k += 32) { - BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, tmpbestb); - tmpoutpos += tmpbestb; + inpos.set(tmpinpos); + out[headerpos] = tmpoutpos - headerpos; + final int bytesize = byteContainer.position(); + while ((byteContainer.position() & 3) != 0) + byteContainer.put((byte) 0); + out[tmpoutpos++] = bytesize; + final int howmanyints = byteContainer.position() / 4; + byteContainer.flip(); + byteContainer.asIntBuffer().get(out, tmpoutpos, howmanyints); + tmpoutpos += howmanyints; + int bitmap = 0; + for (int k = 1; k <= 32; ++k) { + if (dataPointers[k] != 0) + bitmap |= (1 << (k - 1)); } - } - inpos.set(tmpinpos); - out[headerpos] = tmpoutpos - headerpos; - while ((bytecontainer.position() & 3) != 0) - bytecontainer.put((byte) 0); - final int bytesize = bytecontainer.position(); - out[tmpoutpos++] = bytesize; - final int howmanyints = bytesize / 4; - bytecontainer.flip(); - bytecontainer.asIntBuffer().get(out, tmpoutpos, howmanyints); - tmpoutpos += howmanyints; - int bitmap = 0; - for (int k = 1; k <= 31; ++k) { - if (datapointers[k] != 0) - bitmap |= (1 << (k - 1)); - } - out[tmpoutpos++] = bitmap; - for (int k = 1; k <= 31; ++k) { - - if (datapointers[k] != 0) { - out[tmpoutpos++] = datapointers[k];// size - for (int j = 0; j < datapointers[k]; j += 32) { - BitPacking - .fastpack(datatobepacked[k], j, out, tmpoutpos, k); - tmpoutpos += k; - } + out[tmpoutpos++] = bitmap; + for (int k = 1; k <= 32; ++k) { + if (dataPointers[k] != 0) { + out[tmpoutpos++] = dataPointers[k];// size + for (int j = 0; j < dataPointers[k]; j += 32) { + BitPacking.fastpack(dataTobePacked[k], + j, out, tmpoutpos, k); + tmpoutpos += k; + } + } } - } - outpos.set(tmpoutpos); + outpos.set(tmpoutpos); } + /** + * Uncompress data in blocks of 128 integers. In this particular case, + * the inlength parameter is ignored: it is deduced from the compressed + * data. + * + * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) + */ @Override public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num) { - int mynvalue = num / BlockSize * BlockSize; - int finalout = outpos.get() + mynvalue; - while (outpos.get() != finalout) { - int thissize = finalout > PageSize + outpos.get() ? PageSize - : (finalout - outpos.get()); - decodePage(in, inpos, out, outpos, thissize); - } + if (inlength == 0) + return; + + int mynvalue = num / BLOCK_SIZE * BLOCK_SIZE; + + dataPointers = new int[33]; + + int finalout = outpos.get() + mynvalue; + while (outpos.get() != finalout) { + int thissize = Math.min(pageSize, + finalout - outpos.get()); + decodePage(in, inpos, out, outpos, thissize); + } + + dataPointers = null; } private void decodePage(int[] in, IntWrapper inpos, int[] out, IntWrapper outpos, int thissize) { - final int initpos = inpos.get(); - final int wheremeta = in[inpos.get()]; - inpos.increment(); - int inexcept = initpos + wheremeta; - final int bytesize = in[inexcept++]; - bytecontainer.clear(); - bytecontainer.asIntBuffer().put(in, inexcept, bytesize / 4); - inexcept += bytesize / 4; + final int initpos = inpos.get(); + final int wheremeta = in[inpos.get()]; + inpos.increment(); + int inexcept = initpos + wheremeta; + final int bytesize = in[inexcept++]; + byteContainer.clear(); + byteContainer.asIntBuffer().put(in, inexcept, (bytesize + 3) / 4); + inexcept += (bytesize + 3)/ 4; - final int bitmap = in[inexcept++]; - for (int k = 1; k <= 31; ++k) { - if ((bitmap & (1 << (k - 1))) != 0) { - int size = in[inexcept++]; - if (datatobepacked[k].length < size) - datatobepacked[k] = new int[(size + 31) / 32 * 32]; - for (int j = 0; j < size; j += 32) { - BitPacking - .fastunpack(in, inexcept, datatobepacked[k], j, k); - inexcept += k; - } + final int bitmap = in[inexcept++]; + for (int k = 1; k <= 32; ++k) { + if ((bitmap & (1 << (k - 1))) != 0) { + int size = in[inexcept++]; + if (dataTobePacked[k].length < size) + dataTobePacked[k] = new int[Util + .floorBy(size + 31, 32)]; + for (int j = 0; j < size; j += 32) { + BitPacking.fastunpack(in, inexcept, + dataTobePacked[k], j, k); + inexcept += k; + } + } } - } - int[] datapointers = new int[32]; - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); + Arrays.fill(dataPointers, 0); + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); - for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { - final byte b = bytecontainer.get(); - final byte cexcept = bytecontainer.get(); - for (int k = 0; k < 128; k += 32) { - BitPacking.fastunpack(in, tmpinpos, out, tmpoutpos + k, b); - tmpinpos += b; - } - if (cexcept > 0) { - final byte maxbits = bytecontainer.get(); - final int index = maxbits - b; - for (int k = 0; k < cexcept; ++k) { - final byte pos = bytecontainer.get(); - final int exceptvalue = datatobepacked[index][datapointers[index]++]; - out[pos + tmpoutpos] |= exceptvalue << b; - } + for (int run = 0, run_end = thissize / BLOCK_SIZE; run < run_end; ++run, tmpoutpos += BLOCK_SIZE) { + final byte b = byteContainer.get(); + final byte cexcept = byteContainer.get(); + for (int k = 0; k < 128; k += 32) { + BitPacking.fastunpack(in, tmpinpos, out, + tmpoutpos + k, b); + tmpinpos += b; + } + if (cexcept > 0) { + final byte maxbits = byteContainer.get(); + final int index = maxbits - b; + for (int k = 0; k < cexcept; ++k) { + final byte pos = byteContainer.get(); + final int exceptvalue = dataTobePacked[index][dataPointers[index]++]; + out[pos + tmpoutpos] |= exceptvalue << b; + } + } } - } - outpos.set(tmpoutpos); - inpos.set(inexcept); + outpos.set(tmpoutpos); + inpos.set(inexcept); } @Override public String toString() { - return this.getClass().getName(); + return this.getClass().getSimpleName(); } } diff --git a/src/main/java/me/lemire/integercompression/skippable/SkippableNewPFD.java b/src/main/java/me/lemire/integercompression/skippable/SkippableNewPFD.java index 33a733f..bb8db7c 100644 --- a/src/main/java/me/lemire/integercompression/skippable/SkippableNewPFD.java +++ b/src/main/java/me/lemire/integercompression/skippable/SkippableNewPFD.java @@ -81,9 +81,8 @@ private static void getBestBFromData(int[] in, int pos, IntWrapper bestb, int exceptcounter = 0; for (int i = mini; i < bits.length - 1; ++i) { int tmpcounter = 0; - final int maxv = 1 << bits[i]; for (int k = pos; k < BlockSize + pos; ++k) - if (in[k] >= maxv) + if ((in[k] >>> bits[i]) != 0) ++tmpcounter; if (tmpcounter * 10 <= BlockSize) { besti = i; @@ -109,9 +108,8 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, int remember = tmpoutpos; tmpoutpos++; if (nbrexcept > 0) { - final int maxv = 1 << bits[tmpbestb]; for (int i = 0, c = 0; i < BlockSize; ++i) { - if (in[tmpinpos + i] >= maxv) { + if ((in[tmpinpos + i] >>> bits[tmpbestb]) != 0) { exceptbuffer[c + nbrexcept] = i; exceptbuffer[c] = in[tmpinpos + i] >>> bits[tmpbestb]; ++c; diff --git a/src/main/java/me/lemire/integercompression/skippable/SkippableOptPFD.java b/src/main/java/me/lemire/integercompression/skippable/SkippableOptPFD.java index d851c82..d3e3e37 100644 --- a/src/main/java/me/lemire/integercompression/skippable/SkippableOptPFD.java +++ b/src/main/java/me/lemire/integercompression/skippable/SkippableOptPFD.java @@ -84,15 +84,14 @@ void getBestBFromData(int[] in, int pos, IntWrapper bestb, int exceptcounter = 0; for (int i = mini; i < bits.length - 1; ++i) { int tmpcounter = 0; - final int maxv = 1 << bits[i]; for (int k = pos; k < BlockSize + pos; ++k) - if (in[k] >= maxv) { + if ((in[k] >>> bits[i]) != 0) { ++tmpcounter; } if (tmpcounter == BlockSize) continue; // no need for (int k = pos, c = 0; k < pos + BlockSize; ++k) - if (in[k] >= maxv) { + if ((in[k] >>> bits[i]) != 0) { exceptbuffer[tmpcounter + c] = k - pos; exceptbuffer[c] = in[k] >>> bits[i]; ++c; @@ -125,10 +124,9 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, int remember = tmpoutpos; tmpoutpos++; if (nbrexcept > 0) { - final int maxv = 1 << bits[tmpbestb]; int c = 0; for (int i = 0; i < BlockSize; ++i) { - if (in[tmpinpos + i] >= maxv) { + if ((in[tmpinpos + i] >>> bits[tmpbestb]) != 0) { exceptbuffer[c + nbrexcept] = i; exceptbuffer[c] = in[tmpinpos + i] >>> bits[tmpbestb]; ++c; diff --git a/src/main/java/me/lemire/integercompression/skippable/SkippableSimple16.java b/src/main/java/me/lemire/integercompression/skippable/SkippableSimple16.java index f8adbc0..4ebccd1 100644 --- a/src/main/java/me/lemire/integercompression/skippable/SkippableSimple16.java +++ b/src/main/java/me/lemire/integercompression/skippable/SkippableSimple16.java @@ -3,13 +3,15 @@ import me.lemire.integercompression.*; /** - * This is an implementation of the popular Simple9 scheme. It is limited to + * This is an implementation of the popular Simple16 scheme. It is limited to * 28-bit integers (between 0 and 2^28-1). * * Note that this does not use differential coding: if you are working on sorted * lists, you must compute the deltas separately. * - * @author Daniel Lemire + *

+ * Adapted by D. Lemire from the Apache Lucene project. + *

* */ public final class SkippableSimple16 implements SkippableIntegerCODEC { diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 91d36e8..383f407 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -38,6 +38,7 @@ public class BasicTest { new IntegratedVariableByte()), new Composition(new FastPFOR(), new VariableByte()), new Simple9(), + new Simple16(), new Composition(new XorBinaryPacking(), new VariableByte()), new Composition(new DeltaZigzagBinaryPacking(), new DeltaZigzagVariableByte()) }; @@ -87,6 +88,15 @@ public void varyingLengthTest2() { } catch (ClassNotFoundException e) { e.printStackTrace(); } + try { + // CODEC Simple16 is limited to "small" integers. + if (c.getClass().equals( + Class.forName("me.lemire.integercompression.Simple16"))) + continue; + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + for (int L = 1; L <= 128; L++) { int[] comp = TestUtils.compress(c, Arrays.copyOf(data, L)); int[] answer = TestUtils.uncompress(c, comp, L); diff --git a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java index bcb7322..550853a 100644 --- a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java +++ b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java @@ -18,9 +18,9 @@ public class SkippableBasicTest { new JustCopy(), new VariableByte(), new SkippableComposition(new SkippableBinaryPacking(), new VariableByte()), - // new SkippableComposition(new SkippableNewPFD(), new VariableByte()), - // new SkippableComposition(new SkippableOptPFD(), new VariableByte()), - // new SkippableComposition(new SkippableFastPFOR(), new VariableByte()), + new SkippableComposition(new SkippableNewPFD(), new VariableByte()), + new SkippableComposition(new SkippableOptPFD(), new VariableByte()), + new SkippableComposition(new SkippableFastPFOR(), new VariableByte()), new SkippableSimple9(), new SkippableSimple16() }; diff --git a/src/test/java/me/lemire/integercompression/TestUtils.java b/src/test/java/me/lemire/integercompression/TestUtils.java index ee296b8..60271ec 100644 --- a/src/test/java/me/lemire/integercompression/TestUtils.java +++ b/src/test/java/me/lemire/integercompression/TestUtils.java @@ -122,6 +122,7 @@ protected static int[] uncompress(SkippableIntegerCODEC codec, int[] data, int l IntWrapper inPos = new IntWrapper(); IntWrapper outPos = new IntWrapper(); codec.uncompress(data, inPos, data.length, outBuf, outPos,len); + if(outPos.get() < len) throw new RuntimeException("Insufficient output."); return Arrays.copyOf(outBuf, outPos.get()); } From 5dbd0b494be1f38bad49d3a8382a5d8c2139843a Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Thu, 11 Sep 2014 11:54:14 -0400 Subject: [PATCH 181/412] Merging classes. --- .../integercompression/BinaryPacking.java | 28 ++++-- .../lemire/integercompression/JustCopy.java | 14 ++- .../integercompression/VariableByte.java | 9 +- .../skippable/Kamikaze.java | 4 +- .../skippable/SkippableBinaryPacking.java | 91 ------------------- .../skippable/SkippableComposition.java | 12 +-- .../skippable/SkippableFastPFOR.java | 4 +- .../skippable/SkippableIntegerCODEC.java | 4 +- .../skippable/SkippableNewPFD.java | 4 +- .../skippable/SkippableOptPFD.java | 4 +- .../skippable/SkippableSimple16.java | 4 +- .../skippable/SkippableSimple9.java | 4 +- .../SkippableBasicTest.java | 2 +- .../lemire/integercompression/TestUtils.java | 4 +- 14 files changed, 60 insertions(+), 128 deletions(-) delete mode 100644 src/main/java/me/lemire/integercompression/skippable/SkippableBinaryPacking.java diff --git a/src/main/java/me/lemire/integercompression/BinaryPacking.java b/src/main/java/me/lemire/integercompression/BinaryPacking.java index f2c66c6..820ecac 100644 --- a/src/main/java/me/lemire/integercompression/BinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/BinaryPacking.java @@ -6,6 +6,8 @@ */ package me.lemire.integercompression; +import me.lemire.integercompression.skippable.SkippableIntegerCODEC; + /** * Scheme based on a commonly used idea: can be extremely fast. * It encodes integers in blocks of 128 integers. For arrays containing @@ -35,17 +37,23 @@ * * @author Daniel Lemire */ -public final class BinaryPacking implements IntegerCODEC { +public final class BinaryPacking implements IntegerCODEC, SkippableIntegerCODEC { @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = inlength / 128 * 128; - if (inlength == 0) - return; + inlength = inlength / 128 * 128; + if (inlength == 0) + return; + out[outpos.get()] = inlength; + outpos.increment(); + headlessCompress(in, inpos, inlength, out, outpos); + } - out[outpos.get()] = inlength; - outpos.increment(); + @Override + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + inlength = inlength / 128 * 128; int tmpoutpos = outpos.get(); for (int s = inpos.get(); s < inpos.get() + inlength; s += 32 * 4) { final int mbits1 = Util.maxbits(in, s, 32); @@ -78,6 +86,13 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, return; final int outlength = in[inpos.get()]; inpos.increment(); + headlessUncompress(in,inpos, inlength,out,outpos,outlength); + } + + @Override + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos, int num) { + final int outlength = num / 128 * 128; int tmpinpos = inpos.get(); for (int s = outpos.get(); s < outpos.get() + outlength; s += 32 * 4) { final int mbits1 = (in[tmpinpos] >>> 24); @@ -100,7 +115,6 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, outpos.add(outlength); inpos.set(tmpinpos); } - @Override public String toString() { return this.getClass().getSimpleName(); diff --git a/src/main/java/me/lemire/integercompression/JustCopy.java b/src/main/java/me/lemire/integercompression/JustCopy.java index 9a535d4..720d71d 100644 --- a/src/main/java/me/lemire/integercompression/JustCopy.java +++ b/src/main/java/me/lemire/integercompression/JustCopy.java @@ -16,7 +16,7 @@ public final class JustCopy implements IntegerCODEC, SkippableIntegerCODEC { @Override - public void compress(int[] in, IntWrapper inpos, int inlength, + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { System.arraycopy(in, inpos.get(), out, outpos.get(), inlength); inpos.add(inlength); @@ -26,9 +26,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, @Override public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - System.arraycopy(in, inpos.get(), out, outpos.get(), inlength); - inpos.add(inlength); - outpos.add(inlength); + headlessUncompress(in,inpos,inlength,out,outpos,inlength); } @Override @@ -37,7 +35,7 @@ public String toString() { } @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num) { System.arraycopy(in, inpos.get(), out, outpos.get(), num); inpos.add(num); @@ -45,4 +43,10 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + headlessCompress(in,inpos,inlength,out,outpos); + } + } diff --git a/src/main/java/me/lemire/integercompression/VariableByte.java b/src/main/java/me/lemire/integercompression/VariableByte.java index e95ee0f..69148bd 100644 --- a/src/main/java/me/lemire/integercompression/VariableByte.java +++ b/src/main/java/me/lemire/integercompression/VariableByte.java @@ -30,10 +30,15 @@ private static byte extract7bits(int i, long val) { private static byte extract7bitsmaskless(int i, long val) { return (byte) ((val >> (7 * i))); } - @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + headlessCompress(in, inpos, inlength, out, outpos); + } + + @Override + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { if (inlength == 0) return; ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); @@ -176,7 +181,7 @@ public String toString() { } @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num) { int s = 0; int val = 0; diff --git a/src/main/java/me/lemire/integercompression/skippable/Kamikaze.java b/src/main/java/me/lemire/integercompression/skippable/Kamikaze.java index c1909f4..d43d76b 100644 --- a/src/main/java/me/lemire/integercompression/skippable/Kamikaze.java +++ b/src/main/java/me/lemire/integercompression/skippable/Kamikaze.java @@ -17,7 +17,7 @@ public class Kamikaze implements SkippableIntegerCODEC { private int BLOCK_SIZE = 128; @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { inlength = inlength / BLOCK_SIZE * BLOCK_SIZE; @@ -30,7 +30,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, } @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num) { num = num / BLOCK_SIZE * BLOCK_SIZE; diff --git a/src/main/java/me/lemire/integercompression/skippable/SkippableBinaryPacking.java b/src/main/java/me/lemire/integercompression/skippable/SkippableBinaryPacking.java deleted file mode 100644 index 3d8ae13..0000000 --- a/src/main/java/me/lemire/integercompression/skippable/SkippableBinaryPacking.java +++ /dev/null @@ -1,91 +0,0 @@ -/** - * This is code is released under the - * Apache License Version 2.0 http://www.apache.org/licenses/. - * - * (c) Daniel Lemire, http://lemire.me/en/ - */ -package me.lemire.integercompression.skippable; - -import me.lemire.integercompression.*; - - - -/** - * Scheme based on a commonly used idea: can be extremely fast. - * It encodes integers in blocks of 128 integers. For arrays containing - * an arbitrary number of integers, you should use it in conjunction - * with another CODEC: - * - *
IntegerCODEC ic = 
- *  new Composition(new BinaryPacking(), new VariableByte()).
- * - * Note that this does not use differential coding: if you are working on sorted - * lists, use IntegratedBinaryPacking instead. - * - *

- * For details, please see - *

- *

- * Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second - * through vectorization Software: Practice & Experience - * http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract - * http://arxiv.org/abs/1209.2137 - *

- *

- * Daniel Lemire, Leonid Boytsov, Nathan Kurz, - * SIMD Compression and the Intersection of Sorted Integers - * http://arxiv.org/abs/1401.6399 - *

- * - * @author Daniel Lemire - */ -public final class SkippableBinaryPacking implements SkippableIntegerCODEC { - - @Override -public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = inlength / 128 * 128; - int tmpoutpos = outpos.get(); - for (int s = inpos.get(); s < inpos.get() + inlength; s += 32 * 4) { - final int mbits1 = Util.maxbits(in, s, 32); - final int mbits2 = Util.maxbits(in, s + 32, 32); - final int mbits3 = Util.maxbits(in, s + 2 * 32, 32); - final int mbits4 = Util.maxbits(in, s + 3 * 32, 32); - out[tmpoutpos++] = (mbits1 << 24) | (mbits2 << 16) | (mbits3 << 8) - | (mbits4); - BitPacking.fastpackwithoutmask(in, s, out, tmpoutpos, mbits1); - tmpoutpos += mbits1; - BitPacking.fastpackwithoutmask(in, s + 32, out, tmpoutpos, mbits2); - tmpoutpos += mbits2; - BitPacking.fastpackwithoutmask(in, s + 2 * 32, out, tmpoutpos, mbits3); - tmpoutpos += mbits3; - BitPacking.fastpackwithoutmask(in, s + 3 * 32, out, tmpoutpos, mbits4); - tmpoutpos += mbits4; - } - inpos.add(inlength); - outpos.set(tmpoutpos); - } - - @Override -public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num) { - final int outlength = num / 128 * 128; - int tmpinpos = inpos.get(); - for (int s = outpos.get(); s < outpos.get() + outlength; s += 32 * 4) { - final int mbits1 = (in[tmpinpos] >>> 24); - final int mbits2 = (in[tmpinpos] >>> 16) & 0xFF; - final int mbits3 = (in[tmpinpos] >>> 8) & 0xFF; - final int mbits4 = (in[tmpinpos]) & 0xFF; - ++tmpinpos; - BitPacking.fastunpack(in, tmpinpos, out, s, mbits1); - tmpinpos += mbits1; - BitPacking.fastunpack(in, tmpinpos, out, s + 32, mbits2); - tmpinpos += mbits2; - BitPacking.fastunpack(in, tmpinpos, out, s + 2 * 32, mbits3); - tmpinpos += mbits3; - BitPacking.fastunpack(in, tmpinpos, out, s + 3 * 32, mbits4); - tmpinpos += mbits4; - } - outpos.add(outlength); - inpos.set(tmpinpos); - } - -} diff --git a/src/main/java/me/lemire/integercompression/skippable/SkippableComposition.java b/src/main/java/me/lemire/integercompression/skippable/SkippableComposition.java index b3ba09f..45d0ee1 100644 --- a/src/main/java/me/lemire/integercompression/skippable/SkippableComposition.java +++ b/src/main/java/me/lemire/integercompression/skippable/SkippableComposition.java @@ -36,22 +36,22 @@ public SkippableComposition(SkippableIntegerCODEC f1, } @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { int init = inpos.get(); - F1.compress(in, inpos, inlength, out, outpos); + F1.headlessCompress(in, inpos, inlength, out, outpos); inlength -= inpos.get() - init; - F2.compress(in, inpos, inlength, out, outpos); + F2.headlessCompress(in, inpos, inlength, out, outpos); } @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num) { int init = inpos.get(); - F1.uncompress(in, inpos, inlength, out, outpos, num); + F1.headlessUncompress(in, inpos, inlength, out, outpos, num); inlength -= inpos.get() - init; num -= outpos.get(); - F2.uncompress(in, inpos, inlength, out, outpos, num); + F2.headlessUncompress(in, inpos, inlength, out, outpos, num); } @Override diff --git a/src/main/java/me/lemire/integercompression/skippable/SkippableFastPFOR.java b/src/main/java/me/lemire/integercompression/skippable/SkippableFastPFOR.java index 94d0af8..419aba9 100644 --- a/src/main/java/me/lemire/integercompression/skippable/SkippableFastPFOR.java +++ b/src/main/java/me/lemire/integercompression/skippable/SkippableFastPFOR.java @@ -86,7 +86,7 @@ public SkippableFastPFOR() { * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) */ @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { inlength = Util.floorBy(inlength, 128); if (inlength == 0) @@ -220,7 +220,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) */ @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num) { if (inlength == 0) return; diff --git a/src/main/java/me/lemire/integercompression/skippable/SkippableIntegerCODEC.java b/src/main/java/me/lemire/integercompression/skippable/SkippableIntegerCODEC.java index f3d9900..50594c3 100644 --- a/src/main/java/me/lemire/integercompression/skippable/SkippableIntegerCODEC.java +++ b/src/main/java/me/lemire/integercompression/skippable/SkippableIntegerCODEC.java @@ -41,7 +41,7 @@ public interface SkippableIntegerCODEC { * @param outpos * where to write in the output array */ - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos); /** @@ -63,7 +63,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, * @param num * number of integers we want to decode, the actual number of integers decoded can be less */ - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num); } diff --git a/src/main/java/me/lemire/integercompression/skippable/SkippableNewPFD.java b/src/main/java/me/lemire/integercompression/skippable/SkippableNewPFD.java index bb8db7c..b3a7af8 100644 --- a/src/main/java/me/lemire/integercompression/skippable/SkippableNewPFD.java +++ b/src/main/java/me/lemire/integercompression/skippable/SkippableNewPFD.java @@ -52,7 +52,7 @@ public SkippableNewPFD() { } @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { inlength = inlength / BlockSize * BlockSize; @@ -131,7 +131,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, } @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num) { int mynvalue = num / BlockSize * BlockSize; int finalout = outpos.get() + mynvalue; diff --git a/src/main/java/me/lemire/integercompression/skippable/SkippableOptPFD.java b/src/main/java/me/lemire/integercompression/skippable/SkippableOptPFD.java index d3e3e37..1807345 100644 --- a/src/main/java/me/lemire/integercompression/skippable/SkippableOptPFD.java +++ b/src/main/java/me/lemire/integercompression/skippable/SkippableOptPFD.java @@ -51,7 +51,7 @@ public SkippableOptPFD() { } @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { // Util.assertTrue(inpos.get()+inlength <= in.length); inlength = inlength / BlockSize * BlockSize; @@ -148,7 +148,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, } @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num) { // Util.assertTrue(inpos.get()+inlength <= in.length); int mynvalue = num / BlockSize * BlockSize; diff --git a/src/main/java/me/lemire/integercompression/skippable/SkippableSimple16.java b/src/main/java/me/lemire/integercompression/skippable/SkippableSimple16.java index 4ebccd1..932ce49 100644 --- a/src/main/java/me/lemire/integercompression/skippable/SkippableSimple16.java +++ b/src/main/java/me/lemire/integercompression/skippable/SkippableSimple16.java @@ -16,7 +16,7 @@ */ public final class SkippableSimple16 implements SkippableIntegerCODEC { - public void compress(int[] in, IntWrapper inpos, int inlength, int out[], + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int out[], IntWrapper outpos) { int i_inpos = inpos.get(); int i_outpos = outpos.get(); @@ -130,7 +130,7 @@ public static final int decompressblock(int[] out, int outOffset, int[] in, } @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num) { int i_inpos = inpos.get(); int i_outpos = outpos.get(); diff --git a/src/main/java/me/lemire/integercompression/skippable/SkippableSimple9.java b/src/main/java/me/lemire/integercompression/skippable/SkippableSimple9.java index bca2b55..cdf061f 100644 --- a/src/main/java/me/lemire/integercompression/skippable/SkippableSimple9.java +++ b/src/main/java/me/lemire/integercompression/skippable/SkippableSimple9.java @@ -22,7 +22,7 @@ public final class SkippableSimple9 implements SkippableIntegerCODEC { @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int out[], + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int out[], IntWrapper outpos) { int tmpoutpos = outpos.get(); int currentPos = inpos.get(); @@ -84,7 +84,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int out[], } @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num) { int currentPos = outpos.get(); int tmpinpos = inpos.get(); diff --git a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java index 550853a..ee2162d 100644 --- a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java +++ b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java @@ -17,7 +17,7 @@ public class SkippableBasicTest { SkippableIntegerCODEC[] codecs = { new JustCopy(), new VariableByte(), - new SkippableComposition(new SkippableBinaryPacking(), new VariableByte()), + new SkippableComposition(new BinaryPacking(), new VariableByte()), new SkippableComposition(new SkippableNewPFD(), new VariableByte()), new SkippableComposition(new SkippableOptPFD(), new VariableByte()), new SkippableComposition(new SkippableFastPFOR(), new VariableByte()), diff --git a/src/test/java/me/lemire/integercompression/TestUtils.java b/src/test/java/me/lemire/integercompression/TestUtils.java index 60271ec..6403fa6 100644 --- a/src/test/java/me/lemire/integercompression/TestUtils.java +++ b/src/test/java/me/lemire/integercompression/TestUtils.java @@ -113,7 +113,7 @@ protected static int[] compress(SkippableIntegerCODEC codec, int[] data) { int[] outBuf = new int[data.length * 4]; IntWrapper inPos = new IntWrapper(); IntWrapper outPos = new IntWrapper(); - codec.compress(data, inPos, data.length, outBuf, outPos); + codec.headlessCompress(data, inPos, data.length, outBuf, outPos); return Arrays.copyOf(outBuf, outPos.get()); } @@ -121,7 +121,7 @@ protected static int[] uncompress(SkippableIntegerCODEC codec, int[] data, int l int[] outBuf = new int[len + 1024]; IntWrapper inPos = new IntWrapper(); IntWrapper outPos = new IntWrapper(); - codec.uncompress(data, inPos, data.length, outBuf, outPos,len); + codec.headlessUncompress(data, inPos, data.length, outBuf, outPos,len); if(outPos.get() < len) throw new RuntimeException("Insufficient output."); return Arrays.copyOf(outBuf, outPos.get()); } From 07fc7db667826c5fb118ad5708433955104e9a5c Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 16 Sep 2014 22:12:58 -0400 Subject: [PATCH 182/412] Merging codecs so that most of them are skippable --- .../integercompression/BinaryPacking.java | 1 - .../lemire/integercompression/FastPFOR.java | 39 ++- .../lemire/integercompression/JustCopy.java | 1 - .../{skippable => }/Kamikaze.java | 33 +- .../me/lemire/integercompression/NewPFD.java | 55 ++-- .../lemire/integercompression/NewPFDS16.java | 55 ++-- .../lemire/integercompression/NewPFDS9.java | 55 ++-- .../me/lemire/integercompression/OptPFD.java | 59 ++-- .../lemire/integercompression/OptPFDS16.java | 57 ++-- .../lemire/integercompression/OptPFDS9.java | 58 ++-- .../lemire/integercompression/Simple16.java | 36 ++- .../me/lemire/integercompression/Simple9.java | 31 +- .../{skippable => }/SkippableComposition.java | 5 +- .../SkippableIntegerCODEC.java | 3 +- .../integercompression/VariableByte.java | 2 - .../skippable/SkippableFastPFOR.java | 298 ------------------ .../skippable/SkippableNewPFD.java | 176 ----------- .../skippable/SkippableOptPFD.java | 196 ------------ .../skippable/SkippableSimple16.java | 209 ------------ .../skippable/SkippableSimple9.java | 291 ----------------- .../lemire/integercompression/BasicTest.java | 3 + .../SkippableBasicTest.java | 39 ++- .../lemire/integercompression/TestUtils.java | 6 +- 23 files changed, 359 insertions(+), 1349 deletions(-) rename src/main/java/me/lemire/integercompression/{skippable => }/Kamikaze.java (54%) rename src/main/java/me/lemire/integercompression/{skippable => }/SkippableComposition.java (91%) rename src/main/java/me/lemire/integercompression/{skippable => }/SkippableIntegerCODEC.java (96%) delete mode 100644 src/main/java/me/lemire/integercompression/skippable/SkippableFastPFOR.java delete mode 100644 src/main/java/me/lemire/integercompression/skippable/SkippableNewPFD.java delete mode 100644 src/main/java/me/lemire/integercompression/skippable/SkippableOptPFD.java delete mode 100644 src/main/java/me/lemire/integercompression/skippable/SkippableSimple16.java delete mode 100644 src/main/java/me/lemire/integercompression/skippable/SkippableSimple9.java diff --git a/src/main/java/me/lemire/integercompression/BinaryPacking.java b/src/main/java/me/lemire/integercompression/BinaryPacking.java index 820ecac..6377c25 100644 --- a/src/main/java/me/lemire/integercompression/BinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/BinaryPacking.java @@ -6,7 +6,6 @@ */ package me.lemire.integercompression; -import me.lemire.integercompression.skippable.SkippableIntegerCODEC; /** * Scheme based on a commonly used idea: can be extremely fast. diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 2245411..0c4ddd2 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -37,7 +37,7 @@ * * @author Daniel Lemire */ -public final class FastPFOR implements IntegerCODEC { +public final class FastPFOR implements IntegerCODEC,SkippableIntegerCODEC { final static int BLOCK_SIZE = 128; final static int OVERHEAD_OF_EACH_EXCEPT = 8; final static int DEFAULT_PAGE_SIZE = 65536; @@ -80,14 +80,12 @@ public FastPFOR() { * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) */ @Override - public void compress(int[] in, IntWrapper inpos, int inlength, + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = Util.floorBy(inlength, 128); + inlength = Util.floorBy(inlength, BLOCK_SIZE); if (inlength == 0) return; - out[outpos.get()] = inlength; - outpos.increment(); // Allocate memory for working area. dataPointers = new int[33]; @@ -174,7 +172,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, } } - for (int k = 0; k < 128; k += 32) { + for (int k = 0; k < BLOCK_SIZE; k += 32) { BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, tmpbestb); tmpoutpos += tmpbestb; @@ -217,13 +215,11 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) */ @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos, int mynvalue) { if (inlength == 0) return; - - int mynvalue = in[inpos.get()]; - inpos.increment(); + mynvalue = Util.floorBy(mynvalue, BLOCK_SIZE); dataPointers = new int[33]; @@ -269,7 +265,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, for (int run = 0, run_end = thissize / BLOCK_SIZE; run < run_end; ++run, tmpoutpos += BLOCK_SIZE) { final byte b = byteContainer.get(); final byte cexcept = byteContainer.get(); - for (int k = 0; k < 128; k += 32) { + for (int k = 0; k < BLOCK_SIZE; k += 32) { BitPacking.fastunpack(in, tmpinpos, out, tmpoutpos + k, b); tmpinpos += b; @@ -288,7 +284,26 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, outpos.set(tmpoutpos); inpos.set(inexcept); } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + inlength = Util.floorBy(inlength, BLOCK_SIZE); + if (inlength == 0) + return; + out[outpos.get()] = inlength; + outpos.increment(); + headlessCompress(in, inpos, inlength, out, outpos); + } + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + if (inlength == 0) + return; + final int outlength = in[inpos.get()]; + inpos.increment(); + headlessUncompress(in, inpos, inlength, out, outpos, outlength); + } @Override public String toString() { return this.getClass().getSimpleName(); diff --git a/src/main/java/me/lemire/integercompression/JustCopy.java b/src/main/java/me/lemire/integercompression/JustCopy.java index 720d71d..709b86a 100644 --- a/src/main/java/me/lemire/integercompression/JustCopy.java +++ b/src/main/java/me/lemire/integercompression/JustCopy.java @@ -7,7 +7,6 @@ package me.lemire.integercompression; -import me.lemire.integercompression.skippable.SkippableIntegerCODEC; /** * @author Daniel Lemire diff --git a/src/main/java/me/lemire/integercompression/skippable/Kamikaze.java b/src/main/java/me/lemire/integercompression/Kamikaze.java similarity index 54% rename from src/main/java/me/lemire/integercompression/skippable/Kamikaze.java rename to src/main/java/me/lemire/integercompression/Kamikaze.java index d43d76b..9f422d8 100644 --- a/src/main/java/me/lemire/integercompression/skippable/Kamikaze.java +++ b/src/main/java/me/lemire/integercompression/Kamikaze.java @@ -1,6 +1,5 @@ -package me.lemire.integercompression.skippable; +package me.lemire.integercompression; -import me.lemire.integercompression.IntWrapper; import com.kamikaze.pfordelta.PForDelta; /** @@ -12,15 +11,14 @@ * @author Matteo Catena * */ -public class Kamikaze implements SkippableIntegerCODEC { +public class Kamikaze implements SkippableIntegerCODEC, IntegerCODEC { private int BLOCK_SIZE = 128; @Override public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - - inlength = inlength / BLOCK_SIZE * BLOCK_SIZE; + inlength = Util.floorBy(inlength, BLOCK_SIZE); if (inlength > 0) { int[] out2 = PForDelta.compressOneBlockOpt(in, inlength); inpos.add(inlength); @@ -32,8 +30,7 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out @Override public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num) { - - num = num / BLOCK_SIZE * BLOCK_SIZE; + num = Util.floorBy(num, BLOCK_SIZE); if (num > 0) { int d = PForDelta.decompressOneBlock(out, in, num); inpos.add(d / 32); @@ -45,4 +42,26 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] o public String toString() { return "Kamikaze's PForDelta"; } + + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + inlength = Util.floorBy(inlength, BLOCK_SIZE); + if (inlength == 0) + return; + out[outpos.get()] = inlength; + outpos.increment(); + headlessCompress(in, inpos, inlength, out, outpos); + } + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + if (inlength == 0) + return; + final int outlength = in[inpos.get()]; + inpos.increment(); + headlessUncompress(in, inpos, inlength, out, outpos, outlength); + + } } \ No newline at end of file diff --git a/src/main/java/me/lemire/integercompression/NewPFD.java b/src/main/java/me/lemire/integercompression/NewPFD.java index 9530c05..0ea6cc3 100644 --- a/src/main/java/me/lemire/integercompression/NewPFD.java +++ b/src/main/java/me/lemire/integercompression/NewPFD.java @@ -7,6 +7,7 @@ package me.lemire.integercompression; + /** * NewPFD/NewPFOR: fast patching scheme by Yan et al. *

@@ -33,11 +34,11 @@ * * @author Daniel Lemire */ -public final class NewPFD implements IntegerCODEC { +public final class NewPFD implements IntegerCODEC,SkippableIntegerCODEC { final int PageSize; - final static int BlockSize = 128; + final static int BLOCK_SIZE = 128; - int[] exceptbuffer = new int[2 * BlockSize]; + int[] exceptbuffer = new int[2 * BLOCK_SIZE]; /** * Constructor for the NewPFD CODEC. @@ -47,14 +48,12 @@ public NewPFD() { } @Override - public void compress(int[] in, IntWrapper inpos, int inlength, + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = inlength / BlockSize * BlockSize; + inlength = Util.floorBy(inlength, BLOCK_SIZE); if (inlength == 0) return; final int finalinpos = inpos.get() + inlength; - out[outpos.get()] = inlength; - outpos.increment(); while (inpos.get() != finalinpos) { int thissize = finalinpos > PageSize + inpos.get() ? PageSize : (finalinpos - inpos.get()); @@ -71,7 +70,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, protected static void getBestBFromData(int[] in, int pos, IntWrapper bestb, IntWrapper bestexcept) { - final int mb = Util.maxbits(in, pos, BlockSize); + final int mb = Util.maxbits(in, pos, BLOCK_SIZE); int mini = 0; if (mini + 28 < bits[invbits[mb]]) mini = bits[invbits[mb]] - 28; // 28 is the max for @@ -80,10 +79,10 @@ protected static void getBestBFromData(int[] in, int pos, int exceptcounter = 0; for (int i = mini; i < bits.length - 1; ++i) { int tmpcounter = 0; - for (int k = pos; k < BlockSize + pos; ++k) + for (int k = pos; k < BLOCK_SIZE + pos; ++k) if ((in[k] >>> bits[i]) != 0) ++tmpcounter; - if (tmpcounter * 10 <= BlockSize) { + if (tmpcounter * 10 <= BLOCK_SIZE) { besti = i; exceptcounter = tmpcounter; break; @@ -100,7 +99,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, IntWrapper bestb = new IntWrapper(); IntWrapper bestexcept = new IntWrapper(); for (final int finalinpos = tmpinpos + thissize; tmpinpos - + BlockSize <= finalinpos; tmpinpos += BlockSize) { + + BLOCK_SIZE <= finalinpos; tmpinpos += BLOCK_SIZE) { getBestBFromData(in, tmpinpos, bestb, bestexcept); final int tmpbestb = bestb.get(); final int nbrexcept = bestexcept.get(); @@ -108,7 +107,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, final int remember = tmpoutpos; tmpoutpos++; if (nbrexcept > 0) { - for (int i = 0, c = 0; i < BlockSize; ++i) { + for (int i = 0, c = 0; i < BLOCK_SIZE; ++i) { if ((in[tmpinpos + i] >>> bits[tmpbestb]) != 0) { exceptbuffer[c + nbrexcept] = i; exceptbuffer[c] = in[tmpinpos @@ -122,7 +121,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, } out[remember] = tmpbestb | (nbrexcept << 8) | (exceptsize << 16); - for (int k = 0; k < BlockSize; k += 32) { + for (int k = 0; k < BLOCK_SIZE; k += 32) { BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, bits[tmpbestb]); tmpoutpos += bits[tmpbestb]; @@ -133,12 +132,11 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, } @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos, int mynvalue) { if (inlength == 0) return; - int mynvalue = in[inpos.get()]; - inpos.increment(); + mynvalue = Util.floorBy(mynvalue, BLOCK_SIZE); final int finalout = outpos.get() + mynvalue; while (outpos.get() != finalout) { int thissize = finalout > PageSize + outpos.get() ? PageSize @@ -152,7 +150,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, int tmpoutpos = outpos.get(); int tmpinpos = inpos.get(); - for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { + for (int run = 0; run < thissize / BLOCK_SIZE; ++run, tmpoutpos += BLOCK_SIZE) { final int b = in[tmpinpos] & 0xFF; final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; final int exceptsize = (in[tmpinpos] >>> 16); @@ -160,7 +158,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, S16.uncompress(in, tmpinpos, exceptsize, exceptbuffer, 0, 2 * cexcept); tmpinpos += exceptsize; - for (int k = 0; k < BlockSize; k += 32) { + for (int k = 0; k < BLOCK_SIZE; k += 32) { BitPacking.fastunpack(in, tmpinpos, out, tmpoutpos + k, bits[b]); tmpinpos += bits[b]; @@ -172,7 +170,26 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, outpos.set(tmpoutpos); inpos.set(tmpinpos); } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + inlength = Util.floorBy(inlength, BLOCK_SIZE); + if (inlength == 0) + return; + out[outpos.get()] = inlength; + outpos.increment(); + headlessCompress(in, inpos, inlength, out, outpos); + } + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + if (inlength == 0) + return; + final int outlength = in[inpos.get()]; + inpos.increment(); + headlessUncompress(in, inpos, inlength, out, outpos, outlength); + } @Override public String toString() { return this.getClass().getSimpleName(); diff --git a/src/main/java/me/lemire/integercompression/NewPFDS16.java b/src/main/java/me/lemire/integercompression/NewPFDS16.java index bf0b5c6..fc6599b 100644 --- a/src/main/java/me/lemire/integercompression/NewPFDS16.java +++ b/src/main/java/me/lemire/integercompression/NewPFDS16.java @@ -7,6 +7,7 @@ package me.lemire.integercompression; + /** * NewPFD/NewPFOR based on Simple16 by Yan et al. *

@@ -32,11 +33,11 @@ * * @author Daniel Lemire */ -public final class NewPFDS16 implements IntegerCODEC { +public final class NewPFDS16 implements IntegerCODEC,SkippableIntegerCODEC { final int PageSize; - final static int BlockSize = 128; + final static int BLOCK_SIZE= 128; - int[] exceptbuffer = new int[2 * BlockSize]; + int[] exceptbuffer = new int[2 * BLOCK_SIZE]; /** * Constructor for the NewPFDS16 CODEC. @@ -46,14 +47,12 @@ public NewPFDS16() { } @Override - public void compress(int[] in, IntWrapper inpos, int inlength, + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = inlength / BlockSize * BlockSize; + inlength = inlength / BLOCK_SIZE * BLOCK_SIZE; if (inlength == 0) return; final int finalinpos = inpos.get() + inlength; - out[outpos.get()] = inlength; - outpos.increment(); while (inpos.get() != finalinpos) { int thissize = finalinpos > PageSize + inpos.get() ? PageSize : (finalinpos - inpos.get()); @@ -70,7 +69,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, protected static void getBestBFromData(int[] in, int pos, IntWrapper bestb, IntWrapper bestexcept) { - final int mb = Util.maxbits(in, pos, BlockSize); + final int mb = Util.maxbits(in, pos, BLOCK_SIZE); int mini = 0; if (mini + 28 < bits[invbits[mb]]) mini = bits[invbits[mb]] - 28; // 28 is the max for @@ -79,10 +78,10 @@ protected static void getBestBFromData(int[] in, int pos, int exceptcounter = 0; for (int i = mini; i < bits.length - 1; ++i) { int tmpcounter = 0; - for (int k = pos; k < BlockSize + pos; ++k) + for (int k = pos; k < BLOCK_SIZE + pos; ++k) if ((in[k] >>> bits[i]) != 0) ++tmpcounter; - if (tmpcounter * 10 <= BlockSize) { + if (tmpcounter * 10 <= BLOCK_SIZE) { besti = i; exceptcounter = tmpcounter; break; @@ -99,7 +98,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, IntWrapper bestb = new IntWrapper(); IntWrapper bestexcept = new IntWrapper(); for (final int finalinpos = tmpinpos + thissize; tmpinpos - + BlockSize <= finalinpos; tmpinpos += BlockSize) { + + BLOCK_SIZE <= finalinpos; tmpinpos += BLOCK_SIZE) { getBestBFromData(in, tmpinpos, bestb, bestexcept); final int tmpbestb = bestb.get(); final int nbrexcept = bestexcept.get(); @@ -107,7 +106,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, final int remember = tmpoutpos; tmpoutpos++; if (nbrexcept > 0) { - for (int i = 0, c = 0; i < BlockSize; ++i) { + for (int i = 0, c = 0; i < BLOCK_SIZE; ++i) { if ((in[tmpinpos + i] >>> bits[tmpbestb]) != 0) { exceptbuffer[c + nbrexcept] = i; exceptbuffer[c] = in[tmpinpos @@ -121,7 +120,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, } out[remember] = tmpbestb | (nbrexcept << 8) | (exceptsize << 16); - for (int k = 0; k < BlockSize; k += 32) { + for (int k = 0; k < BLOCK_SIZE; k += 32) { BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, bits[tmpbestb]); tmpoutpos += bits[tmpbestb]; @@ -132,12 +131,11 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, } @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos, int mynvalue) { if (inlength == 0) return; - final int mynvalue = in[inpos.get()]; - inpos.increment(); + mynvalue = Util.floorBy(mynvalue, BLOCK_SIZE); int finalout = outpos.get() + mynvalue; while (outpos.get() != finalout) { int thissize = finalout > PageSize + outpos.get() ? PageSize @@ -151,7 +149,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, int tmpoutpos = outpos.get(); int tmpinpos = inpos.get(); - for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { + for (int run = 0; run < thissize / BLOCK_SIZE; ++run, tmpoutpos += BLOCK_SIZE) { final int b = in[tmpinpos] & 0xFF; final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; final int exceptsize = (in[tmpinpos] >>> 16); @@ -159,7 +157,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, S16.uncompress(in, tmpinpos, exceptsize, exceptbuffer, 0, 2 * cexcept); tmpinpos += exceptsize; - for (int k = 0; k < BlockSize; k += 32) { + for (int k = 0; k < BLOCK_SIZE; k += 32) { BitPacking.fastunpack(in, tmpinpos, out, tmpoutpos + k, bits[b]); tmpinpos += bits[b]; @@ -171,7 +169,26 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, outpos.set(tmpoutpos); inpos.set(tmpinpos); } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + inlength = Util.floorBy(inlength, BLOCK_SIZE); + if (inlength == 0) + return; + out[outpos.get()] = inlength; + outpos.increment(); + headlessCompress(in, inpos, inlength, out, outpos); + } + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + if (inlength == 0) + return; + final int outlength = in[inpos.get()]; + inpos.increment(); + headlessUncompress(in, inpos, inlength, out, outpos, outlength); + } @Override public String toString() { return this.getClass().getSimpleName(); diff --git a/src/main/java/me/lemire/integercompression/NewPFDS9.java b/src/main/java/me/lemire/integercompression/NewPFDS9.java index ee671ef..7a15ed4 100644 --- a/src/main/java/me/lemire/integercompression/NewPFDS9.java +++ b/src/main/java/me/lemire/integercompression/NewPFDS9.java @@ -7,6 +7,7 @@ package me.lemire.integercompression; + /** * NewPFD/NewPFOR based on Simple9 by Yan et al. *

@@ -31,11 +32,11 @@ * * @author Daniel Lemire */ -public final class NewPFDS9 implements IntegerCODEC { +public final class NewPFDS9 implements IntegerCODEC,SkippableIntegerCODEC { final int PageSize; - final static int BlockSize = 128; + final static int BLOCK_SIZE = 128; - int[] exceptbuffer = new int[2 * BlockSize]; + int[] exceptbuffer = new int[2 * BLOCK_SIZE]; /** * Constructor for the NewPFDS9 CODEC. @@ -45,14 +46,12 @@ public NewPFDS9() { } @Override - public void compress(int[] in, IntWrapper inpos, int inlength, + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = inlength / BlockSize * BlockSize; + inlength = inlength / BLOCK_SIZE * BLOCK_SIZE; if (inlength == 0) return; final int finalinpos = inpos.get() + inlength; - out[outpos.get()] = inlength; - outpos.increment(); while (inpos.get() != finalinpos) { int thissize = finalinpos > PageSize + inpos.get() ? PageSize : (finalinpos - inpos.get()); @@ -69,7 +68,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, protected static void getBestBFromData(int[] in, int pos, IntWrapper bestb, IntWrapper bestexcept) { - final int mb = Util.maxbits(in, pos, BlockSize); + final int mb = Util.maxbits(in, pos, BLOCK_SIZE); int mini = 0; if (mini + 28 < bits[invbits[mb]]) mini = bits[invbits[mb]] - 28; // 28 is the max for @@ -78,10 +77,10 @@ protected static void getBestBFromData(int[] in, int pos, int exceptcounter = 0; for (int i = mini; i < bits.length - 1; ++i) { int tmpcounter = 0; - for (int k = pos; k < BlockSize + pos; ++k) + for (int k = pos; k < BLOCK_SIZE + pos; ++k) if ((in[k] >>> bits[i]) != 0) ++tmpcounter; - if (tmpcounter * 10 <= BlockSize) { + if (tmpcounter * 10 <= BLOCK_SIZE) { besti = i; exceptcounter = tmpcounter; break; @@ -98,7 +97,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, IntWrapper bestb = new IntWrapper(); IntWrapper bestexcept = new IntWrapper(); for (final int finalinpos = tmpinpos + thissize; tmpinpos - + BlockSize <= finalinpos; tmpinpos += BlockSize) { + + BLOCK_SIZE <= finalinpos; tmpinpos += BLOCK_SIZE) { getBestBFromData(in, tmpinpos, bestb, bestexcept); final int tmpbestb = bestb.get(); final int nbrexcept = bestexcept.get(); @@ -106,7 +105,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, final int remember = tmpoutpos; tmpoutpos++; if (nbrexcept > 0) { - for (int i = 0, c = 0; i < BlockSize; ++i) { + for (int i = 0, c = 0; i < BLOCK_SIZE; ++i) { if ((in[tmpinpos + i] >>> bits[tmpbestb]) != 0) { exceptbuffer[c + nbrexcept] = i; exceptbuffer[c] = in[tmpinpos @@ -120,7 +119,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, } out[remember] = tmpbestb | (nbrexcept << 8) | (exceptsize << 16); - for (int k = 0; k < BlockSize; k += 32) { + for (int k = 0; k < BLOCK_SIZE; k += 32) { BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, bits[tmpbestb]); tmpoutpos += bits[tmpbestb]; @@ -131,12 +130,11 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, } @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos, int mynvalue) { if (inlength == 0) return; - final int mynvalue = in[inpos.get()]; - inpos.increment(); + mynvalue = Util.floorBy(mynvalue, BLOCK_SIZE); int finalout = outpos.get() + mynvalue; while (outpos.get() != finalout) { int thissize = finalout > PageSize + outpos.get() ? PageSize @@ -150,7 +148,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, int tmpoutpos = outpos.get(); int tmpinpos = inpos.get(); - for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { + for (int run = 0; run < thissize / BLOCK_SIZE; ++run, tmpoutpos += BLOCK_SIZE) { final int b = in[tmpinpos] & 0xFF; final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; final int exceptsize = (in[tmpinpos] >>> 16); @@ -158,7 +156,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, S9.uncompress(in, tmpinpos, exceptsize, exceptbuffer, 0, 2 * cexcept); tmpinpos += exceptsize; - for (int k = 0; k < BlockSize; k += 32) { + for (int k = 0; k < BLOCK_SIZE; k += 32) { BitPacking.fastunpack(in, tmpinpos, out, tmpoutpos + k, bits[b]); tmpinpos += bits[b]; @@ -170,7 +168,26 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, outpos.set(tmpoutpos); inpos.set(tmpinpos); } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + inlength = Util.floorBy(inlength, BLOCK_SIZE); + if (inlength == 0) + return; + out[outpos.get()] = inlength; + outpos.increment(); + headlessCompress(in, inpos, inlength, out, outpos); + } + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + if (inlength == 0) + return; + final int outlength = in[inpos.get()]; + inpos.increment(); + headlessUncompress(in, inpos, inlength, out, outpos, outlength); + } @Override public String toString() { return this.getClass().getSimpleName(); diff --git a/src/main/java/me/lemire/integercompression/OptPFD.java b/src/main/java/me/lemire/integercompression/OptPFD.java index 2395c3f..051b11f 100644 --- a/src/main/java/me/lemire/integercompression/OptPFD.java +++ b/src/main/java/me/lemire/integercompression/OptPFD.java @@ -6,6 +6,7 @@ */ package me.lemire.integercompression; + /** * OptPFD: fast patching scheme by Yan et al. *

@@ -31,12 +32,12 @@ * * @author Daniel Lemire */ -public final class OptPFD implements IntegerCODEC { +public final class OptPFD implements IntegerCODEC,SkippableIntegerCODEC { final int PageSize; - final static int BlockSize = 128; + final static int BLOCK_SIZE = 128; - int[] exceptbuffer = new int[2 * BlockSize]; - int[] sillybuffer = new int[2 * BlockSize]; + int[] exceptbuffer = new int[2 * BLOCK_SIZE]; + int[] sillybuffer = new int[2 * BLOCK_SIZE]; /** * Constructor for the OptPFD CODEC. @@ -46,14 +47,12 @@ public OptPFD() { } @Override - public void compress(int[] in, IntWrapper inpos, int inlength, + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = inlength / BlockSize * BlockSize; + inlength = inlength / BLOCK_SIZE * BLOCK_SIZE; if (inlength == 0) return; final int finalinpos = inpos.get() + inlength; - out[outpos.get()] = inlength; - outpos.increment(); while (inpos.get() != finalinpos) { int thissize = finalinpos > PageSize + inpos.get() ? PageSize : (finalinpos - inpos.get()); @@ -70,7 +69,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, void getBestBFromData(int[] in, int pos, IntWrapper bestb, IntWrapper bestexcept) { - final int mb = Util.maxbits(in, pos, BlockSize); + final int mb = Util.maxbits(in, pos, BLOCK_SIZE); int mini = 0; if (mini + 28 < bits[invbits[mb]]) mini = bits[invbits[mb]] - 28; // 28 is the max for @@ -80,13 +79,13 @@ void getBestBFromData(int[] in, int pos, IntWrapper bestb, int exceptcounter = 0; for (int i = mini; i < bits.length - 1; ++i) { int tmpcounter = 0; - for (int k = pos; k < BlockSize + pos; ++k) + for (int k = pos; k < BLOCK_SIZE + pos; ++k) if ((in[k] >>> bits[i]) != 0) { ++tmpcounter; } - if (tmpcounter == BlockSize) + if (tmpcounter == BLOCK_SIZE) continue; // no need - for (int k = pos, c = 0; k < pos + BlockSize; ++k) + for (int k = pos, c = 0; k < pos + BLOCK_SIZE; ++k) if ((in[k] >>> bits[i]) != 0) { exceptbuffer[tmpcounter + c] = k - pos; exceptbuffer[c] = in[k] >>> bits[i]; @@ -115,7 +114,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, IntWrapper bestb = new IntWrapper(); IntWrapper bestexcept = new IntWrapper(); for (final int finalinpos = tmpinpos + thissize; tmpinpos - + BlockSize <= finalinpos; tmpinpos += BlockSize) { + + BLOCK_SIZE <= finalinpos; tmpinpos += BLOCK_SIZE) { getBestBFromData(in, tmpinpos, bestb, bestexcept); final int tmpbestb = bestb.get(); final int nbrexcept = bestexcept.get(); @@ -124,7 +123,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, tmpoutpos++; if (nbrexcept > 0) { int c = 0; - for (int i = 0; i < BlockSize; ++i) { + for (int i = 0; i < BLOCK_SIZE; ++i) { if ((in[tmpinpos + i] >>> bits[tmpbestb]) != 0) { exceptbuffer[c + nbrexcept] = i; exceptbuffer[c] = in[tmpinpos @@ -138,7 +137,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, } out[remember] = tmpbestb | (nbrexcept << 8) | (exceptsize << 16); - for (int k = 0; k < BlockSize; k += 32) { + for (int k = 0; k < BLOCK_SIZE; k += 32) { BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, bits[tmpbestb]); tmpoutpos += bits[tmpbestb]; @@ -149,12 +148,11 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, } @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos, int mynvalue) { if (inlength == 0) return; - final int mynvalue = in[inpos.get()]; - inpos.increment(); + mynvalue = Util.floorBy(mynvalue, BLOCK_SIZE); final int finalout = outpos.get() + mynvalue; while (outpos.get() != finalout) { int thissize = finalout > PageSize + outpos.get() ? PageSize @@ -168,7 +166,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, int tmpoutpos = outpos.get(); int tmpinpos = inpos.get(); - for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { + for (int run = 0; run < thissize / BLOCK_SIZE; ++run, tmpoutpos += BLOCK_SIZE) { final int b = in[tmpinpos] & 0xFF; final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; final int exceptsize = (in[tmpinpos] >>> 16); @@ -176,7 +174,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, S16.uncompress(in, tmpinpos, exceptsize, exceptbuffer, 0, 2 * cexcept); tmpinpos += exceptsize; - for (int k = 0; k < BlockSize; k += 32) { + for (int k = 0; k < BLOCK_SIZE; k += 32) { BitPacking.fastunpack(in, tmpinpos, out, tmpoutpos + k, bits[b]); tmpinpos += bits[b]; @@ -188,7 +186,26 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, outpos.set(tmpoutpos); inpos.set(tmpinpos); } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + inlength = inlength / BLOCK_SIZE * BLOCK_SIZE; + if (inlength == 0) + return; + out[outpos.get()] = inlength; + outpos.increment(); + headlessCompress(in, inpos, inlength, out, outpos); + } + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + if (inlength == 0) + return; + final int outlength = in[inpos.get()]; + inpos.increment(); + headlessUncompress(in, inpos, inlength, out, outpos, outlength); + } @Override public String toString() { return this.getClass().getSimpleName(); diff --git a/src/main/java/me/lemire/integercompression/OptPFDS16.java b/src/main/java/me/lemire/integercompression/OptPFDS16.java index 3f6a6cc..8355a59 100644 --- a/src/main/java/me/lemire/integercompression/OptPFDS16.java +++ b/src/main/java/me/lemire/integercompression/OptPFDS16.java @@ -7,6 +7,7 @@ package me.lemire.integercompression; + /** * OptPFD based on Simple16 by Yan et al. *

@@ -31,10 +32,10 @@ * * @author Daniel Lemire */ -public final class OptPFDS16 implements IntegerCODEC { +public final class OptPFDS16 implements IntegerCODEC,SkippableIntegerCODEC { final int PageSize; - final static int BlockSize = 128; - int[] exceptbuffer = new int[2 * BlockSize]; + final static int BLOCK_SIZE = 128; + int[] exceptbuffer = new int[2 * BLOCK_SIZE]; /** * Constructor for the OptPFDS16 CODEC. @@ -44,15 +45,13 @@ public OptPFDS16() { } @Override - public void compress(int[] in, IntWrapper inpos, int inlength, + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = inlength / BlockSize * BlockSize; + inlength = inlength / BLOCK_SIZE * BLOCK_SIZE; if (inlength == 0) return; final int finalinpos = inpos.get() + inlength; - out[outpos.get()] = inlength; - outpos.increment(); while (inpos.get() != finalinpos) { int thissize = finalinpos > PageSize + inpos.get() ? PageSize : (finalinpos - inpos.get()); @@ -69,7 +68,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, protected void getBestBFromData(int[] in, int pos, IntWrapper bestb, IntWrapper bestexcept) { - final int mb = Util.maxbits(in, pos, BlockSize); + final int mb = Util.maxbits(in, pos, BLOCK_SIZE); int mini = 0; if (mini + 28 < bits[invbits[mb]]) mini = bits[invbits[mb]] - 28; // 28 is the max for @@ -79,13 +78,13 @@ protected void getBestBFromData(int[] in, int pos, IntWrapper bestb, int exceptcounter = 0; for (int i = mini; i < bits.length - 1; ++i) { int tmpcounter = 0; - for (int k = pos; k < BlockSize + pos; ++k) + for (int k = pos; k < BLOCK_SIZE + pos; ++k) if ((in[k] >>> bits[i]) != 0) { ++tmpcounter; } - if (tmpcounter == BlockSize) + if (tmpcounter == BLOCK_SIZE) continue; // no need - for (int k = pos, c = 0; k < pos + BlockSize; ++k) + for (int k = pos, c = 0; k < pos + BLOCK_SIZE; ++k) if ((in[k] >>> bits[i]) != 0) { exceptbuffer[tmpcounter + c] = k - pos; exceptbuffer[c] = in[k] >>> bits[i]; @@ -113,7 +112,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, IntWrapper bestb = new IntWrapper(); IntWrapper bestexcept = new IntWrapper(); for (final int finalinpos = tmpinpos + thissize; tmpinpos - + BlockSize <= finalinpos; tmpinpos += BlockSize) { + + BLOCK_SIZE <= finalinpos; tmpinpos += BLOCK_SIZE) { getBestBFromData(in, tmpinpos, bestb, bestexcept); final int tmpbestb = bestb.get(); final int nbrexcept = bestexcept.get(); @@ -122,7 +121,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, tmpoutpos++; if (nbrexcept > 0) { int c = 0; - for (int i = 0; i < BlockSize; ++i) { + for (int i = 0; i < BLOCK_SIZE; ++i) { if ((in[tmpinpos + i] >>> bits[tmpbestb]) != 0) { exceptbuffer[c + nbrexcept] = i; exceptbuffer[c] = in[tmpinpos @@ -136,7 +135,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, } out[remember] = tmpbestb | (nbrexcept << 8) | (exceptsize << 16); - for (int k = 0; k < BlockSize; k += 32) { + for (int k = 0; k < BLOCK_SIZE; k += 32) { BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, bits[tmpbestb]); tmpoutpos += bits[tmpbestb]; @@ -147,12 +146,11 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, } @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos, int mynvalue) { if (inlength == 0) return; - final int mynvalue = in[inpos.get()]; - inpos.increment(); + mynvalue = Util.floorBy(mynvalue, BLOCK_SIZE); final int finalout = outpos.get() + mynvalue; while (outpos.get() != finalout) { int thissize = finalout > PageSize + outpos.get() ? PageSize @@ -166,7 +164,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, int tmpoutpos = outpos.get(); int tmpinpos = inpos.get(); - for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { + for (int run = 0; run < thissize / BLOCK_SIZE; ++run, tmpoutpos += BLOCK_SIZE) { final int b = in[tmpinpos] & 0xFF; final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; final int exceptsize = (in[tmpinpos] >>> 16); @@ -174,7 +172,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, S16.uncompress(in, tmpinpos, exceptsize, exceptbuffer, 0, 2 * cexcept); tmpinpos += exceptsize; - for (int k = 0; k < BlockSize; k += 32) { + for (int k = 0; k < BLOCK_SIZE; k += 32) { BitPacking.fastunpack(in, tmpinpos, out, tmpoutpos + k, bits[b]); tmpinpos += bits[b]; @@ -186,7 +184,26 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, outpos.set(tmpoutpos); inpos.set(tmpinpos); } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + inlength = inlength / BLOCK_SIZE * BLOCK_SIZE; + if (inlength == 0) + return; + out[outpos.get()] = inlength; + outpos.increment(); + headlessCompress(in, inpos, inlength, out, outpos); + } + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + if (inlength == 0) + return; + final int outlength = in[inpos.get()]; + inpos.increment(); + headlessUncompress(in, inpos, inlength, out, outpos, outlength); + } @Override public String toString() { return this.getClass().getSimpleName(); diff --git a/src/main/java/me/lemire/integercompression/OptPFDS9.java b/src/main/java/me/lemire/integercompression/OptPFDS9.java index 75cf4be..6b890aa 100644 --- a/src/main/java/me/lemire/integercompression/OptPFDS9.java +++ b/src/main/java/me/lemire/integercompression/OptPFDS9.java @@ -7,6 +7,7 @@ package me.lemire.integercompression; + /** * OptPFD based on Simple9 by Yan et al. *

@@ -31,10 +32,10 @@ * * @author Daniel Lemire */ -public final class OptPFDS9 implements IntegerCODEC { +public final class OptPFDS9 implements IntegerCODEC, SkippableIntegerCODEC { final int PageSize; - final static int BlockSize = 128; - int[] exceptbuffer = new int[2 * BlockSize]; + final static int BLOCK_SIZE = 128; + int[] exceptbuffer = new int[2 * BLOCK_SIZE]; /** * Constructor for the OptPFDS9 CODEC. @@ -44,15 +45,13 @@ public OptPFDS9() { } @Override - public void compress(int[] in, IntWrapper inpos, int inlength, + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = inlength / BlockSize * BlockSize; + inlength = inlength / BLOCK_SIZE * BLOCK_SIZE; if (inlength == 0) return; final int finalinpos = inpos.get() + inlength; - out[outpos.get()] = inlength; - outpos.increment(); while (inpos.get() != finalinpos) { int thissize = finalinpos > PageSize + inpos.get() ? PageSize : (finalinpos - inpos.get()); @@ -69,7 +68,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, protected void getBestBFromData(int[] in, int pos, IntWrapper bestb, IntWrapper bestexcept) { - final int mb = Util.maxbits(in, pos, BlockSize); + final int mb = Util.maxbits(in, pos, BLOCK_SIZE); int mini = 0; if (mini + 28 < bits[invbits[mb]]) mini = bits[invbits[mb]] - 28; // 28 is the max for @@ -79,13 +78,13 @@ protected void getBestBFromData(int[] in, int pos, IntWrapper bestb, int exceptcounter = 0; for (int i = mini; i < bits.length - 1; ++i) { int tmpcounter = 0; - for (int k = pos; k < BlockSize + pos; ++k) + for (int k = pos; k < BLOCK_SIZE + pos; ++k) if ((in[k] >>> bits[i]) != 0) { ++tmpcounter; } - if (tmpcounter == BlockSize) + if (tmpcounter == BLOCK_SIZE) continue; // no need - for (int k = pos, c = 0; k < pos + BlockSize; ++k) + for (int k = pos, c = 0; k < pos + BLOCK_SIZE; ++k) if ((in[k] >>> bits[i]) != 0) { exceptbuffer[tmpcounter + c] = k - pos; exceptbuffer[c] = in[k] >>> bits[i]; @@ -113,7 +112,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, IntWrapper bestb = new IntWrapper(); IntWrapper bestexcept = new IntWrapper(); for (final int finalinpos = tmpinpos + thissize; tmpinpos - + BlockSize <= finalinpos; tmpinpos += BlockSize) { + + BLOCK_SIZE <= finalinpos; tmpinpos += BLOCK_SIZE) { getBestBFromData(in, tmpinpos, bestb, bestexcept); final int tmpbestb = bestb.get(); final int nbrexcept = bestexcept.get(); @@ -122,7 +121,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, tmpoutpos++; if (nbrexcept > 0) { int c = 0; - for (int i = 0; i < BlockSize; ++i) { + for (int i = 0; i < BLOCK_SIZE; ++i) { if ((in[tmpinpos + i] >>> bits[tmpbestb]) != 0) { exceptbuffer[c + nbrexcept] = i; exceptbuffer[c] = in[tmpinpos @@ -136,7 +135,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, } out[remember] = tmpbestb | (nbrexcept << 8) | (exceptsize << 16); - for (int k = 0; k < BlockSize; k += 32) { + for (int k = 0; k < BLOCK_SIZE; k += 32) { BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, bits[tmpbestb]); tmpoutpos += bits[tmpbestb]; @@ -147,12 +146,11 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, } @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos, int mynvalue) { if (inlength == 0) return; - final int mynvalue = in[inpos.get()]; - inpos.increment(); + mynvalue = Util.floorBy(mynvalue, BLOCK_SIZE); final int finalout = outpos.get() + mynvalue; while (outpos.get() != finalout) { int thissize = finalout > PageSize + outpos.get() ? PageSize @@ -166,7 +164,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, int tmpoutpos = outpos.get(); int tmpinpos = inpos.get(); - for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { + for (int run = 0; run < thissize / BLOCK_SIZE; ++run, tmpoutpos += BLOCK_SIZE) { final int b = in[tmpinpos] & 0xFF; final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; final int exceptsize = (in[tmpinpos] >>> 16); @@ -174,7 +172,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, S9.uncompress(in, tmpinpos, exceptsize, exceptbuffer, 0, 2 * cexcept); tmpinpos += exceptsize; - for (int k = 0; k < BlockSize; k += 32) { + for (int k = 0; k < BLOCK_SIZE; k += 32) { BitPacking.fastunpack(in, tmpinpos, out, tmpoutpos + k, bits[b]); tmpinpos += bits[b]; @@ -186,7 +184,27 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, outpos.set(tmpoutpos); inpos.set(tmpinpos); } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + inlength = inlength / BLOCK_SIZE * BLOCK_SIZE; + if (inlength == 0) + return; + out[outpos.get()] = inlength; + outpos.increment(); + headlessCompress(in, inpos, inlength, out, outpos); + } + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + if (inlength == 0) + return; + final int outlength = in[inpos.get()]; + inpos.increment(); + headlessUncompress(in, inpos, inlength, out, outpos, outlength); + } + @Override public String toString() { return this.getClass().getSimpleName(); diff --git a/src/main/java/me/lemire/integercompression/Simple16.java b/src/main/java/me/lemire/integercompression/Simple16.java index 5b6098e..9562c3a 100644 --- a/src/main/java/me/lemire/integercompression/Simple16.java +++ b/src/main/java/me/lemire/integercompression/Simple16.java @@ -2,6 +2,7 @@ + /** * This is an implementation of the popular Simple16 scheme. It is limited to * 28-bit integers (between 0 and 2^28-1). @@ -13,13 +14,12 @@ * Adapted by D. Lemire from the Apache Lucene project. *

*/ -public final class Simple16 implements IntegerCODEC { +public final class Simple16 implements IntegerCODEC,SkippableIntegerCODEC { - public void compress(int[] in, IntWrapper inpos, int inlength, int out[], + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int out[], IntWrapper outpos) { int i_inpos = inpos.get(); int i_outpos = outpos.get(); - out[i_outpos++] = inlength; final int finalin = i_inpos + inlength; while (i_inpos < finalin) { int inoffset = compressblock(out, i_outpos++, in, i_inpos, inlength); @@ -100,10 +100,9 @@ public static final int decompressblock(int[] out, int outOffset, int[] in, @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos,int num) { int i_inpos = inpos.get(); - int num = in[i_inpos++]; int i_outpos = outpos.get(); while (num > 0) { final int howmany = decompressblock(out, i_outpos, in, i_inpos, num); @@ -156,6 +155,31 @@ private static int[][] shiftme(int[][] x) { } return answer; } + + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + if (inlength == 0) + return; + out[outpos.get()] = inlength; + outpos.increment(); + headlessCompress(in, inpos, inlength, out, outpos); + } + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + if (inlength == 0) + return; + final int outlength = in[inpos.get()]; + inpos.increment(); + headlessUncompress(in, inpos, inlength, out, outpos, outlength); + + } + @Override + public String toString() { + return this.getClass().getSimpleName(); + } private static final int S16_NUMSIZE = 16; private static final int S16_BITSSIZE = 28; diff --git a/src/main/java/me/lemire/integercompression/Simple9.java b/src/main/java/me/lemire/integercompression/Simple9.java index 073521c..5703b04 100644 --- a/src/main/java/me/lemire/integercompression/Simple9.java +++ b/src/main/java/me/lemire/integercompression/Simple9.java @@ -7,6 +7,7 @@ package me.lemire.integercompression; + /** * This is an implementation of the popular Simple9 scheme. * It is limited to 28-bit integers (between 0 and 2^28-1). @@ -17,13 +18,12 @@ * @author Daniel Lemire * */ -public final class Simple9 implements IntegerCODEC { +public final class Simple9 implements IntegerCODEC, SkippableIntegerCODEC { @Override - public void compress(int[] in, IntWrapper inpos, int inlength, + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int out[], IntWrapper outpos) { int tmpoutpos = outpos.get(); int currentPos = inpos.get(); - out[tmpoutpos++] = inlength; final int finalin = currentPos + inlength; outer: while (currentPos < finalin - 28) { mainloop: for (int selector = 0; selector < 8; selector++) { @@ -81,11 +81,11 @@ public void compress(int[] in, IntWrapper inpos, int inlength, } @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos, int outlength) { int currentPos = outpos.get(); int tmpinpos = inpos.get(); - final int finalout = currentPos + in[tmpinpos++]; + final int finalout = currentPos + outlength; while (currentPos < finalout - 28) { int val = in[tmpinpos++]; int header = val >>> 28; @@ -282,7 +282,26 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, inpos.set(tmpinpos); } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + if (inlength == 0) + return; + out[outpos.get()] = inlength; + outpos.increment(); + headlessCompress(in, inpos, inlength, out, outpos); + } + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + if (inlength == 0) + return; + final int outlength = in[inpos.get()]; + inpos.increment(); + headlessUncompress(in, inpos, inlength, out, outpos, outlength); + + } private final static int bitLength[] = { 1, 2, 3, 4, 5, 7, 9, 14, 28 }; private final static int codeNum[] = { 28, 14, 9, 7, 5, 4, 3, 2, 1 }; diff --git a/src/main/java/me/lemire/integercompression/skippable/SkippableComposition.java b/src/main/java/me/lemire/integercompression/SkippableComposition.java similarity index 91% rename from src/main/java/me/lemire/integercompression/skippable/SkippableComposition.java rename to src/main/java/me/lemire/integercompression/SkippableComposition.java index 45d0ee1..ed0f0de 100644 --- a/src/main/java/me/lemire/integercompression/skippable/SkippableComposition.java +++ b/src/main/java/me/lemire/integercompression/SkippableComposition.java @@ -4,9 +4,8 @@ * * (c) Daniel Lemire, http://lemire.me/en/ */ -package me.lemire.integercompression.skippable; +package me.lemire.integercompression; -import me.lemire.integercompression.*; /** * Helper class to compose schemes. @@ -56,7 +55,7 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] o @Override public String toString() { - return F1.getClass().getName() + "+" + F2.getClass().getName(); + return F1.toString() + "+" + F2.toString(); } } diff --git a/src/main/java/me/lemire/integercompression/skippable/SkippableIntegerCODEC.java b/src/main/java/me/lemire/integercompression/SkippableIntegerCODEC.java similarity index 96% rename from src/main/java/me/lemire/integercompression/skippable/SkippableIntegerCODEC.java rename to src/main/java/me/lemire/integercompression/SkippableIntegerCODEC.java index 50594c3..c10d2f0 100644 --- a/src/main/java/me/lemire/integercompression/skippable/SkippableIntegerCODEC.java +++ b/src/main/java/me/lemire/integercompression/SkippableIntegerCODEC.java @@ -5,9 +5,8 @@ * (c) Daniel Lemire, http://lemire.me/en/ */ -package me.lemire.integercompression.skippable; +package me.lemire.integercompression; -import me.lemire.integercompression.*; /** * Interface describing a standard CODEC to compress integers. This is a diff --git a/src/main/java/me/lemire/integercompression/VariableByte.java b/src/main/java/me/lemire/integercompression/VariableByte.java index 69148bd..73719e9 100644 --- a/src/main/java/me/lemire/integercompression/VariableByte.java +++ b/src/main/java/me/lemire/integercompression/VariableByte.java @@ -10,8 +10,6 @@ import java.nio.ByteOrder; import java.nio.IntBuffer; -import me.lemire.integercompression.skippable.SkippableIntegerCODEC; - /** * Implementation of variable-byte. For best performance, use it using the * ByteIntegerCODEC interface. diff --git a/src/main/java/me/lemire/integercompression/skippable/SkippableFastPFOR.java b/src/main/java/me/lemire/integercompression/skippable/SkippableFastPFOR.java deleted file mode 100644 index 419aba9..0000000 --- a/src/main/java/me/lemire/integercompression/skippable/SkippableFastPFOR.java +++ /dev/null @@ -1,298 +0,0 @@ -/** - * This is code is released under the - * Apache License Version 2.0 http://www.apache.org/licenses/. - * - * (c) Daniel Lemire, http://lemire.me/en/ - */ -package me.lemire.integercompression.skippable; - -import java.nio.ByteBuffer; -import java.util.Arrays; - -import me.lemire.integercompression.*; - -/** - * This is a patching scheme designed for speed. It encodes integers in blocks - * of 128 integers within pages of up to 65536 integers. Note that it is - * important, to get good compression and good performance, to use sizeable - * blocks (greater than 1024 integers). For arrays containing a number of - * integers that is not divisible by 128, you should use it in conjunction with - * another CODEC: - * - * IntegerCODEC ic = new Composition(new FastPFOR(), new VariableByte()). - *

- * For details, please see - *

- *

- * Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second - * through vectorization Software: Practice & Experience http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract http://arxiv.org/abs/1209.2137 - *

- *

- * For sufficiently compressible and long arrays, it is faster and better than - * other PFOR schemes. - *

- * - * Note that this does not use differential coding: if you are working on sorted - * lists, use IntegratedFastPFOR instead. - * - * For multi-threaded applications, each thread should use its own FastPFOR - * object. - * - * @author Daniel Lemire - */ -public final class SkippableFastPFOR implements SkippableIntegerCODEC { - final static int BLOCK_SIZE = 128; - final static int OVERHEAD_OF_EACH_EXCEPT = 8; - final static int DEFAULT_PAGE_SIZE = 65536; - - int pageSize; - final int[][] dataTobePacked = new int[33][]; - final ByteBuffer byteContainer; - - // Working area for compress and uncompress. - int[] dataPointers; - int[] freqs; - byte[] bestbbestcexceptmaxb; - - /** - * Construct the FastPFOR CODEC. - * - * @param pagesize - * the desired page size (for expert use) - */ - public SkippableFastPFOR(int pagesize) { - pageSize = pagesize; - // Initiate arrrays. - byteContainer = ByteBuffer.allocateDirect(3 * pageSize - / BLOCK_SIZE + pageSize); - for (int k = 1; k < dataTobePacked.length; ++k) - dataTobePacked[k] = new int[pageSize / 32 * 4]; // heuristic - } - - /** - * Construct the fastPFOR CODEC with default parameters. - */ - public SkippableFastPFOR() { - this(DEFAULT_PAGE_SIZE); - } - - /** - * Compress data in blocks of 128 integers (if fewer than 128 integers - * are provided, nothing is done). - * - * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) - */ - @Override - public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - inlength = Util.floorBy(inlength, 128); - if (inlength == 0) - return; - - // Allocate memory for working area. - dataPointers = new int[33]; - freqs = new int[33]; - bestbbestcexceptmaxb = new byte[3]; - - final int finalinpos = inpos.get() + inlength; - while (inpos.get() != finalinpos) { - int thissize = Math.min(pageSize, - finalinpos - inpos.get()); - encodePage(in, inpos, thissize, out, outpos); - } - - dataPointers = null; - freqs = null; - bestbbestcexceptmaxb = null; - } - - private void getBestBFromData(int[] in, int pos) { - Arrays.fill(freqs, 0); - for (int k = pos, k_end = pos + BLOCK_SIZE; k < k_end; ++k) { - freqs[Util.bits(in[k])]++; - } - bestbbestcexceptmaxb[0] = 32; - while (freqs[bestbbestcexceptmaxb[0]] == 0) - bestbbestcexceptmaxb[0]--; - bestbbestcexceptmaxb[2] = bestbbestcexceptmaxb[0]; - int bestcost = bestbbestcexceptmaxb[0] * BLOCK_SIZE; - byte cexcept = 0; - bestbbestcexceptmaxb[1] = cexcept; - for (int b = bestbbestcexceptmaxb[0] - 1; b >= 0; --b) { - cexcept += freqs[b + 1]; - if (cexcept < 0) - break; - // the extra 8 is the cost of storing maxbits - int thiscost = cexcept * OVERHEAD_OF_EACH_EXCEPT - + cexcept * (bestbbestcexceptmaxb[2] - b) + b - * BLOCK_SIZE + 8; - if (thiscost < bestcost) { - bestcost = thiscost; - bestbbestcexceptmaxb[0] = (byte) b; - bestbbestcexceptmaxb[1] = cexcept; - } - } - } - - private void encodePage(int[] in, IntWrapper inpos, int thissize, - int[] out, IntWrapper outpos) { - final int headerpos = outpos.get(); - outpos.increment(); - int tmpoutpos = outpos.get(); - - // Clear working area. - Arrays.fill(dataPointers, 0); - // Arrays.fill(bestbbestcexceptmaxb, (byte)0);//DL:unncessary - byteContainer.clear(); - - int tmpinpos = inpos.get(); - for (final int finalinpos = tmpinpos + thissize - BLOCK_SIZE; tmpinpos <= finalinpos; tmpinpos += BLOCK_SIZE) { - getBestBFromData(in, tmpinpos); - final int tmpbestb = bestbbestcexceptmaxb[0]; - byteContainer.put(bestbbestcexceptmaxb[0]); - byteContainer.put(bestbbestcexceptmaxb[1]); - if (bestbbestcexceptmaxb[1] > 0) { - byteContainer.put(bestbbestcexceptmaxb[2]); - final int index = bestbbestcexceptmaxb[2] - - bestbbestcexceptmaxb[0]; - if (dataPointers[index] - + bestbbestcexceptmaxb[1] >= dataTobePacked[index].length) { - int newsize = 2 * (dataPointers[index] + bestbbestcexceptmaxb[1]); - // make sure it is a multiple of 32 - newsize = Util - .floorBy(newsize + 31, 32); - dataTobePacked[index] = Arrays.copyOf( - dataTobePacked[index], newsize); - } - for (int k = 0; k < BLOCK_SIZE; ++k) { - if ((in[k + tmpinpos] >>> bestbbestcexceptmaxb[0]) != 0) { - // we have an exception - byteContainer.put((byte) k); - dataTobePacked[index][dataPointers[index]++] = in[k - + tmpinpos] >>> tmpbestb; - } - } - - } - for (int k = 0; k < 128; k += 32) { - BitPacking.fastpack(in, tmpinpos + k, out, - tmpoutpos, tmpbestb); - tmpoutpos += tmpbestb; - } - } - inpos.set(tmpinpos); - out[headerpos] = tmpoutpos - headerpos; - final int bytesize = byteContainer.position(); - while ((byteContainer.position() & 3) != 0) - byteContainer.put((byte) 0); - out[tmpoutpos++] = bytesize; - final int howmanyints = byteContainer.position() / 4; - byteContainer.flip(); - byteContainer.asIntBuffer().get(out, tmpoutpos, howmanyints); - tmpoutpos += howmanyints; - int bitmap = 0; - for (int k = 1; k <= 32; ++k) { - if (dataPointers[k] != 0) - bitmap |= (1 << (k - 1)); - } - out[tmpoutpos++] = bitmap; - for (int k = 1; k <= 32; ++k) { - if (dataPointers[k] != 0) { - out[tmpoutpos++] = dataPointers[k];// size - for (int j = 0; j < dataPointers[k]; j += 32) { - BitPacking.fastpack(dataTobePacked[k], - j, out, tmpoutpos, k); - tmpoutpos += k; - } - } - } - outpos.set(tmpoutpos); - } - - /** - * Uncompress data in blocks of 128 integers. In this particular case, - * the inlength parameter is ignored: it is deduced from the compressed - * data. - * - * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) - */ - @Override - public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos, int num) { - if (inlength == 0) - return; - - int mynvalue = num / BLOCK_SIZE * BLOCK_SIZE; - - dataPointers = new int[33]; - - int finalout = outpos.get() + mynvalue; - while (outpos.get() != finalout) { - int thissize = Math.min(pageSize, - finalout - outpos.get()); - decodePage(in, inpos, out, outpos, thissize); - } - - dataPointers = null; - } - - private void decodePage(int[] in, IntWrapper inpos, int[] out, - IntWrapper outpos, int thissize) { - final int initpos = inpos.get(); - final int wheremeta = in[inpos.get()]; - inpos.increment(); - int inexcept = initpos + wheremeta; - final int bytesize = in[inexcept++]; - byteContainer.clear(); - byteContainer.asIntBuffer().put(in, inexcept, (bytesize + 3) / 4); - inexcept += (bytesize + 3)/ 4; - - final int bitmap = in[inexcept++]; - for (int k = 1; k <= 32; ++k) { - if ((bitmap & (1 << (k - 1))) != 0) { - int size = in[inexcept++]; - if (dataTobePacked[k].length < size) - dataTobePacked[k] = new int[Util - .floorBy(size + 31, 32)]; - for (int j = 0; j < size; j += 32) { - BitPacking.fastunpack(in, inexcept, - dataTobePacked[k], j, k); - inexcept += k; - } - } - } - Arrays.fill(dataPointers, 0); - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); - - for (int run = 0, run_end = thissize / BLOCK_SIZE; run < run_end; ++run, tmpoutpos += BLOCK_SIZE) { - final byte b = byteContainer.get(); - final byte cexcept = byteContainer.get(); - for (int k = 0; k < 128; k += 32) { - BitPacking.fastunpack(in, tmpinpos, out, - tmpoutpos + k, b); - tmpinpos += b; - } - if (cexcept > 0) { - final byte maxbits = byteContainer.get(); - final int index = maxbits - b; - for (int k = 0; k < cexcept; ++k) { - final byte pos = byteContainer.get(); - final int exceptvalue = dataTobePacked[index][dataPointers[index]++]; - out[pos + tmpoutpos] |= exceptvalue << b; - } - - } - } - outpos.set(tmpoutpos); - inpos.set(inexcept); - } - - @Override - public String toString() { - return this.getClass().getSimpleName(); - } -} diff --git a/src/main/java/me/lemire/integercompression/skippable/SkippableNewPFD.java b/src/main/java/me/lemire/integercompression/skippable/SkippableNewPFD.java deleted file mode 100644 index b3a7af8..0000000 --- a/src/main/java/me/lemire/integercompression/skippable/SkippableNewPFD.java +++ /dev/null @@ -1,176 +0,0 @@ -/** - * This is code is released under the - * Apache License Version 2.0 http://www.apache.org/licenses/. - * - * (c) Daniel Lemire, http://lemire.me/en/ - */ - -package me.lemire.integercompression.skippable; - -import me.lemire.integercompression.*; - -/** - * NewPFD/NewPFOR: fast patching scheme by Yan et al. - *

- * Follows: - *

- *

- * H. Yan, S. Ding, T. Suel, Inverted index compression and query processing - * with optimized document ordering, in: WWW 09, 2009, pp. 401-410. - *

- * using Simple16 as the secondary coder. - * - * It encodes integers in blocks of 128 integers. For arrays containing an - * arbitrary number of integers, you should use it in conjunction with another - * CODEC: - * - *
- * IntegerCODEC ic = 
- *  new Composition(new NewPDF(), new VariableByte()).
- * 
- * - * Note that this does not use differential coding: if you are working on sorted - * lists, you must compute the deltas separately. (Yes, this is true even though - * the "D" at the end of the name probably stands for delta.) - * - * For multi-threaded applications, each thread should use its own NewPFD - * object. - * - * @author Daniel Lemire - */ -public final class SkippableNewPFD implements SkippableIntegerCODEC { - final int PageSize; - final static int BlockSize = 128; - - int[] exceptbuffer = new int[2 * BlockSize]; - - /** - * Constructor for the NewPFD CODEC. - */ - public SkippableNewPFD() { - PageSize = 65536; - } - - @Override - public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - inlength = inlength / BlockSize * BlockSize; - - final int finalinpos = inpos.get() + inlength; - while (inpos.get() != finalinpos) { - int thissize = finalinpos > PageSize + inpos.get() ? PageSize - : (finalinpos - inpos.get()); - encodePage(in, inpos, thissize, out, outpos); - } - - } - - private static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 16, 20, 32 }; - private static final int[] invbits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16 }; - - private static void getBestBFromData(int[] in, int pos, IntWrapper bestb, - IntWrapper bestexcept) { - final int mb = Util.maxbits(in, pos, BlockSize); - int mini = 0; - if (mini + 28 < bits[invbits[mb]]) - mini = bits[invbits[mb]] - 28; // 28 is the max for exceptions - int besti = bits.length - 1; - int exceptcounter = 0; - for (int i = mini; i < bits.length - 1; ++i) { - int tmpcounter = 0; - for (int k = pos; k < BlockSize + pos; ++k) - if ((in[k] >>> bits[i]) != 0) - ++tmpcounter; - if (tmpcounter * 10 <= BlockSize) { - besti = i; - exceptcounter = tmpcounter; - break; - } - } - bestb.set(besti); - bestexcept.set(exceptcounter); - } - - private void encodePage(int[] in, IntWrapper inpos, int thissize, - int[] out, IntWrapper outpos) { - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); - IntWrapper bestb = new IntWrapper(); - IntWrapper bestexcept = new IntWrapper(); - for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { - getBestBFromData(in, tmpinpos, bestb, bestexcept); - int tmpbestb = bestb.get(); - int nbrexcept = bestexcept.get(); - int exceptsize = 0; - int remember = tmpoutpos; - tmpoutpos++; - if (nbrexcept > 0) { - for (int i = 0, c = 0; i < BlockSize; ++i) { - if ((in[tmpinpos + i] >>> bits[tmpbestb]) != 0) { - exceptbuffer[c + nbrexcept] = i; - exceptbuffer[c] = in[tmpinpos + i] >>> bits[tmpbestb]; - ++c; - } - } - exceptsize = S16.compress(exceptbuffer, 0, 2 * nbrexcept, out, - tmpoutpos); - tmpoutpos += exceptsize; - } - out[remember] = tmpbestb | (nbrexcept << 8) | (exceptsize << 16); - for (int k = 0; k < BlockSize; k += 32) { - BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, - bits[tmpbestb]); - tmpoutpos += bits[tmpbestb]; - } - } - inpos.set(tmpinpos); - outpos.set(tmpoutpos); - } - - @Override - public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos, int num) { - int mynvalue = num / BlockSize * BlockSize; - int finalout = outpos.get() + mynvalue; - while (outpos.get() != finalout) { - int thissize = finalout > PageSize + outpos.get() ? PageSize - : (finalout - outpos.get()); - decodePage(in, inpos, out, outpos, thissize); - } - } - - private void decodePage(int[] in, IntWrapper inpos, int[] out, - IntWrapper outpos, int thissize) { - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); - - for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { - final int b = in[tmpinpos] & 0xFF; - final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; - final int exceptsize = (in[tmpinpos] >>> 16); - ++tmpinpos; - S16.uncompress(in, tmpinpos, exceptsize, exceptbuffer, 0, - 2 * cexcept); - tmpinpos += exceptsize; - for (int k = 0; k < BlockSize; k += 32) { - BitPacking - .fastunpack(in, tmpinpos, out, tmpoutpos + k, bits[b]); - tmpinpos += bits[b]; - } - for (int k = 0; k < cexcept; ++k) { - out[tmpoutpos + exceptbuffer[k + cexcept]] |= (exceptbuffer[k] << bits[b]); - } - } - outpos.set(tmpoutpos); - inpos.set(tmpinpos); - } - - @Override - public String toString() { - return this.getClass().getName(); - } - -} diff --git a/src/main/java/me/lemire/integercompression/skippable/SkippableOptPFD.java b/src/main/java/me/lemire/integercompression/skippable/SkippableOptPFD.java deleted file mode 100644 index 1807345..0000000 --- a/src/main/java/me/lemire/integercompression/skippable/SkippableOptPFD.java +++ /dev/null @@ -1,196 +0,0 @@ -/** - * This is code is released under the - * Apache License Version 2.0 http://www.apache.org/licenses/. - * - * (c) Daniel Lemire, http://lemire.me/en/ - */ -package me.lemire.integercompression.skippable; - -import me.lemire.integercompression.*; - -/** - * OptPFD: fast patching scheme by Yan et al. - *

- * Follows: - *

- *

- * H. Yan, S. Ding, T. Suel, Inverted index compression and query processing - * with optimized document ordering, in: WWW 09, 2009, pp. 401-410. - *

- * using Simple16 as the secondary coder. - * - * It encodes integers in blocks of 128 integers. For arrays containing an - * arbitrary number of integers, you should use it in conjunction with another - * CODEC: - * - *
- * IntegerCODEC ic = new Composition(new OptPFD(), new VariableByte()).
- * 
- * - * Note that this does not use differential coding: if you are working on sorted - * lists, you must compute the deltas separately. (Yes, this is true even though - * the "D" at the end of the name probably stands for delta.) - * - * For multi-threaded applications, each thread should use its own OptPFD - * object. - * - * @author Daniel Lemire - */ -public final class SkippableOptPFD implements SkippableIntegerCODEC { - final int PageSize; - final static int BlockSize = 128; - - int[] exceptbuffer = new int[2 * BlockSize]; - int[] sillybuffer = new int[2 * BlockSize]; - - /** - * - */ - public SkippableOptPFD() { - PageSize = 65536; - } - - @Override - public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - // Util.assertTrue(inpos.get()+inlength <= in.length); - inlength = inlength / BlockSize * BlockSize; - - final int finalinpos = inpos.get() + inlength; - // out[outpos.get()] = inlength; - // outpos.increment(); - while (inpos.get() != finalinpos) { - int thissize = finalinpos > PageSize + inpos.get() ? PageSize - : (finalinpos - inpos.get()); - encodePage(in, inpos, thissize, out, outpos); - } - - } - - private static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 16, 20, 32 }; - private static final int[] invbits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16 }; - - void getBestBFromData(int[] in, int pos, IntWrapper bestb, - IntWrapper bestexcept) { - final int mb = Util.maxbits(in, pos, BlockSize); - int mini = 0; - if (mini + 28 < bits[invbits[mb]]) - mini = bits[invbits[mb]] - 28; // 28 is the max for exceptions - int besti = bits.length - 1; - int bestcost = bits[besti] * 4; - int exceptcounter = 0; - for (int i = mini; i < bits.length - 1; ++i) { - int tmpcounter = 0; - for (int k = pos; k < BlockSize + pos; ++k) - if ((in[k] >>> bits[i]) != 0) { - ++tmpcounter; - } - if (tmpcounter == BlockSize) - continue; // no need - for (int k = pos, c = 0; k < pos + BlockSize; ++k) - if ((in[k] >>> bits[i]) != 0) { - exceptbuffer[tmpcounter + c] = k - pos; - exceptbuffer[c] = in[k] >>> bits[i]; - ++c; - } - - final int thiscost = bits[i] * 4 - + S16.estimatecompress(exceptbuffer, 0, 2 * tmpcounter); - if (thiscost <= bestcost) { - bestcost = thiscost; - besti = i; - exceptcounter = tmpcounter; - } - } - - bestb.set(besti); - bestexcept.set(exceptcounter); - } - - private void encodePage(int[] in, IntWrapper inpos, int thissize, - int[] out, IntWrapper outpos) { - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); - IntWrapper bestb = new IntWrapper(); - IntWrapper bestexcept = new IntWrapper(); - for (final int finalinpos = tmpinpos + thissize; tmpinpos + BlockSize <= finalinpos; tmpinpos += BlockSize) { - getBestBFromData(in, tmpinpos, bestb, bestexcept); - int tmpbestb = bestb.get(); - int nbrexcept = bestexcept.get(); - int exceptsize = 0; - int remember = tmpoutpos; - tmpoutpos++; - if (nbrexcept > 0) { - int c = 0; - for (int i = 0; i < BlockSize; ++i) { - if ((in[tmpinpos + i] >>> bits[tmpbestb]) != 0) { - exceptbuffer[c + nbrexcept] = i; - exceptbuffer[c] = in[tmpinpos + i] >>> bits[tmpbestb]; - ++c; - } - } - exceptsize = S16.compress(exceptbuffer, 0, 2 * nbrexcept, out, - tmpoutpos); - tmpoutpos += exceptsize; - } - out[remember] = tmpbestb | (nbrexcept << 8) | (exceptsize << 16); - for (int k = 0; k < BlockSize; k += 32) { - BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, - bits[tmpbestb]); - tmpoutpos += bits[tmpbestb]; - } - } - inpos.set(tmpinpos); - outpos.set(tmpoutpos); - } - - @Override - public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos, int num) { - // Util.assertTrue(inpos.get()+inlength <= in.length); - int mynvalue = num / BlockSize * BlockSize; - // int mynvalue = in[inpos.get()]; - // inpos.increment(); - int finalout = outpos.get() + mynvalue; - while (outpos.get() != finalout) { - int thissize = finalout > PageSize + outpos.get() ? PageSize - : (finalout - outpos.get()); - decodePage(in, inpos, out, outpos, thissize); - } - } - - private void decodePage(int[] in, IntWrapper inpos, int[] out, - IntWrapper outpos, int thissize) { - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); - - for (int run = 0; run < thissize / BlockSize; ++run, tmpoutpos += BlockSize) { - final int b = in[tmpinpos] & 0xFF; - final int cexcept = (in[tmpinpos] >>> 8) & 0xFF; - final int exceptsize = (in[tmpinpos] >>> 16); - ++tmpinpos; - S16.uncompress(in, tmpinpos, exceptsize, exceptbuffer, 0, - 2 * cexcept); - tmpinpos += exceptsize; - for (int k = 0; k < BlockSize; k += 32) { - BitPacking - .fastunpack(in, tmpinpos, out, tmpoutpos + k, bits[b]); - tmpinpos += bits[b]; - } - for (int k = 0; k < cexcept; ++k) { - out[tmpoutpos + exceptbuffer[k + cexcept]] |= (exceptbuffer[k] << bits[b]); - } - } - outpos.set(tmpoutpos); - inpos.set(tmpinpos); - } - - @Override - public String toString() { - return this.getClass().getName(); - } - -} diff --git a/src/main/java/me/lemire/integercompression/skippable/SkippableSimple16.java b/src/main/java/me/lemire/integercompression/skippable/SkippableSimple16.java deleted file mode 100644 index 932ce49..0000000 --- a/src/main/java/me/lemire/integercompression/skippable/SkippableSimple16.java +++ /dev/null @@ -1,209 +0,0 @@ -package me.lemire.integercompression.skippable; - -import me.lemire.integercompression.*; - -/** - * This is an implementation of the popular Simple16 scheme. It is limited to - * 28-bit integers (between 0 and 2^28-1). - * - * Note that this does not use differential coding: if you are working on sorted - * lists, you must compute the deltas separately. - * - *

- * Adapted by D. Lemire from the Apache Lucene project. - *

- * - */ -public final class SkippableSimple16 implements SkippableIntegerCODEC { - - public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int out[], - IntWrapper outpos) { - int i_inpos = inpos.get(); - int i_outpos = outpos.get(); - final int finalin = i_inpos + inlength; - while (i_inpos < finalin) { - int inoffset = compressblock(out, i_outpos++, in, i_inpos, inlength); - if (inoffset == -1) - throw new RuntimeException("Too big a number"); - i_inpos += inoffset; - inlength -= inoffset; - } - inpos.set(i_inpos); - outpos.set(i_outpos); - } - - protected static int estimatecompress(int[] in, int currentPos, int inlength) { - final int finalin = currentPos + inlength; - int counter = 0; - while (currentPos < finalin) { - int inoffset = fakecompressblock(in, currentPos, inlength); - if (inoffset == -1) - throw new RuntimeException("Too big a number"); - currentPos += inoffset; - inlength -= inoffset; - ++counter; - } - return counter; - } - - /** - * Compress an integer array using Simple16 - * - * @param out - * the compressed output - * @param outOffset - * the offset of the output in the number of integers - * @param in - * the integer input array - * @param inOffset - * the offset of the input in the number of integers - * @param n - * the number of elements to be compressed - * @return the number of compressed integers - */ - public static final int compressblock(int[] out, int outOffset, int[] in, - int inOffset, int n) { - int numIdx, j, num, bits; - for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { - out[outOffset] = numIdx << S16_BITSSIZE; - num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; - - for (j = 0, bits = 0; (j < num) - && (in[inOffset + j] < SHIFTED_S16_BITS[numIdx][j]);) { - out[outOffset] |= (in[inOffset + j] << bits); - bits += S16_BITS[numIdx][j]; - j++; - } - - if (j == num) { - return num; - } - } - - return -1; - } - - protected static final int fakecompressblock(int[] in, int inOffset, int n) { - int numIdx, j, num; - for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { - num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; - - for (j = 0; (j < num) - && (in[inOffset + j] < SHIFTED_S16_BITS[numIdx][j]);) { - j++; - } - - if (j == num) { - return num; - } - } - - return -1; - } - - /** - * Decompress an integer array using Simple16 - * - * @param out - * the decompressed output - * @param outOffset - * the offset of the output in the number of integers - * @param in - * the compressed input array - * @param inOffset - * the offset of the input in the number of integers - * @param n - * the number of elements to be compressed - * @return the number of processed integers - */ - public static final int decompressblock(int[] out, int outOffset, int[] in, - int inOffset, int n) { - int numIdx, j = 0, bits = 0; - numIdx = in[inOffset] >>> S16_BITSSIZE; - int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; - for (j = 0, bits = 0; j < num; j++) { - out[outOffset + j] = (in[inOffset] >>> bits) - & (0xffffffff >>> (32 - S16_BITS[numIdx][j])); - bits += S16_BITS[numIdx][j]; - } - return num; - } - - @Override - public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos, int num) { - int i_inpos = inpos.get(); - int i_outpos = outpos.get(); - final int finalpos = i_inpos + inlength; - while (i_inpos < finalpos) { - final int howmany = decompressblock(out, i_outpos, in, i_inpos, num); - num -= howmany; - i_outpos += howmany; - i_inpos++; - } - inpos.set(i_inpos); - outpos.set(i_outpos); - } - - /** - * Uncompress data from an array to another array. - * - * Both inpos and outpos parameters are modified to indicate new positions - * after read/write. - * - * @param in - * array containing data in compressed form - * @param tmpinpos - * where to start reading in the array - * @param inlength - * length of the compressed data (ignored by some schemes) - * @param out - * array where to write the compressed output - * @param currentPos - * where to write the compressed output in out - * @param outlength - * number of integers we want to decode - */ - public static void uncompress(int[] in, int tmpinpos, int inlength, - int[] out, int currentPos, int outlength) { - final int finalpos = tmpinpos + inlength; - while (tmpinpos < finalpos) { - final int howmany = decompressblock(out, currentPos, in, tmpinpos, - outlength); - outlength -= howmany; - currentPos += howmany; - tmpinpos += 1; - } - - } - - private static int[][] shiftme(int[][] x) { - int[][] answer = new int[x.length][]; - for (int k = 0; k < x.length; ++k) { - answer[k] = new int[x[k].length]; - for (int z = 0; z < answer[k].length; ++z) - answer[k][z] = 1 << x[k][z]; - } - return answer; - } - - private static final int S16_NUMSIZE = 16; - private static final int S16_BITSSIZE = 28; - // the possible number of bits used to represent one integer - private static final int[] S16_NUM = { 28, 21, 21, 21, 14, 9, 8, 7, 6, 6, - 5, 5, 4, 3, 2, 1 }; - // the corresponding number of elements for each value of the number of bits - private static final int[][] S16_BITS = { - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1 }, - { 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, - { 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1 }, - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2 }, - { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, - { 4, 3, 3, 3, 3, 3, 3, 3, 3 }, { 3, 4, 4, 4, 4, 3, 3, 3 }, - { 4, 4, 4, 4, 4, 4, 4 }, { 5, 5, 5, 5, 4, 4 }, - { 4, 4, 5, 5, 5, 5 }, { 6, 6, 6, 5, 5 }, { 5, 5, 6, 6, 6 }, - { 7, 7, 7, 7 }, { 10, 9, 9, }, { 14, 14 }, { 28 } }; - private static final int[][] SHIFTED_S16_BITS = shiftme(S16_BITS); - -} diff --git a/src/main/java/me/lemire/integercompression/skippable/SkippableSimple9.java b/src/main/java/me/lemire/integercompression/skippable/SkippableSimple9.java deleted file mode 100644 index cdf061f..0000000 --- a/src/main/java/me/lemire/integercompression/skippable/SkippableSimple9.java +++ /dev/null @@ -1,291 +0,0 @@ -/** - * This is code is released under the - * Apache License Version 2.0 http://www.apache.org/licenses/. - * - * (c) Daniel Lemire, http://lemire.me/en/ - */ - -package me.lemire.integercompression.skippable; - -import me.lemire.integercompression.IntWrapper; - -/** - * This is an implementation of the popular Simple9 scheme. It is limited to - * 28-bit integers (between 0 and 2^28-1). - * - * Note that this does not use differential coding: if you are working on sorted - * lists, you must compute the deltas separately. - * - * @author Daniel Lemire - * - */ -public final class SkippableSimple9 implements SkippableIntegerCODEC { - - @Override - public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int out[], - IntWrapper outpos) { - int tmpoutpos = outpos.get(); - int currentPos = inpos.get(); - final int finalin = currentPos + inlength; - outer: while (currentPos < finalin - 28) { - mainloop: for (int selector = 0; selector < 8; selector++) { - - int res = 0; - int compressedNum = codeNum[selector]; - int b = bitLength[selector]; - int max = 1 << b; - int i = 0; - for (; i < compressedNum; i++) { - if (max <= in[currentPos + i]) - continue mainloop; - res = (res << b) + in[currentPos + i]; - } - res |= selector << 28; - out[tmpoutpos++] = res; - currentPos += compressedNum; - continue outer; - } - final int selector = 8; - if (in[currentPos] >= 1 << bitLength[selector]) - throw new RuntimeException("Too big a number"); - out[tmpoutpos++] = in[currentPos++] | (selector << 28); - } - outer: while (currentPos < finalin) { - mainloop: for (int selector = 0; selector < 8; selector++) { - int res = 0; - int compressedNum = codeNum[selector]; - if (finalin <= currentPos + compressedNum - 1) - compressedNum = finalin - currentPos; - int b = bitLength[selector]; - int max = 1 << b; - int i = 0; - for (; i < compressedNum; i++) { - if (max <= in[currentPos + i]) - continue mainloop; - res = (res << b) + in[currentPos + i]; - } - - if (compressedNum != codeNum[selector]) - res <<= (codeNum[selector] - compressedNum) * b; - res |= selector << 28; - out[tmpoutpos++] = res; - currentPos += compressedNum; - continue outer; - } - final int selector = 8; - // Util.assertTrue(codeNum[selector] == 1); - if (in[currentPos] >= 1 << bitLength[selector]) - throw new RuntimeException("Too big a number"); - out[tmpoutpos++] = in[currentPos++] | (selector << 28); - } - // Util.assertTrue(currentPos == finalin); - inpos.set(currentPos); - outpos.set(tmpoutpos); - } - - @Override - public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos, int num) { - int currentPos = outpos.get(); - int tmpinpos = inpos.get(); - final int finalout = currentPos + num; - while (currentPos < finalout - 28) { - int val = in[tmpinpos++]; - int header = val >>> 28; - switch (header) { - case 0: { // number : 28, bitwidth : 1 - out[currentPos++] = (val << 4) >>> 31; - out[currentPos++] = (val << 5) >>> 31; - out[currentPos++] = (val << 6) >>> 31; - out[currentPos++] = (val << 7) >>> 31; - out[currentPos++] = (val << 8) >>> 31; - out[currentPos++] = (val << 9) >>> 31; - out[currentPos++] = (val << 10) >>> 31; - out[currentPos++] = (val << 11) >>> 31; - out[currentPos++] = (val << 12) >>> 31; - out[currentPos++] = (val << 13) >>> 31; // 10 - out[currentPos++] = (val << 14) >>> 31; - out[currentPos++] = (val << 15) >>> 31; - out[currentPos++] = (val << 16) >>> 31; - out[currentPos++] = (val << 17) >>> 31; - out[currentPos++] = (val << 18) >>> 31; - out[currentPos++] = (val << 19) >>> 31; - out[currentPos++] = (val << 20) >>> 31; - out[currentPos++] = (val << 21) >>> 31; - out[currentPos++] = (val << 22) >>> 31; - out[currentPos++] = (val << 23) >>> 31; // 20 - out[currentPos++] = (val << 24) >>> 31; - out[currentPos++] = (val << 25) >>> 31; - out[currentPos++] = (val << 26) >>> 31; - out[currentPos++] = (val << 27) >>> 31; - out[currentPos++] = (val << 28) >>> 31; - out[currentPos++] = (val << 29) >>> 31; - out[currentPos++] = (val << 30) >>> 31; - out[currentPos++] = (val << 31) >>> 31; - break; - } - case 1: { // number : 14, bitwidth : 2 - out[currentPos++] = (val << 4) >>> 30; - out[currentPos++] = (val << 6) >>> 30; - out[currentPos++] = (val << 8) >>> 30; - out[currentPos++] = (val << 10) >>> 30; - out[currentPos++] = (val << 12) >>> 30; - out[currentPos++] = (val << 14) >>> 30; - out[currentPos++] = (val << 16) >>> 30; - out[currentPos++] = (val << 18) >>> 30; - out[currentPos++] = (val << 20) >>> 30; - out[currentPos++] = (val << 22) >>> 30; // 10 - out[currentPos++] = (val << 24) >>> 30; - out[currentPos++] = (val << 26) >>> 30; - out[currentPos++] = (val << 28) >>> 30; - out[currentPos++] = (val << 30) >>> 30; - break; - } - case 2: { // number : 9, bitwidth : 3 - out[currentPos++] = (val << 5) >>> 29; - out[currentPos++] = (val << 8) >>> 29; - out[currentPos++] = (val << 11) >>> 29; - out[currentPos++] = (val << 14) >>> 29; - out[currentPos++] = (val << 17) >>> 29; - out[currentPos++] = (val << 20) >>> 29; - out[currentPos++] = (val << 23) >>> 29; - out[currentPos++] = (val << 26) >>> 29; - out[currentPos++] = (val << 29) >>> 29; - break; - } - case 3: { // number : 7, bitwidth : 4 - out[currentPos++] = (val << 4) >>> 28; - out[currentPos++] = (val << 8) >>> 28; - out[currentPos++] = (val << 12) >>> 28; - out[currentPos++] = (val << 16) >>> 28; - out[currentPos++] = (val << 20) >>> 28; - out[currentPos++] = (val << 24) >>> 28; - out[currentPos++] = (val << 28) >>> 28; - break; - } - case 4: { // number : 5, bitwidth : 5 - out[currentPos++] = (val << 7) >>> 27; - out[currentPos++] = (val << 12) >>> 27; - out[currentPos++] = (val << 17) >>> 27; - out[currentPos++] = (val << 22) >>> 27; - out[currentPos++] = (val << 27) >>> 27; - break; - } - case 5: { // number : 4, bitwidth : 7 - out[currentPos++] = (val << 4) >>> 25; - out[currentPos++] = (val << 11) >>> 25; - out[currentPos++] = (val << 18) >>> 25; - out[currentPos++] = (val << 25) >>> 25; - break; - } - case 6: { // number : 3, bitwidth : 9 - out[currentPos++] = (val << 5) >>> 23; - out[currentPos++] = (val << 14) >>> 23; - out[currentPos++] = (val << 23) >>> 23; - break; - } - case 7: { // number : 2, bitwidth : 14 - out[currentPos++] = (val << 4) >>> 18; - out[currentPos++] = (val << 18) >>> 18; - break; - } - case 8: { // number : 1, bitwidth : 28 - out[currentPos++] = (val << 4) >>> 4; - break; - } - default: { - throw new RuntimeException("shouldn't happen"); - } - } - } - while (currentPos < finalout) { - int val = in[tmpinpos++]; - int header = val >>> 28; - switch (header) { - case 0: { // number : 28, bitwidth : 1 - final int howmany = finalout - currentPos; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (k + 4)) >>> 31; - } - break; - } - case 1: { // number : 14, bitwidth : 2 - final int howmany = finalout - currentPos < 14 ? finalout - - currentPos : 14; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (2 * k + 4)) >>> 30; - } - break; - } - case 2: { // number : 9, bitwidth : 3 - final int howmany = finalout - currentPos < 9 ? finalout - - currentPos : 9; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (3 * k + 5)) >>> 29; - } - break; - } - case 3: { // number : 7, bitwidth : 4 - final int howmany = finalout - currentPos < 7 ? finalout - - currentPos : 7; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (4 * k + 4)) >>> 28; - } - break; - } - case 4: { // number : 5, bitwidth : 5 - final int howmany = finalout - currentPos < 5 ? finalout - - currentPos : 5; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (5 * k + 7)) >>> 27; - } - break; - } - case 5: { // number : 4, bitwidth : 7 - final int howmany = finalout - currentPos < 4 ? finalout - - currentPos : 4; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (7 * k + 4)) >>> 25; - } - break; - } - case 6: { // number : 3, bitwidth : 9 - final int howmany = finalout - currentPos < 3 ? finalout - - currentPos : 3; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (9 * k + 5)) >>> 23; - } - break; - } - case 7: { // number : 2, bitwidth : 14 - final int howmany = finalout - currentPos < 2 ? finalout - - currentPos : 2; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (14 * k + 4)) >>> 18; - } - break; - } - case 8: { // number : 1, bitwidth : 28 - out[currentPos++] = (val << 4) >>> 4; - break; - } - default: { - throw new RuntimeException("shouldn't happen"); - } - } - } - outpos.set(currentPos); - inpos.set(tmpinpos); - - } - - private final static int bitLength[] = { 1, 2, 3, 4, 5, 7, 9, 14, 28 }; - - private final static int codeNum[] = { 28, 14, 9, 7, 5, 4, 3, 2, 1 }; - - @Override - public String toString() { - return this.getClass().getName(); - } - -} diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 383f407..81a07e9 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -53,6 +53,7 @@ public void varyingLengthTest() { for (int k = 0; k < N; ++k) data[k] = k; for (IntegerCODEC c : codecs) { + System.out.println("[BasicTest.varyingLengthTest] codec = "+c); for (int L = 1; L <= 128; L++) { int[] comp = TestUtils.compress(c, Arrays.copyOf(data, L)); int[] answer = TestUtils.uncompress(c, comp, L); @@ -80,6 +81,7 @@ public void varyingLengthTest2() { int[] data = new int[N]; data[127] = -1; for (IntegerCODEC c : codecs) { + System.out.println("[BasicTest.varyingLengthTest2] codec = "+c); try { // CODEC Simple9 is limited to "small" integers. if (c.getClass().equals( @@ -374,6 +376,7 @@ private static void test(IntegerCODEC c, IntegerCODEC co, int N, int nbr) { private static void test(int N, int nbr) { ClusteredDataGenerator cdg = new ClusteredDataGenerator(); + System.out.println("[BasicTest.test] N = "+N+" "+nbr); for (int sparsity = 1; sparsity < 31 - nbr; sparsity += 4) { int[][] data = new int[N][]; int max = (1 << (nbr + sparsity)); diff --git a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java index ee2162d..df081e8 100644 --- a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java +++ b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java @@ -2,8 +2,6 @@ import java.util.Arrays; -import me.lemire.integercompression.skippable.*; - import org.junit.Test; @@ -18,11 +16,15 @@ public class SkippableBasicTest { new JustCopy(), new VariableByte(), new SkippableComposition(new BinaryPacking(), new VariableByte()), - new SkippableComposition(new SkippableNewPFD(), new VariableByte()), - new SkippableComposition(new SkippableOptPFD(), new VariableByte()), - new SkippableComposition(new SkippableFastPFOR(), new VariableByte()), - new SkippableSimple9(), - new SkippableSimple16() }; + /* new SkippableComposition(new NewPFD(), new VariableByte()), + new SkippableComposition(new NewPFDS9(), new VariableByte()), + new SkippableComposition(new NewPFDS16(), new VariableByte()), + new SkippableComposition(new OptPFD(), new VariableByte()), + new SkippableComposition(new OptPFDS9(), new VariableByte()), + new SkippableComposition(new OptPFDS16(), new VariableByte()),*/ + new SkippableComposition(new FastPFOR(), new VariableByte()), + new Simple9(), + new Simple16() }; /** * @@ -34,16 +36,17 @@ public void varyingLengthTest() { for (int k = 0; k < N; ++k) data[k] = k; for (SkippableIntegerCODEC c : codecs) { + System.out.println("[SkippeableBasicTest.varyingLengthTest] codec = "+c); for (int L = 1; L <= 128; L++) { - int[] comp = TestUtils.compress(c, Arrays.copyOf(data, L)); - int[] answer = TestUtils.uncompress(c, comp, L); + int[] comp = TestUtils.compressHeadless(c, Arrays.copyOf(data, L)); + int[] answer = TestUtils.uncompressHeadless(c, comp, L); for (int k = 0; k < L; ++k) if (answer[k] != data[k]) throw new RuntimeException("bug "+c.toString()+" "+k+" "+answer[k]+" "+data[k]); } for (int L = 128; L <= N; L *= 2) { - int[] comp = TestUtils.compress(c, Arrays.copyOf(data, L)); - int[] answer = TestUtils.uncompress(c, comp, L); + int[] comp = TestUtils.compressHeadless(c, Arrays.copyOf(data, L)); + int[] answer = TestUtils.uncompressHeadless(c, comp, L); for (int k = 0; k < L; ++k) if (answer[k] != data[k]) throw new RuntimeException("bug"); @@ -61,10 +64,12 @@ public void varyingLengthTest2() { int[] data = new int[N]; data[127] = -1; for (SkippableIntegerCODEC c : codecs) { + System.out.println("[SkippeableBasicTest.varyingLengthTest2] codec = "+c); + try { // CODEC Simple9 is limited to "small" integers. if (c.getClass().equals( - Class.forName("me.lemire.integercompression.skippable.SkippableSimple9"))) + Class.forName("me.lemire.integercompression.Simple9"))) continue; } catch (ClassNotFoundException e) { e.printStackTrace(); @@ -72,21 +77,21 @@ public void varyingLengthTest2() { try { // CODEC Simple16 is limited to "small" integers. if (c.getClass().equals( - Class.forName("me.lemire.integercompression.skippable.SkippableSimple16"))) + Class.forName("me.lemire.integercompression.Simple16"))) continue; } catch (ClassNotFoundException e) { e.printStackTrace(); } for (int L = 1; L <= 128; L++) { - int[] comp = TestUtils.compress(c, Arrays.copyOf(data, L)); - int[] answer = TestUtils.uncompress(c, comp, L); + int[] comp = TestUtils.compressHeadless(c, Arrays.copyOf(data, L)); + int[] answer = TestUtils.uncompressHeadless(c, comp, L); for (int k = 0; k < L; ++k) if (answer[k] != data[k]) throw new RuntimeException("bug at k = "+k+" "+answer[k]+" "+data[k]+" for "+c.toString()); } for (int L = 128; L <= N; L *= 2) { - int[] comp = TestUtils.compress(c, Arrays.copyOf(data, L)); - int[] answer = TestUtils.uncompress(c, comp, L); + int[] comp = TestUtils.compressHeadless(c, Arrays.copyOf(data, L)); + int[] answer = TestUtils.uncompressHeadless(c, comp, L); for (int k = 0; k < L; ++k) if (answer[k] != data[k]) throw new RuntimeException("bug"); diff --git a/src/test/java/me/lemire/integercompression/TestUtils.java b/src/test/java/me/lemire/integercompression/TestUtils.java index 6403fa6..413654f 100644 --- a/src/test/java/me/lemire/integercompression/TestUtils.java +++ b/src/test/java/me/lemire/integercompression/TestUtils.java @@ -2,8 +2,6 @@ import java.util.Arrays; -import me.lemire.integercompression.skippable.SkippableIntegerCODEC; - import org.junit.Test; import static org.junit.Assert.*; @@ -109,7 +107,7 @@ protected static int[] uncompress(ByteIntegerCODEC codec, byte[] data, int len) return Arrays.copyOf(outBuf, outPos.get()); } - protected static int[] compress(SkippableIntegerCODEC codec, int[] data) { + protected static int[] compressHeadless(SkippableIntegerCODEC codec, int[] data) { int[] outBuf = new int[data.length * 4]; IntWrapper inPos = new IntWrapper(); IntWrapper outPos = new IntWrapper(); @@ -117,7 +115,7 @@ protected static int[] compress(SkippableIntegerCODEC codec, int[] data) { return Arrays.copyOf(outBuf, outPos.get()); } - protected static int[] uncompress(SkippableIntegerCODEC codec, int[] data, int len) { + protected static int[] uncompressHeadless(SkippableIntegerCODEC codec, int[] data, int len) { int[] outBuf = new int[len + 1024]; IntWrapper inPos = new IntWrapper(); IntWrapper outPos = new IntWrapper(); From 9eac6bc85b78a2b58e9469c1d60d5ca39c59f7b3 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 16 Sep 2014 22:30:09 -0400 Subject: [PATCH 183/412] Cleaning up code. --- .../lemire/integercompression/FastPFOR.java | 10 +++---- .../lemire/integercompression/Kamikaze.java | 6 ++-- .../me/lemire/integercompression/NewPFD.java | 21 ++++---------- .../lemire/integercompression/NewPFDS16.java | 27 +++++------------ .../lemire/integercompression/NewPFDS9.java | 29 ++++++------------- .../me/lemire/integercompression/OptPFD.java | 28 +++++------------- .../lemire/integercompression/OptPFDS16.java | 24 +++++---------- .../lemire/integercompression/OptPFDS9.java | 24 +++++---------- .../me/lemire/integercompression/Util.java | 7 ++--- .../differential/IntegratedFastPFOR.java | 6 ++-- 10 files changed, 58 insertions(+), 124 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 0c4ddd2..14e37b5 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -82,7 +82,7 @@ public FastPFOR() { @Override public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = Util.floorBy(inlength, BLOCK_SIZE); + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); if (inlength == 0) return; @@ -158,7 +158,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, int newsize = 2 * (dataPointers[index] + bestbbestcexceptmaxb[1]); // make sure it is a multiple of 32 newsize = Util - .floorBy(newsize + 31, 32); + .greatestMultiple(newsize + 31, 32); dataTobePacked[index] = Arrays.copyOf( dataTobePacked[index], newsize); } @@ -219,7 +219,7 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int mynvalue) { if (inlength == 0) return; - mynvalue = Util.floorBy(mynvalue, BLOCK_SIZE); + mynvalue = Util.greatestMultiple(mynvalue, BLOCK_SIZE); dataPointers = new int[33]; @@ -250,7 +250,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, int size = in[inexcept++]; if (dataTobePacked[k].length < size) dataTobePacked[k] = new int[Util - .floorBy(size + 31, 32)]; + .greatestMultiple(size + 31, 32)]; for (int j = 0; j < size; j += 32) { BitPacking.fastunpack(in, inexcept, dataTobePacked[k], j, k); @@ -287,7 +287,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = Util.floorBy(inlength, BLOCK_SIZE); + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); if (inlength == 0) return; out[outpos.get()] = inlength; diff --git a/src/main/java/me/lemire/integercompression/Kamikaze.java b/src/main/java/me/lemire/integercompression/Kamikaze.java index 9f422d8..fd1ac82 100644 --- a/src/main/java/me/lemire/integercompression/Kamikaze.java +++ b/src/main/java/me/lemire/integercompression/Kamikaze.java @@ -18,7 +18,7 @@ public class Kamikaze implements SkippableIntegerCODEC, IntegerCODEC { @Override public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = Util.floorBy(inlength, BLOCK_SIZE); + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); if (inlength > 0) { int[] out2 = PForDelta.compressOneBlockOpt(in, inlength); inpos.add(inlength); @@ -30,7 +30,7 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out @Override public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num) { - num = Util.floorBy(num, BLOCK_SIZE); + num = Util.greatestMultiple(num, BLOCK_SIZE); if (num > 0) { int d = PForDelta.decompressOneBlock(out, in, num); inpos.add(d / 32); @@ -46,7 +46,7 @@ public String toString() { @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = Util.floorBy(inlength, BLOCK_SIZE); + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); if (inlength == 0) return; out[outpos.get()] = inlength; diff --git a/src/main/java/me/lemire/integercompression/NewPFD.java b/src/main/java/me/lemire/integercompression/NewPFD.java index 0ea6cc3..ec0adbd 100644 --- a/src/main/java/me/lemire/integercompression/NewPFD.java +++ b/src/main/java/me/lemire/integercompression/NewPFD.java @@ -35,7 +35,6 @@ * @author Daniel Lemire */ public final class NewPFD implements IntegerCODEC,SkippableIntegerCODEC { - final int PageSize; final static int BLOCK_SIZE = 128; int[] exceptbuffer = new int[2 * BLOCK_SIZE]; @@ -44,22 +43,16 @@ public final class NewPFD implements IntegerCODEC,SkippableIntegerCODEC { * Constructor for the NewPFD CODEC. */ public NewPFD() { - PageSize = 65536; } @Override public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = Util.floorBy(inlength, BLOCK_SIZE); + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); if (inlength == 0) return; final int finalinpos = inpos.get() + inlength; - while (inpos.get() != finalinpos) { - int thissize = finalinpos > PageSize + inpos.get() ? PageSize - : (finalinpos - inpos.get()); - encodePage(in, inpos, thissize, out, outpos); - } - + encodePage(in, inpos, finalinpos, out, outpos); } protected static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, @@ -136,13 +129,9 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int mynvalue) { if (inlength == 0) return; - mynvalue = Util.floorBy(mynvalue, BLOCK_SIZE); + mynvalue = Util.greatestMultiple(mynvalue, BLOCK_SIZE); final int finalout = outpos.get() + mynvalue; - while (outpos.get() != finalout) { - int thissize = finalout > PageSize + outpos.get() ? PageSize - : (finalout - outpos.get()); - decodePage(in, inpos, out, outpos, thissize); - } + decodePage(in, inpos, out, outpos, finalout); } private void decodePage(int[] in, IntWrapper inpos, int[] out, @@ -173,7 +162,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = Util.floorBy(inlength, BLOCK_SIZE); + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); if (inlength == 0) return; out[outpos.get()] = inlength; diff --git a/src/main/java/me/lemire/integercompression/NewPFDS16.java b/src/main/java/me/lemire/integercompression/NewPFDS16.java index fc6599b..48b3a70 100644 --- a/src/main/java/me/lemire/integercompression/NewPFDS16.java +++ b/src/main/java/me/lemire/integercompression/NewPFDS16.java @@ -34,7 +34,6 @@ * @author Daniel Lemire */ public final class NewPFDS16 implements IntegerCODEC,SkippableIntegerCODEC { - final int PageSize; final static int BLOCK_SIZE= 128; int[] exceptbuffer = new int[2 * BLOCK_SIZE]; @@ -43,31 +42,25 @@ public final class NewPFDS16 implements IntegerCODEC,SkippableIntegerCODEC { * Constructor for the NewPFDS16 CODEC. */ public NewPFDS16() { - PageSize = 65536; } @Override public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = inlength / BLOCK_SIZE * BLOCK_SIZE; + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); if (inlength == 0) return; final int finalinpos = inpos.get() + inlength; - while (inpos.get() != finalinpos) { - int thissize = finalinpos > PageSize + inpos.get() ? PageSize - : (finalinpos - inpos.get()); - encodePage(in, inpos, thissize, out, outpos); - } - + encodePage(in, inpos, finalinpos, out, outpos); } - protected static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + private static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 20, 32 }; - protected static final int[] invbits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + private static final int[] invbits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 }; - protected static void getBestBFromData(int[] in, int pos, + private static void getBestBFromData(int[] in, int pos, IntWrapper bestb, IntWrapper bestexcept) { final int mb = Util.maxbits(in, pos, BLOCK_SIZE); int mini = 0; @@ -135,13 +128,9 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int mynvalue) { if (inlength == 0) return; - mynvalue = Util.floorBy(mynvalue, BLOCK_SIZE); + mynvalue = Util.greatestMultiple(mynvalue, BLOCK_SIZE); int finalout = outpos.get() + mynvalue; - while (outpos.get() != finalout) { - int thissize = finalout > PageSize + outpos.get() ? PageSize - : (finalout - outpos.get()); - decodePage(in, inpos, out, outpos, thissize); - } + decodePage(in, inpos, out, outpos, finalout); } private void decodePage(int[] in, IntWrapper inpos, int[] out, @@ -172,7 +161,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = Util.floorBy(inlength, BLOCK_SIZE); + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); if (inlength == 0) return; out[outpos.get()] = inlength; diff --git a/src/main/java/me/lemire/integercompression/NewPFDS9.java b/src/main/java/me/lemire/integercompression/NewPFDS9.java index 7a15ed4..89a8b4c 100644 --- a/src/main/java/me/lemire/integercompression/NewPFDS9.java +++ b/src/main/java/me/lemire/integercompression/NewPFDS9.java @@ -33,7 +33,6 @@ * @author Daniel Lemire */ public final class NewPFDS9 implements IntegerCODEC,SkippableIntegerCODEC { - final int PageSize; final static int BLOCK_SIZE = 128; int[] exceptbuffer = new int[2 * BLOCK_SIZE]; @@ -42,31 +41,25 @@ public final class NewPFDS9 implements IntegerCODEC,SkippableIntegerCODEC { * Constructor for the NewPFDS9 CODEC. */ public NewPFDS9() { - PageSize = 65536; } @Override public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = inlength / BLOCK_SIZE * BLOCK_SIZE; + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); if (inlength == 0) return; final int finalinpos = inpos.get() + inlength; - while (inpos.get() != finalinpos) { - int thissize = finalinpos > PageSize + inpos.get() ? PageSize - : (finalinpos - inpos.get()); - encodePage(in, inpos, thissize, out, outpos); - } - + encodePage(in, inpos, finalinpos, out, outpos); } - protected static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + private static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 20, 32 }; - protected static final int[] invbits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + private static final int[] invbits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 }; - protected static void getBestBFromData(int[] in, int pos, + private static void getBestBFromData(int[] in, int pos, IntWrapper bestb, IntWrapper bestexcept) { final int mb = Util.maxbits(in, pos, BLOCK_SIZE); int mini = 0; @@ -134,13 +127,9 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int mynvalue) { if (inlength == 0) return; - mynvalue = Util.floorBy(mynvalue, BLOCK_SIZE); - int finalout = outpos.get() + mynvalue; - while (outpos.get() != finalout) { - int thissize = finalout > PageSize + outpos.get() ? PageSize - : (finalout - outpos.get()); - decodePage(in, inpos, out, outpos, thissize); - } + mynvalue = Util.greatestMultiple(mynvalue, BLOCK_SIZE); + final int finalout = outpos.get() + mynvalue; + decodePage(in, inpos, out, outpos, finalout); } private void decodePage(int[] in, IntWrapper inpos, int[] out, @@ -171,7 +160,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = Util.floorBy(inlength, BLOCK_SIZE); + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); if (inlength == 0) return; out[outpos.get()] = inlength; diff --git a/src/main/java/me/lemire/integercompression/OptPFD.java b/src/main/java/me/lemire/integercompression/OptPFD.java index 051b11f..c51545d 100644 --- a/src/main/java/me/lemire/integercompression/OptPFD.java +++ b/src/main/java/me/lemire/integercompression/OptPFD.java @@ -33,41 +33,33 @@ * @author Daniel Lemire */ public final class OptPFD implements IntegerCODEC,SkippableIntegerCODEC { - final int PageSize; final static int BLOCK_SIZE = 128; int[] exceptbuffer = new int[2 * BLOCK_SIZE]; - int[] sillybuffer = new int[2 * BLOCK_SIZE]; - + /** * Constructor for the OptPFD CODEC. */ public OptPFD() { - PageSize = 65536; } @Override public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = inlength / BLOCK_SIZE * BLOCK_SIZE; + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); if (inlength == 0) return; final int finalinpos = inpos.get() + inlength; - while (inpos.get() != finalinpos) { - int thissize = finalinpos > PageSize + inpos.get() ? PageSize - : (finalinpos - inpos.get()); - encodePage(in, inpos, thissize, out, outpos); - } - + encodePage(in, inpos, finalinpos, out, outpos); } - protected static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + private static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 20, 32 }; - protected static final int[] invbits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + private static final int[] invbits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 }; - void getBestBFromData(int[] in, int pos, IntWrapper bestb, + private void getBestBFromData(int[] in, int pos, IntWrapper bestb, IntWrapper bestexcept) { final int mb = Util.maxbits(in, pos, BLOCK_SIZE); int mini = 0; @@ -152,13 +144,9 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int mynvalue) { if (inlength == 0) return; - mynvalue = Util.floorBy(mynvalue, BLOCK_SIZE); + mynvalue = Util.greatestMultiple(mynvalue, BLOCK_SIZE); final int finalout = outpos.get() + mynvalue; - while (outpos.get() != finalout) { - int thissize = finalout > PageSize + outpos.get() ? PageSize - : (finalout - outpos.get()); - decodePage(in, inpos, out, outpos, thissize); - } + decodePage(in, inpos, out, outpos, finalout); } private void decodePage(int[] in, IntWrapper inpos, int[] out, diff --git a/src/main/java/me/lemire/integercompression/OptPFDS16.java b/src/main/java/me/lemire/integercompression/OptPFDS16.java index 8355a59..13da6bf 100644 --- a/src/main/java/me/lemire/integercompression/OptPFDS16.java +++ b/src/main/java/me/lemire/integercompression/OptPFDS16.java @@ -33,7 +33,6 @@ * @author Daniel Lemire */ public final class OptPFDS16 implements IntegerCODEC,SkippableIntegerCODEC { - final int PageSize; final static int BLOCK_SIZE = 128; int[] exceptbuffer = new int[2 * BLOCK_SIZE]; @@ -41,32 +40,27 @@ public final class OptPFDS16 implements IntegerCODEC,SkippableIntegerCODEC { * Constructor for the OptPFDS16 CODEC. */ public OptPFDS16() { - PageSize = 65536; } @Override public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = inlength / BLOCK_SIZE * BLOCK_SIZE; + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); if (inlength == 0) return; final int finalinpos = inpos.get() + inlength; - while (inpos.get() != finalinpos) { - int thissize = finalinpos > PageSize + inpos.get() ? PageSize - : (finalinpos - inpos.get()); - encodePage(in, inpos, thissize, out, outpos); - } + encodePage(in, inpos, finalinpos, out, outpos); } - protected static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + private static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 20, 32 }; - protected static final int[] invbits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + private static final int[] invbits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 }; - protected void getBestBFromData(int[] in, int pos, IntWrapper bestb, + private void getBestBFromData(int[] in, int pos, IntWrapper bestb, IntWrapper bestexcept) { final int mb = Util.maxbits(in, pos, BLOCK_SIZE); int mini = 0; @@ -150,13 +144,9 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int mynvalue) { if (inlength == 0) return; - mynvalue = Util.floorBy(mynvalue, BLOCK_SIZE); + mynvalue = Util.greatestMultiple(mynvalue, BLOCK_SIZE); final int finalout = outpos.get() + mynvalue; - while (outpos.get() != finalout) { - int thissize = finalout > PageSize + outpos.get() ? PageSize - : (finalout - outpos.get()); - decodePage(in, inpos, out, outpos, thissize); - } + decodePage(in, inpos, out, outpos, finalout); } private void decodePage(int[] in, IntWrapper inpos, int[] out, diff --git a/src/main/java/me/lemire/integercompression/OptPFDS9.java b/src/main/java/me/lemire/integercompression/OptPFDS9.java index 6b890aa..64981ef 100644 --- a/src/main/java/me/lemire/integercompression/OptPFDS9.java +++ b/src/main/java/me/lemire/integercompression/OptPFDS9.java @@ -33,7 +33,6 @@ * @author Daniel Lemire */ public final class OptPFDS9 implements IntegerCODEC, SkippableIntegerCODEC { - final int PageSize; final static int BLOCK_SIZE = 128; int[] exceptbuffer = new int[2 * BLOCK_SIZE]; @@ -41,32 +40,27 @@ public final class OptPFDS9 implements IntegerCODEC, SkippableIntegerCODEC { * Constructor for the OptPFDS9 CODEC. */ public OptPFDS9() { - PageSize = 65536; } @Override public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = inlength / BLOCK_SIZE * BLOCK_SIZE; + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); if (inlength == 0) return; final int finalinpos = inpos.get() + inlength; - while (inpos.get() != finalinpos) { - int thissize = finalinpos > PageSize + inpos.get() ? PageSize - : (finalinpos - inpos.get()); - encodePage(in, inpos, thissize, out, outpos); - } + encodePage(in, inpos, finalinpos, out, outpos); } - protected static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + private static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 20, 32 }; - protected static final int[] invbits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + private static final int[] invbits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 }; - protected void getBestBFromData(int[] in, int pos, IntWrapper bestb, + private void getBestBFromData(int[] in, int pos, IntWrapper bestb, IntWrapper bestexcept) { final int mb = Util.maxbits(in, pos, BLOCK_SIZE); int mini = 0; @@ -150,13 +144,9 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int mynvalue) { if (inlength == 0) return; - mynvalue = Util.floorBy(mynvalue, BLOCK_SIZE); + mynvalue = Util.greatestMultiple(mynvalue, BLOCK_SIZE); final int finalout = outpos.get() + mynvalue; - while (outpos.get() != finalout) { - int thissize = finalout > PageSize + outpos.get() ? PageSize - : (finalout - outpos.get()); - decodePage(in, inpos, out, outpos, thissize); - } + decodePage(in, inpos, out, outpos, finalout); } private void decodePage(int[] in, IntWrapper inpos, int[] out, diff --git a/src/main/java/me/lemire/integercompression/Util.java b/src/main/java/me/lemire/integercompression/Util.java index 573c829..aa19ca4 100644 --- a/src/main/java/me/lemire/integercompression/Util.java +++ b/src/main/java/me/lemire/integercompression/Util.java @@ -101,14 +101,13 @@ public static int bits(int i) { } /** - * return floor(value / factor) + * return floor(value / factor) * factor * * @param value numerator * @param factor denominator - * @return result of the division + * @return greatest multiple of factor no larger than value */ - public static int floorBy(int value, int factor) { - + public static int greatestMultiple(int value, int factor) { return value - value % factor; } } diff --git a/src/main/java/me/lemire/integercompression/differential/IntegratedFastPFOR.java b/src/main/java/me/lemire/integercompression/differential/IntegratedFastPFOR.java index 4af2f0a..a770226 100644 --- a/src/main/java/me/lemire/integercompression/differential/IntegratedFastPFOR.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedFastPFOR.java @@ -98,7 +98,7 @@ public IntegratedFastPFOR() { @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = Util.floorBy(inlength, 128); + inlength = Util.greatestMultiple(inlength, 128); if (inlength == 0) return; @@ -182,7 +182,7 @@ private void encodePage(int[] constin, IntWrapper constinpos, int newsize = 2 * (dataPointers[index] + bestbbestcexceptmaxb[1]); // make sure it is a multiple of 32 newsize = Util - .floorBy(newsize + 31, 32); + .greatestMultiple(newsize + 31, 32); dataTobePacked[index] = Arrays.copyOf( dataTobePacked[index], newsize); } @@ -276,7 +276,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, int size = in[inexcept++]; if (dataTobePacked[k].length < size) dataTobePacked[k] = new int[Util - .floorBy(size + 31, 32)]; + .greatestMultiple(size + 31, 32)]; for (int j = 0; j < size; j += 32) { BitPacking.fastunpack(in, inexcept, dataTobePacked[k], j, k); From 193e4116358b0ec36204102dbbbde7dd97ceffe3 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 17 Sep 2014 16:10:02 -0400 Subject: [PATCH 184/412] Still buggy... --- README.md | 2 +- .../integercompression/VariableByte.java | 14 +- .../benchmarktools/BenchmarkSkippable.java | 423 ++++++++++++++++++ .../SkippableBasicTest.java | 43 +- 4 files changed, 470 insertions(+), 12 deletions(-) create mode 100644 src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java diff --git a/README.md b/README.md index 0e1844d..200d33f 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,7 @@ Main contributors * Muraoka Taro, https://github.com/koron with contributions by +* the Terrier team (Matteo Catena, Craig Macdonald and Iadh Ounis) * Di Wu, http://www.facebook.com/diwu1989 * Stefan Ackermann, https://github.com/Stivo * Samit Roy, https://github.com/roysamit @@ -155,7 +156,6 @@ This library was a key ingredient in the best paper at ECIR 2014 : Matteo Catena, Craig Macdonald, Iadh Ounis, On Inverted Index Compression for Search Engine Efficiency, Lecture Notes in Computer Science 8416 (ECIR 2014), 2014. http://dx.doi.org/10.1007/978-3-319-06028-6_30 - We wrote a research paper which documents many of the CODECs implemented here: Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second through vectorization, Software Pratice & Experience (to appear) diff --git a/src/main/java/me/lemire/integercompression/VariableByte.java b/src/main/java/me/lemire/integercompression/VariableByte.java index 73719e9..63de721 100644 --- a/src/main/java/me/lemire/integercompression/VariableByte.java +++ b/src/main/java/me/lemire/integercompression/VariableByte.java @@ -123,10 +123,8 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, val = in[p]; int c = (byte) (val >>> s); s += 8; - if (s == 32) { - s = 0; - p++; - } + p += s>>5; + s = s & 31; v += ((c & 127) << shift); if ((c & 128) == 128) { out[tmpoutpos++] = v; @@ -190,10 +188,8 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] o val = in[p]; int c = (byte) (val >>> s); s += 8; - if (s == 32) { - s = 0; - p++; - } + p += s>>5; + s = s & 31; v += ((c & 127) << shift); if ((c & 128) == 128) { out[tmpoutpos++] = v; @@ -203,7 +199,7 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] o shift += 7; } outpos.set(tmpoutpos); - inpos.add(inlength); + inpos.set(p + (s!=0 ? 1 : 0)); } } diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java new file mode 100644 index 0000000..c14adb1 --- /dev/null +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java @@ -0,0 +1,423 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ +package me.lemire.integercompression.benchmarktools; + +import com.kamikaze.pfordelta.PForDelta; + +import me.lemire.integercompression.BinaryPacking; +import me.lemire.integercompression.ByteIntegerCODEC; +import me.lemire.integercompression.Composition; +import me.lemire.integercompression.DeltaZigzagBinaryPacking; +import me.lemire.integercompression.DeltaZigzagVariableByte; +import me.lemire.integercompression.FastPFOR; +import me.lemire.integercompression.IntWrapper; +import me.lemire.integercompression.IntegerCODEC; +import me.lemire.integercompression.JustCopy; +import me.lemire.integercompression.NewPFD; +import me.lemire.integercompression.NewPFDS16; +import me.lemire.integercompression.NewPFDS9; +import me.lemire.integercompression.OptPFD; +import me.lemire.integercompression.OptPFDS16; +import me.lemire.integercompression.OptPFDS9; +import me.lemire.integercompression.Simple16; +import me.lemire.integercompression.Simple9; +import me.lemire.integercompression.SkippableComposition; +import me.lemire.integercompression.SkippableIntegerCODEC; +import me.lemire.integercompression.VariableByte; +import me.lemire.integercompression.differential.Delta; +import me.lemire.integercompression.differential.IntegratedBinaryPacking; +import me.lemire.integercompression.differential.IntegratedByteIntegerCODEC; +import me.lemire.integercompression.differential.IntegratedComposition; +import me.lemire.integercompression.differential.IntegratedFastPFOR; +import me.lemire.integercompression.differential.IntegratedIntegerCODEC; +import me.lemire.integercompression.differential.IntegratedVariableByte; +import me.lemire.integercompression.differential.XorBinaryPacking; +import me.lemire.integercompression.synth.ClusteredDataGenerator; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.PrintWriter; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.Arrays; + +/** + * + * Simple class meant to compare the speed of different schemes. + * + * @author Daniel Lemire + * + */ +public class BenchmarkSkippable { + + private static int compressWithSkipTable(SkippableIntegerCODEC c, int[] data, int[] output, IntWrapper outpos, int[] metadata, int blocksize) { + int metapos = 0; + metadata[metapos++] = data.length; + IntWrapper inpos = new IntWrapper(); + int initvalue = 0; + while(inpos.get() < data.length) { + metadata[metapos++] = outpos.get(); + metadata[metapos++] = initvalue; + if (!(c instanceof IntegratedIntegerCODEC)) { + int size = blocksize > data.length - inpos.get() ? data.length - inpos.get() : blocksize; + initvalue = Delta.delta(data,inpos.get(),size,initvalue); + } + c.headlessCompress(data, inpos, blocksize, output, outpos); + } + return metapos; + } + private static int decompressFromSkipTable(SkippableIntegerCODEC c, int[] compressed, IntWrapper compressedpos, int[] metadata, int blocksize, int[] data) { + int metapos = 0; + int length = metadata[metapos++]; + IntWrapper uncomppos = new IntWrapper(); + while(uncomppos.get() < length) { + int num = blocksize; + if(num > length - uncomppos.get()) num = length - uncomppos.get(); + int location = metadata[metapos++]; + int initvalue = metadata[metapos++]; + int outputlocation = uncomppos.get(); + if(location != compressedpos.get()) throw new RuntimeException("Bug "+location+" "+compressedpos.get()); + c.headlessUncompress(compressed, compressedpos, compressed.length - uncomppos.get(), data, uncomppos, num); + if (!(c instanceof IntegratedIntegerCODEC)) { + initvalue = Delta.fastinverseDelta(data, outputlocation, num, initvalue); + } + } + return length; + } + + /** + * Standard benchmark + * + * @param csvLog + * Writer for CSV log. + * @param c + * the codec + * @param data + * arrays of input data + * @param repeat + * How many times to repeat the test + * @param verbose + * whether to output result on screen + */ + private static void testCodec(PrintWriter csvLog, int sparsity, + SkippableIntegerCODEC c, int[][] data, int repeat, boolean verbose) { + if (verbose) { + System.out.println("# " + c.toString()); + System.out + .println("# bits per int, compress speed (mis), decompression speed (mis) "); + } + + int N = data.length; + + int totalSize = 0; + int maxLength = 0; + for (int k = 0; k < N; ++k) { + totalSize += data[k].length; + if (data[k].length > maxLength) { + maxLength = data[k].length; + } + } + + // 4x + 1024 to account for the possibility of some negative + // compression. + int[] compressBuffer = new int[4 * maxLength + 1024]; + int[] decompressBuffer = new int[maxLength + 1024]; + int[] metadataBuffer = new int[maxLength]; + final int blocksize = 1024; + + // These variables hold time in microseconds (10^-6). + double compressTime = 0; + double decompressTime = 0; + final int times = 5; + + int size = 0; + + for (int r = 0; r < repeat; ++r) { + size = 0; + for (int k = 0; k < N; ++k) { + int[] backupdata = Arrays.copyOf(data[k], + data[k].length); + + // compress data. + long beforeCompress = System.nanoTime() / 1000; + IntWrapper outpos = new IntWrapper(); + compressWithSkipTable(c, backupdata, compressBuffer, outpos, metadataBuffer,blocksize ); + long afterCompress = System.nanoTime() / 1000; + + // measure time of compression. + compressTime += afterCompress - beforeCompress; + final int thiscompsize = outpos.get(); + size += thiscompsize; + // dry run + int volume = 0; + { + IntWrapper compressedpos = new IntWrapper(0); + volume = decompressFromSkipTable(c, compressBuffer, compressedpos, metadataBuffer, blocksize, decompressBuffer); + } + // extract (uncompress) data + long beforeDecompress = System.nanoTime() / 1000; + for(int t = 0; t maxlength) + maxlength = data[k].length; + } + int[] buffer = new int[maxlength + 1024]; + /* + * 4x + 1024 to account for the possibility of some negative + * compression + */ + int size = 0; + int comptime = 0; + long decomptime = 0; + for (int r = 0; r < repeat; ++r) { + size = 0; + for (int k = 0; k < N; ++k) { + int outpos = 0; + int[] backupdata = Arrays.copyOf(data[k], + data[k].length); + // + bef = System.nanoTime() / 1000; + Delta.delta(backupdata); + ArrayList dataout = new ArrayList( + data[k].length / 128); + for (int K = 0; K < data[k].length; K += 128) { + final int[] compressedbuf = PForDelta + .compressOneBlockOpt(Arrays + .copyOfRange( + backupdata, K, + K + 128), 128); + dataout.add(compressedbuf); + outpos += compressedbuf.length; + } + aft = System.nanoTime() / 1000; + // + comptime += aft - bef; + final int thiscompsize = outpos; + size += thiscompsize; + // + bef = System.nanoTime() / 1000; + ArrayList datauncomp = new ArrayList( + dataout.size()); + int deltaoffset = 0; + + for (int[] compbuf : dataout) { + int[] tmpbuf = new int[128]; + PForDelta.decompressOneBlock(tmpbuf, + compbuf, 128); + tmpbuf[0] += deltaoffset; + Delta.fastinverseDelta(tmpbuf); + deltaoffset = tmpbuf[127]; + datauncomp.add(tmpbuf); + } + aft = System.nanoTime() / 1000; + // + decomptime += aft - bef; + if (datauncomp.size() * 128 != data[k].length) + throw new RuntimeException( + "we have a bug (diff length) " + + " expected " + + data[k].length + + " got " + + datauncomp.size() + * 128); + for (int m = 0; m < data[k].length; ++m) + if (datauncomp.get(m / 128)[m % 128] != data[k][m]) { + throw new RuntimeException( + "we have a bug (actual difference), expected " + + data[k][m] + + " found " + + buffer[m] + + " at " + m); + } + + } + } + + line += "\t" + df.format(size * 32.0 / totalsize); + line += "\t" + dfspeed.format(totalsize * repeat / (comptime)); + line += "\t" + + dfspeed.format(totalsize * repeat / (decomptime)); + if (verbose) + System.out.println(line); + } + + /** + * Generate test data. + * + * @param N + * How many input arrays to generate + * @param nbr + * How big (in log2) should the arrays be + * @param sparsity + * How sparse test data generated + */ + private static int[][] generateTestData(ClusteredDataGenerator dataGen, + int N, int nbr, int sparsity) { + final int[][] data = new int[N][]; + final int dataSize = (1 << (nbr + sparsity)); + for (int i = 0; i < N; ++i) { + data[i] = dataGen.generateClustered((1 << nbr), + dataSize); + } + return data; + } + static SkippableIntegerCODEC[] codecs = { + new JustCopy(), + new VariableByte(), + new SkippableComposition(new BinaryPacking(), new VariableByte()), + new SkippableComposition(new NewPFD(), new VariableByte()), + new SkippableComposition(new NewPFDS9(), new VariableByte()), + new SkippableComposition(new NewPFDS16(), new VariableByte()), + new SkippableComposition(new OptPFD(), new VariableByte()), + new SkippableComposition(new OptPFDS9(), new VariableByte()), + new SkippableComposition(new OptPFDS16(), new VariableByte()), + new SkippableComposition(new FastPFOR(), new VariableByte()), + new Simple9(), + new Simple16() }; + /** + * Generates data and calls other tests. + * + * @param csvLog + * Writer for CSV log. + * @param N + * How many input arrays to generate + * @param nbr + * how big (in log2) should the arrays be + * @param repeat + * How many times should we repeat tests. + */ + private static void test(PrintWriter csvLog, int N, int nbr, int repeat) { + csvLog.format("\"Algorithm\",\"Sparsity\",\"Bits per int\",\"Compress speed (MiS)\",\"Decompress speed (MiS)\"\n"); + ClusteredDataGenerator cdg = new ClusteredDataGenerator(); + final int max_sparsity = 31 - nbr; + for (int sparsity = 1; sparsity < max_sparsity; ++sparsity) { + System.out.println("# sparsity " + sparsity); + System.out.println("# generating random data..."); + int[][] data = generateTestData(cdg, N, nbr, sparsity); + System.out.println("# generating random data... ok."); + for(SkippableIntegerCODEC c : codecs) { + testCodec(csvLog, sparsity, c, data, sparsity, false); + testCodec(csvLog, sparsity, c, data, sparsity, false); + testCodec(csvLog, sparsity, c, data, sparsity, true); + } + + + } + } +} diff --git a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java index df081e8..ee44bc1 100644 --- a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java +++ b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java @@ -16,16 +16,55 @@ public class SkippableBasicTest { new JustCopy(), new VariableByte(), new SkippableComposition(new BinaryPacking(), new VariableByte()), - /* new SkippableComposition(new NewPFD(), new VariableByte()), + new SkippableComposition(new NewPFD(), new VariableByte()), new SkippableComposition(new NewPFDS9(), new VariableByte()), new SkippableComposition(new NewPFDS16(), new VariableByte()), new SkippableComposition(new OptPFD(), new VariableByte()), new SkippableComposition(new OptPFDS9(), new VariableByte()), - new SkippableComposition(new OptPFDS16(), new VariableByte()),*/ + new SkippableComposition(new OptPFDS16(), new VariableByte()), new SkippableComposition(new FastPFOR(), new VariableByte()), new Simple9(), new Simple16() }; + + /** + * + */ + @Test + public void consistentTest() { + int N = 4096; + int[] data = new int[N]; + int[] rev = new int[N]; + for (int k = 0; k < N; ++k) + data[k] = k % 128; + for (SkippableIntegerCODEC c : codecs) { + System.out.println("[SkippeableBasicTest.consistentTest] codec = " + + c); + int[] outBuf = new int[N + 1024]; + for (int n = 0; n <= N; ++n) { + IntWrapper inPos = new IntWrapper(); + IntWrapper outPos = new IntWrapper(); + c.headlessCompress(data, inPos, n, outBuf, outPos); + + IntWrapper inPoso = new IntWrapper(); + IntWrapper outPoso = new IntWrapper(); + c.headlessUncompress(outBuf, inPoso, outPos.get(), rev, + outPoso, n); + if (outPoso.get() != n) { + throw new RuntimeException("bug "+n); + } + if (inPoso.get() != outPos.get()) { + throw new RuntimeException("bug "+n+" "+inPoso.get()+" "+outPos.get()); + } + for (int j = 0; j < n; ++j) + if (data[j] != rev[j]) { + throw new RuntimeException("bug"); + } + } + } + } + + /** * */ From 3fe4aa52c386128ab2121c32c25076d229f49eb9 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 17 Sep 2014 16:43:18 -0400 Subject: [PATCH 185/412] Fixed remaining issues. --- .../java/me/lemire/integercompression/BinaryPacking.java | 9 +++++---- src/main/java/me/lemire/integercompression/NewPFD.java | 6 ++---- .../java/me/lemire/integercompression/NewPFDS16.java | 6 ++---- src/main/java/me/lemire/integercompression/NewPFDS9.java | 6 ++---- src/main/java/me/lemire/integercompression/OptPFD.java | 6 ++---- .../java/me/lemire/integercompression/OptPFDS16.java | 6 ++---- src/main/java/me/lemire/integercompression/OptPFDS9.java | 7 ++----- 7 files changed, 17 insertions(+), 29 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/BinaryPacking.java b/src/main/java/me/lemire/integercompression/BinaryPacking.java index 6377c25..9d68d2e 100644 --- a/src/main/java/me/lemire/integercompression/BinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/BinaryPacking.java @@ -37,11 +37,12 @@ * @author Daniel Lemire */ public final class BinaryPacking implements IntegerCODEC, SkippableIntegerCODEC { - + final static int BLOCK_SIZE = 128; + @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = inlength / 128 * 128; + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); if (inlength == 0) return; out[outpos.get()] = inlength; @@ -52,7 +53,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, @Override public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = inlength / 128 * 128; + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); int tmpoutpos = outpos.get(); for (int s = inpos.get(); s < inpos.get() + inlength; s += 32 * 4) { final int mbits1 = Util.maxbits(in, s, 32); @@ -91,7 +92,7 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, @Override public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num) { - final int outlength = num / 128 * 128; + final int outlength = Util.greatestMultiple(num, BLOCK_SIZE); int tmpinpos = inpos.get(); for (int s = outpos.get(); s < outpos.get() + outlength; s += 32 * 4) { final int mbits1 = (in[tmpinpos] >>> 24); diff --git a/src/main/java/me/lemire/integercompression/NewPFD.java b/src/main/java/me/lemire/integercompression/NewPFD.java index ec0adbd..6dd01aa 100644 --- a/src/main/java/me/lemire/integercompression/NewPFD.java +++ b/src/main/java/me/lemire/integercompression/NewPFD.java @@ -51,8 +51,7 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); if (inlength == 0) return; - final int finalinpos = inpos.get() + inlength; - encodePage(in, inpos, finalinpos, out, outpos); + encodePage(in, inpos, inlength, out, outpos); } protected static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, @@ -130,8 +129,7 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, if (inlength == 0) return; mynvalue = Util.greatestMultiple(mynvalue, BLOCK_SIZE); - final int finalout = outpos.get() + mynvalue; - decodePage(in, inpos, out, outpos, finalout); + decodePage(in, inpos, out, outpos, mynvalue); } private void decodePage(int[] in, IntWrapper inpos, int[] out, diff --git a/src/main/java/me/lemire/integercompression/NewPFDS16.java b/src/main/java/me/lemire/integercompression/NewPFDS16.java index 48b3a70..98370d2 100644 --- a/src/main/java/me/lemire/integercompression/NewPFDS16.java +++ b/src/main/java/me/lemire/integercompression/NewPFDS16.java @@ -50,8 +50,7 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); if (inlength == 0) return; - final int finalinpos = inpos.get() + inlength; - encodePage(in, inpos, finalinpos, out, outpos); + encodePage(in, inpos, inlength, out, outpos); } private static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, @@ -129,8 +128,7 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, if (inlength == 0) return; mynvalue = Util.greatestMultiple(mynvalue, BLOCK_SIZE); - int finalout = outpos.get() + mynvalue; - decodePage(in, inpos, out, outpos, finalout); + decodePage(in, inpos, out, outpos, mynvalue); } private void decodePage(int[] in, IntWrapper inpos, int[] out, diff --git a/src/main/java/me/lemire/integercompression/NewPFDS9.java b/src/main/java/me/lemire/integercompression/NewPFDS9.java index 89a8b4c..c8389c1 100644 --- a/src/main/java/me/lemire/integercompression/NewPFDS9.java +++ b/src/main/java/me/lemire/integercompression/NewPFDS9.java @@ -49,8 +49,7 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); if (inlength == 0) return; - final int finalinpos = inpos.get() + inlength; - encodePage(in, inpos, finalinpos, out, outpos); + encodePage(in, inpos, inlength, out, outpos); } private static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, @@ -128,8 +127,7 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, if (inlength == 0) return; mynvalue = Util.greatestMultiple(mynvalue, BLOCK_SIZE); - final int finalout = outpos.get() + mynvalue; - decodePage(in, inpos, out, outpos, finalout); + decodePage(in, inpos, out, outpos, mynvalue); } private void decodePage(int[] in, IntWrapper inpos, int[] out, diff --git a/src/main/java/me/lemire/integercompression/OptPFD.java b/src/main/java/me/lemire/integercompression/OptPFD.java index c51545d..8c90586 100644 --- a/src/main/java/me/lemire/integercompression/OptPFD.java +++ b/src/main/java/me/lemire/integercompression/OptPFD.java @@ -49,8 +49,7 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); if (inlength == 0) return; - final int finalinpos = inpos.get() + inlength; - encodePage(in, inpos, finalinpos, out, outpos); + encodePage(in, inpos, inlength, out, outpos); } private static final int[] bits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, @@ -145,8 +144,7 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, if (inlength == 0) return; mynvalue = Util.greatestMultiple(mynvalue, BLOCK_SIZE); - final int finalout = outpos.get() + mynvalue; - decodePage(in, inpos, out, outpos, finalout); + decodePage(in, inpos, out, outpos, mynvalue); } private void decodePage(int[] in, IntWrapper inpos, int[] out, diff --git a/src/main/java/me/lemire/integercompression/OptPFDS16.java b/src/main/java/me/lemire/integercompression/OptPFDS16.java index 13da6bf..8574b10 100644 --- a/src/main/java/me/lemire/integercompression/OptPFDS16.java +++ b/src/main/java/me/lemire/integercompression/OptPFDS16.java @@ -49,8 +49,7 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, if (inlength == 0) return; - final int finalinpos = inpos.get() + inlength; - encodePage(in, inpos, finalinpos, out, outpos); + encodePage(in, inpos, inlength, out, outpos); } @@ -145,8 +144,7 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, if (inlength == 0) return; mynvalue = Util.greatestMultiple(mynvalue, BLOCK_SIZE); - final int finalout = outpos.get() + mynvalue; - decodePage(in, inpos, out, outpos, finalout); + decodePage(in, inpos, out, outpos, mynvalue); } private void decodePage(int[] in, IntWrapper inpos, int[] out, diff --git a/src/main/java/me/lemire/integercompression/OptPFDS9.java b/src/main/java/me/lemire/integercompression/OptPFDS9.java index 64981ef..34f4206 100644 --- a/src/main/java/me/lemire/integercompression/OptPFDS9.java +++ b/src/main/java/me/lemire/integercompression/OptPFDS9.java @@ -48,9 +48,7 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); if (inlength == 0) return; - - final int finalinpos = inpos.get() + inlength; - encodePage(in, inpos, finalinpos, out, outpos); + encodePage(in, inpos, inlength, out, outpos); } @@ -145,8 +143,7 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, if (inlength == 0) return; mynvalue = Util.greatestMultiple(mynvalue, BLOCK_SIZE); - final int finalout = outpos.get() + mynvalue; - decodePage(in, inpos, out, outpos, finalout); + decodePage(in, inpos, out, outpos, mynvalue); } private void decodePage(int[] in, IntWrapper inpos, int[] out, From bea8a0c24a8c446b1300d3aaeec0b81082dbcc00 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 17 Sep 2014 19:09:21 -0400 Subject: [PATCH 186/412] Skippable integrated binary packing. --- .../benchmarktools/BenchmarkSkippable.java | 587 ++++++++---------- .../differential/IntegratedBinaryPacking.java | 259 +++++--- .../differential/IntegratedComposition.java | 2 +- .../differential/IntegratedVariableByte.java | 82 ++- .../SkippableIntegratedComposition.java | 73 +++ .../SkippableIntegratedIntegerCODEC.java | 73 +++ 6 files changed, 645 insertions(+), 431 deletions(-) create mode 100644 src/main/java/me/lemire/integercompression/differential/SkippableIntegratedComposition.java create mode 100644 src/main/java/me/lemire/integercompression/differential/SkippableIntegratedIntegerCODEC.java diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java index c14adb1..8db991f 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java @@ -6,16 +6,9 @@ */ package me.lemire.integercompression.benchmarktools; -import com.kamikaze.pfordelta.PForDelta; - import me.lemire.integercompression.BinaryPacking; -import me.lemire.integercompression.ByteIntegerCODEC; -import me.lemire.integercompression.Composition; -import me.lemire.integercompression.DeltaZigzagBinaryPacking; -import me.lemire.integercompression.DeltaZigzagVariableByte; import me.lemire.integercompression.FastPFOR; import me.lemire.integercompression.IntWrapper; -import me.lemire.integercompression.IntegerCODEC; import me.lemire.integercompression.JustCopy; import me.lemire.integercompression.NewPFD; import me.lemire.integercompression.NewPFDS16; @@ -30,19 +23,14 @@ import me.lemire.integercompression.VariableByte; import me.lemire.integercompression.differential.Delta; import me.lemire.integercompression.differential.IntegratedBinaryPacking; -import me.lemire.integercompression.differential.IntegratedByteIntegerCODEC; -import me.lemire.integercompression.differential.IntegratedComposition; -import me.lemire.integercompression.differential.IntegratedFastPFOR; -import me.lemire.integercompression.differential.IntegratedIntegerCODEC; import me.lemire.integercompression.differential.IntegratedVariableByte; -import me.lemire.integercompression.differential.XorBinaryPacking; +import me.lemire.integercompression.differential.SkippableIntegratedComposition; +import me.lemire.integercompression.differential.SkippableIntegratedIntegerCODEC; import me.lemire.integercompression.synth.ClusteredDataGenerator; import java.io.File; import java.io.FileNotFoundException; import java.io.PrintWriter; -import java.text.DecimalFormat; -import java.util.ArrayList; import java.util.Arrays; /** @@ -53,371 +41,300 @@ * */ public class BenchmarkSkippable { - - private static int compressWithSkipTable(SkippableIntegerCODEC c, int[] data, int[] output, IntWrapper outpos, int[] metadata, int blocksize) { + + private static int compressWithSkipTable(Object c, int[] data, + int[] output, IntWrapper outpos, int[] metadata, int blocksize) { int metapos = 0; metadata[metapos++] = data.length; IntWrapper inpos = new IntWrapper(); int initvalue = 0; - while(inpos.get() < data.length) { + IntWrapper ival = new IntWrapper(initvalue); + while (inpos.get() < data.length) { metadata[metapos++] = outpos.get(); metadata[metapos++] = initvalue; - if (!(c instanceof IntegratedIntegerCODEC)) { - int size = blocksize > data.length - inpos.get() ? data.length - inpos.get() : blocksize; - initvalue = Delta.delta(data,inpos.get(),size,initvalue); + if (c instanceof SkippableIntegerCODEC) { + int size = blocksize > data.length - inpos.get() ? data.length + - inpos.get() : blocksize; + initvalue = Delta.delta(data, inpos.get(), size, initvalue); + + ((SkippableIntegerCODEC) c).headlessCompress(data, inpos, + blocksize, output, outpos); + } else if (c instanceof SkippableIntegratedIntegerCODEC) { + ival.set(initvalue); + ((SkippableIntegratedIntegerCODEC) c).headlessCompress(data, + inpos, blocksize, output, outpos, ival); + initvalue = ival.get(); + } else { + throw new RuntimeException("Unrecognized codec " + c); } - c.headlessCompress(data, inpos, blocksize, output, outpos); } return metapos; } - private static int decompressFromSkipTable(SkippableIntegerCODEC c, int[] compressed, IntWrapper compressedpos, int[] metadata, int blocksize, int[] data) { + + private static int decompressFromSkipTable(Object c, int[] compressed, + IntWrapper compressedpos, int[] metadata, int blocksize, int[] data) { int metapos = 0; int length = metadata[metapos++]; IntWrapper uncomppos = new IntWrapper(); - while(uncomppos.get() < length) { + IntWrapper ival = new IntWrapper(); + while (uncomppos.get() < length) { int num = blocksize; - if(num > length - uncomppos.get()) num = length - uncomppos.get(); + if (num > length - uncomppos.get()) + num = length - uncomppos.get(); int location = metadata[metapos++]; + // System.out.println("location = "+location); int initvalue = metadata[metapos++]; int outputlocation = uncomppos.get(); - if(location != compressedpos.get()) throw new RuntimeException("Bug "+location+" "+compressedpos.get()); - c.headlessUncompress(compressed, compressedpos, compressed.length - uncomppos.get(), data, uncomppos, num); - if (!(c instanceof IntegratedIntegerCODEC)) { - initvalue = Delta.fastinverseDelta(data, outputlocation, num, initvalue); + if (location != compressedpos.get()) + throw new RuntimeException("Bug " + location + " " + + compressedpos.get()+ " codec "+c); + if (c instanceof SkippableIntegerCODEC) { + ((SkippableIntegerCODEC) c).headlessUncompress(compressed, + compressedpos, compressed.length - uncomppos.get(), + data, uncomppos, num); + initvalue = Delta.fastinverseDelta(data, outputlocation, num, + initvalue); + } else if (c instanceof SkippableIntegratedIntegerCODEC) { + ival.set(initvalue); + ((SkippableIntegratedIntegerCODEC) c).headlessUncompress( + compressed, compressedpos, compressed.length + - uncomppos.get(), data, uncomppos, num, ival); + // System.out.println("compressedpos = "+compressedpos); + + } else { + throw new RuntimeException("Unrecognized codec " + c); } } return length; } - /** - * Standard benchmark - * - * @param csvLog - * Writer for CSV log. - * @param c - * the codec - * @param data - * arrays of input data - * @param repeat - * How many times to repeat the test - * @param verbose - * whether to output result on screen - */ - private static void testCodec(PrintWriter csvLog, int sparsity, - SkippableIntegerCODEC c, int[][] data, int repeat, boolean verbose) { - if (verbose) { - System.out.println("# " + c.toString()); - System.out - .println("# bits per int, compress speed (mis), decompression speed (mis) "); - } - - int N = data.length; + /** + * Standard benchmark + * + * @param csvLog + * Writer for CSV log. + * @param c + * the codec + * @param data + * arrays of input data + * @param repeat + * How many times to repeat the test + * @param verbose + * whether to output result on screen + */ + private static void testCodec(PrintWriter csvLog, int sparsity, Object c, + int[][] data, int repeat, boolean verbose) { + if (verbose) { + System.out.println("# " + c.toString()); + System.out + .println("# bits per int, compress speed (mis), decompression speed (mis) "); + } - int totalSize = 0; - int maxLength = 0; - for (int k = 0; k < N; ++k) { - totalSize += data[k].length; - if (data[k].length > maxLength) { - maxLength = data[k].length; - } - } + int N = data.length; - // 4x + 1024 to account for the possibility of some negative - // compression. - int[] compressBuffer = new int[4 * maxLength + 1024]; - int[] decompressBuffer = new int[maxLength + 1024]; - int[] metadataBuffer = new int[maxLength]; - final int blocksize = 1024; + int totalSize = 0; + int maxLength = 0; + for (int k = 0; k < N; ++k) { + totalSize += data[k].length; + if (data[k].length > maxLength) { + maxLength = data[k].length; + } + } - // These variables hold time in microseconds (10^-6). - double compressTime = 0; - double decompressTime = 0; - final int times = 5; + // 4x + 1024 to account for the possibility of some negative + // compression. + int[] compressBuffer = new int[4 * maxLength + 1024]; + int[] decompressBuffer = new int[maxLength + 1024]; + int[] metadataBuffer = new int[maxLength]; + final int blocksize = 1024; - int size = 0; + // These variables hold time in microseconds (10^-6). + double compressTime = 0; + double decompressTime = 0; + final int times = 5; - for (int r = 0; r < repeat; ++r) { - size = 0; - for (int k = 0; k < N; ++k) { - int[] backupdata = Arrays.copyOf(data[k], - data[k].length); + int size = 0; - // compress data. - long beforeCompress = System.nanoTime() / 1000; - IntWrapper outpos = new IntWrapper(); - compressWithSkipTable(c, backupdata, compressBuffer, outpos, metadataBuffer,blocksize ); - long afterCompress = System.nanoTime() / 1000; + for (int r = 0; r < repeat; ++r) { + size = 0; + for (int k = 0; k < N; ++k) { + int[] backupdata = Arrays.copyOf(data[k], data[k].length); - // measure time of compression. - compressTime += afterCompress - beforeCompress; - final int thiscompsize = outpos.get(); - size += thiscompsize; - // dry run - int volume = 0; - { - IntWrapper compressedpos = new IntWrapper(0); - volume = decompressFromSkipTable(c, compressBuffer, compressedpos, metadataBuffer, blocksize, decompressBuffer); - } - // extract (uncompress) data - long beforeDecompress = System.nanoTime() / 1000; - for(int t = 0; t maxlength) - maxlength = data[k].length; - } - int[] buffer = new int[maxlength + 1024]; - /* - * 4x + 1024 to account for the possibility of some negative - * compression - */ - int size = 0; - int comptime = 0; - long decomptime = 0; - for (int r = 0; r < repeat; ++r) { - size = 0; - for (int k = 0; k < N; ++k) { - int outpos = 0; - int[] backupdata = Arrays.copyOf(data[k], - data[k].length); - // - bef = System.nanoTime() / 1000; - Delta.delta(backupdata); - ArrayList dataout = new ArrayList( - data[k].length / 128); - for (int K = 0; K < data[k].length; K += 128) { - final int[] compressedbuf = PForDelta - .compressOneBlockOpt(Arrays - .copyOfRange( - backupdata, K, - K + 128), 128); - dataout.add(compressedbuf); - outpos += compressedbuf.length; - } - aft = System.nanoTime() / 1000; - // - comptime += aft - bef; - final int thiscompsize = outpos; - size += thiscompsize; - // - bef = System.nanoTime() / 1000; - ArrayList datauncomp = new ArrayList( - dataout.size()); - int deltaoffset = 0; + if (verbose) { + double bitsPerInt = size * 32.0 / totalSize; + long compressSpeed = Math + .round(totalSize * repeat / (compressTime)); + long decompressSpeed = Math.round(totalSize * repeat + / (decompressTime)); + System.out.println(String.format("\t%1$.2f\t%2$d\t%3$d", + bitsPerInt, compressSpeed, decompressSpeed)); + csvLog.format("\"%1$s\",%2$d,%3$.2f,%4$d,%5$d\n", c.toString(), + sparsity, bitsPerInt, compressSpeed, decompressSpeed); + csvLog.flush(); + } + } - for (int[] compbuf : dataout) { - int[] tmpbuf = new int[128]; - PForDelta.decompressOneBlock(tmpbuf, - compbuf, 128); - tmpbuf[0] += deltaoffset; - Delta.fastinverseDelta(tmpbuf); - deltaoffset = tmpbuf[127]; - datauncomp.add(tmpbuf); - } - aft = System.nanoTime() / 1000; - // - decomptime += aft - bef; - if (datauncomp.size() * 128 != data[k].length) - throw new RuntimeException( - "we have a bug (diff length) " - + " expected " - + data[k].length - + " got " - + datauncomp.size() - * 128); - for (int m = 0; m < data[k].length; ++m) - if (datauncomp.get(m / 128)[m % 128] != data[k][m]) { - throw new RuntimeException( - "we have a bug (actual difference), expected " - + data[k][m] - + " found " - + buffer[m] - + " at " + m); - } + /** + * Main method. + * + * @param args + * command-line arguments + * @throws FileNotFoundException + * when we fail to create a new file + */ + public static void main(String args[]) throws FileNotFoundException { + System.out.println("# benchmark based on the ClusterData model from:"); + System.out.println("# Vo Ngoc Anh and Alistair Moffat. "); + System.out.println("# Index compression using 64-bit words."); + System.out + .println("# Softw. Pract. Exper.40, 2 (February 2010), 131-147. "); + System.out.println(); - } - } - - line += "\t" + df.format(size * 32.0 / totalsize); - line += "\t" + dfspeed.format(totalsize * repeat / (comptime)); - line += "\t" - + dfspeed.format(totalsize * repeat / (decomptime)); - if (verbose) - System.out.println(line); + PrintWriter writer = null; + try { + File csvFile = new File(String.format( + "benchmark-%1$tY%1$tm%1$tdT%1$tH%1$tM%1$tS.csv", + System.currentTimeMillis())); + writer = new PrintWriter(csvFile); + System.out.println("# Results will be written into a CSV file: " + + csvFile.getName()); + System.out.println(); + test(writer, 20, 18, 10); + System.out.println(); + System.out.println("Results were written into a CSV file: " + + csvFile.getName()); + } finally { + if (writer != null) { + writer.close(); + } } + } - /** - * Generate test data. - * - * @param N - * How many input arrays to generate - * @param nbr - * How big (in log2) should the arrays be - * @param sparsity - * How sparse test data generated - */ - private static int[][] generateTestData(ClusteredDataGenerator dataGen, - int N, int nbr, int sparsity) { - final int[][] data = new int[N][]; - final int dataSize = (1 << (nbr + sparsity)); - for (int i = 0; i < N; ++i) { - data[i] = dataGen.generateClustered((1 << nbr), - dataSize); - } - return data; + /** + * Generate test data. + * + * @param N + * How many input arrays to generate + * @param nbr + * How big (in log2) should the arrays be + * @param sparsity + * How sparse test data generated + */ + private static int[][] generateTestData(ClusteredDataGenerator dataGen, + int N, int nbr, int sparsity) { + final int[][] data = new int[N][]; + final int dataSize = (1 << (nbr + sparsity)); + for (int i = 0; i < N; ++i) { + data[i] = dataGen.generateClustered((1 << nbr), dataSize); } - static SkippableIntegerCODEC[] codecs = { - new JustCopy(), - new VariableByte(), - new SkippableComposition(new BinaryPacking(), new VariableByte()), - new SkippableComposition(new NewPFD(), new VariableByte()), - new SkippableComposition(new NewPFDS9(), new VariableByte()), - new SkippableComposition(new NewPFDS16(), new VariableByte()), - new SkippableComposition(new OptPFD(), new VariableByte()), - new SkippableComposition(new OptPFDS9(), new VariableByte()), - new SkippableComposition(new OptPFDS16(), new VariableByte()), - new SkippableComposition(new FastPFOR(), new VariableByte()), - new Simple9(), - new Simple16() }; - /** - * Generates data and calls other tests. - * - * @param csvLog - * Writer for CSV log. - * @param N - * How many input arrays to generate - * @param nbr - * how big (in log2) should the arrays be - * @param repeat - * How many times should we repeat tests. - */ - private static void test(PrintWriter csvLog, int N, int nbr, int repeat) { - csvLog.format("\"Algorithm\",\"Sparsity\",\"Bits per int\",\"Compress speed (MiS)\",\"Decompress speed (MiS)\"\n"); - ClusteredDataGenerator cdg = new ClusteredDataGenerator(); - final int max_sparsity = 31 - nbr; - for (int sparsity = 1; sparsity < max_sparsity; ++sparsity) { - System.out.println("# sparsity " + sparsity); - System.out.println("# generating random data..."); - int[][] data = generateTestData(cdg, N, nbr, sparsity); - System.out.println("# generating random data... ok."); - for(SkippableIntegerCODEC c : codecs) { - testCodec(csvLog, sparsity, c, data, sparsity, false); - testCodec(csvLog, sparsity, c, data, sparsity, false); - testCodec(csvLog, sparsity, c, data, sparsity, true); - } + return data; + } + static Object[] codecs = { + new IntegratedBinaryPacking(), + new IntegratedVariableByte(), + new SkippableIntegratedComposition(new IntegratedBinaryPacking(), + new IntegratedVariableByte()), + new JustCopy(), + new VariableByte(), + + new SkippableComposition(new BinaryPacking(), new VariableByte()), + new SkippableComposition(new NewPFD(), new VariableByte()), + new SkippableComposition(new NewPFDS9(), new VariableByte()), + new SkippableComposition(new NewPFDS16(), new VariableByte()), + new SkippableComposition(new OptPFD(), new VariableByte()), + new SkippableComposition(new OptPFDS9(), new VariableByte()), + new SkippableComposition(new OptPFDS16(), new VariableByte()), + new SkippableComposition(new FastPFOR(), new VariableByte()), + new Simple9(), new Simple16() }; + + /** + * Generates data and calls other tests. + * + * @param csvLog + * Writer for CSV log. + * @param N + * How many input arrays to generate + * @param nbr + * how big (in log2) should the arrays be + * @param repeat + * How many times should we repeat tests. + */ + private static void test(PrintWriter csvLog, int N, int nbr, int repeat) { + csvLog.format("\"Algorithm\",\"Sparsity\",\"Bits per int\",\"Compress speed (MiS)\",\"Decompress speed (MiS)\"\n"); + ClusteredDataGenerator cdg = new ClusteredDataGenerator(); + final int max_sparsity = 31 - nbr; + + for (int sparsity = 1; sparsity < max_sparsity; ++sparsity) { + System.out.println("# sparsity " + sparsity); + System.out.println("# generating random data..."); + int[][] data = generateTestData(cdg, N, nbr, sparsity); + System.out.println("# generating random data... ok."); + for (Object c : codecs) { + testCodec(csvLog, sparsity, c, data, repeat, false); + testCodec(csvLog, sparsity, c, data, repeat, false); + testCodec(csvLog, sparsity, c, data, repeat, true); + } - } } + } } diff --git a/src/main/java/me/lemire/integercompression/differential/IntegratedBinaryPacking.java b/src/main/java/me/lemire/integercompression/differential/IntegratedBinaryPacking.java index 82f95b2..7c3bbf9 100644 --- a/src/main/java/me/lemire/integercompression/differential/IntegratedBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedBinaryPacking.java @@ -11,119 +11,198 @@ import me.lemire.integercompression.Util; /** - * Scheme based on a commonly used idea: can be extremely fast. + * Scheme based on a commonly used idea: can be extremely fast. * * You should only use this scheme on sorted arrays. Use BinaryPacking if you * have unsorted arrays. * - * It encodes integers in blocks of 128 integers. For arrays containing - * an arbitrary number of integers, you should use it in conjunction - * with another CODEC: + * It encodes integers in blocks of 128 integers. For arrays containing an + * arbitrary number of integers, you should use it in conjunction with another + * CODEC: * - *
IntegratedIntegerCODEC is = 
+ * 
+ * IntegratedIntegerCODEC is = 
  * new IntegratedComposition(new IntegratedBinaryPacking(), 
- * new IntegratedVariableByte())
+ * new IntegratedVariableByte()) + *
* *

* For details, please see *

*

* Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second - * through vectorization Software: Practice & Experience - * http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract - * http://arxiv.org/abs/1209.2137 + * through vectorization Software: Practice & Experience http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract http://arxiv.org/abs/1209.2137 *

*

- * Daniel Lemire, Leonid Boytsov, Nathan Kurz, - * SIMD Compression and the Intersection of Sorted Integers - * http://arxiv.org/abs/1401.6399 + * Daniel Lemire, Leonid Boytsov, Nathan Kurz, SIMD Compression and the + * Intersection of Sorted Integers http://arxiv.org/abs/1401.6399 *

* * @author Daniel Lemire * */ -public class IntegratedBinaryPacking implements IntegratedIntegerCODEC { +public class IntegratedBinaryPacking implements IntegratedIntegerCODEC, + SkippableIntegratedIntegerCODEC { - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { - inlength = inlength / 128 * 128; - if (inlength == 0) - return; - out[outpos.get()] = inlength; - outpos.increment(); - int tmpoutpos = outpos.get(); - int initoffset = 0; - for (int s = inpos.get(); s < inpos.get() + inlength; s += 32 * 4) { - final int mbits1 = Util.maxdiffbits(initoffset, in, s, - 32); - int initoffset2 = in[s + 31]; - final int mbits2 = Util.maxdiffbits(initoffset2, in, - s + 32, 32); - int initoffset3 = in[s + 32 + 31]; - final int mbits3 = Util.maxdiffbits(initoffset3, in, - s + 2 * 32, 32); - int initoffset4 = in[s + 2 * 32 + 31]; - final int mbits4 = Util.maxdiffbits(initoffset4, in, - s + 3 * 32, 32); - out[tmpoutpos++] = (mbits1 << 24) | (mbits2 << 16) - | (mbits3 << 8) | (mbits4); - IntegratedBitPacking.integratedpack(initoffset, in, s, - out, tmpoutpos, mbits1); - tmpoutpos += mbits1; - IntegratedBitPacking.integratedpack(initoffset2, in, - s + 32, out, tmpoutpos, mbits2); - tmpoutpos += mbits2; - IntegratedBitPacking.integratedpack(initoffset3, in, - s + 2 * 32, out, tmpoutpos, mbits3); - tmpoutpos += mbits3; - IntegratedBitPacking.integratedpack(initoffset4, in, - s + 3 * 32, out, tmpoutpos, mbits4); - tmpoutpos += mbits4; - initoffset = in[s + 3 * 32 + 31]; - } - inpos.add(inlength); - outpos.set(tmpoutpos); + static final int BLOCK_SIZE = 128; + + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); + if (inlength == 0) + return; + out[outpos.get()] = inlength; + outpos.increment(); + int tmpoutpos = outpos.get(); + int initoffset = 0; + for (int s = inpos.get(); s < inpos.get() + inlength; s += 32 * 4) { + final int mbits1 = Util.maxdiffbits(initoffset, in, s, 32); + int initoffset2 = in[s + 31]; + final int mbits2 = Util.maxdiffbits(initoffset2, in, s + 32, 32); + int initoffset3 = in[s + 32 + 31]; + final int mbits3 = Util + .maxdiffbits(initoffset3, in, s + 2 * 32, 32); + int initoffset4 = in[s + 2 * 32 + 31]; + final int mbits4 = Util + .maxdiffbits(initoffset4, in, s + 3 * 32, 32); + out[tmpoutpos++] = (mbits1 << 24) | (mbits2 << 16) | (mbits3 << 8) + | (mbits4); + IntegratedBitPacking.integratedpack(initoffset, in, s, out, + tmpoutpos, mbits1); + tmpoutpos += mbits1; + IntegratedBitPacking.integratedpack(initoffset2, in, s + 32, out, + tmpoutpos, mbits2); + tmpoutpos += mbits2; + IntegratedBitPacking.integratedpack(initoffset3, in, s + 2 * 32, + out, tmpoutpos, mbits3); + tmpoutpos += mbits3; + IntegratedBitPacking.integratedpack(initoffset4, in, s + 3 * 32, + out, tmpoutpos, mbits4); + tmpoutpos += mbits4; + initoffset = in[s + 3 * 32 + 31]; + } + inpos.add(inlength); + outpos.set(tmpoutpos); + } + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + if (inlength == 0) + return; + final int outlength = in[inpos.get()]; + inpos.increment(); + int tmpinpos = inpos.get(); + int initoffset = 0; + for (int s = outpos.get(); s < outpos.get() + outlength; s += 32 * 4) { + final int mbits1 = (in[tmpinpos] >>> 24); + final int mbits2 = (in[tmpinpos] >>> 16) & 0xFF; + final int mbits3 = (in[tmpinpos] >>> 8) & 0xFF; + final int mbits4 = (in[tmpinpos]) & 0xFF; + ++tmpinpos; + IntegratedBitPacking.integratedunpack(initoffset, in, tmpinpos, + out, s, mbits1); + tmpinpos += mbits1; + initoffset = out[s + 31]; + IntegratedBitPacking.integratedunpack(initoffset, in, tmpinpos, + out, s + 32, mbits2); + tmpinpos += mbits2; + initoffset = out[s + 32 + 31]; + IntegratedBitPacking.integratedunpack(initoffset, in, tmpinpos, + out, s + 2 * 32, mbits3); + tmpinpos += mbits3; + initoffset = out[s + 2 * 32 + 31]; + IntegratedBitPacking.integratedunpack(initoffset, in, tmpinpos, + out, s + 3 * 32, mbits4); + tmpinpos += mbits4; + initoffset = out[s + 3 * 32 + 31]; } + outpos.add(outlength); + inpos.set(tmpinpos); + } - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { - if (inlength == 0) - return; - final int outlength = in[inpos.get()]; - inpos.increment(); - int tmpinpos = inpos.get(); - int initoffset = 0; - for (int s = outpos.get(); s < outpos.get() + outlength; s += 32 * 4) { - final int mbits1 = (in[tmpinpos] >>> 24); - final int mbits2 = (in[tmpinpos] >>> 16) & 0xFF; - final int mbits3 = (in[tmpinpos] >>> 8) & 0xFF; - final int mbits4 = (in[tmpinpos]) & 0xFF; - ++tmpinpos; - IntegratedBitPacking.integratedunpack(initoffset, in, - tmpinpos, out, s, mbits1); - tmpinpos += mbits1; - initoffset = out[s + 31]; - IntegratedBitPacking.integratedunpack(initoffset, in, - tmpinpos, out, s + 32, mbits2); - tmpinpos += mbits2; - initoffset = out[s + 32 + 31]; - IntegratedBitPacking.integratedunpack(initoffset, in, - tmpinpos, out, s + 2 * 32, mbits3); - tmpinpos += mbits3; - initoffset = out[s + 2 * 32 + 31]; - IntegratedBitPacking.integratedunpack(initoffset, in, - tmpinpos, out, s + 3 * 32, mbits4); - tmpinpos += mbits4; - initoffset = out[s + 3 * 32 + 31]; - } - outpos.add(outlength); - inpos.set(tmpinpos); + @Override + public String toString() { + return this.getClass().getSimpleName(); + } + + @Override + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos, IntWrapper initvalue) { + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); + if (inlength == 0) + return; + int tmpoutpos = outpos.get(); + int initoffset = initvalue.get(); + initvalue.set(in[inpos.get()+inlength -1]); + + for (int s = inpos.get(); s < inpos.get() + inlength; s += 32 * 4) { + final int mbits1 = Util.maxdiffbits(initoffset, in, s, 32); + int initoffset2 = in[s + 31]; + final int mbits2 = Util.maxdiffbits(initoffset2, in, s + 32, 32); + int initoffset3 = in[s + 32 + 31]; + final int mbits3 = Util + .maxdiffbits(initoffset3, in, s + 2 * 32, 32); + int initoffset4 = in[s + 2 * 32 + 31]; + final int mbits4 = Util + .maxdiffbits(initoffset4, in, s + 3 * 32, 32); + out[tmpoutpos++] = (mbits1 << 24) | (mbits2 << 16) | (mbits3 << 8) + | (mbits4); + IntegratedBitPacking.integratedpack(initoffset, in, s, out, + tmpoutpos, mbits1); + tmpoutpos += mbits1; + IntegratedBitPacking.integratedpack(initoffset2, in, s + 32, out, + tmpoutpos, mbits2); + tmpoutpos += mbits2; + IntegratedBitPacking.integratedpack(initoffset3, in, s + 2 * 32, + out, tmpoutpos, mbits3); + tmpoutpos += mbits3; + IntegratedBitPacking.integratedpack(initoffset4, in, s + 3 * 32, + out, tmpoutpos, mbits4); + tmpoutpos += mbits4; + initoffset = in[s + 3 * 32 + 31]; } + inpos.add(inlength); + outpos.set(tmpoutpos); + } - @Override - public String toString() { - return this.getClass().getSimpleName(); + @Override + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos, int num, IntWrapper initvalue) { + final int outlength = num; + int tmpinpos = inpos.get(); + int initoffset = initvalue.get(); + for (int s = outpos.get(); s < outpos.get() + outlength; s += 32 * 4) { + final int mbits1 = (in[tmpinpos] >>> 24); + final int mbits2 = (in[tmpinpos] >>> 16) & 0xFF; + final int mbits3 = (in[tmpinpos] >>> 8) & 0xFF; + final int mbits4 = (in[tmpinpos]) & 0xFF; + ++tmpinpos; + IntegratedBitPacking.integratedunpack(initoffset, in, tmpinpos, + out, s, mbits1); + tmpinpos += mbits1; + initoffset = out[s + 31]; + IntegratedBitPacking.integratedunpack(initoffset, in, tmpinpos, + out, s + 32, mbits2); + tmpinpos += mbits2; + initoffset = out[s + 32 + 31]; + IntegratedBitPacking.integratedunpack(initoffset, in, tmpinpos, + out, s + 2 * 32, mbits3); + tmpinpos += mbits3; + initoffset = out[s + 2 * 32 + 31]; + IntegratedBitPacking.integratedunpack(initoffset, in, tmpinpos, + out, s + 3 * 32, mbits4); + tmpinpos += mbits4; + initoffset = out[s + 3 * 32 + 31]; } + outpos.add(outlength); + initvalue.set(out[outpos.get()-1]); + inpos.set(tmpinpos); + + } } diff --git a/src/main/java/me/lemire/integercompression/differential/IntegratedComposition.java b/src/main/java/me/lemire/integercompression/differential/IntegratedComposition.java index 4843497..c7c3af5 100644 --- a/src/main/java/me/lemire/integercompression/differential/IntegratedComposition.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedComposition.java @@ -64,7 +64,7 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, @Override public String toString() { - return F1.toString() + " + " + F2.toString() + " (Integrated)"; + return F1.toString() + " + " + F2.toString(); } } diff --git a/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java b/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java index 9d3d925..74de784 100644 --- a/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java @@ -21,7 +21,8 @@ * * @author Daniel Lemire */ -public class IntegratedVariableByte implements IntegratedIntegerCODEC, IntegratedByteIntegerCODEC { +public class IntegratedVariableByte implements IntegratedIntegerCODEC, IntegratedByteIntegerCODEC, +SkippableIntegratedIntegerCODEC { private static byte extract7bits(int i, long val) { return (byte)((val >> (7 * i)) & ((1 << 7) - 1)); @@ -123,10 +124,8 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, val = in[p]; int c = (byte) (val >>> s); s += 8; - if (s == 32) { - s = 0; - p++; - } + p += s>>5; + s = s & 31; v += ((c & 127) << shift); if ((c & 128) == 128) { out[tmpoutpos] = v + initoffset; @@ -181,4 +180,77 @@ public String toString() { return this.getClass().getSimpleName(); } + @Override + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos, IntWrapper initvalue) { + if (inlength == 0) + return; + int initoffset = initvalue.get(); + initvalue.set(in[inpos.get()+inlength -1]); + ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); + buf.order(ByteOrder.LITTLE_ENDIAN); + for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { + final long val = (in[k] - initoffset) & 0xFFFFFFFFL; // To be consistent with unsigned integers in C/C++ + initoffset = in[k]; + if (val < (1 << 7)) { + buf.put((byte) (val | (1 << 7))); + } else if (val < (1 << 14)) { + buf.put((byte) extract7bits(0, val)); + buf.put((byte) (extract7bitsmaskless(1, (val)) | (1 << 7))); + } else if (val < (1 << 21)) { + buf.put((byte) extract7bits(0, val)); + buf.put((byte) extract7bits(1, val)); + buf.put((byte) (extract7bitsmaskless(2, (val)) | (1 << 7))); + } else if (val < (1 << 28)) { + buf.put((byte) extract7bits(0, val)); + buf.put((byte) extract7bits(1, val)); + buf.put((byte) extract7bits(2, val)); + buf.put((byte) (extract7bitsmaskless(3, (val)) | (1 << 7))); + } else { + buf.put((byte) extract7bits(0, val)); + buf.put((byte) extract7bits(1, val)); + buf.put((byte) extract7bits(2, val)); + buf.put((byte) extract7bits(3, val)); + buf.put((byte) (extract7bitsmaskless(4, (val)) | (1 << 7))); + } + } + while (buf.position() % 4 != 0) + buf.put((byte) 0); + final int length = buf.position(); + buf.flip(); + IntBuffer ibuf = buf.asIntBuffer(); + ibuf.get(out, outpos.get(), length / 4); + outpos.add(length / 4); + inpos.add(inlength); + } + + @Override + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos, int num, IntWrapper initvalue) { + int s = 0; + int val = 0; + int p = inpos.get(); + int initoffset = initvalue.get(); + int tmpoutpos = outpos.get(); + int finaloutpos = num + tmpoutpos; + for (int v = 0, shift = 0; tmpoutpos < finaloutpos;) { + val = in[p]; + int c = (byte) (val >>> s); + s += 8; + p += s>>5; + s = s & 31; + v += ((c & 127) << shift); + if ((c & 128) == 128) { + out[tmpoutpos++] = (initoffset = initoffset + v); + v = 0; + shift = 0; + } else + shift += 7; + } + initvalue.set(out[tmpoutpos-1]); + outpos.set(tmpoutpos); + + inpos.set(p + (s!=0 ? 1 : 0)); + } + } diff --git a/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedComposition.java b/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedComposition.java new file mode 100644 index 0000000..2dd79a4 --- /dev/null +++ b/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedComposition.java @@ -0,0 +1,73 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ +package me.lemire.integercompression.differential; + +import me.lemire.integercompression.IntWrapper; + +/** + * Helper class to compose schemes. + * + * @author Daniel Lemire + */ +public class SkippableIntegratedComposition implements + SkippableIntegratedIntegerCODEC { + SkippableIntegratedIntegerCODEC F1, F2; + + /** + * Compose a scheme from a first one (f1) and a second one (f2). The first + * one is called first and then the second one tries to compress whatever + * remains from the first run. + * + * By convention, the first scheme should be such that if, during decoding, + * a 32-bit zero is first encountered, then there is no output. + * + * @param f1 + * first codec + * @param f2 + * second codec + */ + public SkippableIntegratedComposition(SkippableIntegratedIntegerCODEC f1, + SkippableIntegratedIntegerCODEC f2) { + F1 = f1; + F2 = f2; + } + + + + @Override + public String toString() { + return F1.toString() + " + " + F2.toString(); + } + + @Override + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos, IntWrapper initvalue) { + if (inlength == 0) + return; + final int init = inpos.get(); + F1.headlessCompress(in, inpos, inlength, out, outpos, initvalue); + if (outpos.get() == 0) { + out[0] = 0; + outpos.increment(); + } + inlength -= inpos.get() - init; + F2.headlessCompress(in, inpos, inlength, out, outpos, initvalue); + } + + @Override + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos, int num, IntWrapper initvalue) { + if (inlength == 0) + return; + int init = inpos.get(); + F1.headlessUncompress(in, inpos, inlength, out, outpos,num,initvalue); + inlength -= inpos.get() - init; + num -= outpos.get(); + F2.headlessUncompress(in, inpos, inlength, out, outpos,num,initvalue); + } + +} diff --git a/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedIntegerCODEC.java b/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedIntegerCODEC.java new file mode 100644 index 0000000..99e5f9d --- /dev/null +++ b/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedIntegerCODEC.java @@ -0,0 +1,73 @@ +/** + * This is code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + +package me.lemire.integercompression.differential; + +import me.lemire.integercompression.IntWrapper; + + +/** + * Interface describing a standard CODEC to compress integers. This is a + * variation on the IntegerCODEC interface meant to be used for random access + * and with integrated differential coding. + * + * The main differences are that we must specify the number of integers we wish to + * decode as well as the initial value (for differential coding). This information + * might be stored elsewhere. + * + * + * @author Daniel Lemire + * + */ +public interface SkippableIntegratedIntegerCODEC { + /** + * Compress data from an array to another array. + * + * Both inpos and outpos are modified to represent how much data was read + * and written to if 12 ints (inlength = 12) are compressed to 3 ints, then + * inpos will be incremented by 12 while outpos will be incremented by 3 we + * use IntWrapper to pass the values by reference. + * + * @param in + * input array + * @param inpos + * location in the input array + * @param inlength + * how many integers to compress + * @param out + * output array + * @param outpos + * where to write in the output array + * @param initvalue initial value for the purpose of differential coding, the value is automatically updated + */ + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos, IntWrapper initvalue); + + /** + * Uncompress data from an array to another array. + * + * Both inpos and outpos parameters are modified to indicate new positions + * after read/write. + * + * @param in + * array containing data in compressed form + * @param inpos + * where to start reading in the array + * @param inlength + * length of the compressed data (ignored by some schemes) + * @param out + * array where to write the compressed output + * @param outpos + * where to write the compressed output in out + * @param num + * number of integers we want to decode, the actual number of integers decoded can be less + * @param initvalue initial value for the purpose of differential coding, the value is automatically updated + */ + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos, int num, IntWrapper initvalue); + +} From db9cc1e2ff1f36cb302cf6db8ea27c4cbfc9d70e Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Thu, 18 Sep 2014 00:58:04 -0400 Subject: [PATCH 187/412] Saving... --- .../lemire/integercompression/FastPFOR.java | 38 ++++----- .../me/lemire/integercompression/Util.java | 84 +++++++++++++++++++ .../benchmarktools/Benchmark.java | 32 ++++--- .../benchmarktools/BenchmarkSkippable.java | 23 +++-- .../differential/IntegratedFastPFOR.java | 26 +++--- .../lemire/integercompression/BasicTest.java | 10 ++- .../lemire/integercompression/TestUtils.java | 52 +++++++++++- 7 files changed, 205 insertions(+), 60 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 14e37b5..0907f74 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -11,10 +11,10 @@ /** * This is a patching scheme designed for speed. - * It encodes integers in blocks of 128 integers within pages of + * It encodes integers in blocks of integers within pages of * up to 65536 integers. Note that it is important, to get good * compression and good performance, to use sizeable blocks (greater than 1024 integers). - * For arrays containing a number of integers that is not divisible by 128, you should use + * For arrays containing a number of integers that is not divisible by BLOCK_SIZE, you should use * it in conjunction with another CODEC: * * IntegerCODEC ic = new Composition(new FastPFOR(), new VariableByte()). @@ -38,7 +38,7 @@ * @author Daniel Lemire */ public final class FastPFOR implements IntegerCODEC,SkippableIntegerCODEC { - final static int BLOCK_SIZE = 128; + final static int BLOCK_SIZE = 256; final static int OVERHEAD_OF_EACH_EXCEPT = 8; final static int DEFAULT_PAGE_SIZE = 65536; @@ -49,7 +49,7 @@ public final class FastPFOR implements IntegerCODEC,SkippableIntegerCODEC { // Working area for compress and uncompress. int[] dataPointers; int[] freqs; - byte[] bestbbestcexceptmaxb; + int[] bestbbestcexceptmaxb = new int[3]; /** * Construct the FastPFOR CODEC. @@ -74,7 +74,7 @@ public FastPFOR() { } /** - * Compress data in blocks of 128 integers (if fewer than 128 integers + * Compress data in blocks of BLOCK_SIZE integers (if fewer than BLOCK_SIZE integers * are provided, nothing is done). * * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) @@ -90,7 +90,6 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, // Allocate memory for working area. dataPointers = new int[33]; freqs = new int[33]; - bestbbestcexceptmaxb = new byte[3]; final int finalinpos = inpos.get() + inlength; while (inpos.get() != finalinpos) { @@ -101,7 +100,6 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, dataPointers = null; freqs = null; - bestbbestcexceptmaxb = null; } private void getBestBFromData(int[] in, int pos) { @@ -114,11 +112,11 @@ private void getBestBFromData(int[] in, int pos) { bestbbestcexceptmaxb[0]--; bestbbestcexceptmaxb[2] = bestbbestcexceptmaxb[0]; int bestcost = bestbbestcexceptmaxb[0] * BLOCK_SIZE; - byte cexcept = 0; + int cexcept = 0; bestbbestcexceptmaxb[1] = cexcept; for (int b = bestbbestcexceptmaxb[0] - 1; b >= 0; --b) { cexcept += freqs[b + 1]; - if (cexcept < 0) + if (cexcept == BLOCK_SIZE) break; // the extra 8 is the cost of storing maxbits int thiscost = cexcept * OVERHEAD_OF_EACH_EXCEPT @@ -126,7 +124,7 @@ private void getBestBFromData(int[] in, int pos) { * BLOCK_SIZE + 8; if (thiscost < bestcost) { bestcost = thiscost; - bestbbestcexceptmaxb[0] = (byte) b; + bestbbestcexceptmaxb[0] = b; bestbbestcexceptmaxb[1] = cexcept; } } @@ -140,17 +138,17 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, // Clear working area. Arrays.fill(dataPointers, 0); - // Arrays.fill(bestbbestcexceptmaxb, (byte)0);//DL:unncessary byteContainer.clear(); int tmpinpos = inpos.get(); for (final int finalinpos = tmpinpos + thissize - BLOCK_SIZE; tmpinpos <= finalinpos; tmpinpos += BLOCK_SIZE) { - getBestBFromData(in, tmpinpos); + + getBestBFromData(in, tmpinpos); final int tmpbestb = bestbbestcexceptmaxb[0]; - byteContainer.put(bestbbestcexceptmaxb[0]); - byteContainer.put(bestbbestcexceptmaxb[1]); + byteContainer.put((byte)bestbbestcexceptmaxb[0]); + byteContainer.put((byte)bestbbestcexceptmaxb[1]); if (bestbbestcexceptmaxb[1] > 0) { - byteContainer.put(bestbbestcexceptmaxb[2]); + byteContainer.put((byte)bestbbestcexceptmaxb[2]); final int index = bestbbestcexceptmaxb[2] - bestbbestcexceptmaxb[0]; if (dataPointers[index] @@ -208,7 +206,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, } /** - * Uncompress data in blocks of 128 integers. In this particular case, + * Uncompress data in blocks of integers. In this particular case, * the inlength parameter is ignored: it is deduced from the compressed * data. * @@ -263,18 +261,18 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, int tmpinpos = inpos.get(); for (int run = 0, run_end = thissize / BLOCK_SIZE; run < run_end; ++run, tmpoutpos += BLOCK_SIZE) { - final byte b = byteContainer.get(); - final byte cexcept = byteContainer.get(); + final int b = byteContainer.get(); + final int cexcept = byteContainer.get() & 0xFF; for (int k = 0; k < BLOCK_SIZE; k += 32) { BitPacking.fastunpack(in, tmpinpos, out, tmpoutpos + k, b); tmpinpos += b; } if (cexcept > 0) { - final byte maxbits = byteContainer.get(); + final int maxbits = byteContainer.get(); final int index = maxbits - b; for (int k = 0; k < cexcept; ++k) { - final byte pos = byteContainer.get(); + final int pos = byteContainer.get() &0xFF; final int exceptvalue = dataTobePacked[index][dataPointers[index]++]; out[pos + tmpoutpos] |= exceptvalue << b; } diff --git a/src/main/java/me/lemire/integercompression/Util.java b/src/main/java/me/lemire/integercompression/Util.java index aa19ca4..0c584e1 100644 --- a/src/main/java/me/lemire/integercompression/Util.java +++ b/src/main/java/me/lemire/integercompression/Util.java @@ -6,6 +6,8 @@ */ package me.lemire.integercompression; +import java.util.Arrays; + /** * Routine utility functions. * @@ -99,7 +101,89 @@ public static int maxdiffbits(int initoffset, int[] i, int pos, int length) { public static int bits(int i) { return 32 - Integer.numberOfLeadingZeros(i); } + + protected static int packsize(int num, int b) { + if(b>16) return num; + int howmanyfit = 32/b; + return (num + howmanyfit - 1)/ howmanyfit; + } + + protected static int pack(int[] outputarray, int arraypos, int[] data, + int num, int b) { + if(num == 0) return arraypos; + if (b > 16) { + System.arraycopy(data, 0, outputarray, arraypos, num); + return num + arraypos; + } + for(int k = 0 ; k < packsize(num, b); ++k) outputarray[k+arraypos] = 0; + int inwordpointer = 0; + for (int k = 0; k < num; ++k) { + outputarray[arraypos] |= (data[k] << inwordpointer); + inwordpointer += b; + final int increment = ((inwordpointer + b - 1 ) >> 5); + arraypos += increment; + inwordpointer &= ~(-increment); + } + return arraypos + (inwordpointer>0?1:0); + } + + protected static int unpack(int[] sourcearray, int arraypos, int[] data, + int num, int b) { + if (b > 16) { + System.arraycopy(sourcearray, arraypos, data, 0, num); + return num + arraypos; + } + final int mask = (1 << b) - 1; + int inwordpointer = 0; + for (int k = 0; k < num; ++k) { + data[k] = (sourcearray[arraypos] & mask); + sourcearray[arraypos] >>>= b; + inwordpointer += b; + final int increment = ((inwordpointer + b - 1) >> 5); + arraypos += increment; + inwordpointer &= ~(-increment); + } + return arraypos + (inwordpointer>0?1:0); + } + protected static int packsizew(int num, int b) { + int howmanyfit = 32/b; + if (num <= howmanyfit) return 1; + return num; + } + + protected static int packw(int[] outputarray, int arraypos, int[] data, + int num, int b) { + int howmanyfit = 32/b; + if (num > howmanyfit) { + System.arraycopy(data, 0, outputarray, arraypos, num); + return num + arraypos; + } + outputarray[arraypos] = 0; + int inwordpointer = 0; + for (int k = 0; k < num; ++k) { + outputarray[arraypos] |= (data[k] << inwordpointer); + inwordpointer += b; + } + return arraypos + 1; + } + + protected static int unpackw(int[] sourcearray, int arraypos, int[] data, + int num, int b) { + int howmanyfit = 32/b; + if (num > howmanyfit) { + System.arraycopy(sourcearray, arraypos, data, 0, num); + return num + arraypos; + } + final int mask = (1 << b) - 1; + int val = sourcearray[arraypos]; + for (int k = 0; k < num; ++k) { + data[k] = (val & mask); + val >>>= b; + } + return arraypos + 1; + } + /** * return floor(value / factor) * factor * diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java b/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java index 7ca21da..e987bde 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java @@ -24,6 +24,7 @@ import me.lemire.integercompression.OptPFDS16; import me.lemire.integercompression.OptPFDS9; import me.lemire.integercompression.Simple9; +import me.lemire.integercompression.SkippableFastPFOR; import me.lemire.integercompression.VariableByte; import me.lemire.integercompression.differential.Delta; import me.lemire.integercompression.differential.IntegratedBinaryPacking; @@ -145,6 +146,7 @@ private static void testCodec(PrintWriter csvLog, int sparsity, // verify: compare original array with // compressed and // uncompressed. + for (int m = 0; m < outpos.get(); ++m) { if (decompressBuffer[m] != data[k][m]) { throw new RuntimeException( @@ -486,6 +488,25 @@ private static void test(PrintWriter csvLog, int N, int nbr, int repeat) { int[][] data = generateTestData(cdg, N, nbr, sparsity); System.out.println("# generating random data... ok."); + + testCodec(csvLog, sparsity, new Composition( + new FastPFOR(), new VariableByte()), data, + repeat, false); + testCodec(csvLog, sparsity, new Composition( + new FastPFOR(), new VariableByte()), data, + repeat, false); + testCodec(csvLog, sparsity, new Composition( + new FastPFOR(), new VariableByte()), data, + repeat, true); + System.out.println(); + + testCodec(csvLog, sparsity, new Composition(new SkippableFastPFOR(), new VariableByte()), data, repeat, + false); + testCodec(csvLog, sparsity, new Composition(new SkippableFastPFOR(), new VariableByte()), data, repeat, + false); + testCodec(csvLog, sparsity, new Composition(new SkippableFastPFOR(), new VariableByte()), data, repeat, + true); + // TODO: support CSV log output. testKamikaze(data, repeat, false); testKamikaze(data, repeat, false); @@ -623,17 +644,6 @@ private static void test(PrintWriter csvLog, int N, int nbr, int repeat) { System.out.println(); } - testCodec(csvLog, sparsity, new Composition( - new FastPFOR(), new VariableByte()), data, - repeat, false); - testCodec(csvLog, sparsity, new Composition( - new FastPFOR(), new VariableByte()), data, - repeat, false); - testCodec(csvLog, sparsity, new Composition( - new FastPFOR(), new VariableByte()), data, - repeat, true); - System.out.println(); - testCodec(csvLog, sparsity, new Simple9(), data, repeat, false); testCodec(csvLog, sparsity, new Simple9(), data, diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java index 8db991f..9782e92 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java @@ -19,6 +19,7 @@ import me.lemire.integercompression.Simple16; import me.lemire.integercompression.Simple9; import me.lemire.integercompression.SkippableComposition; +import me.lemire.integercompression.SkippableFastPFOR; import me.lemire.integercompression.SkippableIntegerCODEC; import me.lemire.integercompression.VariableByte; import me.lemire.integercompression.differential.Delta; @@ -82,12 +83,12 @@ private static int decompressFromSkipTable(Object c, int[] compressed, if (num > length - uncomppos.get()) num = length - uncomppos.get(); int location = metadata[metapos++]; - // System.out.println("location = "+location); + // System.out.println("location = "+location); int initvalue = metadata[metapos++]; int outputlocation = uncomppos.get(); if (location != compressedpos.get()) throw new RuntimeException("Bug " + location + " " - + compressedpos.get()+ " codec "+c); + + compressedpos.get() + " codec " + c); if (c instanceof SkippableIntegerCODEC) { ((SkippableIntegerCODEC) c).headlessUncompress(compressed, compressedpos, compressed.length - uncomppos.get(), @@ -99,7 +100,7 @@ private static int decompressFromSkipTable(Object c, int[] compressed, ((SkippableIntegratedIntegerCODEC) c).headlessUncompress( compressed, compressedpos, compressed.length - uncomppos.get(), data, uncomppos, num, ival); - // System.out.println("compressedpos = "+compressedpos); + // System.out.println("compressedpos = "+compressedpos); } else { throw new RuntimeException("Unrecognized codec " + c); @@ -184,7 +185,7 @@ private static void testCodec(PrintWriter csvLog, int sparsity, Object c, throw new RuntimeException( "Bad output size with codec " + c); for (int j = 0; j < volume; ++j) { - if (data[k][j] != decompressBuffer[j]) + if (data[k][j] != decompressBuffer[j]) throw new RuntimeException("bug in codec " + c); } } @@ -208,7 +209,7 @@ private static void testCodec(PrintWriter csvLog, int sparsity, Object c, // verify: compare original array with // compressed and // uncompressed. - for (int m = 0; m < outpos.get(); ++m) { + for (int m = 0; m < outpos.get(); ++m) { if (decompressBuffer[m] != data[k][m]) { throw new RuntimeException( "we have a bug (actual difference), expected " @@ -290,12 +291,10 @@ private static int[][] generateTestData(ClusteredDataGenerator dataGen, } static Object[] codecs = { - new IntegratedBinaryPacking(), - new IntegratedVariableByte(), - new SkippableIntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()), - new JustCopy(), - new VariableByte(), + new SkippableIntegratedComposition(new IntegratedBinaryPacking(), + new IntegratedVariableByte()), + new SkippableComposition(new SkippableFastPFOR(), + new VariableByte()), new JustCopy(), new VariableByte(), new SkippableComposition(new BinaryPacking(), new VariableByte()), new SkippableComposition(new NewPFD(), new VariableByte()), @@ -323,7 +322,7 @@ private static void test(PrintWriter csvLog, int N, int nbr, int repeat) { csvLog.format("\"Algorithm\",\"Sparsity\",\"Bits per int\",\"Compress speed (MiS)\",\"Decompress speed (MiS)\"\n"); ClusteredDataGenerator cdg = new ClusteredDataGenerator(); final int max_sparsity = 31 - nbr; - + for (int sparsity = 1; sparsity < max_sparsity; ++sparsity) { System.out.println("# sparsity " + sparsity); System.out.println("# generating random data..."); diff --git a/src/main/java/me/lemire/integercompression/differential/IntegratedFastPFOR.java b/src/main/java/me/lemire/integercompression/differential/IntegratedFastPFOR.java index a770226..b0f880e 100644 --- a/src/main/java/me/lemire/integercompression/differential/IntegratedFastPFOR.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedFastPFOR.java @@ -53,7 +53,10 @@ * @author Daniel Lemire */ public final class IntegratedFastPFOR implements IntegratedIntegerCODEC { - final static int BLOCK_SIZE = 128; + /** + * + */ + public final static int BLOCK_SIZE = 128; final static int OVERHEAD_OF_EACH_EXCEPT = 8; final static int DEFAULT_PAGE_SIZE = 65536; @@ -65,7 +68,7 @@ public final class IntegratedFastPFOR implements IntegratedIntegerCODEC { // Working area for compress and uncompress. int[] dataPointers; int[] freqs; - byte[] bestbbestcexceptmaxb; + int[] bestbbestcexceptmaxb = new int[3]; /** * Construct the FastPFOR CODEC. @@ -109,7 +112,6 @@ public void compress(int[] in, IntWrapper inpos, int inlength, // Allocate memory for working area. dataPointers = new int[33]; freqs = new int[33]; - bestbbestcexceptmaxb = new byte[3]; final int finalinpos = inpos.get() + inlength; while (inpos.get() != finalinpos) { @@ -120,7 +122,6 @@ public void compress(int[] in, IntWrapper inpos, int inlength, dataPointers = null; freqs = null; - bestbbestcexceptmaxb = null; } private void getBestBFromData(int[] in, int pos) { @@ -133,7 +134,7 @@ private void getBestBFromData(int[] in, int pos) { bestbbestcexceptmaxb[0]--; bestbbestcexceptmaxb[2] = bestbbestcexceptmaxb[0]; int bestcost = bestbbestcexceptmaxb[0] * BLOCK_SIZE; - byte cexcept = 0; + int cexcept = 0; bestbbestcexceptmaxb[1] = cexcept; for (int b = bestbbestcexceptmaxb[0] - 1; b >= 0; --b) { cexcept += freqs[b + 1]; @@ -160,7 +161,6 @@ private void encodePage(int[] constin, IntWrapper constinpos, // Clear working area. Arrays.fill(dataPointers, 0); - // Arrays.fill(bestbbestcexceptmaxb, (byte)0);//DL:unncessary byteContainer.clear(); int tmpconstinpos = constinpos.get(); @@ -170,11 +170,11 @@ private void encodePage(int[] constin, IntWrapper constinpos, BLOCK_SIZE, initoffset.intValue(), buffer)); getBestBFromData(buffer, 0); final int tmpbestb = bestbbestcexceptmaxb[0]; - byteContainer.put(bestbbestcexceptmaxb[0]); - byteContainer.put(bestbbestcexceptmaxb[1]); + byteContainer.put((byte)bestbbestcexceptmaxb[0]); + byteContainer.put((byte)bestbbestcexceptmaxb[1]); if (bestbbestcexceptmaxb[1] > 0) { - byteContainer.put(bestbbestcexceptmaxb[2]); + byteContainer.put((byte)bestbbestcexceptmaxb[2]); final int index = bestbbestcexceptmaxb[2] - bestbbestcexceptmaxb[0]; if (dataPointers[index] @@ -289,18 +289,18 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, int tmpinpos = inpos.get(); for (int run = 0, run_end = thissize / BLOCK_SIZE; run < run_end; ++run, tmpoutpos += BLOCK_SIZE) { - final byte b = byteContainer.get(); - final byte cexcept = byteContainer.get(); + final int b = byteContainer.get(); + final int cexcept = byteContainer.get() & 0xFF; for (int k = 0; k < 128; k += 32) { BitPacking.fastunpack(in, tmpinpos, out, tmpoutpos + k, b); tmpinpos += b; } if (cexcept > 0) { - final byte maxbits = byteContainer.get(); + final int maxbits = byteContainer.get(); final int index = maxbits - b; for (int k = 0; k < cexcept; ++k) { - final byte pos = byteContainer.get(); + final int pos = byteContainer.get() & 0xFF; final int exceptvalue = dataTobePacked[index][dataPointers[index]++]; out[pos + tmpoutpos] |= exceptvalue << b; } diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 81a07e9..2153ab6 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -24,6 +24,7 @@ @SuppressWarnings({ "static-method" }) public class BasicTest { IntegerCODEC[] codecs = { + new Composition(new SkippableFastPFOR(), new VariableByte()), new IntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte()), new JustCopy(), @@ -65,8 +66,11 @@ public void varyingLengthTest() { int[] comp = TestUtils.compress(c, Arrays.copyOf(data, L)); int[] answer = TestUtils.uncompress(c, comp, L); for (int k = 0; k < L; ++k) - if (answer[k] != data[k]) + if (answer[k] != data[k]) { + System.out.println(Arrays.toString(Arrays.copyOf(answer, L))); + System.out.println(Arrays.toString(Arrays.copyOf(data, L))); throw new RuntimeException("bug"); + } } } @@ -596,7 +600,7 @@ public void fastPforTest() { // proposed by Stefan Ackermann (https://github.com/Stivo) FastPFOR codec1 = new FastPFOR(); FastPFOR codec2 = new FastPFOR(); - int N = 128; + int N = FastPFOR.BLOCK_SIZE; int[] data = new int[N]; for (int i = 0; i < N; i++) data[i] = 0; @@ -617,7 +621,7 @@ public void ifastPforTest() { // inspired by Stefan Ackermann (https://github.com/Stivo) IntegratedFastPFOR codec1 = new IntegratedFastPFOR(); IntegratedFastPFOR codec2 = new IntegratedFastPFOR(); - int N = 128; + int N = IntegratedFastPFOR.BLOCK_SIZE; int[] data = new int[N]; for (int i = 0; i < N; i++) data[i] = 0; diff --git a/src/test/java/me/lemire/integercompression/TestUtils.java b/src/test/java/me/lemire/integercompression/TestUtils.java index 413654f..fb8039f 100644 --- a/src/test/java/me/lemire/integercompression/TestUtils.java +++ b/src/test/java/me/lemire/integercompression/TestUtils.java @@ -10,11 +10,61 @@ * Static utility methods for test. */ public class TestUtils { + /** * */ @Test - public void bogus() {}// to avoid useless complaining. + public void testPacking() { + int[] outputarray = new int[32]; + for(int b = 1; b < 32; ++b) { + int[] data = new int[32]; + int[] newdata = new int[32]; + int mask = (1< Date: Thu, 18 Sep 2014 00:59:28 -0400 Subject: [PATCH 188/412] Missing file --- .../integercompression/SkippableFastPFOR.java | 255 ++++++++++++++++++ .../me/lemire/integercompression/Util.java | 1 - 2 files changed, 255 insertions(+), 1 deletion(-) create mode 100644 src/main/java/me/lemire/integercompression/SkippableFastPFOR.java diff --git a/src/main/java/me/lemire/integercompression/SkippableFastPFOR.java b/src/main/java/me/lemire/integercompression/SkippableFastPFOR.java new file mode 100644 index 0000000..4d47103 --- /dev/null +++ b/src/main/java/me/lemire/integercompression/SkippableFastPFOR.java @@ -0,0 +1,255 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ +package me.lemire.integercompression; + +import java.nio.ByteBuffer; +import java.util.Arrays; + +/** + * This is a patching scheme designed for speed. It encodes integers in blocks + * integers. For arrays containing a number of + * integers that is not divisible by BLOCK_SIZE, you should use it in conjunction with + * another CODEC: + * + * IntegerCODEC ic = new Composition(new SkippableFastPFOR(), new + * VariableByte()). + *

+ * For details, please see + *

+ *

+ * Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second + * through vectorization Software: Practice & Experience http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract http://arxiv.org/abs/1209.2137 + *

+ *

+ * For sufficiently compressible and long arrays, it is faster and better than + * other PFOR schemes. + *

+ * + * Note that this does not use differential coding: if you are working on sorted + * lists, use IntegratedFastPFOR instead. + * + * For multi-threaded applications, each thread should use its own FastPFOR + * object. + * + * @author Daniel Lemire + */ +public final class SkippableFastPFOR implements IntegerCODEC, + SkippableIntegerCODEC { + /** + * + */ + final public static int BLOCK_SIZE = 256; + final static int OVERHEAD_OF_EACH_EXCEPT = 8; + + ByteBuffer byteContainer = null; + + // Working area for compress and uncompress. + int[] freqs = new int[33]; + int[] bestbbestcexceptmaxb = new int[3]; + int[] exceptionbuffer = new int[BLOCK_SIZE]; + + /** + * Construct the fastPFOR CODEC with default parameters. + */ + public SkippableFastPFOR() { + } + + /** + * Compress data in blocks of integers (if fewer than BLOCK_SIZE integers are + * provided, nothing is done). + * + * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) + */ + @Override + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); + if (inlength == 0) + return; + encodePage(in, inpos, inlength, out, outpos); + } + + private void getBestBFromData(int[] in, int pos) { + Arrays.fill(freqs, 0); + for (int k = pos, k_end = pos + BLOCK_SIZE; k < k_end; ++k) { + freqs[Util.bits(in[k])]++; + } + bestbbestcexceptmaxb[0] = 32; + while (freqs[bestbbestcexceptmaxb[0]] == 0) + bestbbestcexceptmaxb[0]--; + bestbbestcexceptmaxb[2] = bestbbestcexceptmaxb[0]; + int bestcost = bestbbestcexceptmaxb[0] * BLOCK_SIZE; + int cexcept = 0; + bestbbestcexceptmaxb[1] = cexcept; + for (int b = bestbbestcexceptmaxb[0] - 1; b >= 0; --b) { + cexcept += freqs[b + 1]; + if (cexcept == BLOCK_SIZE) + break; + // the extra 8 is the cost of storing maxbits + int thiscost = cexcept + * OVERHEAD_OF_EACH_EXCEPT + + Util.packsizew((int) cexcept, bestbbestcexceptmaxb[2] - b) + + b * BLOCK_SIZE + 8; + if (thiscost < bestcost) { + bestcost = thiscost; + bestbbestcexceptmaxb[0] = b; + bestbbestcexceptmaxb[1] = cexcept; + } + } + } + + private void encodePage(int[] in, IntWrapper inpos, int thissize, + int[] out, IntWrapper outpos) { + + final int headerpos = outpos.get(); + outpos.increment(); + int tmpoutpos = outpos.get(); + final int bytesrequired = 3 * thissize / BLOCK_SIZE + thissize; + if ((byteContainer == null) + || (byteContainer.capacity() < bytesrequired)) + byteContainer = ByteBuffer.allocateDirect(bytesrequired); + else + byteContainer.clear(); + + int tmpinpos = inpos.get(); + + for (final int finalinpos = tmpinpos + thissize - BLOCK_SIZE; tmpinpos <= finalinpos; tmpinpos += BLOCK_SIZE) { + getBestBFromData(in, tmpinpos); + final int tmpbestb = bestbbestcexceptmaxb[0]; + byteContainer.put((byte)bestbbestcexceptmaxb[0]); + byteContainer.put((byte)bestbbestcexceptmaxb[1]); + if (bestbbestcexceptmaxb[1] > 0) { + byteContainer.put((byte)bestbbestcexceptmaxb[2]); + for (int k = 0, ek = 0; k < BLOCK_SIZE; ++k) { + if ((in[k + tmpinpos] >>> bestbbestcexceptmaxb[0]) != 0) { + // we have an exception + byteContainer.put((byte) k); + exceptionbuffer[ek++] = in[k + tmpinpos] >>> tmpbestb; + } + } + + } + for (int k = 0; k < BLOCK_SIZE; k += 32) { + BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, tmpbestb); + tmpoutpos += tmpbestb; + } + final int index = bestbbestcexceptmaxb[2] - bestbbestcexceptmaxb[0]; + if (bestbbestcexceptmaxb[1] > 0) + tmpoutpos = Util.packw(out, tmpoutpos, exceptionbuffer, + bestbbestcexceptmaxb[1], index); + + } + inpos.set(tmpinpos); + out[headerpos] = tmpoutpos - headerpos; + final int bytesize = byteContainer.position(); + while ((byteContainer.position() & 3) != 0) + byteContainer.put((byte) 0); + out[tmpoutpos++] = bytesize; + final int howmanyints = byteContainer.position() / 4; + byteContainer.flip(); + byteContainer.asIntBuffer().get(out, tmpoutpos, howmanyints); + tmpoutpos += howmanyints; + outpos.set(tmpoutpos); + + } + + /** + * Uncompress data in blocks integers. In this particular case, the + * inlength parameter is ignored: it is deduced from the compressed data. + * + * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) + */ + @Override + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos, int mynvalue) { + if (inlength == 0) + return; + mynvalue = Util.greatestMultiple(mynvalue, BLOCK_SIZE); + if (mynvalue == 0) + return; + decodePage(in, inpos, out, outpos, mynvalue); + } + + private void decodePage(int[] in, IntWrapper inpos, int[] out, + IntWrapper outpos, int thissize) { + + final int initpos = inpos.get(); + final int wheremeta = in[inpos.get()]; + inpos.increment(); + int inexcept = initpos + wheremeta; + final int bytesize = in[inexcept++]; + if ((byteContainer == null) || (byteContainer.capacity() < bytesize)) + byteContainer = ByteBuffer.allocateDirect(bytesize); + else + byteContainer.clear(); + byteContainer.asIntBuffer().put(in, inexcept, (bytesize + 3) / 4); + inexcept += (bytesize + 3) / 4; + + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); + + for (int run = 0, run_end = thissize / BLOCK_SIZE; run < run_end; ++run, tmpoutpos += BLOCK_SIZE) { + final int b = byteContainer.get(); + final int cexcept = byteContainer.get() & 0xFF; + int nexttmpinpos = tmpinpos + b * BLOCK_SIZE / 32; + if (cexcept > 0) { + final int maxbits = byteContainer.get(); + final int index = maxbits - b; + nexttmpinpos = Util.unpackw(in, nexttmpinpos, exceptionbuffer, + cexcept, index); + + } + + for (int k = 0; k < BLOCK_SIZE; k += 32) { + BitPacking.fastunpack(in, tmpinpos + b * (k / 32), out, + tmpoutpos + k, b); + + } + tmpinpos = nexttmpinpos; + for (int k = 0; k < cexcept; ++k) { + final int pos = byteContainer.get() & 0xFF; + out[pos + tmpoutpos] |= exceptionbuffer[k] << b; + } + + } + outpos.set(tmpoutpos); + inpos.set(inexcept); + } + + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); + + if (inlength == 0) { + return; + } + + out[outpos.get()] = inlength; + outpos.increment(); + headlessCompress(in, inpos, inlength, out, outpos); + } + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + if (inlength == 0) + return; + final int outlength = in[inpos.get()]; + inpos.increment(); + headlessUncompress(in, inpos, inlength, out, outpos, outlength); + } + + @Override + public String toString() { + return this.getClass().getSimpleName(); + } +} diff --git a/src/main/java/me/lemire/integercompression/Util.java b/src/main/java/me/lemire/integercompression/Util.java index 0c584e1..a5c34c2 100644 --- a/src/main/java/me/lemire/integercompression/Util.java +++ b/src/main/java/me/lemire/integercompression/Util.java @@ -6,7 +6,6 @@ */ package me.lemire.integercompression; -import java.util.Arrays; /** * Routine utility functions. From 9520e70075435b2c24e733a6ad31ee1d1a0e59d3 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Thu, 18 Sep 2014 01:07:32 -0400 Subject: [PATCH 189/412] More cleaning. --- .../integercompression/SkippableFastPFOR.java | 255 ------------------ .../me/lemire/integercompression/Util.java | 53 ++-- .../benchmarktools/Benchmark.java | 7 - .../benchmarktools/BenchmarkSkippable.java | 5 +- .../lemire/integercompression/BasicTest.java | 1 - 5 files changed, 31 insertions(+), 290 deletions(-) delete mode 100644 src/main/java/me/lemire/integercompression/SkippableFastPFOR.java diff --git a/src/main/java/me/lemire/integercompression/SkippableFastPFOR.java b/src/main/java/me/lemire/integercompression/SkippableFastPFOR.java deleted file mode 100644 index 4d47103..0000000 --- a/src/main/java/me/lemire/integercompression/SkippableFastPFOR.java +++ /dev/null @@ -1,255 +0,0 @@ -/** - * This code is released under the - * Apache License Version 2.0 http://www.apache.org/licenses/. - * - * (c) Daniel Lemire, http://lemire.me/en/ - */ -package me.lemire.integercompression; - -import java.nio.ByteBuffer; -import java.util.Arrays; - -/** - * This is a patching scheme designed for speed. It encodes integers in blocks - * integers. For arrays containing a number of - * integers that is not divisible by BLOCK_SIZE, you should use it in conjunction with - * another CODEC: - * - * IntegerCODEC ic = new Composition(new SkippableFastPFOR(), new - * VariableByte()). - *

- * For details, please see - *

- *

- * Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second - * through vectorization Software: Practice & Experience http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract http://arxiv.org/abs/1209.2137 - *

- *

- * For sufficiently compressible and long arrays, it is faster and better than - * other PFOR schemes. - *

- * - * Note that this does not use differential coding: if you are working on sorted - * lists, use IntegratedFastPFOR instead. - * - * For multi-threaded applications, each thread should use its own FastPFOR - * object. - * - * @author Daniel Lemire - */ -public final class SkippableFastPFOR implements IntegerCODEC, - SkippableIntegerCODEC { - /** - * - */ - final public static int BLOCK_SIZE = 256; - final static int OVERHEAD_OF_EACH_EXCEPT = 8; - - ByteBuffer byteContainer = null; - - // Working area for compress and uncompress. - int[] freqs = new int[33]; - int[] bestbbestcexceptmaxb = new int[3]; - int[] exceptionbuffer = new int[BLOCK_SIZE]; - - /** - * Construct the fastPFOR CODEC with default parameters. - */ - public SkippableFastPFOR() { - } - - /** - * Compress data in blocks of integers (if fewer than BLOCK_SIZE integers are - * provided, nothing is done). - * - * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) - */ - @Override - public void headlessCompress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { - inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); - if (inlength == 0) - return; - encodePage(in, inpos, inlength, out, outpos); - } - - private void getBestBFromData(int[] in, int pos) { - Arrays.fill(freqs, 0); - for (int k = pos, k_end = pos + BLOCK_SIZE; k < k_end; ++k) { - freqs[Util.bits(in[k])]++; - } - bestbbestcexceptmaxb[0] = 32; - while (freqs[bestbbestcexceptmaxb[0]] == 0) - bestbbestcexceptmaxb[0]--; - bestbbestcexceptmaxb[2] = bestbbestcexceptmaxb[0]; - int bestcost = bestbbestcexceptmaxb[0] * BLOCK_SIZE; - int cexcept = 0; - bestbbestcexceptmaxb[1] = cexcept; - for (int b = bestbbestcexceptmaxb[0] - 1; b >= 0; --b) { - cexcept += freqs[b + 1]; - if (cexcept == BLOCK_SIZE) - break; - // the extra 8 is the cost of storing maxbits - int thiscost = cexcept - * OVERHEAD_OF_EACH_EXCEPT - + Util.packsizew((int) cexcept, bestbbestcexceptmaxb[2] - b) - + b * BLOCK_SIZE + 8; - if (thiscost < bestcost) { - bestcost = thiscost; - bestbbestcexceptmaxb[0] = b; - bestbbestcexceptmaxb[1] = cexcept; - } - } - } - - private void encodePage(int[] in, IntWrapper inpos, int thissize, - int[] out, IntWrapper outpos) { - - final int headerpos = outpos.get(); - outpos.increment(); - int tmpoutpos = outpos.get(); - final int bytesrequired = 3 * thissize / BLOCK_SIZE + thissize; - if ((byteContainer == null) - || (byteContainer.capacity() < bytesrequired)) - byteContainer = ByteBuffer.allocateDirect(bytesrequired); - else - byteContainer.clear(); - - int tmpinpos = inpos.get(); - - for (final int finalinpos = tmpinpos + thissize - BLOCK_SIZE; tmpinpos <= finalinpos; tmpinpos += BLOCK_SIZE) { - getBestBFromData(in, tmpinpos); - final int tmpbestb = bestbbestcexceptmaxb[0]; - byteContainer.put((byte)bestbbestcexceptmaxb[0]); - byteContainer.put((byte)bestbbestcexceptmaxb[1]); - if (bestbbestcexceptmaxb[1] > 0) { - byteContainer.put((byte)bestbbestcexceptmaxb[2]); - for (int k = 0, ek = 0; k < BLOCK_SIZE; ++k) { - if ((in[k + tmpinpos] >>> bestbbestcexceptmaxb[0]) != 0) { - // we have an exception - byteContainer.put((byte) k); - exceptionbuffer[ek++] = in[k + tmpinpos] >>> tmpbestb; - } - } - - } - for (int k = 0; k < BLOCK_SIZE; k += 32) { - BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, tmpbestb); - tmpoutpos += tmpbestb; - } - final int index = bestbbestcexceptmaxb[2] - bestbbestcexceptmaxb[0]; - if (bestbbestcexceptmaxb[1] > 0) - tmpoutpos = Util.packw(out, tmpoutpos, exceptionbuffer, - bestbbestcexceptmaxb[1], index); - - } - inpos.set(tmpinpos); - out[headerpos] = tmpoutpos - headerpos; - final int bytesize = byteContainer.position(); - while ((byteContainer.position() & 3) != 0) - byteContainer.put((byte) 0); - out[tmpoutpos++] = bytesize; - final int howmanyints = byteContainer.position() / 4; - byteContainer.flip(); - byteContainer.asIntBuffer().get(out, tmpoutpos, howmanyints); - tmpoutpos += howmanyints; - outpos.set(tmpoutpos); - - } - - /** - * Uncompress data in blocks integers. In this particular case, the - * inlength parameter is ignored: it is deduced from the compressed data. - * - * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) - */ - @Override - public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos, int mynvalue) { - if (inlength == 0) - return; - mynvalue = Util.greatestMultiple(mynvalue, BLOCK_SIZE); - if (mynvalue == 0) - return; - decodePage(in, inpos, out, outpos, mynvalue); - } - - private void decodePage(int[] in, IntWrapper inpos, int[] out, - IntWrapper outpos, int thissize) { - - final int initpos = inpos.get(); - final int wheremeta = in[inpos.get()]; - inpos.increment(); - int inexcept = initpos + wheremeta; - final int bytesize = in[inexcept++]; - if ((byteContainer == null) || (byteContainer.capacity() < bytesize)) - byteContainer = ByteBuffer.allocateDirect(bytesize); - else - byteContainer.clear(); - byteContainer.asIntBuffer().put(in, inexcept, (bytesize + 3) / 4); - inexcept += (bytesize + 3) / 4; - - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); - - for (int run = 0, run_end = thissize / BLOCK_SIZE; run < run_end; ++run, tmpoutpos += BLOCK_SIZE) { - final int b = byteContainer.get(); - final int cexcept = byteContainer.get() & 0xFF; - int nexttmpinpos = tmpinpos + b * BLOCK_SIZE / 32; - if (cexcept > 0) { - final int maxbits = byteContainer.get(); - final int index = maxbits - b; - nexttmpinpos = Util.unpackw(in, nexttmpinpos, exceptionbuffer, - cexcept, index); - - } - - for (int k = 0; k < BLOCK_SIZE; k += 32) { - BitPacking.fastunpack(in, tmpinpos + b * (k / 32), out, - tmpoutpos + k, b); - - } - tmpinpos = nexttmpinpos; - for (int k = 0; k < cexcept; ++k) { - final int pos = byteContainer.get() & 0xFF; - out[pos + tmpoutpos] |= exceptionbuffer[k] << b; - } - - } - outpos.set(tmpoutpos); - inpos.set(inexcept); - } - - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - - inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); - - if (inlength == 0) { - return; - } - - out[outpos.get()] = inlength; - outpos.increment(); - headlessCompress(in, inpos, inlength, out, outpos); - } - - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - if (inlength == 0) - return; - final int outlength = in[inpos.get()]; - inpos.increment(); - headlessUncompress(in, inpos, inlength, out, outpos, outlength); - } - - @Override - public String toString() { - return this.getClass().getSimpleName(); - } -} diff --git a/src/main/java/me/lemire/integercompression/Util.java b/src/main/java/me/lemire/integercompression/Util.java index a5c34c2..5ad2ff1 100644 --- a/src/main/java/me/lemire/integercompression/Util.java +++ b/src/main/java/me/lemire/integercompression/Util.java @@ -6,7 +6,6 @@ */ package me.lemire.integercompression; - /** * Routine utility functions. * @@ -72,7 +71,9 @@ protected static int maxbits32(int[] i, int pos) { /** * Compute the maximum of the integer logarithms (ceil(log(x+1)) of a the * successive differences (deltas) of a range of value - * @param initoffset initial vallue for the computation of the deltas + * + * @param initoffset + * initial vallue for the computation of the deltas * @param i * source array * @param pos @@ -100,30 +101,33 @@ public static int maxdiffbits(int initoffset, int[] i, int pos, int length) { public static int bits(int i) { return 32 - Integer.numberOfLeadingZeros(i); } - + protected static int packsize(int num, int b) { - if(b>16) return num; - int howmanyfit = 32/b; - return (num + howmanyfit - 1)/ howmanyfit; + if (b > 16) + return num; + int howmanyfit = 32 / b; + return (num + howmanyfit - 1) / howmanyfit; } - + protected static int pack(int[] outputarray, int arraypos, int[] data, int num, int b) { - if(num == 0) return arraypos; + if (num == 0) + return arraypos; if (b > 16) { System.arraycopy(data, 0, outputarray, arraypos, num); return num + arraypos; } - for(int k = 0 ; k < packsize(num, b); ++k) outputarray[k+arraypos] = 0; + for (int k = 0; k < packsize(num, b); ++k) + outputarray[k + arraypos] = 0; int inwordpointer = 0; for (int k = 0; k < num; ++k) { outputarray[arraypos] |= (data[k] << inwordpointer); inwordpointer += b; - final int increment = ((inwordpointer + b - 1 ) >> 5); + final int increment = ((inwordpointer + b - 1) >> 5); arraypos += increment; inwordpointer &= ~(-increment); } - return arraypos + (inwordpointer>0?1:0); + return arraypos + (inwordpointer > 0 ? 1 : 0); } protected static int unpack(int[] sourcearray, int arraypos, int[] data, @@ -138,22 +142,24 @@ protected static int unpack(int[] sourcearray, int arraypos, int[] data, data[k] = (sourcearray[arraypos] & mask); sourcearray[arraypos] >>>= b; inwordpointer += b; - final int increment = ((inwordpointer + b - 1) >> 5); + final int increment = ((inwordpointer + b - 1) >> 5); arraypos += increment; inwordpointer &= ~(-increment); } - return arraypos + (inwordpointer>0?1:0); + return arraypos + (inwordpointer > 0 ? 1 : 0); } + protected static int packsizew(int num, int b) { - int howmanyfit = 32/b; - if (num <= howmanyfit) return 1; + int howmanyfit = 32 / b; + if (num <= howmanyfit) + return 1; return num; } - + protected static int packw(int[] outputarray, int arraypos, int[] data, int num, int b) { - int howmanyfit = 32/b; - if (num > howmanyfit) { + int howmanyfit = 32 / b; + if (num > howmanyfit) { System.arraycopy(data, 0, outputarray, arraypos, num); return num + arraypos; } @@ -168,8 +174,8 @@ protected static int packw(int[] outputarray, int arraypos, int[] data, protected static int unpackw(int[] sourcearray, int arraypos, int[] data, int num, int b) { - int howmanyfit = 32/b; - if (num > howmanyfit) { + int howmanyfit = 32 / b; + if (num > howmanyfit) { System.arraycopy(sourcearray, arraypos, data, 0, num); return num + arraypos; } @@ -182,12 +188,13 @@ protected static int unpackw(int[] sourcearray, int arraypos, int[] data, return arraypos + 1; } - /** * return floor(value / factor) * factor * - * @param value numerator - * @param factor denominator + * @param value + * numerator + * @param factor + * denominator * @return greatest multiple of factor no larger than value */ public static int greatestMultiple(int value, int factor) { diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java b/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java index e987bde..625a3d1 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java @@ -24,7 +24,6 @@ import me.lemire.integercompression.OptPFDS16; import me.lemire.integercompression.OptPFDS9; import me.lemire.integercompression.Simple9; -import me.lemire.integercompression.SkippableFastPFOR; import me.lemire.integercompression.VariableByte; import me.lemire.integercompression.differential.Delta; import me.lemire.integercompression.differential.IntegratedBinaryPacking; @@ -500,12 +499,6 @@ private static void test(PrintWriter csvLog, int N, int nbr, int repeat) { repeat, true); System.out.println(); - testCodec(csvLog, sparsity, new Composition(new SkippableFastPFOR(), new VariableByte()), data, repeat, - false); - testCodec(csvLog, sparsity, new Composition(new SkippableFastPFOR(), new VariableByte()), data, repeat, - false); - testCodec(csvLog, sparsity, new Composition(new SkippableFastPFOR(), new VariableByte()), data, repeat, - true); // TODO: support CSV log output. testKamikaze(data, repeat, false); diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java index 9782e92..b738eff 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java @@ -19,7 +19,6 @@ import me.lemire.integercompression.Simple16; import me.lemire.integercompression.Simple9; import me.lemire.integercompression.SkippableComposition; -import me.lemire.integercompression.SkippableFastPFOR; import me.lemire.integercompression.SkippableIntegerCODEC; import me.lemire.integercompression.VariableByte; import me.lemire.integercompression.differential.Delta; @@ -292,9 +291,7 @@ private static int[][] generateTestData(ClusteredDataGenerator dataGen, static Object[] codecs = { new SkippableIntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()), - new SkippableComposition(new SkippableFastPFOR(), - new VariableByte()), new JustCopy(), new VariableByte(), + new IntegratedVariableByte()), new JustCopy(), new VariableByte(), new SkippableComposition(new BinaryPacking(), new VariableByte()), new SkippableComposition(new NewPFD(), new VariableByte()), diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 2153ab6..3449f52 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -24,7 +24,6 @@ @SuppressWarnings({ "static-method" }) public class BasicTest { IntegerCODEC[] codecs = { - new Composition(new SkippableFastPFOR(), new VariableByte()), new IntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte()), new JustCopy(), From 223bf3cd5cc0894ffd012422fb672ed1b00e496f Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Thu, 18 Sep 2014 10:32:48 -0400 Subject: [PATCH 190/412] New timings... --- .../benchmarkresults_haswell_18sept2014.txt | 861 ++++++++++++++++++ ...rkresults_skippable_haswell_18sept2014.txt | 513 +++++++++++ 2 files changed, 1374 insertions(+) create mode 100644 benchmarkresults/benchmarkresults_haswell_18sept2014.txt create mode 100644 benchmarkresults/benchmarkresults_skippable_haswell_18sept2014.txt diff --git a/benchmarkresults/benchmarkresults_haswell_18sept2014.txt b/benchmarkresults/benchmarkresults_haswell_18sept2014.txt new file mode 100644 index 0000000..43fa98b --- /dev/null +++ b/benchmarkresults/benchmarkresults_haswell_18sept2014.txt @@ -0,0 +1,861 @@ +# benchmark based on the ClusterData model from: +# Vo Ngoc Anh and Alistair Moffat. +# Index compression using 64-bit words. +# Softw. Pract. Exper.40, 2 (February 2010), 131-147. + +# Results will be written into a CSV file: benchmark-20140918T011257.csv + +# sparsity 1 +# generating random data... +# generating random data... ok. +# FastPFOR + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 2.56 246 1061 + +# kamikaze PForDelta +# bits per int, compress speed (mis), decompression speed (mis) + 3.21 66 275 + +# IntegratedBinaryPacking + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 2.96 838 1679 + +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1276 1805 + +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.00 490 509 + +# IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.00 582 774 + +# BinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 2.96 765 1193 + +# NewPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 2.88 139 896 + +# NewPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 2.90 166 905 + +# NewPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 2.88 139 898 + +# OptPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 2.87 25 938 + +# OptPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 2.90 29 960 + +# OptPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 2.87 25 882 + +# IntegratedFastPFOR + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 2.63 274 1015 + +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 2.83 280 771 + +# XorBinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 2.84 444 837 + +# DeltaZigzagBinaryPacking + DeltaZigzagVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.27 498 652 + +# sparsity 2 +# generating random data... +# generating random data... ok. +# FastPFOR + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.51 244 1048 + +# kamikaze PForDelta +# bits per int, compress speed (mis), decompression speed (mis) + 4.18 55 247 + +# IntegratedBinaryPacking + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.93 862 1611 + +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1286 1816 + +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.01 486 508 + +# IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.01 575 763 + +# BinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.93 774 1159 + +# NewPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.83 118 865 + +# NewPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.86 141 875 + +# NewPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.83 118 867 + +# OptPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.82 18 881 + +# OptPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.85 22 887 + +# OptPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.82 18 838 + +# IntegratedFastPFOR + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.58 273 990 + +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 3.82 201 656 + +# XorBinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.90 442 819 + +# DeltaZigzagBinaryPacking + DeltaZigzagVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.50 494 640 + +# sparsity 3 +# generating random data... +# generating random data... ok. +# FastPFOR + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.28 244 1030 + +# kamikaze PForDelta +# bits per int, compress speed (mis), decompression speed (mis) + 4.95 51 247 + +# IntegratedBinaryPacking + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.71 850 1577 + +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1252 1769 + +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.02 478 504 + +# IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.02 573 762 + +# BinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.71 770 1139 + +# NewPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.60 107 850 + +# NewPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.63 127 863 + +# NewPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.60 107 853 + +# OptPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.59 14 865 + +# OptPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.62 18 882 + +# OptPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.59 14 844 + +# IntegratedFastPFOR + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.34 268 969 + +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 4.72 170 610 + +# XorBinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.68 434 783 + +# DeltaZigzagBinaryPacking + DeltaZigzagVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.33 472 624 + +# sparsity 4 +# generating random data... +# generating random data... ok. +# FastPFOR + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.03 239 1004 + +# kamikaze PForDelta +# bits per int, compress speed (mis), decompression speed (mis) + 5.73 47 251 + +# IntegratedBinaryPacking + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.48 846 1556 + +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1274 1799 + +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.12 439 486 + +# IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.12 537 715 + +# BinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.48 769 1134 + +# NewPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.36 95 817 + +# NewPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.39 115 838 + +# NewPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.36 96 827 + +# OptPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.34 12 842 + +# OptPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.37 16 871 + +# OptPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.34 12 803 + +# IntegratedFastPFOR + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.09 268 963 + +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 5.57 150 587 + +# XorBinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.47 432 800 + +# DeltaZigzagBinaryPacking + DeltaZigzagVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.16 491 635 + +# sparsity 5 +# generating random data... +# generating random data... ok. +# FastPFOR + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.00 236 999 + +# kamikaze PForDelta +# bits per int, compress speed (mis), decompression speed (mis) + 6.70 43 242 + +# IntegratedBinaryPacking + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.45 863 1584 + +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1236 1792 + +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.40 369 452 + +# IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.40 486 617 + +# BinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.45 777 1132 + +# NewPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.33 86 808 + +# NewPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.36 103 828 + +# NewPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.33 86 813 + +# OptPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.31 9 825 + +# OptPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.34 13 858 + +# OptPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.31 9 819 + +# IntegratedFastPFOR + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.06 265 945 + +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 6.65 139 546 + +# XorBinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.45 442 804 + +# DeltaZigzagBinaryPacking + DeltaZigzagVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 7.18 493 635 + +# sparsity 6 +# generating random data... +# generating random data... ok. +# FastPFOR + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.76 238 998 + +# kamikaze PForDelta +# bits per int, compress speed (mis), decompression speed (mis) + 7.45 42 251 + +# IntegratedBinaryPacking + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 7.20 854 1525 + +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1177 1663 + +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 9.10 259 362 + +# IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 9.10 380 450 + +# BinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 7.20 718 1098 + +# NewPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 7.08 79 786 + +# NewPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 7.11 95 821 + +# NewPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 7.08 81 814 + +# OptPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 7.06 8 836 + +# OptPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 7.09 11 860 + +# OptPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 7.06 8 822 + +# IntegratedFastPFOR + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.81 268 962 + +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 7.56 129 509 + +# XorBinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 7.19 433 789 + +# DeltaZigzagBinaryPacking + DeltaZigzagVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 7.93 491 632 + +# sparsity 7 +# generating random data... +# generating random data... ok. +# FastPFOR + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.05 236 985 + +# kamikaze PForDelta +# bits per int, compress speed (mis), decompression speed (mis) + 8.75 39 247 + +# IntegratedBinaryPacking + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.50 861 1526 + +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1279 1788 + +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.11 190 305 + +# IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.11 311 355 + +# BinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.50 753 1092 + +# NewPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.37 71 792 + +# NewPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.40 83 804 + +# NewPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.37 72 805 + +# OptPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.35 7 808 + +# OptPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.38 10 835 + +# OptPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.35 7 796 + +# IntegratedFastPFOR + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.10 259 920 + +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 9.16 111 447 + +# XorBinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.52 435 784 + +# DeltaZigzagBinaryPacking + DeltaZigzagVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 9.32 485 622 + +# sparsity 8 +# generating random data... +# generating random data... ok. +# FastPFOR + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.73 234 972 + +# kamikaze PForDelta +# bits per int, compress speed (mis), decompression speed (mis) + 9.44 37 250 + +# IntegratedBinaryPacking + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 9.19 848 1493 + +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1279 1858 + +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.04 167 307 + +# IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.04 309 353 + +# BinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 9.19 751 1095 + +# NewPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 9.06 67 770 + +# NewPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 9.09 78 781 + +# NewPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 9.06 68 792 + +# OptPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 9.03 6 795 + +# OptPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 9.07 9 824 + +# OptPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 9.03 6 787 + +# IntegratedFastPFOR + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.78 266 936 + +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 10.34 101 427 + +# XorBinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 9.21 437 794 + +# DeltaZigzagBinaryPacking + DeltaZigzagVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.01 488 626 + +# sparsity 9 +# generating random data... +# generating random data... ok. +# FastPFOR + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 9.75 234 980 + +# kamikaze PForDelta +# bits per int, compress speed (mis), decompression speed (mis) + 10.48 36 242 + +# IntegratedBinaryPacking + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.21 844 1474 + +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1262 1795 + +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.18 145 300 + +# IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.18 302 340 + +# BinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.21 761 1096 + +# NewPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.08 63 786 + +# NewPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.12 72 752 + +# NewPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.08 63 783 + +# OptPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.05 6 787 + +# OptPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.09 8 798 + +# OptPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.05 6 779 + +# IntegratedFastPFOR + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 9.80 264 930 + +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 11.77 92 410 + +# XorBinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.23 438 789 + +# DeltaZigzagBinaryPacking + DeltaZigzagVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.05 486 624 + +# sparsity 10 +# generating random data... +# generating random data... ok. +# FastPFOR + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.73 235 979 + +# kamikaze PForDelta +# bits per int, compress speed (mis), decompression speed (mis) + 11.46 35 239 + +# IntegratedBinaryPacking + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.18 840 1456 + +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1248 1746 + +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 13.14 135 312 + +# IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 13.14 309 354 + +# BinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.18 761 1097 + +# NewPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.09 59 802 + +# NewPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.13 69 814 + +# NewPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.09 59 771 + +# OptPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.04 5 783 + +# OptPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.08 8 816 + +# OptPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.04 5 776 + +# IntegratedFastPFOR + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.78 265 934 + +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 12.98 89 415 + +# XorBinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.20 436 787 + +# DeltaZigzagBinaryPacking + DeltaZigzagVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.02 483 620 + +# sparsity 11 +# generating random data... +# generating random data... ok. +# FastPFOR + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.79 232 950 + +# kamikaze PForDelta +# bits per int, compress speed (mis), decompression speed (mis) + 12.68 34 256 + +# IntegratedBinaryPacking + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.23 842 1450 + +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1292 1826 + +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 14.00 127 324 + +# IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 14.00 308 369 + +# BinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.23 760 1092 + +# NewPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.35 56 795 + +# NewPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.38 65 829 + +# NewPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.35 57 822 + +# OptPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.13 5 706 + +# OptPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.17 7 750 + +# OptPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.13 5 712 + +# IntegratedFastPFOR + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.83 261 919 + +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 14.17 85 401 + +# XorBinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.25 436 781 + +# DeltaZigzagBinaryPacking + DeltaZigzagVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 13.08 489 623 + +# sparsity 12 +# generating random data... +# generating random data... ok. +# FastPFOR + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.70 226 932 + +# kamikaze PForDelta +# bits per int, compress speed (mis), decompression speed (mis) + 13.76 34 261 + +# IntegratedBinaryPacking + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 13.16 849 1453 + +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1208 1804 + +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 14.84 117 307 + +# IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 14.84 260 352 + +# BinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 13.16 762 1095 + +# NewPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 13.46 56 899 + +# NewPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 13.48 63 915 + +# NewPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 13.46 56 897 + +# OptPFD + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 13.20 5 681 + +# OptPFDS9 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 13.24 7 735 + +# OptPFDS16 + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 13.20 5 699 + +# IntegratedFastPFOR + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.75 260 914 + +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 15.51 80 359 + +# XorBinaryPacking + VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 13.18 435 781 + +# DeltaZigzagBinaryPacking + DeltaZigzagVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 14.00 489 626 + + +Results were written into a CSV file: benchmark-20140918T011257.csv diff --git a/benchmarkresults/benchmarkresults_skippable_haswell_18sept2014.txt b/benchmarkresults/benchmarkresults_skippable_haswell_18sept2014.txt new file mode 100644 index 0000000..4159637 --- /dev/null +++ b/benchmarkresults/benchmarkresults_skippable_haswell_18sept2014.txt @@ -0,0 +1,513 @@ +# benchmark based on the ClusterData model from: +# Vo Ngoc Anh and Alistair Moffat. +# Index compression using 64-bit words. +# Softw. Pract. Exper.40, 2 (February 2010), 131-147. + +# Results will be written into a CSV file: benchmark-20140918T011322.csv + +# sparsity 1 +# generating random data... +# generating random data... ok. +# IntegratedBinaryPacking + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.04 840 1619 +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1169 1698 +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.00 195 369 +# BinaryPacking+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.04 651 1148 +# NewPFD+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 2.96 129 865 +# NewPFDS9+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 2.98 158 877 +# NewPFDS16+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 2.96 130 879 +# OptPFD+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 2.95 25 930 +# OptPFDS9+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 2.97 27 951 +# OptPFDS16+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 2.95 25 935 +# FastPFOR+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 2.82 235 928 +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 2.93 255 740 +# Simple16 +# bits per int, compress speed (mis), decompression speed (mis) + 2.77 147 395 +# sparsity 2 +# generating random data... +# generating random data... ok. +# IntegratedBinaryPacking + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.82 831 1555 +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1183 1800 +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.00 220 372 +# BinaryPacking+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.82 659 1139 +# NewPFD+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.72 116 855 +# NewPFDS9+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.75 136 851 +# NewPFDS16+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.72 115 853 +# OptPFD+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.71 19 895 +# OptPFDS9+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.74 22 917 +# OptPFDS16+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.71 19 900 +# FastPFOR+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 3.59 230 908 +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 3.74 195 654 +# Simple16 +# bits per int, compress speed (mis), decompression speed (mis) + 3.49 111 366 +# sparsity 3 +# generating random data... +# generating random data... ok. +# IntegratedBinaryPacking + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.78 817 1519 +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1019 1759 +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.02 238 370 +# BinaryPacking+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.78 680 1121 +# NewPFD+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.67 98 825 +# NewPFDS9+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.70 123 840 +# NewPFDS16+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.67 102 834 +# OptPFD+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.66 15 861 +# OptPFDS9+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.69 18 895 +# OptPFDS16+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.66 14 871 +# FastPFOR+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 4.54 231 904 +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 4.84 153 589 +# Simple16 +# bits per int, compress speed (mis), decompression speed (mis) + 4.40 83 339 +# sparsity 4 +# generating random data... +# generating random data... ok. +# IntegratedBinaryPacking + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.65 788 1505 +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1142 1757 +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.09 242 363 +# BinaryPacking+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.65 636 1113 +# NewPFD+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.52 92 828 +# NewPFDS9+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.56 112 826 +# NewPFDS16+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.52 94 826 +# OptPFD+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.51 12 854 +# OptPFDS9+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.54 15 883 +# OptPFDS16+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.51 12 858 +# FastPFOR+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 5.39 218 886 +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 5.80 136 566 +# Simple16 +# bits per int, compress speed (mis), decompression speed (mis) + 5.32 68 319 +# sparsity 5 +# generating random data... +# generating random data... ok. +# IntegratedBinaryPacking + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.31 804 1490 +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1105 1860 +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.40 245 330 +# BinaryPacking+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.31 673 1121 +# NewPFD+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.19 87 832 +# NewPFDS9+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.22 107 844 +# NewPFDS16+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.19 88 830 +# OptPFD+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.17 10 851 +# OptPFDS9+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.20 14 883 +# OptPFDS16+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.17 10 852 +# FastPFOR+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.07 217 875 +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 6.51 130 513 +# Simple16 +# bits per int, compress speed (mis), decompression speed (mis) + 6.13 60 307 +# sparsity 6 +# generating random data... +# generating random data... ok. +# IntegratedBinaryPacking + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.99 742 1431 +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1163 1660 +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.99 205 290 +# BinaryPacking+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.99 637 1107 +# NewPFD+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.87 82 821 +# NewPFDS9+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.90 100 830 +# NewPFDS16+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.87 82 818 +# OptPFD+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.85 9 834 +# OptPFDS9+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.88 12 865 +# OptPFDS16+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.85 9 836 +# FastPFOR+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 6.75 224 877 +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 7.33 118 485 +# Simple16 +# bits per int, compress speed (mis), decompression speed (mis) + 6.98 54 296 +# sparsity 7 +# generating random data... +# generating random data... ok. +# IntegratedBinaryPacking + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.31 770 1463 +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1074 1832 +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.01 203 240 +# BinaryPacking+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.31 664 1105 +# NewPFD+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.18 73 796 +# NewPFDS9+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.22 88 808 +# NewPFDS16+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.18 73 792 +# OptPFD+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.16 7 819 +# OptPFDS9+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.20 10 849 +# OptPFDS16+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.16 7 810 +# FastPFOR+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.05 217 851 +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 9.01 103 430 +# Simple16 +# bits per int, compress speed (mis), decompression speed (mis) + 8.61 47 277 +# sparsity 8 +# generating random data... +# generating random data... ok. +# IntegratedBinaryPacking + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.88 800 1414 +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1078 1718 +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.91 211 227 +# BinaryPacking+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.88 671 1083 +# NewPFD+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.76 70 804 +# NewPFDS9+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.80 84 814 +# NewPFDS16+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.76 70 800 +# OptPFD+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.73 7 807 +# OptPFDS9+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.77 9 792 +# OptPFDS16+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.73 7 801 +# FastPFOR+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 8.64 211 837 +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 9.94 96 417 +# Simple16 +# bits per int, compress speed (mis), decompression speed (mis) + 9.51 44 268 +# sparsity 9 +# generating random data... +# generating random data... ok. +# IntegratedBinaryPacking + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.19 834 1442 +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1200 1632 +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.16 206 212 +# BinaryPacking+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.19 675 1092 +# NewPFD+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.07 64 804 +# NewPFDS9+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.10 76 814 +# NewPFDS16+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.07 63 802 +# OptPFD+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.04 6 810 +# OptPFDS9+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.08 9 841 +# OptPFDS16+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.04 6 808 +# FastPFOR+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 9.94 222 858 +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 11.79 88 397 +# Simple16 +# bits per int, compress speed (mis), decompression speed (mis) + 11.40 38 253 +# sparsity 10 +# generating random data... +# generating random data... ok. +# IntegratedBinaryPacking + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.10 814 1406 +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1215 1820 +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 13.07 207 208 +# BinaryPacking+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.10 681 1073 +# NewPFD+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.00 60 800 +# NewPFDS9+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.04 72 809 +# NewPFDS16+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 11.00 60 796 +# OptPFD+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.95 6 785 +# OptPFDS9+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.99 8 815 +# OptPFDS16+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.95 6 782 +# FastPFOR+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 10.84 226 860 +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 12.93 84 389 +# Simple16 +# bits per int, compress speed (mis), decompression speed (mis) + 12.58 36 245 +# sparsity 11 +# generating random data... +# generating random data... ok. +# IntegratedBinaryPacking + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.31 814 1392 +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1171 1846 +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 14.14 172 201 +# BinaryPacking+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.31 668 1071 +# NewPFD+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.42 56 825 +# NewPFDS9+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.45 67 832 +# NewPFDS16+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.42 56 821 +# OptPFD+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.22 5 729 +# OptPFDS9+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.27 8 758 +# OptPFDS16+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.22 5 731 +# FastPFOR+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.07 222 836 +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 14.31 81 377 +# Simple16 +# bits per int, compress speed (mis), decompression speed (mis) + 14.05 33 238 +# sparsity 12 +# generating random data... +# generating random data... ok. +# IntegratedBinaryPacking + IntegratedVariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.97 805 1375 +# JustCopy +# bits per int, compress speed (mis), decompression speed (mis) + 32.00 1160 1737 +# VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 14.72 186 193 +# BinaryPacking+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.97 656 1037 +# NewPFD+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 13.22 56 886 +# NewPFDS9+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 13.24 67 891 +# NewPFDS16+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 13.22 56 883 +# OptPFD+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.98 5 704 +# OptPFDS9+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 13.02 8 740 +# OptPFDS16+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.98 5 704 +# FastPFOR+VariableByte +# bits per int, compress speed (mis), decompression speed (mis) + 12.73 223 845 +# Simple9 +# bits per int, compress speed (mis), decompression speed (mis) + 15.35 78 347 +# Simple16 +# bits per int, compress speed (mis), decompression speed (mis) + 15.15 31 225 + +Results were written into a CSV file: benchmark-20140918T011322.csv From 8d12202daa207965612879ee31770b7c07848748 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Thu, 18 Sep 2014 10:34:55 -0400 Subject: [PATCH 191/412] [maven-release-plugin] prepare release JavaFastPFOR-0.0.16 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a457116..d083375 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.16-SNAPSHOT + 0.0.16 jar From f5e08a66a609935485a4fb85e8ec66ec1aa73be8 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Thu, 18 Sep 2014 10:36:09 -0400 Subject: [PATCH 192/412] Preparing a new version. --- CHANGELOG | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index e6db188..8337abc 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,4 @@ -0.1.0 (upcoming) +0.1.0 (September 18th 2014) - Introduced skippable versions (for use in a search engine like Terrier) 0.0.15 (September 9th 2014) diff --git a/README.md b/README.md index 200d33f..c8ca41b 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ the following code in your pom.xml file: me.lemire.integercompression JavaFastPFOR - 0.0.15 + 0.1.0 From 14d5df675c82628f94f08d6ff5af390b3d9c948d Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Thu, 18 Sep 2014 10:38:32 -0400 Subject: [PATCH 193/412] [maven-release-plugin] prepare release JavaFastPFOR-0.1.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d083375..cd2e395 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.0.16 + 0.1.0 jar From c3c792df0caa147b2e2e963a0de1949b2cf5b6b4 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Thu, 18 Sep 2014 10:38:34 -0400 Subject: [PATCH 194/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cd2e395..0d7509d 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.1.0 + 0.1.1-SNAPSHOT jar From cb7f39ba75935358b1bc954d430420efa0e350c4 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Thu, 18 Sep 2014 22:01:55 -0400 Subject: [PATCH 195/412] Removing binaries --- prebuiltbinaries/JavaFastPFOR-0.0.1.jar | Bin 2454 -> 0 bytes prebuiltbinaries/JavaFastPFOR-0.0.2.jar | Bin 78024 -> 0 bytes prebuiltbinaries/JavaFastPFOR-0.0.5.jar | Bin 122081 -> 0 bytes prebuiltbinaries/JavaFastPFOR-0.0.6.jar | Bin 122284 -> 0 bytes prebuiltbinaries/JavaFastPFOR-0.0.7.jar | Bin 147151 -> 0 bytes 5 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 prebuiltbinaries/JavaFastPFOR-0.0.1.jar delete mode 100644 prebuiltbinaries/JavaFastPFOR-0.0.2.jar delete mode 100644 prebuiltbinaries/JavaFastPFOR-0.0.5.jar delete mode 100644 prebuiltbinaries/JavaFastPFOR-0.0.6.jar delete mode 100644 prebuiltbinaries/JavaFastPFOR-0.0.7.jar diff --git a/prebuiltbinaries/JavaFastPFOR-0.0.1.jar b/prebuiltbinaries/JavaFastPFOR-0.0.1.jar deleted file mode 100644 index 6ba32b147e23f637239c839d58ca261bca88c7dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2454 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 z zTL3MU0dCEOymMh^7r@}*a=U5Bf%}Mdjc=>ZvA4vGIK3ya3Q^w>x2NF2(mnNOAmaS$ z8lZ=01h;laXb&$mppNXssx$<_ZzXJvCh}ik60xR*DmvRDQ5S}F4<$*3BQc+`HA;WX zL~X(h{wja=y9kVcqX`q1(}!S!wC)x*y$z}>KLux{fNr6n=|qX=0wEkcjy-(J=_Wzr zI-#}p50aFMMnJ7(KyBTpZX1YGm88MV`kULn(b;Ih;#agTS!?|9SD;MlhH054|vs5!C8_^#GBt0(VqB%-RhSQop`Z;LrST zt^#0xe88uTU|G88`@2`5Gs(cq=^-=SzTrlo9+D~tlhSB=QA{YL!Ls`F7}FNF&zSxQ z1qfwnInYUvCo241$Yk|I1s_beE<|KeQxz*iDR&!2U9P@S(-aGnORbyt!YeEfCb#tp zDUugUWX)V&HdY;D-OfEY3YT~O7rRD@vN{iYsyU>v^$;S&zy~#)DMliPF-}LCSUVz1 z)>-v!Bi$aNIJv!N-Ca1VMphPoDlF^L91uL9BlsDm$TR1s_ zyJ}Hk?VoX438k}05hE6>!ReCnse1d4MEj0HJE3qD{#6%9kD}v>tcbB<-V$wn8+Cov ztSyp=x&MK>4O=MeVssAGm@mR$V?l+57jjcByS)+wqp~0tg#44LASM9oJO}&Hq%Dgx zTq>3TrloVC99P8osGHre#tMre`TFX8VCq;_h7d`sLeD9lbsl%V2U=6t1OQU_Owtkc zS8dgkRw`_?1k?zoNFzb;LHIPrZk2zVia=g_vEg1%MD3eU5sDSn};`yKy znnphi3r_m|#w84QPN9X7OWA)-Rv1I;uTf>|N>LUA3bBFvQCP-3!!+xx3yzsS)WCa1 z^V7WXWxk}Uxr(IYAN|YS)icW$?Cvbc9Ab0t5W*G9lSYF)Ev)Ji-^>${K~~_WkkAM` zE1Uz1Ib1pvmRsInW*q5S=MGyOKq@&24$+o8N)}0gUK~)-6IWQIvnrg_C8`cOCB{q# zN{Vk=P1M+%n@H1nc$f_qwh1r3${o)=?pe!u{EZ&B^ClF0upU9`(E;x>j*+^{Z;Do1 z@9+l7IV{9F4Y|GOEg@))F^m4Xv$Ov!+dgf$(|&6h`h0$v>bzzc`@C&<^}KBO;rw-2 zagV|y=wp}&Jm>pR?6AL+;lZ~KYF5B6S%OJY);LcpOWWyNrs0}M+Ue-b!J0@?OJ3Flg`!3q{QsFUYtUfc+_rK&u?nzqyul}?9X^M)G=oFhVb z9E13uW;&Z2GkxH9nXN=lI)?3MhOnX^lEM)A7NJ&843Y{%&B1$iTc^N3+8XC6Z7Fzu zcm?h&w1msFU^ILUTD*-~oo@B(kXzt`oI7o3e-Jld5q!#&9%TW}cBBq+q}vWdbl~k$ zaNBK=4hd#kl$Omy=-^sWOY5ysY#S+2KhN)my^SfELVpcYvLtqZKgj4KQB&1L#GoVW zeGJ!LD;{{{%WjW+#~77QctrDfh3)bS-4PtT3=1{5CrM4P8FHWu-7#&xc$2n*?bd7t z;nbQ0b8Rfc$YGi;!Ga@5kqBHYt(Vyt<@aylKr<8Z!fl6?w6C9&>e-KqwnT>bZe?Mb z!CO^>ZQ}a7iiI1!@2v>e$Na6G@321a#|l61-@t1caOrsGj>(=&v)0Tc=A}Ph{d=K4 z3xm={Vji;6DC)kroi8^0KyvxrW_~P%<#RD;8AX zm8>AoPp)i!)Im{J-FbM*7MWc22pKcoCLpVBJR8e8QR(*I!OsT6SI_Vt+y%jkgZa zpT`vS(lq8A-DP<2+S<>}XUTT%ThBGbMvauPmxG(i< z7bt5Ase$l`g$6wrcWbJ(;GYxj`!7c?*KRImUP3QRB$a zZei~fCPGe%L?%KJ>vIteefZUI=LuNryE4WBT0!pu>%&LCz+YdR?UZ> z`zD48({qsznEO2@sN`jl2Wck`P5fOr`IGs-e(3q5q~26lviU=6GP8$#lyS#>z6ARL z{|le!gP)(6AD*D00LIWy{ghb{RD)90Z2y?24|VEw0$&lOxF7Tkw&21FR(Jp}`-;au za^YM%z88S867HwhFS#4htCaNc%an((n*!U@C1cnZ^!Svv;@&79j#B*UPN42?Sw4K? zC7BalB##+RtGF2dMKPXqy=g|+T(Y}O>00AlY?hbzxIF(~HorxNz)tUF`Fou(8fCoB zvCWF2U)3))N{>2eG|Iy8N1~YPDJxJ=OlX)LxpC5lv@}kPuV%N<9&WdmoLoPZmG_Vz z>~EPwf?i1q^daS_iGy2{69$nd#!P%}ZMX%V3AS^6(LR#iaD20U^QcoCZ+<6V-3A@K z`eqzSK_huk;+@N~ucuiz&@b$%mWmYDSvz^*Bb}1sndi8T&lCpX&y!$m7D(Xjeb`eD z2b-!92dM3#Xx2_rQw*heSp5xg;z&KMQ2qTUamcyH1aE!`{7}Z!`fioD3G*o=g?r|q z*>#lYN8C{JJ|?_aZg5Eg+hZ7Qkkr{Uz{^Q>Y<*jT%xk=e4*B_I&pf#%2UdKd#jzn7LP9>o3QU{ytf&BY)$BHUqv zeW_q?!$`&hphSAjzEcDkM^Fb?9+w90WXd*KsR15L=ui^r22^QrR%J9y>eZ>I97O*=Rs&dbf&o0@LAYEiVW+ztcjOpUu@Q8QUejW8F z7c5XMD&6v?x=Jr1R#hXtdtIsuluj;UR#~4{l7qo>|HV%G&ZcN#OEuppf4HAj+g)~o zA1&r5rs+z`9kydH)M{hjqrMzzd*04>gy+<^lY6G+oan%}WP|wT&T)-@7BM-0FQ%hb zijfDG|0Es_StsT!b!Gct-5JVxSe?z-^Y`wWzmn!J3Eod>a(eL+2%U_=g^6Iv3OKwO zG814 zO7m7|-Pu04y|MzMcU9C+i&YiR_|B`_|{d)GJUVsqAKy~ zxLiwRY!HE9=_XFO>JPx?@tSMtd&vL(BNnMZ*-)%fT5nlC z4puaR7Jh32AO=3cAX_J$Y9Z%o53JBWyzw0>|$W(1lfyx2Whwb zwIk0kxIWo1+%bu0_ECm;EfrqS*7Y(b00W=i7}#madRXTGJ0*qgTFN+LJX zaBLIuw+;oQ*=Ha7A&Kq>8Qoz<#2wb}SIdg|X&AcFd2Q8Kp+J&X1kW%_w3%-W!I9wz zfLiH5=})-2D;*39_Ixr|}Txh$zG zxU4cNKKm~f9fu619p?n)u3$ZUaI~3v_-YD%VR$GcL{y!;@1_0|?_l*y+}p(TV)MiG z&B!0k`zQaaKrq@d%i+dvY3$bW1yYdfo!Z~*#XQ6jA@aYVg}&RS=9{xN+D??>$PGA$ zy-^@EUBw^r0%!4+9`!vhDzG(o>Rvpfk|I7kRVJE&Uy^tJK|RgNtGuuv$;$s>@9_Qi z!uqIK5nMsM&=YHzea zc5ix5UT@GlvmZvsiJr;xKO>Wpe|f=q14}DFJ*+_nahbI<`$K1#9wrN z<$X{aalE7N^1j3G3cd3Z%lD1UDfF2&*bz1UC(h_h*JPp%l-e4r*UWKdQMyFW2QhZ< zQM;P{4B?vM2*%PztXpv1n_Q!I>E|;4;pkx?xQ{E#@XwByV>Z(wMRl`oBgS?NtxC5K z&tFDe`YWSgg}?AuB2*WD;hN^B_qPQ}6gzIN@0G6fwryz(^?NF=<~cE9ol1Oi&5X*) z){7|w6ncBFmFHE6<$cQ^`3C z{y!&Vk_To)9QS{zBv*4@P`haUl1h5eN`@b&Ni_)$j6Xt=3!%rpsk7X=4vg1BlJ}v- zzUAi?d?Yc-e-7q11o~N)kyuz1u1yY|YQnX(PC5nt9%$4goNezkE?PlQ(jMAlv$M%> zNI==I0AXWYdb}1?~t6L)C?@jXgQJwU8yVE?UramTU2s=AksKlg|(h} zdRU#!jjkY4y5hEL(@UDVgl{uaIw2z#CSBv)@o?HdZJRWIgR8y%Y<+hWy~cNseW&ELE2nZJXqg>%J?4E!>U~FU`dnpNJ}h&?6lt_3PJ3iC z6{)?=_)J%?k+24|L1D+hH@X>>XLT{?(CUFRy`9oy6=x-+_bM`z4O>zJVZwH1ygv0s zys8&5WV4FcvB(R4*_?gd!~tuhJ$6&$PG+>o8&wa=8}w{ZJciM;y4_gic|$+b_m6NF z3>fVkH$HA2p0$d~n?vU-p!6^lJ0HeKB5rSNHfdtpVE;ua>~YWq*+a#blq*2RbMsT9 zeL`U~=gPK(s>ghOLsEghn;@3kPt&o)vdyM9#8?@_NL2Z-x7@N9;8RytB{SDb2U=#} z6l12fb~uoOx1E}!!m*7osAO9X+srQfBHemIhX5{1FsZjJ)uOu7&&<0rCsfAF^(@<$ z$}ZP(-pe76&*L>!)V*uvRqCNIQKz7v`;%Nf=2i z5Evga{7s4_1fkPP)k8#j`x@Eq7u`OA>X=|Q1nJ0((VfTa^}TiP!ri{cojk{SXZou` zOjDnBdvi`rU*lNK_w~No*A0}_5amXqaIBg!V~jJn^(7xXOWnBvf-|U&RUZIRi(%MW z4cDIC8OX5Z*Y7Fat2?kW^4^$xTA}He+|P}dXd_F%p-)S{xq@c@BVwJ=DeO11gUhku zorI_^VhqpvvJ6J-stm?*49}F>zC^Tw= zuh!yAKwt8k9F5xVs}1{-xGzcjk~~4QPld8x#0Z{7#$n6tlJWb-9?_*>hDJOu~Vl?h*>V5f|RB348C7 zwQt74lS9dkfaKx#xY0*IT!Py36vNo%cq|&#&Vgs} zvHIHdB6w>6Vme$cl65Phw{W!u4Ww?Zc9QT0ft!S;TtRJ{t}f$Oq!n{bdJ*6&WaB?V zV00P9_WErBFF~4T?Uaygdd(YI1}55;0UfMtEBz1`pJ4wJLBBq`f@nU128RH6C~bow zJ7hcbU1cadTa1j<*6l5BK|4Tks0+=Sy22VG!dsgYPvDA?GWE4y_-Nq^{wayolrrA1 z5IQO6-_N9`8!7#}1odg5gRFp3+mEE|XDKpF*mt2to3|vUy9BqKfYPxy@}57$Cv2b6 zxeO+j&|CCu<3y9WkmNwC!IP{zq>=&=NuiKfe`vrvBJd@S9hRXs_9K(iM-0%jK(wIG^&h0Jr>w;*~Ch3_A4VIo@u>T7r>U>V#!Vv716;nnLU9K06hbjiA8j>V7&EVvz^Y$SOmrh~GDE1f>^+aT`yg zn3E}@sjLPvnHQG1qrvEoF06lf;<@Lev7}QUarVA$UI*g1M}P@0GeV=PJmQvRR9-e& zZd>ehPa)qi@y&F_CMv0WZh*Ee61+2d{un%Dc>*fRGrfaB+1~kiY2INyY2NthbH3l2 zfie4E435y2M5NRFqM6>IEO)Rbf2anhEyYr)b49|k2GUp63G8ijMg}xvn~G@$I9`qA zs+ADi5Tiy0(u!savS3Ph=}Vr zz<$J*WfIS6hJSrgHa3Lu@cwf^vzw@-8%iG)rLBeTu#krmU=P@g4XO3=mfYy+;Ne(b zj1Yp+3s*ceK5H+-WBW9-v+%c|wp=<-vInEvfIm;X2%Tyg+RHm{>Ju|Kumsmo2|ASp z*T{OuE0mR#Zdy zI898*MNB9<(HqfU9qGLi`$Z-7$n3g$cD}w-v@be20MUO1|3$;-ua>iF;zp8v+Br>| zk%xwdp@+hQn}>k3Iae_2#*B%qhh1g?p`GxdZ189rWE?#lo)$X01F3cH4^HF=8|!bP zV&c;1i(j)6og||~qAls5-~SAzAbVHOl`mxwuaf>0%|3go;+~N1Lrq|wgzQni$e4!? zFNjV_ObzogTX+%~5I-AV5$jf|YJZ6o0eZR;$X*!Ys;-D!zDRy072$m!6|2~4VDN?MDgLeLUt3qtCZ+8IbJzKd_rHfz%9#fk?=HyWIpvdw0TQaw|d>?8-T3O zjKxdX(@V4bykN2sI(5zo&VdYX7Rj@GABCpqQXeLa3PO;^fO<`C`7ZDtmckmyn$pOm{mXmZDoT(DYNtP)rpr=$qfaKw7#~1TRnJ*S(SR-oFEMA{mq(3@e?RsA16RWI(72-{;hUBkj7ilUNlg1 zCH$)sNmHe0FG;%`OEWQBNcdZsueg-2iWIAv)Uc9N1(?5{tXoN`;*u{S$1BDdm3&{C z?v}%N0@q3*dw`+0h+`|0yKMCU12${4KKm0Ae_H4Khkkxfk}FBxopG5y%z43C7|&12 zz1eNxwS)u3)nu*tx0al5n+o49r~*AOgg<4!`RRbUc_Ph2gSQlo_7o)-_$To~{uwJN z6M83e|BxG%0bgd0OaV&^qk%d#!li~e#VMw!l%JPj?xRq|Q^!8Q&I>T95wA3gw(2qu zE){)G*8ZvdsY>90&rKjP5e^+dTmc_vbg!6igicR-y306=iN}o=pNx*=gIdvm^c&dO zK%uF*+@7Ip592}M+ddHk{Y^NKYrboEBKFVA#^TSF4PqC&Ml%fzV35y& zq6f-9Rdh;c)t|K_rs7{DPPx;F6H15~tf(lHC zzUMp#U6`5p)wAo%ITw8pv`%ubd~Cg7Fc;>Ga02^V;^{;T7-m5hHApf4AB|v zy>@CWt%r_Q( zKU0i1wyPQx9FV6c^T-1QQ4FUHC<6TfMm(Nn-(Fh#ApUxy&If1;3yDJbp#}+7h7T73 zE54G8ly2*z)A`aQY;%_S=oBB8nTOS6{K*tQmYGX`-jOIWlbb8Qi}Ht2U^Kc^ex!N5 zNK=_wsJzqPEGNk)^8ff+k)%_j=#W>EWHMR0mCrlwHk1$B%d9q;@|X6|lr)i2rBpZD zc?IrPBKC^a3-li%yW}X)Nj55~KY~P(U_$!vzE^{ie}D-mLWe}BI4}PAi4TS3fX4nr z&&Tk{)*wl#;rp%4gQ?&Y_A!F-ZxC*}r^$>j*61I;y+U8E+{7!k2UDfe zo^=eHuSspj2qYEWaPbajDVH3{BgKi+i^gdj6_Zp)O4>C|+NCmlDfG>gcFMULqlf== zEC8}ClU}*9)eJ+A(dPV`)f$+^`qkY`nvGwI^?xYs8knOp?UTFvLGs=J1Rdb=^ zwJ?iY{Qj5cxc$JlKP=RJSld~<$RByTNyoQc*9*@APnXX<&#`a4quM+vqmxvg-Ol0DcXr}2@UyONxbRYK=M)mLRDQ;~{3{Q0RD%tf8s*X?*7Dg6uw#*$eherlE zPt`Or3jt|;gPw@nd+U~^@HIwV+1wpowrsKptBy6_kelW$VCC(^e#&RpOn8I(-3#HA>&KYO?Nia_MlVE9dln^%i7S&+;L9xyo z053mR0ETls7cO;oJjnNa2Sv|>UDJ_!mDCqKH=UDmqB9)*pXiFhA`ge9>8R2SjjS1$ zAk+cGr6;FR%DSmZmOxoZ$i$Y{ydh0aMtkKp)pR3LF9V6Hnd#vVDJ*|qDO+d`n}u2a zcCX~1KWubqE@n}5*8GU?mi&QL&3CqzU`W0atyPeQG)n#o0<XtQ4VlEWll&5<7d$ zDURJOVDEFlC`t3^4^ajAe7R|4=;LH#ZPd!{ivnY1S`S)n{ERscf7{$~!B1{aug>m{ zKFsb;#EUgO&%*8$@e!9EzlCb2#Ij!rg2oWJ=X*-@<%A zTN+knBh%(5fcTR4>FX9rc+ z9*lbSg?5}QvJ09VEV9ek_}UzJxRjt6q*&GVdwg6Jj;8*KfjfY$2_SN}vmwA4< zQ@UpY=)G=)24V^}kfBB`v69cvgGcI^kJb^w&|kZi!+nb2OArVfG>Y)caqw6w8Ys4P zw6P6oVgu*k>92K7EP7>4*mqkSpbHFHEVeCCx&9NEln(aQ9gWJa5GWlH>W&80VT0{; zE71$R?(ZeLV!s`KGcT8SRnLw|MeTKJ(o4cKl3dQyWd#* zrZUvg#Hx*^^@%y_ui1{A9e#PEzPz_Ar^>#m%5_EoY`XMX=|%c=c7O=b7N+a_tG#5* zpGn~IjC)81fUL~*{lh`B`gjtEIq%MRXzh>_Ugvmk`S;y6c_Gc>DY~`V&>|9j>E2{5 zc5R8VX3RDWX?-(H0kV~OGp9(!N3@H{2w*=vFkoe#l3dy=@15lDELz;Tn5B(0iue81xjNLQ?ysExx9}d-EEq8n2@2^#|{cs)NtO3Zy4Lk?4Y5Gr6@@@6HmW-*Vlr>JoL zG&aNIG~pv;z`7U=^fKsEj=K}qXm+5rF>fQnU}M7v?;s<*%eSM7DLz>0WR8y^& zpV2eSd`7Fx+vM&@)!QV{cVFih)eQVri~sw_fR0Jdc0GgGh*4jk&HXaf3q4X;bp_|n ze~fnWHQH$(I^A$DCzx>*v$;_YbVJQSyLli&J?ujd)B0n&@ov|7;o$4}@SxOr_@LE! z;~-A3pOIM6H6bGN+qW$&|DXwpz@H#OJNs*rx3Kk}-t0 zQ@1*XO#gW8F=Xg%=ggONLKWJ%&p} zeT=80;Qdc;cL%hcT(0!5I(Hbse2dOsRjJN8UrJLm7-OYC-w` zsfr0wwY|UomlS-YMPqv{br>p6N>9uJPKv1m%RoKCQMD+anvI4Yb_pll#6EebDQ-DZ zqsGK);dDflw^v=Cxd*tM#@k)`UJ}&RZ5zLSFR}95SrwaMY55mSk~`4x;Of&{e6VK zxgQV`nSliW8^;@WS0e|Gj>czmSA`puz8UV`2y+pI8^&6P8}HQ$cT@t^PK;@KJ+LS2 znh^EKmA;lCe2)Tmc>M}@d}8%ZfCByY&B%roMOyL`~MO@?uYA6CgO-Z1Rw=l|srO@ID zgrdH|K_p|t+RzGw;tq!B2j`pm4ZqMLa$d(XY^9!NksgA>{LiRki7c;#Po%`bVA zE?k+<4uJMsq5)}>6)O%CW~X4I-HHxM{ot0fOL)r z>1>ir>?d@;!s_sm%8$9#xfW^p~6z_izfNwO)X!}xeToxF}_%Frq8MEy>j1_OPcRZ-EJ zbkWhOSy8;r)qDgnY zyVjOAe)m>c*F^E)6sWwH=$5y%>z1+9_m#CI>&bN{=_zn#`Z7QL{poRfEn3YclE@t| z!4jE9))4lSB@!p$g_P{h`^ZCZ$%LVaOeICkws5w7GiDYT&hgV9j3J3L1xnBo>%JS$<#c+Tkq7+SNoLt)8-WRQ|i=m z;KNt?@=4jT=WoK>M-t8(6Z50s_(#lal$c^+oMXdiG=?44%iQY}$PWFQSfb@z6M@a;X+|2`Roo>m~Xb}*d3T5{jKfW`CB!0`DI;K#gqKer$34{7~@;i4;p zt9j&Ex(|dq8>p5wSodZ5ffCmgZP$R>aP)T{)QfyQh6g{RE@x(uo=x+-i@<7oe z+DI3s91i-L!gC-6X|+;@#>7A&GW4G=c>n2A0Mf-7q>Ex~iWoEa{5)Pf-h6-%nQ7to zOi>ys+6K`GDcT9qGpPcHeDb0>F2(YBi!5qGOE&qWW;Q%3X+6AX^dhF{;c&Ec@dMFQ z*#ZZ$!s0nDW~+rqYPE*9HR(qy8)YwqjS0QXsrnUT^ELch$j4!zgBR;#cNc}dm-WAf z7C;k_&>)K+38}#?Sowl~SK5owy>}a0uYs!9?Gdcgh?v}6F!-xaAWEUJ2|7ie8vKqppvWB zp#+UWZx<`i z6_1(k_-{L~BfgAvogYF*${X%&^mVw12$^%ewg2( z4f)ul99VeZf6`jpc+giakI3Q5V<1ri|LEjtkg)(w#Wk=?U@nz*MTgkJJ<%^RZSUTP z3wy;)+p8W!DhT#fq<-@$Q?vh(syFn;2=+n@aoF>d#Lw~@_n&XvMP!hNJ4o|Mej#nBE(S>zdvhil>fS z7>Hl}UYs##W{rH{mZ(q8qST(TtoxH?yqYuZ07N-~aE)Tk%s$N;WN?!=bK@?l8_8x} zt(Z;+qMz72CbD8jOt;ORWI-2X!5jFTkgaaFiRON=aLuP9Q}L?zy-c&)cR3Mm9&CP7 z;D+CoJ289SY)fW6;m~unJwZH~-pQMKgvk3$H@H4d3HRLi)rCn8`;boZ2Vu-Ng9!*> z8CZ*5$bQDF0`-w!QbzK3(Qiw_Tj|S#_*&}V3Vpr~48p}GV3>y^pf*OXmYoiBR#_Z< zyz5!6n&bj+wE^|`X9FyenE`q^)FLn?z|IOBoX;XK$Zg$1xJ23*yTLhHHc`k zm-5~SiX#u1wH6j}@*ghTr58l&75c94FaI|ou**=0R$|m$Us?Y*2iL|sa^5MA4BbP% z2`sLehPQ0&)rM&q;LdcmzydS zSXVU*9A48IfD@}KSh;U?=T~b5BR>>wGqW0p7Suk41|H>M5tUUC(@qf!%w064ZxyLj zg$Cpjl(4>!BFkv0p}3UkB6C4L3lD+`hwSsjkm0o)b{AR`IOE(etkNq}NL>Cj#oxGH zX^LvNK52@|xFD+$^#|6c<)?C=(^9QTAF*lIWEpNGIoZrO229ay02Pi{GS#bVttV7n z)!U|XsNL$_CisCpM*@;5p+ZfacM}DB zHAhRkWw$u)1)W%Q3^m_-QdSP+J$$-FJwyb`JL~!alfxlt(c#r7u_|Th+#@uuqmB9^ zDB+UM4CZrxNSd!J+R-kSJnZt%f?nf(VMoaiC}0VLVo#2@{_dd_ zz*j>B^IZ~(APHIv3Z8rtN|^0hC8UbEiYso}XJ47*k8^}VK;s;(0OY)Q3(9?+KHKA4 z#xrgrhMXN;f$1iPr!}U2AtoJ`j+P z#`>vGp(-!mN|TU-ipCQSmu@ju3%#kMXcdCPk1XwFJt!xC5`(2C#|COoNDS;u0Is!O zxSk8W!QWMKrXr6L-SuBgx`kg<0N}J}kZR;`m68}5@zmG%aZl-->_3?-lzQRjMFW)L zDB)B9jm(yP0XaylWe&czrcA%^T$w}z>c>gooJ$e%{WH+uGs!J?Fh*|rQu@G7S)oM8 zuT`Mpb34ievXk@Z=bXPK2o-`O%>(EGh-iKQQl3TCkd2s&kbYM&FxCQw`zU626ivgj z8_=a|g={Iyk!y-9pIFe{>xE1pjXY2^^8|zlOq>nHm*J@9w*Y%{< z7&0c+7=QiT>GfsUff%}_pH27P`Y8j8uoXrUm;E_QGPsh%5%mZ`fpz` z_E1-KT@zOgWk<+s%tx_n=|>7{m`6jvnj=Pte?4fqUm0EcpD8~2pG5OV#JPH(u;NL6 z0ZqD4+N}hxPKiuwav~E`y=AsY46g9@k=lWwI?$h|?bpOBfU7OMnGV9viHlc4$F`XS zRt>)}rG$U@Fkk`|EHKyA<0QRq3rV5!h0v@yyFC5Ail!F86{gVI8Yu6zJ1NipklIit z)bTVC(SKI+=J)e#Vzyc=+Ia_q_XTUtkh75hi&lxAGN*qs?d1A+(NSlR~qngKcA8H|F9v z#sIo)qM=|5bFJ-i9H`auck7~hT+eyM;HtyA{%Wg<^rRYIrtN&d>N2D@y@MHeVG9-7 zrrmpUNo-Kv!M=HD3ys`vyeH-+@!Y?a?&PMf=i+uUuqAjKz1j65e<|?(%}r2XVe89{ znvP$>X5Ao6r_4Z^Y_K?MoP@)Jrod;74mXbFlpHn==4MP4H$#D+O?N(2ddXQzSK8T; ziE2Zh2!AZ`e8{x29b=6=Ivr-A?7Mo=u;QG7W_dN;>Cd=vQjVqB1(PVEyYM9Djwl>a zpW>g3D~mgr(x+5omJK_B(4(inXDqQEc18Sv9XxwkJT(LNh_Dx7_WL1!b=Zi}%qNk6 z9H()!&f_E^4Q9lz&f^)`tD)TO*!W4R_|hfcA+ssrdE`)?d6GW*__Hqd)@RjL8lRp~?Z|w5ZQ3~l?Elt*{DYtvLRI*6iAd(Mbx~h_?uDwZtS#MeF zuMz4%U?q#0hX^<8Doc!FL1-h}0G$|*%-c`+E`@m8m`#d3tg#y_O=vt=nq))GqM@4ebU{ zFL{l|pK=UVq3u)OQ2CC0!HL@<_o$xWZ9DXDj<)QcJult7y`KEu4W6icqu$^J3;GdK zra+Gg|F?W3YH%=#@~hQOBGpyqvV@ruvK=hgZB_jIOPHSy`foJj_w+RncBj1f6B>TJ z$3y*xEuvMdYX0zSR%LwleuiaTY%@Q^(y@%6e5*d8PQGr;*tFC%rjDjAToaUrK0}EM zY@w=x1i92B=hVRFqEUE(eycx23QOBbrlsz?q5K~pn{HUuTG9~5vG5dHnmd&CR1Iy)yYbnWO8(l^XmYAti)$YJ7>1bWe zQv)}Z_Eo23y+`??zV2!|u%hvKrpkJ{N)=qBb9M24q-4z9xN&N(=6bj+&>ah>x>{(D z`f%@Ea?@_tIM21NDZgHsO>b(M&ESX%#~!a5#|b*E_APF5m2c=R5MH!c1S7qgV{8#7 zzO0lbOjcL!Ro;A^Jdr>IpOnMnIZmX<0)y`mrg}k##t_Lt>W{Bf$3JWgd(TA}^a^Pw zZu-~!V@JeW-G6a-hI*utyXps0vf|Ohh>m(ze$sxkd?m4DG$U&yPhu6X;`kGunXgXP zmKS~YunV(9lS&LZW)_AIBZ8W5;2y|BnCNeH;JVrp}$rsLh>SqnSS7R-QG5TsnC~ zrE+}ZM0;{qL4%EV*pV^n#vXrVMYgjf+KnCVt&H(f%`(P`LZ&Zeit@6!-Sj$|CDfhO zKEIk=FvDOj`#4rj2(vIVkZtBtzH~NJW#&Q=58A6r_IKSWj#43bm5N>frC2}JRnzKK zoymLo+e-`6hK-3fY`DqZ(4b&|IQd`Gd*fdI37{0f@i4cR_4}piymM0d*376zOECcvNz8B&GQ;{zn$O1#M zQahfbDwr9!Qp=ygTdbrjErYG2tC1?x;3(zB?ZnR03zTeGtbi7vkm-wKF8!$q_x^z* z?Mq7ilAL?E5}2?9EB&eP`<6;*On;RCdG$yyaO`B`+TcXDDS<6rrh7fx_LuGxcSW6;Fa9ko#ODupKew&kaqJL% z16r_p=Cnh14yw$5-|FQbc8QL8g(p0rQRo+kYPyv+jQ+(>a&8-wEWxd1E}MuNQ3Cr? zYM)%?Rf&>07nWm%PW_XjC_Q*9xB)Hmwp=vyeW(OV7_FMO7bjkE{%%=)9QsWlusndbBs%#FE?kc*Q)BgLM^YYy8n z;Ijv-McWKE0WJ6)I~yYYo(hjCEu7lGiviz2i-^jA0xOwU&qJ=D0hbm?zIX?*rp^}^sasPd{ofoNgE+PyRPf>ZhBD9^VeooyvYtspzILtT zP@J*AxuiZqQuoDw1)5AOKHNE}u!|CWAXNm*R|FFD*^*(MrfT8;L#mL(0aE2B`A)c? zeAr~K7T6TQieGi@uk6Iz4E63nr=sutQ`LAkV{)v)n4}1t2=~4BtbC25V3|WYrtVu3 z7557a|Emp8nI^!PZE(pNl-dBvs9-eVQBu3qwXoW}P0(E8hLw3bWlH67Qcv4?xAtc{ z7>Ij?_So!(`!<(}EOteMv!@Gh?X@z%Wd}xZyhWBZA>6v!L1=q>8AR3DvFCE72TF79 zf6@v4;L9N;otz(7Hj@JGtpQz$mb_z7v?#om|M^tWSzG!sJ^6BGgN>2Eia+$H?i%lbeyKUCBe-v_tB>yvru2z-kzOO1EVDMdrEKi zAiJF4v4(Q5wH(r1y}{n8=^L_|%(Yq*g1#DU=kKbUqw;KT*`~}Zjf;af_0XGx3YnX> zCDUj6rM>rnGf6;7WZ3_a8YEOA@3lhH@j_FvImcfwLZH{y|0Ru0Oc#H;wqWj?lC~ze zm&FK1#wdhnp3c{CL8^E&^P(^2YL+Fz-)x*gF&@=s!J(r6eSq4jg}PH4I5kIP za=2S_EYd8zs|sFUq2nV&dh)ZXDM;jwuldB&9zo8l_cjeOx^9Q z1iD*@@->%WE9y^yUKIy>$!EUTE-qvWs#G@=6^Sq9OFz9k&J5pk&)Bvrr+4qlC9coQ zC2k}t=s%SnZ~&Ez=$iVJ_1&^2KIx;c>vosvt;ZYr^-tGyVV{iv9)$g3x#n_0G_YwV zbwZy~zqV2j&?cj*#fmO z2M3AuuthZ`^(7G=Vsm&Lq+=d;!I-FYMm*jhSGgL=nvxK1$v=-#klEXD_H6u-;+f$| zzL_$694p}tkXk(J;+eeRE=2A8TgMFfxXtNllD4tyn<8{hzbgXPHzUahIG#|?d6L`# zb7p@NFqe*9rE^HAxih0nKhvu;`Gf!H^Jf!k@Fx-~@@xOTWdz=y@wr+*ct1KnkUhFS zpgkHtI0}u?8oEDNtrmI`0yVn8C{?gwzC7TwlyzY^RqaBl%KZQ<6>bAx2=H4ErdK_Kyt9ICm*9^wyLq| zlxfk<(>DKUSQ2u?P9~jJ%-=+5QJXB}v`coyV{!6dK4CYaJT21rcYQW0-O0IMm6OfU zPpd>_ZwLk%JWy=`mHItY&h8%+o!E{2Uw2KpyTRBrf1c@T}}wV4jO`QD51&+GH>~7fWh?$u=vaz7;tt1Tsl(+Zk%z( zmH9%;sQUQ_oXynwJgBGX9M~(-L!KpAUQ(JE1oDD3mLqu{i!WdL#2c1R?#PCs)tWMONwxgC zb(OKTBZncj^rPU-D=cyKLsYxxjlbdTEv%pvVB*}Puv>oi$pOBiX69P;H@dWHn4>h> zaARp1w8s%tRb^$_+BbP8T2kdsDVS>^g(}??0Rt z%a14!+wis(7vGUr9szDv=zFQ_0h`rw#}g|^dznkcx4PB~&yDM{zGfGazG78lR~3l2 zD^?>nvDQ>L5T8LX@35%P=w#PaqPv{oyhsd{UCQVo=`Nz~MjDqZ-(2CL$cx z)WW8sDSf8s%d+btjnyEt-R03c0_8WAMdZZp*5N}k=;qdYiaVr;Tc<6w)E)fe5==iu zYYQzeCNfMz=U>T%&J!W46pZngk83Zi&FiF^+5(sFR)d@1R}q^cA*vWnua>F}c9yGy z953)R%3S$v6t%x~EZK(OHU-xBrWY%SNNI4!9A8M}C5*x>gieOi`feo)-rO?_Zs#0_awn)#D$ZJ+) zR!pR9Z{J@>p|VoZ;YFI}ZF)>Ykcm5H`o)Uo4i*(<5%79VOG%vJWe{|OwV6nFO4+qHgysyBGAc)p zQ_97#thOw3V0a?ff?U52zAOQS&nYpl^*&(*m`*ZfrG&OvT^K~i_l-S>NKR0GVysv* z8Ibzo2saO3<-B*hp9e-{`{JT&zr_2wt!z+3aec0=-Egv3+^*=Yh>N#XW$NvaW` zARTaV2naXbbQqX;G?>U*bEDvXMC9*>BqbqG=dw^oyqQdUJw2XwOC>9x>1!>imIPk8 z@c8uXaBum%5>*$F0?T9ej;0DbC9VlItd^p(j(Cu#UDH-e7y*w))#i}UEJGG;+zcn4Sz*J*@fKXPufrkZ*_H_wYnz$go49*@e4xmQjCvM6 zfWwK23QShR-SBEa&D-A2L>}Q}G>!a#j|;b7l?%5zkKaoA*UWa8gacobjW*0HNYV6} zw8%WwtPz@-;2F|J6S9_>09DM*Nx{QR;W6*RM^Po!lP>vJsBlNTa0gc8h~K`hlbCWM z-M+;eCnu>P?7pW@?Zu7k!=W{d2K^oC8aLj1!ZiRkpnS_O?vhC^;9SQ(1#1@%=cNeC;f7`v4;H z){NMBJ5`<&yLmrr0O%S{(YW<`ycoVJ!+PR@2Xy(>lb{p+kjvrFUvY~=C7;AeCE4P} z`0ppZ#ZcRpYcIp1b^hh;uCGCYQx zOtW^vcsSk#~jfTWF`Y+8qwrJ9_sfzBr`FbQ6sS z0WQ1;>e~yP9RZS4rqbwvebQZEJClPDTfF$*aJ*^dg+n!G4BqiN5r)S>scCiFHC?QT zR%N7nyxu`HV9YhIg)r3eyb>NgRT7<~!(owmq?s<1Gsg3{mF{>IUjhKRhPkuva7c=r z@6Z^igBTRW1I1HukXOTl3RNM*B##&%Sg~M`!h?=gYFI0a80umL@va^%Tp)h%X@!te zI=qMD@{^-t;zpdE=%kd^p{yNlrEF|9zZ%o!3~EkU4*g@vnOX8fOsDWuI(LWWxRiI0 z#id1~=29jgBfb1LvPYab&MksSj^QXP!i#5ho+5_G_CJx!o#POF`UVTTRrmAf ze-Vg1ct7m#C2EFC_tkePukIGmwPz#Ty?D9H?X!2cwzCUoOY2K9FCVSc8Std298PE{ z+o0EJ!&D84EiwgwZ*Nf#Wm!WS7lpa=p7fdQM@!++4aGW-A+Aa&rgqn5_Sp*o&njs< zZ5wBuWt%cfctO)J%~Sq?jeNky4u%u6b{ST z&^?2JI~G6Mq2PT5EXpGf&<;fN7>H9FQG+$f;hZEfh<+%#XNejL=oDi0vNeT??%}#i z@k0}r`Sl~8QP3$*jNUPhh%CbK=~fNioY8lxb^-2|-ddHa`eqij6f2j*2^XR2VqZlG z3OFL~7Eg>K)@g`-ZwwkW>3ZjOqwkaxD{C$#tSd*V5bN%S3;&4x|D_)aE7-M;`u)2t*YClp>J&9>Fpyp7<}#c2?a}SZktRW2I&cc5g65iWkdpPc zMt2?qJH*xW8x?<%7nU!cKV*stCnMqh8(y^X1c_9RLYs6; zERT zMeyHWx_4fN6g=p;XK!QM&AsjYXs2SB>#~o&1nisv#MGY9z0L-Pe)0c`T9k!H|Vz@<(=-!C_F(?8Das zLB>M~{aQoCNi{O|dXOXL|w9fnX#-(Z@QtLeJg-ed7FAhtu@n zc0iuDZ5GR>BZX6*KEJ6`8w^68HZaWtA9|6yENuT<3c!;JBc4E%qQ$}$KkN6Q-@F>N zc*5@}vOF9)VP+_(QwRIJZj9;$P`NyQFs$?NS}ldZ3r{$;)APE_oQUuD&V1@SL5cSW zo$5Ow3g^5x{65IORae-muR?RWg2H6X+F2#Um@8*(ZKM*l~i2jL*I2z1dyoKthHeN0D!e;*B}PWwnRhN68$oCAFEo`lpk zp*0c4T@ zgmY%c1kkmwk zkEh;Bn2)XAN`#N3-Xv`6hfHv*lgTLxV3dWlIku8yFn_chey?P-9NAFYggvPCXFX3) zEk`|1$hE793*27v=sIZ-MSPPnjDq;GJSiWRCU5Aqfyo70KVke5cM$#$>lKt@(PdlG zcjo%`ASRA_S7bv`6Boq2#?kd3LB*qISpD(wOZ-8@qwB0eMDb1PFdY)h+oaABl|I68 z@lAFxM+zdbeX4K#uy2ARvB=B)hWF1lLAai*n?-`bUJoZ2cz*&kJ!vPG^n3Zb5V1~c zc5%B1^=5Z^l|Be7XLkmqKYnyp_>rmF1jHirdj8l|P7I_kCiMOTx2LU)Kwk_I{BsCR zImEOWyh0AjTF$GIQ+0LDq^_Z?k3oE2PkgU?*nkn;fLJ*;G#!es-+9njj*71j7zUV< z=UM~?nrBYCSFa&TWHN9KI}c4v5^-%ik5o+MxJR$ymt^?Zx1R>Iq*eB!q6Q>nii#V~_vW*-&taAni zUUk^*zg=cNcfS?mlw>^+*Tcb7R`pQTda`IhGigAxXmsIJ0&ps~5!8sGD&qUjCJYEC z4G8-U2*(W`jBAmMYhPJ4LRmE=m^36PNiT~W(?Ax4TYBQ2o)a9O4b%Xg6U`*Mh+z&lAyzu;F0K<+ zr$I=c5-WjPnv+2hF4$E@eC>J^S?x4ctvI>{Hj0KZOl2L!G8g!{5%{?h_&E#sIUKk( zUjTbRZ+k*-hNOY6n1LKwEhV~!GEAj4Y~?v@B|c1L8N@OhxHV6J%Z~sT^Z*yu0Cqrc zdvI@ibZ>ihZ+l{Idt`5WXm5LJZ~Na~Pyb%exL(h&UeBOjIM~WHh-Cusb4BoTW^ikU zfCsJs_SoJG1p|H|1A3BLEHn*;56ar^XZ`^8v_8CkgY0nwMAKS%<63$1+G&H@X_MM% zquLN=4RcnF0o+O_oJuF$N>qepNvLx^C~FLWivZvO8p@gt-~tA4AqB99^x;hy=nfi0 z8`mSm+uv=o&IGmDnJGtt^6A25D~!Zp|I=Koigu*z1|y zt0iU71rjlXE;)lP5rZxXgDwRFpI-)5q_qO%waaK4#HbqQFqIDw%TVCw=-}2r0-Dl$ zUz2)YvwGKs4gOHnc9YaLqiX1*YHYw(+QC#_fdsaa7`E~+OeGcp;kOuA2tBMqd+%AK z8YH-zj9i=&C<-oq>LKkwmQMcC-nT%6X@vCyU@janVm+5&X&+?3p!xUU8EB|fNH7NE zvzzE#Fm*`68$d3)FAgvaACT?$T?0n{_^W;66Z-$Ii~HCTb%y%=+qV#?Z{HaHU&W_H z?Ecu>IaxYe+S&fEdblbZO6Wo;{E0TMPMQdgr~pUw_)SR&L$J2eAesE1?*9G4IVmOx zG8Fh$4L8QmaHR>qt&)j%0e?-_8p36Qgh|WJPPtD7oZ7u81$})!kPOhS0{@B9_%qG- z^C6>gVD|fTqHH%_n_*Z8J;$TvH3&@_>e=YO){!iWLCV0TV0Ic^S1PcO-(u!4+(j7P zG#ajV4ps>_IojN4O_gSx>Y$I?R8^Z|iH>6cIxW&dx+ZI}yF_jYg^fE9l!~Kzu{Iz*sh0^1yy_<4V-CQP6-ms|GLdBy=Kd(es4%Mwg4xppTmDQi$sq90X?#k46_!l2Yf5t}?jzW$pQ{Db;OB>D|M`##H^A(2ugZtt zqVb%q+KrCDG*Lk?k{l|3rVk+v>8_Zhbt%v}Oo?Exq+R_TFD5L8WGBVL?Ldx`-$IB9 z+i|$V!?h1t&gy!;A(|Z#aU8o-zks2?-<&9>i-cp=w~uLywok>Uyewwk@nu!=U5Rr* zodhaaiQ@r|T^;MtEZ&gJ(+6e6eBo>tT>M|QTj1QpMd!ruV|BX7>1hi~>UC>qTATfGFTN!~A5iC@h<@B7#KRhlYHVp2zOr4?RXp z!dqfqU~%E9)&kHa&Bvg~~a2AG<8RQjjVsZ%8Zpv=9TCgpbi+2#AkoKbZ82m1~z|HEMAdY8#TFJdW z)l#;i^N>-Y2dW2L?K!1d({_el?dd5?|G+z4=>N?5{KSBQGL8?!fnxRR;*8`6Mu+70 zCwbkW`ouP1sd6SAy$gaAmDN7y{~cV^=WhXU;Glxjpa7%(e+8GQsg1MY{|u|(_$k|k zUnnDA=UmLN0V!-Bk_1R9Vi+>3^hYv-hx2ehl|+$LFv<8$&>1h(VxnzYpr?J1P`VB$ zVZ%j;zTLoeg6*TiG}zkz1U=oI1OlhuKMy`$&nF;yDbFYlYi$gMensc)j{l;h57~U( z;)n9#y@wdkk$~DCy0IY1*A=+_seBqFa(Q(lS^hy+Mit6prg0t>bPyRI74!ojN)Tp& z6SFN&7GsLT#oMpoo=AFC=Kt7t0Z>5YKThX{&&`JkDM;$Ucc|Uu{C!$JKj#6Xr zZRz_BN~tCxa-&1@v*>ERc7HB~2Tqvzqg3PINBSPM<=jwL3(Er9eg?Gz4Tp-i4$iTDGfrC$z9g$f3vF%U#wKtwi(dtp6^#_LNJXs6-KB(Y zjmjJ43)8D==LL@!jm0~DmvVt>Rc4e=pHEp|?^j=MGell@=MrF90TRMouv=hsbVJT2 zhjjvjBT&c~D8g9$^(pYAv3edl6dl1RufLPFd|x)H7mHCijAdZd5AgOjXsn4-N1AS1 z8G^uc7$-SlTnerc$A{(ezm8D^0u-RG%f8vd?k>RfC66(9sUBNt3$g!9;xM}_L!5Rq zaS&KhmpzWKPFVBZ5TSy?pgiJS54Pn^pLSaxQ)%hqHhsb}Wh_OJqlz3e>INm6E#_FY zgjCSRHw9Hm!MIQnP?t4xbQKcftWmI)T|QxXc@@88dvtSM4|c+Qk7Q|+z43;;$|`QN ze%8uTScs}OBhsGRSun&_qvEaCDYKX^Nmyea6Bh5@60@u0T_|DdXd9`XS?5m=)cre# zdBM;TH~w^w1?=vY6;SV?TT|C*t2|OFhku;E6F4X{kNF25{t6Ete26u!h(F5gs${s8 z)m;3PvYA9%O;7ISbt=68y^A>{#Jp8kNS=5gl7BpL=y|uu_v90qpDW8?ebOGW<@|F; z-$e3-O-VRAU5Dj7BFbfLNW7zFwY4(tO0z%fhWx|Y%9@~sGWqJjVM$2nc(f4d)@}61 zQDG-lTbl^opTeSS$Tyl>h^c079Q!uvKm=0WR3n5!_BVAIP1wM~4voBtk+S=L0`CML|^& zwH@(`3Z*h?(|!lfKL*7UQ*RL$vdHRo6!VZe(!)yrVl`?knVrFdk!0p!US0fy4J6tq z46oXS;?S6^p}}HlW1uvj)+s5fAJb9qY8bbIsTzO6R(h?hD8K#Hum(_$NTUBAuPM% zQC7Ad)=We6kVK!T35{AR;;X@Do~g>`9o676r>J{30aP@RSErbt2yCQOqq&UJlto*# zJM)BQ@#f>(&4Vb{qY);tQ;PiAiAsi0-dWZ*$O0w1Cf%6wq`HC1FZ}1NR}0T3j6$EQ zeBLRJc0^V$Su-^pw@KGN!c(NB85$3qza3F>GAyC@jv}u7QI$qcObQ%1I#uxVdf_56 zWdk0}X2N<;*-%2Pm?*>YA*=Ic#tH^ETWHF!dm@WH)fY}n3svH&Gw38jD#}EA`;z_G zUxp&wqkE1ku3b}&NoYm)nZTh@?-??%Dv0`37(9x{JS%zd{|TUJv6n7h|AV(%@x|IP zXI(t`eZKboI@|hJIW4du%5CvzJx?okMNH+=y6M82LxxM}1rjwAJy_nST~v(Dn5{WU9*lkFvjxYU>I6 zzERwZyF0}pI23o+5Zr^i6e&*e;O=h0U0Xc3I|Yh66ev(iOL_U-@3WqD?!V4CYt5RO z&&*_J&15p!SN6>Js^5FSG8j71N#A3DEGd$;GiMISZ<%X&_mO55a5eD znU4rH5Gic^_}n$`x02}9JU-Gwb&@h?UH!BBLSPwr>p^=-CosD=_?&rPbccN++^=6! z@TZdfXj>QP6Ir-JES*}RdD$1AXv_9Be*(@3v)F)o7X2>)!S#01+Zu9C;#Zh`XD+qT zisrQs9xei}Oo1MaEZ4OUjzt`POCJ4?-xG*7h0OnaiR~Hb=+gZ2aZnNxxk-Zg(aF5t zE$p$Xmtd27jG)$#- zmT?U*nbrJ{%Z`85lGl1;`hD9j#jCE+2&A<+M>F`wcu(DaNP0v<2$~7%$yWkM`wV}NMd}p z1I@3zG3fk7Nge5SE;ud$$TE6753f8kM61dn96oOJnzB2j!`kYn6m3v!NoBQ;FWLvH z@fXzt29Pd5b>_mmm{>lOOK%uOKav~m^fu2K-gT>fMIOpcRD_0$>acL2JBU*`2nW#2 z-l*4o94iwg&r7k8gh7Arxp()829P!bsVz&iWxFg26VJ6uHEi6r!^jtE%D$PzAAUx2 zZFI7Z?XKJ0+ysz<+k=(}l1^jr_#zU|lu9S3TAHxSOw8V#T`E1?oO)?uwUnYpeGe?t zk5opT7Jhu>dZYJ8?{AaK!L}h{^x3951yLY z#d(>u*+I~QS-#S6nU5Im3SMJkz)~LSKA!dC4_LW^5#=%2Cy$h=zVU6oBF;j;94@{? zTn)j!7(sXGHU%n{vV9w}fb=XG%OffyqGZbgwiB(n)?yu^j_4-w-B$Yk0jL{%RhNxxzOJKx$)%D1WBMG(E zC!RX$p@?%hY8^!-$;9ZDwDrb97{j??pz@c`iYt=02FhsWT&!bdOe_{56W);Y{5aW4 z^jE3VO~vHCY%}>=Q^6g>sGh>d23jI*Z4GV1`1!H#t%J4z;&;&H0aJr_w{;>VW_xHR z%1|}&(X>RujxEyiR8P8$bj+IaSr6L(Nhy`yrRRTE#lq6d)Wd}$lS5TF5Ef;IU=EJU z15&JxEB$EVe0WxnuL{}twHwQ+^&= z(tixev5D3rP^gm8ZN9R=v<<{4&-{{qDpjUnQxBmJmyI!Fobs0)8han3li#?cABbhc zXy=B08Ssyt?%>!zrybaLEf>fG_>9Kvv@f1G9I1-r>knG1eFBNwd&1&ziMWNr@?Zr% z%h7E;FLQogw8JHb7)yw9Wfiv(bS!Ippfpw+4bQkyFu}(qL^2euEf2PY z0%GnjEwX2N#P!wJnPD-QnI4Q*q1t~AOL;$EB~IubfUV`G3AopeP;NDHs~CQ^S4$8m3mh!Sd1CTJ9G0ED`2Sypg zPX((z&OfE5ESNaO72N4!jF1)<2=}6sLE5zuZt%IN>!Jfm*;zEL4#7hXe{>OM=KL~V zM5?Zqrq8(zDEe)T#fRzt5iLFmoSeC#$2j(Z_-?|KMc{My*j z+>`hGI+7vTd}$7&@RLWrg|ZD#sT|BXvYCOZcDbP_Awau*xAPBwO-;i?s*(D|ZcEvA zzdK_7D{C0e)2W(Fs#%9&m^tJ^qrHA%AfjivFRCs@-->d7lgZFsWo`Q;!mMpY#`3CW zFHp3?(VMZ{lieA4bXZ#wjUY(W<{66HmcP}A?+#8KBTf1w^8H0` zvO^k;;Q~GV}~uff@6h@ybclHS~%uyJ+agD#1D_DjGE zJlX*@UN@j7W{!*{L6KJY^r-92J}CZa`NQqdEB3 zY@W20o;UAF;m-oEIgww5KejhsUUo>}p4}(HBV94YPc!H(_weowPsc*}Q7eQQX37)k zsD?#nF+MAbe`ilbx4)tSATzf~C! z6hzc^M;|wq`z!swCL0=hU^3La;<9TJ&Cd9bu1LVA;Kz(3o{*4$wyi=oR{C+M-wz}H z*&PI^$u}Lb%~fTCCmrX^CkW1j-9aCEPwY%XYPzOt=NgG}@^rww@!c6Mu2&gV&Bs4X zvnP^05hBFGiR{S|PW0eMHEO?Bc7u~>$cEt0n0lEQrQJ3ZhD z1etlk2c?8b)-o11uhWLK%u`G)WFf4)e7@TSC)z03*{ncMjcGNF=HPGejai@`Ms7&{ zvG<$EAa|F@8jI&X4c`aQeG8>OSL@eZPOeGqpRV5~I`mYS&&6(T<1<><{D}M_Nn2|J z*_d)_z{JE)RP9+<0!QmRi2~-=gXr0Ro4Pa1yI~n#WpyPPyKG(hzQGtCSt>-1tiu>} z(vU?iaQfPlySB14Yxf-#UGv!gDGqoWnIUyr7y};&4k%pdnp6ST;G~21gN`8!{|%}G!oht!)iNN z4?hbH5Aj+jTxc*78-I5%<&9|hXsrOufKTj>aO^Hm+w%lQDysO&?Mo|1DysVF?MsVC zu4UdB?Msuiu)Nf&ldk){O4s%JQ|vKEIm>?UJw!;hl*Ttn%bO zy-*H<~nn--793D!mBL>5cTr?X0!d6jWlV91Udmoj)s^TVK6ghEyz^I#t_7ltF zbZc9`#1K*3B(idRg=u3c56f$Tu*93wAzj#3v{EOZXQKVv(dn0FSe~*fYjd8D-%U?B z!Mie>^+hcsZ(Wi^>9hlWDks#aGBJJ88fO8uvVCS{Mrj+la!Nehdrj#BhcPbXjich* z{x^#tRR{3i2pglzI$5mpP@_~X&%Lwk2Sd`FWoXFg3hAypivMprVHjhyzz8pnZsAe# z+#Uwai6La4>Fb;!#4_W@Pbbnbm;AABfn}XMVM%2EIJ!@{+z*|B)%{~k_zr0OyXb$T zSmcQ+i9B4ruwcCD@xHOmiDoA59{?g)@GkbnAN z6`N~dHCi2b($?)|TZs54C@AFh@7*NT-0X07mH6Bz3BI5C-J1VA=Md3K=nOg+{+$xX z%}-_!?sXM=SdPf!k`#C>5Rr&`G^Y{?bJ?4adf<)7+nIQeBLA^tckyQLnNjF06LW5( z>EYwLj*IU-*e~qr65_g!kN|0!Avw57|BjjJ#*J_I((=W*+7@_~e8Zfq3O)gRUo#NgzH+5p2}X48>Tm1z+POyH znTA9J@hk?5U(LsoBKLZ07Ib~9V}NPqe_iXk)iqFWn`%QpsJ!HJ4e>jUh2#!UG1mcF;vlO02C+$`iSrPub@4r4ib@ zxvoj;uo*i&eo$l*cKOs-N%e6Z63fRsRK`oct!wB3_ieGaidrOr zDoZ18)R{=1IYh-=Sg(exav2NcD5&iy2y_(GbyRpSkY`P(LekZ2Bp_E$4%L6BTN_mi z%&P|GL4kQSK!#$KYR(tYQ zdm`zfn=WXb#zo11_z8PTOXi8*MK;*K_m-C}VJFAw}eEa*;UBc{Kvx)Iu`}c@GbN6B9fV5Ns6a;o)OqLO`+x8!g(m@-Q(WA^GCbjHEtbU;l)FqDdy? zv$(sUTd9`M?>hN$iDgFAYJWMWEU|#+c08x9WT@KVM-87XmH%Pe+2!V%MW*ZZfX+vV3wDdf7Fp49%~bjIG@&pPYeibxo>5 z`|2j+YyXx{&O!fnu_-~r>)2vyhsxQe-|S^*t{$)z>S#j51k~0i8U?;n2FmKM;DT0C zp+@?^_*(KbD69_3+u*1I&252Jc0omI9A}}q2hhxNC{wLtY^_lmbhQpD(BP;F-E4t& zbV1E^R=8`=NkHu^z$-)GCzBP)n)4#yLsG41Dm1YU%FuAG1{H0E&RT1d>i&|>dm$;Y zZQ&zNdD^>KUYmd0KXW!iBSat=>umX01P6^gQT)n9_2)5sM-56XC zS$AV59dUig?EMdPy+|s9kB3xMOxM#**E3CplTEvrd);f#hY(CKqevT&=Nj&nSwBI| z6`|%rwZWWSb}74WyrBeINTh0ovMGGrMExJ0DKR>_vxyC4j^sfD|ZzME+b3 zwa$07VLZ|1(K}WNE2;IctoGQ0dT0X=N|h7hgCo1_t;HoiyMlu*KP_mUY6qeR#CeyJ zD02ts#w0L(5X`(;HyE4ZhIFX->Nbj4}P zvgS|xSnfH4;a=pTELAcsjM0)SK1gNW!5K~>+OXpM2Z@L9EkVSz+*znG^r3+wQshT) zHS9S=^F>kW^jfm$V7&Vo6i$g$Nsd&q>D`7#-2?q9 z|Lh|ljRTCjIsng3fO1xL^CEjOO=Zy2N)X+U+l#0{bY;-tNHoZryGf zo@jMO4<_jRQg?R`x+0Peuq6`3o`kRe1I-h4*lkUOZtK<{=f)tz#^4_hRFYaURgeHz zQEJcWojP<1GeLR~R|uu{DpGGn7*{W8Idj~owzPwBfG4<&oD$(A-etl>#1NGl_uC;9KJ7 zI+DVERp7=*Q9i#pVmhifsUq@LZsQEEe@N%)tLG;Dnn`=s(0Rpw^HhC`xgE0((i z#Y`_r-toA3yrady#@LXfrJjR$L!UaH&yS-pbF>sh9p6D2FCaoJHej%P(qKDDrxT%l znocMtaTg0;|3LZpDI-oU%rd5r^p15z^y`xT=TK3KX>H*bH4+ z?z+IGhgvKgEg;w{FzDp9f21poGi5UTRxxMYE?yx>7Z^tjrXAEeSO6XHCitr+j2*@j zBItk+7lDW^HMq$U$-@YDY{bd&hQog10aV{(PN- z&CpbmP%FkF77wJ)Zj0~zv}O;b{S}GR873nZQzBYo$1FUGU0vyz1-i>BrmOgWqH*XM z-)Vhr5X_@qUz$A7bQC^O!86p(Q#XG%u^RA~=v}jHgX<%cmaNWcpVDxEXRpI!&Bi5* zoW-Ek{S4Z2^vSKNs<6&yU3^}C}sn-FwWhj5JsEyfR+&U^?d zR&#MKSn_ANjw7p|;f%qGi@=Ch`4}dLe=3O@ z7U|U4UsSk9wIi0a!k6?STJ_Op)l;L~dm`J)UXulGR&A(0L_3H6prycz zz+x&JuRN4%LG~~7UP%6Hgf`EH^S?rwe`s(H^6B9n+`}Q9O9Wz@4%WO@>^wQnxYdC% z<=nEK_+>2~8x{jGmaVyHRl)-)Cpo1d&V}OvMYSdS$SKrrR_BpqxI;Nco0V0@HHbaP zG3XCwm~oR{`s$j#@poG~m3ZP>oHQ3;`vZ|N%!)X&w6LIMr*1oIhl3}au;#p57i~LS zJ}p|UVQQPpX>Z@9AssL)WdVjPcnAoH`6FGf$qBmzB@lnZGY4 zy^xRR6gr98%vF@JXlxPqwX$mB92j2{;%QwdBb}pp$jk9iOayPHji*HrZlFS(PFDP@ z263AX$z!l|>gD8~j2Lg88OdXzR4q@cHTg{T9u8$4fQUr|uMH3XtvJ-Ba0u63R1}h* z&_Mr_41sHiB1QFf@6fX^-6TPhF@B=brLEt>Ix*202(Y=A#8 z%z+YdNf@Ql1B)`xT8bjs(n4DV1%V8aiWbEi9kCD+_7N9xG2M0(moVZ>Jp_RWtToMc z7Df?t78WgKmdzutaZ)r{_Zp>q~Fpszt2VJTKOTlO8N(Js$wA zNQb~9A*;%h86zI6|3RmGZ=hCzYEdg5s!w+sPh7@b@MueS9#5%fR-vZ6E=1Z?3?#_sQ^X4k5qr3D>~9&2bo1s-p|a$a6`0N@ z;Eu@Q;nR(OrpFsfy~(ncchb|2dhGu>=>cHor^#)iU|-u#CyLG#+ud6{;Q> zTUi^mzBpxBCR&@MKo!v&HDUf+8y-a)vYXnUy%&2_iP(nNSG6@5_u|9NoSJr{st~=k zL0SL@74!7f?6FsG>+h{=XNgX+yty|FsGOG5S%T3=7e0-mxJ%eR=k=qLEXrMCGcEzB7!ZXC&p&O15^~#Uje!5}ky? z2z-O(2e0PL8vpLfq`2Uygw61Ha;6SC!$22YL2N*LGGHtsKv(^iT|JhXR7k@;)4{Cs zo=a%C?q18f_Gg<)2Q3N{l@l9~3HnY}mPAOX$yT)jCdHhce`qnOZ^gcEVSe9a%R<<^ zz5{8t#cUJWMk!ENEM+;x?vn8x`nI%9YW_Havk-J+=PlU+@8rp{;9|Xwn1r9>9DUUfgsLesvoT%*k zI(DXW`NZDM7EESpGfEpSM~;^~Dt-eqPlLmEkSpdUII(IpBFEEO7Qacfh?Yv-j|ru} zmgl51v^hOx^KwMsFE2re6v=3*d2Hg=y*jf7?a0{lf`F%_7~X#oyg$mm;}|#roZj=C z=0j#ns!BrUTj$sAO_-gDcOCAn{(=I?f)mU%(7wbutG>zwoZ{cXeF+PcaVx)AFg~-q z*XYUKQ7x+2A0PCh{4nQn^I>f8Cnf6K8+eKM5rcPsS5SU<$K%)6y?7a>R;Zu-0k*ZG zw(T2!xIlO#=QF9)`tB|?+z?O*7p6$1>8^L@ot~oTUj)dArQ=_txwmXEr<~4WrYA&3 z>I-Lme2gc+W5O7}jz>V)al~C2WSY7IuR?t>i@xsNm-*3e{D}UDBcjS0}4zQ`aP`XqlC#gNm2mPKDXupp`9K z+tWPbtiEXy_zV_;(*y8uN*ebO&nTV%&)8+lo}~*(<4Vu0A}PTduEpjlnrEHfh&|!g z@*$;|{4fgjGD)W>DX6({P4Hg%b7a~%iN=3$?4dI=tMs7qX4mr6n8fP6S;|+mH8xr+ ziac>Eqa~WMRKJ~B5i@EafjvwHsX2@)G^}OPXBqI^qa9h&$`g`okdI2lhD`8{k?}vV zby^}yQ?~#J6GlpxJj#Z+leq71_UqB|tcX9Crj9J&P0&Z6D;YcDSuj*6zBlCq(N3|U zIy)kO%KOkGr3a?Ilm@aMtH0-CDS>-y%7-SU6>$3wE?f;++7({y|Hq`D#mo3?U00jExT8v`SqR zJC_s|SU25HA2zw}!7h-{5|D6|*&b;?r1dFL;(w5MLK+}4n%v?#RJ!=*B8Rn)2Hu=~xE< z)?A%k_vnI%w-ZX>a}Ytj1LcJvjx zFg_>{$!vU|qy?gthjeDqY52>Em(iu?@Bd;FsVKwp=#dfTEs+iAm0bXTB%8B&V8WJH z{SoxOXPRi9=?gBswFbAU-7UOnWo2v3Y3dGP3NLD($am&q)d1ac8-v=-EX(?3?NHw< zzK`|K;6KyaopKXls#Fzt1NpTUvs@O}zSTK&hip;ZP7Cj^M5DSd z7TPz>=f7>vtS`C__b*%z@wI)r<=l*T;=IDMa!5)k*(5mh-2}8KeTw=}BCg54Iptmb zNG`7ODV}R_r^3yi#-8ZP+NJujCbY+r(q~xsJj!GF-9a@4Oxsr`QB>TRUqP&#(r1R} zoCDoQ0@70*BT6t`rLDzsvcx}7{xe;gw|7?H>_yA)(19t!iuP<-yIE==_x`xL^e(g= zd&%CPW0h%mSG6=i14 zSHbt9w*=>2ys7F(q|n;0QG$n;+wN!SC+Zj6zbO)7NY9ows$cTd7ORqfKl6JQNfi85 zEqaqrZ1#3~5#Fq)(Ih!#Swy|pJ+10#3S@eLBuxgv6pthh$~=p1wY%qpp&I*uYoQ#7 zu~s5fpA;DN8H%Qm!Cf-BSIyP{*PhGY@Q?P(a(P@Oz;6Si4*}k6F;#osg6brT@x>;r zsz!XHL#LD#Gt}mH3-Nr$L-7bVwt({U1OkqMW>p!M*Lg0T6-sj(4>0!Y&*$MJOXO`lXLO}}493Y|lZ9;0pl4)j(L+tsu81u7-yFvt;E z*dZmSj6ZpgboXHsS*?M&vrfCXylo^?X4zY~1ew;c9CzhCt`ES`x?D6K@4-Z2`6rn+ zx7^x!h}_hDqttLD4n&Kgbm z*MDf+z>s|E+SiDG${}$QwUTAOpD{O&pQkqEUIeZJO$`Kej0cc+5xC$;+~K=IF$a+I zp)6j|>lE#WR8MHfpkBR_Uj3k+4-@p62go2`$XRCZvD~!ou)0E){D@x%y=dXj&{^Rk zqy1bB#m3!4kgaIv1S6w!94%@q08PUjRax~`E<2Q@s@o_lOW91rN*1$AhrX$h$%557 zG7$8Fj(}>fsW3t!AS<(_l9MZ&vjDQ0N?8KH*r)x11AC|5HkPbelAUwO5KwM#v6NgI zqv~L(Nmf5l%1?#B70>>OjUkQ`feVx+O@iK)zKQ^x&wX>K7P^`nzN!LWud6K?RqIP; zl*QK;JTm``-XrxY6rl2&TJqo&wff`6^%)~-wdl5h=yMk6Jvtjv3wV@1THgfFkDvU9 z4evLoBBjCDq2iO?=2@Q#i>Z-ee6WcjD4vbN{+piQGBXIpi3Ajd;rHe9!2^EcnyRoF z_ul^iVd5IW+y7QNiEF{MW=GdP1Zp6Mh5WWF;2C)}x<9U|(_(V@prMfojqz&B0EXDh z)Gk!xYg>8?kSf*rJ-D{&es(n7#6iVqp(Qg^#{tiktXB%d+>XpdAhO=2!Wp=F%i1@~ zT>s6q6#OFLV5m4y+qT#lz8@C~av(NVXx7iXM}-5aKND2>RE!Q1ak9@QD5b4q#EtIB zIEZ-I5aeAtU0D5f)zjqDiH|o=5j1 zjxbn~JGtbL!(X(jTZa7qplH$|P)p$;@`&FR)qx|4wrzkvGgA`(&JSaSE8VAh(O^=P z5FZtDMF4CgO?i>NNC?JrPHzUmoIa8Ht$;?1RJv<98uhZvGlQ39Q+oF;PTr)MF!A-D z$#9V;Dnkuf+qD&1v=t1=%CEpNKw>6N$j1iTcU3a8P4~JCaqC20fArJV4aVP&jpxgS zHL}71Rie`OoYHUg^c$@dzdm^}PsW5*tAScI^xz8?af;t(zeDzJU?u|en!3Q*I$_u@ zeOtj9aE^y;>>CU%R7(zD`eU_XlG<`xWxp^CU&=&nu+RU=sBH%QCfI3Pj2{CwjGgHH z3;)ru^;xoRO9h%CHm;x1J25gDgw>7%Se6))`(fRt?;q}JY^Z?K_&3eWz&}yKz&|Be z-(TLTp|9bk=PpyQ{;uJpA-FqqGm^3$Q^b+PbD8U~+H_p|4{GA(C%|&BZsO)YTE`>H zNI}x}I~n~M9!Jjitvd4c`G$s(+7$1rA5^s|SP$MM4s4cIG}{o81o+F7jS{hBmeZi8 zEnwB9uNb0OsPDObA`4kjn_kuV3sv10$k+!N8rL?-Mck{}FvSUeG0I+)kR%`s6(jn5dZT)tXKRK; zVVuX-4Yo`jGKs18pBk7DXJ&%P?TM=f%FRQ8_FRc)DvciO{3NJU<=-K1%x34{ZB){& zWPb*-1?N`HuG572_hNZ{f%|!&%_0MPtR7y+b8)-;%uLZ+`ZHmB!4zh2U)YTE2zj|V zhJ|4rqaOTBxP1z?rvEqcB<{eE&GL<0cVZ8weJEqi>_0CY73er!q7M5Yx+ol`A)ry2 zMHW(=L}54oN^a*w1@qt3fFWGjAJAWsA0%xq!DOyb4=~_Q*@fpp?!}F}Qs#qUU&9e! zys_`ybc!!7G7-NJAoVcAe?dg*>FY8H!94}ceUmPnB5Qe(%CB{>bgAG6t(7=&R&;9v zw6;5iCi7GsTv_?u*ebePKAJMO(&ma`%s9O@YIUSgakyrU6K5OkZrL%-#KMJ(6MwIL zX<0=0iI&Iox!pJN^(&l@1CXWy{syU9wI8REAFcuJVZ~_-Zt*tX1q(3b>TB#ksAizd}gmstz=Of9wd0 z@%KNtmn2t6sNi12Y@VHvpNl@PTHNB}zmEA4hS+@2pg*9op*Ua#Z1_c)IDgQj<~5@)qG((cJb2d=aVuEh+Napa zBT=kLPP6m_qS@XKdA08)Gk0uFXl$1x`|dDD%HBqkP;~EuWhpNewB3hnVQh#w(9uF1 z>H_A3`!;DD%I7!hh6!by@Dp1$h7$#eeZ5M?diIEfv8DE}CkQhR2bwgFJ%~0o9zJAr zeI2?;=-Y|8cxUEz{9tS1cK4hdqMaS6Yw!w94gqBc8XCNIB!`%02b#YREE!eTw`w_O z&da+Tu~}2c77~e_sL3;N^(06$7V_UZWMXb~z3ZOPR14lFbk|MJ4)0+-tmNU1^wG`8 zgT~ev3CV8}GF4W)I__3RjVx;kt#s97W;^=mG6)GUSHgN~V)JtGb#=Fwr`6vc>~y<2 z?p0=vEb9ohd+It_Io9WGcGYn5wy&tabk&$!or8qhy>vfWIX1pYa_hd1Ecd&f?^Y&` zENct-c

P-8YVCv5e5n=c45h0@bNpEXeJ}mSq0qV2e)P&y(4P{z-w-;KD zEjEK)ZeH@}vF#z9m)BiXH`DLgtz7*XuAY)^Dk^ZCq-YbOX6JTT)wk<`B^Te_vkozL zmHY|Tg>-GJPbv5r^i1CR@Y+K$7w{@gyA7e)7PrRmB7-t*ItUm-9RtNT1O#YtJiKAW zG5Bv8BP#^yh4gGGtu{txTtb&vbR_vt{}u6qMn7kYlV;!>{rgO)WdEB_hqUCjs+>pW zU{2ZcGps0m2(A8KwT*)PgCY~3Osyna4xZ7A_5@`9JW0j&vwnykfT8WVES0Qeg(hSA z|1|ww#s(fqgy5BtF?_UztP@?iB}(&6i_dQy8!S6rCs6bLl6TAbQ$jP1=pNyZOKn39 zQOrBIDLF>kvep<0;b-Ah@II)T9==sP#zV?mQtI_5+?dXne&n}HVVJfaKRb5ztoNt% zAIMiUhd#6nZ5NTDH;=q}Ed2_OK>Q06hJv2m31{`;*ea*low06{eOj}u>I_i7C)A8phs73R zG>tI-l+$EQU$-eft>I8{258?C3dX7{#1+P60BMgn2y;$~!;by!)BPnx*ZbgR1i58M zva^aQW>gmdUUbjveU!RCRr(tI-|fu)C6Ji!!=`cK8YIbGJII@+Al3Lc$vCDi$LB`p zl--$9KP@&sc)V?s=+E6f-dD8cETL2=NW)x|ousoJ2x)NmSK#XMFXGyct88he3b}lG zS1D&O1rWgiMp2x^N=$DR(Gi?ZZV7>BmBwRLFhQgrRpY?bc^gnVrvEaIvB+{Ns#f7C zixQxt*i7@7ID!Q86d8j0V0BuBmRbanR8tbH)cZ+`WScCM@Nz0G+JKiuo0!uF)iknF z%q(U;IT9{)+ZZmB+-Y3XE`BuX-xbpLN^eDq6~PVwQMR{s6WVxO>dcDrUHmzeM0<-i zo_e4EZy{5En~vv)vGH33hA~wL<=eKWKG^sz3d5K&gz`r*%k-~#PcM<@(Z9HzIW!0A zGjFQQ$98_u-!y@hzmdPL{>6~A2u?8P>mU7|`#lZX9qw%NF9{+T!b~ueap;Gcrpl?} z+Uk8*2Tl$#CKlj~ZgBDUHfAsWV+ahR{Nv?$IXBTP$ujmY|3Ando@n+}NKC^#Jmp9o zhB!%iuE!$ND<&JzdM@K*$|bIjAfz%7phAAeiYB9%R;1Pt%rlC-6IG?f7y4NMCXCgg zP)a#oM$su3cS&tONO*DvzfGFVGbDpjJN!lh3+0{bj|ioVI5)HSg(GqGtyu3}YThBK z*og`Z4l!zz01R3}uaUZRCiop#1~OEb2}I!=^Z@Tx(8p6h*o&#Ij>e`@+xFo>MQUAZKI5o1WDuzj6UI&9y5Q=3@*_AZJ2Z5@ma z?E)L?o0*r+35;oVR}&Mf*oP_?LWgEfEO#C4?1q*JB?+t4-Z281*N#`}z4bw7%B#T$ zRvO1KA~_7lHi_A3BL4$f47PJvyex#cOF%ib%b%t^)^D?qm-+2`ZEb{)Ig(AuD2;%h zBaj0s1@UT7*CzO(5iSg|! zyo*Yz^crFkYM-O0Dfxhb;&7gKyFcKQt!-6$P^A)c_Nq~F`D~dZhtztQP8fArrrV5h zqzb$hSp+86(Y@S%!EGrg)Yl@+S)mk~p%hkNeF(AL{f#L)(Sy#}=4!dyoe*|{jZ)a_ z9^u1H?Yy1j+d(~&Ru_Gnv-cZo1(*siQQ~-WsQz89Jz1=w4g-A=*1A@q6K&*-V z7nL`+-7HgeLK9=F-_nhKEI!m9d4IZ)6`g&~rgjUGd9@E>4n5JqE>soq<2u^yPLKEx zep7z>OC-ZW?jnL=eiBR5=;fc?0k+i)sHcP}P;r~Q9 zENP>JIH+_?BKcV9T77u{?V+Ko^c;NR>ngR3#ixPw~C-8Bcl)XxrEc zb+y7Nx4ud^#e1{}W7ZW>uk_4SJL1oobO2;59R^xzcc(K?Vek(E)a%Nz%azk}X>;!n zz7%$qpbS`*|B@0kU~A1@!bg+{vvniF2Nr$t_n@3og}oh#LrkIZ44>b+YlGP{5g-N7o?Z%F5P@D=RuAqVy=xJYExVdo z*n8AJ)%!%@o$-aU=R0-mPN!l?#$#gFHg!U0tM4G{M(>`;GIp+~jkkUj`aN4HLvdN-9TUVzWvyA&dTHn#7KHU> zqENl4Er~#@9a821#V8Sgy>9DWmX5<@=ranP}G3 zh7}a_MVoT2xe3@W*2)!df$E_OfZwt}RxpMp$%yX1KuZZ9oAe2qW&}1ao%eFkzCS5O zmU8WO*%L+W;cT*j>lje1TZf3ZG4xiy^=EGaM4~n{O%fJ$4YBblRxo|=iUelf%oFJw z?(2dKz(+}6(t+X-APYdhVA{ZkE!V0jQKNNEZf)JJZ0zdiyyu@l$R*~D=;J5^7&6k| z%00}ok#)d+$xc?=0OQ_V+vmO-9cleE0r!b@WBY5^L`{Ec>s20Ut?Qd#t%5+;@5&Tc zpH8*@Nc8l+z=>}LXPa3_sJ@o+9T1JMHR>%q%kKS|^pyrSt`k{8>HX zx*>J^oJ<=e^ci`%v^oMO!(TlFdl2fp*M&C7P%^T}q_x_YE424T0Zjl08>vk;yA*8< zsJ_H~E(Rf)!P&agGcs>r$FlO#<1k;O0Ng)DgeA7wu{ zBsQe&RaNxLZDRHD*CE^|WRZn`u_g|$GS|MizXwXvg+)z=c~27))mcQj#5Zow9yBr} z_W0+26)3=4PKgX&R!gl-a9N()}!MC}lv)Fs*(r^|}4#+I$Ex)KZ~` zZ={JwKpM-b@z)ImKW5aGG+n0-1tJc7dKlcDT++{SA(rORM2>y=?+>3;<1h}2gP zo<*aGyev@9lApTUao(faxwI`C;)q{6hwgZwl)j2k>=E1X>}-<7{ql-BC@WCEm9g^* z%xYx{p4}i1x%S3e+epOn>R{;=6HBg{bsLwTojugI1KqXpMFpN;N~_y(P+eZi`g#Pb zvWWdz`dJWhnlL+fPcthVrl;wtBR--0z{s+amj54^jwnCqDL`p3%g@u5kC=RDYc>Ho z59RfeQqZomOAcuur)F>LcR+ew70Zr?;=-us z)VAVX8cIG#r8TXDMj}}^D#8cj(?%B>N*}>|%4Dh#y%V;348DbRbaZYB_btQ3rhjDR z`zZYgj*WqSRRqgs3YEG3ol^*Z5)C_R32bt5&N?-;J`q(Ur6|)xg7sG|Pm%s4%D?x? zOz_&Mfm|UC+S<`K5nPIGb_c2y6WZJ<)8(Z#w-PYsrLq1#q_V4wlFfE@WsVk;Zt1Q` zH9_8B2DGSK*<9G#n?Q9YTL*1A&MVQ%M^)@SqVqZx#=g#bD|f6>E0Gc@|B`S2aU)^@S)A0l(hdKUSuN^Y-6lVYn-JfC|QFz zky(K?vg4MXJfra|YJ7EQtN}j+VV+pBq5;sca_9ey1i{!}jD5E8&33l5MViP=h#D)b z&MM*jIMSfg(Y^u(Zl0ylWyQyHDdiCTCbIdP%9^F_TV)PElps$jB^V*;2(4;Hgq2v+{W<_Tf2eq!XmB*uyhtlK@%pLIB!KETh(;C*F zOA~|ktiTI?h$hGx&#C@nuOp>mPNL#xdL3xgP z#s=QOs@csWt5ZBC=10DB7d|~bk4&Iz6#HUFTl+Le&e)v#b84kbydXJPSc9{KUUX7d!aujbZ&UXLA_jMJ zokTSUx{}6Z$QPaO)^8Lommb?T%Qr&^Q$C#Egf`8Mf;KE$p z3SHnUcHdx$(};+IFW7sgRYRgWsF4r7%p^d&iQg3z;n%QO9j#JaEtc#`2C7T z(Cy4Y%I1!^GKVMp=p3GavMx7@b_sQx-cF`@X(xy0uH6>MlX!UFQDsEk35M(HbHr19JY-!m!5t~V0b?pf>DR#* zBA8C8iS^0*mWZVBm)?+O=oJtPEm+uC^eaDM4h(cZJR78(r3GD={J$yhhE(pSJt&l}0 zmz*wPJis5LIT4rc6b0%VcK0dXoNgN=*W8z^9XZ~p{5?5=agKn5I2*>-`s*vtSC@_+ ztvm={=a2DfPom5dd>PS>3S=9Xmiwwta84!O=&j3q;T`+A5?xNy=KC!HRY!WF&CU!+ zsI!t)5#ml_tcf&*2|7qI`ynmKD7$;INNng(LS(|KDvSLNIE?EcH8Xp@f*PzQzO95} zY(U>gRxm&$jM?j#Q<_i_MKz33uHaRQxy~vEV{*aaO-x6cLQiF#_9 zI9?#)8DDU9egn&vHm4zYQs@KUg&~l;nsS4LAfS+py7%0Vg2OvMi%tiS?pnt(>!J;P zNgFB~$;N>y|ELzluHYd!2PW^VyQdKpy#bdt{&5oYAwV&kKB^wjv3r&}#JvpB?r%r! zl5_=hGPuklx6jU7bx`8P^MZ_M=2I}Qar-M%7dR_#>~mj6u<3?OaZe92dlao0FK(Yl zaE@$a(POYf1BGnkJGhtO>VqcuJv#HTZfsb)dV%hS^-RL05k!ZcORzVeS6?Tv@8xEM z?UPwYtvAl*U?-@8`_<4<>(egJI^;F%rHDu98|8@$fqC6AH1npec&vLKdDMpaX#eHi zzW$|*s=IyxPHXji&N|15%M+eg?i+q*|3^UAwx6iKi@>Z^Rs47ro0I0kh^Z1unplhu zI-Aq6?oh##5=5sKu-DwHSuMrUT?D@@AITZWO?>2Fn_gsRJcVAEq6DK{M|6JZY-DFk6|JP{>%k~EQiHUXBRNAaP5Nm{T%yEG zq2*k>iaI(j%vW75b`LL&|1DW@#XPMu2$~oB6KJ{%bR_O9hUzJot9yW^IswI)uJA!F z4JWv4dn}wqt2X7IyIb-e3|x`GT>U4wP*1;0?7(Aem|KuuHq?FaR_hS(WyN$1n5qIs zh6&vw>b9`H4y#M-l8Ltq z*PO3iru)-8iMr;auGjQPK6|an*{V})P8ySZJHO5CRZ5|Ib`$&GEs z@ah`ri41jAsa66{L=j|t6RBnk){Fl^2IXZ}#{t%PzTy4I*~q*v_U_uuifQ^-a@9Tv z8IX|n!D=yw9$ciaDeid-Pxx?aBfm5g1j}*2rSbq53bf#387Az6i|P5YpuhWtUi#v6 zQYMmF&GJND;0}U}D46TU$eDDl|EM68wOHuG-jp|u6L%wN0gK1B}+P{XD zvlk=8;pJV3(b+kRvDwu!yGDR;^KIbG19H!E)5E9Cozm}5)_~+6IaYfZtYbM69xsUm z%S~CQCU@4>#Vk3!yTe5L&OJ;2E77)4cV@h!kHFl+9HHumsX_&>qq(@w7p-mGeA{hZ z(s&0TiX9;NKH%&SP)=w_2V{D!2U0=ON^PvIM_v|z)(b?KNe>Rh&=o-e*bZjIum`wT z#T*#PUsuEihBA(*0z{RX;=)5(DZyrbjbzv3rg+_Up~0SAUSO5(niDXS^aMlteRwJ@ z;MCA^ei+inY161n_8}m`G~FmL@8_?TKtG1x3Ld-*W~PxY!J|8}tzJ46{~R4Y^`Tsa z_VHKyF$nIGJ@qlH!-o3#`7xkwf&-S_rXRTy(`dnfxf0&d3rOGdqV2|jxh{X{j2Q4P z0AeWLf(><7@?*e;c@o~y74c(`_H?J(+YoLja|d7DXorz|suIKSTrTMLlEJ+Cj0U83 z1kc)xk$u?+a=)=N9=nnsYWKdr*z|p-yApcud}6e`#y1_ia=g{Pf_Ca?j;4M5l)`_^ zCCl?*P(1Av<>^#Ej@>-FSGfM-Z9>Bj#H(`;j(GQ#wK%0VT9SeGOh$L;{R&f-G^84S^8$&AeiqN+#DJ`B!RT+vucdsgBZ?6khz^cE>O!Puzk`>6gBivGBLBh&hq;CdIEI}iNt*B)R8iiFZ*^Y?m zM##GRhABhUq#4MmtO@aPl%=362{VnVsoruTi%Cp^J)$RnQ#8QveunSdz=jQfG4uNM zUqAD;{dq&$*#8)~ZbAMyMp@st_K?}?+4IGDdZyPqhkT|I=*xR%Lw=q#QR$93KWR?l z@}p>7)sI@gs+QxwUoNT=2&lTUmvn!EoGY{QlIk{WXwnPaJ53TEt9UsRDCv=mnE^I-6EN!9T9mEM?ym%M3 zzjw~Ues�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 diff --git a/prebuiltbinaries/JavaFastPFOR-0.0.6.jar b/prebuiltbinaries/JavaFastPFOR-0.0.6.jar deleted file mode 100644 index 4eca83485446e15e90492cbf3d9c1ad9e3a944fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122284 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 z 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 ZKtX^vE3iQaYSQU3Yy!sU6QI!y3;=K;XZHXA diff --git a/prebuiltbinaries/JavaFastPFOR-0.0.7.jar b/prebuiltbinaries/JavaFastPFOR-0.0.7.jar deleted file mode 100644 index 35d02b859cf8c678ad4dc038b6d1ed375d7d2cc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147151 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

eH2dSu6eaTR{fX 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Μ{6qUPw=r2FLOuf*{H>JVCiT@Pk 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ïgwXw+(^TX##tqMgL?y>c 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 Date: Fri, 19 Sep 2014 11:41:11 -0400 Subject: [PATCH 196/412] Some experiments --- .../me/lemire/integercompression/FastPFOR.java | 17 +++++++++++++++-- .../java/me/lemire/integercompression/Util.java | 11 +++++------ .../benchmarktools/BenchmarkSkippable.java | 2 ++ .../me/lemire/integercompression/TestUtils.java | 4 ++-- 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 0907f74..4c8f8fe 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -192,14 +192,21 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, bitmap |= (1 << (k - 1)); } out[tmpoutpos++] = bitmap; + for (int k = 1; k <= 32; ++k) { if (dataPointers[k] != 0) { out[tmpoutpos++] = dataPointers[k];// size - for (int j = 0; j < dataPointers[k]; j += 32) { + int j = 0; + + for (; j + 31 < dataPointers[k]; j += 32) { BitPacking.fastpack(dataTobePacked[k], j, out, tmpoutpos, k); tmpoutpos += k; } + int leftover = dataPointers[k] % 32; + if(leftover > 0) { + tmpoutpos = Util.pack(out, tmpoutpos, dataTobePacked[k], j, leftover, k); + } } } outpos.set(tmpoutpos); @@ -249,11 +256,17 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, if (dataTobePacked[k].length < size) dataTobePacked[k] = new int[Util .greatestMultiple(size + 31, 32)]; - for (int j = 0; j < size; j += 32) { + int j = 0; + + for (; j + 31 < size; j += 32) { BitPacking.fastunpack(in, inexcept, dataTobePacked[k], j, k); inexcept += k; } + int leftover = size % 32; + if(size > 0) + inexcept = Util.unpack(in, inexcept, dataTobePacked[k], j, leftover, k); + } } Arrays.fill(dataPointers, 0); diff --git a/src/main/java/me/lemire/integercompression/Util.java b/src/main/java/me/lemire/integercompression/Util.java index 5ad2ff1..70e46b7 100644 --- a/src/main/java/me/lemire/integercompression/Util.java +++ b/src/main/java/me/lemire/integercompression/Util.java @@ -109,19 +109,19 @@ protected static int packsize(int num, int b) { return (num + howmanyfit - 1) / howmanyfit; } - protected static int pack(int[] outputarray, int arraypos, int[] data, + protected static int pack(int[] outputarray, int arraypos, int[] data, int datapos, int num, int b) { if (num == 0) return arraypos; if (b > 16) { - System.arraycopy(data, 0, outputarray, arraypos, num); + System.arraycopy(data, datapos, outputarray, arraypos, num); return num + arraypos; } for (int k = 0; k < packsize(num, b); ++k) outputarray[k + arraypos] = 0; int inwordpointer = 0; for (int k = 0; k < num; ++k) { - outputarray[arraypos] |= (data[k] << inwordpointer); + outputarray[arraypos] |= (data[k + datapos] << inwordpointer); inwordpointer += b; final int increment = ((inwordpointer + b - 1) >> 5); arraypos += increment; @@ -130,7 +130,7 @@ protected static int pack(int[] outputarray, int arraypos, int[] data, return arraypos + (inwordpointer > 0 ? 1 : 0); } - protected static int unpack(int[] sourcearray, int arraypos, int[] data, + protected static int unpack(int[] sourcearray, int arraypos, int[] data, int datapos, int num, int b) { if (b > 16) { System.arraycopy(sourcearray, arraypos, data, 0, num); @@ -139,8 +139,7 @@ protected static int unpack(int[] sourcearray, int arraypos, int[] data, final int mask = (1 << b) - 1; int inwordpointer = 0; for (int k = 0; k < num; ++k) { - data[k] = (sourcearray[arraypos] & mask); - sourcearray[arraypos] >>>= b; + data[k + datapos] = ((sourcearray[arraypos] >>> inwordpointer) & mask); inwordpointer += b; final int increment = ((inwordpointer + b - 1) >> 5); arraypos += increment; diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java index b738eff..e924a54 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java @@ -290,6 +290,8 @@ private static int[][] generateTestData(ClusteredDataGenerator dataGen, } static Object[] codecs = { + new SkippableComposition(new FastPFOR(), new VariableByte()), + new SkippableIntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte()), new JustCopy(), new VariableByte(), diff --git a/src/test/java/me/lemire/integercompression/TestUtils.java b/src/test/java/me/lemire/integercompression/TestUtils.java index fb8039f..a0820ab 100644 --- a/src/test/java/me/lemire/integercompression/TestUtils.java +++ b/src/test/java/me/lemire/integercompression/TestUtils.java @@ -26,9 +26,9 @@ public void testPacking() { } for(int n = 0; n <= 32; ++n) { Arrays.fill(outputarray, 0); - int howmany = Util.pack(outputarray, 0, data, n, b); + int howmany = Util.pack(outputarray, 0, data,0, n, b); if(howmany != Util.packsize(n, b)) throw new RuntimeException("bug "+n+" "+b); - Util.unpack(Arrays.copyOf(outputarray, howmany), 0, newdata, n, b); + Util.unpack(Arrays.copyOf(outputarray, howmany), 0, newdata,0, n, b); for(int i = 0; i < n; ++i) if(newdata[i] != data[i]) { System.out.println(Arrays.toString(Arrays.copyOf(data, n))); From 1a63fcd3c167246b49b1b40ecd6355a520d1768d Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 19 Sep 2014 11:50:38 -0400 Subject: [PATCH 197/412] Some more tweaking --- .../lemire/integercompression/FastPFOR.java | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 4c8f8fe..e931867 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -122,6 +122,7 @@ private void getBestBFromData(int[] in, int pos) { int thiscost = cexcept * OVERHEAD_OF_EACH_EXCEPT + cexcept * (bestbbestcexceptmaxb[2] - b) + b * BLOCK_SIZE + 8; + if(bestbbestcexceptmaxb[2] - b == 1) thiscost -= cexcept; if (thiscost < bestcost) { bestcost = thiscost; bestbbestcexceptmaxb[0] = b; @@ -142,7 +143,6 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, int tmpinpos = inpos.get(); for (final int finalinpos = tmpinpos + thissize - BLOCK_SIZE; tmpinpos <= finalinpos; tmpinpos += BLOCK_SIZE) { - getBestBFromData(in, tmpinpos); final int tmpbestb = bestbbestcexceptmaxb[0]; byteContainer.put((byte)bestbbestcexceptmaxb[0]); @@ -187,17 +187,16 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, byteContainer.asIntBuffer().get(out, tmpoutpos, howmanyints); tmpoutpos += howmanyints; int bitmap = 0; - for (int k = 1; k <= 32; ++k) { + for (int k = 2; k <= 32; ++k) { if (dataPointers[k] != 0) bitmap |= (1 << (k - 1)); } out[tmpoutpos++] = bitmap; - for (int k = 1; k <= 32; ++k) { + for (int k = 2; k <= 32; ++k) { if (dataPointers[k] != 0) { out[tmpoutpos++] = dataPointers[k];// size int j = 0; - for (; j + 31 < dataPointers[k]; j += 32) { BitPacking.fastpack(dataTobePacked[k], j, out, tmpoutpos, k); @@ -250,7 +249,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, inexcept += (bytesize + 3)/ 4; final int bitmap = in[inexcept++]; - for (int k = 1; k <= 32; ++k) { + for (int k = 2; k <= 32; ++k) { if ((bitmap & (1 << (k - 1))) != 0) { int size = in[inexcept++]; if (dataTobePacked[k].length < size) @@ -282,14 +281,20 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, tmpinpos += b; } if (cexcept > 0) { - final int maxbits = byteContainer.get(); - final int index = maxbits - b; + final int maxbits = byteContainer.get(); + final int index = maxbits - b; + if(index == 1) { for (int k = 0; k < cexcept; ++k) { - final int pos = byteContainer.get() &0xFF; - final int exceptvalue = dataTobePacked[index][dataPointers[index]++]; - out[pos + tmpoutpos] |= exceptvalue << b; + final int pos = byteContainer.get() &0xFF; + out[pos + tmpoutpos] |= 1 << b; + } + } else { + for (int k = 0; k < cexcept; ++k) { + final int pos = byteContainer.get() &0xFF; + final int exceptvalue = dataTobePacked[index][dataPointers[index]++]; + out[pos + tmpoutpos] |= exceptvalue << b; } - + } } } outpos.set(tmpoutpos); From 197e8b37796f73fb18eb1615a53b7c69cf632929 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 19 Sep 2014 13:32:42 -0400 Subject: [PATCH 198/412] Experiment --- .../lemire/integercompression/FastPFOR.java | 23 +++++++++++-------- .../benchmarktools/BenchmarkSkippable.java | 11 ++++++--- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index e931867..bc8e4d2 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -197,15 +197,17 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, if (dataPointers[k] != 0) { out[tmpoutpos++] = dataPointers[k];// size int j = 0; - for (; j + 31 < dataPointers[k]; j += 32) { + for (; j < dataPointers[k]; j += 32) { BitPacking.fastpack(dataTobePacked[k], j, out, tmpoutpos, k); tmpoutpos += k; } - int leftover = dataPointers[k] % 32; - if(leftover > 0) { - tmpoutpos = Util.pack(out, tmpoutpos, dataTobePacked[k], j, leftover, k); - } + int overflow = j - dataPointers[k]; + tmpoutpos -= overflow * k / 32; + //int leftover = dataPointers[k] % 32; + //if(leftover > 0) { + // tmpoutpos = Util.pack(out, tmpoutpos, dataTobePacked[k], j, leftover, k); + //} } } outpos.set(tmpoutpos); @@ -257,14 +259,17 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, .greatestMultiple(size + 31, 32)]; int j = 0; - for (; j + 31 < size; j += 32) { + for (; j < size; j += 32) { BitPacking.fastunpack(in, inexcept, dataTobePacked[k], j, k); inexcept += k; } - int leftover = size % 32; - if(size > 0) - inexcept = Util.unpack(in, inexcept, dataTobePacked[k], j, leftover, k); + int overflow = j - size; + inexcept -= overflow * k / 32; + + //int leftover = size % 32; + //if(size > 0) + // inexcept = Util.unpack(in, inexcept, dataTobePacked[k], j, leftover, k); } } diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java index e924a54..504cf89 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java @@ -7,6 +7,7 @@ package me.lemire.integercompression.benchmarktools; import me.lemire.integercompression.BinaryPacking; +import me.lemire.integercompression.CopyOfFastPFOR; import me.lemire.integercompression.FastPFOR; import me.lemire.integercompression.IntWrapper; import me.lemire.integercompression.JustCopy; @@ -291,7 +292,8 @@ private static int[][] generateTestData(ClusteredDataGenerator dataGen, static Object[] codecs = { new SkippableComposition(new FastPFOR(), new VariableByte()), - + new SkippableComposition(new CopyOfFastPFOR(), new VariableByte()), + /* new SkippableIntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte()), new JustCopy(), new VariableByte(), @@ -303,7 +305,7 @@ private static int[][] generateTestData(ClusteredDataGenerator dataGen, new SkippableComposition(new OptPFDS9(), new VariableByte()), new SkippableComposition(new OptPFDS16(), new VariableByte()), new SkippableComposition(new FastPFOR(), new VariableByte()), - new Simple9(), new Simple16() }; + new Simple9(), new Simple16()*/ }; /** * Generates data and calls other tests. @@ -322,7 +324,7 @@ private static void test(PrintWriter csvLog, int N, int nbr, int repeat) { ClusteredDataGenerator cdg = new ClusteredDataGenerator(); final int max_sparsity = 31 - nbr; - for (int sparsity = 1; sparsity < max_sparsity; ++sparsity) { + for (int sparsity = 1; sparsity < max_sparsity; sparsity+=4) { System.out.println("# sparsity " + sparsity); System.out.println("# generating random data..."); int[][] data = generateTestData(cdg, N, nbr, sparsity); @@ -331,6 +333,9 @@ private static void test(PrintWriter csvLog, int N, int nbr, int repeat) { testCodec(csvLog, sparsity, c, data, repeat, false); testCodec(csvLog, sparsity, c, data, repeat, false); testCodec(csvLog, sparsity, c, data, repeat, true); + testCodec(csvLog, sparsity, c, data, repeat, true); + testCodec(csvLog, sparsity, c, data, repeat, true); + } } From 9c90e2754c34611e926d4df2e1bcd0d56e7f7516 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 19 Sep 2014 13:33:06 -0400 Subject: [PATCH 199/412] Comparison --- .../integercompression/CopyOfFastPFOR.java | 332 ++++++++++++++++++ 1 file changed, 332 insertions(+) create mode 100644 src/main/java/me/lemire/integercompression/CopyOfFastPFOR.java diff --git a/src/main/java/me/lemire/integercompression/CopyOfFastPFOR.java b/src/main/java/me/lemire/integercompression/CopyOfFastPFOR.java new file mode 100644 index 0000000..10e3e7d --- /dev/null +++ b/src/main/java/me/lemire/integercompression/CopyOfFastPFOR.java @@ -0,0 +1,332 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ +package me.lemire.integercompression; + +import java.nio.ByteBuffer; +import java.util.Arrays; + +/** + * This is a patching scheme designed for speed. + * It encodes integers in blocks of integers within pages of + * up to 65536 integers. Note that it is important, to get good + * compression and good performance, to use sizeable blocks (greater than 1024 integers). + * For arrays containing a number of integers that is not divisible by BLOCK_SIZE, you should use + * it in conjunction with another CODEC: + * + * IntegerCODEC ic = new Composition(new FastPFOR(), new VariableByte()). + *

+ * For details, please see + *

+ * Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second + * through vectorization Software: Practice & Experience + * http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract + * http://arxiv.org/abs/1209.2137 + *

+ *

For sufficiently compressible and long arrays, it is faster and better than other PFOR + * schemes.

+ * + * Note that this does not use differential coding: if you are working on sorted + * lists, use IntegratedFastPFOR instead. + * + * For multi-threaded applications, each thread should use its own FastPFOR + * object. + * + * @author Daniel Lemire + */ +public final class CopyOfFastPFOR implements IntegerCODEC,SkippableIntegerCODEC { + final static int BLOCK_SIZE = 256; + final static int OVERHEAD_OF_EACH_EXCEPT = 8; + final static int DEFAULT_PAGE_SIZE = 65536; + + int pageSize; + final int[][] dataTobePacked = new int[33][]; + final ByteBuffer byteContainer; + + // Working area for compress and uncompress. + int[] dataPointers; + int[] freqs; + int[] bestbbestcexceptmaxb = new int[3]; + + /** + * Construct the FastPFOR CODEC. + * + * @param pagesize + * the desired page size (for expert use) + */ + public CopyOfFastPFOR(int pagesize) { + pageSize = pagesize; + // Initiate arrrays. + byteContainer = ByteBuffer.allocateDirect(3 * pageSize + / BLOCK_SIZE + pageSize); + for (int k = 1; k < dataTobePacked.length; ++k) + dataTobePacked[k] = new int[pageSize / 32 * 4]; // heuristic + } + + /** + * Construct the fastPFOR CODEC with default parameters. + */ + public CopyOfFastPFOR() { + this(DEFAULT_PAGE_SIZE); + } + + /** + * Compress data in blocks of BLOCK_SIZE integers (if fewer than BLOCK_SIZE integers + * are provided, nothing is done). + * + * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) + */ + @Override + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); + if (inlength == 0) + return; + + + // Allocate memory for working area. + dataPointers = new int[33]; + freqs = new int[33]; + + final int finalinpos = inpos.get() + inlength; + while (inpos.get() != finalinpos) { + int thissize = Math.min(pageSize, + finalinpos - inpos.get()); + encodePage(in, inpos, thissize, out, outpos); + } + + dataPointers = null; + freqs = null; + } + + private void getBestBFromData(int[] in, int pos) { + Arrays.fill(freqs, 0); + for (int k = pos, k_end = pos + BLOCK_SIZE; k < k_end; ++k) { + freqs[Util.bits(in[k])]++; + } + bestbbestcexceptmaxb[0] = 32; + while (freqs[bestbbestcexceptmaxb[0]] == 0) + bestbbestcexceptmaxb[0]--; + bestbbestcexceptmaxb[2] = bestbbestcexceptmaxb[0]; + int bestcost = bestbbestcexceptmaxb[0] * BLOCK_SIZE; + int cexcept = 0; + bestbbestcexceptmaxb[1] = cexcept; + for (int b = bestbbestcexceptmaxb[0] - 1; b >= 0; --b) { + cexcept += freqs[b + 1]; + if (cexcept == BLOCK_SIZE) + break; + // the extra 8 is the cost of storing maxbits + int thiscost = cexcept * OVERHEAD_OF_EACH_EXCEPT + + cexcept * (bestbbestcexceptmaxb[2] - b) + b + * BLOCK_SIZE + 8; + if(bestbbestcexceptmaxb[2] - b == 1) thiscost -= cexcept; + if (thiscost < bestcost) { + bestcost = thiscost; + bestbbestcexceptmaxb[0] = b; + bestbbestcexceptmaxb[1] = cexcept; + } + } + } + + private void encodePage(int[] in, IntWrapper inpos, int thissize, + int[] out, IntWrapper outpos) { + final int headerpos = outpos.get(); + outpos.increment(); + int tmpoutpos = outpos.get(); + + // Clear working area. + Arrays.fill(dataPointers, 0); + byteContainer.clear(); + + int tmpinpos = inpos.get(); + for (final int finalinpos = tmpinpos + thissize - BLOCK_SIZE; tmpinpos <= finalinpos; tmpinpos += BLOCK_SIZE) { + getBestBFromData(in, tmpinpos); + final int tmpbestb = bestbbestcexceptmaxb[0]; + byteContainer.put((byte)bestbbestcexceptmaxb[0]); + byteContainer.put((byte)bestbbestcexceptmaxb[1]); + if (bestbbestcexceptmaxb[1] > 0) { + byteContainer.put((byte)bestbbestcexceptmaxb[2]); + final int index = bestbbestcexceptmaxb[2] + - bestbbestcexceptmaxb[0]; + if (dataPointers[index] + + bestbbestcexceptmaxb[1] >= dataTobePacked[index].length) { + int newsize = 2 * (dataPointers[index] + bestbbestcexceptmaxb[1]); + // make sure it is a multiple of 32 + newsize = Util + .greatestMultiple(newsize + 31, 32); + dataTobePacked[index] = Arrays.copyOf( + dataTobePacked[index], newsize); + } + for (int k = 0; k < BLOCK_SIZE; ++k) { + if ((in[k + tmpinpos] >>> bestbbestcexceptmaxb[0]) != 0) { + // we have an exception + byteContainer.put((byte) k); + dataTobePacked[index][dataPointers[index]++] = in[k + + tmpinpos] >>> tmpbestb; + } + } + + } + for (int k = 0; k < BLOCK_SIZE; k += 32) { + BitPacking.fastpack(in, tmpinpos + k, out, + tmpoutpos, tmpbestb); + tmpoutpos += tmpbestb; + } + } + inpos.set(tmpinpos); + out[headerpos] = tmpoutpos - headerpos; + final int bytesize = byteContainer.position(); + while ((byteContainer.position() & 3) != 0) + byteContainer.put((byte) 0); + out[tmpoutpos++] = bytesize; + final int howmanyints = byteContainer.position() / 4; + byteContainer.flip(); + byteContainer.asIntBuffer().get(out, tmpoutpos, howmanyints); + tmpoutpos += howmanyints; + int bitmap = 0; + for (int k = 2; k <= 32; ++k) { + if (dataPointers[k] != 0) + bitmap |= (1 << (k - 1)); + } + out[tmpoutpos++] = bitmap; + + for (int k = 2; k <= 32; ++k) { + if (dataPointers[k] != 0) { + out[tmpoutpos++] = dataPointers[k];// size + int j = 0; + for (; j < dataPointers[k]; j += 32) { + BitPacking.fastpack(dataTobePacked[k], + j, out, tmpoutpos, k); + tmpoutpos += k; + } + //int overflow = j - dataPointers[k]; + //tmpoutpos -= overflow * k / 32; + int leftover = dataPointers[k] % 32; + if(leftover > 0) { + tmpoutpos = Util.pack(out, tmpoutpos, dataTobePacked[k], j, leftover, k); + } + } + } + outpos.set(tmpoutpos); + } + + /** + * Uncompress data in blocks of integers. In this particular case, + * the inlength parameter is ignored: it is deduced from the compressed + * data. + * + * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) + */ + @Override + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos, int mynvalue) { + if (inlength == 0) + return; + mynvalue = Util.greatestMultiple(mynvalue, BLOCK_SIZE); + + dataPointers = new int[33]; + + int finalout = outpos.get() + mynvalue; + while (outpos.get() != finalout) { + int thissize = Math.min(pageSize, + finalout - outpos.get()); + decodePage(in, inpos, out, outpos, thissize); + } + + dataPointers = null; + } + + private void decodePage(int[] in, IntWrapper inpos, int[] out, + IntWrapper outpos, int thissize) { + final int initpos = inpos.get(); + final int wheremeta = in[inpos.get()]; + inpos.increment(); + int inexcept = initpos + wheremeta; + final int bytesize = in[inexcept++]; + byteContainer.clear(); + byteContainer.asIntBuffer().put(in, inexcept, (bytesize + 3) / 4); + inexcept += (bytesize + 3)/ 4; + + final int bitmap = in[inexcept++]; + for (int k = 2; k <= 32; ++k) { + if ((bitmap & (1 << (k - 1))) != 0) { + int size = in[inexcept++]; + if (dataTobePacked[k].length < size) + dataTobePacked[k] = new int[Util + .greatestMultiple(size + 31, 32)]; + int j = 0; + + for (; j < size; j += 32) { + BitPacking.fastunpack(in, inexcept, + dataTobePacked[k], j, k); + inexcept += k; + } + //int overflow = j - size; + //inexcept -= overflow * k / 32; + + int leftover = size % 32; + if(size > 0) + inexcept = Util.unpack(in, inexcept, dataTobePacked[k], j, leftover, k); + + } + } + Arrays.fill(dataPointers, 0); + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); + + for (int run = 0, run_end = thissize / BLOCK_SIZE; run < run_end; ++run, tmpoutpos += BLOCK_SIZE) { + final int b = byteContainer.get(); + final int cexcept = byteContainer.get() & 0xFF; + for (int k = 0; k < BLOCK_SIZE; k += 32) { + BitPacking.fastunpack(in, tmpinpos, out, + tmpoutpos + k, b); + tmpinpos += b; + } + if (cexcept > 0) { + final int maxbits = byteContainer.get(); + final int index = maxbits - b; + if(index == 1) { + for (int k = 0; k < cexcept; ++k) { + final int pos = byteContainer.get() &0xFF; + out[pos + tmpoutpos] |= 1 << b; + } + } else { + for (int k = 0; k < cexcept; ++k) { + final int pos = byteContainer.get() &0xFF; + final int exceptvalue = dataTobePacked[index][dataPointers[index]++]; + out[pos + tmpoutpos] |= exceptvalue << b; + } + } + } + } + outpos.set(tmpoutpos); + inpos.set(inexcept); + } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); + if (inlength == 0) + return; + out[outpos.get()] = inlength; + outpos.increment(); + headlessCompress(in, inpos, inlength, out, outpos); + } + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + if (inlength == 0) + return; + final int outlength = in[inpos.get()]; + inpos.increment(); + headlessUncompress(in, inpos, inlength, out, outpos, outlength); + } + @Override + public String toString() { + return this.getClass().getSimpleName(); + } +} From db83ebc983641a156661df122c31b213691629b1 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 19 Sep 2014 13:36:10 -0400 Subject: [PATCH 200/412] Another test --- .../integercompression/CopyOfFastPFOR.java | 332 ------------------ .../lemire/integercompression/FastPFOR.java | 9 - .../benchmarktools/BenchmarkSkippable.java | 2 +- 3 files changed, 1 insertion(+), 342 deletions(-) delete mode 100644 src/main/java/me/lemire/integercompression/CopyOfFastPFOR.java diff --git a/src/main/java/me/lemire/integercompression/CopyOfFastPFOR.java b/src/main/java/me/lemire/integercompression/CopyOfFastPFOR.java deleted file mode 100644 index 10e3e7d..0000000 --- a/src/main/java/me/lemire/integercompression/CopyOfFastPFOR.java +++ /dev/null @@ -1,332 +0,0 @@ -/** - * This code is released under the - * Apache License Version 2.0 http://www.apache.org/licenses/. - * - * (c) Daniel Lemire, http://lemire.me/en/ - */ -package me.lemire.integercompression; - -import java.nio.ByteBuffer; -import java.util.Arrays; - -/** - * This is a patching scheme designed for speed. - * It encodes integers in blocks of integers within pages of - * up to 65536 integers. Note that it is important, to get good - * compression and good performance, to use sizeable blocks (greater than 1024 integers). - * For arrays containing a number of integers that is not divisible by BLOCK_SIZE, you should use - * it in conjunction with another CODEC: - * - * IntegerCODEC ic = new Composition(new FastPFOR(), new VariableByte()). - *

- * For details, please see - *

- * Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second - * through vectorization Software: Practice & Experience - * http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract - * http://arxiv.org/abs/1209.2137 - *

- *

For sufficiently compressible and long arrays, it is faster and better than other PFOR - * schemes.

- * - * Note that this does not use differential coding: if you are working on sorted - * lists, use IntegratedFastPFOR instead. - * - * For multi-threaded applications, each thread should use its own FastPFOR - * object. - * - * @author Daniel Lemire - */ -public final class CopyOfFastPFOR implements IntegerCODEC,SkippableIntegerCODEC { - final static int BLOCK_SIZE = 256; - final static int OVERHEAD_OF_EACH_EXCEPT = 8; - final static int DEFAULT_PAGE_SIZE = 65536; - - int pageSize; - final int[][] dataTobePacked = new int[33][]; - final ByteBuffer byteContainer; - - // Working area for compress and uncompress. - int[] dataPointers; - int[] freqs; - int[] bestbbestcexceptmaxb = new int[3]; - - /** - * Construct the FastPFOR CODEC. - * - * @param pagesize - * the desired page size (for expert use) - */ - public CopyOfFastPFOR(int pagesize) { - pageSize = pagesize; - // Initiate arrrays. - byteContainer = ByteBuffer.allocateDirect(3 * pageSize - / BLOCK_SIZE + pageSize); - for (int k = 1; k < dataTobePacked.length; ++k) - dataTobePacked[k] = new int[pageSize / 32 * 4]; // heuristic - } - - /** - * Construct the fastPFOR CODEC with default parameters. - */ - public CopyOfFastPFOR() { - this(DEFAULT_PAGE_SIZE); - } - - /** - * Compress data in blocks of BLOCK_SIZE integers (if fewer than BLOCK_SIZE integers - * are provided, nothing is done). - * - * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) - */ - @Override - public void headlessCompress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { - inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); - if (inlength == 0) - return; - - - // Allocate memory for working area. - dataPointers = new int[33]; - freqs = new int[33]; - - final int finalinpos = inpos.get() + inlength; - while (inpos.get() != finalinpos) { - int thissize = Math.min(pageSize, - finalinpos - inpos.get()); - encodePage(in, inpos, thissize, out, outpos); - } - - dataPointers = null; - freqs = null; - } - - private void getBestBFromData(int[] in, int pos) { - Arrays.fill(freqs, 0); - for (int k = pos, k_end = pos + BLOCK_SIZE; k < k_end; ++k) { - freqs[Util.bits(in[k])]++; - } - bestbbestcexceptmaxb[0] = 32; - while (freqs[bestbbestcexceptmaxb[0]] == 0) - bestbbestcexceptmaxb[0]--; - bestbbestcexceptmaxb[2] = bestbbestcexceptmaxb[0]; - int bestcost = bestbbestcexceptmaxb[0] * BLOCK_SIZE; - int cexcept = 0; - bestbbestcexceptmaxb[1] = cexcept; - for (int b = bestbbestcexceptmaxb[0] - 1; b >= 0; --b) { - cexcept += freqs[b + 1]; - if (cexcept == BLOCK_SIZE) - break; - // the extra 8 is the cost of storing maxbits - int thiscost = cexcept * OVERHEAD_OF_EACH_EXCEPT - + cexcept * (bestbbestcexceptmaxb[2] - b) + b - * BLOCK_SIZE + 8; - if(bestbbestcexceptmaxb[2] - b == 1) thiscost -= cexcept; - if (thiscost < bestcost) { - bestcost = thiscost; - bestbbestcexceptmaxb[0] = b; - bestbbestcexceptmaxb[1] = cexcept; - } - } - } - - private void encodePage(int[] in, IntWrapper inpos, int thissize, - int[] out, IntWrapper outpos) { - final int headerpos = outpos.get(); - outpos.increment(); - int tmpoutpos = outpos.get(); - - // Clear working area. - Arrays.fill(dataPointers, 0); - byteContainer.clear(); - - int tmpinpos = inpos.get(); - for (final int finalinpos = tmpinpos + thissize - BLOCK_SIZE; tmpinpos <= finalinpos; tmpinpos += BLOCK_SIZE) { - getBestBFromData(in, tmpinpos); - final int tmpbestb = bestbbestcexceptmaxb[0]; - byteContainer.put((byte)bestbbestcexceptmaxb[0]); - byteContainer.put((byte)bestbbestcexceptmaxb[1]); - if (bestbbestcexceptmaxb[1] > 0) { - byteContainer.put((byte)bestbbestcexceptmaxb[2]); - final int index = bestbbestcexceptmaxb[2] - - bestbbestcexceptmaxb[0]; - if (dataPointers[index] - + bestbbestcexceptmaxb[1] >= dataTobePacked[index].length) { - int newsize = 2 * (dataPointers[index] + bestbbestcexceptmaxb[1]); - // make sure it is a multiple of 32 - newsize = Util - .greatestMultiple(newsize + 31, 32); - dataTobePacked[index] = Arrays.copyOf( - dataTobePacked[index], newsize); - } - for (int k = 0; k < BLOCK_SIZE; ++k) { - if ((in[k + tmpinpos] >>> bestbbestcexceptmaxb[0]) != 0) { - // we have an exception - byteContainer.put((byte) k); - dataTobePacked[index][dataPointers[index]++] = in[k - + tmpinpos] >>> tmpbestb; - } - } - - } - for (int k = 0; k < BLOCK_SIZE; k += 32) { - BitPacking.fastpack(in, tmpinpos + k, out, - tmpoutpos, tmpbestb); - tmpoutpos += tmpbestb; - } - } - inpos.set(tmpinpos); - out[headerpos] = tmpoutpos - headerpos; - final int bytesize = byteContainer.position(); - while ((byteContainer.position() & 3) != 0) - byteContainer.put((byte) 0); - out[tmpoutpos++] = bytesize; - final int howmanyints = byteContainer.position() / 4; - byteContainer.flip(); - byteContainer.asIntBuffer().get(out, tmpoutpos, howmanyints); - tmpoutpos += howmanyints; - int bitmap = 0; - for (int k = 2; k <= 32; ++k) { - if (dataPointers[k] != 0) - bitmap |= (1 << (k - 1)); - } - out[tmpoutpos++] = bitmap; - - for (int k = 2; k <= 32; ++k) { - if (dataPointers[k] != 0) { - out[tmpoutpos++] = dataPointers[k];// size - int j = 0; - for (; j < dataPointers[k]; j += 32) { - BitPacking.fastpack(dataTobePacked[k], - j, out, tmpoutpos, k); - tmpoutpos += k; - } - //int overflow = j - dataPointers[k]; - //tmpoutpos -= overflow * k / 32; - int leftover = dataPointers[k] % 32; - if(leftover > 0) { - tmpoutpos = Util.pack(out, tmpoutpos, dataTobePacked[k], j, leftover, k); - } - } - } - outpos.set(tmpoutpos); - } - - /** - * Uncompress data in blocks of integers. In this particular case, - * the inlength parameter is ignored: it is deduced from the compressed - * data. - * - * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) - */ - @Override - public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos, int mynvalue) { - if (inlength == 0) - return; - mynvalue = Util.greatestMultiple(mynvalue, BLOCK_SIZE); - - dataPointers = new int[33]; - - int finalout = outpos.get() + mynvalue; - while (outpos.get() != finalout) { - int thissize = Math.min(pageSize, - finalout - outpos.get()); - decodePage(in, inpos, out, outpos, thissize); - } - - dataPointers = null; - } - - private void decodePage(int[] in, IntWrapper inpos, int[] out, - IntWrapper outpos, int thissize) { - final int initpos = inpos.get(); - final int wheremeta = in[inpos.get()]; - inpos.increment(); - int inexcept = initpos + wheremeta; - final int bytesize = in[inexcept++]; - byteContainer.clear(); - byteContainer.asIntBuffer().put(in, inexcept, (bytesize + 3) / 4); - inexcept += (bytesize + 3)/ 4; - - final int bitmap = in[inexcept++]; - for (int k = 2; k <= 32; ++k) { - if ((bitmap & (1 << (k - 1))) != 0) { - int size = in[inexcept++]; - if (dataTobePacked[k].length < size) - dataTobePacked[k] = new int[Util - .greatestMultiple(size + 31, 32)]; - int j = 0; - - for (; j < size; j += 32) { - BitPacking.fastunpack(in, inexcept, - dataTobePacked[k], j, k); - inexcept += k; - } - //int overflow = j - size; - //inexcept -= overflow * k / 32; - - int leftover = size % 32; - if(size > 0) - inexcept = Util.unpack(in, inexcept, dataTobePacked[k], j, leftover, k); - - } - } - Arrays.fill(dataPointers, 0); - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); - - for (int run = 0, run_end = thissize / BLOCK_SIZE; run < run_end; ++run, tmpoutpos += BLOCK_SIZE) { - final int b = byteContainer.get(); - final int cexcept = byteContainer.get() & 0xFF; - for (int k = 0; k < BLOCK_SIZE; k += 32) { - BitPacking.fastunpack(in, tmpinpos, out, - tmpoutpos + k, b); - tmpinpos += b; - } - if (cexcept > 0) { - final int maxbits = byteContainer.get(); - final int index = maxbits - b; - if(index == 1) { - for (int k = 0; k < cexcept; ++k) { - final int pos = byteContainer.get() &0xFF; - out[pos + tmpoutpos] |= 1 << b; - } - } else { - for (int k = 0; k < cexcept; ++k) { - final int pos = byteContainer.get() &0xFF; - final int exceptvalue = dataTobePacked[index][dataPointers[index]++]; - out[pos + tmpoutpos] |= exceptvalue << b; - } - } - } - } - outpos.set(tmpoutpos); - inpos.set(inexcept); - } - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); - if (inlength == 0) - return; - out[outpos.get()] = inlength; - outpos.increment(); - headlessCompress(in, inpos, inlength, out, outpos); - } - - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - if (inlength == 0) - return; - final int outlength = in[inpos.get()]; - inpos.increment(); - headlessUncompress(in, inpos, inlength, out, outpos, outlength); - } - @Override - public String toString() { - return this.getClass().getSimpleName(); - } -} diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index bc8e4d2..ee4e879 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -204,10 +204,6 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, } int overflow = j - dataPointers[k]; tmpoutpos -= overflow * k / 32; - //int leftover = dataPointers[k] % 32; - //if(leftover > 0) { - // tmpoutpos = Util.pack(out, tmpoutpos, dataTobePacked[k], j, leftover, k); - //} } } outpos.set(tmpoutpos); @@ -266,11 +262,6 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, } int overflow = j - size; inexcept -= overflow * k / 32; - - //int leftover = size % 32; - //if(size > 0) - // inexcept = Util.unpack(in, inexcept, dataTobePacked[k], j, leftover, k); - } } Arrays.fill(dataPointers, 0); diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java index 504cf89..48ba002 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java @@ -292,7 +292,7 @@ private static int[][] generateTestData(ClusteredDataGenerator dataGen, static Object[] codecs = { new SkippableComposition(new FastPFOR(), new VariableByte()), - new SkippableComposition(new CopyOfFastPFOR(), new VariableByte()), + new SkippableComposition(new OptPFD(), new VariableByte()), /* new SkippableIntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte()), new JustCopy(), new VariableByte(), From f01158149f45d077e086dedc3c3add79beba5513 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 19 Sep 2014 14:28:13 -0400 Subject: [PATCH 201/412] More testing --- .../lemire/integercompression/FastPFOR.java | 30 +- .../benchmarktools/Benchmark.java | 13 - .../benchmarktools/BenchmarkCSV.java | 3 - .../benchmarktools/BenchmarkSkippable.java | 1 - .../differential/IntegratedFastPFOR.java | 319 ------------------ .../lemire/integercompression/BasicTest.java | 30 -- .../integercompression/BoundaryTest.java | 4 - 7 files changed, 22 insertions(+), 378 deletions(-) delete mode 100644 src/main/java/me/lemire/integercompression/differential/IntegratedFastPFOR.java diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index ee4e879..b307729 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -250,18 +250,32 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, for (int k = 2; k <= 32; ++k) { if ((bitmap & (1 << (k - 1))) != 0) { int size = in[inexcept++]; - if (dataTobePacked[k].length < size) - dataTobePacked[k] = new int[Util - .greatestMultiple(size + 31, 32)]; - int j = 0; - - for (; j < size; j += 32) { + int roundedup = Util + .greatestMultiple(size + 31, 32); + if (dataTobePacked[k].length < roundedup) + dataTobePacked[k] = new int[roundedup]; + if(inexcept + roundedup/32*k <= in.length) { + int j = 0; + for (; j < size; j += 32) { BitPacking.fastunpack(in, inexcept, dataTobePacked[k], j, k); inexcept += k; + } + int overflow = j - size; + inexcept -= overflow * k / 32; + } else { + int j = 0; + int[] buf = new int[roundedup/32*k]; + int initinexcept = inexcept; + System.arraycopy(in, inexcept, buf, 0, in.length - inexcept); + for (; j < size; j += 32) { + BitPacking.fastunpack(buf, inexcept-initinexcept, + dataTobePacked[k], j, k); + inexcept += k; + } + int overflow = j - size; + inexcept -= overflow * k / 32; } - int overflow = j - size; - inexcept -= overflow * k / 32; } } Arrays.fill(dataPointers, 0); diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java b/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java index 625a3d1..4afb6b0 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java @@ -29,7 +29,6 @@ import me.lemire.integercompression.differential.IntegratedBinaryPacking; import me.lemire.integercompression.differential.IntegratedByteIntegerCODEC; import me.lemire.integercompression.differential.IntegratedComposition; -import me.lemire.integercompression.differential.IntegratedFastPFOR; import me.lemire.integercompression.differential.IntegratedIntegerCODEC; import me.lemire.integercompression.differential.IntegratedVariableByte; import me.lemire.integercompression.differential.XorBinaryPacking; @@ -624,18 +623,6 @@ private static void test(PrintWriter csvLog, int N, int nbr, int repeat) { repeat, true); System.out.println(); - { - IntegerCODEC c = new IntegratedComposition( - new IntegratedFastPFOR(), - new IntegratedVariableByte()); - testCodec(csvLog, sparsity, c, data, repeat, - false); - testCodec(csvLog, sparsity, c, data, repeat, - false); - testCodec(csvLog, sparsity, c, data, repeat, - true); - System.out.println(); - } testCodec(csvLog, sparsity, new Simple9(), data, repeat, false); diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java index c0af811..a30027d 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java @@ -4,7 +4,6 @@ import me.lemire.integercompression.differential.IntegratedBinaryPacking; import me.lemire.integercompression.differential.IntegratedByteIntegerCODEC; import me.lemire.integercompression.differential.IntegratedComposition; -import me.lemire.integercompression.differential.IntegratedFastPFOR; import me.lemire.integercompression.differential.IntegratedIntegerCODEC; import me.lemire.integercompression.differential.IntegratedVariableByte; @@ -20,8 +19,6 @@ */ public class BenchmarkCSV { static IntegratedIntegerCODEC codecs[] = { - new IntegratedComposition(new IntegratedFastPFOR(), - new IntegratedVariableByte()), new IntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte()) }; static IntegratedByteIntegerCODEC bcodecs[] = { new IntegratedVariableByte() }; diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java index 48ba002..604d11b 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java @@ -7,7 +7,6 @@ package me.lemire.integercompression.benchmarktools; import me.lemire.integercompression.BinaryPacking; -import me.lemire.integercompression.CopyOfFastPFOR; import me.lemire.integercompression.FastPFOR; import me.lemire.integercompression.IntWrapper; import me.lemire.integercompression.JustCopy; diff --git a/src/main/java/me/lemire/integercompression/differential/IntegratedFastPFOR.java b/src/main/java/me/lemire/integercompression/differential/IntegratedFastPFOR.java deleted file mode 100644 index b0f880e..0000000 --- a/src/main/java/me/lemire/integercompression/differential/IntegratedFastPFOR.java +++ /dev/null @@ -1,319 +0,0 @@ -/** - * This code is released under the - * Apache License Version 2.0 http://www.apache.org/licenses/. - * - * (c) Daniel Lemire, http://lemire.me/en/ - */ -package me.lemire.integercompression.differential; - -import java.nio.ByteBuffer; -import java.util.Arrays; - -import me.lemire.integercompression.BitPacking; -import me.lemire.integercompression.IntWrapper; -import me.lemire.integercompression.IntegerCODEC; -import me.lemire.integercompression.Util; - -/** - *

- * This is an integrated version of FastPFOR meaning that it computes - * differential coding as part of the compression. - *

- * It encodes integers in blocks of 128 integers within pages of - * up to 65536 integers. Note that it is important, to get good - * compression and good performance, to use sizeable blocks (greater than 1024 integers). - * For arrays containing a number of integers that is not divisible by 128, - * you should use it in conjunction with another CODEC: - *
IntegratedIntegerCODEC is =  
- *  new IntegratedComposition(new IntegratedFastPFOR(),
- *               new IntegratedVariableByte())
- * - *

- * For details, please see - *

- *

- * Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second - * through vectorization Software: Practice & Experience - * http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract - * http://arxiv.org/abs/1209.2137 - *

- *

- * Daniel Lemire, Leonid Boytsov, Nathan Kurz, - * SIMD Compression and the Intersection of Sorted Integers - * http://arxiv.org/abs/1401.6399 - *

- *

- * For multi-threaded applications, each thread should use its own - * IntegratedFastPFOR object. - *

- * - * You should only use this scheme on sorted arrays. Use FastPFOR if you have - * unsorted arrays. - * - * @author Daniel Lemire - */ -public final class IntegratedFastPFOR implements IntegratedIntegerCODEC { - /** - * - */ - public final static int BLOCK_SIZE = 128; - final static int OVERHEAD_OF_EACH_EXCEPT = 8; - final static int DEFAULT_PAGE_SIZE = 65536; - - int pageSize; - final int[] buffer = new int[BLOCK_SIZE]; - final int[][] dataTobePacked = new int[33][]; - final ByteBuffer byteContainer; - - // Working area for compress and uncompress. - int[] dataPointers; - int[] freqs; - int[] bestbbestcexceptmaxb = new int[3]; - - /** - * Construct the FastPFOR CODEC. - * - * @param pagesize - * the desired page size (for expert use) - */ - public IntegratedFastPFOR(int pagesize) { - pageSize = pagesize; - // Initiate arrrays. - byteContainer = ByteBuffer.allocateDirect(3 * pageSize - / BLOCK_SIZE + pageSize); - for (int k = 1; k < dataTobePacked.length; ++k) - dataTobePacked[k] = new int[pageSize / 32 * 4]; // heuristic - } - - /** - * Construct the fastPFOR CODEC with default parameters. - */ - public IntegratedFastPFOR() { - this(DEFAULT_PAGE_SIZE); - } - - /** - * Compress data in blocks of 128 integers (if fewer than 128 integers - * are provided, nothing is done). - * - * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) - */ - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { - inlength = Util.greatestMultiple(inlength, 128); - if (inlength == 0) - return; - - out[outpos.get()] = inlength; - outpos.increment(); - IntWrapper initoffset = new IntWrapper(0); - - // Allocate memory for working area. - dataPointers = new int[33]; - freqs = new int[33]; - - final int finalinpos = inpos.get() + inlength; - while (inpos.get() != finalinpos) { - int thissize = Math.min(pageSize, - finalinpos - inpos.get()); - encodePage(in, inpos, thissize, out, outpos, initoffset); - } - - dataPointers = null; - freqs = null; - } - - private void getBestBFromData(int[] in, int pos) { - Arrays.fill(freqs, 0); - for (int k = pos, k_end = pos + BLOCK_SIZE; k < k_end; ++k) { - freqs[Util.bits(in[k])]++; - } - bestbbestcexceptmaxb[0] = 32; - while (freqs[bestbbestcexceptmaxb[0]] == 0) - bestbbestcexceptmaxb[0]--; - bestbbestcexceptmaxb[2] = bestbbestcexceptmaxb[0]; - int bestcost = bestbbestcexceptmaxb[0] * BLOCK_SIZE; - int cexcept = 0; - bestbbestcexceptmaxb[1] = cexcept; - for (int b = bestbbestcexceptmaxb[0] - 1; b >= 0; --b) { - cexcept += freqs[b + 1]; - if (cexcept < 0) - break; - // the extra 8 is the cost of storing maxbits - int thiscost = cexcept * OVERHEAD_OF_EACH_EXCEPT - + cexcept * (bestbbestcexceptmaxb[2] - b) + b - * BLOCK_SIZE + 8; - if (thiscost < bestcost) { - bestcost = thiscost; - bestbbestcexceptmaxb[0] = (byte) b; - bestbbestcexceptmaxb[1] = cexcept; - } - } - } - - private void encodePage(int[] constin, IntWrapper constinpos, - int thissize, int[] out, IntWrapper outpos, - IntWrapper initoffset) { - final int headerpos = outpos.get(); - outpos.increment(); - int tmpoutpos = outpos.get(); - - // Clear working area. - Arrays.fill(dataPointers, 0); - byteContainer.clear(); - - int tmpconstinpos = constinpos.get(); - for (final int finalconstinpos = tmpconstinpos + thissize - - BLOCK_SIZE; tmpconstinpos <= finalconstinpos; tmpconstinpos += BLOCK_SIZE) { - initoffset.set(Delta.delta(constin, tmpconstinpos, - BLOCK_SIZE, initoffset.intValue(), buffer)); - getBestBFromData(buffer, 0); - final int tmpbestb = bestbbestcexceptmaxb[0]; - byteContainer.put((byte)bestbbestcexceptmaxb[0]); - byteContainer.put((byte)bestbbestcexceptmaxb[1]); - - if (bestbbestcexceptmaxb[1] > 0) { - byteContainer.put((byte)bestbbestcexceptmaxb[2]); - final int index = bestbbestcexceptmaxb[2] - - bestbbestcexceptmaxb[0]; - if (dataPointers[index] - + bestbbestcexceptmaxb[1] >= dataTobePacked[index].length) { - int newsize = 2 * (dataPointers[index] + bestbbestcexceptmaxb[1]); - // make sure it is a multiple of 32 - newsize = Util - .greatestMultiple(newsize + 31, 32); - dataTobePacked[index] = Arrays.copyOf( - dataTobePacked[index], newsize); - } - for (int k = 0; k < BLOCK_SIZE; ++k) { - if ((buffer[k] >>> bestbbestcexceptmaxb[0]) != 0) { - // we have an exception - byteContainer.put((byte) k); - dataTobePacked[index][dataPointers[index]++] = buffer[k] >>> tmpbestb; - } - } - - } - for (int k = 0; k < 128; k += 32) { - BitPacking.fastpack(buffer, k, out, tmpoutpos, - tmpbestb); - tmpoutpos += tmpbestb; - } - } - constinpos.set(tmpconstinpos); - out[headerpos] = tmpoutpos - headerpos; - final int bytesize = byteContainer.position(); - while ((byteContainer.position() & 3) != 0) - byteContainer.put((byte) 0); - out[tmpoutpos++] = bytesize; - final int howmanyints = byteContainer.position() / 4; - byteContainer.flip(); - byteContainer.asIntBuffer().get(out, tmpoutpos, howmanyints); - tmpoutpos += howmanyints; - int bitmap = 0; - for (int k = 1; k <= 32; ++k) { - if (dataPointers[k] != 0) - bitmap |= (1 << (k - 1)); - } - out[tmpoutpos++] = bitmap; - for (int k = 1; k <= 32; ++k) { - if (dataPointers[k] != 0) { - out[tmpoutpos++] = dataPointers[k];// size - for (int j = 0; j < dataPointers[k]; j += 32) { - BitPacking.fastpack(dataTobePacked[k], - j, out, tmpoutpos, k); - tmpoutpos += k; - } - } - } - outpos.set(tmpoutpos); - } - - /** - * Uncompress data in blocks of 128 integers. In this particular case, - * the inlength parameter is ignored: it is deduced from the compressed - * data. - * - * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) - */ - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos) { - if (inlength == 0) - return; - - int mynvalue = in[inpos.get()]; - inpos.increment(); - - dataPointers = new int[33]; - IntWrapper initoffset = new IntWrapper(0); - - int finalout = outpos.get() + mynvalue; - while (outpos.get() != finalout) { - int thissize = Math.min(pageSize, - finalout - outpos.get()); - decodePage(in, inpos, out, outpos, thissize, initoffset); - } - - dataPointers = null; - } - - private void decodePage(int[] in, IntWrapper inpos, int[] out, - IntWrapper outpos, int thissize, IntWrapper initoffset) { - final int initpos = inpos.get(); - final int wheremeta = in[inpos.get()]; - inpos.increment(); - int inexcept = initpos + wheremeta; - final int bytesize = in[inexcept++]; - byteContainer.clear(); - byteContainer.asIntBuffer().put(in, inexcept, (bytesize + 3) / 4); - inexcept += (bytesize + 3) / 4; - - final int bitmap = in[inexcept++]; - for (int k = 1; k <= 32; ++k) { - if ((bitmap & (1 << (k - 1))) != 0) { - int size = in[inexcept++]; - if (dataTobePacked[k].length < size) - dataTobePacked[k] = new int[Util - .greatestMultiple(size + 31, 32)]; - for (int j = 0; j < size; j += 32) { - BitPacking.fastunpack(in, inexcept, - dataTobePacked[k], j, k); - inexcept += k; - } - } - } - Arrays.fill(dataPointers, 0); - int tmpoutpos = outpos.get(); - int tmpinpos = inpos.get(); - - for (int run = 0, run_end = thissize / BLOCK_SIZE; run < run_end; ++run, tmpoutpos += BLOCK_SIZE) { - final int b = byteContainer.get(); - final int cexcept = byteContainer.get() & 0xFF; - for (int k = 0; k < 128; k += 32) { - BitPacking.fastunpack(in, tmpinpos, out, - tmpoutpos + k, b); - tmpinpos += b; - } - if (cexcept > 0) { - final int maxbits = byteContainer.get(); - final int index = maxbits - b; - for (int k = 0; k < cexcept; ++k) { - final int pos = byteContainer.get() & 0xFF; - final int exceptvalue = dataTobePacked[index][dataPointers[index]++]; - out[pos + tmpoutpos] |= exceptvalue << b; - } - } - initoffset.set(Delta.fastinverseDelta(out, tmpoutpos, - BLOCK_SIZE, initoffset.intValue())); - } - outpos.set(tmpoutpos); - inpos.set(inexcept); - } - - @Override - public String toString() { - return this.getClass().getSimpleName(); - } -} diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 3449f52..45f046e 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -6,7 +6,6 @@ import me.lemire.integercompression.differential.Delta; import me.lemire.integercompression.differential.IntegratedBinaryPacking; import me.lemire.integercompression.differential.IntegratedComposition; -import me.lemire.integercompression.differential.IntegratedFastPFOR; import me.lemire.integercompression.differential.IntegratedIntegerCODEC; import me.lemire.integercompression.differential.IntegratedVariableByte; import me.lemire.integercompression.differential.XorBinaryPacking; @@ -34,8 +33,6 @@ public class BasicTest { new Composition(new NewPFDS16(), new VariableByte()), new Composition(new OptPFDS9(), new VariableByte()), new Composition(new OptPFDS16(), new VariableByte()), - new IntegratedComposition(new IntegratedFastPFOR(), - new IntegratedVariableByte()), new Composition(new FastPFOR(), new VariableByte()), new Simple9(), new Simple16(), @@ -483,8 +480,6 @@ public void testUnsortedExample() { new IntegratedVariableByte())); testUnsorted(new Composition(new IntegratedBinaryPacking(), new VariableByte())); - testUnsorted(new IntegratedComposition(new IntegratedFastPFOR(), - new IntegratedVariableByte())); testUnsorted2(new VariableByte()); testUnsorted2(new IntegratedVariableByte()); @@ -501,8 +496,6 @@ public void testUnsortedExample() { new IntegratedVariableByte())); testUnsorted3(new Composition(new IntegratedBinaryPacking(), new VariableByte())); - testUnsorted3(new IntegratedComposition(new IntegratedFastPFOR(), - new IntegratedVariableByte())); testUnsorted3(new VariableByte()); testUnsorted3(new IntegratedVariableByte()); testUnsorted3(new Composition(new BinaryPacking(), new VariableByte())); @@ -518,8 +511,6 @@ public void testUnsortedExample() { new IntegratedVariableByte())); testUnsorted2(new Composition(new IntegratedBinaryPacking(), new VariableByte())); - testUnsorted2(new IntegratedComposition(new IntegratedFastPFOR(), - new IntegratedVariableByte())); } @@ -612,25 +603,4 @@ public void fastPforTest() { + " != " + data[k]); } - /** - * - */ - @Test - public void ifastPforTest() { - // inspired by Stefan Ackermann (https://github.com/Stivo) - IntegratedFastPFOR codec1 = new IntegratedFastPFOR(); - IntegratedFastPFOR codec2 = new IntegratedFastPFOR(); - int N = IntegratedFastPFOR.BLOCK_SIZE; - int[] data = new int[N]; - for (int i = 0; i < N; i++) - data[i] = 0; - data[126] = -1; - int[] comp = TestUtils.compress(codec1, Arrays.copyOf(data, N)); - int[] answer = TestUtils.uncompress(codec2, comp, N); - for (int k = 0; k < N; ++k) - if (answer[k] != data[k]) - throw new RuntimeException("bug " + k + " " + answer[k] - + " != " + data[k]); - } - } diff --git a/src/test/java/me/lemire/integercompression/BoundaryTest.java b/src/test/java/me/lemire/integercompression/BoundaryTest.java index 0d6d573..2a52bf9 100644 --- a/src/test/java/me/lemire/integercompression/BoundaryTest.java +++ b/src/test/java/me/lemire/integercompression/BoundaryTest.java @@ -4,7 +4,6 @@ import me.lemire.integercompression.differential.IntegratedBinaryPacking; import me.lemire.integercompression.differential.IntegratedComposition; -import me.lemire.integercompression.differential.IntegratedFastPFOR; import me.lemire.integercompression.differential.IntegratedVariableByte; import org.junit.Test; @@ -73,9 +72,6 @@ public void testIntegratedComposition() { IntegratedComposition c = new IntegratedComposition( new IntegratedBinaryPacking(), new IntegratedVariableByte()); testBoundary(c); - IntegratedComposition c2 = new IntegratedComposition( - new IntegratedFastPFOR(), new IntegratedVariableByte()); - testBoundary(c2); } /** From 7169f09716f7e91883350ac16976e13f22dde935 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 19 Sep 2014 14:44:20 -0400 Subject: [PATCH 202/412] Ready for new tests --- .../lemire/integercompression/FastPFOR.java | 66 ++++++++++++------- .../benchmarktools/Benchmark.java | 16 ++++- .../benchmarktools/BenchmarkCSV.java | 3 +- .../BenchmarkOffsettedSeries.java | 4 +- .../benchmarktools/BenchmarkSkippable.java | 3 +- .../lemire/integercompression/AdhocTest.java | 9 ++- .../lemire/integercompression/BasicTest.java | 56 +++++++++------- .../SkippableBasicTest.java | 3 +- 8 files changed, 104 insertions(+), 56 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index b307729..44b0888 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -38,10 +38,17 @@ * @author Daniel Lemire */ public final class FastPFOR implements IntegerCODEC,SkippableIntegerCODEC { - final static int BLOCK_SIZE = 256; final static int OVERHEAD_OF_EACH_EXCEPT = 8; - final static int DEFAULT_PAGE_SIZE = 65536; + /** + * + */ + public final static int DEFAULT_PAGE_SIZE = 65536; + /** + * + */ + public final static int DEFAULT_BLOCK_SIZE = 256; + int blockSize; int pageSize; final int[][] dataTobePacked = new int[33][]; final ByteBuffer byteContainer; @@ -53,24 +60,35 @@ public final class FastPFOR implements IntegerCODEC,SkippableIntegerCODEC { /** * Construct the FastPFOR CODEC. + * @param BlockSize block size (should be 128 or 256 integers) * * @param pagesize - * the desired page size (for expert use) + * the desired page size (recommended value is FastPFOR.DEFAULT_PAGE_SIZE) + */ + public FastPFOR(int BlockSize, int pagesize) { + if((BlockSize != 128) && (BlockSize != 256)) + throw new IllegalArgumentException(" block size should be 128 or 256"); + blockSize = BlockSize; + pageSize = pagesize; + // Initiate arrrays. + byteContainer = ByteBuffer.allocateDirect(3 * pageSize + / blockSize + pageSize); + for (int k = 1; k < dataTobePacked.length; ++k) + dataTobePacked[k] = new int[pageSize / 32 * 4]; // heuristic + } + /** + * Construct the fastPFOR CODEC with specified block size . + * @param BlockSize block size (should be 128 or 256 integers) */ - public FastPFOR(int pagesize) { - pageSize = pagesize; - // Initiate arrrays. - byteContainer = ByteBuffer.allocateDirect(3 * pageSize - / BLOCK_SIZE + pageSize); - for (int k = 1; k < dataTobePacked.length; ++k) - dataTobePacked[k] = new int[pageSize / 32 * 4]; // heuristic + public FastPFOR(int BlockSize) { + this(BlockSize, DEFAULT_PAGE_SIZE); } /** * Construct the fastPFOR CODEC with default parameters. */ public FastPFOR() { - this(DEFAULT_PAGE_SIZE); + this(DEFAULT_BLOCK_SIZE, DEFAULT_PAGE_SIZE); } /** @@ -82,7 +100,7 @@ public FastPFOR() { @Override public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); + inlength = Util.greatestMultiple(inlength, blockSize); if (inlength == 0) return; @@ -104,24 +122,24 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, private void getBestBFromData(int[] in, int pos) { Arrays.fill(freqs, 0); - for (int k = pos, k_end = pos + BLOCK_SIZE; k < k_end; ++k) { + for (int k = pos, k_end = pos + blockSize; k < k_end; ++k) { freqs[Util.bits(in[k])]++; } bestbbestcexceptmaxb[0] = 32; while (freqs[bestbbestcexceptmaxb[0]] == 0) bestbbestcexceptmaxb[0]--; bestbbestcexceptmaxb[2] = bestbbestcexceptmaxb[0]; - int bestcost = bestbbestcexceptmaxb[0] * BLOCK_SIZE; + int bestcost = bestbbestcexceptmaxb[0] * blockSize; int cexcept = 0; bestbbestcexceptmaxb[1] = cexcept; for (int b = bestbbestcexceptmaxb[0] - 1; b >= 0; --b) { cexcept += freqs[b + 1]; - if (cexcept == BLOCK_SIZE) + if (cexcept == blockSize) break; // the extra 8 is the cost of storing maxbits int thiscost = cexcept * OVERHEAD_OF_EACH_EXCEPT + cexcept * (bestbbestcexceptmaxb[2] - b) + b - * BLOCK_SIZE + 8; + * blockSize + 8; if(bestbbestcexceptmaxb[2] - b == 1) thiscost -= cexcept; if (thiscost < bestcost) { bestcost = thiscost; @@ -142,7 +160,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, byteContainer.clear(); int tmpinpos = inpos.get(); - for (final int finalinpos = tmpinpos + thissize - BLOCK_SIZE; tmpinpos <= finalinpos; tmpinpos += BLOCK_SIZE) { + for (final int finalinpos = tmpinpos + thissize - blockSize; tmpinpos <= finalinpos; tmpinpos += blockSize) { getBestBFromData(in, tmpinpos); final int tmpbestb = bestbbestcexceptmaxb[0]; byteContainer.put((byte)bestbbestcexceptmaxb[0]); @@ -160,7 +178,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, dataTobePacked[index] = Arrays.copyOf( dataTobePacked[index], newsize); } - for (int k = 0; k < BLOCK_SIZE; ++k) { + for (int k = 0; k < blockSize; ++k) { if ((in[k + tmpinpos] >>> bestbbestcexceptmaxb[0]) != 0) { // we have an exception byteContainer.put((byte) k); @@ -170,7 +188,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, } } - for (int k = 0; k < BLOCK_SIZE; k += 32) { + for (int k = 0; k < blockSize; k += 32) { BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, tmpbestb); tmpoutpos += tmpbestb; @@ -221,7 +239,7 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int mynvalue) { if (inlength == 0) return; - mynvalue = Util.greatestMultiple(mynvalue, BLOCK_SIZE); + mynvalue = Util.greatestMultiple(mynvalue, blockSize); dataPointers = new int[33]; @@ -282,10 +300,10 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, int tmpoutpos = outpos.get(); int tmpinpos = inpos.get(); - for (int run = 0, run_end = thissize / BLOCK_SIZE; run < run_end; ++run, tmpoutpos += BLOCK_SIZE) { + for (int run = 0, run_end = thissize / blockSize; run < run_end; ++run, tmpoutpos += blockSize) { final int b = byteContainer.get(); final int cexcept = byteContainer.get() & 0xFF; - for (int k = 0; k < BLOCK_SIZE; k += 32) { + for (int k = 0; k < blockSize; k += 32) { BitPacking.fastunpack(in, tmpinpos, out, tmpoutpos + k, b); tmpinpos += b; @@ -313,7 +331,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); + inlength = Util.greatestMultiple(inlength, blockSize); if (inlength == 0) return; out[outpos.get()] = inlength; @@ -332,6 +350,6 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, } @Override public String toString() { - return this.getClass().getSimpleName(); + return this.getClass().getSimpleName()+blockSize; } } diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java b/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java index 4afb6b0..c0d2812 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java @@ -488,13 +488,23 @@ private static void test(PrintWriter csvLog, int N, int nbr, int repeat) { testCodec(csvLog, sparsity, new Composition( - new FastPFOR(), new VariableByte()), data, + new FastPFOR(128), new VariableByte()), data, repeat, false); testCodec(csvLog, sparsity, new Composition( - new FastPFOR(), new VariableByte()), data, + new FastPFOR(128), new VariableByte()), data, repeat, false); testCodec(csvLog, sparsity, new Composition( - new FastPFOR(), new VariableByte()), data, + new FastPFOR(128), new VariableByte()), data, + repeat, true); + System.out.println(); + testCodec(csvLog, sparsity, new Composition( + new FastPFOR(256), new VariableByte()), data, + repeat, false); + testCodec(csvLog, sparsity, new Composition( + new FastPFOR(256), new VariableByte()), data, + repeat, false); + testCodec(csvLog, sparsity, new Composition( + new FastPFOR(256), new VariableByte()), data, repeat, true); System.out.println(); diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java index a30027d..1c28ff5 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java @@ -23,7 +23,8 @@ public class BenchmarkCSV { new IntegratedVariableByte()) }; static IntegratedByteIntegerCODEC bcodecs[] = { new IntegratedVariableByte() }; static IntegerCODEC regcodecs[] = { - new Composition(new FastPFOR(), new VariableByte()), + new Composition(new FastPFOR(128), new VariableByte()), + new Composition(new FastPFOR(256), new VariableByte()), new Composition(new BinaryPacking(), new VariableByte()) }; static ByteIntegerCODEC regbcodecs[] = { new VariableByte() }; diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkOffsettedSeries.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkOffsettedSeries.java index 9e25dc6..7bf9a1b 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkOffsettedSeries.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkOffsettedSeries.java @@ -45,7 +45,7 @@ public static void run(final PrintWriter csvWriter, final int count, final int l new DeltaZigzagBinaryPacking(), new DeltaZigzagVariableByte(), new IntegratedBinaryPacking(), new XorBinaryPacking(), - new FastPFOR(), }; + new FastPFOR(128), new FastPFOR(256)}; csvWriter .format("\"Dataset\",\"CODEC\",\"Bits per int\"," @@ -60,7 +60,7 @@ public static void run(final PrintWriter csvWriter, final int count, final int l new DeltaZigzagBinaryPacking(), new DeltaZigzagVariableByte(), new IntegratedBinaryPacking(), new XorBinaryPacking(), - new FastPFOR(), }; + new FastPFOR(128),new FastPFOR(256), }; int freq = length / 4; benchmarkSine(csvWriter, codecs2, count, length, diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java index 604d11b..7fe23e3 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java @@ -290,7 +290,8 @@ private static int[][] generateTestData(ClusteredDataGenerator dataGen, } static Object[] codecs = { - new SkippableComposition(new FastPFOR(), new VariableByte()), + new SkippableComposition(new FastPFOR(128), new VariableByte()), + new SkippableComposition(new FastPFOR(256), new VariableByte()), new SkippableComposition(new OptPFD(), new VariableByte()), /* new SkippableIntegratedComposition(new IntegratedBinaryPacking(), diff --git a/src/test/java/me/lemire/integercompression/AdhocTest.java b/src/test/java/me/lemire/integercompression/AdhocTest.java index 50c2ad5..dd4a961 100644 --- a/src/test/java/me/lemire/integercompression/AdhocTest.java +++ b/src/test/java/me/lemire/integercompression/AdhocTest.java @@ -16,8 +16,11 @@ public class AdhocTest @Test public void biggerCompressedArray0() { // No problem: for comparison. - IntegerCODEC c = new Composition(new FastPFOR(), new VariableByte()); + IntegerCODEC c = new Composition(new FastPFOR(128), new VariableByte()); assertSymmetry(c, 0, 16384); + c = new Composition(new FastPFOR(256), new VariableByte()); + assertSymmetry(c, 0, 16384); + } /** @@ -36,7 +39,9 @@ public void biggerCompressedArray1() { @Test public void biggerCompressedArray2() { // Compressed array is bigger than original, because of Composition. - IntegerCODEC c = new Composition(new FastPFOR(), new VariableByte()); + IntegerCODEC c = new Composition(new FastPFOR(128), new VariableByte()); + assertSymmetry(c, 65535, 65535); + c = new Composition(new FastPFOR(256), new VariableByte()); assertSymmetry(c, 65535, 65535); } diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 45f046e..66b0769 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -33,7 +33,8 @@ public class BasicTest { new Composition(new NewPFDS16(), new VariableByte()), new Composition(new OptPFDS9(), new VariableByte()), new Composition(new OptPFDS16(), new VariableByte()), - new Composition(new FastPFOR(), new VariableByte()), + new Composition(new FastPFOR(128), new VariableByte()), + new Composition(new FastPFOR(256), new VariableByte()), new Simple9(), new Simple16(), new Composition(new XorBinaryPacking(), new VariableByte()), @@ -302,7 +303,8 @@ public void spuriousouttest() { testSpurious(new OptPFD()); testSpurious(new OptPFDS9()); testSpurious(new OptPFDS16()); - testSpurious(new FastPFOR()); + testSpurious(new FastPFOR(128)); + testSpurious(new FastPFOR(256)); } /** @@ -319,7 +321,8 @@ public void zeroinzerouttest() { testZeroInZeroOut(new OptPFD()); testZeroInZeroOut(new OptPFDS9()); testZeroInZeroOut(new OptPFDS16()); - testZeroInZeroOut(new FastPFOR()); + testZeroInZeroOut(new FastPFOR(128)); + testZeroInZeroOut(new FastPFOR(256)); testZeroInZeroOut(new VariableByte()); testZeroInZeroOut(new Composition(new IntegratedBinaryPacking(), new VariableByte())); @@ -331,7 +334,8 @@ public void zeroinzerouttest() { testZeroInZeroOut(new Composition(new OptPFD(), new VariableByte())); testZeroInZeroOut(new Composition(new OptPFDS9(), new VariableByte())); testZeroInZeroOut(new Composition(new OptPFDS16(), new VariableByte())); - testZeroInZeroOut(new Composition(new FastPFOR(), new VariableByte())); + testZeroInZeroOut(new Composition(new FastPFOR(128), new VariableByte())); + testZeroInZeroOut(new Composition(new FastPFOR(256), new VariableByte())); testZeroInZeroOut(new IntegratedComposition( new IntegratedBinaryPacking(), new IntegratedVariableByte())); @@ -413,8 +417,11 @@ private static void test(int N, int nbr) { testCodec(new Composition(new OptPFDS16(), new VariableByte()), new Composition(new OptPFDS16(), new VariableByte()), data, max); - testCodec(new Composition(new FastPFOR(), new VariableByte()), - new Composition(new FastPFOR(), new VariableByte()), data, + testCodec(new Composition(new FastPFOR(128), new VariableByte()), + new Composition(new FastPFOR(128), new VariableByte()), data, + max); + testCodec(new Composition(new FastPFOR(256), new VariableByte()), + new Composition(new FastPFOR(256), new VariableByte()), data, max); testCodec(new Simple9(), new Simple9(), data, max); } @@ -474,7 +481,8 @@ public void testUnsortedExample() { testUnsorted(new Composition(new OptPFD(), new VariableByte())); testUnsorted(new Composition(new OptPFDS9(), new VariableByte())); testUnsorted(new Composition(new OptPFDS16(), new VariableByte())); - testUnsorted(new Composition(new FastPFOR(), new VariableByte())); + testUnsorted(new Composition(new FastPFOR(128), new VariableByte())); + testUnsorted(new Composition(new FastPFOR(256), new VariableByte())); testUnsorted(new IntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte())); @@ -490,7 +498,8 @@ public void testUnsortedExample() { testUnsorted2(new Composition(new OptPFD(), new VariableByte())); testUnsorted2(new Composition(new OptPFDS9(), new VariableByte())); testUnsorted2(new Composition(new OptPFDS16(), new VariableByte())); - testUnsorted2(new Composition(new FastPFOR(), new VariableByte())); + testUnsorted2(new Composition(new FastPFOR(128), new VariableByte())); + testUnsorted2(new Composition(new FastPFOR(256), new VariableByte())); testUnsorted3(new IntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte())); @@ -505,7 +514,8 @@ public void testUnsortedExample() { testUnsorted3(new Composition(new OptPFD(), new VariableByte())); testUnsorted3(new Composition(new OptPFDS9(), new VariableByte())); testUnsorted3(new Composition(new OptPFDS16(), new VariableByte())); - testUnsorted3(new Composition(new FastPFOR(), new VariableByte())); + testUnsorted3(new Composition(new FastPFOR(128), new VariableByte())); + testUnsorted3(new Composition(new FastPFOR(256), new VariableByte())); testUnsorted2(new IntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte())); @@ -588,19 +598,21 @@ private void testUnsorted3(IntegerCODEC codec) { @Test public void fastPforTest() { // proposed by Stefan Ackermann (https://github.com/Stivo) - FastPFOR codec1 = new FastPFOR(); - FastPFOR codec2 = new FastPFOR(); - int N = FastPFOR.BLOCK_SIZE; - int[] data = new int[N]; - for (int i = 0; i < N; i++) - data[i] = 0; - data[126] = -1; - int[] comp = TestUtils.compress(codec1, Arrays.copyOf(data, N)); - int[] answer = TestUtils.uncompress(codec2, comp, N); - for (int k = 0; k < N; ++k) - if (answer[k] != data[k]) - throw new RuntimeException("bug " + k + " " + answer[k] - + " != " + data[k]); + for(int n = 128; n<=256;n+=128) { + FastPFOR codec1 = new FastPFOR(n); + FastPFOR codec2 = new FastPFOR(n); + int N = codec1.blockSize; + int[] data = new int[N]; + for (int i = 0; i < N; i++) + data[i] = 0; + data[126] = -1; + int[] comp = TestUtils.compress(codec1, Arrays.copyOf(data, N)); + int[] answer = TestUtils.uncompress(codec2, comp, N); + for (int k = 0; k < N; ++k) + if (answer[k] != data[k]) + throw new RuntimeException("bug " + k + " " + answer[k] + + " != " + data[k]); + } } } diff --git a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java index ee44bc1..3e718ae 100644 --- a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java +++ b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java @@ -22,7 +22,8 @@ public class SkippableBasicTest { new SkippableComposition(new OptPFD(), new VariableByte()), new SkippableComposition(new OptPFDS9(), new VariableByte()), new SkippableComposition(new OptPFDS16(), new VariableByte()), - new SkippableComposition(new FastPFOR(), new VariableByte()), + new SkippableComposition(new FastPFOR(128), new VariableByte()), + new SkippableComposition(new FastPFOR(256), new VariableByte()), new Simple9(), new Simple16() }; From 3aa4842d23719124e3a23bacfadb333d7082d422 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 19 Sep 2014 14:49:05 -0400 Subject: [PATCH 203/412] Another experiment --- src/main/java/me/lemire/integercompression/FastPFOR.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 44b0888..353168c 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -48,15 +48,15 @@ public final class FastPFOR implements IntegerCODEC,SkippableIntegerCODEC { */ public final static int DEFAULT_BLOCK_SIZE = 256; - int blockSize; - int pageSize; + final int blockSize = DEFAULT_BLOCK_SIZE; + final int pageSize; final int[][] dataTobePacked = new int[33][]; final ByteBuffer byteContainer; // Working area for compress and uncompress. int[] dataPointers; int[] freqs; - int[] bestbbestcexceptmaxb = new int[3]; + final int[] bestbbestcexceptmaxb = new int[3]; /** * Construct the FastPFOR CODEC. @@ -68,7 +68,7 @@ public final class FastPFOR implements IntegerCODEC,SkippableIntegerCODEC { public FastPFOR(int BlockSize, int pagesize) { if((BlockSize != 128) && (BlockSize != 256)) throw new IllegalArgumentException(" block size should be 128 or 256"); - blockSize = BlockSize; + //blockSize = BlockSize; pageSize = pagesize; // Initiate arrrays. byteContainer = ByteBuffer.allocateDirect(3 * pageSize From 8fb66d1802c70647ce27ed66b68b41dd806572ef Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 19 Sep 2014 14:58:00 -0400 Subject: [PATCH 204/412] Another test --- .../lemire/integercompression/FastPFOR.java | 17 +-- .../benchmarktools/Benchmark.java | 13 +-- .../benchmarktools/BenchmarkCSV.java | 4 +- .../BenchmarkOffsettedSeries.java | 5 +- .../benchmarktools/BenchmarkSkippable.java | 5 +- .../lemire/integercompression/AdhocTest.java | 8 +- .../lemire/integercompression/BasicTest.java | 101 +++++++++++------- .../SkippableBasicTest.java | 4 +- 8 files changed, 85 insertions(+), 72 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 353168c..40b07cb 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -60,15 +60,11 @@ public final class FastPFOR implements IntegerCODEC,SkippableIntegerCODEC { /** * Construct the FastPFOR CODEC. - * @param BlockSize block size (should be 128 or 256 integers) * * @param pagesize * the desired page size (recommended value is FastPFOR.DEFAULT_PAGE_SIZE) */ - public FastPFOR(int BlockSize, int pagesize) { - if((BlockSize != 128) && (BlockSize != 256)) - throw new IllegalArgumentException(" block size should be 128 or 256"); - //blockSize = BlockSize; + private FastPFOR(int pagesize) { pageSize = pagesize; // Initiate arrrays. byteContainer = ByteBuffer.allocateDirect(3 * pageSize @@ -76,19 +72,12 @@ public FastPFOR(int BlockSize, int pagesize) { for (int k = 1; k < dataTobePacked.length; ++k) dataTobePacked[k] = new int[pageSize / 32 * 4]; // heuristic } - /** - * Construct the fastPFOR CODEC with specified block size . - * @param BlockSize block size (should be 128 or 256 integers) - */ - public FastPFOR(int BlockSize) { - this(BlockSize, DEFAULT_PAGE_SIZE); - } /** * Construct the fastPFOR CODEC with default parameters. */ public FastPFOR() { - this(DEFAULT_BLOCK_SIZE, DEFAULT_PAGE_SIZE); + this( DEFAULT_PAGE_SIZE); } /** @@ -350,6 +339,6 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, } @Override public String toString() { - return this.getClass().getSimpleName()+blockSize; + return this.getClass().getSimpleName(); } } diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java b/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java index c0d2812..847a28a 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java @@ -14,6 +14,7 @@ import me.lemire.integercompression.DeltaZigzagBinaryPacking; import me.lemire.integercompression.DeltaZigzagVariableByte; import me.lemire.integercompression.FastPFOR; +import me.lemire.integercompression.FastPFOR128; import me.lemire.integercompression.IntWrapper; import me.lemire.integercompression.IntegerCODEC; import me.lemire.integercompression.JustCopy; @@ -488,23 +489,23 @@ private static void test(PrintWriter csvLog, int N, int nbr, int repeat) { testCodec(csvLog, sparsity, new Composition( - new FastPFOR(128), new VariableByte()), data, + new FastPFOR128(), new VariableByte()), data, repeat, false); testCodec(csvLog, sparsity, new Composition( - new FastPFOR(128), new VariableByte()), data, + new FastPFOR128(), new VariableByte()), data, repeat, false); testCodec(csvLog, sparsity, new Composition( - new FastPFOR(128), new VariableByte()), data, + new FastPFOR128(), new VariableByte()), data, repeat, true); System.out.println(); testCodec(csvLog, sparsity, new Composition( - new FastPFOR(256), new VariableByte()), data, + new FastPFOR(), new VariableByte()), data, repeat, false); testCodec(csvLog, sparsity, new Composition( - new FastPFOR(256), new VariableByte()), data, + new FastPFOR(), new VariableByte()), data, repeat, false); testCodec(csvLog, sparsity, new Composition( - new FastPFOR(256), new VariableByte()), data, + new FastPFOR(), new VariableByte()), data, repeat, true); System.out.println(); diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java index 1c28ff5..3115f0a 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkCSV.java @@ -23,8 +23,8 @@ public class BenchmarkCSV { new IntegratedVariableByte()) }; static IntegratedByteIntegerCODEC bcodecs[] = { new IntegratedVariableByte() }; static IntegerCODEC regcodecs[] = { - new Composition(new FastPFOR(128), new VariableByte()), - new Composition(new FastPFOR(256), new VariableByte()), + new Composition(new FastPFOR128(), new VariableByte()), + new Composition(new FastPFOR(), new VariableByte()), new Composition(new BinaryPacking(), new VariableByte()) }; static ByteIntegerCODEC regbcodecs[] = { new VariableByte() }; diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkOffsettedSeries.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkOffsettedSeries.java index 7bf9a1b..d9243bd 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkOffsettedSeries.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkOffsettedSeries.java @@ -13,6 +13,7 @@ import me.lemire.integercompression.DeltaZigzagBinaryPacking; import me.lemire.integercompression.DeltaZigzagVariableByte; import me.lemire.integercompression.FastPFOR; +import me.lemire.integercompression.FastPFOR128; import me.lemire.integercompression.IntWrapper; import me.lemire.integercompression.IntegerCODEC; import me.lemire.integercompression.JustCopy; @@ -45,7 +46,7 @@ public static void run(final PrintWriter csvWriter, final int count, final int l new DeltaZigzagBinaryPacking(), new DeltaZigzagVariableByte(), new IntegratedBinaryPacking(), new XorBinaryPacking(), - new FastPFOR(128), new FastPFOR(256)}; + new FastPFOR128(), new FastPFOR()}; csvWriter .format("\"Dataset\",\"CODEC\",\"Bits per int\"," @@ -60,7 +61,7 @@ public static void run(final PrintWriter csvWriter, final int count, final int l new DeltaZigzagBinaryPacking(), new DeltaZigzagVariableByte(), new IntegratedBinaryPacking(), new XorBinaryPacking(), - new FastPFOR(128),new FastPFOR(256), }; + new FastPFOR128(),new FastPFOR(), }; int freq = length / 4; benchmarkSine(csvWriter, codecs2, count, length, diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java index 7fe23e3..4475b62 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java @@ -8,6 +8,7 @@ import me.lemire.integercompression.BinaryPacking; import me.lemire.integercompression.FastPFOR; +import me.lemire.integercompression.FastPFOR128; import me.lemire.integercompression.IntWrapper; import me.lemire.integercompression.JustCopy; import me.lemire.integercompression.NewPFD; @@ -290,8 +291,8 @@ private static int[][] generateTestData(ClusteredDataGenerator dataGen, } static Object[] codecs = { - new SkippableComposition(new FastPFOR(128), new VariableByte()), - new SkippableComposition(new FastPFOR(256), new VariableByte()), + new SkippableComposition(new FastPFOR128(), new VariableByte()), + new SkippableComposition(new FastPFOR(), new VariableByte()), new SkippableComposition(new OptPFD(), new VariableByte()), /* new SkippableIntegratedComposition(new IntegratedBinaryPacking(), diff --git a/src/test/java/me/lemire/integercompression/AdhocTest.java b/src/test/java/me/lemire/integercompression/AdhocTest.java index dd4a961..5195fef 100644 --- a/src/test/java/me/lemire/integercompression/AdhocTest.java +++ b/src/test/java/me/lemire/integercompression/AdhocTest.java @@ -16,9 +16,9 @@ public class AdhocTest @Test public void biggerCompressedArray0() { // No problem: for comparison. - IntegerCODEC c = new Composition(new FastPFOR(128), new VariableByte()); + IntegerCODEC c = new Composition(new FastPFOR128(), new VariableByte()); assertSymmetry(c, 0, 16384); - c = new Composition(new FastPFOR(256), new VariableByte()); + c = new Composition(new FastPFOR(), new VariableByte()); assertSymmetry(c, 0, 16384); } @@ -39,9 +39,9 @@ public void biggerCompressedArray1() { @Test public void biggerCompressedArray2() { // Compressed array is bigger than original, because of Composition. - IntegerCODEC c = new Composition(new FastPFOR(128), new VariableByte()); + IntegerCODEC c = new Composition(new FastPFOR128(), new VariableByte()); assertSymmetry(c, 65535, 65535); - c = new Composition(new FastPFOR(256), new VariableByte()); + c = new Composition(new FastPFOR(), new VariableByte()); assertSymmetry(c, 65535, 65535); } diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 66b0769..6a10f7f 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -33,8 +33,8 @@ public class BasicTest { new Composition(new NewPFDS16(), new VariableByte()), new Composition(new OptPFDS9(), new VariableByte()), new Composition(new OptPFDS16(), new VariableByte()), - new Composition(new FastPFOR(128), new VariableByte()), - new Composition(new FastPFOR(256), new VariableByte()), + new Composition(new FastPFOR128(), new VariableByte()), + new Composition(new FastPFOR(), new VariableByte()), new Simple9(), new Simple16(), new Composition(new XorBinaryPacking(), new VariableByte()), @@ -51,7 +51,7 @@ public void varyingLengthTest() { for (int k = 0; k < N; ++k) data[k] = k; for (IntegerCODEC c : codecs) { - System.out.println("[BasicTest.varyingLengthTest] codec = "+c); + System.out.println("[BasicTest.varyingLengthTest] codec = " + c); for (int L = 1; L <= 128; L++) { int[] comp = TestUtils.compress(c, Arrays.copyOf(data, L)); int[] answer = TestUtils.uncompress(c, comp, L); @@ -64,8 +64,10 @@ public void varyingLengthTest() { int[] answer = TestUtils.uncompress(c, comp, L); for (int k = 0; k < L; ++k) if (answer[k] != data[k]) { - System.out.println(Arrays.toString(Arrays.copyOf(answer, L))); - System.out.println(Arrays.toString(Arrays.copyOf(data, L))); + System.out.println(Arrays.toString(Arrays.copyOf( + answer, L))); + System.out.println(Arrays.toString(Arrays.copyOf(data, + L))); throw new RuntimeException("bug"); } } @@ -82,7 +84,7 @@ public void varyingLengthTest2() { int[] data = new int[N]; data[127] = -1; for (IntegerCODEC c : codecs) { - System.out.println("[BasicTest.varyingLengthTest2] codec = "+c); + System.out.println("[BasicTest.varyingLengthTest2] codec = " + c); try { // CODEC Simple9 is limited to "small" integers. if (c.getClass().equals( @@ -303,8 +305,8 @@ public void spuriousouttest() { testSpurious(new OptPFD()); testSpurious(new OptPFDS9()); testSpurious(new OptPFDS16()); - testSpurious(new FastPFOR(128)); - testSpurious(new FastPFOR(256)); + testSpurious(new FastPFOR128()); + testSpurious(new FastPFOR()); } /** @@ -321,8 +323,8 @@ public void zeroinzerouttest() { testZeroInZeroOut(new OptPFD()); testZeroInZeroOut(new OptPFDS9()); testZeroInZeroOut(new OptPFDS16()); - testZeroInZeroOut(new FastPFOR(128)); - testZeroInZeroOut(new FastPFOR(256)); + testZeroInZeroOut(new FastPFOR128()); + testZeroInZeroOut(new FastPFOR()); testZeroInZeroOut(new VariableByte()); testZeroInZeroOut(new Composition(new IntegratedBinaryPacking(), new VariableByte())); @@ -334,8 +336,8 @@ public void zeroinzerouttest() { testZeroInZeroOut(new Composition(new OptPFD(), new VariableByte())); testZeroInZeroOut(new Composition(new OptPFDS9(), new VariableByte())); testZeroInZeroOut(new Composition(new OptPFDS16(), new VariableByte())); - testZeroInZeroOut(new Composition(new FastPFOR(128), new VariableByte())); - testZeroInZeroOut(new Composition(new FastPFOR(256), new VariableByte())); + testZeroInZeroOut(new Composition(new FastPFOR128(), new VariableByte())); + testZeroInZeroOut(new Composition(new FastPFOR(), new VariableByte())); testZeroInZeroOut(new IntegratedComposition( new IntegratedBinaryPacking(), new IntegratedVariableByte())); @@ -380,7 +382,7 @@ private static void test(IntegerCODEC c, IntegerCODEC co, int N, int nbr) { private static void test(int N, int nbr) { ClusteredDataGenerator cdg = new ClusteredDataGenerator(); - System.out.println("[BasicTest.test] N = "+N+" "+nbr); + System.out.println("[BasicTest.test] N = " + N + " " + nbr); for (int sparsity = 1; sparsity < 31 - nbr; sparsity += 4) { int[][] data = new int[N][]; int max = (1 << (nbr + sparsity)); @@ -417,12 +419,12 @@ private static void test(int N, int nbr) { testCodec(new Composition(new OptPFDS16(), new VariableByte()), new Composition(new OptPFDS16(), new VariableByte()), data, max); - testCodec(new Composition(new FastPFOR(128), new VariableByte()), - new Composition(new FastPFOR(128), new VariableByte()), data, - max); - testCodec(new Composition(new FastPFOR(256), new VariableByte()), - new Composition(new FastPFOR(256), new VariableByte()), data, - max); + testCodec(new Composition(new FastPFOR128(), new VariableByte()), + new Composition(new FastPFOR128(), new VariableByte()), + data, max); + testCodec(new Composition(new FastPFOR(), new VariableByte()), + new Composition(new FastPFOR(), new VariableByte()), + data, max); testCodec(new Simple9(), new Simple9(), data, max); } } @@ -481,8 +483,8 @@ public void testUnsortedExample() { testUnsorted(new Composition(new OptPFD(), new VariableByte())); testUnsorted(new Composition(new OptPFDS9(), new VariableByte())); testUnsorted(new Composition(new OptPFDS16(), new VariableByte())); - testUnsorted(new Composition(new FastPFOR(128), new VariableByte())); - testUnsorted(new Composition(new FastPFOR(256), new VariableByte())); + testUnsorted(new Composition(new FastPFOR128(), new VariableByte())); + testUnsorted(new Composition(new FastPFOR(), new VariableByte())); testUnsorted(new IntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte())); @@ -498,8 +500,8 @@ public void testUnsortedExample() { testUnsorted2(new Composition(new OptPFD(), new VariableByte())); testUnsorted2(new Composition(new OptPFDS9(), new VariableByte())); testUnsorted2(new Composition(new OptPFDS16(), new VariableByte())); - testUnsorted2(new Composition(new FastPFOR(128), new VariableByte())); - testUnsorted2(new Composition(new FastPFOR(256), new VariableByte())); + testUnsorted2(new Composition(new FastPFOR128(), new VariableByte())); + testUnsorted2(new Composition(new FastPFOR(), new VariableByte())); testUnsorted3(new IntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte())); @@ -514,8 +516,8 @@ public void testUnsortedExample() { testUnsorted3(new Composition(new OptPFD(), new VariableByte())); testUnsorted3(new Composition(new OptPFDS9(), new VariableByte())); testUnsorted3(new Composition(new OptPFDS16(), new VariableByte())); - testUnsorted3(new Composition(new FastPFOR(128), new VariableByte())); - testUnsorted3(new Composition(new FastPFOR(256), new VariableByte())); + testUnsorted3(new Composition(new FastPFOR128(), new VariableByte())); + testUnsorted3(new Composition(new FastPFOR(), new VariableByte())); testUnsorted2(new IntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte())); @@ -598,21 +600,40 @@ private void testUnsorted3(IntegerCODEC codec) { @Test public void fastPforTest() { // proposed by Stefan Ackermann (https://github.com/Stivo) - for(int n = 128; n<=256;n+=128) { - FastPFOR codec1 = new FastPFOR(n); - FastPFOR codec2 = new FastPFOR(n); - int N = codec1.blockSize; - int[] data = new int[N]; - for (int i = 0; i < N; i++) - data[i] = 0; - data[126] = -1; - int[] comp = TestUtils.compress(codec1, Arrays.copyOf(data, N)); - int[] answer = TestUtils.uncompress(codec2, comp, N); - for (int k = 0; k < N; ++k) - if (answer[k] != data[k]) - throw new RuntimeException("bug " + k + " " + answer[k] - + " != " + data[k]); - } + FastPFOR codec1 = new FastPFOR(); + FastPFOR codec2 = new FastPFOR(); + int N = codec1.blockSize; + int[] data = new int[N]; + for (int i = 0; i < N; i++) + data[i] = 0; + data[126] = -1; + int[] comp = TestUtils.compress(codec1, Arrays.copyOf(data, N)); + int[] answer = TestUtils.uncompress(codec2, comp, N); + for (int k = 0; k < N; ++k) + if (answer[k] != data[k]) + throw new RuntimeException("bug " + k + " " + answer[k] + + " != " + data[k]); + } + + /** + * + */ + @Test + public void fastPfor128Test() { + // proposed by Stefan Ackermann (https://github.com/Stivo) + FastPFOR128 codec1 = new FastPFOR128(); + FastPFOR128 codec2 = new FastPFOR128(); + int N = codec1.blockSize; + int[] data = new int[N]; + for (int i = 0; i < N; i++) + data[i] = 0; + data[126] = -1; + int[] comp = TestUtils.compress(codec1, Arrays.copyOf(data, N)); + int[] answer = TestUtils.uncompress(codec2, comp, N); + for (int k = 0; k < N; ++k) + if (answer[k] != data[k]) + throw new RuntimeException("bug " + k + " " + answer[k] + + " != " + data[k]); } } diff --git a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java index 3e718ae..d965992 100644 --- a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java +++ b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java @@ -22,8 +22,8 @@ public class SkippableBasicTest { new SkippableComposition(new OptPFD(), new VariableByte()), new SkippableComposition(new OptPFDS9(), new VariableByte()), new SkippableComposition(new OptPFDS16(), new VariableByte()), - new SkippableComposition(new FastPFOR(128), new VariableByte()), - new SkippableComposition(new FastPFOR(256), new VariableByte()), + new SkippableComposition(new FastPFOR128(), new VariableByte()), + new SkippableComposition(new FastPFOR(), new VariableByte()), new Simple9(), new Simple16() }; From 33097314f26379b6c97889088fba8e1e5f70703b Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 19 Sep 2014 15:01:15 -0400 Subject: [PATCH 205/412] Missing file --- .../integercompression/FastPFOR128.java | 326 ++++++++++++++++++ 1 file changed, 326 insertions(+) create mode 100644 src/main/java/me/lemire/integercompression/FastPFOR128.java diff --git a/src/main/java/me/lemire/integercompression/FastPFOR128.java b/src/main/java/me/lemire/integercompression/FastPFOR128.java new file mode 100644 index 0000000..0d1738a --- /dev/null +++ b/src/main/java/me/lemire/integercompression/FastPFOR128.java @@ -0,0 +1,326 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ +package me.lemire.integercompression; + +import java.nio.ByteBuffer; +import java.util.Arrays; + +/** + * This class is similar to FastPFOR but uses a small block size. + * + * Note that this does not use differential coding: if you are working on sorted + * lists, use IntegratedFastPFOR instead. + * + * For multi-threaded applications, each thread should use its own FastPFOR + * object. + * + * @author Daniel Lemire + */ +public final class FastPFOR128 implements IntegerCODEC,SkippableIntegerCODEC { + final static int OVERHEAD_OF_EACH_EXCEPT = 8; + /** + * + */ + public final static int DEFAULT_PAGE_SIZE = 65536; + /** + * + */ + public final static int DEFAULT_BLOCK_SIZE = 256; + + final int blockSize = DEFAULT_BLOCK_SIZE; + final int pageSize; + final int[][] dataTobePacked = new int[33][]; + final ByteBuffer byteContainer; + + // Working area for compress and uncompress. + int[] dataPointers; + int[] freqs; + final int[] bestbbestcexceptmaxb = new int[3]; + + /** + * Construct the FastPFOR CODEC. + * + * @param pagesize + * the desired page size (recommended value is FastPFOR.DEFAULT_PAGE_SIZE) + */ + public FastPFOR128(int pagesize) { + pageSize = pagesize; + // Initiate arrrays. + byteContainer = ByteBuffer.allocateDirect(3 * pageSize + / blockSize + pageSize); + for (int k = 1; k < dataTobePacked.length; ++k) + dataTobePacked[k] = new int[pageSize / 32 * 4]; // heuristic + } + /** + * Construct the fastPFOR CODEC with default parameters. + */ + public FastPFOR128() { + this(DEFAULT_PAGE_SIZE); + } + + /** + * Compress data in blocks of BLOCK_SIZE integers (if fewer than BLOCK_SIZE integers + * are provided, nothing is done). + * + * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) + */ + @Override + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + inlength = Util.greatestMultiple(inlength, blockSize); + if (inlength == 0) + return; + + + // Allocate memory for working area. + dataPointers = new int[33]; + freqs = new int[33]; + + final int finalinpos = inpos.get() + inlength; + while (inpos.get() != finalinpos) { + int thissize = Math.min(pageSize, + finalinpos - inpos.get()); + encodePage(in, inpos, thissize, out, outpos); + } + + dataPointers = null; + freqs = null; + } + + private void getBestBFromData(int[] in, int pos) { + Arrays.fill(freqs, 0); + for (int k = pos, k_end = pos + blockSize; k < k_end; ++k) { + freqs[Util.bits(in[k])]++; + } + bestbbestcexceptmaxb[0] = 32; + while (freqs[bestbbestcexceptmaxb[0]] == 0) + bestbbestcexceptmaxb[0]--; + bestbbestcexceptmaxb[2] = bestbbestcexceptmaxb[0]; + int bestcost = bestbbestcexceptmaxb[0] * blockSize; + int cexcept = 0; + bestbbestcexceptmaxb[1] = cexcept; + for (int b = bestbbestcexceptmaxb[0] - 1; b >= 0; --b) { + cexcept += freqs[b + 1]; + if (cexcept == blockSize) + break; + // the extra 8 is the cost of storing maxbits + int thiscost = cexcept * OVERHEAD_OF_EACH_EXCEPT + + cexcept * (bestbbestcexceptmaxb[2] - b) + b + * blockSize + 8; + if(bestbbestcexceptmaxb[2] - b == 1) thiscost -= cexcept; + if (thiscost < bestcost) { + bestcost = thiscost; + bestbbestcexceptmaxb[0] = b; + bestbbestcexceptmaxb[1] = cexcept; + } + } + } + + private void encodePage(int[] in, IntWrapper inpos, int thissize, + int[] out, IntWrapper outpos) { + final int headerpos = outpos.get(); + outpos.increment(); + int tmpoutpos = outpos.get(); + + // Clear working area. + Arrays.fill(dataPointers, 0); + byteContainer.clear(); + + int tmpinpos = inpos.get(); + for (final int finalinpos = tmpinpos + thissize - blockSize; tmpinpos <= finalinpos; tmpinpos += blockSize) { + getBestBFromData(in, tmpinpos); + final int tmpbestb = bestbbestcexceptmaxb[0]; + byteContainer.put((byte)bestbbestcexceptmaxb[0]); + byteContainer.put((byte)bestbbestcexceptmaxb[1]); + if (bestbbestcexceptmaxb[1] > 0) { + byteContainer.put((byte)bestbbestcexceptmaxb[2]); + final int index = bestbbestcexceptmaxb[2] + - bestbbestcexceptmaxb[0]; + if (dataPointers[index] + + bestbbestcexceptmaxb[1] >= dataTobePacked[index].length) { + int newsize = 2 * (dataPointers[index] + bestbbestcexceptmaxb[1]); + // make sure it is a multiple of 32 + newsize = Util + .greatestMultiple(newsize + 31, 32); + dataTobePacked[index] = Arrays.copyOf( + dataTobePacked[index], newsize); + } + for (int k = 0; k < blockSize; ++k) { + if ((in[k + tmpinpos] >>> bestbbestcexceptmaxb[0]) != 0) { + // we have an exception + byteContainer.put((byte) k); + dataTobePacked[index][dataPointers[index]++] = in[k + + tmpinpos] >>> tmpbestb; + } + } + + } + for (int k = 0; k < blockSize; k += 32) { + BitPacking.fastpack(in, tmpinpos + k, out, + tmpoutpos, tmpbestb); + tmpoutpos += tmpbestb; + } + } + inpos.set(tmpinpos); + out[headerpos] = tmpoutpos - headerpos; + final int bytesize = byteContainer.position(); + while ((byteContainer.position() & 3) != 0) + byteContainer.put((byte) 0); + out[tmpoutpos++] = bytesize; + final int howmanyints = byteContainer.position() / 4; + byteContainer.flip(); + byteContainer.asIntBuffer().get(out, tmpoutpos, howmanyints); + tmpoutpos += howmanyints; + int bitmap = 0; + for (int k = 2; k <= 32; ++k) { + if (dataPointers[k] != 0) + bitmap |= (1 << (k - 1)); + } + out[tmpoutpos++] = bitmap; + + for (int k = 2; k <= 32; ++k) { + if (dataPointers[k] != 0) { + out[tmpoutpos++] = dataPointers[k];// size + int j = 0; + for (; j < dataPointers[k]; j += 32) { + BitPacking.fastpack(dataTobePacked[k], + j, out, tmpoutpos, k); + tmpoutpos += k; + } + int overflow = j - dataPointers[k]; + tmpoutpos -= overflow * k / 32; + } + } + outpos.set(tmpoutpos); + } + + /** + * Uncompress data in blocks of integers. In this particular case, + * the inlength parameter is ignored: it is deduced from the compressed + * data. + * + * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) + */ + @Override + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos, int mynvalue) { + if (inlength == 0) + return; + mynvalue = Util.greatestMultiple(mynvalue, blockSize); + + dataPointers = new int[33]; + + int finalout = outpos.get() + mynvalue; + while (outpos.get() != finalout) { + int thissize = Math.min(pageSize, + finalout - outpos.get()); + decodePage(in, inpos, out, outpos, thissize); + } + + dataPointers = null; + } + + private void decodePage(int[] in, IntWrapper inpos, int[] out, + IntWrapper outpos, int thissize) { + final int initpos = inpos.get(); + final int wheremeta = in[inpos.get()]; + inpos.increment(); + int inexcept = initpos + wheremeta; + final int bytesize = in[inexcept++]; + byteContainer.clear(); + byteContainer.asIntBuffer().put(in, inexcept, (bytesize + 3) / 4); + inexcept += (bytesize + 3)/ 4; + + final int bitmap = in[inexcept++]; + for (int k = 2; k <= 32; ++k) { + if ((bitmap & (1 << (k - 1))) != 0) { + int size = in[inexcept++]; + int roundedup = Util + .greatestMultiple(size + 31, 32); + if (dataTobePacked[k].length < roundedup) + dataTobePacked[k] = new int[roundedup]; + if(inexcept + roundedup/32*k <= in.length) { + int j = 0; + for (; j < size; j += 32) { + BitPacking.fastunpack(in, inexcept, + dataTobePacked[k], j, k); + inexcept += k; + } + int overflow = j - size; + inexcept -= overflow * k / 32; + } else { + int j = 0; + int[] buf = new int[roundedup/32*k]; + int initinexcept = inexcept; + System.arraycopy(in, inexcept, buf, 0, in.length - inexcept); + for (; j < size; j += 32) { + BitPacking.fastunpack(buf, inexcept-initinexcept, + dataTobePacked[k], j, k); + inexcept += k; + } + int overflow = j - size; + inexcept -= overflow * k / 32; + } + } + } + Arrays.fill(dataPointers, 0); + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); + + for (int run = 0, run_end = thissize / blockSize; run < run_end; ++run, tmpoutpos += blockSize) { + final int b = byteContainer.get(); + final int cexcept = byteContainer.get() & 0xFF; + for (int k = 0; k < blockSize; k += 32) { + BitPacking.fastunpack(in, tmpinpos, out, + tmpoutpos + k, b); + tmpinpos += b; + } + if (cexcept > 0) { + final int maxbits = byteContainer.get(); + final int index = maxbits - b; + if(index == 1) { + for (int k = 0; k < cexcept; ++k) { + final int pos = byteContainer.get() &0xFF; + out[pos + tmpoutpos] |= 1 << b; + } + } else { + for (int k = 0; k < cexcept; ++k) { + final int pos = byteContainer.get() &0xFF; + final int exceptvalue = dataTobePacked[index][dataPointers[index]++]; + out[pos + tmpoutpos] |= exceptvalue << b; + } + } + } + } + outpos.set(tmpoutpos); + inpos.set(inexcept); + } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + inlength = Util.greatestMultiple(inlength, blockSize); + if (inlength == 0) + return; + out[outpos.get()] = inlength; + outpos.increment(); + headlessCompress(in, inpos, inlength, out, outpos); + } + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + if (inlength == 0) + return; + final int outlength = in[inpos.get()]; + inpos.increment(); + headlessUncompress(in, inpos, inlength, out, outpos, outlength); + } + @Override + public String toString() { + return this.getClass().getSimpleName(); + } +} From 82fb8aa4792eddca5f7a4b570c5f589d75d74cea Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 19 Sep 2014 16:30:18 -0400 Subject: [PATCH 206/412] Preparing new release --- CHANGELOG | 4 ++++ README.md | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 8337abc..2b7cf0d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +0.1.1 (September 19th 2014) + - We now have two versions of FastPFOR (with blocks of 128 ints and 256 ints) and the format was streamlined. + - BinaryPacking and IntegratedBinaryPacking now use a block size of 32 (instead of 128). + 0.1.0 (September 18th 2014) - Introduced skippable versions (for use in a search engine like Terrier) diff --git a/README.md b/README.md index c8ca41b..581ebd9 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ the following code in your pom.xml file: me.lemire.integercompression JavaFastPFOR - 0.1.0 + 0.1.1 From 2707d5c5f9fc9c293e74b90f992eace6cbd407c7 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 19 Sep 2014 16:31:09 -0400 Subject: [PATCH 207/412] Final step before next version --- .../integercompression/BinaryPacking.java | 113 ++++++++++-------- .../lemire/integercompression/FastPFOR.java | 52 +++----- .../integercompression/FastPFOR128.java | 51 +++----- .../benchmarktools/BenchmarkSkippable.java | 10 +- .../differential/IntegratedBinaryPacking.java | 91 +++++--------- .../lemire/integercompression/BasicTest.java | 8 +- .../integercompression/BoundaryTest.java | 7 ++ 7 files changed, 142 insertions(+), 190 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/BinaryPacking.java b/src/main/java/me/lemire/integercompression/BinaryPacking.java index 9d68d2e..94b4534 100644 --- a/src/main/java/me/lemire/integercompression/BinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/BinaryPacking.java @@ -9,7 +9,7 @@ /** * Scheme based on a commonly used idea: can be extremely fast. - * It encodes integers in blocks of 128 integers. For arrays containing + * It encodes integers in blocks of 32 integers. For arrays containing * an arbitrary number of integers, you should use it in conjunction * with another CODEC: * @@ -37,7 +37,7 @@ * @author Daniel Lemire */ public final class BinaryPacking implements IntegerCODEC, SkippableIntegerCODEC { - final static int BLOCK_SIZE = 128; + final static int BLOCK_SIZE = 32; @Override public void compress(int[] in, IntWrapper inpos, int inlength, @@ -53,30 +53,39 @@ public void compress(int[] in, IntWrapper inpos, int inlength, @Override public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); - int tmpoutpos = outpos.get(); - for (int s = inpos.get(); s < inpos.get() + inlength; s += 32 * 4) { - final int mbits1 = Util.maxbits(in, s, 32); - final int mbits2 = Util.maxbits(in, s + 32, 32); - final int mbits3 = Util.maxbits(in, s + 2 * 32, 32); - final int mbits4 = Util.maxbits(in, s + 3 * 32, 32); - out[tmpoutpos++] = (mbits1 << 24) | (mbits2 << 16) - | (mbits3 << 8) | (mbits4); - BitPacking.fastpackwithoutmask(in, s, out, tmpoutpos, - mbits1); - tmpoutpos += mbits1; - BitPacking.fastpackwithoutmask(in, s + 32, out, - tmpoutpos, mbits2); - tmpoutpos += mbits2; - BitPacking.fastpackwithoutmask(in, s + 2 * 32, out, - tmpoutpos, mbits3); - tmpoutpos += mbits3; - BitPacking.fastpackwithoutmask(in, s + 3 * 32, out, - tmpoutpos, mbits4); - tmpoutpos += mbits4; - } - inpos.add(inlength); - outpos.set(tmpoutpos); + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); + int tmpoutpos = outpos.get(); + int s = inpos.get(); + for (; s + BLOCK_SIZE * 4 - 1 < inpos.get() + inlength; s += BLOCK_SIZE * 4) { + final int mbits1 = Util.maxbits(in, s, 32); + final int mbits2 = Util.maxbits(in, s + 32, 32); + final int mbits3 = Util.maxbits(in, s + 2 * 32, 32); + final int mbits4 = Util.maxbits(in, s + 3 * 32, 32); + out[tmpoutpos++] = (mbits1 << 24) | (mbits2 << 16) + | (mbits3 << 8) | (mbits4); + BitPacking.fastpackwithoutmask(in, s, out, tmpoutpos, + mbits1); + tmpoutpos += mbits1; + BitPacking.fastpackwithoutmask(in, s + 32, out, + tmpoutpos, mbits2); + tmpoutpos += mbits2; + BitPacking.fastpackwithoutmask(in, s + 2 * 32, out, + tmpoutpos, mbits3); + tmpoutpos += mbits3; + BitPacking.fastpackwithoutmask(in, s + 3 * 32, out, + tmpoutpos, mbits4); + tmpoutpos += mbits4; + } + for (; s < inpos.get() + inlength; s += BLOCK_SIZE ) { + final int mbits = Util.maxbits(in, s, 32); + out[tmpoutpos++] = mbits; + BitPacking.fastpackwithoutmask(in, s, out, tmpoutpos, + mbits); + tmpoutpos += mbits; + + } + inpos.add(inlength); + outpos.set(tmpoutpos); } @Override @@ -92,29 +101,37 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, @Override public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num) { - final int outlength = Util.greatestMultiple(num, BLOCK_SIZE); - int tmpinpos = inpos.get(); - for (int s = outpos.get(); s < outpos.get() + outlength; s += 32 * 4) { - final int mbits1 = (in[tmpinpos] >>> 24); - final int mbits2 = (in[tmpinpos] >>> 16) & 0xFF; - final int mbits3 = (in[tmpinpos] >>> 8) & 0xFF; - final int mbits4 = (in[tmpinpos]) & 0xFF; - ++tmpinpos; - BitPacking.fastunpack(in, tmpinpos, out, s, mbits1); - tmpinpos += mbits1; - BitPacking - .fastunpack(in, tmpinpos, out, s + 32, mbits2); - tmpinpos += mbits2; - BitPacking.fastunpack(in, tmpinpos, out, s + 2 * 32, - mbits3); - tmpinpos += mbits3; - BitPacking.fastunpack(in, tmpinpos, out, s + 3 * 32, - mbits4); - tmpinpos += mbits4; - } - outpos.add(outlength); - inpos.set(tmpinpos); + final int outlength = Util.greatestMultiple(num, BLOCK_SIZE); + int tmpinpos = inpos.get(); + int s = outpos.get(); + for (; s + BLOCK_SIZE * 4 - 1 < outpos.get() + outlength; s += BLOCK_SIZE * 4) { + final int mbits1 = (in[tmpinpos] >>> 24); + final int mbits2 = (in[tmpinpos] >>> 16) & 0xFF; + final int mbits3 = (in[tmpinpos] >>> 8) & 0xFF; + final int mbits4 = (in[tmpinpos]) & 0xFF; + ++tmpinpos; + BitPacking.fastunpack(in, tmpinpos, out, s, mbits1); + tmpinpos += mbits1; + BitPacking + .fastunpack(in, tmpinpos, out, s + 32, mbits2); + tmpinpos += mbits2; + BitPacking.fastunpack(in, tmpinpos, out, s + 2 * 32, + mbits3); + tmpinpos += mbits3; + BitPacking.fastunpack(in, tmpinpos, out, s + 3 * 32, + mbits4); + tmpinpos += mbits4; + } + for (; s < outpos.get() + outlength; s += BLOCK_SIZE ) { + final int mbits = in[tmpinpos]; + ++tmpinpos; + BitPacking.fastunpack(in, tmpinpos, out, s, mbits); + tmpinpos += mbits; + } + outpos.add(outlength); + inpos.set(tmpinpos); } + @Override public String toString() { return this.getClass().getSimpleName(); diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 40b07cb..d8baa57 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -46,17 +46,17 @@ public final class FastPFOR implements IntegerCODEC,SkippableIntegerCODEC { /** * */ - public final static int DEFAULT_BLOCK_SIZE = 256; + public final static int BLOCK_SIZE = 256; - final int blockSize = DEFAULT_BLOCK_SIZE; final int pageSize; final int[][] dataTobePacked = new int[33][]; final ByteBuffer byteContainer; // Working area for compress and uncompress. - int[] dataPointers; - int[] freqs; + final int[] dataPointers = new int[33]; + final int[] freqs = new int[33]; final int[] bestbbestcexceptmaxb = new int[3]; + /** * Construct the FastPFOR CODEC. @@ -68,7 +68,7 @@ private FastPFOR(int pagesize) { pageSize = pagesize; // Initiate arrrays. byteContainer = ByteBuffer.allocateDirect(3 * pageSize - / blockSize + pageSize); + / BLOCK_SIZE + pageSize); for (int k = 1; k < dataTobePacked.length; ++k) dataTobePacked[k] = new int[pageSize / 32 * 4]; // heuristic } @@ -89,15 +89,9 @@ public FastPFOR() { @Override public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = Util.greatestMultiple(inlength, blockSize); - if (inlength == 0) - return; - - + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); // Allocate memory for working area. - dataPointers = new int[33]; - freqs = new int[33]; - + final int finalinpos = inpos.get() + inlength; while (inpos.get() != finalinpos) { int thissize = Math.min(pageSize, @@ -105,30 +99,29 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, encodePage(in, inpos, thissize, out, outpos); } - dataPointers = null; - freqs = null; + } private void getBestBFromData(int[] in, int pos) { Arrays.fill(freqs, 0); - for (int k = pos, k_end = pos + blockSize; k < k_end; ++k) { + for (int k = pos, k_end = pos + BLOCK_SIZE; k < k_end; ++k) { freqs[Util.bits(in[k])]++; } bestbbestcexceptmaxb[0] = 32; while (freqs[bestbbestcexceptmaxb[0]] == 0) bestbbestcexceptmaxb[0]--; bestbbestcexceptmaxb[2] = bestbbestcexceptmaxb[0]; - int bestcost = bestbbestcexceptmaxb[0] * blockSize; + int bestcost = bestbbestcexceptmaxb[0] * BLOCK_SIZE; int cexcept = 0; bestbbestcexceptmaxb[1] = cexcept; for (int b = bestbbestcexceptmaxb[0] - 1; b >= 0; --b) { cexcept += freqs[b + 1]; - if (cexcept == blockSize) + if (cexcept == BLOCK_SIZE) break; // the extra 8 is the cost of storing maxbits int thiscost = cexcept * OVERHEAD_OF_EACH_EXCEPT + cexcept * (bestbbestcexceptmaxb[2] - b) + b - * blockSize + 8; + * BLOCK_SIZE + 8; if(bestbbestcexceptmaxb[2] - b == 1) thiscost -= cexcept; if (thiscost < bestcost) { bestcost = thiscost; @@ -149,7 +142,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, byteContainer.clear(); int tmpinpos = inpos.get(); - for (final int finalinpos = tmpinpos + thissize - blockSize; tmpinpos <= finalinpos; tmpinpos += blockSize) { + for (final int finalinpos = tmpinpos + thissize - BLOCK_SIZE; tmpinpos <= finalinpos; tmpinpos += BLOCK_SIZE) { getBestBFromData(in, tmpinpos); final int tmpbestb = bestbbestcexceptmaxb[0]; byteContainer.put((byte)bestbbestcexceptmaxb[0]); @@ -167,7 +160,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, dataTobePacked[index] = Arrays.copyOf( dataTobePacked[index], newsize); } - for (int k = 0; k < blockSize; ++k) { + for (int k = 0; k < BLOCK_SIZE; ++k) { if ((in[k + tmpinpos] >>> bestbbestcexceptmaxb[0]) != 0) { // we have an exception byteContainer.put((byte) k); @@ -177,7 +170,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, } } - for (int k = 0; k < blockSize; k += 32) { + for (int k = 0; k < BLOCK_SIZE; k += 32) { BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, tmpbestb); tmpoutpos += tmpbestb; @@ -226,20 +219,13 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, @Override public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int mynvalue) { - if (inlength == 0) - return; - mynvalue = Util.greatestMultiple(mynvalue, blockSize); - - dataPointers = new int[33]; - + mynvalue = Util.greatestMultiple(mynvalue, BLOCK_SIZE); int finalout = outpos.get() + mynvalue; while (outpos.get() != finalout) { int thissize = Math.min(pageSize, finalout - outpos.get()); decodePage(in, inpos, out, outpos, thissize); } - - dataPointers = null; } private void decodePage(int[] in, IntWrapper inpos, int[] out, @@ -289,10 +275,10 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, int tmpoutpos = outpos.get(); int tmpinpos = inpos.get(); - for (int run = 0, run_end = thissize / blockSize; run < run_end; ++run, tmpoutpos += blockSize) { + for (int run = 0, run_end = thissize / BLOCK_SIZE; run < run_end; ++run, tmpoutpos += BLOCK_SIZE) { final int b = byteContainer.get(); final int cexcept = byteContainer.get() & 0xFF; - for (int k = 0; k < blockSize; k += 32) { + for (int k = 0; k < BLOCK_SIZE; k += 32) { BitPacking.fastunpack(in, tmpinpos, out, tmpoutpos + k, b); tmpinpos += b; @@ -320,7 +306,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = Util.greatestMultiple(inlength, blockSize); + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); if (inlength == 0) return; out[outpos.get()] = inlength; diff --git a/src/main/java/me/lemire/integercompression/FastPFOR128.java b/src/main/java/me/lemire/integercompression/FastPFOR128.java index 0d1738a..ac7cb51 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR128.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR128.java @@ -29,18 +29,17 @@ public final class FastPFOR128 implements IntegerCODEC,SkippableIntegerCODEC { /** * */ - public final static int DEFAULT_BLOCK_SIZE = 256; + public final static int BLOCK_SIZE = 128; - final int blockSize = DEFAULT_BLOCK_SIZE; final int pageSize; final int[][] dataTobePacked = new int[33][]; final ByteBuffer byteContainer; // Working area for compress and uncompress. - int[] dataPointers; - int[] freqs; + final int[] dataPointers = new int[33]; + final int[] freqs = new int[33]; final int[] bestbbestcexceptmaxb = new int[3]; - + /** * Construct the FastPFOR CODEC. * @@ -51,7 +50,7 @@ public FastPFOR128(int pagesize) { pageSize = pagesize; // Initiate arrrays. byteContainer = ByteBuffer.allocateDirect(3 * pageSize - / blockSize + pageSize); + / BLOCK_SIZE + pageSize); for (int k = 1; k < dataTobePacked.length; ++k) dataTobePacked[k] = new int[pageSize / 32 * 4]; // heuristic } @@ -71,46 +70,35 @@ public FastPFOR128() { @Override public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = Util.greatestMultiple(inlength, blockSize); - if (inlength == 0) - return; - - - // Allocate memory for working area. - dataPointers = new int[33]; - freqs = new int[33]; - + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); final int finalinpos = inpos.get() + inlength; while (inpos.get() != finalinpos) { int thissize = Math.min(pageSize, finalinpos - inpos.get()); encodePage(in, inpos, thissize, out, outpos); } - - dataPointers = null; - freqs = null; } private void getBestBFromData(int[] in, int pos) { Arrays.fill(freqs, 0); - for (int k = pos, k_end = pos + blockSize; k < k_end; ++k) { + for (int k = pos, k_end = pos + BLOCK_SIZE; k < k_end; ++k) { freqs[Util.bits(in[k])]++; } bestbbestcexceptmaxb[0] = 32; while (freqs[bestbbestcexceptmaxb[0]] == 0) bestbbestcexceptmaxb[0]--; bestbbestcexceptmaxb[2] = bestbbestcexceptmaxb[0]; - int bestcost = bestbbestcexceptmaxb[0] * blockSize; + int bestcost = bestbbestcexceptmaxb[0] * BLOCK_SIZE; int cexcept = 0; bestbbestcexceptmaxb[1] = cexcept; for (int b = bestbbestcexceptmaxb[0] - 1; b >= 0; --b) { cexcept += freqs[b + 1]; - if (cexcept == blockSize) + if (cexcept == BLOCK_SIZE) break; // the extra 8 is the cost of storing maxbits int thiscost = cexcept * OVERHEAD_OF_EACH_EXCEPT + cexcept * (bestbbestcexceptmaxb[2] - b) + b - * blockSize + 8; + * BLOCK_SIZE + 8; if(bestbbestcexceptmaxb[2] - b == 1) thiscost -= cexcept; if (thiscost < bestcost) { bestcost = thiscost; @@ -131,7 +119,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, byteContainer.clear(); int tmpinpos = inpos.get(); - for (final int finalinpos = tmpinpos + thissize - blockSize; tmpinpos <= finalinpos; tmpinpos += blockSize) { + for (final int finalinpos = tmpinpos + thissize - BLOCK_SIZE; tmpinpos <= finalinpos; tmpinpos += BLOCK_SIZE) { getBestBFromData(in, tmpinpos); final int tmpbestb = bestbbestcexceptmaxb[0]; byteContainer.put((byte)bestbbestcexceptmaxb[0]); @@ -149,7 +137,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, dataTobePacked[index] = Arrays.copyOf( dataTobePacked[index], newsize); } - for (int k = 0; k < blockSize; ++k) { + for (int k = 0; k < BLOCK_SIZE; ++k) { if ((in[k + tmpinpos] >>> bestbbestcexceptmaxb[0]) != 0) { // we have an exception byteContainer.put((byte) k); @@ -159,7 +147,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, } } - for (int k = 0; k < blockSize; k += 32) { + for (int k = 0; k < BLOCK_SIZE; k += 32) { BitPacking.fastpack(in, tmpinpos + k, out, tmpoutpos, tmpbestb); tmpoutpos += tmpbestb; @@ -210,18 +198,13 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int mynvalue) { if (inlength == 0) return; - mynvalue = Util.greatestMultiple(mynvalue, blockSize); - - dataPointers = new int[33]; - + mynvalue = Util.greatestMultiple(mynvalue, BLOCK_SIZE); int finalout = outpos.get() + mynvalue; while (outpos.get() != finalout) { int thissize = Math.min(pageSize, finalout - outpos.get()); decodePage(in, inpos, out, outpos, thissize); } - - dataPointers = null; } private void decodePage(int[] in, IntWrapper inpos, int[] out, @@ -271,10 +254,10 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, int tmpoutpos = outpos.get(); int tmpinpos = inpos.get(); - for (int run = 0, run_end = thissize / blockSize; run < run_end; ++run, tmpoutpos += blockSize) { + for (int run = 0, run_end = thissize / BLOCK_SIZE; run < run_end; ++run, tmpoutpos += BLOCK_SIZE) { final int b = byteContainer.get(); final int cexcept = byteContainer.get() & 0xFF; - for (int k = 0; k < blockSize; k += 32) { + for (int k = 0; k < BLOCK_SIZE; k += 32) { BitPacking.fastunpack(in, tmpinpos, out, tmpoutpos + k, b); tmpinpos += b; @@ -302,7 +285,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - inlength = Util.greatestMultiple(inlength, blockSize); + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); if (inlength == 0) return; out[outpos.get()] = inlength; diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java index 4475b62..58bbc4a 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java @@ -100,8 +100,6 @@ private static int decompressFromSkipTable(Object c, int[] compressed, ((SkippableIntegratedIntegerCODEC) c).headlessUncompress( compressed, compressedpos, compressed.length - uncomppos.get(), data, uncomppos, num, ival); - // System.out.println("compressedpos = "+compressedpos); - } else { throw new RuntimeException("Unrecognized codec " + c); } @@ -291,10 +289,7 @@ private static int[][] generateTestData(ClusteredDataGenerator dataGen, } static Object[] codecs = { - new SkippableComposition(new FastPFOR128(), new VariableByte()), - new SkippableComposition(new FastPFOR(), new VariableByte()), - new SkippableComposition(new OptPFD(), new VariableByte()), - /* + new SkippableIntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte()), new JustCopy(), new VariableByte(), @@ -306,7 +301,8 @@ private static int[][] generateTestData(ClusteredDataGenerator dataGen, new SkippableComposition(new OptPFDS9(), new VariableByte()), new SkippableComposition(new OptPFDS16(), new VariableByte()), new SkippableComposition(new FastPFOR(), new VariableByte()), - new Simple9(), new Simple16()*/ }; + new SkippableComposition(new FastPFOR128(), new VariableByte()), + new Simple9(), new Simple16() }; /** * Generates data and calls other tests. diff --git a/src/main/java/me/lemire/integercompression/differential/IntegratedBinaryPacking.java b/src/main/java/me/lemire/integercompression/differential/IntegratedBinaryPacking.java index 7c3bbf9..6d281c7 100644 --- a/src/main/java/me/lemire/integercompression/differential/IntegratedBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedBinaryPacking.java @@ -16,7 +16,7 @@ * You should only use this scheme on sorted arrays. Use BinaryPacking if you * have unsorted arrays. * - * It encodes integers in blocks of 128 integers. For arrays containing an + * It encodes integers in blocks of 32 integers. For arrays containing an * arbitrary number of integers, you should use it in conjunction with another * CODEC: * @@ -48,7 +48,7 @@ public class IntegratedBinaryPacking implements IntegratedIntegerCODEC, SkippableIntegratedIntegerCODEC { - static final int BLOCK_SIZE = 128; + static final int BLOCK_SIZE = 32; @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, @@ -58,36 +58,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, return; out[outpos.get()] = inlength; outpos.increment(); - int tmpoutpos = outpos.get(); - int initoffset = 0; - for (int s = inpos.get(); s < inpos.get() + inlength; s += 32 * 4) { - final int mbits1 = Util.maxdiffbits(initoffset, in, s, 32); - int initoffset2 = in[s + 31]; - final int mbits2 = Util.maxdiffbits(initoffset2, in, s + 32, 32); - int initoffset3 = in[s + 32 + 31]; - final int mbits3 = Util - .maxdiffbits(initoffset3, in, s + 2 * 32, 32); - int initoffset4 = in[s + 2 * 32 + 31]; - final int mbits4 = Util - .maxdiffbits(initoffset4, in, s + 3 * 32, 32); - out[tmpoutpos++] = (mbits1 << 24) | (mbits2 << 16) | (mbits3 << 8) - | (mbits4); - IntegratedBitPacking.integratedpack(initoffset, in, s, out, - tmpoutpos, mbits1); - tmpoutpos += mbits1; - IntegratedBitPacking.integratedpack(initoffset2, in, s + 32, out, - tmpoutpos, mbits2); - tmpoutpos += mbits2; - IntegratedBitPacking.integratedpack(initoffset3, in, s + 2 * 32, - out, tmpoutpos, mbits3); - tmpoutpos += mbits3; - IntegratedBitPacking.integratedpack(initoffset4, in, s + 3 * 32, - out, tmpoutpos, mbits4); - tmpoutpos += mbits4; - initoffset = in[s + 3 * 32 + 31]; - } - inpos.add(inlength); - outpos.set(tmpoutpos); + headlessCompress(in, inpos, inlength, out, outpos, new IntWrapper(0)); } @Override @@ -97,33 +68,7 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, return; final int outlength = in[inpos.get()]; inpos.increment(); - int tmpinpos = inpos.get(); - int initoffset = 0; - for (int s = outpos.get(); s < outpos.get() + outlength; s += 32 * 4) { - final int mbits1 = (in[tmpinpos] >>> 24); - final int mbits2 = (in[tmpinpos] >>> 16) & 0xFF; - final int mbits3 = (in[tmpinpos] >>> 8) & 0xFF; - final int mbits4 = (in[tmpinpos]) & 0xFF; - ++tmpinpos; - IntegratedBitPacking.integratedunpack(initoffset, in, tmpinpos, - out, s, mbits1); - tmpinpos += mbits1; - initoffset = out[s + 31]; - IntegratedBitPacking.integratedunpack(initoffset, in, tmpinpos, - out, s + 32, mbits2); - tmpinpos += mbits2; - initoffset = out[s + 32 + 31]; - IntegratedBitPacking.integratedunpack(initoffset, in, tmpinpos, - out, s + 2 * 32, mbits3); - tmpinpos += mbits3; - initoffset = out[s + 2 * 32 + 31]; - IntegratedBitPacking.integratedunpack(initoffset, in, tmpinpos, - out, s + 3 * 32, mbits4); - tmpinpos += mbits4; - initoffset = out[s + 3 * 32 + 31]; - } - outpos.add(outlength); - inpos.set(tmpinpos); + headlessUncompress(in,inpos,inlength,out,outpos,outlength, new IntWrapper(0)); } @Override @@ -140,8 +85,8 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int tmpoutpos = outpos.get(); int initoffset = initvalue.get(); initvalue.set(in[inpos.get()+inlength -1]); - - for (int s = inpos.get(); s < inpos.get() + inlength; s += 32 * 4) { + int s = inpos.get(); + for (; s + BLOCK_SIZE * 4 - 1 < inpos.get() + inlength; s += BLOCK_SIZE * 4) { final int mbits1 = Util.maxdiffbits(initoffset, in, s, 32); int initoffset2 = in[s + 31]; final int mbits2 = Util.maxdiffbits(initoffset2, in, s + 32, 32); @@ -167,6 +112,15 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, tmpoutpos += mbits4; initoffset = in[s + 3 * 32 + 31]; } + for (; s < inpos.get() + inlength; s += BLOCK_SIZE ) { + + final int mbits = Util.maxdiffbits(initoffset, in, s, 32); + out[tmpoutpos++] = mbits; + IntegratedBitPacking.integratedpack(initoffset, in, s, out, + tmpoutpos, mbits); + tmpoutpos += mbits; + initoffset = in[s + 31]; + } inpos.add(inlength); outpos.set(tmpoutpos); } @@ -177,7 +131,8 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, final int outlength = num; int tmpinpos = inpos.get(); int initoffset = initvalue.get(); - for (int s = outpos.get(); s < outpos.get() + outlength; s += 32 * 4) { + int s = outpos.get(); + for (; s + BLOCK_SIZE * 4 - 1 < outpos.get() + outlength; s += BLOCK_SIZE * 4) { final int mbits1 = (in[tmpinpos] >>> 24); final int mbits2 = (in[tmpinpos] >>> 16) & 0xFF; final int mbits3 = (in[tmpinpos] >>> 8) & 0xFF; @@ -200,9 +155,17 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, tmpinpos += mbits4; initoffset = out[s + 3 * 32 + 31]; } + for (; s < outpos.get() + outlength; s += BLOCK_SIZE) { + final int mbits = in[tmpinpos]; + ++tmpinpos; + IntegratedBitPacking.integratedunpack(initoffset, in, tmpinpos, + out, s, mbits); + initoffset = out[s + 31]; + + tmpinpos += mbits; + } outpos.add(outlength); - initvalue.set(out[outpos.get()-1]); + initvalue.set(initoffset); inpos.set(tmpinpos); - } } diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 6a10f7f..70884b2 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -348,7 +348,7 @@ private static void testSpurious(IntegerCODEC c) { int[] y = new int[0]; IntWrapper i0 = new IntWrapper(0); IntWrapper i1 = new IntWrapper(0); - for (int inlength = 0; inlength < 128; ++inlength) { + for (int inlength = 0; inlength < 32; ++inlength) { c.compress(x, i0, inlength, y, i1); assertEquals(0, i1.intValue()); } @@ -531,7 +531,7 @@ public void testUnsortedExample() { * provided codec */ public void testUnsorted(IntegerCODEC codec) { - int[] lengths = { 133, 1333333 }; + int[] lengths = { 133, 1026, 1333333 }; for (int N : lengths) { int[] data = new int[N]; // initialize the data (most will be small) @@ -602,7 +602,7 @@ public void fastPforTest() { // proposed by Stefan Ackermann (https://github.com/Stivo) FastPFOR codec1 = new FastPFOR(); FastPFOR codec2 = new FastPFOR(); - int N = codec1.blockSize; + int N = FastPFOR.BLOCK_SIZE; int[] data = new int[N]; for (int i = 0; i < N; i++) data[i] = 0; @@ -623,7 +623,7 @@ public void fastPfor128Test() { // proposed by Stefan Ackermann (https://github.com/Stivo) FastPFOR128 codec1 = new FastPFOR128(); FastPFOR128 codec2 = new FastPFOR128(); - int N = codec1.blockSize; + int N = FastPFOR128.BLOCK_SIZE; int[] data = new int[N]; for (int i = 0; i < N; i++) data[i] = 0; diff --git a/src/test/java/me/lemire/integercompression/BoundaryTest.java b/src/test/java/me/lemire/integercompression/BoundaryTest.java index 2a52bf9..ede2e9f 100644 --- a/src/test/java/me/lemire/integercompression/BoundaryTest.java +++ b/src/test/java/me/lemire/integercompression/BoundaryTest.java @@ -46,7 +46,13 @@ private static void compressAndUncompress(int length, IntegerCODEC c) { } assertArrayEquals(source, target); } + private static void around32(IntegerCODEC c) { + compressAndUncompress(31, c); + compressAndUncompress(32, c); + compressAndUncompress(33, c); + } + private static void around128(IntegerCODEC c) { compressAndUncompress(127, c); compressAndUncompress(128, c); @@ -60,6 +66,7 @@ private static void around256(IntegerCODEC c) { } private static void testBoundary(IntegerCODEC c) { + around32(c); around128(c); around256(c); } From 60d40ee0b5de8f07873cfad74b065191714cab70 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 19 Sep 2014 16:33:44 -0400 Subject: [PATCH 208/412] [maven-release-plugin] prepare release JavaFastPFOR-0.1.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0d7509d..241c61d 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.1.1-SNAPSHOT + 0.1.1 jar From 1d515a402f62777289e657608b16a7a7de27829f Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 19 Sep 2014 16:33:46 -0400 Subject: [PATCH 209/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 241c61d..b0bdf3d 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.1.1 + 0.1.2-SNAPSHOT jar From 4de95de44da46450b3e51d324c189a425e742a37 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 19 Sep 2014 23:53:45 -0400 Subject: [PATCH 210/412] Minor cleaning --- src/main/java/me/lemire/integercompression/BitPacking.java | 7 ------- .../java/me/lemire/integercompression/FastPFOR128.java | 2 ++ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/BitPacking.java b/src/main/java/me/lemire/integercompression/BitPacking.java index ee71fbd..e83c9e0 100644 --- a/src/main/java/me/lemire/integercompression/BitPacking.java +++ b/src/main/java/me/lemire/integercompression/BitPacking.java @@ -144,13 +144,6 @@ public static void fastpack(final int[] in, final int inpos, default: throw new IllegalArgumentException( "Unsupported bit width."); - /** - * @param in - * @param inpos - * @param out - * @param outpos - * @param bit - */ } } diff --git a/src/main/java/me/lemire/integercompression/FastPFOR128.java b/src/main/java/me/lemire/integercompression/FastPFOR128.java index ac7cb51..53afb07 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR128.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR128.java @@ -282,6 +282,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, outpos.set(tmpoutpos); inpos.set(inexcept); } + @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { @@ -302,6 +303,7 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, inpos.increment(); headlessUncompress(in, inpos, inlength, out, outpos, outlength); } + @Override public String toString() { return this.getClass().getSimpleName(); From 8bd3021d16b4d3bcfa0dbd8e38ee354cbdeee155 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 20 Oct 2014 20:16:25 -0400 Subject: [PATCH 211/412] Fixing compatibility and preparing new release. --- CHANGELOG | 2 ++ README.md | 2 +- src/main/java/me/lemire/integercompression/FastPFOR.java | 2 ++ src/main/java/me/lemire/integercompression/FastPFOR128.java | 2 ++ 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 2b7cf0d..b589bbb 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,5 @@ +0.1.2 (October 20th 2014) + - Fix a compatibility issue with the C++ version. 0.1.1 (September 19th 2014) - We now have two versions of FastPFOR (with blocks of 128 ints and 256 ints) and the format was streamlined. - BinaryPacking and IntegratedBinaryPacking now use a block size of 32 (instead of 128). diff --git a/README.md b/README.md index 581ebd9..92ef7bf 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ the following code in your pom.xml file: me.lemire.integercompression JavaFastPFOR - 0.1.1 + 0.1.2 diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index d8baa57..314c9f9 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -7,6 +7,7 @@ package me.lemire.integercompression; import java.nio.ByteBuffer; +import java.nio.ByteOrder; import java.util.Arrays; /** @@ -69,6 +70,7 @@ private FastPFOR(int pagesize) { // Initiate arrrays. byteContainer = ByteBuffer.allocateDirect(3 * pageSize / BLOCK_SIZE + pageSize); + byteContainer.order(ByteOrder.LITTLE_ENDIAN); for (int k = 1; k < dataTobePacked.length; ++k) dataTobePacked[k] = new int[pageSize / 32 * 4]; // heuristic } diff --git a/src/main/java/me/lemire/integercompression/FastPFOR128.java b/src/main/java/me/lemire/integercompression/FastPFOR128.java index 53afb07..50ccc2d 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR128.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR128.java @@ -7,6 +7,7 @@ package me.lemire.integercompression; import java.nio.ByteBuffer; +import java.nio.ByteOrder; import java.util.Arrays; /** @@ -51,6 +52,7 @@ public FastPFOR128(int pagesize) { // Initiate arrrays. byteContainer = ByteBuffer.allocateDirect(3 * pageSize / BLOCK_SIZE + pageSize); + byteContainer.order(ByteOrder.LITTLE_ENDIAN); for (int k = 1; k < dataTobePacked.length; ++k) dataTobePacked[k] = new int[pageSize / 32 * 4]; // heuristic } From 20252430acb34120a2cd168a35652316fd5548d7 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 20 Oct 2014 20:18:35 -0400 Subject: [PATCH 212/412] [maven-release-plugin] prepare release JavaFastPFOR-0.1.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b0bdf3d..5e333eb 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.1.2-SNAPSHOT + 0.1.2 jar From c14ec140b6379cd876c26a7b0ef4bcb022a103fa Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 20 Oct 2014 20:18:38 -0400 Subject: [PATCH 213/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5e333eb..134d6f0 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.1.2 + 0.1.3-SNAPSHOT jar From 47bb19b6ff4e7bd97e34bcd4b8b5799ec9429efb Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 4 Nov 2014 15:27:55 -0500 Subject: [PATCH 214/412] Minor cleaning regarding VByte --- .../java/me/lemire/integercompression/VariableByte.java | 6 +++--- .../differential/IntegratedVariableByte.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/VariableByte.java b/src/main/java/me/lemire/integercompression/VariableByte.java index 63de721..8e3ce12 100644 --- a/src/main/java/me/lemire/integercompression/VariableByte.java +++ b/src/main/java/me/lemire/integercompression/VariableByte.java @@ -155,12 +155,12 @@ public void uncompress(byte[] in, IntWrapper inpos, int inlength, continue; } v = ((in[p + 2] & 0x7F) << 14) | v; - if ((in[p + 2] & 128) == 128) { + if (in[p + 2] < 0 ) { p += 3; continue; } v = ((in[p + 3] & 0x7F) << 21) | v; - if ((in[p + 3] & 128) == 128) { + if (in[p + 3] < 0) { p += 4; continue; } @@ -186,7 +186,7 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] o int finaloutpos = num + tmpoutpos; for (int v = 0, shift = 0; tmpoutpos < finaloutpos;) { val = in[p]; - int c = (byte) (val >>> s); + int c = val >>> s; s += 8; p += s>>5; s = s & 31; diff --git a/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java b/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java index 74de784..d94644c 100644 --- a/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java @@ -159,12 +159,12 @@ public void uncompress(byte[] in, IntWrapper inpos, int inlength, continue; } v = ((in[p+2] & 0x7F)<<14) | v; - if ((in[p+2]& 128) == 128) { + if (in[p+2] < 0) { p+= 3; continue; } v = ((in[p+3] & 0x7F)<<21) | v; - if ((in[p+3] & 128) == 128) { + if (in[p+3] < 0) { p+= 4; continue; } @@ -235,7 +235,7 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int finaloutpos = num + tmpoutpos; for (int v = 0, shift = 0; tmpoutpos < finaloutpos;) { val = in[p]; - int c = (byte) (val >>> s); + int c = val >>> s; s += 8; p += s>>5; s = s & 31; From ddcea20b77fb7121d805e692b6c4772bc74ad991 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 4 Nov 2014 19:02:12 -0500 Subject: [PATCH 215/412] Minor reformatting. --- .../integercompression/differential/IntegratedVariableByte.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java b/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java index d94644c..4352ebb 100644 --- a/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java @@ -149,7 +149,7 @@ public void uncompress(byte[] in, IntWrapper inpos, int inlength, int tmpoutpos = outpos.get(); for (int v = 0;p < finalp; out[tmpoutpos++] = (initoffset = initoffset + v)) { v = in[p] & 0x7F; - if (in[p] <0 ) { + if (in[p] < 0 ) { p+= 1; continue; } From 127f389d475abe47cac18bb735f6c733d02f4922 Mon Sep 17 00:00:00 2001 From: jkirsch Date: Thu, 16 Apr 2015 19:10:01 +0200 Subject: [PATCH 216/412] Update exec-maven-plugin main class Benchmark class is relocated, update references to match the correct location --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 134d6f0..625b16a 100644 --- a/pom.xml +++ b/pom.xml @@ -82,9 +82,9 @@ exec-maven-plugin 1.1 - me.lemire.integercompression.Benchmark + me.lemire.integercompression.benchmarktools.Benchmark From 1098ab17b4aea8f2532e8e127fa24ea8029eeb38 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 22 Apr 2015 11:26:25 -0400 Subject: [PATCH 217/412] Updating ref. list --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 92ef7bf..522aa96 100644 --- a/README.md +++ b/README.md @@ -156,13 +156,13 @@ This library was a key ingredient in the best paper at ECIR 2014 : Matteo Catena, Craig Macdonald, Iadh Ounis, On Inverted Index Compression for Search Engine Efficiency, Lecture Notes in Computer Science 8416 (ECIR 2014), 2014. http://dx.doi.org/10.1007/978-3-319-06028-6_30 -We wrote a research paper which documents many of the CODECs implemented here: +We wrote several research papers documenting many of the CODECs implemented here: -Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second through vectorization, Software Pratice & Experience (to appear) -http://arxiv.org/abs/1209.2137 +* Daniel Lemire, Leonid Boytsov, Nathan Kurz, SIMD Compression and the Intersection of Sorted Integers, Software Practice & Experience (to appear) http://arxiv.org/abs/1401.6399 +* Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second through vectorization, Software Practice & Experience 45 (1), 2015. http://arxiv.org/abs/1209.2137 http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract +* Jeff Plaisance, Nathan Kurz, Daniel Lemire, Vectorized VByte Decoding, International Symposium on Web Algorithms 2015, 2015. http://arxiv.org/abs/1503.07387 +* Wayne Xin Zhao, Xudong Zhang, Daniel Lemire, Dongdong Shan, Jian-Yun Nie, Hongfei Yan, Ji-Rong Wen, A General SIMD-based Approach to Accelerating Compression Algorithms, ACM Transactions on Information Systems 33 (3), 2015. http://arxiv.org/abs/1502.01916 -Daniel Lemire, Leonid Boytsov, Nathan Kurz, SIMD Compression and the Intersection of Sorted Integers, arXiv:1401.6399, 2014 -http://arxiv.org/abs/1401.6399 Ikhtear Sharif wrote his M.Sc. thesis on this library: From 7d6c98d37f003b42746ac1444ae04e37ef436648 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 29 Apr 2015 09:18:47 -0400 Subject: [PATCH 218/412] Trying new badges. --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 522aa96..1690394 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -JavaFastPFOR: A simple integer compression library in Java [![Build Status](https://travis-ci.org/lemire/JavaFastPFOR.png)](https://travis-ci.org/lemire/JavaFastPFOR) +JavaFastPFOR: A simple integer compression library in Java [![Build Status](https://travis-ci.org/lemire/JavaFastPFOR.png)](https://travis-ci.org/lemire/JavaFastPFOR) [![][maven img]][maven] [![][license img]][license] ========================================================== License @@ -176,3 +176,10 @@ Funding ----------- This work was supported by NSERC grant number 26143. + + +[maven img]:https://maven-badges.herokuapp.com/maven-central/me.lemire.integercompression/JavaFastPFOR/badge.svg +[maven]:http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22me.lemire.integercompression%22%20 + +[license]:LICENSE +[license img]:https://img.shields.io/badge/License-Apache%202-blue.svg From 12cfa0f108a19cc9986b0d310fa4066ff34c40d8 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 29 Apr 2015 09:19:23 -0400 Subject: [PATCH 219/412] Moving badges. --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1690394..b597044 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ -JavaFastPFOR: A simple integer compression library in Java [![Build Status](https://travis-ci.org/lemire/JavaFastPFOR.png)](https://travis-ci.org/lemire/JavaFastPFOR) [![][maven img]][maven] [![][license img]][license] +JavaFastPFOR: A simple integer compression library in Java ========================================================== +[![Build Status](https://travis-ci.org/lemire/JavaFastPFOR.png)](https://travis-ci.org/lemire/JavaFastPFOR) [![][maven img]][maven] [![][license img]][license] + License ------- From 56fd1266d93696a66122066946949a3b4a851e74 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 29 Apr 2015 09:25:31 -0400 Subject: [PATCH 220/412] Added doc badge. --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b597044..ad63742 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ JavaFastPFOR: A simple integer compression library in Java ========================================================== -[![Build Status](https://travis-ci.org/lemire/JavaFastPFOR.png)](https://travis-ci.org/lemire/JavaFastPFOR) [![][maven img]][maven] [![][license img]][license] +[![Build Status](https://travis-ci.org/lemire/JavaFastPFOR.png)](https://travis-ci.org/lemire/JavaFastPFOR) [![][maven img]][maven] [![][license img]][license] [![docs-badge][]][docs] License ------- @@ -185,3 +185,6 @@ This work was supported by NSERC grant number 26143. [license]:LICENSE [license img]:https://img.shields.io/badge/License-Apache%202-blue.svg + +[docs-badge]:https://img.shields.io/badge/API-docs-blue.svg?style=flat-square +[docs]:http://lemire.me/docs/javafastpfor/ From a822e567c7fae033633629a9a09efd0c54fdb757 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 19 Jun 2015 13:51:27 -0400 Subject: [PATCH 221/412] Preparing new release. --- .classpath | 8 ----- .gitignore | 2 ++ .project | 17 ----------- CHANGELOG | 4 +++ README.md | 4 +-- .../integercompression/Composition.java | 22 +++++++------- .../differential/IntegratedComposition.java | 25 +++++++++------- .../lemire/integercompression/BasicTest.java | 29 ++++++++++++++++++- .../integercompression/ByteBasicTest.java | 28 ++++++++++++++++++ 9 files changed, 90 insertions(+), 49 deletions(-) delete mode 100644 .classpath delete mode 100644 .project diff --git a/.classpath b/.classpath deleted file mode 100644 index 49a9848..0000000 --- a/.classpath +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/.gitignore b/.gitignore index 83f4d77..53960d2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +.classpath +.project *.class *.csv tags diff --git a/.project b/.project deleted file mode 100644 index 0521b84..0000000 --- a/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - JavaFastPFOR - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/CHANGELOG b/CHANGELOG index b589bbb..75c5404 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,9 @@ +0.1.3 (June 19th 2015) + - Fixed issue #29: Composition not working properly when output offset != 0 (Saúl Vargas) + 0.1.2 (October 20th 2014) - Fix a compatibility issue with the C++ version. + 0.1.1 (September 19th 2014) - We now have two versions of FastPFOR (with blocks of 128 ints and 256 ints) and the format was streamlined. - BinaryPacking and IntegratedBinaryPacking now use a block size of 32 (instead of 128). diff --git a/README.md b/README.md index ad63742..b29cd58 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ the following code in your pom.xml file: me.lemire.integercompression JavaFastPFOR - 0.1.2 + 0.1.3 @@ -88,7 +88,7 @@ Main contributors * Muraoka Taro, https://github.com/koron with contributions by -* the Terrier team (Matteo Catena, Craig Macdonald and Iadh Ounis) +* the Terrier team (Matteo Catena, Craig Macdonald, Saúl Vargas and Iadh Ounis) * Di Wu, http://www.facebook.com/diwu1989 * Stefan Ackermann, https://github.com/Stivo * Samit Roy, https://github.com/roysamit diff --git a/src/main/java/me/lemire/integercompression/Composition.java b/src/main/java/me/lemire/integercompression/Composition.java index 35d17f6..a11278b 100644 --- a/src/main/java/me/lemire/integercompression/Composition.java +++ b/src/main/java/me/lemire/integercompression/Composition.java @@ -36,16 +36,18 @@ public Composition(IntegerCODEC f1, IntegerCODEC f2) { @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - if (inlength == 0) - return; - int init = inpos.get(); - F1.compress(in, inpos, inlength, out, outpos); - if (outpos.get() == 0) { - out[0] = 0; - outpos.increment(); - } - inlength -= inpos.get() - init; - F2.compress(in, inpos, inlength, out, outpos); + if (inlength == 0) { + return; + } + int inposInit = inpos.get(); + int outposInit = outpos.get(); + F1.compress(in, inpos, inlength, out, outpos); + if (outpos.get() == outposInit) { + out[outposInit] = 0; + outpos.increment(); + } + inlength -= inpos.get() - inposInit; + F2.compress(in, inpos, inlength, out, outpos); } @Override diff --git a/src/main/java/me/lemire/integercompression/differential/IntegratedComposition.java b/src/main/java/me/lemire/integercompression/differential/IntegratedComposition.java index c7c3af5..dd4257e 100644 --- a/src/main/java/me/lemire/integercompression/differential/IntegratedComposition.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedComposition.java @@ -36,21 +36,24 @@ public IntegratedComposition(IntegratedIntegerCODEC f1, F2 = f2; } + @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - if (inlength == 0) - return; - final int init = inpos.get(); - F1.compress(in, inpos, inlength, out, outpos); - if (outpos.get() == 0) { - out[0] = 0; - outpos.increment(); - } - inlength -= inpos.get() - init; - F2.compress(in, inpos, inlength, out, outpos); + if (inlength == 0) { + return; + } + int inposInit = inpos.get(); + int outposInit = outpos.get(); + F1.compress(in, inpos, inlength, out, outpos); + if (outpos.get() == outposInit) { + out[outposInit] = 0; + outpos.increment(); + } + inlength -= inpos.get() - inposInit; + F2.compress(in, inpos, inlength, out, outpos); } - + @Override public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 70884b2..1fe7255 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -39,8 +39,35 @@ public class BasicTest { new Simple16(), new Composition(new XorBinaryPacking(), new VariableByte()), new Composition(new DeltaZigzagBinaryPacking(), - new DeltaZigzagVariableByte()) }; + new DeltaZigzagVariableByte()) }; + /** + * + */ + @Test + public void saulTest() { + for (IntegerCODEC C : codecs) { + for (int x = 0; x < 50; ++x) { + int[] a = { 2, 3, 4, 5 }; + int[] b = new int[90]; + int[] c = new int[a.length]; + + IntWrapper aOffset = new IntWrapper(0); + IntWrapper bOffset = new IntWrapper(x); + C.compress(a, aOffset, a.length, b, bOffset); + int len = bOffset.get() - x; + + bOffset.set(x); + IntWrapper cOffset = new IntWrapper(0); + C.uncompress(b, bOffset, len, c, cOffset); + if(!Arrays.equals(a, c)) { + System.out.println("Problem with "+C); + } + assertArrayEquals(a, c); + + } + } + } /** * */ diff --git a/src/test/java/me/lemire/integercompression/ByteBasicTest.java b/src/test/java/me/lemire/integercompression/ByteBasicTest.java index 314bdfc..c2f5b6f 100644 --- a/src/test/java/me/lemire/integercompression/ByteBasicTest.java +++ b/src/test/java/me/lemire/integercompression/ByteBasicTest.java @@ -6,6 +6,8 @@ import org.junit.Test; +import static org.junit.Assert.*; + /** * Just some basic sanity tests. @@ -19,6 +21,32 @@ public class ByteBasicTest { new IntegratedVariableByte(), }; + /** + * + */ + @Test + public void saulTest() { + for (ByteIntegerCODEC C : codecs) { + for (int x = 0; x < 50 * 4; ++x) { + int[] a = { 2, 3, 4, 5 }; + byte[] b = new byte[90*4]; + int[] c = new int[a.length]; + + IntWrapper aOffset = new IntWrapper(0); + IntWrapper bOffset = new IntWrapper(x); + C.compress(a, aOffset, a.length, b, bOffset); + int len = bOffset.get() - x; + + bOffset.set(x); + IntWrapper cOffset = new IntWrapper(0); + C.uncompress(b, bOffset, len, c, cOffset); + if(!Arrays.equals(a, c)) { + System.out.println("Problem with "+C); + } + assertArrayEquals(a, c); + } + } + } /** * */ From 3c9fb13615218d2eb2ff3370bd0c2f2fb2d28e1a Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 19 Jun 2015 13:53:07 -0400 Subject: [PATCH 222/412] [maven-release-plugin] prepare release JavaFastPFOR-0.1.3 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 625b16a..2e89a7a 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.1.3-SNAPSHOT + 0.1.3 jar From 2dd09c6c3af7c7a4072e31520f63a4d4e6dd1a2b Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 19 Jun 2015 13:53:11 -0400 Subject: [PATCH 223/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2e89a7a..d6ac4a8 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ me.lemire.integercompression JavaFastPFOR - 0.1.3 + 0.1.4-SNAPSHOT jar From 74ed7f7f3c83be389d3829c336736684600052ac Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Thu, 20 Aug 2015 14:15:03 -0400 Subject: [PATCH 224/412] Format pom file. --- pom.xml | 180 +++++++++++++++++++++++++++----------------------------- 1 file changed, 86 insertions(+), 94 deletions(-) diff --git a/pom.xml b/pom.xml index d6ac4a8..c985d64 100644 --- a/pom.xml +++ b/pom.xml @@ -1,30 +1,28 @@ - 4.0.0 - - me.lemire.integercompression - JavaFastPFOR - 0.1.4-SNAPSHOT - jar - - - 1.5 - 1.5 - UTF-8 - - - - Apache 2 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - A business-friendly OSS license - - - - scm:git:git@github.com:lemire/JavaFastPFOR.git - scm:git:git@github.com:lemire/JavaFastPFOR.git - scm:git:git@github.com:lemire/JavaFastPFOR.git - - + 4.0.0 + me.lemire.integercompression + JavaFastPFOR + 0.1.4-SNAPSHOT + jar + + 1.5 + 1.5 + UTF-8 + + + + Apache 2 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + A business-friendly OSS license + + + + scm:git:git@github.com:lemire/JavaFastPFOR.git + scm:git:git@github.com:lemire/JavaFastPFOR.git + scm:git:git@github.com:lemire/JavaFastPFOR.git + + lemire Daniel Lemire @@ -43,52 +41,48 @@ - - - junit - junit - 4.10 - test - - - + + + junit + junit + 4.10 + test + + + GitHub Issue Tracking https://github.com/lemire/JavaFastPFOR/issues - + org.sonatype.oss oss-parent 5 - - + - - - org.apache.felix - maven-bundle-plugin - 2.3.7 - true - - - me.lemire.integercompression.* - * - - + + org.apache.felix + maven-bundle-plugin + 2.3.7 + true + + + me.lemire.integercompression.* + * + + - - - org.codehaus.mojo - exec-maven-plugin - 1.1 - - me.lemire.integercompression.benchmarktools.Benchmark - - - - + + org.apache.maven.plugins maven-gpg-plugin @@ -103,40 +97,38 @@ - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.8 - - - - attach-javadocs - - jar - - - - - - org.apache.maven.plugins - maven-source-plugin - 2.1.2 - - - attach-sources - - jar - - - - + + org.apache.maven.plugins + maven-javadoc-plugin + 2.8 + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-source-plugin + 2.1.2 + + + attach-sources + + jar + + + + - JavaFastPFOR - https://github.com/lemire/JavaFastPFOR/ - -It is a library to compress and uncompress arrays of integers + JavaFastPFOR + https://github.com/lemire/JavaFastPFOR/ + +It is a library to compress and uncompress arrays of integers very fast. The assumption is that most (but not all) values in your array use less than 32 bits. - + From 0aadfd52d41a9e624b8afb7024052a6724a8ebe7 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 31 Aug 2015 06:45:47 -0400 Subject: [PATCH 225/412] Adding headless demo. --- example.java | 89 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 67 insertions(+), 22 deletions(-) diff --git a/example.java b/example.java index dbe70d0..b8f039d 100644 --- a/example.java +++ b/example.java @@ -7,8 +7,9 @@ public static void main(String[] args) { unsortedExample(); basicExample(); advancedExample(); + headlessDemo(); } - + public static void basicExample() { int[] data = new int[2342351]; System.out.println("Compressing "+data.length+" integers in one go"); @@ -19,16 +20,16 @@ public static void basicExample() { // Very important: the data is in sorted order!!! If not, you // will get very poor compression with IntegratedBinaryPacking, // you should use another CODEC. - + // next we compose a CODEC. Most of the processing // will be done with binary packing, and leftovers will // be processed using variable byte - IntegratedIntegerCODEC codec = new + IntegratedIntegerCODEC codec = new IntegratedComposition( new IntegratedBinaryPacking(), new IntegratedVariableByte()); // output vector should be large enough... - int [] compressed = new int[data.length+1024]; + int [] compressed = new int[data.length+1024]; // compressed might not be large enough in some cases // if you get java.lang.ArrayIndexOutOfBoundsException, try // allocating more memory @@ -41,7 +42,7 @@ public static void basicExample() { IntWrapper inputoffset = new IntWrapper(0); IntWrapper outputoffset = new IntWrapper(0); codec.compress(data,inputoffset,data.length,compressed,outputoffset); - // got it! + // got it! // inputoffset should be at data.length but outputoffset tells // us where we are... System.out.println("compressed from "+data.length*4/1024+"KB to "+outputoffset.intValue()*4/1024+"KB"); @@ -56,13 +57,13 @@ public static void basicExample() { int[] recovered = new int[data.length]; IntWrapper recoffset = new IntWrapper(0); codec.uncompress(compressed,new IntWrapper(0),compressed.length,recovered,recoffset); - if(Arrays.equals(data,recovered)) + if(Arrays.equals(data,recovered)) System.out.println("data is recovered without loss"); else throw new RuntimeException("bug"); // could use assert System.out.println(); } - + /** * This is an example to show you can compress unsorted integers * as long as most are small. @@ -76,7 +77,7 @@ public static void unsortedExample() { for(int k = 0; k < N; k+=5) data[k] = 100; for(int k = 0; k < N; k+=533) data[k] = 10000; int[] compressed = new int [N+1024];// could need more - IntegerCODEC codec = new + IntegerCODEC codec = new Composition( new FastPFOR(), new VariableByte()); @@ -91,7 +92,7 @@ public static void unsortedExample() { int[] recovered = new int[N]; IntWrapper recoffset = new IntWrapper(0); codec.uncompress(compressed,new IntWrapper(0),compressed.length,recovered,recoffset); - if(Arrays.equals(data,recovered)) + if(Arrays.equals(data,recovered)) System.out.println("data is recovered without loss"); else throw new RuntimeException("bug"); // could use assert @@ -100,10 +101,10 @@ public static void unsortedExample() { } /** - * This is like the basic example, but we + * This is like the basic example, but we * show how to process larger arrays in chunks. * - * Some of this code was written by Pavel Klinov. + * Some of this code was written by Pavel Klinov. */ public static void advancedExample() { int TotalSize = 2342351; // some arbitrary number @@ -119,15 +120,15 @@ public static void advancedExample() { // will be done with binary packing, and leftovers will // be processed using variable byte, using variable byte // only for the last chunk! - IntegratedIntegerCODEC regularcodec = new + IntegratedIntegerCODEC regularcodec = new IntegratedBinaryPacking(); IntegratedVariableByte ivb = new IntegratedVariableByte(); - IntegratedIntegerCODEC lastcodec = new + IntegratedIntegerCODEC lastcodec = new IntegratedComposition(regularcodec,ivb); // output vector should be large enough... int [] compressed = new int[TotalSize+1024]; - - + + /** * * compressing @@ -135,24 +136,24 @@ public static void advancedExample() { */ IntWrapper inputoffset = new IntWrapper(0); IntWrapper outputoffset = new IntWrapper(0); - for(int k = 0; k < TotalSize / ChunkSize; ++k) + for(int k = 0; k < TotalSize / ChunkSize; ++k) regularcodec.compress(data,inputoffset,ChunkSize,compressed,outputoffset); lastcodec.compress(data, inputoffset, TotalSize % ChunkSize, compressed, outputoffset); - // got it! + // got it! // inputoffset should be at data.length but outputoffset tells // us where we are... System.out.println("compressed from "+data.length*4/1024+"KB to "+outputoffset.intValue()*4/1024+"KB"); // we can repack the data: compressed = Arrays.copyOf(compressed,outputoffset.intValue()); - - + + /** * * now uncompressing * * We are *not* assuming that the original array length is known, however * we assume that the chunk size (ChunkSize) is known. - * + * */ int[] recovered = new int[ChunkSize]; IntWrapper compoff = new IntWrapper(0); @@ -162,7 +163,7 @@ public static void advancedExample() { while(compoff.get() Date: Mon, 31 Aug 2015 06:53:00 -0400 Subject: [PATCH 226/412] Trying to clear up the documentation. --- .../differential/SkippableIntegratedIntegerCODEC.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedIntegerCODEC.java b/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedIntegerCODEC.java index 99e5f9d..8b7fd4b 100644 --- a/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedIntegerCODEC.java +++ b/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedIntegerCODEC.java @@ -13,7 +13,8 @@ /** * Interface describing a standard CODEC to compress integers. This is a * variation on the IntegerCODEC interface meant to be used for random access - * and with integrated differential coding. + * and with integrated differential coding + * (i.e., given a large array, you can segment it and decode just the subarray you need). * * The main differences are that we must specify the number of integers we wish to * decode as well as the initial value (for differential coding). This information From 8453c83240c48a448579afaeee71782bbac888f1 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 3 Nov 2015 12:02:21 -0500 Subject: [PATCH 227/412] Better documentation. --- README.md | 10 ++++++++++ .../java/me/lemire/integercompression/FastPFOR.java | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b29cd58..2c28848 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,16 @@ We found no library that implemented state-of-the-art integer coding techniques such as Binary Packing, NewPFD, OptPFD, Variable Byte, Simple 9 and so on in Java. We wrote one. +Thread safery +---- + +Some codecs are thread-safe while others are not. +For this reason, it is best to use one codec per thread. +The memory usage of a codec instance is small in any case. + +Nevertheless, if you want to reuse codec instances, +note that by convention, unless the documentation of a codec specify +that it is not thread-safe, then it can be assumed to be thread-safe. Authors ------- diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 314c9f9..4f0591f 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -20,7 +20,7 @@ * * IntegerCODEC ic = new Composition(new FastPFOR(), new VariableByte()). *

- * For details, please see + * For details, please see: *

* Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second * through vectorization Software: Practice & Experience From 87e3f8f0540acca2d1dc3dbb9095642a44b2004a Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 25 Nov 2015 12:34:43 -0500 Subject: [PATCH 228/412] Preparing new release --- CHANGELOG | 3 + README.md | 13 +++- example.java | 15 ++++ .../integercompression/BinaryPacking.java | 22 +++--- .../integercompression/IntCompressor.java | 63 +++++++++++++++ .../differential/IntegratedBinaryPacking.java | 38 ++++----- .../differential/IntegratedIntCompressor.java | 64 +++++++++++++++ .../integercompression/IntCompressorTest.java | 77 +++++++++++++++++++ 8 files changed, 263 insertions(+), 32 deletions(-) create mode 100644 src/main/java/me/lemire/integercompression/IntCompressor.java create mode 100644 src/main/java/me/lemire/integercompression/differential/IntegratedIntCompressor.java create mode 100644 src/test/java/me/lemire/integercompression/IntCompressorTest.java diff --git a/CHANGELOG b/CHANGELOG index 75c5404..dd1a0f9 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +0.1.4 (November 25th 2015) + - Added IntCompressor and IntegratedIntCompressor for users looking for a simpler API + 0.1.3 (June 19th 2015) - Fixed issue #29: Composition not working properly when output offset != 0 (Saúl Vargas) diff --git a/README.md b/README.md index 2c28848..c7949a7 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,16 @@ as well as in GMAP and GSNAP (http://research-pub.gene.com/gmap/). Usage ------ -See example.java. +Really simple usage: + +``` + IntegratedIntCompressor iic = new IntegratedIntCompressor(); + int[] data = ... ; // to be compressed + int[] compressed = iic.compress(data); // compressed array + int[] recov = iic.uncompress(compressed); // equals to data +``` + +For more examples, see example.java. Some CODECs ("integrated codecs") assume that the integers are in sorted orders and use differential coding (they compress deltas). @@ -59,7 +68,7 @@ the following code in your pom.xml file: me.lemire.integercompression JavaFastPFOR - 0.1.3 + [0.1,) diff --git a/example.java b/example.java index b8f039d..fbaa4af 100644 --- a/example.java +++ b/example.java @@ -4,12 +4,25 @@ public class example { public static void main(String[] args) { + superSimpleExample(); unsortedExample(); basicExample(); advancedExample(); headlessDemo(); } + public static void superSimpleExample() { + IntegratedIntCompressor iic = new IntegratedIntCompressor(); + int[] data = new int[2342351]; + for(int k = 0; k < data.length; ++k) + data[k] = k; + System.out.println("Compressing "+data.length+" integers using friendly interface"); + int[] compressed = iic.compress(data); + int[] recov = iic.uncompress(compressed); + System.out.println("compressed from "+data.length*4/1024+"KB to "+compressed.length*4/1024+"KB"); + if(!Arrays.equals(recov,data)) throw new RuntimeException("bug"); + } + public static void basicExample() { int[] data = new int[2342351]; System.out.println("Compressing "+data.length+" integers in one go"); @@ -221,3 +234,5 @@ public static void headlessDemo() { } } + + diff --git a/src/main/java/me/lemire/integercompression/BinaryPacking.java b/src/main/java/me/lemire/integercompression/BinaryPacking.java index 94b4534..8d5ff90 100644 --- a/src/main/java/me/lemire/integercompression/BinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/BinaryPacking.java @@ -57,27 +57,27 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int tmpoutpos = outpos.get(); int s = inpos.get(); for (; s + BLOCK_SIZE * 4 - 1 < inpos.get() + inlength; s += BLOCK_SIZE * 4) { - final int mbits1 = Util.maxbits(in, s, 32); - final int mbits2 = Util.maxbits(in, s + 32, 32); - final int mbits3 = Util.maxbits(in, s + 2 * 32, 32); - final int mbits4 = Util.maxbits(in, s + 3 * 32, 32); + final int mbits1 = Util.maxbits(in, s, BLOCK_SIZE); + final int mbits2 = Util.maxbits(in, s + BLOCK_SIZE, BLOCK_SIZE); + final int mbits3 = Util.maxbits(in, s + 2 * BLOCK_SIZE, BLOCK_SIZE); + final int mbits4 = Util.maxbits(in, s + 3 * BLOCK_SIZE, BLOCK_SIZE); out[tmpoutpos++] = (mbits1 << 24) | (mbits2 << 16) | (mbits3 << 8) | (mbits4); BitPacking.fastpackwithoutmask(in, s, out, tmpoutpos, mbits1); tmpoutpos += mbits1; - BitPacking.fastpackwithoutmask(in, s + 32, out, + BitPacking.fastpackwithoutmask(in, s + BLOCK_SIZE, out, tmpoutpos, mbits2); tmpoutpos += mbits2; - BitPacking.fastpackwithoutmask(in, s + 2 * 32, out, + BitPacking.fastpackwithoutmask(in, s + 2 * BLOCK_SIZE, out, tmpoutpos, mbits3); tmpoutpos += mbits3; - BitPacking.fastpackwithoutmask(in, s + 3 * 32, out, + BitPacking.fastpackwithoutmask(in, s + 3 * BLOCK_SIZE, out, tmpoutpos, mbits4); tmpoutpos += mbits4; } for (; s < inpos.get() + inlength; s += BLOCK_SIZE ) { - final int mbits = Util.maxbits(in, s, 32); + final int mbits = Util.maxbits(in, s, BLOCK_SIZE); out[tmpoutpos++] = mbits; BitPacking.fastpackwithoutmask(in, s, out, tmpoutpos, mbits); @@ -113,12 +113,12 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, BitPacking.fastunpack(in, tmpinpos, out, s, mbits1); tmpinpos += mbits1; BitPacking - .fastunpack(in, tmpinpos, out, s + 32, mbits2); + .fastunpack(in, tmpinpos, out, s + BLOCK_SIZE, mbits2); tmpinpos += mbits2; - BitPacking.fastunpack(in, tmpinpos, out, s + 2 * 32, + BitPacking.fastunpack(in, tmpinpos, out, s + 2 * BLOCK_SIZE, mbits3); tmpinpos += mbits3; - BitPacking.fastunpack(in, tmpinpos, out, s + 3 * 32, + BitPacking.fastunpack(in, tmpinpos, out, s + 3 * BLOCK_SIZE, mbits4); tmpinpos += mbits4; } diff --git a/src/main/java/me/lemire/integercompression/IntCompressor.java b/src/main/java/me/lemire/integercompression/IntCompressor.java new file mode 100644 index 0000000..5f174fd --- /dev/null +++ b/src/main/java/me/lemire/integercompression/IntCompressor.java @@ -0,0 +1,63 @@ +package me.lemire.integercompression; + +import java.util.Arrays; + +/** + * This is a convenience class that wraps a codec to provide + * a "friendly" API. + * + */ +public class IntCompressor { + + + SkippableIntegerCODEC codec; + /** + * Constructor wrapping a codec. + * + * @param c the underlying codec + */ + public IntCompressor(SkippableIntegerCODEC c) { + codec = c; + } + + /** + * Constructor with default codec. + */ + public IntCompressor() { + codec = new SkippableComposition(new BinaryPacking(), + new VariableByte()); + } + + /** + * Compress an array and returns the compressed result as a new array. + * + * @param input array to be compressed + * @return compressed array + */ + public int[] compress(int[] input) { + int [] compressed = new int[input.length+1024]; + compressed[0] = input.length; + IntWrapper outpos = new IntWrapper(1); + codec.headlessCompress(input, new IntWrapper(0), + input.length, compressed, outpos); + compressed = Arrays.copyOf(compressed,outpos.intValue()); + return compressed; + } + + /** + * Uncompress an array and returns the uncompressed result as a new array. + * + * @param compressed compressed array + * @return uncompressed array + */ + public int[] uncompress(int[] compressed) { + int[] decompressed = new int[compressed[0]]; + IntWrapper inpos = new IntWrapper(1); + codec.headlessUncompress(compressed, inpos, + compressed.length - inpos.intValue(), + decompressed, new IntWrapper(0), + decompressed.length); + return decompressed; + } + +} diff --git a/src/main/java/me/lemire/integercompression/differential/IntegratedBinaryPacking.java b/src/main/java/me/lemire/integercompression/differential/IntegratedBinaryPacking.java index 6d281c7..0dd2a96 100644 --- a/src/main/java/me/lemire/integercompression/differential/IntegratedBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedBinaryPacking.java @@ -87,34 +87,33 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, initvalue.set(in[inpos.get()+inlength -1]); int s = inpos.get(); for (; s + BLOCK_SIZE * 4 - 1 < inpos.get() + inlength; s += BLOCK_SIZE * 4) { - final int mbits1 = Util.maxdiffbits(initoffset, in, s, 32); + final int mbits1 = Util.maxdiffbits(initoffset, in, s, BLOCK_SIZE); int initoffset2 = in[s + 31]; - final int mbits2 = Util.maxdiffbits(initoffset2, in, s + 32, 32); - int initoffset3 = in[s + 32 + 31]; + final int mbits2 = Util.maxdiffbits(initoffset2, in, s + BLOCK_SIZE, BLOCK_SIZE); + int initoffset3 = in[s + BLOCK_SIZE + 31]; final int mbits3 = Util - .maxdiffbits(initoffset3, in, s + 2 * 32, 32); - int initoffset4 = in[s + 2 * 32 + 31]; + .maxdiffbits(initoffset3, in, s + 2 * BLOCK_SIZE, BLOCK_SIZE); + int initoffset4 = in[s + 2 * BLOCK_SIZE + 31]; final int mbits4 = Util - .maxdiffbits(initoffset4, in, s + 3 * 32, 32); + .maxdiffbits(initoffset4, in, s + 3 * BLOCK_SIZE, BLOCK_SIZE); out[tmpoutpos++] = (mbits1 << 24) | (mbits2 << 16) | (mbits3 << 8) | (mbits4); IntegratedBitPacking.integratedpack(initoffset, in, s, out, tmpoutpos, mbits1); tmpoutpos += mbits1; - IntegratedBitPacking.integratedpack(initoffset2, in, s + 32, out, + IntegratedBitPacking.integratedpack(initoffset2, in, s + BLOCK_SIZE, out, tmpoutpos, mbits2); tmpoutpos += mbits2; - IntegratedBitPacking.integratedpack(initoffset3, in, s + 2 * 32, + IntegratedBitPacking.integratedpack(initoffset3, in, s + 2 * BLOCK_SIZE, out, tmpoutpos, mbits3); tmpoutpos += mbits3; - IntegratedBitPacking.integratedpack(initoffset4, in, s + 3 * 32, + IntegratedBitPacking.integratedpack(initoffset4, in, s + 3 * BLOCK_SIZE, out, tmpoutpos, mbits4); tmpoutpos += mbits4; - initoffset = in[s + 3 * 32 + 31]; + initoffset = in[s + 3 * BLOCK_SIZE + 31]; } for (; s < inpos.get() + inlength; s += BLOCK_SIZE ) { - - final int mbits = Util.maxdiffbits(initoffset, in, s, 32); + final int mbits = Util.maxdiffbits(initoffset, in, s, BLOCK_SIZE); out[tmpoutpos++] = mbits; IntegratedBitPacking.integratedpack(initoffset, in, s, out, tmpoutpos, mbits); @@ -128,7 +127,7 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, @Override public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num, IntWrapper initvalue) { - final int outlength = num; + final int outlength = Util.greatestMultiple(num, BLOCK_SIZE); int tmpinpos = inpos.get(); int initoffset = initvalue.get(); int s = outpos.get(); @@ -137,23 +136,24 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, final int mbits2 = (in[tmpinpos] >>> 16) & 0xFF; final int mbits3 = (in[tmpinpos] >>> 8) & 0xFF; final int mbits4 = (in[tmpinpos]) & 0xFF; + ++tmpinpos; IntegratedBitPacking.integratedunpack(initoffset, in, tmpinpos, out, s, mbits1); tmpinpos += mbits1; initoffset = out[s + 31]; IntegratedBitPacking.integratedunpack(initoffset, in, tmpinpos, - out, s + 32, mbits2); + out, s + BLOCK_SIZE, mbits2); tmpinpos += mbits2; - initoffset = out[s + 32 + 31]; + initoffset = out[s + BLOCK_SIZE + 31]; IntegratedBitPacking.integratedunpack(initoffset, in, tmpinpos, - out, s + 2 * 32, mbits3); + out, s + 2 * BLOCK_SIZE, mbits3); tmpinpos += mbits3; - initoffset = out[s + 2 * 32 + 31]; + initoffset = out[s + 2 * BLOCK_SIZE + 31]; IntegratedBitPacking.integratedunpack(initoffset, in, tmpinpos, - out, s + 3 * 32, mbits4); + out, s + 3 * BLOCK_SIZE, mbits4); tmpinpos += mbits4; - initoffset = out[s + 3 * 32 + 31]; + initoffset = out[s + 3 * BLOCK_SIZE + 31]; } for (; s < outpos.get() + outlength; s += BLOCK_SIZE) { final int mbits = in[tmpinpos]; diff --git a/src/main/java/me/lemire/integercompression/differential/IntegratedIntCompressor.java b/src/main/java/me/lemire/integercompression/differential/IntegratedIntCompressor.java new file mode 100644 index 0000000..652c018 --- /dev/null +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedIntCompressor.java @@ -0,0 +1,64 @@ +package me.lemire.integercompression.differential; + +import java.util.Arrays; + +import me.lemire.integercompression.IntWrapper; + +/** + * This is a convenience class that wraps a codec to provide + * a "friendly" API. + * + */ +public class IntegratedIntCompressor { + SkippableIntegratedIntegerCODEC codec; + /** + * Constructor wrapping a codec. + * + * @param c the underlying codec + */ + public IntegratedIntCompressor(SkippableIntegratedIntegerCODEC c) { + codec = c; + } + + /** + * Constructor with default codec. + */ + public IntegratedIntCompressor() { + codec = new SkippableIntegratedComposition(new IntegratedBinaryPacking(), + new IntegratedVariableByte()); + } + + /** + * Compress an array and returns the compressed result as a new array. + * + * @param input array to be compressed + * @return compressed array + */ + public int[] compress(int[] input) { + int [] compressed = new int[input.length+1024]; + compressed[0] = input.length; + IntWrapper outpos = new IntWrapper(1); + IntWrapper initvalue = new IntWrapper(0); + codec.headlessCompress(input, new IntWrapper(0), + input.length, compressed, outpos, initvalue); + compressed = Arrays.copyOf(compressed,outpos.intValue()); + return compressed; + } + + /** + * Uncompress an array and returns the uncompressed result as a new array. + * + * @param compressed compressed array + * @return uncompressed array + */ + public int[] uncompress(int[] compressed) { + int[] decompressed = new int[compressed[0]]; + IntWrapper inpos = new IntWrapper(1); + codec.headlessUncompress(compressed, inpos, + compressed.length - inpos.intValue(), + decompressed, new IntWrapper(0), + decompressed.length, new IntWrapper(0)); + return decompressed; + } + +} diff --git a/src/test/java/me/lemire/integercompression/IntCompressorTest.java b/src/test/java/me/lemire/integercompression/IntCompressorTest.java new file mode 100644 index 0000000..34b8946 --- /dev/null +++ b/src/test/java/me/lemire/integercompression/IntCompressorTest.java @@ -0,0 +1,77 @@ +package me.lemire.integercompression; + +import java.util.Arrays; + +import org.junit.Assert; +import org.junit.Test; + +import me.lemire.integercompression.differential.IntegratedBinaryPacking; +import me.lemire.integercompression.differential.IntegratedIntCompressor; +import me.lemire.integercompression.differential.IntegratedVariableByte; +import me.lemire.integercompression.differential.SkippableIntegratedComposition; + +/** + * Testing IntCompressor objects. + */ +public class IntCompressorTest { + IntegratedIntCompressor[] iic = { + new IntegratedIntCompressor(new IntegratedVariableByte()), + new IntegratedIntCompressor( + new SkippableIntegratedComposition( + new IntegratedBinaryPacking(), + new IntegratedVariableByte())) }; + IntCompressor[] ic = { + new IntCompressor(new VariableByte()), + new IntCompressor(new SkippableComposition(new BinaryPacking(), + new VariableByte())) }; + + /** + * + */ + @Test + public void basicTest() { + for (int N = 1; N <= 10000; N *= 10) { + int[] orig = new int[N]; + for (int k = 0; k < N; k++) + orig[k] = 3 * k + 5; + for (IntCompressor i : ic) { + int[] comp = i.compress(orig); + int[] back = i.uncompress(comp); + Assert.assertArrayEquals(back, orig); + } + } + + } + /** + * + */ + @Test + public void superSimpleExample() { + IntegratedIntCompressor iic = new IntegratedIntCompressor(); + int[] data = new int[2342351]; + for(int k = 0; k < data.length; ++k) + data[k] = k; + System.out.println("Compressing "+data.length+" integers using friendly interface"); + int[] compressed = iic.compress(data); + int[] recov = iic.uncompress(compressed); + System.out.println("compressed from "+data.length*4/1024+"KB to "+compressed.length*4/1024+"KB"); + if(!Arrays.equals(recov,data)) throw new RuntimeException("bug"); + } + + /** + * + */ + @Test + public void basicIntegratedTest() { + for (int N = 1; N <= 10000; N *= 10) { + int[] orig = new int[N]; + for (int k = 0; k < N; k++) + orig[k] = 3 * k + 5; + for (IntegratedIntCompressor i : iic) { + int[] comp = i.compress(orig); + int[] back = i.uncompress(comp); + Assert.assertArrayEquals(back, orig); + } + } + } +} From e35f26dc754c64350c1dd9ff378e2721bbc01070 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 25 Nov 2015 12:37:01 -0500 Subject: [PATCH 229/412] [maven-release-plugin] prepare release JavaFastPFOR-0.1.4 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c985d64..5679dd2 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.1.4-SNAPSHOT + 0.1.4 jar 1.5 From 5ed3c15666569c080d7f2e5a070c3bdc22f3882a Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 25 Nov 2015 12:37:05 -0500 Subject: [PATCH 230/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5679dd2..694a2cd 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.1.4 + 0.1.5-SNAPSHOT jar 1.5 From 7640d1f738313eb85ecbc44cf3ec08c80a7f39e9 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 25 Nov 2015 16:42:19 -0500 Subject: [PATCH 231/412] Rolling back. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 694a2cd..5679dd2 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.1.5-SNAPSHOT + 0.1.4 jar 1.5 From 9f03767a56ad29685247518202d984f8e87127c8 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 25 Nov 2015 16:43:15 -0500 Subject: [PATCH 232/412] Moving to snapshot --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5679dd2..c985d64 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.1.4 + 0.1.4-SNAPSHOT jar 1.5 From 87b422bd2b44dda978f16b322ea02ed2b8ac273a Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 25 Nov 2015 16:44:03 -0500 Subject: [PATCH 233/412] Going back to 0.1.5 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c985d64..694a2cd 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.1.4-SNAPSHOT + 0.1.5-SNAPSHOT jar 1.5 From 1c59411ccec7178f05a132c18485eca07361951c Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 25 Nov 2015 16:45:23 -0500 Subject: [PATCH 234/412] [maven-release-plugin] prepare release JavaFastPFOR-0.1.5 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 694a2cd..ad676fe 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.1.5-SNAPSHOT + 0.1.5 jar 1.5 From a2b1215eb086c76494a8b8da6e13c800cd9df32c Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 25 Nov 2015 16:45:26 -0500 Subject: [PATCH 235/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ad676fe..bd0eb6d 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.1.5 + 0.1.6-SNAPSHOT jar 1.5 From 9c48361422ad45adb5e21175947588e081a8b90f Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 25 Nov 2015 16:54:20 -0500 Subject: [PATCH 236/412] Version 0.1.4 and 0.1.5 have been borked by sonatype timeouts. --- CHANGELOG | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index dd1a0f9..660b5bf 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,4 @@ -0.1.4 (November 25th 2015) +0.1.4, 0.1.5, 0.1.6 (November 25th 2015) - Added IntCompressor and IntegratedIntCompressor for users looking for a simpler API 0.1.3 (June 19th 2015) From a8b40cf63b838a0b2cd1dee624422a810cb8b4e8 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 25 Nov 2015 16:56:13 -0500 Subject: [PATCH 237/412] [maven-release-plugin] prepare release JavaFastPFOR-0.1.6 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bd0eb6d..1fb6796 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.1.6-SNAPSHOT + 0.1.6 jar 1.5 From f324712062de23beea39c85a4cda44ce6a80d711 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 25 Nov 2015 16:56:16 -0500 Subject: [PATCH 238/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1fb6796..13043b9 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.1.6 + 0.1.7-SNAPSHOT jar 1.5 From abf841074caec7cbe277581d66800681bad382d0 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 9 Dec 2015 13:38:57 -0500 Subject: [PATCH 239/412] Flushing out description. --- README.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c7949a7..cde8ffe 100644 --- a/README.md +++ b/README.md @@ -15,11 +15,17 @@ What does this do? It is a library to compress and uncompress arrays of integers very fast. The assumption is that most (but not all) values in -your array use less than 32 bits. These sort of arrays often come up +your array use much less than 32 bits, or that the gaps between +the integers use much less than 32 bits. These sort of arrays often come up when using differential coding in databases and information retrieval (e.g., in inverted indexes or column stores). -It can decompress integers at a rate of over 1.2 billions per second +Please note that random integers are not compressible, by this +library or by any other means. If you ever had the means of +systematically compressing random integers, you could compress +any data source to nothing, by recursive application of your technique. + +This library can decompress integers at a rate of over 1.2 billions per second (4.5 GB/s). It is significantly faster than generic codecs (such as Snappy, LZ4 and so on) when compressing arrays of integers. From cc01ef75ac60c8df19766d7fe2c2143c6f8a17b0 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 11 Dec 2015 10:17:12 -0500 Subject: [PATCH 240/412] Link to TurboPFor --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index cde8ffe..24758f4 100644 --- a/README.md +++ b/README.md @@ -131,6 +131,7 @@ Reference: http://sna-projects.com/kamikaze/ + Requirements ------------ @@ -198,6 +199,12 @@ http://lemire.me/fr/documents/thesis/IkhtearThesis.pdf He also posted his slides online: http://www.slideshare.net/ikhtearSharif/ikhtear-defense +Other recommended libraries +----------------------------- + +TurboPFor is a C library that offers lots of interesting optimizations and Java wrappers. Well worth checking! + +https://github.com/powturbo/TurboPFor Funding ----------- From df9a9f6e4a7865fc4838705f9cfdc41890310dc6 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Thu, 28 Jan 2016 10:21:21 -0500 Subject: [PATCH 241/412] Updating documentation link --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 24758f4..a01acbb 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ For more examples, see example.java. Some CODECs ("integrated codecs") assume that the integers are in sorted orders and use differential coding (they compress deltas). -They can be found in the package me.lemire.integercopression.differential. +They can be found in the package me.lemire.integercompression.differential. Most others do not. @@ -174,7 +174,7 @@ or: API Documentation ----------------- -http://lemire.me/docs/javafastpfor/ +http://www.javadoc.io/doc/me.lemire.integercompression/JavaFastPFOR/ Want to read more? ------------------ @@ -219,4 +219,4 @@ This work was supported by NSERC grant number 26143. [license img]:https://img.shields.io/badge/License-Apache%202-blue.svg [docs-badge]:https://img.shields.io/badge/API-docs-blue.svg?style=flat-square -[docs]:http://lemire.me/docs/javafastpfor/ +[docs]:http://www.javadoc.io/doc/me.lemire.integercompression/JavaFastPFOR/ From fea4fa962b1c516618804744908f2d18224bf0b6 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 29 Jan 2016 11:14:15 -0500 Subject: [PATCH 242/412] Trying to enable coverage tool. --- .travis.yml | 3 +++ pom.xml | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/.travis.yml b/.travis.yml index a159cc4..b57c4bc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,3 +8,6 @@ jdk: install: true script: mvn test + +after_success: + - mvn coveralls:report diff --git a/pom.xml b/pom.xml index 13043b9..9ebdbe5 100644 --- a/pom.xml +++ b/pom.xml @@ -123,6 +123,11 @@ + + org.eluder.coveralls + coveralls-maven-plugin + 3.1.0 + JavaFastPFOR From 46926976dc66fe0c60e55ca53bc118d8e22f1a54 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 29 Jan 2016 11:25:58 -0500 Subject: [PATCH 243/412] Enabling coverage testing. --- .travis.yml | 2 +- pom.xml | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b57c4bc..94ea1da 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ jdk: install: true -script: mvn test +script: mvn clean test jacoco:report after_success: - mvn coveralls:report diff --git a/pom.xml b/pom.xml index 9ebdbe5..c4afee9 100644 --- a/pom.xml +++ b/pom.xml @@ -123,6 +123,19 @@ + + org.jacoco + jacoco-maven-plugin + 0.7.2.201409121644 + + + prepare-agent + + prepare-agent + + + + org.eluder.coveralls coveralls-maven-plugin From 808f0c857e18cbb5d6b8170f4ef20b834909db59 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 29 Jan 2016 11:33:02 -0500 Subject: [PATCH 244/412] Updating JDKs. --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 94ea1da..49ed971 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,8 +2,7 @@ language: java jdk: - oraclejdk7 - - openjdk7 - - openjdk6 + - oraclejdk8 install: true From b1188d66ffe585323e7817d8daff78c324e9d53a Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 29 Jan 2016 11:38:01 -0500 Subject: [PATCH 245/412] Adding coverage status badge. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a01acbb..78d5e89 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ JavaFastPFOR: A simple integer compression library in Java ========================================================== [![Build Status](https://travis-ci.org/lemire/JavaFastPFOR.png)](https://travis-ci.org/lemire/JavaFastPFOR) [![][maven img]][maven] [![][license img]][license] [![docs-badge][]][docs] +[![Coverage Status](https://coveralls.io/repos/github/lemire/JavaFastPFOR/badge.svg?branch=master)](https://coveralls.io/github/lemire/JavaFastPFOR?branch=master) License ------- From a95b459ed4b62b1824e72bc8bd5c2de2bbe959f0 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Sat, 12 Mar 2016 18:12:46 -0500 Subject: [PATCH 246/412] Adding an example to answer https://github.com/lemire/JavaFastPFOR/issues/35 --- example.java | 171 +++++++--- .../integercompression/ExampleTest.java | 314 ++++++++++++++++++ 2 files changed, 433 insertions(+), 52 deletions(-) create mode 100644 src/test/java/me/lemire/integercompression/ExampleTest.java diff --git a/example.java b/example.java index fbaa4af..6f421ed 100644 --- a/example.java +++ b/example.java @@ -7,6 +7,7 @@ public static void main(String[] args) { superSimpleExample(); unsortedExample(); basicExample(); + basicExampleHeadless(); advancedExample(); headlessDemo(); } @@ -15,12 +16,12 @@ public static void superSimpleExample() { IntegratedIntCompressor iic = new IntegratedIntCompressor(); int[] data = new int[2342351]; for(int k = 0; k < data.length; ++k) - data[k] = k; + data[k] = k; System.out.println("Compressing "+data.length+" integers using friendly interface"); - int[] compressed = iic.compress(data); + int[] compressed = iic.compress(data); int[] recov = iic.uncompress(compressed); System.out.println("compressed from "+data.length*4/1024+"KB to "+compressed.length*4/1024+"KB"); - if(!Arrays.equals(recov,data)) throw new RuntimeException("bug"); + if(!Arrays.equals(recov,data)) throw new RuntimeException("bug"); } public static void basicExample() { @@ -29,7 +30,7 @@ public static void basicExample() { // data should be sorted for best //results for(int k = 0; k < data.length; ++k) - data[k] = k; + data[k] = k; // Very important: the data is in sorted order!!! If not, you // will get very poor compression with IntegratedBinaryPacking, // you should use another CODEC. @@ -38,9 +39,9 @@ public static void basicExample() { // will be done with binary packing, and leftovers will // be processed using variable byte IntegratedIntegerCODEC codec = new - IntegratedComposition( - new IntegratedBinaryPacking(), - new IntegratedVariableByte()); + IntegratedComposition( + new IntegratedBinaryPacking(), + new IntegratedVariableByte()); // output vector should be large enough... int [] compressed = new int[data.length+1024]; // compressed might not be large enough in some cases @@ -66,17 +67,85 @@ public static void basicExample() { * * now uncompressing * + * This assumes that we otherwise know how many integers + * have been compressed, or we can bound it (e.g., you know that + * will never need to decore more than 2000 integers). + * See basicExampleHeadless for a + * more general case where you can manually manage the compressed + * array size. */ int[] recovered = new int[data.length]; IntWrapper recoffset = new IntWrapper(0); codec.uncompress(compressed,new IntWrapper(0),compressed.length,recovered,recoffset); if(Arrays.equals(data,recovered)) - System.out.println("data is recovered without loss"); + System.out.println("data is recovered without loss"); else - throw new RuntimeException("bug"); // could use assert + throw new RuntimeException("bug"); // could use assert System.out.println(); } + + /** + * Like the basicExample, but we store the input array size manually. + */ + @Test + public void basicExampleHeadless() { + int[] data = new int[2342351]; + System.out.println("Compressing " + data.length + " integers in one go using the headless approach"); + // data should be sorted for best + // results + for (int k = 0; k < data.length; ++k) + data[k] = k; + // Very important: the data is in sorted order!!! If not, you + // will get very poor compression with IntegratedBinaryPacking, + // you should use another CODEC. + + // next we compose a CODEC. Most of the processing + // will be done with binary packing, and leftovers will + // be processed using variable byte + SkippableIntegratedComposition codec = new SkippableIntegratedComposition(new IntegratedBinaryPacking(), + new IntegratedVariableByte()); + // output vector should be large enough... + int[] compressed = new int[data.length + 1024]; + // compressed might not be large enough in some cases + // if you get java.lang.ArrayIndexOutOfBoundsException, try + // allocating more memory + + /** + * + * compressing + * + */ + IntWrapper inputoffset = new IntWrapper(0); + IntWrapper outputoffset = new IntWrapper(1); + compressed[0] = data.length; // we manually store how many integers we + codec.headlessCompress(data, inputoffset, data.length, compressed, outputoffset, new IntWrapper(0)); + // got it! + // inputoffset should be at data.length but outputoffset tells + // us where we are... + System.out.println( + "compressed from " + data.length * 4 / 1024 + "KB to " + outputoffset.intValue() * 4 / 1024 + "KB"); + // we can repack the data: (optional) + compressed = Arrays.copyOf(compressed, outputoffset.intValue()); + + /** + * + * now uncompressing + * + */ + int howmany = compressed[0];// we manually stored the number of + // compressed integers + int[] recovered = new int[howmany]; + IntWrapper recoffset = new IntWrapper(0); + codec.headlessUncompress(compressed, new IntWrapper(1), compressed.length, recovered, recoffset, howmany, new IntWrapper(0)); + if (Arrays.equals(data, recovered)) + System.out.println("data is recovered without loss"); + else + throw new RuntimeException("bug"); // could use assert + System.out.println(); + } + + /** * This is an example to show you can compress unsorted integers * as long as most are small. @@ -91,9 +160,9 @@ public static void unsortedExample() { for(int k = 0; k < N; k+=533) data[k] = 10000; int[] compressed = new int [N+1024];// could need more IntegerCODEC codec = new - Composition( - new FastPFOR(), - new VariableByte()); + Composition( + new FastPFOR(), + new VariableByte()); // compressing IntWrapper inputoffset = new IntWrapper(0); IntWrapper outputoffset = new IntWrapper(0); @@ -106,9 +175,9 @@ public static void unsortedExample() { IntWrapper recoffset = new IntWrapper(0); codec.uncompress(compressed,new IntWrapper(0),compressed.length,recovered,recoffset); if(Arrays.equals(data,recovered)) - System.out.println("data is recovered without loss"); + System.out.println("data is recovered without loss"); else - throw new RuntimeException("bug"); // could use assert + throw new RuntimeException("bug"); // could use assert System.out.println(); } @@ -128,16 +197,16 @@ public static void advancedExample() { // data should be sorted for best //results for(int k = 0; k < data.length; ++k) - data[k] = k; + data[k] = k; // next we compose a CODEC. Most of the processing // will be done with binary packing, and leftovers will // be processed using variable byte, using variable byte // only for the last chunk! IntegratedIntegerCODEC regularcodec = new - IntegratedBinaryPacking(); + IntegratedBinaryPacking(); IntegratedVariableByte ivb = new IntegratedVariableByte(); IntegratedIntegerCODEC lastcodec = new - IntegratedComposition(regularcodec,ivb); + IntegratedComposition(regularcodec,ivb); // output vector should be large enough... int [] compressed = new int[TotalSize+1024]; @@ -151,7 +220,7 @@ public static void advancedExample() { IntWrapper outputoffset = new IntWrapper(0); for(int k = 0; k < TotalSize / ChunkSize; ++k) regularcodec.compress(data,inputoffset,ChunkSize,compressed,outputoffset); - lastcodec.compress(data, inputoffset, TotalSize % ChunkSize, compressed, outputoffset); + lastcodec.compress(data, inputoffset, TotalSize % ChunkSize, compressed, outputoffset); // got it! // inputoffset should be at data.length but outputoffset tells // us where we are... @@ -191,48 +260,46 @@ public static void advancedExample() { } - /* - * Demo of the headless approach where we must supply the array length - */ - public static void headlessDemo() { - System.out.println("Compressing arrays with minimal header..."); - int[] uncompressed1 = {1,2,1,3,1}; - int[] uncompressed2 = {3,2,4,6,1}; + /* + * Demo of the headless approach where we must supply the array length + */ + public static void headlessDemo() { + System.out.println("Compressing arrays with minimal header..."); + int[] uncompressed1 = {1,2,1,3,1}; + int[] uncompressed2 = {3,2,4,6,1}; - int[] compressed = new int[uncompressed1.length+uncompressed2.length+1024]; + int[] compressed = new int[uncompressed1.length+uncompressed2.length+1024]; - SkippableIntegerCODEC codec = new SkippableComposition(new BinaryPacking(), new VariableByte()); + SkippableIntegerCODEC codec = new SkippableComposition(new BinaryPacking(), new VariableByte()); - // compressing - IntWrapper outPos = new IntWrapper(); + // compressing + IntWrapper outPos = new IntWrapper(); - IntWrapper previous = new IntWrapper(); + IntWrapper previous = new IntWrapper(); - codec.headlessCompress(uncompressed1,new IntWrapper(),uncompressed1.length,compressed,outPos); - int length1 = outPos.get() - previous.get(); - previous = new IntWrapper(outPos.get()); - codec.headlessCompress(uncompressed2,new IntWrapper(),uncompressed2.length,compressed,outPos); - int length2 = outPos.get() - previous.get(); + codec.headlessCompress(uncompressed1,new IntWrapper(),uncompressed1.length,compressed,outPos); + int length1 = outPos.get() - previous.get(); + previous = new IntWrapper(outPos.get()); + codec.headlessCompress(uncompressed2,new IntWrapper(),uncompressed2.length,compressed,outPos); + int length2 = outPos.get() - previous.get(); - compressed = Arrays.copyOf(compressed,length1 + length2); - System.out.println("compressed unsorted integers from "+uncompressed1.length*4+"B to "+length1*4+"B"); - System.out.println("compressed unsorted integers from "+uncompressed2.length*4+"B to "+length2*4+"B"); - System.out.println("Total compressed output "+compressed.length); + compressed = Arrays.copyOf(compressed,length1 + length2); + System.out.println("compressed unsorted integers from "+uncompressed1.length*4+"B to "+length1*4+"B"); + System.out.println("compressed unsorted integers from "+uncompressed2.length*4+"B to "+length2*4+"B"); + System.out.println("Total compressed output "+compressed.length); - int[] recovered1 = new int[uncompressed1.length]; - int[] recovered2 = new int[uncompressed1.length]; - IntWrapper inPos = new IntWrapper(); - System.out.println("Decoding first array starting at pos = "+inPos); - codec.headlessUncompress(compressed,inPos, compressed.length, recovered1, new IntWrapper(0), uncompressed1.length); - System.out.println("Decoding second array starting at pos = "+inPos); - codec.headlessUncompress(compressed,inPos, compressed.length, recovered2, new IntWrapper(0), uncompressed2.length); - if(!Arrays.equals(uncompressed1,recovered1)) throw new RuntimeException("First array does not match."); - if(!Arrays.equals(uncompressed2,recovered2)) throw new RuntimeException("Second array does not match."); - System.out.println("The arrays match, your code is probably ok."); + int[] recovered1 = new int[uncompressed1.length]; + int[] recovered2 = new int[uncompressed1.length]; + IntWrapper inPos = new IntWrapper(); + System.out.println("Decoding first array starting at pos = "+inPos); + codec.headlessUncompress(compressed,inPos, compressed.length, recovered1, new IntWrapper(0), uncompressed1.length); + System.out.println("Decoding second array starting at pos = "+inPos); + codec.headlessUncompress(compressed,inPos, compressed.length, recovered2, new IntWrapper(0), uncompressed2.length); + if(!Arrays.equals(uncompressed1,recovered1)) throw new RuntimeException("First array does not match."); + if(!Arrays.equals(uncompressed2,recovered2)) throw new RuntimeException("Second array does not match."); + System.out.println("The arrays match, your code is probably ok."); - } + } } - - diff --git a/src/test/java/me/lemire/integercompression/ExampleTest.java b/src/test/java/me/lemire/integercompression/ExampleTest.java new file mode 100644 index 0000000..300983c --- /dev/null +++ b/src/test/java/me/lemire/integercompression/ExampleTest.java @@ -0,0 +1,314 @@ +package me.lemire.integercompression; + +import me.lemire.integercompression.differential.*; +import java.util.*; + +import org.junit.Test; + +/** + * + * + */ +public class ExampleTest { + /** + * + */ + @Test + + public void superSimpleExample() { + IntegratedIntCompressor iic = new IntegratedIntCompressor(); + int[] data = new int[2342351]; + for (int k = 0; k < data.length; ++k) + data[k] = k; + System.out.println("Compressing " + data.length + " integers using friendly interface"); + int[] compressed = iic.compress(data); + int[] recov = iic.uncompress(compressed); + System.out + .println("compressed from " + data.length * 4 / 1024 + "KB to " + compressed.length * 4 / 1024 + "KB"); + if (!Arrays.equals(recov, data)) + throw new RuntimeException("bug"); + } + + /** + * + */ + @Test + + public void basicExample() { + int[] data = new int[2342351]; + System.out.println("Compressing " + data.length + " integers in one go"); + // data should be sorted for best + // results + for (int k = 0; k < data.length; ++k) + data[k] = k; + // Very important: the data is in sorted order!!! If not, you + // will get very poor compression with IntegratedBinaryPacking, + // you should use another CODEC. + + // next we compose a CODEC. Most of the processing + // will be done with binary packing, and leftovers will + // be processed using variable byte + IntegratedIntegerCODEC codec = new IntegratedComposition(new IntegratedBinaryPacking(), + new IntegratedVariableByte()); + // output vector should be large enough... + int[] compressed = new int[data.length + 1024]; + // compressed might not be large enough in some cases + // if you get java.lang.ArrayIndexOutOfBoundsException, try + // allocating more memory + + /** + * + * compressing + * + */ + IntWrapper inputoffset = new IntWrapper(0); + IntWrapper outputoffset = new IntWrapper(0); + codec.compress(data, inputoffset, data.length, compressed, outputoffset); + // got it! + // inputoffset should be at data.length but outputoffset tells + // us where we are... + System.out.println( + "compressed from " + data.length * 4 / 1024 + "KB to " + outputoffset.intValue() * 4 / 1024 + "KB"); + // we can repack the data: (optional) + compressed = Arrays.copyOf(compressed, outputoffset.intValue()); + + /** + * + * now uncompressing + * + * This assumes that we otherwise know how many integers have been + * compressed. See basicExampleHeadless for a more general case. + */ + int[] recovered = new int[data.length]; + IntWrapper recoffset = new IntWrapper(0); + codec.uncompress(compressed, new IntWrapper(0), compressed.length, recovered, recoffset); + if (Arrays.equals(data, recovered)) + System.out.println("data is recovered without loss"); + else + throw new RuntimeException("bug"); // could use assert + System.out.println(); + } + + /** + * Like the basicExample, but we store the input array size manually. + */ + @Test + public void basicExampleHeadless() { + int[] data = new int[2342351]; + System.out.println("Compressing " + data.length + " integers in one go using the headless approach"); + // data should be sorted for best + // results + for (int k = 0; k < data.length; ++k) + data[k] = k; + // Very important: the data is in sorted order!!! If not, you + // will get very poor compression with IntegratedBinaryPacking, + // you should use another CODEC. + + // next we compose a CODEC. Most of the processing + // will be done with binary packing, and leftovers will + // be processed using variable byte + SkippableIntegratedComposition codec = new SkippableIntegratedComposition(new IntegratedBinaryPacking(), + new IntegratedVariableByte()); + // output vector should be large enough... + int[] compressed = new int[data.length + 1024]; + // compressed might not be large enough in some cases + // if you get java.lang.ArrayIndexOutOfBoundsException, try + // allocating more memory + + /** + * + * compressing + * + */ + IntWrapper inputoffset = new IntWrapper(0); + IntWrapper outputoffset = new IntWrapper(1); + compressed[0] = data.length; // we manually store how many integers we + codec.headlessCompress(data, inputoffset, data.length, compressed, outputoffset, new IntWrapper(0)); + // got it! + // inputoffset should be at data.length but outputoffset tells + // us where we are... + System.out.println( + "compressed from " + data.length * 4 / 1024 + "KB to " + outputoffset.intValue() * 4 / 1024 + "KB"); + // we can repack the data: (optional) + compressed = Arrays.copyOf(compressed, outputoffset.intValue()); + + /** + * + * now uncompressing + * + */ + int howmany = compressed[0];// we manually stored the number of + // compressed integers + int[] recovered = new int[howmany]; + IntWrapper recoffset = new IntWrapper(0); + codec.headlessUncompress(compressed, new IntWrapper(1), compressed.length, recovered, recoffset, howmany, new IntWrapper(0)); + if (Arrays.equals(data, recovered)) + System.out.println("data is recovered without loss"); + else + throw new RuntimeException("bug"); // could use assert + System.out.println(); + } + + /** + * This is an example to show you can compress unsorted integers as long as + * most are small. + */ + @Test + public void unsortedExample() { + final int N = 1333333; + int[] data = new int[N]; + // initialize the data (most will be small + for (int k = 0; k < N; k += 1) + data[k] = 3; + // throw some larger values + for (int k = 0; k < N; k += 5) + data[k] = 100; + for (int k = 0; k < N; k += 533) + data[k] = 10000; + int[] compressed = new int[N + 1024];// could need more + IntegerCODEC codec = new Composition(new FastPFOR(), new VariableByte()); + // compressing + IntWrapper inputoffset = new IntWrapper(0); + IntWrapper outputoffset = new IntWrapper(0); + codec.compress(data, inputoffset, data.length, compressed, outputoffset); + System.out.println("compressed unsorted integers from " + data.length * 4 / 1024 + "KB to " + + outputoffset.intValue() * 4 / 1024 + "KB"); + // we can repack the data: (optional) + compressed = Arrays.copyOf(compressed, outputoffset.intValue()); + + int[] recovered = new int[N]; + IntWrapper recoffset = new IntWrapper(0); + codec.uncompress(compressed, new IntWrapper(0), compressed.length, recovered, recoffset); + if (Arrays.equals(data, recovered)) + System.out.println("data is recovered without loss"); + else + throw new RuntimeException("bug"); // could use assert + System.out.println(); + + } + + /** + * This is like the basic example, but we show how to process larger arrays + * in chunks. + * + * Some of this code was written by Pavel Klinov. + */ + @Test + public void advancedExample() { + int TotalSize = 2342351; // some arbitrary number + int ChunkSize = 16384; // size of each chunk, choose a multiple of 128 + System.out.println("Compressing " + TotalSize + " integers using chunks of " + ChunkSize + " integers (" + + ChunkSize * 4 / 1024 + "KB)"); + System.out.println("(It is often better for applications to work in chunks fitting in CPU cache.)"); + int[] data = new int[TotalSize]; + // data should be sorted for best + // results + for (int k = 0; k < data.length; ++k) + data[k] = k; + // next we compose a CODEC. Most of the processing + // will be done with binary packing, and leftovers will + // be processed using variable byte, using variable byte + // only for the last chunk! + IntegratedIntegerCODEC regularcodec = new IntegratedBinaryPacking(); + IntegratedVariableByte ivb = new IntegratedVariableByte(); + IntegratedIntegerCODEC lastcodec = new IntegratedComposition(regularcodec, ivb); + // output vector should be large enough... + int[] compressed = new int[TotalSize + 1024]; + + /** + * + * compressing + * + */ + IntWrapper inputoffset = new IntWrapper(0); + IntWrapper outputoffset = new IntWrapper(0); + for (int k = 0; k < TotalSize / ChunkSize; ++k) + regularcodec.compress(data, inputoffset, ChunkSize, compressed, outputoffset); + lastcodec.compress(data, inputoffset, TotalSize % ChunkSize, compressed, outputoffset); + // got it! + // inputoffset should be at data.length but outputoffset tells + // us where we are... + System.out.println( + "compressed from " + data.length * 4 / 1024 + "KB to " + outputoffset.intValue() * 4 / 1024 + "KB"); + // we can repack the data: + compressed = Arrays.copyOf(compressed, outputoffset.intValue()); + + /** + * + * now uncompressing + * + * We are *not* assuming that the original array length is known, + * however we assume that the chunk size (ChunkSize) is known. + * + */ + int[] recovered = new int[ChunkSize]; + IntWrapper compoff = new IntWrapper(0); + IntWrapper recoffset; + int currentpos = 0; + + while (compoff.get() < compressed.length) { + recoffset = new IntWrapper(0); + regularcodec.uncompress(compressed, compoff, compressed.length - compoff.get(), recovered, recoffset); + + if (recoffset.get() < ChunkSize) {// last chunk detected + ivb.uncompress(compressed, compoff, compressed.length - compoff.get(), recovered, recoffset); + } + for (int i = 0; i < recoffset.get(); ++i) { + if (data[currentpos + i] != recovered[i]) + throw new RuntimeException("bug"); // could use assert + } + currentpos += recoffset.get(); + } + System.out.println("data is recovered without loss"); + System.out.println(); + + } + + /** + * Demo of the headless approach where we must supply the array length + */ + @Test + public void headlessDemo() { + System.out.println("Compressing arrays with minimal header..."); + int[] uncompressed1 = { 1, 2, 1, 3, 1 }; + int[] uncompressed2 = { 3, 2, 4, 6, 1 }; + + int[] compressed = new int[uncompressed1.length + uncompressed2.length + 1024]; + + SkippableIntegerCODEC codec = new SkippableComposition(new BinaryPacking(), new VariableByte()); + + // compressing + IntWrapper outPos = new IntWrapper(); + + IntWrapper previous = new IntWrapper(); + + codec.headlessCompress(uncompressed1, new IntWrapper(), uncompressed1.length, compressed, outPos); + int length1 = outPos.get() - previous.get(); + previous = new IntWrapper(outPos.get()); + codec.headlessCompress(uncompressed2, new IntWrapper(), uncompressed2.length, compressed, outPos); + int length2 = outPos.get() - previous.get(); + + compressed = Arrays.copyOf(compressed, length1 + length2); + System.out + .println("compressed unsorted integers from " + uncompressed1.length * 4 + "B to " + length1 * 4 + "B"); + System.out + .println("compressed unsorted integers from " + uncompressed2.length * 4 + "B to " + length2 * 4 + "B"); + System.out.println("Total compressed output " + compressed.length); + + int[] recovered1 = new int[uncompressed1.length]; + int[] recovered2 = new int[uncompressed1.length]; + IntWrapper inPos = new IntWrapper(); + System.out.println("Decoding first array starting at pos = " + inPos); + codec.headlessUncompress(compressed, inPos, compressed.length, recovered1, new IntWrapper(0), + uncompressed1.length); + System.out.println("Decoding second array starting at pos = " + inPos); + codec.headlessUncompress(compressed, inPos, compressed.length, recovered2, new IntWrapper(0), + uncompressed2.length); + if (!Arrays.equals(uncompressed1, recovered1)) + throw new RuntimeException("First array does not match."); + if (!Arrays.equals(uncompressed2, recovered2)) + throw new RuntimeException("Second array does not match."); + System.out.println("The arrays match, your code is probably ok."); + + } +} From ce4bde3f032cdf1f6eacd0f901f82750de231609 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Sat, 12 Mar 2016 18:13:56 -0500 Subject: [PATCH 247/412] Reformat --- example.java | 116 +++++++++++++++++++++++++-------------------------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/example.java b/example.java index 6f421ed..6569ebd 100644 --- a/example.java +++ b/example.java @@ -86,64 +86,64 @@ public static void basicExample() { /** - * Like the basicExample, but we store the input array size manually. - */ - @Test - public void basicExampleHeadless() { - int[] data = new int[2342351]; - System.out.println("Compressing " + data.length + " integers in one go using the headless approach"); - // data should be sorted for best - // results - for (int k = 0; k < data.length; ++k) - data[k] = k; - // Very important: the data is in sorted order!!! If not, you - // will get very poor compression with IntegratedBinaryPacking, - // you should use another CODEC. - - // next we compose a CODEC. Most of the processing - // will be done with binary packing, and leftovers will - // be processed using variable byte - SkippableIntegratedComposition codec = new SkippableIntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()); - // output vector should be large enough... - int[] compressed = new int[data.length + 1024]; - // compressed might not be large enough in some cases - // if you get java.lang.ArrayIndexOutOfBoundsException, try - // allocating more memory - - /** - * - * compressing - * - */ - IntWrapper inputoffset = new IntWrapper(0); - IntWrapper outputoffset = new IntWrapper(1); - compressed[0] = data.length; // we manually store how many integers we - codec.headlessCompress(data, inputoffset, data.length, compressed, outputoffset, new IntWrapper(0)); - // got it! - // inputoffset should be at data.length but outputoffset tells - // us where we are... - System.out.println( - "compressed from " + data.length * 4 / 1024 + "KB to " + outputoffset.intValue() * 4 / 1024 + "KB"); - // we can repack the data: (optional) - compressed = Arrays.copyOf(compressed, outputoffset.intValue()); - - /** - * - * now uncompressing - * - */ - int howmany = compressed[0];// we manually stored the number of - // compressed integers - int[] recovered = new int[howmany]; - IntWrapper recoffset = new IntWrapper(0); - codec.headlessUncompress(compressed, new IntWrapper(1), compressed.length, recovered, recoffset, howmany, new IntWrapper(0)); - if (Arrays.equals(data, recovered)) - System.out.println("data is recovered without loss"); - else - throw new RuntimeException("bug"); // could use assert - System.out.println(); - } + * Like the basicExample, but we store the input array size manually. + */ + @Test + public void basicExampleHeadless() { + int[] data = new int[2342351]; + System.out.println("Compressing " + data.length + " integers in one go using the headless approach"); + // data should be sorted for best + // results + for (int k = 0; k < data.length; ++k) + data[k] = k; + // Very important: the data is in sorted order!!! If not, you + // will get very poor compression with IntegratedBinaryPacking, + // you should use another CODEC. + + // next we compose a CODEC. Most of the processing + // will be done with binary packing, and leftovers will + // be processed using variable byte + SkippableIntegratedComposition codec = new SkippableIntegratedComposition(new IntegratedBinaryPacking(), + new IntegratedVariableByte()); + // output vector should be large enough... + int[] compressed = new int[data.length + 1024]; + // compressed might not be large enough in some cases + // if you get java.lang.ArrayIndexOutOfBoundsException, try + // allocating more memory + + /** + * + * compressing + * + */ + IntWrapper inputoffset = new IntWrapper(0); + IntWrapper outputoffset = new IntWrapper(1); + compressed[0] = data.length; // we manually store how many integers we + codec.headlessCompress(data, inputoffset, data.length, compressed, outputoffset, new IntWrapper(0)); + // got it! + // inputoffset should be at data.length but outputoffset tells + // us where we are... + System.out.println( + "compressed from " + data.length * 4 / 1024 + "KB to " + outputoffset.intValue() * 4 / 1024 + "KB"); + // we can repack the data: (optional) + compressed = Arrays.copyOf(compressed, outputoffset.intValue()); + + /** + * + * now uncompressing + * + */ + int howmany = compressed[0];// we manually stored the number of + // compressed integers + int[] recovered = new int[howmany]; + IntWrapper recoffset = new IntWrapper(0); + codec.headlessUncompress(compressed, new IntWrapper(1), compressed.length, recovered, recoffset, howmany, new IntWrapper(0)); + if (Arrays.equals(data, recovered)) + System.out.println("data is recovered without loss"); + else + throw new RuntimeException("bug"); // could use assert + System.out.println(); + } /** From 16caafa7c8cd3687b9842a27f70e2c3baea4f35e Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Thu, 7 Apr 2016 18:58:19 -0400 Subject: [PATCH 248/412] Adding an example. --- README.md | 2 +- examples/Axelbrooke/CompressBitmap.java | 97 ++++++++++++++++++++++++ examples/Axelbrooke/README.md | 0 examples/Axelbrooke/example_bitmap.bin | Bin 0 -> 2961813 bytes examples/Axelbrooke/run.sh | 3 + 5 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 examples/Axelbrooke/CompressBitmap.java create mode 100644 examples/Axelbrooke/README.md create mode 100644 examples/Axelbrooke/example_bitmap.bin create mode 100755 examples/Axelbrooke/run.sh diff --git a/README.md b/README.md index 78d5e89..b15ef84 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ Really simple usage: int[] recov = iic.uncompress(compressed); // equals to data ``` -For more examples, see example.java. +For more examples, see example.java or the examples folder. Some CODECs ("integrated codecs") assume that the integers are in sorted orders and use differential coding (they compress deltas). diff --git a/examples/Axelbrooke/CompressBitmap.java b/examples/Axelbrooke/CompressBitmap.java new file mode 100644 index 0000000..c641c65 --- /dev/null +++ b/examples/Axelbrooke/CompressBitmap.java @@ -0,0 +1,97 @@ +import java.io.*; +import java.nio.file.*; +import java.util.*; +import java.util.zip.*; + +import me.lemire.integercompression.differential.*; +import me.lemire.integercompression.*; + + +public class CompressBitmap { + + public static void main(String[] args) throws IOException { + if(args.length == 0) { + System.out.println("usage: please provide the file name of a bitmap binary file."); + return; + } + System.out.println("loading file "+args[0]+" as a bitmap"); + int[] data = fromBitsetFileToArray(args[0]); + System.out.println("Compressing "+data.length+" integers"); + int[] compressed = iic.compress(data); + int[] recov = iic.uncompress(compressed); + System.out.println("compressed from "+data.length*4/1024+"KB to "+compressed.length*4/1024+"KB"); + System.out.println("ratio: "+Math.round(data.length*1.0/compressed.length)); + + if(!Arrays.equals(recov,data)) throw new RuntimeException("bug"); + + long bef,aft; + bef = System.nanoTime(); + recov = iic.uncompress(compressed); + aft = System.nanoTime(); + + System.out.println("decoding speed:"+Math.round(data.length*1000.0/(aft-bef))+" millions of integers per second"); + + + bef = System.nanoTime(); + compressed = iic.compress(data); + aft = System.nanoTime(); + + System.out.println("encoding speed:"+Math.round(data.length*1000.0/(aft-bef))+" millions of integers per second"); + + System.out.println("note: with a bit of effort, speed can be much higher."); + + + System.out.println(); + zipStats(args[0]); + + + } + + static IntegratedIntCompressor iic = new IntegratedIntCompressor( + new SkippableIntegratedComposition( + new IntegratedBinaryPacking(), + new IntegratedVariableByte())); + + public static int[] fromBitsetFileToArray(String filename) throws IOException { + Path path = Paths.get(filename); + byte[] data = Files.readAllBytes(path); + // we determine cardinality + int card = 0; + for(int k = 0 ; k < data.length; ++k) { + int bv = data[k] & 0xFF; + card += Integer.bitCount(bv); + } + int[] answer = new int[card]; + int pos = 0; + for(int k = 0 ; k < data.length; ++k) { + int bv = data[k] & 0xFF; + for(int b = 0 ; b < 8; ++b) + if ( ( (bv >> b) & 1 ) == 1) { + answer[pos++] = b + k * 8; + } + } + if(pos != card) throw new RuntimeException("bug"); + return answer; + } + + public static void zipStats(String filename) throws IOException { + Path path = Paths.get(filename); + byte[] input = Files.readAllBytes(path); + System.out.println("I will try to compress the original bitmap using zip."); + + long bef = System.nanoTime(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ZipOutputStream zos = new ZipOutputStream(baos); + zos.setLevel(9); + ZipEntry entry = new ZipEntry(filename); + entry.setSize(input.length); + zos.putNextEntry(entry); + zos.write(input); + zos.closeEntry(); + zos.close(); + byte[] result = baos.toByteArray(); + long aft = System.nanoTime(); + System.out.println("zip encoding speed:"+input.length*1000.0/(aft-bef)+" million of bytes per second"); + System.out.println("zip compression ratio at best level : "+input.length * 1.0 / result.length); + } +} \ No newline at end of file diff --git a/examples/Axelbrooke/README.md b/examples/Axelbrooke/README.md new file mode 100644 index 0000000..e69de29 diff --git a/examples/Axelbrooke/example_bitmap.bin b/examples/Axelbrooke/example_bitmap.bin new file mode 100644 index 0000000000000000000000000000000000000000..7a00138d684db3acd27577fa6252de07b2d0f16a GIT binary patch literal 2961813 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

    |hg)I9$Fo=1Cuvh!`y6 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%0Dt9-%<5&3=^*F_~L6+98C57Hrh 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

    ;YiQGG$HzG_cTKor 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


    )3im#cyr&Evy+t;F~ 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ěPJYo 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�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

    B=>@ga?xP^&o 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 AO8@`> literal 0 HcmV?d00001 diff --git a/examples/Axelbrooke/run.sh b/examples/Axelbrooke/run.sh new file mode 100755 index 0000000..59bcd94 --- /dev/null +++ b/examples/Axelbrooke/run.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +echo "please be patient as I build the library and the example" + mvn -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -f ../../pom.xml package > /dev/null && javac -cp "../../target/*" CompressBitmap.java && java -cp "../../target/*":. CompressBitmap example_bitmap.bin From 9d5914131134ecbda7bad97c36a4684aca462e8a Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Thu, 7 Apr 2016 18:59:13 -0400 Subject: [PATCH 249/412] Forgot to save content --- examples/Axelbrooke/README.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/examples/Axelbrooke/README.md b/examples/Axelbrooke/README.md index e69de29..fad997e 100644 --- a/examples/Axelbrooke/README.md +++ b/examples/Axelbrooke/README.md @@ -0,0 +1,25 @@ +# Bitset compression example + +A bitset can be considered as an array of integers. +Suppose you want to compress it quickly (at a rate of + millions of integers per second or better). + + The ``CompressBitmap.java`` file shows how it can be done. + +## Usage + +```bash +./run.sh + +loading file example_bitmap.bin as a bitmap +Compressing 1784073 integers +compressed from 6969KB to 1348KB +ratio: 5 +decoding speed:199 millions of integers per second +encoding speed:124 millions of integers per second +note: with a bit of effort, speed can be much higher. + +I will try to compress the original bitmap using zip. +zip encoding speed:0.4458317816544745 million of bytes per second +zip compression ratio at best level : 2.255323798747234 +``` From 871ceb5b8a0f93a079fe0ca08c5275353435e09e Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Sun, 10 Apr 2016 10:31:27 -0400 Subject: [PATCH 250/412] Source should be 1.6 or better, surely. --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index c4afee9..1406b43 100644 --- a/pom.xml +++ b/pom.xml @@ -5,8 +5,8 @@ 0.1.7-SNAPSHOT jar - 1.5 - 1.5 + 1.6 + 1.6 UTF-8 From f83240c3a9e53b2d60849f5f1c3f88a31631241e Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Sun, 10 Apr 2016 10:49:38 -0400 Subject: [PATCH 251/412] Excluding some files from documentation. --- pom.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pom.xml b/pom.xml index 1406b43..999fd09 100644 --- a/pom.xml +++ b/pom.xml @@ -101,6 +101,9 @@ org.apache.maven.plugins maven-javadoc-plugin 2.8 + + com.kamikaze.pfordelta:me.lemire.integercompression.benchmarktools + attach-javadocs @@ -127,6 +130,10 @@ org.jacoco jacoco-maven-plugin 0.7.2.201409121644 + + com/kamikaze/pfordelta/* + me/lemire/integercompression/benchmarktools/* + prepare-agent From d89453e667b0a7af63b7f2c2a334ae3780f5bd57 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Sun, 10 Apr 2016 14:12:25 -0400 Subject: [PATCH 252/412] Updating coverage plugin. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 999fd09..fe3f723 100644 --- a/pom.xml +++ b/pom.xml @@ -146,7 +146,7 @@ org.eluder.coveralls coveralls-maven-plugin - 3.1.0 + 3.2.1 From e652298eb17498acd6f0dcd0084bf199ba186121 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Sun, 10 Apr 2016 14:32:52 -0400 Subject: [PATCH 253/412] Updating jacobo plugin. --- pom.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fe3f723..ff274b0 100644 --- a/pom.xml +++ b/pom.xml @@ -129,10 +129,12 @@ org.jacoco jacoco-maven-plugin - 0.7.2.201409121644 + 0.7.6.201602180812 + com/kamikaze/pfordelta/* me/lemire/integercompression/benchmarktools/* + From 6e498d63b04f2be84ae040fd77f1b3fdf6c40ed8 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Sun, 10 Apr 2016 21:39:02 -0400 Subject: [PATCH 254/412] Updating oss-parent. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ff274b0..967f17a 100644 --- a/pom.xml +++ b/pom.xml @@ -56,7 +56,7 @@ org.sonatype.oss oss-parent - 5 + 9 From 4eab2b38d28c86900ff0c0f88037aa61a4f357f1 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 20 Apr 2016 19:56:02 -0400 Subject: [PATCH 255/412] Adding reference. --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b15ef84..af79474 100644 --- a/README.md +++ b/README.md @@ -203,9 +203,8 @@ He also posted his slides online: http://www.slideshare.net/ikhtearSharif/ikhtea Other recommended libraries ----------------------------- -TurboPFor is a C library that offers lots of interesting optimizations and Java wrappers. Well worth checking! - -https://github.com/powturbo/TurboPFor +* CSharpFastPFOR: A C# integer compression library https://github.com/Genbox/CSharpFastPFOR +* TurboPFor is a C library that offers lots of interesting optimizations and Java wrappers. Well worth checking! (Uses a GPL license.) https://github.com/powturbo/TurboPFor Funding ----------- From 737b4216b2b1f3e2bfe636e3fd85110b68c289bf Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 20 Apr 2016 19:59:47 -0400 Subject: [PATCH 256/412] Adding another lib. ref. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index af79474..bc7a4aa 100644 --- a/README.md +++ b/README.md @@ -203,6 +203,7 @@ He also posted his slides online: http://www.slideshare.net/ikhtearSharif/ikhtea Other recommended libraries ----------------------------- +* Encoding: Integer Compression Libraries for Go https://github.com/zhenjl/encoding * CSharpFastPFOR: A C# integer compression library https://github.com/Genbox/CSharpFastPFOR * TurboPFor is a C library that offers lots of interesting optimizations and Java wrappers. Well worth checking! (Uses a GPL license.) https://github.com/powturbo/TurboPFor From 4842c942b6060a0e06afa8a59cf66c7fbe6ea405 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 22 Apr 2016 18:12:03 -0400 Subject: [PATCH 257/412] Documentation fix. --- CHANGELOG | 3 ++ .../lemire/integercompression/FastPFOR.java | 30 +++++++++---------- .../integercompression/FastPFOR128.java | 28 ++++++++--------- 3 files changed, 32 insertions(+), 29 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 660b5bf..14d7b68 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +0.1.7 (April 22nd 2016) + - Documentation fix. + 0.1.4, 0.1.5, 0.1.6 (November 25th 2015) - Added IntCompressor and IntegratedIntCompressor for users looking for a simpler API diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 4f0591f..d10576f 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -16,8 +16,8 @@ * up to 65536 integers. Note that it is important, to get good * compression and good performance, to use sizeable blocks (greater than 1024 integers). * For arrays containing a number of integers that is not divisible by BLOCK_SIZE, you should use - * it in conjunction with another CODEC: - * + * it in conjunction with another CODEC: + * * IntegerCODEC ic = new Composition(new FastPFOR(), new VariableByte()). *

    * For details, please see: @@ -29,23 +29,23 @@ *

    *

    For sufficiently compressible and long arrays, it is faster and better than other PFOR * schemes.

    - * + * * Note that this does not use differential coding: if you are working on sorted - * lists, use IntegratedFastPFOR instead. + * lists, you should first compute deltas, see {@link #me.lemire.integercompression.differential.Delta#delta}. * * For multi-threaded applications, each thread should use its own FastPFOR * object. - * + * * @author Daniel Lemire */ public final class FastPFOR implements IntegerCODEC,SkippableIntegerCODEC { final static int OVERHEAD_OF_EACH_EXCEPT = 8; /** - * + * */ public final static int DEFAULT_PAGE_SIZE = 65536; /** - * + * */ public final static int BLOCK_SIZE = 256; @@ -57,11 +57,11 @@ public final class FastPFOR implements IntegerCODEC,SkippableIntegerCODEC { final int[] dataPointers = new int[33]; final int[] freqs = new int[33]; final int[] bestbbestcexceptmaxb = new int[3]; - + /** * Construct the FastPFOR CODEC. - * + * * @param pagesize * the desired page size (recommended value is FastPFOR.DEFAULT_PAGE_SIZE) */ @@ -85,7 +85,7 @@ public FastPFOR() { /** * Compress data in blocks of BLOCK_SIZE integers (if fewer than BLOCK_SIZE integers * are provided, nothing is done). - * + * * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) */ @Override @@ -93,7 +93,7 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); // Allocate memory for working area. - + final int finalinpos = inpos.get() + inlength; while (inpos.get() != finalinpos) { int thissize = Math.min(pageSize, @@ -101,7 +101,7 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, encodePage(in, inpos, thissize, out, outpos); } - + } private void getBestBFromData(int[] in, int pos) { @@ -215,7 +215,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, * Uncompress data in blocks of integers. In this particular case, * the inlength parameter is ignored: it is deduced from the compressed * data. - * + * * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) */ @Override @@ -292,7 +292,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, for (int k = 0; k < cexcept; ++k) { final int pos = byteContainer.get() &0xFF; out[pos + tmpoutpos] |= 1 << b; - } + } } else { for (int k = 0; k < cexcept; ++k) { final int pos = byteContainer.get() &0xFF; @@ -313,7 +313,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, return; out[outpos.get()] = inlength; outpos.increment(); - headlessCompress(in, inpos, inlength, out, outpos); + headlessCompress(in, inpos, inlength, out, outpos); } @Override diff --git a/src/main/java/me/lemire/integercompression/FastPFOR128.java b/src/main/java/me/lemire/integercompression/FastPFOR128.java index 50ccc2d..a5ba5d1 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR128.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR128.java @@ -12,23 +12,23 @@ /** * This class is similar to FastPFOR but uses a small block size. - * + * * Note that this does not use differential coding: if you are working on sorted - * lists, use IntegratedFastPFOR instead. - * + * lists, you should first compute deltas, see {@link #me.lemire.integercompression.differential.Delta#delta}. + * * For multi-threaded applications, each thread should use its own FastPFOR * object. - * + * * @author Daniel Lemire */ public final class FastPFOR128 implements IntegerCODEC,SkippableIntegerCODEC { final static int OVERHEAD_OF_EACH_EXCEPT = 8; /** - * + * */ public final static int DEFAULT_PAGE_SIZE = 65536; /** - * + * */ public final static int BLOCK_SIZE = 128; @@ -40,10 +40,10 @@ public final class FastPFOR128 implements IntegerCODEC,SkippableIntegerCODEC { final int[] dataPointers = new int[33]; final int[] freqs = new int[33]; final int[] bestbbestcexceptmaxb = new int[3]; - + /** * Construct the FastPFOR CODEC. - * + * * @param pagesize * the desired page size (recommended value is FastPFOR.DEFAULT_PAGE_SIZE) */ @@ -66,7 +66,7 @@ public FastPFOR128() { /** * Compress data in blocks of BLOCK_SIZE integers (if fewer than BLOCK_SIZE integers * are provided, nothing is done). - * + * * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) */ @Override @@ -192,7 +192,7 @@ private void encodePage(int[] in, IntWrapper inpos, int thissize, * Uncompress data in blocks of integers. In this particular case, * the inlength parameter is ignored: it is deduced from the compressed * data. - * + * * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) */ @Override @@ -271,7 +271,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, for (int k = 0; k < cexcept; ++k) { final int pos = byteContainer.get() &0xFF; out[pos + tmpoutpos] |= 1 << b; - } + } } else { for (int k = 0; k < cexcept; ++k) { final int pos = byteContainer.get() &0xFF; @@ -284,7 +284,7 @@ private void decodePage(int[] in, IntWrapper inpos, int[] out, outpos.set(tmpoutpos); inpos.set(inexcept); } - + @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { @@ -293,7 +293,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, return; out[outpos.get()] = inlength; outpos.increment(); - headlessCompress(in, inpos, inlength, out, outpos); + headlessCompress(in, inpos, inlength, out, outpos); } @Override @@ -305,7 +305,7 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, inpos.increment(); headlessUncompress(in, inpos, inlength, out, outpos, outlength); } - + @Override public String toString() { return this.getClass().getSimpleName(); From efbdfd70b5b2d65a8d60d034db387bbe9edd6ed8 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 22 Apr 2016 18:12:38 -0400 Subject: [PATCH 258/412] Changing link for see --- src/main/java/me/lemire/integercompression/FastPFOR.java | 2 +- src/main/java/me/lemire/integercompression/FastPFOR128.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index d10576f..bc9cbec 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -31,7 +31,7 @@ * schemes.

    * * Note that this does not use differential coding: if you are working on sorted - * lists, you should first compute deltas, see {@link #me.lemire.integercompression.differential.Delta#delta}. + * lists, you should first compute deltas, @see me.lemire.integercompression.differential.Delta#delta. * * For multi-threaded applications, each thread should use its own FastPFOR * object. diff --git a/src/main/java/me/lemire/integercompression/FastPFOR128.java b/src/main/java/me/lemire/integercompression/FastPFOR128.java index a5ba5d1..c1efa94 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR128.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR128.java @@ -14,7 +14,7 @@ * This class is similar to FastPFOR but uses a small block size. * * Note that this does not use differential coding: if you are working on sorted - * lists, you should first compute deltas, see {@link #me.lemire.integercompression.differential.Delta#delta}. + * lists, you should first compute deltas, @see me.lemire.integercompression.differential.Delta#delta. * * For multi-threaded applications, each thread should use its own FastPFOR * object. From 890d51fc5dde7eceb9d389136c66ac919f58fa22 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 22 Apr 2016 18:13:46 -0400 Subject: [PATCH 259/412] [maven-release-plugin] prepare release JavaFastPFOR-0.1.7 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 967f17a..effa84b 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.1.7-SNAPSHOT + 0.1.7 jar 1.6 From 11e2fbf0d77a626ef7150ea6f87721b9b6213b9c Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 22 Apr 2016 18:13:48 -0400 Subject: [PATCH 260/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index effa84b..bdd7b57 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.1.7 + 0.1.8-SNAPSHOT jar 1.6 From 821e8e6b8bc77786b7a24ad696e739551a1d1620 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Sun, 7 Aug 2016 11:28:44 -0400 Subject: [PATCH 261/412] Not sure. --- .../benchmarktools/BenchmarkOffsettedSeries.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkOffsettedSeries.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkOffsettedSeries.java index d9243bd..c31411d 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkOffsettedSeries.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkOffsettedSeries.java @@ -88,7 +88,7 @@ private static void benchmarkSine(final PrintWriter csvWriter, final IntegerCODEC[] codecs, final int count, final int length, final int mean, final int range, final int freq) { String dataProp = String.format( - "(mean=%1$d range=%2$d freq=%2$d)", mean, range, freq); + "(mean=%1$d range=%2$d freq=%3$d)", mean, range, freq); int[][] data = generateSineDataChunks(0, count, length, mean, range, freq); benchmark(csvWriter, "Sine " + dataProp, codecs, data, From 39536e72195fd4d34464da49107551d47a1a78f7 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 13 Sep 2016 17:15:42 -0400 Subject: [PATCH 262/412] Preparing release --- CHANGELOG | 3 + .../integercompression/GroupSimple9.java | 3692 +++++++++++++++++ .../me/lemire/integercompression/S16.java | 379 +- .../java/me/lemire/integercompression/S9.java | 363 +- .../lemire/integercompression/Simple16.java | 358 +- .../me/lemire/integercompression/Simple9.java | 557 ++- .../me/lemire/integercompression/Util.java | 10 +- .../benchmarktools/Benchmark.java | 21 +- .../lemire/integercompression/BasicTest.java | 9 + 9 files changed, 4536 insertions(+), 856 deletions(-) create mode 100644 src/main/java/me/lemire/integercompression/GroupSimple9.java diff --git a/CHANGELOG b/CHANGELOG index 14d7b68..a899df4 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +0.1.8 (September 13th 2016) + - Added GroupSimple9 + 0.1.7 (April 22nd 2016) - Documentation fix. diff --git a/src/main/java/me/lemire/integercompression/GroupSimple9.java b/src/main/java/me/lemire/integercompression/GroupSimple9.java new file mode 100644 index 0000000..d109fee --- /dev/null +++ b/src/main/java/me/lemire/integercompression/GroupSimple9.java @@ -0,0 +1,3692 @@ +package me.lemire.integercompression; + +/** + * Group Simple 9 Credit Kun Jiang, Yuexiang Yang and Qinghua Zheng source: + * https://github.com/deeper2/simple + * + * Adapted by D. Lemire. + */ + +public final class GroupSimple9 implements IntegerCODEC { + + private static final int[][] M = { { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, { 9, 10, 11, 12, 13, 14, 15, 16, 17 }, + { 18, 19, 20, 21, 22, 23, 24, 25, 26 }, { 27, 28, 29, 30, 31, 32, 33, 34, 35 }, + { 36, 37, 38, 39, 40, 41, 42, 43, 44 }, { 45, 46, 47, 48, 49, 50, 51, 52, 53 }, + { 54, 55, 56, 57, 58, 59, 60, 61, 62 }, { 63, 64, 65, 66, 67, 68, 69, 70, 71 }, + { 72, 73, 74, 75, 76, 77, 78, 79, 80 } }; + + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int out[], IntWrapper outpos) { + int tmpoutpos = outpos.get(); + int currentPos = inpos.get(); + int selector1 = 0; + int selector2 = 0; + out[tmpoutpos++] = inlength; + outpos.add(1); + final int finalin = currentPos + inlength; + while (currentPos < finalin - 28 * 2) { + mainloop1: for (selector1=0; selector1 <= 8; selector1++) { + int compressedNum = codeNum[selector1]; + //if (finalin <= currentPos + compressedNum - 1) + // compressedNum = finalin - currentPos; + int b = bitLength[selector1]; + int max = 1 << b; + int i = 0; + for (; i < compressedNum; i++) { + if (Util.smallerorequalthan(max, in[currentPos + i])) + continue mainloop1; + } + currentPos += compressedNum; + break; + } + mainloop2: for (selector2 = 0; selector2 <= 8; selector2++) { + int compressedNum = codeNum[selector2]; + //if (finalin <= currentPos + compressedNum - 1) + // compressedNum = finalin - currentPos; + int b = bitLength[selector2]; + int max = 1 << b; + int i = 0; + for (; i < compressedNum; i++) { + if (Util.smallerorequalthan(max, in[currentPos + i])) + continue mainloop2; + } + currentPos += compressedNum; + break; + } + int code = M[selector1][selector2]; + out[tmpoutpos] = 0; + out[tmpoutpos + 1] = 0; + switch (code) { + case 0: + encode0(in, inpos, code, out, outpos); + break; + case 1: + encode1(in, inpos, code, out, outpos); + break; + case 2: + encode2(in, inpos, code, out, outpos); + break; + case 3: + encode3(in, inpos, code, out, outpos); + break; + case 4: + encode4(in, inpos, code, out, outpos); + break; + case 5: + encode5(in, inpos, code, out, outpos); + break; + case 6: + encode6(in, inpos, code, out, outpos); + break; + case 7: + encode7(in, inpos, code, out, outpos); + break; + case 8: + encode8(in, inpos, code, out, outpos); + break; + case 9: + encode9(in, inpos, code, out, outpos); + break; + case 10: + encode10(in, inpos, code, out, outpos); + break; + case 11: + encode11(in, inpos, code, out, outpos); + break; + case 12: + encode12(in, inpos, code, out, outpos); + break; + case 13: + encode13(in, inpos, code, out, outpos); + break; + case 14: + encode14(in, inpos, code, out, outpos); + break; + case 15: + encode15(in, inpos, code, out, outpos); + break; + case 16: + encode16(in, inpos, code, out, outpos); + break; + case 17: + encode17(in, inpos, code, out, outpos); + break; + case 18: + encode18(in, inpos, code, out, outpos); + break; + case 19: + encode19(in, inpos, code, out, outpos); + break; + case 20: + encode20(in, inpos, code, out, outpos); + break; + case 21: + encode21(in, inpos, code, out, outpos); + break; + case 22: + encode22(in, inpos, code, out, outpos); + break; + case 23: + encode23(in, inpos, code, out, outpos); + break; + case 24: + encode24(in, inpos, code, out, outpos); + break; + case 25: + encode25(in, inpos, code, out, outpos); + break; + case 26: + encode26(in, inpos, code, out, outpos); + break; + case 27: + encode27(in, inpos, code, out, outpos); + break; + case 28: + encode28(in, inpos, code, out, outpos); + break; + case 29: + encode29(in, inpos, code, out, outpos); + break; + case 30: + encode30(in, inpos, code, out, outpos); + break; + case 31: + encode31(in, inpos, code, out, outpos); + break; + case 32: + encode32(in, inpos, code, out, outpos); + break; + case 33: + encode33(in, inpos, code, out, outpos); + break; + case 34: + encode34(in, inpos, code, out, outpos); + break; + case 35: + encode35(in, inpos, code, out, outpos); + break; + case 36: + encode36(in, inpos, code, out, outpos); + break; + case 37: + encode37(in, inpos, code, out, outpos); + break; + case 38: + encode38(in, inpos, code, out, outpos); + break; + case 39: + encode39(in, inpos, code, out, outpos); + break; + case 40: + encode40(in, inpos, code, out, outpos); + break; + case 41: + encode41(in, inpos, code, out, outpos); + break; + case 42: + encode42(in, inpos, code, out, outpos); + break; + case 43: + encode43(in, inpos, code, out, outpos); + break; + case 44: + encode44(in, inpos, code, out, outpos); + break; + case 45: + encode45(in, inpos, code, out, outpos); + break; + case 46: + encode46(in, inpos, code, out, outpos); + break; + case 47: + encode47(in, inpos, code, out, outpos); + break; + case 48: + encode48(in, inpos, code, out, outpos); + break; + case 49: + encode49(in, inpos, code, out, outpos); + break; + case 50: + encode50(in, inpos, code, out, outpos); + break; + case 51: + encode51(in, inpos, code, out, outpos); + break; + case 52: + encode52(in, inpos, code, out, outpos); + break; + case 53: + encode53(in, inpos, code, out, outpos); + break; + case 54: + encode54(in, inpos, code, out, outpos); + break; + case 55: + encode55(in, inpos, code, out, outpos); + break; + case 56: + encode56(in, inpos, code, out, outpos); + break; + case 57: + encode57(in, inpos, code, out, outpos); + break; + case 58: + encode58(in, inpos, code, out, outpos); + break; + case 59: + encode59(in, inpos, code, out, outpos); + break; + case 60: + encode60(in, inpos, code, out, outpos); + break; + case 61: + encode61(in, inpos, code, out, outpos); + break; + case 62: + encode62(in, inpos, code, out, outpos); + break; + case 63: + encode63(in, inpos, code, out, outpos); + break; + case 64: + encode64(in, inpos, code, out, outpos); + break; + case 65: + encode65(in, inpos, code, out, outpos); + break; + case 66: + encode66(in, inpos, code, out, outpos); + break; + case 67: + encode67(in, inpos, code, out, outpos); + break; + case 68: + encode68(in, inpos, code, out, outpos); + break; + case 69: + encode69(in, inpos, code, out, outpos); + break; + case 70: + encode70(in, inpos, code, out, outpos); + break; + case 71: + encode71(in, inpos, code, out, outpos); + break; + case 72: + encode72(in, inpos, code, out, outpos); + break; + case 73: + encode73(in, inpos, code, out, outpos); + break; + case 74: + encode74(in, inpos, code, out, outpos); + break; + case 75: + encode75(in, inpos, code, out, outpos); + break; + case 76: + encode76(in, inpos, code, out, outpos); + break; + case 77: + encode77(in, inpos, code, out, outpos); + break; + case 78: + encode78(in, inpos, code, out, outpos); + break; + case 79: + encode79(in, inpos, code, out, outpos); + break; + case 80: + encode80(in, inpos, code, out, outpos); + break; + default: + throw new RuntimeException("unsupported code"); + }// end switch + inpos.set(currentPos); + tmpoutpos += 2; + } + + outer: while (currentPos < finalin) { + mainloop: for (int selector = 0; selector < 8; selector++) { + int res = 0; + int compressedNum = codeNum[selector]; + if (finalin <= currentPos + compressedNum - 1) + compressedNum = finalin - currentPos; + int b = bitLength[selector]; + int max = 1 << b; + int i = 0; + for (; i < compressedNum; i++) { + if (Util.smallerorequalthan(max, in[currentPos + i])) + continue mainloop; + res = (res << b) + in[currentPos + i]; + } + if (compressedNum != codeNum[selector]) { + res <<= (codeNum[selector] - compressedNum) * b; + } + res |= selector << 28; + out[tmpoutpos++] = res; + + currentPos += compressedNum; + continue outer; + } + final int selector = 8; + out[tmpoutpos++] = in[currentPos++] | (selector << 28); + } + inpos.set(currentPos); + outpos.set(tmpoutpos); + } + + private void encode0(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 24; i++) + out[outf + 0] = (out[outf + 0] << 1) + (in[inf + i]); + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 24 + i]; + for (int i = 0; i < 28; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 28 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode1(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 24; i++) + out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 24 + i]; + for (int i = 0; i < 14; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 28 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode2(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 24; i++) + out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 24 + i]; + for (int i = 0; i < 9; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 28 + i];// 第二个28位是低位存储的,所以浪费的1比特在最顶端。 + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode3(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 24; i++) + out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 24 + i]; + for (int i = 0; i < 7; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 28 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode4(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 24; i++) + out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 24 + i]; + for (int i = 0; i < 5; i++) + out[outf + 1] = (out[outf + 1] << 5) + in[inf + 28 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode5(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 24; i++) + out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 24 + i]; + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 7) + in[inf + 28 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode6(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 24; i++) + out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 24 + i]; + for (int i = 0; i < 3; i++) + out[outf + 1] = (out[outf + 1] << 9) + in[inf + 28 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode7(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 24; i++) + out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 24 + i]; + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 14) + in[inf + 28 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode8(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 24; i++) + out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 24 + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 28) + in[inf + 28 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode9(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 12; i++) + out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 12 + i]; + for (int i = 0; i < 28; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 14 + i]; + + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode10(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 12; i++) { + out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; + + } + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 12 + i]; + for (int i = 0; i < 14; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 14 + i]; + + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode11(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 12; i++) + out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 12 + i]; + for (int i = 0; i < 9; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 14 + i]; + + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode12(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 12; i++) + out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 12 + i]; + for (int i = 0; i < 7; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 14 + i]; + + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode13(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 12; i++) + out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 12 + i]; + for (int i = 0; i < 5; i++) + out[outf + 1] = (out[outf + 1] << 5) + in[inf + 14 + i]; + + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode14(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 12; i++) + out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 12 + i]; + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 7) + in[inf + 14 + i]; + + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode15(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 12; i++) + out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 12 + i]; + for (int i = 0; i < 3; i++) + out[outf + 1] = (out[outf + 1] << 9) + in[inf + 14 + i]; + + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode16(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 12; i++) + out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 12 + i]; + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 14) + in[inf + 14 + i]; + + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode17(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 12; i++) + out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 12 + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 28) + in[inf + 14 + i]; + + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode18(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 8; i++) + out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 8 + i]; + for (int i = 0; i < 28; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 9 + i]; + + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode19(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 8; i++) + out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 8 + i]; + for (int i = 0; i < 14; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 9 + i]; + + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode20(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 8; i++) + out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 8 + i]; + for (int i = 0; i < 9; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 9 + i]; + + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode21(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 8; i++) + out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 8 + i]; + for (int i = 0; i < 7; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 9 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode22(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 8; i++) + out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 8 + i]; + for (int i = 0; i < 5; i++) + out[outf + 1] = (out[outf + 1] << 5) + in[inf + 9 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode23(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 8; i++) + out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 8 + i]; + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 7) + in[inf + 9 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode24(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 8; i++) + out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 8 + i]; + for (int i = 0; i < 3; i++) + out[outf + 1] = (out[outf + 1] << 9) + in[inf + 9 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode25(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 8; i++) + out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 8 + i]; + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 14) + in[inf + 9 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode26(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 8; i++) + out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 8 + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 28) + in[inf + 9 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode27(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 6; i++) + out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 6 + i]; + for (int i = 0; i < 28; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 7 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode28(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 6; i++) + out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 6 + i]; + for (int i = 0; i < 14; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 7 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode29(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 6; i++) + out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 6 + i]; + for (int i = 0; i < 9; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 7 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode30(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 6; i++) + out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 6 + i]; + for (int i = 0; i < 7; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 7 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode31(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 6; i++) + out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 6 + i]; + for (int i = 0; i < 5; i++) + out[outf + 1] = (out[outf + 1] << 5) + in[inf + 7 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode32(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 6; i++) + out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 6 + i]; + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 7) + in[inf + 7 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode33(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 6; i++) + out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 6 + i]; + for (int i = 0; i < 3; i++) + out[outf + 1] = (out[outf + 1] << 9) + in[inf + 7 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode34(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 6; i++) + out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 6 + i]; + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 14) + in[inf + 7 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode35(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 6; i++) + out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 6 + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 28) + in[inf + 7 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode36(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 4; i++) + out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); + out[outf + 1] = (out[outf + 1] << 1) + ((in[inf + 4] << 31) >>> 31); + for (int i = 0; i < 28; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 5 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode37(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 4; i++) + out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); + out[outf + 1] = (out[outf + 1] << 1) + ((in[inf + 4] << 31) >>> 31); + for (int i = 0; i < 14; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 5 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode38(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 4; i++) + out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); + out[outf + 1] = (out[outf + 1] << 1) + ((in[inf + 4] << 31) >>> 31); + for (int i = 0; i < 9; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 5 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode39(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 4; i++) + out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); + out[outf + 1] = (out[outf + 1] << 1) + ((in[inf + 4] << 31) >>> 31); + for (int i = 0; i < 7; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 5 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode40(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 4; i++) + out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); + out[outf + 1] = (out[outf + 1] << 1) + ((in[inf + 4] << 31) >>> 31); + for (int i = 0; i < 5; i++) + out[outf + 1] = (out[outf + 1] << 5) + in[inf + 5 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode41(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 4; i++) + out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); + out[outf + 1] = (out[outf + 1] << 1) + ((in[inf + 4] << 31) >>> 31); + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 7) + in[inf + 5 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode42(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 4; i++) + out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); + out[outf + 1] = (out[outf + 1] << 1) + ((in[inf + 4] << 31) >>> 31); + for (int i = 0; i < 3; i++) + out[outf + 1] = (out[outf + 1] << 9) + in[inf + 5 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode43(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 4; i++) + out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); + out[outf + 1] = (out[outf + 1] << 1) + ((in[inf + 4] << 31) >>> 31); + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 14) + in[inf + 5 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode44(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 4; i++) + out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); + out[outf + 1] = (out[outf + 1] << 1) + ((in[inf + 4] << 31) >>> 31); + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 28) + in[inf + 5 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode45(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 3; i++) + out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 3] << 28) >>> 28); + for (int i = 0; i < 28; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 4 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode46(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 3; i++) + out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 3] << 28) >>> 28); + for (int i = 0; i < 14; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 4 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode47(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 3; i++) + out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 3] << 28) >>> 28); + for (int i = 0; i < 9; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 4 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode48(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 3; i++) + out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 3] << 28) >>> 28); + for (int i = 0; i < 7; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 4 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode49(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 3; i++) + out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 3] << 28) >>> 28); + for (int i = 0; i < 5; i++) + out[outf + 1] = (out[outf + 1] << 5) + in[inf + 4 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode50(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 3; i++) + out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 3] << 28) >>> 28); + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 7) + in[inf + 4 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode51(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 3; i++) + out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 3] << 28) >>> 28); + for (int i = 0; i < 3; i++) + out[outf + 1] = (out[outf + 1] << 9) + in[inf + 4 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode52(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 3; i++) + out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 3] << 28) >>> 28); + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 14) + in[inf + 4 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode53(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 3; i++) + out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 3] << 28) >>> 28); + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 28) + in[inf + 4 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode54(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 2; i++) + out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); + out[outf + 1] = (out[outf + 1] << 3) + ((in[inf + 2] << 29) >>> 29); + for (int i = 0; i < 28; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 3 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode55(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 2; i++) + out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); + out[outf + 1] = (out[outf + 1] << 3) + ((in[inf + 2] << 29) >>> 29); + for (int i = 0; i < 14; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 3 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode56(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 2; i++) + out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); + out[outf + 1] = (out[outf + 1] << 3) + ((in[inf + 2] << 29) >>> 29); + for (int i = 0; i < 9; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 3 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode57(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 2; i++) + out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); + out[outf + 1] = (out[outf + 1] << 3) + ((in[inf + 2] << 29) >>> 29); + for (int i = 0; i < 7; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 3 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode58(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 2; i++) + out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); + out[outf + 1] = (out[outf + 1] << 3) + ((in[inf + 2] << 29) >>> 29); + for (int i = 0; i < 5; i++) + out[outf + 1] = (out[outf + 1] << 5) + in[inf + 3 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode59(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 2; i++) + out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); + out[outf + 1] = (out[outf + 1] << 3) + ((in[inf + 2] << 29) >>> 29); + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 7) + in[inf + 3 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode60(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 2; i++) + out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); + out[outf + 1] = (out[outf + 1] << 3) + ((in[inf + 2] << 29) >>> 29); + for (int i = 0; i < 3; i++) + out[outf + 1] = (out[outf + 1] << 9) + in[inf + 3 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode61(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 2; i++) + out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); + out[outf + 1] = (out[outf + 1] << 3) + ((in[inf + 2] << 29) >>> 29); + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 14) + in[inf + 3 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode62(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + for (int i = 0; i < 2; i++) + out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); + out[outf + 1] = (out[outf + 1] << 3) + ((in[inf + 2] << 29) >>> 29); + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 28) + in[inf + 3 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode63(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + + out[outf + 0] = (out[outf + 0] << 14) + in[inf]; + out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); + for (int i = 0; i < 28; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 2 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode64(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + out[outf + 0] = (out[outf + 0] << 14) + in[inf]; + out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); + for (int i = 0; i < 14; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 2 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode65(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + out[outf + 0] = (out[outf + 0] << 14) + in[inf]; + out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); + for (int i = 0; i < 9; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 2 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode66(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + out[outf + 0] = (out[outf + 0] << 14) + in[inf]; + out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); + for (int i = 0; i < 7; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 2 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode67(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + out[outf + 0] = (out[outf + 0] << 14) + in[inf]; + out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); + for (int i = 0; i < 5; i++) + out[outf + 1] = (out[outf + 1] << 5) + in[inf + 2 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode68(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + out[outf + 0] = (out[outf + 0] << 14) + in[inf]; + out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 7) + in[inf + 2 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode69(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + out[outf + 0] = (out[outf + 0] << 14) + in[inf]; + out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); + for (int i = 0; i < 3; i++) + out[outf + 1] = (out[outf + 1] << 9) + in[inf + 2 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode70(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + out[outf + 0] = (out[outf + 0] << 14) + in[inf]; + out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 14) + in[inf + 2 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode71(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + out[outf + 0] = (out[outf + 0] << 14) + in[inf]; + out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 28) + in[inf + 2 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode72(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + + out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); + for (int i = 0; i < 28; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 1 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode73(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); + for (int i = 0; i < 14; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 1 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode74(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); + for (int i = 0; i < 9; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 1 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode75(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); + for (int i = 0; i < 7; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 1 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode76(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); + for (int i = 0; i < 5; i++) + out[outf + 1] = (out[outf + 1] << 5) + in[inf + 1 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode77(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 7) + in[inf + 1 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode78(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); + for (int i = 0; i < 3; i++) + out[outf + 1] = (out[outf + 1] << 9) + in[inf + 1 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode79(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 14) + in[inf + 1 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + private void encode80(final int[] in, final IntWrapper inOffset, final int code, final int[] out, + final IntWrapper outOffset) { + int inf = inOffset.get(); + int outf = outOffset.get(); + out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 28) + in[inf + 1 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + outOffset.add(2); + } + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + int currentPos = outpos.get(); + int tmpinpos = inpos.get(); + final int finalout = currentPos + in[tmpinpos++]; + while (currentPos < finalout - 2 * 28) { + + int val = in[tmpinpos++]; + int valn = in[tmpinpos++]; + int header = val >>> 24; + switch (header) { + case 0: { + decode0(val, valn, out, currentPos); + currentPos+=56; + break; + } + case 1: { + decode1(val, valn, out, currentPos); + currentPos+=42; + break; + } + case 2: { + decode2(val, valn, out, currentPos); + currentPos+=37; + break; + } + case 3: { + decode3(val, valn, out, currentPos); + currentPos+=35; + break; + } + case 4: { + decode4(val, valn, out, currentPos); + currentPos+=33; + break; + } + case 5: { + decode5(val, valn, out, currentPos); + currentPos+=32; + break; + } + case 6: { + decode6(val, valn, out, currentPos); + currentPos+=31; + break; + } + case 7: { + decode7(val, valn, out, currentPos); + currentPos+=30; + break; + } + case 8: { + decode8(val, valn, out, currentPos); + currentPos+=29; + break; + } + case 9: { + decode9(val, valn, out, currentPos); + currentPos+=42; + break; + } + case 10: { + decode10(val, valn, out, currentPos); + currentPos+=28; + break; + } + case 11: { + decode11(val, valn, out, currentPos); + currentPos+=23; + break; + } + case 12: { + decode12(val, valn, out, currentPos); + currentPos+=21; + break; + } + case 13: { + decode13(val, valn, out, currentPos); + currentPos+=19; + break; + } + case 14: { + decode14(val, valn, out, currentPos); + currentPos+=18; + break; + } + case 15: { + decode15(val, valn, out, currentPos); + currentPos+=17; + break; + } + case 16: { + decode16(val, valn, out, currentPos); + currentPos+=16; + break; + } + case 17: { + decode17(val, valn, out, currentPos); + currentPos+=15; + break; + } + case 18: { + decode18(val, valn, out, currentPos); + currentPos+=37; + break; + } + case 19: { + decode19(val, valn, out, currentPos); + currentPos+=23; + break; + } + case 20: { + decode20(val, valn, out, currentPos); + currentPos+=18; + break; + } + case 21: { + decode21(val, valn, out, currentPos); + currentPos+=16; + break; + } + case 22: { + decode22(val, valn, out, currentPos); + currentPos+=14; + break; + } + case 23: { + decode23(val, valn, out, currentPos); + currentPos+=13; + break; + } + case 24: { + decode24(val, valn, out, currentPos); + currentPos+=12; + break; + } + case 25: { + decode25(val, valn, out, currentPos); + currentPos+=11; + break; + } + case 26: { + decode26(val, valn, out, currentPos); + currentPos+=10; + break; + } + case 27: { + decode27(val, valn, out, currentPos); + currentPos+=35; + break; + } + case 28: { + decode28(val, valn, out, currentPos); + currentPos+=21; + break; + } + case 29: { + decode29(val, valn, out, currentPos); + currentPos+=16; + break; + } + + case 30: { + decode30(val, valn, out, currentPos); + currentPos+=14; + break; + } + case 31: { + decode31(val, valn, out, currentPos); + currentPos+=12; + break; + } + case 32: { + decode32(val, valn, out, currentPos); + currentPos+=11; + break; + } + case 33: { + decode33(val, valn, out, currentPos); + currentPos+=10; + break; + } + case 34: { + decode34(val, valn, out, currentPos); + currentPos+=9; + break; + } + case 35: { + decode35(val, valn, out, currentPos); + currentPos+=8; + break; + } + case 36: { + decode36(val, valn, out, currentPos); + currentPos+=33; + break; + } + case 37: { + decode37(val, valn, out, currentPos); + currentPos+=19; + break; + } + case 38: { + decode38(val, valn, out, currentPos); + currentPos+=14; + break; + } + case 39: { + decode39(val, valn, out, currentPos); + currentPos+=12; + break; + } + case 40: { + decode40(val, valn, out, currentPos); + currentPos+=10; + break; + } + case 41: { + decode41(val, valn, out, currentPos); + currentPos+=9; + break; + } + case 42: { + decode42(val, valn, out, currentPos); + currentPos+=8; + break; + } + case 43: { + decode43(val, valn, out, currentPos); + currentPos+=7; + break; + } + case 44: { + decode44(val, valn, out, currentPos); + currentPos+=6; + break; + } + case 45: { + decode45(val, valn, out, currentPos); + currentPos+=32; + break; + } + case 46: { + decode46(val, valn, out, currentPos); + currentPos+=18; + break; + } + case 47: { + decode47(val, valn, out, currentPos); + currentPos+=13; + break; + } + case 48: { + decode48(val, valn, out, currentPos); + currentPos+=11; + break; + } + case 49: { + decode49(val, valn, out, currentPos); + currentPos+=9; + break; + } + case 50: { + decode50(val, valn, out, currentPos); + currentPos+=8; + break; + } + case 51: { + decode51(val, valn, out, currentPos); + currentPos+=7; + break; + } + case 52: { + decode52(val, valn, out, currentPos); + currentPos+=6; + break; + } + case 53: { + decode53(val, valn, out, currentPos); + currentPos+=5; + break; + } + case 54: { + decode54(val, valn, out, currentPos); + currentPos+=31; + break; + } + case 55: { + decode55(val, valn, out, currentPos); + currentPos+=17; + break; + } + case 56: { + decode56(val, valn, out, currentPos); + currentPos+=12; + break; + } + case 57: { + decode57(val, valn, out, currentPos); + currentPos+=10; + break; + } + case 58: { + decode58(val, valn, out, currentPos); + currentPos+=8; + break; + } + case 59: { + decode59(val, valn, out, currentPos); + currentPos+=7; + break; + } + case 60: { + decode60(val, valn, out, currentPos); + currentPos+=6; + break; + } + case 61: { + decode61(val, valn, out, currentPos); + currentPos+=5; + break; + } + case 62: { + decode62(val, valn, out, currentPos); + currentPos+=4; + break; + } + case 63: { + decode63(val, valn, out, currentPos); + currentPos+=30; + break; + } + case 64: { + decode64(val, valn, out, currentPos); + currentPos+=16; + break; + } + case 65: { + decode65(val, valn, out, currentPos); + currentPos+=11; + break; + } + case 66: { + decode66(val, valn, out, currentPos); + currentPos+=9; + break; + } + case 67: { + decode67(val, valn, out, currentPos); + currentPos+=7; + break; + } + case 68: { + decode68(val, valn, out, currentPos); + currentPos+=6; + break; + } + case 69: { + decode69(val, valn, out, currentPos); + currentPos+=5; + break; + } + case 70: { + decode70(val, valn, out, currentPos); + currentPos+=4; + break; + } + case 71: { + decode71(val, valn, out, currentPos); + currentPos+=3; + break; + } + case 72: { + decode72(val, valn, out, currentPos); + currentPos+=29; + break; + } + case 73: { + decode73(val, valn, out, currentPos); + currentPos+=15; + break; + } + case 74: { + decode74(val, valn, out, currentPos); + currentPos+=10; + break; + } + case 75: { + decode75(val, valn, out, currentPos); + currentPos+=8; + break; + } + case 76: { + decode76(val, valn, out, currentPos); + currentPos+=6; + break; + } + case 77: { + decode77(val, valn, out, currentPos); + currentPos+=5; + break; + } + case 78: { + decode78(val, valn, out, currentPos); + currentPos+=4; + break; + } + case 79: { + decode79(val, valn, out, currentPos); + currentPos+=3; + break; + } + case 80: { + decode80(val, valn, out, currentPos); + currentPos+=2; + break; + } + default: + throw new RuntimeException("Wrong code: " + header); + }// end switch + } // end while + + while (currentPos < finalout) { + int val = in[tmpinpos++]; + int header = val >>> 28; + switch (header) { + case 0: { // number : 28, bitwidth : 1 + final int howmany = finalout - currentPos < 28 ? finalout - currentPos : 28; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (k + 4)) >>> 31; + } + break; + } + case 1: { // number : 14, bitwidth : 2 + final int howmany = finalout - currentPos < 14 ? finalout - currentPos : 14; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (2 * k + 4)) >>> 30; + } + break; + } + case 2: { // number : 9, bitwidth : 3 + final int howmany = finalout - currentPos < 9 ? finalout - currentPos : 9; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (3 * k + 5)) >>> 29; + } + break; + } + case 3: { // number : 7, bitwidth : 4 + final int howmany = finalout - currentPos < 7 ? finalout - currentPos : 7; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (4 * k + 4)) >>> 28; + } + break; + } + case 4: { // number : 5, bitwidth : 5 + final int howmany = finalout - currentPos < 5 ? finalout - currentPos : 5; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (5 * k + 7)) >>> 27; + } + break; + } + case 5: { // number : 4, bitwidth : 7 + final int howmany = finalout - currentPos < 4 ? finalout - currentPos : 4; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (7 * k + 4)) >>> 25; + } + break; + } + case 6: { // number : 3, bitwidth : 9 + final int howmany = finalout - currentPos < 3 ? finalout - currentPos : 3; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (9 * k + 5)) >>> 23; + } + break; + } + case 7: { // number : 2, bitwidth : 14 + final int howmany = finalout - currentPos < 2 ? finalout - currentPos : 2; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (14 * k + 4)) >>> 18; + } + break; + } + case 8: { // number : 1, bitwidth : 28 + out[currentPos++] = (val << 4) >>> 4; + break; + } + default: { + throw new RuntimeException("shouldn't happen"); + } + } + } + + outpos.set(finalout); + inpos.set(tmpinpos); + } + + + + private void decode80(int val, int valn, int[] out, int currentPos) { + // number : 1, bitwidth : 28 + out[currentPos++] = (val << 8) >>> 4 | (valn >>> 28); + // number : 1, bitwidth : 28 + out[currentPos++] = (valn << 4) >>> 4; + } + + private void decode79(int val, int valn, int[] out, int currentPos) { + // number : 1, bitwidth : 28 + out[currentPos++] = (val << 8) >>> 4 | (valn >>> 28); + // number :2, bitwidth : 14 + out[currentPos++] = (valn << 4) >>> 18; + out[currentPos++] = (valn << 18) >>> 18; + } + + private void decode78(int val, int valn, int[] out, int currentPos) { + // number : 1, bitwidth : 28 + out[currentPos++] = (val << 8) >>> 4 | (valn >>> 27); + // number : 3, bitwidth :9 + out[currentPos++] = (valn << 5) >>> 23; + out[currentPos++] = (valn << 14) >>> 23; + out[currentPos++] = (valn << 23) >>> 23; + } + + private void decode77(int val, int valn, int[] out, int currentPos) { + // number : 1, bitwidth : 28 + out[currentPos++] = (val << 8) >>> 4 | (valn >>> 28); + // number : 4, bitwidth : 7 + out[currentPos++] = (valn << 4) >>> 25; + out[currentPos++] = (valn << 11) >>> 25; + out[currentPos++] = (valn << 18) >>> 25; + out[currentPos++] = (valn << 25) >>> 25; + } + + private void decode76(int val, int valn, int[] out, int currentPos) { + // number : 5, bitwidth : 5 + out[currentPos++] = (val << 8) >>> 4 | (valn >>> 25); + // number : 14, bitwidth : 2 + out[currentPos++] = (valn << 7) >>> 27; + out[currentPos++] = (valn << 12) >>> 27; + out[currentPos++] = (valn << 17) >>> 27; + out[currentPos++] = (valn << 22) >>> 27; + out[currentPos++] = (valn << 27) >>> 27; + } + + private void decode75(int val, int valn, int[] out, int currentPos) { + // number : 1, bitwidth : 28 + out[currentPos++] = (val << 8) >>> 4 | (valn >>> 28); + // number : 7, bitwidth : 4 + out[currentPos++] = (valn << 4) >>> 28; + out[currentPos++] = (valn << 8) >>> 28; + out[currentPos++] = (valn << 12) >>> 28; + out[currentPos++] = (valn << 16) >>> 28; + out[currentPos++] = (valn << 20) >>> 28; + out[currentPos++] = (valn << 24) >>> 28; + out[currentPos++] = (valn << 28) >>> 28; + } + + private void decode74(int val, int valn, int[] out, int currentPos) { + // number : 1, bitwidth : 28 + out[currentPos++] = (val << 8) >>> 4 | (valn >>> 27); + // number : 9, bitwidth : 3 + out[currentPos++] = (valn << 5) >>> 29; + out[currentPos++] = (valn << 8) >>> 29; + out[currentPos++] = (valn << 11) >>> 29; + out[currentPos++] = (valn << 14) >>> 29; + out[currentPos++] = (valn << 17) >>> 29; + out[currentPos++] = (valn << 20) >>> 29; + out[currentPos++] = (valn << 23) >>> 29; + out[currentPos++] = (valn << 26) >>> 29; + out[currentPos++] = (valn << 29) >>> 29; + } + + private void decode73(int val, int valn, int[] out, int currentPos) { + // number : 1, bitwidth : 28 + out[currentPos++] = (val << 8) >>> 4 | (valn >>> 28); + // number : 14, bitwidth : 2 + out[currentPos++] = (valn << 4) >>> 30; + out[currentPos++] = (valn << 6) >>> 30; + out[currentPos++] = (valn << 8) >>> 30; + out[currentPos++] = (valn << 10) >>> 30; + out[currentPos++] = (valn << 12) >>> 30; + out[currentPos++] = (valn << 14) >>> 30; + out[currentPos++] = (valn << 16) >>> 30; + out[currentPos++] = (valn << 18) >>> 30; + out[currentPos++] = (valn << 20) >>> 30; + out[currentPos++] = (valn << 22) >>> 30; // 10 + out[currentPos++] = (valn << 24) >>> 30; + out[currentPos++] = (valn << 26) >>> 30; + out[currentPos++] = (valn << 28) >>> 30; + out[currentPos++] = (valn << 30) >>> 30; + } + + private void decode72(int val, int valn, int[] out, int currentPos) { + // number : 1, bitwidth : 28 + out[currentPos++] = (val << 8) >>> 4 | (valn >>> 28); + // number : 28, bitwidth : 1 + out[currentPos++] = (valn << 4) >>> 31; + out[currentPos++] = (valn << 5) >>> 31; + out[currentPos++] = (valn << 6) >>> 31; + out[currentPos++] = (valn << 7) >>> 31; + out[currentPos++] = (valn << 8) >>> 31; + out[currentPos++] = (valn << 9) >>> 31; + out[currentPos++] = (valn << 10) >>> 31; + out[currentPos++] = (valn << 11) >>> 31; + out[currentPos++] = (valn << 12) >>> 31; + out[currentPos++] = (valn << 13) >>> 31; // 10 + out[currentPos++] = (valn << 14) >>> 31; + out[currentPos++] = (valn << 15) >>> 31; + out[currentPos++] = (valn << 16) >>> 31; + out[currentPos++] = (valn << 17) >>> 31; + out[currentPos++] = (valn << 18) >>> 31; + out[currentPos++] = (valn << 19) >>> 31; + out[currentPos++] = (valn << 20) >>> 31; + out[currentPos++] = (valn << 21) >>> 31; + out[currentPos++] = (valn << 22) >>> 31; + out[currentPos++] = (valn << 23) >>> 31; // 20 + out[currentPos++] = (valn << 24) >>> 31; + out[currentPos++] = (valn << 25) >>> 31; + out[currentPos++] = (valn << 26) >>> 31; + out[currentPos++] = (valn << 27) >>> 31; + out[currentPos++] = (valn << 28) >>> 31; + out[currentPos++] = (valn << 29) >>> 31; + out[currentPos++] = (valn << 30) >>> 31; + out[currentPos++] = (valn << 31) >>> 31; + } + + private void decode71(int val, int valn, int[] out, int currentPos) { + // number : 2, bitwidth : 14 + out[currentPos++] = (val << 8) >>> 18; + out[currentPos++] = (val << 22) >>> 18 | (valn >>> 28); + // number : 1, bitwidth : 28 + out[currentPos++] = (valn << 4) >>> 4; + } + + private void decode70(int val, int valn, int[] out, int currentPos) { + // number : 2, bitwidth : 14 + out[currentPos++] = (val << 8) >>> 18; + out[currentPos++] = (val << 22) >>> 18 | (valn >>> 28); + // number : 2, bitwidth : 14 + out[currentPos++] = (valn << 4) >>> 18; + out[currentPos++] = (valn << 18) >>> 18; + } + + private void decode69(int val, int valn, int[] out, int currentPos) { + // number : 2, bitwidth : 14 + out[currentPos++] = (val << 8) >>> 18; + out[currentPos++] = (val << 22) >>> 18 | (valn >>> 27); + // number : 3, bitwidth : 9 + out[currentPos++] = (valn << 5) >>> 23; + out[currentPos++] = (valn << 14) >>> 23; + out[currentPos++] = (valn << 23) >>> 23; + } + + private void decode68(int val, int valn, int[] out, int currentPos) { + // number : 2, bitwidth : 14 + out[currentPos++] = (val << 8) >>> 18; + out[currentPos++] = (val << 22) >>> 18 | (valn >>> 28); + // number : 4, bitwidth : 7 + out[currentPos++] = (valn << 4) >>> 25; + out[currentPos++] = (valn << 11) >>> 25; + out[currentPos++] = (valn << 18) >>> 25; + out[currentPos++] = (valn << 25) >>> 25; + } + + private void decode67(int val, int valn, int[] out, int currentPos) { + // number : 2, bitwidth : 14 + out[currentPos++] = (val << 8) >>> 18; + out[currentPos++] = (val << 22) >>> 18 | (valn >>> 25); + // number : 5, bitwidth : 5 + out[currentPos++] = (valn << 7) >>> 27; + out[currentPos++] = (valn << 12) >>> 27; + out[currentPos++] = (valn << 17) >>> 27; + out[currentPos++] = (valn << 22) >>> 27; + out[currentPos++] = (valn << 27) >>> 27; + } + + private void decode66(int val, int valn, int[] out, int currentPos) { + // number : 2, bitwidth : 14 + out[currentPos++] = (val << 8) >>> 18; + out[currentPos++] = (val << 22) >>> 18 | (valn >>> 28); + // number : 7, bitwidth : 4 + out[currentPos++] = (valn << 4) >>> 28; + out[currentPos++] = (valn << 8) >>> 28; + out[currentPos++] = (valn << 12) >>> 28; + out[currentPos++] = (valn << 16) >>> 28; + out[currentPos++] = (valn << 20) >>> 28; + out[currentPos++] = (valn << 24) >>> 28; + out[currentPos++] = (valn << 28) >>> 28; + } + + private void decode65(int val, int valn, int[] out, int currentPos) { + // number : 2, bitwidth : 14 + out[currentPos++] = (val << 8) >>> 18; + out[currentPos++] = (val << 22) >>> 18 | (valn >>> 27); + // number : 9, bitwidth : 3 + out[currentPos++] = (valn << 5) >>> 29; + out[currentPos++] = (valn << 8) >>> 29; + out[currentPos++] = (valn << 11) >>> 29; + out[currentPos++] = (valn << 14) >>> 29; + out[currentPos++] = (valn << 17) >>> 29; + out[currentPos++] = (valn << 20) >>> 29; + out[currentPos++] = (valn << 23) >>> 29; + out[currentPos++] = (valn << 26) >>> 29; + out[currentPos++] = (valn << 29) >>> 29; + } + + private void decode64(int val, int valn, int[] out, int currentPos) { + // number : 2, bitwidth : 14 + out[currentPos++] = (val << 8) >>> 18; + out[currentPos++] = (val << 22) >>> 18 | (valn >>> 28); + // number : 14, bitwidth : 2 + out[currentPos++] = (valn << 4) >>> 30; + out[currentPos++] = (valn << 6) >>> 30; + out[currentPos++] = (valn << 8) >>> 30; + out[currentPos++] = (valn << 10) >>> 30; + out[currentPos++] = (valn << 12) >>> 30; + out[currentPos++] = (valn << 14) >>> 30; + out[currentPos++] = (valn << 16) >>> 30; + out[currentPos++] = (valn << 18) >>> 30; + out[currentPos++] = (valn << 20) >>> 30; + out[currentPos++] = (valn << 22) >>> 30; // 10 + out[currentPos++] = (valn << 24) >>> 30; + out[currentPos++] = (valn << 26) >>> 30; + out[currentPos++] = (valn << 28) >>> 30; + out[currentPos++] = (valn << 30) >>> 30; + } + + private void decode63(int val, int valn, int[] out, int currentPos) { + // number : 2, bitwidth : 14 + out[currentPos++] = (val << 8) >>> 18; + out[currentPos++] = (val << 22) >>> 18 | (valn >>> 28); + // number : 28, bitwidth : 1 + out[currentPos++] = (valn << 4) >>> 31; + out[currentPos++] = (valn << 5) >>> 31; + out[currentPos++] = (valn << 6) >>> 31; + out[currentPos++] = (valn << 7) >>> 31; + out[currentPos++] = (valn << 8) >>> 31; + out[currentPos++] = (valn << 9) >>> 31; + out[currentPos++] = (valn << 10) >>> 31; + out[currentPos++] = (valn << 11) >>> 31; + out[currentPos++] = (valn << 12) >>> 31; + out[currentPos++] = (valn << 13) >>> 31; // 10 + out[currentPos++] = (valn << 14) >>> 31; + out[currentPos++] = (valn << 15) >>> 31; + out[currentPos++] = (valn << 16) >>> 31; + out[currentPos++] = (valn << 17) >>> 31; + out[currentPos++] = (valn << 18) >>> 31; + out[currentPos++] = (valn << 19) >>> 31; + out[currentPos++] = (valn << 20) >>> 31; + out[currentPos++] = (valn << 21) >>> 31; + out[currentPos++] = (valn << 22) >>> 31; + out[currentPos++] = (valn << 23) >>> 31; // 20 + out[currentPos++] = (valn << 24) >>> 31; + out[currentPos++] = (valn << 25) >>> 31; + out[currentPos++] = (valn << 26) >>> 31; + out[currentPos++] = (valn << 27) >>> 31; + out[currentPos++] = (valn << 28) >>> 31; + out[currentPos++] = (valn << 29) >>> 31; + out[currentPos++] = (valn << 30) >>> 31; + out[currentPos++] = (valn << 31) >>> 31; + } + + private void decode62(int val, int valn, int[] out, int currentPos) { + // number : 3, bitwidth : 9 + out[currentPos++] = (val << 8) >>> 23; + out[currentPos++] = (val << 17) >>> 23; + out[currentPos++] = (val << 26) >>> 23 | (valn >>> 28); + // number : 1, bitwidth : 28 + out[currentPos++] = (valn << 4) >>> 4; + } + + private void decode61(int val, int valn, int[] out, int currentPos) { + // number : 3, bitwidth : 9 + out[currentPos++] = (val << 8) >>> 23; + out[currentPos++] = (val << 17) >>> 23; + out[currentPos++] = (val << 26) >>> 23 | (valn >>> 28); + // number : 2, bitwidth : 14 + out[currentPos++] = (valn << 4) >>> 18; + out[currentPos++] = (valn << 18) >>> 18; + } + + private void decode60(int val, int valn, int[] out, int currentPos) { + // number : 3, bitwidth : 9 + out[currentPos++] = (val << 8) >>> 23; + out[currentPos++] = (val << 17) >>> 23; + out[currentPos++] = (val << 26) >>> 23 | (valn >>> 27); + // number : 3, bitwidth : 9 + out[currentPos++] = (valn << 5) >>> 23; + out[currentPos++] = (valn << 14) >>> 23; + out[currentPos++] = (valn << 23) >>> 23; + } + + private void decode59(int val, int valn, int[] out, int currentPos) { + // number : 3, bitwidth : 9 + out[currentPos++] = (val << 8) >>> 23; + out[currentPos++] = (val << 17) >>> 23; + out[currentPos++] = (val << 26) >>> 23 | (valn >>> 28); + // number : 4, bitwidth : 7 + out[currentPos++] = (valn << 4) >>> 25; + out[currentPos++] = (valn << 11) >>> 25; + out[currentPos++] = (valn << 18) >>> 25; + out[currentPos++] = (valn << 25) >>> 25; + } + + private void decode58(int val, int valn, int[] out, int currentPos) { + // number : 3, bitwidth : 9 + out[currentPos++] = (val << 8) >>> 23; + out[currentPos++] = (val << 17) >>> 23; + out[currentPos++] = (val << 26) >>> 23 | (valn >>> 25); + // number : 5, bitwidth : 5 + out[currentPos++] = (valn << 7) >>> 27; + out[currentPos++] = (valn << 12) >>> 27; + out[currentPos++] = (valn << 17) >>> 27; + out[currentPos++] = (valn << 22) >>> 27; + out[currentPos++] = (valn << 27) >>> 27; + } + + private void decode57(int val, int valn, int[] out, int currentPos) { + // number : 3, bitwidth : 9 + out[currentPos++] = (val << 8) >>> 23; + out[currentPos++] = (val << 17) >>> 23; + out[currentPos++] = (val << 26) >>> 23 | (valn >>> 28); + // number : 7, bitwidth : 4 + out[currentPos++] = (valn << 4) >>> 28; + out[currentPos++] = (valn << 8) >>> 28; + out[currentPos++] = (valn << 12) >>> 28; + out[currentPos++] = (valn << 16) >>> 28; + out[currentPos++] = (valn << 20) >>> 28; + out[currentPos++] = (valn << 24) >>> 28; + out[currentPos++] = (valn << 28) >>> 28; + } + + private void decode56(int val, int valn, int[] out, int currentPos) { + // number : 3, bitwidth : 9 + out[currentPos++] = (val << 8) >>> 23; + out[currentPos++] = (val << 17) >>> 23; + out[currentPos++] = (val << 26) >>> 23 | (valn >>> 27); + // number : 9, bitwidth : 3 + out[currentPos++] = (valn << 5) >>> 29; + out[currentPos++] = (valn << 8) >>> 29; + out[currentPos++] = (valn << 11) >>> 29; + out[currentPos++] = (valn << 14) >>> 29; + out[currentPos++] = (valn << 17) >>> 29; + out[currentPos++] = (valn << 20) >>> 29; + out[currentPos++] = (valn << 23) >>> 29; + out[currentPos++] = (valn << 26) >>> 29; + out[currentPos++] = (valn << 29) >>> 29; + } + + private void decode55(int val, int valn, int[] out, int currentPos) { + // number : 3, bitwidth : 9 + out[currentPos++] = (val << 8) >>> 23; + out[currentPos++] = (val << 17) >>> 23; + out[currentPos++] = (val << 26) >>> 23 | (valn >>> 28); + // number : 14, bitwidth : 2 + out[currentPos++] = (valn << 4) >>> 30; + out[currentPos++] = (valn << 6) >>> 30; + out[currentPos++] = (valn << 8) >>> 30; + out[currentPos++] = (valn << 10) >>> 30; + out[currentPos++] = (valn << 12) >>> 30; + out[currentPos++] = (valn << 14) >>> 30; + out[currentPos++] = (valn << 16) >>> 30; + out[currentPos++] = (valn << 18) >>> 30; + out[currentPos++] = (valn << 20) >>> 30; + out[currentPos++] = (valn << 22) >>> 30; // 10 + out[currentPos++] = (valn << 24) >>> 30; + out[currentPos++] = (valn << 26) >>> 30; + out[currentPos++] = (valn << 28) >>> 30; + out[currentPos++] = (valn << 30) >>> 30; + } + + private void decode54(int val, int valn, int[] out, int currentPos) { + // number : 3, bitwidth : 9 + out[currentPos++] = (val << 8) >>> 23; + out[currentPos++] = (val << 17) >>> 23; + out[currentPos++] = (val << 26) >>> 23 | (valn >>> 28); + // number : 28, bitwidth : 1 + out[currentPos++] = (valn << 4) >>> 31; + out[currentPos++] = (valn << 5) >>> 31; + out[currentPos++] = (valn << 6) >>> 31; + out[currentPos++] = (valn << 7) >>> 31; + out[currentPos++] = (valn << 8) >>> 31; + out[currentPos++] = (valn << 9) >>> 31; + out[currentPos++] = (valn << 10) >>> 31; + out[currentPos++] = (valn << 11) >>> 31; + out[currentPos++] = (valn << 12) >>> 31; + out[currentPos++] = (valn << 13) >>> 31; // 10 + out[currentPos++] = (valn << 14) >>> 31; + out[currentPos++] = (valn << 15) >>> 31; + out[currentPos++] = (valn << 16) >>> 31; + out[currentPos++] = (valn << 17) >>> 31; + out[currentPos++] = (valn << 18) >>> 31; + out[currentPos++] = (valn << 19) >>> 31; + out[currentPos++] = (valn << 20) >>> 31; + out[currentPos++] = (valn << 21) >>> 31; + out[currentPos++] = (valn << 22) >>> 31; + out[currentPos++] = (valn << 23) >>> 31; // 20 + out[currentPos++] = (valn << 24) >>> 31; + out[currentPos++] = (valn << 25) >>> 31; + out[currentPos++] = (valn << 26) >>> 31; + out[currentPos++] = (valn << 27) >>> 31; + out[currentPos++] = (valn << 28) >>> 31; + out[currentPos++] = (valn << 29) >>> 31; + out[currentPos++] = (valn << 30) >>> 31; + out[currentPos++] = (valn << 31) >>> 31; + } + + private void decode53(int val, int valn, int[] out, int currentPos) { + // number : 4, bitwidth : 7 + out[currentPos++] = (val << 8) >>> 25; + out[currentPos++] = (val << 15) >>> 25; + out[currentPos++] = (val << 22) >>> 25; + out[currentPos++] = (val << 29) >>> 25 | (valn >>> 28); + // number : 1, bitwidth : 28 + out[currentPos++] = (valn << 4) >>> 4; + } + + private void decode52(int val, int valn, int[] out, int currentPos) { + // number : 4, bitwidth : 7 + out[currentPos++] = (val << 8) >>> 25; + out[currentPos++] = (val << 15) >>> 25; + out[currentPos++] = (val << 22) >>> 25; + out[currentPos++] = (val << 29) >>> 25 | (valn >>> 28); + // number : 2, bitwidth : 14 + out[currentPos++] = (valn << 4) >>> 18; + out[currentPos++] = (valn << 18) >>> 18; + } + + private void decode51(int val, int valn, int[] out, int currentPos) { + // number : 4, bitwidth : 7 + out[currentPos++] = (val << 8) >>> 25; + out[currentPos++] = (val << 15) >>> 25; + out[currentPos++] = (val << 22) >>> 25; + out[currentPos++] = (val << 29) >>> 25 | (valn >>> 27); + // number : 3, bitwidth : 9 + out[currentPos++] = (valn << 5) >>> 23; + out[currentPos++] = (valn << 14) >>> 23; + out[currentPos++] = (valn << 23) >>> 23; + } + + private void decode50(int val, int valn, int[] out, int currentPos) { + // number : 4, bitwidth : 7 + out[currentPos++] = (val << 8) >>> 25; + out[currentPos++] = (val << 15) >>> 25; + out[currentPos++] = (val << 22) >>> 25; + out[currentPos++] = (val << 29) >>> 25 | (valn >>> 28); + // number : 4, bitwidth : 7 + out[currentPos++] = (valn << 4) >>> 25; + out[currentPos++] = (valn << 11) >>> 25; + out[currentPos++] = (valn << 18) >>> 25; + out[currentPos++] = (valn << 25) >>> 25; + } + + private void decode49(int val, int valn, int[] out, int currentPos) { + // number : 4, bitwidth : 7 + out[currentPos++] = (val << 8) >>> 25; + out[currentPos++] = (val << 15) >>> 25; + out[currentPos++] = (val << 22) >>> 25; + out[currentPos++] = (val << 29) >>> 25 | (valn >>> 25); + // number : 5, bitwidth : 5 + out[currentPos++] = (valn << 7) >>> 27; + out[currentPos++] = (valn << 12) >>> 27; + out[currentPos++] = (valn << 17) >>> 27; + out[currentPos++] = (valn << 22) >>> 27; + out[currentPos++] = (valn << 27) >>> 27; + } + + private void decode48(int val, int valn, int[] out, int currentPos) { + // number : 4, bitwidth : 7 + out[currentPos++] = (val << 8) >>> 25; + out[currentPos++] = (val << 15) >>> 25; + out[currentPos++] = (val << 22) >>> 25; + out[currentPos++] = (val << 29) >>> 25 | (valn >>> 28); + // number : 7, bitwidth : 4 + out[currentPos++] = (valn << 4) >>> 28; + out[currentPos++] = (valn << 8) >>> 28; + out[currentPos++] = (valn << 12) >>> 28; + out[currentPos++] = (valn << 16) >>> 28; + out[currentPos++] = (valn << 20) >>> 28; + out[currentPos++] = (valn << 24) >>> 28; + out[currentPos++] = (valn << 28) >>> 28; + } + + private void decode47(int val, int valn, int[] out, int currentPos) { + // number : 4, bitwidth : 7 + out[currentPos++] = (val << 8) >>> 25; + out[currentPos++] = (val << 15) >>> 25; + out[currentPos++] = (val << 22) >>> 25; + out[currentPos++] = (val << 29) >>> 25 | (valn >>> 27); + // number : 9, bitwidth : 3 + out[currentPos++] = (valn << 5) >>> 29; + out[currentPos++] = (valn << 8) >>> 29; + out[currentPos++] = (valn << 11) >>> 29; + out[currentPos++] = (valn << 14) >>> 29; + out[currentPos++] = (valn << 17) >>> 29; + out[currentPos++] = (valn << 20) >>> 29; + out[currentPos++] = (valn << 23) >>> 29; + out[currentPos++] = (valn << 26) >>> 29; + out[currentPos++] = (valn << 29) >>> 29; + } + + private void decode46(int val, int valn, int[] out, int currentPos) { + // number : 4, bitwidth : 7 + out[currentPos++] = (val << 8) >>> 25; + out[currentPos++] = (val << 15) >>> 25; + out[currentPos++] = (val << 22) >>> 25; + out[currentPos++] = (val << 29) >>> 25 | (valn >>> 28); + // number : 14, bitwidth : 2 + out[currentPos++] = (valn << 4) >>> 30; + out[currentPos++] = (valn << 6) >>> 30; + out[currentPos++] = (valn << 8) >>> 30; + out[currentPos++] = (valn << 10) >>> 30; + out[currentPos++] = (valn << 12) >>> 30; + out[currentPos++] = (valn << 14) >>> 30; + out[currentPos++] = (valn << 16) >>> 30; + out[currentPos++] = (valn << 18) >>> 30; + out[currentPos++] = (valn << 20) >>> 30; + out[currentPos++] = (valn << 22) >>> 30; // 10 + out[currentPos++] = (valn << 24) >>> 30; + out[currentPos++] = (valn << 26) >>> 30; + out[currentPos++] = (valn << 28) >>> 30; + out[currentPos++] = (valn << 30) >>> 30; + } + + private void decode45(int val, int valn, int[] out, int currentPos) { + // number : 4, bitwidth : 7 + out[currentPos++] = (val << 8) >>> 25; + out[currentPos++] = (val << 15) >>> 25; + out[currentPos++] = (val << 22) >>> 25; + out[currentPos++] = (val << 29) >>> 25 | (valn >>> 28); + // number : 28, bitwidth : 1 + out[currentPos++] = (valn << 4) >>> 31; + out[currentPos++] = (valn << 5) >>> 31; + out[currentPos++] = (valn << 6) >>> 31; + out[currentPos++] = (valn << 7) >>> 31; + out[currentPos++] = (valn << 8) >>> 31; + out[currentPos++] = (valn << 9) >>> 31; + out[currentPos++] = (valn << 10) >>> 31; + out[currentPos++] = (valn << 11) >>> 31; + out[currentPos++] = (valn << 12) >>> 31; + out[currentPos++] = (valn << 13) >>> 31; // 10 + out[currentPos++] = (valn << 14) >>> 31; + out[currentPos++] = (valn << 15) >>> 31; + out[currentPos++] = (valn << 16) >>> 31; + out[currentPos++] = (valn << 17) >>> 31; + out[currentPos++] = (valn << 18) >>> 31; + out[currentPos++] = (valn << 19) >>> 31; + out[currentPos++] = (valn << 20) >>> 31; + out[currentPos++] = (valn << 21) >>> 31; + out[currentPos++] = (valn << 22) >>> 31; + out[currentPos++] = (valn << 23) >>> 31; // 20 + out[currentPos++] = (valn << 24) >>> 31; + out[currentPos++] = (valn << 25) >>> 31; + out[currentPos++] = (valn << 26) >>> 31; + out[currentPos++] = (valn << 27) >>> 31; + out[currentPos++] = (valn << 28) >>> 31; + out[currentPos++] = (valn << 29) >>> 31; + out[currentPos++] = (valn << 30) >>> 31; + out[currentPos++] = (valn << 31) >>> 31; + } + + private void decode44(int val, int valn, int[] out, int currentPos) { + // number : 5, bitwidth : 5 + out[currentPos++] = (val << 8) >>> 27; + out[currentPos++] = (val << 13) >>> 27; + out[currentPos++] = (val << 18) >>> 27; + out[currentPos++] = (val << 23) >>> 27; + out[currentPos++] = (val << 28) >>> 27 | (valn >>> 28); + // number : 1, bitwidth : 28 + out[currentPos++] = (valn << 4) >>> 4; + } + + private void decode43(int val, int valn, int[] out, int currentPos) { + // number : 5, bitwidth : 5 + out[currentPos++] = (val << 8) >>> 27; + out[currentPos++] = (val << 13) >>> 27; + out[currentPos++] = (val << 18) >>> 27; + out[currentPos++] = (val << 23) >>> 27; + out[currentPos++] = (val << 28) >>> 27 | (valn >>> 28); + // number : 2, bitwidth : 14 + out[currentPos++] = (valn << 4) >>> 18; + out[currentPos++] = (valn << 18) >>> 18; + } + + private void decode42(int val, int valn, int[] out, int currentPos) { + // number : 5, bitwidth : 5 + out[currentPos++] = (val << 8) >>> 27; + out[currentPos++] = (val << 13) >>> 27; + out[currentPos++] = (val << 18) >>> 27; + out[currentPos++] = (val << 23) >>> 27; + out[currentPos++] = (val << 28) >>> 27 | (valn >>> 27); + // number : 3, bitwidth : 9 + out[currentPos++] = (valn << 5) >>> 23; + out[currentPos++] = (valn << 14) >>> 23; + out[currentPos++] = (valn << 23) >>> 23; + } + + private void decode41(int val, int valn, int[] out, int currentPos) { + // number : 5, bitwidth : 5 + out[currentPos++] = (val << 8) >>> 27; + out[currentPos++] = (val << 13) >>> 27; + out[currentPos++] = (val << 18) >>> 27; + out[currentPos++] = (val << 23) >>> 27; + out[currentPos++] = (val << 28) >>> 27 | (valn >>> 28); + // number : 4, bitwidth : 7 + out[currentPos++] = (valn << 4) >>> 25; + out[currentPos++] = (valn << 11) >>> 25; + out[currentPos++] = (valn << 18) >>> 25; + out[currentPos++] = (valn << 25) >>> 25; + } + + private void decode40(int val, int valn, int[] out, int currentPos) { + // number : 5, bitwidth : 5 + out[currentPos++] = (val << 8) >>> 27; + out[currentPos++] = (val << 13) >>> 27; + out[currentPos++] = (val << 18) >>> 27; + out[currentPos++] = (val << 23) >>> 27; + out[currentPos++] = (val << 28) >>> 27 | (valn >>> 25); + // number : 5, bitwidth : 5 + out[currentPos++] = (valn << 7) >>> 27; + out[currentPos++] = (valn << 12) >>> 27; + out[currentPos++] = (valn << 17) >>> 27; + out[currentPos++] = (valn << 22) >>> 27; + out[currentPos++] = (valn << 27) >>> 27; + } + + private void decode39(int val, int valn, int[] out, int currentPos) { + // number : 5, bitwidth : 5 + out[currentPos++] = (val << 8) >>> 27; + out[currentPos++] = (val << 13) >>> 27; + out[currentPos++] = (val << 18) >>> 27; + out[currentPos++] = (val << 23) >>> 27; + out[currentPos++] = (val << 28) >>> 27 | (valn >>> 28); + // number : 7, bitwidth : 4 + out[currentPos++] = (valn << 4) >>> 28; + out[currentPos++] = (valn << 8) >>> 28; + out[currentPos++] = (valn << 12) >>> 28; + out[currentPos++] = (valn << 16) >>> 28; + out[currentPos++] = (valn << 20) >>> 28; + out[currentPos++] = (valn << 24) >>> 28; + out[currentPos++] = (valn << 28) >>> 28; + } + + private void decode38(int val, int valn, int[] out, int currentPos) { + // number : 5, bitwidth : 5 + out[currentPos++] = (val << 8) >>> 27; + out[currentPos++] = (val << 13) >>> 27; + out[currentPos++] = (val << 18) >>> 27; + out[currentPos++] = (val << 23) >>> 27; + out[currentPos++] = (val << 28) >>> 27 | (valn >>> 27); + // number : 9, bitwidth : 3 + out[currentPos++] = (valn << 5) >>> 29; + out[currentPos++] = (valn << 8) >>> 29; + out[currentPos++] = (valn << 11) >>> 29; + out[currentPos++] = (valn << 14) >>> 29; + out[currentPos++] = (valn << 17) >>> 29; + out[currentPos++] = (valn << 20) >>> 29; + out[currentPos++] = (valn << 23) >>> 29; + out[currentPos++] = (valn << 26) >>> 29; + out[currentPos++] = (valn << 29) >>> 29; + } + + private void decode37(int val, int valn, int[] out, int currentPos) { + // number : 5, bitwidth : 5 + out[currentPos++] = (val << 8) >>> 27; + out[currentPos++] = (val << 13) >>> 27; + out[currentPos++] = (val << 18) >>> 27; + out[currentPos++] = (val << 23) >>> 27; + out[currentPos++] = (val << 28) >>> 27 | (valn >>> 28); + // number : 14, bitwidth : 2 + out[currentPos++] = (valn << 4) >>> 30; + out[currentPos++] = (valn << 6) >>> 30; + out[currentPos++] = (valn << 8) >>> 30; + out[currentPos++] = (valn << 10) >>> 30; + out[currentPos++] = (valn << 12) >>> 30; + out[currentPos++] = (valn << 14) >>> 30; + out[currentPos++] = (valn << 16) >>> 30; + out[currentPos++] = (valn << 18) >>> 30; + out[currentPos++] = (valn << 20) >>> 30; + out[currentPos++] = (valn << 22) >>> 30; // 10 + out[currentPos++] = (valn << 24) >>> 30; + out[currentPos++] = (valn << 26) >>> 30; + out[currentPos++] = (valn << 28) >>> 30; + out[currentPos++] = (valn << 30) >>> 30; + } + + private void decode36(int val, int valn, int[] out, int currentPos) { + // number : 5, bitwidth : 5 + out[currentPos++] = (val << 8) >>> 27; + out[currentPos++] = (val << 13) >>> 27; + out[currentPos++] = (val << 18) >>> 27; + out[currentPos++] = (val << 23) >>> 27; + out[currentPos++] = (val << 28) >>> 27 | (valn >>> 28); + // number : 28, bitwidth : 1 + out[currentPos++] = (valn << 4) >>> 31; + out[currentPos++] = (valn << 5) >>> 31; + out[currentPos++] = (valn << 6) >>> 31; + out[currentPos++] = (valn << 7) >>> 31; + out[currentPos++] = (valn << 8) >>> 31; + out[currentPos++] = (valn << 9) >>> 31; + out[currentPos++] = (valn << 10) >>> 31; + out[currentPos++] = (valn << 11) >>> 31; + out[currentPos++] = (valn << 12) >>> 31; + out[currentPos++] = (valn << 13) >>> 31; // 10 + out[currentPos++] = (valn << 14) >>> 31; + out[currentPos++] = (valn << 15) >>> 31; + out[currentPos++] = (valn << 16) >>> 31; + out[currentPos++] = (valn << 17) >>> 31; + out[currentPos++] = (valn << 18) >>> 31; + out[currentPos++] = (valn << 19) >>> 31; + out[currentPos++] = (valn << 20) >>> 31; + out[currentPos++] = (valn << 21) >>> 31; + out[currentPos++] = (valn << 22) >>> 31; + out[currentPos++] = (valn << 23) >>> 31; // 20 + out[currentPos++] = (valn << 24) >>> 31; + out[currentPos++] = (valn << 25) >>> 31; + out[currentPos++] = (valn << 26) >>> 31; + out[currentPos++] = (valn << 27) >>> 31; + out[currentPos++] = (valn << 28) >>> 31; + out[currentPos++] = (valn << 29) >>> 31; + out[currentPos++] = (valn << 30) >>> 31; + out[currentPos++] = (valn << 31) >>> 31; + } + + private void decode35(int val, int valn, int[] out, int currentPos) { + // number : 7, bitwidth : 4 + out[currentPos++] = (val << 8) >>> 28; + out[currentPos++] = (val << 12) >>> 28; + out[currentPos++] = (val << 16) >>> 28; + out[currentPos++] = (val << 20) >>> 28; + out[currentPos++] = (val << 24) >>> 28; + out[currentPos++] = (val << 28) >>> 28; + out[currentPos++] = (valn << 0) >>> 28; + // number : 1, bitwidth : 28 + out[currentPos++] = (valn << 4) >>> 4; + } + + private void decode34(int val, int valn, int[] out, int currentPos) { + // number : 7, bitwidth : 4 + out[currentPos++] = (val << 8) >>> 28; + out[currentPos++] = (val << 12) >>> 28; + out[currentPos++] = (val << 16) >>> 28; + out[currentPos++] = (val << 20) >>> 28; + out[currentPos++] = (val << 24) >>> 28; + out[currentPos++] = (val << 28) >>> 28; + out[currentPos++] = (valn << 0) >>> 28; + // number : 2, bitwidth : 14 + out[currentPos++] = (valn << 4) >>> 18; + out[currentPos++] = (valn << 18) >>> 18; + } + + private void decode33(int val, int valn, int[] out, int currentPos) { + // number : 7, bitwidth : 4 + out[currentPos++] = (val << 8) >>> 28; + out[currentPos++] = (val << 12) >>> 28; + out[currentPos++] = (val << 16) >>> 28; + out[currentPos++] = (val << 20) >>> 28; + out[currentPos++] = (val << 24) >>> 28; + out[currentPos++] = (val << 28) >>> 28; + out[currentPos++] = (valn << 1) >>> 28; + // number : 3, bitwidth : 9 + out[currentPos++] = (valn << 5) >>> 23; + out[currentPos++] = (valn << 14) >>> 23; + out[currentPos++] = (valn << 23) >>> 23; + } + + private void decode32(int val, int valn, int[] out, int currentPos) { + // number : 7, bitwidth : 4 + out[currentPos++] = (val << 8) >>> 28; + out[currentPos++] = (val << 12) >>> 28; + out[currentPos++] = (val << 16) >>> 28; + out[currentPos++] = (val << 20) >>> 28; + out[currentPos++] = (val << 24) >>> 28; + out[currentPos++] = (val << 28) >>> 28; + out[currentPos++] = (valn << 0) >>> 28; + // number : 4, bitwidth : 7 + out[currentPos++] = (valn << 4) >>> 25; + out[currentPos++] = (valn << 11) >>> 25; + out[currentPos++] = (valn << 18) >>> 25; + out[currentPos++] = (valn << 25) >>> 25; + } + + private void decode31(int val, int valn, int[] out, int currentPos) { + // number : 7, bitwidth : 4 + out[currentPos++] = (val << 8) >>> 28; + out[currentPos++] = (val << 12) >>> 28; + out[currentPos++] = (val << 16) >>> 28; + out[currentPos++] = (val << 20) >>> 28; + out[currentPos++] = (val << 24) >>> 28; + out[currentPos++] = (val << 28) >>> 28; + out[currentPos++] = (valn << 3) >>> 28; + // number : 5, bitwidth : 5 + out[currentPos++] = (valn << 7) >>> 27; + out[currentPos++] = (valn << 12) >>> 27; + out[currentPos++] = (valn << 17) >>> 27; + out[currentPos++] = (valn << 22) >>> 27; + out[currentPos++] = (valn << 27) >>> 27; + } + + private void decode30(int val, int valn, int[] out, int currentPos) { + // number : 7, bitwidth : 4 + out[currentPos++] = (val << 8) >>> 28; + out[currentPos++] = (val << 12) >>> 28; + out[currentPos++] = (val << 16) >>> 28; + out[currentPos++] = (val << 20) >>> 28; + out[currentPos++] = (val << 24) >>> 28; + out[currentPos++] = (val << 28) >>> 28; + out[currentPos++] = (valn << 0) >>> 28; + // number : 7, bitwidth : 4 + out[currentPos++] = (valn << 4) >>> 28; + out[currentPos++] = (valn << 8) >>> 28; + out[currentPos++] = (valn << 12) >>> 28; + out[currentPos++] = (valn << 16) >>> 28; + out[currentPos++] = (valn << 20) >>> 28; + out[currentPos++] = (valn << 24) >>> 28; + out[currentPos++] = (valn << 28) >>> 28; + } + + private void decode29(int val, int valn, int[] out, int currentPos) { + // number : 7, bitwidth : 4 + out[currentPos++] = (val << 8) >>> 28; + out[currentPos++] = (val << 12) >>> 28; + out[currentPos++] = (val << 16) >>> 28; + out[currentPos++] = (val << 20) >>> 28; + out[currentPos++] = (val << 24) >>> 28; + out[currentPos++] = (val << 28) >>> 28; + out[currentPos++] = (valn << 1) >>> 28; + // number : 9, bitwidth : 3 + out[currentPos++] = (valn << 5) >>> 29; + out[currentPos++] = (valn << 8) >>> 29; + out[currentPos++] = (valn << 11) >>> 29; + out[currentPos++] = (valn << 14) >>> 29; + out[currentPos++] = (valn << 17) >>> 29; + out[currentPos++] = (valn << 20) >>> 29; + out[currentPos++] = (valn << 23) >>> 29; + out[currentPos++] = (valn << 26) >>> 29; + out[currentPos++] = (valn << 29) >>> 29; + } + + private void decode28(int val, int valn, int[] out, int currentPos) { + // number : 7, bitwidth : 4 + out[currentPos++] = (val << 8) >>> 28; + out[currentPos++] = (val << 12) >>> 28; + out[currentPos++] = (val << 16) >>> 28; + out[currentPos++] = (val << 20) >>> 28; + out[currentPos++] = (val << 24) >>> 28; + out[currentPos++] = (val << 28) >>> 28; + out[currentPos++] = (valn << 0) >>> 28; + // number : 14, bitwidth : 2 + out[currentPos++] = (valn << 4) >>> 30; + out[currentPos++] = (valn << 6) >>> 30; + out[currentPos++] = (valn << 8) >>> 30; + out[currentPos++] = (valn << 10) >>> 30; + out[currentPos++] = (valn << 12) >>> 30; + out[currentPos++] = (valn << 14) >>> 30; + out[currentPos++] = (valn << 16) >>> 30; + out[currentPos++] = (valn << 18) >>> 30; + out[currentPos++] = (valn << 20) >>> 30; + out[currentPos++] = (valn << 22) >>> 30; // 10 + out[currentPos++] = (valn << 24) >>> 30; + out[currentPos++] = (valn << 26) >>> 30; + out[currentPos++] = (valn << 28) >>> 30; + out[currentPos++] = (valn << 30) >>> 30; + } + + private void decode27(int val, int valn, int[] out, int currentPos) { + // number : 7, bitwidth : 4 + out[currentPos++] = (val << 8) >>> 28; + out[currentPos++] = (val << 12) >>> 28; + out[currentPos++] = (val << 16) >>> 28; + out[currentPos++] = (val << 20) >>> 28; + out[currentPos++] = (val << 24) >>> 28; + out[currentPos++] = (val << 28) >>> 28; + out[currentPos++] = (valn << 0) >>> 28; + // number : 28, bitwidth : 1 + out[currentPos++] = (valn << 4) >>> 31; + out[currentPos++] = (valn << 5) >>> 31; + out[currentPos++] = (valn << 6) >>> 31; + out[currentPos++] = (valn << 7) >>> 31; + out[currentPos++] = (valn << 8) >>> 31; + out[currentPos++] = (valn << 9) >>> 31; + out[currentPos++] = (valn << 10) >>> 31; + out[currentPos++] = (valn << 11) >>> 31; + out[currentPos++] = (valn << 12) >>> 31; + out[currentPos++] = (valn << 13) >>> 31; // 10 + out[currentPos++] = (valn << 14) >>> 31; + out[currentPos++] = (valn << 15) >>> 31; + out[currentPos++] = (valn << 16) >>> 31; + out[currentPos++] = (valn << 17) >>> 31; + out[currentPos++] = (valn << 18) >>> 31; + out[currentPos++] = (valn << 19) >>> 31; + out[currentPos++] = (valn << 20) >>> 31; + out[currentPos++] = (valn << 21) >>> 31; + out[currentPos++] = (valn << 22) >>> 31; + out[currentPos++] = (valn << 23) >>> 31; // 20 + out[currentPos++] = (valn << 24) >>> 31; + out[currentPos++] = (valn << 25) >>> 31; + out[currentPos++] = (valn << 26) >>> 31; + out[currentPos++] = (valn << 27) >>> 31; + out[currentPos++] = (valn << 28) >>> 31; + out[currentPos++] = (valn << 29) >>> 31; + out[currentPos++] = (valn << 30) >>> 31; + out[currentPos++] = (valn << 31) >>> 31; + } + + private void decode26(int val, int valn, int[] out, int currentPos) { + // number : 9, bitwidth : 3 + out[currentPos++] = (val << 8) >>> 29; + out[currentPos++] = (val << 11) >>> 29; + out[currentPos++] = (val << 14) >>> 29; + out[currentPos++] = (val << 17) >>> 29; + out[currentPos++] = (val << 20) >>> 29; + out[currentPos++] = (val << 23) >>> 29; + out[currentPos++] = (val << 26) >>> 29; + out[currentPos++] = (val << 29) >>> 29; + out[currentPos++] = (valn << 1) >>> 29; + // number : 1, bitwidth : 28 + out[currentPos++] = (valn << 4) >>> 4; + } + + private void decode25(int val, int valn, int[] out, int currentPos) { + // number : 9, bitwidth : 3 + out[currentPos++] = (val << 8) >>> 29; + out[currentPos++] = (val << 11) >>> 29; + out[currentPos++] = (val << 14) >>> 29; + out[currentPos++] = (val << 17) >>> 29; + out[currentPos++] = (val << 20) >>> 29; + out[currentPos++] = (val << 23) >>> 29; + out[currentPos++] = (val << 26) >>> 29; + out[currentPos++] = (val << 29) >>> 29; + out[currentPos++] = (valn << 1) >>> 29; + // number : 2, bitwidth : 14 + out[currentPos++] = (valn << 4) >>> 18; + out[currentPos++] = (valn << 18) >>> 18; + } + + private void decode24(int val, int valn, int[] out, int currentPos) { + // number : 9, bitwidth : 3 + out[currentPos++] = (val << 8) >>> 29; + out[currentPos++] = (val << 11) >>> 29; + out[currentPos++] = (val << 14) >>> 29; + out[currentPos++] = (val << 17) >>> 29; + out[currentPos++] = (val << 20) >>> 29; + out[currentPos++] = (val << 23) >>> 29; + out[currentPos++] = (val << 26) >>> 29; + out[currentPos++] = (val << 29) >>> 29; + out[currentPos++] = (valn << 2) >>> 29; + // number : 3, bitwidth : 9 + out[currentPos++] = (valn << 5) >>> 23; + out[currentPos++] = (valn << 14) >>> 23; + out[currentPos++] = (valn << 23) >>> 23; + } + + private void decode23(int val, int valn, int[] out, int currentPos) { + // number : 9, bitwidth : 3 + out[currentPos++] = (val << 8) >>> 29; + out[currentPos++] = (val << 11) >>> 29; + out[currentPos++] = (val << 14) >>> 29; + out[currentPos++] = (val << 17) >>> 29; + out[currentPos++] = (val << 20) >>> 29; + out[currentPos++] = (val << 23) >>> 29; + out[currentPos++] = (val << 26) >>> 29; + out[currentPos++] = (val << 29) >>> 29; + out[currentPos++] = (valn << 1) >>> 29; + // number : 4, bitwidth : 7 + out[currentPos++] = (valn << 4) >>> 25; + out[currentPos++] = (valn << 11) >>> 25; + out[currentPos++] = (valn << 18) >>> 25; + out[currentPos++] = (valn << 25) >>> 25; + } + + private void decode22(int val, int valn, int[] out, int currentPos) { + // number : 9, bitwidth : 3 + out[currentPos++] = (val << 8) >>> 29; + out[currentPos++] = (val << 11) >>> 29; + out[currentPos++] = (val << 14) >>> 29; + out[currentPos++] = (val << 17) >>> 29; + out[currentPos++] = (val << 20) >>> 29; + out[currentPos++] = (val << 23) >>> 29; + out[currentPos++] = (val << 26) >>> 29; + out[currentPos++] = (val << 29) >>> 29; + out[currentPos++] = (valn << 4) >>> 29; + // number : 5, bitwidth : 5 + out[currentPos++] = (valn << 7) >>> 27; + out[currentPos++] = (valn << 12) >>> 27; + out[currentPos++] = (valn << 17) >>> 27; + out[currentPos++] = (valn << 22) >>> 27; + out[currentPos++] = (valn << 27) >>> 27; + } + + private void decode21(int val, int valn, int[] out, int currentPos) { + // number : 9, bitwidth : 3 + out[currentPos++] = (val << 8) >>> 29; + out[currentPos++] = (val << 11) >>> 29; + out[currentPos++] = (val << 14) >>> 29; + out[currentPos++] = (val << 17) >>> 29; + out[currentPos++] = (val << 20) >>> 29; + out[currentPos++] = (val << 23) >>> 29; + out[currentPos++] = (val << 26) >>> 29; + out[currentPos++] = (val << 29) >>> 29; + out[currentPos++] = (valn << 1) >>> 29; + // number : 7, bitwidth : 4 + out[currentPos++] = (valn << 4) >>> 28; + out[currentPos++] = (valn << 8) >>> 28; + out[currentPos++] = (valn << 12) >>> 28; + out[currentPos++] = (valn << 16) >>> 28; + out[currentPos++] = (valn << 20) >>> 28; + out[currentPos++] = (valn << 24) >>> 28; + out[currentPos++] = (valn << 28) >>> 28; + } + + private void decode20(int val, int valn, int[] out, int currentPos) { + // number : 9, bitwidth : 3 + out[currentPos++] = (val << 8) >>> 29; + out[currentPos++] = (val << 11) >>> 29; + out[currentPos++] = (val << 14) >>> 29; + out[currentPos++] = (val << 17) >>> 29; + out[currentPos++] = (val << 20) >>> 29; + out[currentPos++] = (val << 23) >>> 29; + out[currentPos++] = (val << 26) >>> 29; + out[currentPos++] = (val << 29) >>> 29; + out[currentPos++] = (valn << 2) >>> 29; + // number : 9, bitwidth : 3 + out[currentPos++] = (valn << 5) >>> 29; + out[currentPos++] = (valn << 8) >>> 29; + out[currentPos++] = (valn << 11) >>> 29; + out[currentPos++] = (valn << 14) >>> 29; + out[currentPos++] = (valn << 17) >>> 29; + out[currentPos++] = (valn << 20) >>> 29; + out[currentPos++] = (valn << 23) >>> 29; + out[currentPos++] = (valn << 26) >>> 29; + out[currentPos++] = (valn << 29) >>> 29; + } + + private void decode19(int val, int valn, int[] out, int currentPos) { + // number : 9, bitwidth : 3 + out[currentPos++] = (val << 8) >>> 29; + out[currentPos++] = (val << 11) >>> 29; + out[currentPos++] = (val << 14) >>> 29; + out[currentPos++] = (val << 17) >>> 29; + out[currentPos++] = (val << 20) >>> 29; + out[currentPos++] = (val << 23) >>> 29; + out[currentPos++] = (val << 26) >>> 29; + out[currentPos++] = (val << 29) >>> 29; + out[currentPos++] = (valn << 1) >>> 29; + // number : 14, bitwidth : 2 + out[currentPos++] = (valn << 4) >>> 30; + out[currentPos++] = (valn << 6) >>> 30; + out[currentPos++] = (valn << 8) >>> 30; + out[currentPos++] = (valn << 10) >>> 30; + out[currentPos++] = (valn << 12) >>> 30; + out[currentPos++] = (valn << 14) >>> 30; + out[currentPos++] = (valn << 16) >>> 30; + out[currentPos++] = (valn << 18) >>> 30; + out[currentPos++] = (valn << 20) >>> 30; + out[currentPos++] = (valn << 22) >>> 30; // 10 + out[currentPos++] = (valn << 24) >>> 30; + out[currentPos++] = (valn << 26) >>> 30; + out[currentPos++] = (valn << 28) >>> 30; + out[currentPos++] = (valn << 30) >>> 30; + } + + private void decode18(int val, int valn, int[] out, int currentPos) { + // number : 9, bitwidth : 3 + out[currentPos++] = (val << 8) >>> 29; + out[currentPos++] = (val << 11) >>> 29; + out[currentPos++] = (val << 14) >>> 29; + out[currentPos++] = (val << 17) >>> 29; + out[currentPos++] = (val << 20) >>> 29; + out[currentPos++] = (val << 23) >>> 29; + out[currentPos++] = (val << 26) >>> 29; + out[currentPos++] = (val << 29) >>> 29; + out[currentPos++] = (valn << 1) >>> 29; + // number : 28, bitwidth : 1 + out[currentPos++] = (valn << 4) >>> 31; + out[currentPos++] = (valn << 5) >>> 31; + out[currentPos++] = (valn << 6) >>> 31; + out[currentPos++] = (valn << 7) >>> 31; + out[currentPos++] = (valn << 8) >>> 31; + out[currentPos++] = (valn << 9) >>> 31; + out[currentPos++] = (valn << 10) >>> 31; + out[currentPos++] = (valn << 11) >>> 31; + out[currentPos++] = (valn << 12) >>> 31; + out[currentPos++] = (valn << 13) >>> 31; // 10 + out[currentPos++] = (valn << 14) >>> 31; + out[currentPos++] = (valn << 15) >>> 31; + out[currentPos++] = (valn << 16) >>> 31; + out[currentPos++] = (valn << 17) >>> 31; + out[currentPos++] = (valn << 18) >>> 31; + out[currentPos++] = (valn << 19) >>> 31; + out[currentPos++] = (valn << 20) >>> 31; + out[currentPos++] = (valn << 21) >>> 31; + out[currentPos++] = (valn << 22) >>> 31; + out[currentPos++] = (valn << 23) >>> 31; // 20 + out[currentPos++] = (valn << 24) >>> 31; + out[currentPos++] = (valn << 25) >>> 31; + out[currentPos++] = (valn << 26) >>> 31; + out[currentPos++] = (valn << 27) >>> 31; + out[currentPos++] = (valn << 28) >>> 31; + out[currentPos++] = (valn << 29) >>> 31; + out[currentPos++] = (valn << 30) >>> 31; + out[currentPos++] = (valn << 31) >>> 31; + } + + private void decode17(int val, int valn, int[] out, int currentPos) { + // number : 14, bitwidth : 2 + out[currentPos++] = (val << 8) >>> 30; + out[currentPos++] = (val << 10) >>> 30; + out[currentPos++] = (val << 12) >>> 30; + out[currentPos++] = (val << 14) >>> 30; + out[currentPos++] = (val << 16) >>> 30; + out[currentPos++] = (val << 18) >>> 30; + out[currentPos++] = (val << 20) >>> 30; + out[currentPos++] = (val << 22) >>> 30; // 10 + out[currentPos++] = (val << 24) >>> 30; + out[currentPos++] = (val << 26) >>> 30; + out[currentPos++] = (val << 28) >>> 30; + out[currentPos++] = (val << 30) >>> 30; + out[currentPos++] = (valn << 0) >>> 30; + out[currentPos++] = (valn << 2) >>> 30; + // number : 1, bitwidth : 28 + out[currentPos++] = (valn << 4) >>> 4; + } + + private void decode16(int val, int valn, int[] out, int currentPos) { + // number : 14, bitwidth : 2 + out[currentPos++] = (val << 8) >>> 30; + out[currentPos++] = (val << 10) >>> 30; + out[currentPos++] = (val << 12) >>> 30; + out[currentPos++] = (val << 14) >>> 30; + out[currentPos++] = (val << 16) >>> 30; + out[currentPos++] = (val << 18) >>> 30; + out[currentPos++] = (val << 20) >>> 30; + out[currentPos++] = (val << 22) >>> 30; // 10 + out[currentPos++] = (val << 24) >>> 30; + out[currentPos++] = (val << 26) >>> 30; + out[currentPos++] = (val << 28) >>> 30; + out[currentPos++] = (val << 30) >>> 30; + out[currentPos++] = (valn << 0) >>> 30; + out[currentPos++] = (valn << 2) >>> 30; + // number : 2, bitwidth : 14 + out[currentPos++] = (valn << 4) >>> 18; + out[currentPos++] = (valn << 18) >>> 18; + } + + private void decode15(int val, int valn, int[] out, int currentPos) { + // number : 14, bitwidth : 2 + out[currentPos++] = (val << 8) >>> 30; + out[currentPos++] = (val << 10) >>> 30; + out[currentPos++] = (val << 12) >>> 30; + out[currentPos++] = (val << 14) >>> 30; + out[currentPos++] = (val << 16) >>> 30; + out[currentPos++] = (val << 18) >>> 30; + out[currentPos++] = (val << 20) >>> 30; + out[currentPos++] = (val << 22) >>> 30; // 10 + out[currentPos++] = (val << 24) >>> 30; + out[currentPos++] = (val << 26) >>> 30; + out[currentPos++] = (val << 28) >>> 30; + out[currentPos++] = (val << 30) >>> 30; + out[currentPos++] = (valn << 1) >>> 30; + out[currentPos++] = (valn << 3) >>> 30; + // number : 3, bitwidth : 9 + out[currentPos++] = (valn << 5) >>> 23; + out[currentPos++] = (valn << 14) >>> 23; + out[currentPos++] = (valn << 23) >>> 23; + } + + private void decode14(int val, int valn, int[] out, int currentPos) { + // number : 14, bitwidth : 2 + out[currentPos++] = (val << 8) >>> 30; + out[currentPos++] = (val << 10) >>> 30; + out[currentPos++] = (val << 12) >>> 30; + out[currentPos++] = (val << 14) >>> 30; + out[currentPos++] = (val << 16) >>> 30; + out[currentPos++] = (val << 18) >>> 30; + out[currentPos++] = (val << 20) >>> 30; + out[currentPos++] = (val << 22) >>> 30; // 10 + out[currentPos++] = (val << 24) >>> 30; + out[currentPos++] = (val << 26) >>> 30; + out[currentPos++] = (val << 28) >>> 30; + out[currentPos++] = (val << 30) >>> 30; + out[currentPos++] = (valn << 0) >>> 30; + out[currentPos++] = (valn << 2) >>> 30; + // number : 4, bitwidth : 7 + out[currentPos++] = (valn << 4) >>> 25; + out[currentPos++] = (valn << 11) >>> 25; + out[currentPos++] = (valn << 18) >>> 25; + out[currentPos++] = (valn << 25) >>> 25; + } + + private void decode13(int val, int valn, int[] out, int currentPos) { + // number : 14, bitwidth : 2 + out[currentPos++] = (val << 8) >>> 30; + out[currentPos++] = (val << 10) >>> 30; + out[currentPos++] = (val << 12) >>> 30; + out[currentPos++] = (val << 14) >>> 30; + out[currentPos++] = (val << 16) >>> 30; + out[currentPos++] = (val << 18) >>> 30; + out[currentPos++] = (val << 20) >>> 30; + out[currentPos++] = (val << 22) >>> 30; // 10 + out[currentPos++] = (val << 24) >>> 30; + out[currentPos++] = (val << 26) >>> 30; + out[currentPos++] = (val << 28) >>> 30; + out[currentPos++] = (val << 30) >>> 30; + out[currentPos++] = (valn << 3) >>> 30; + out[currentPos++] = (valn << 5) >>> 30; + // number : 5, bitwidth : 5 + out[currentPos++] = (valn << 7) >>> 27; + out[currentPos++] = (valn << 12) >>> 27; + out[currentPos++] = (valn << 17) >>> 27; + out[currentPos++] = (valn << 22) >>> 27; + out[currentPos++] = (valn << 27) >>> 27; + + } + + private void decode12(int val, int valn, int[] out, int currentPos) { + // number : 14, bitwidth : 2 + out[currentPos++] = (val << 8) >>> 30; + out[currentPos++] = (val << 10) >>> 30; + out[currentPos++] = (val << 12) >>> 30; + out[currentPos++] = (val << 14) >>> 30; + out[currentPos++] = (val << 16) >>> 30; + out[currentPos++] = (val << 18) >>> 30; + out[currentPos++] = (val << 20) >>> 30; + out[currentPos++] = (val << 22) >>> 30; // 10 + out[currentPos++] = (val << 24) >>> 30; + out[currentPos++] = (val << 26) >>> 30; + out[currentPos++] = (val << 28) >>> 30; + out[currentPos++] = (val << 30) >>> 30; + out[currentPos++] = (valn << 0) >>> 30; + out[currentPos++] = (valn << 2) >>> 30; + // number : 7, bitwidth : 4 + out[currentPos++] = (valn << 4) >>> 28; + out[currentPos++] = (valn << 8) >>> 28; + out[currentPos++] = (valn << 12) >>> 28; + out[currentPos++] = (valn << 16) >>> 28; + out[currentPos++] = (valn << 20) >>> 28; + out[currentPos++] = (valn << 24) >>> 28; + out[currentPos++] = (valn << 28) >>> 28; + + } + + private void decode11(int val, int valn, int[] out, int currentPos) { + // number : 14, bitwidth : 2 + out[currentPos++] = (val << 8) >>> 30; + out[currentPos++] = (val << 10) >>> 30; + out[currentPos++] = (val << 12) >>> 30; + out[currentPos++] = (val << 14) >>> 30; + out[currentPos++] = (val << 16) >>> 30; + out[currentPos++] = (val << 18) >>> 30; + out[currentPos++] = (val << 20) >>> 30; + out[currentPos++] = (val << 22) >>> 30; // 10 + out[currentPos++] = (val << 24) >>> 30; + out[currentPos++] = (val << 26) >>> 30; + out[currentPos++] = (val << 28) >>> 30; + out[currentPos++] = (val << 30) >>> 30; + out[currentPos++] = (valn << 1) >>> 30; + out[currentPos++] = (valn << 3) >>> 30; + // number : 9, bitwidth : 3 + out[currentPos++] = (valn << 5) >>> 29; + out[currentPos++] = (valn << 8) >>> 29; + out[currentPos++] = (valn << 11) >>> 29; + out[currentPos++] = (valn << 14) >>> 29; + out[currentPos++] = (valn << 17) >>> 29; + out[currentPos++] = (valn << 20) >>> 29; + out[currentPos++] = (valn << 23) >>> 29; + out[currentPos++] = (valn << 26) >>> 29; + out[currentPos++] = (valn << 29) >>> 29; + + } + + private void decode10(int val, int valn, int[] out, int currentPos) { + // number : 14, bitwidth : 2 + out[currentPos++] = (val << 8) >>> 30; + out[currentPos++] = (val << 10) >>> 30; + out[currentPos++] = (val << 12) >>> 30; + out[currentPos++] = (val << 14) >>> 30; + out[currentPos++] = (val << 16) >>> 30; + out[currentPos++] = (val << 18) >>> 30; + out[currentPos++] = (val << 20) >>> 30; + out[currentPos++] = (val << 22) >>> 30; // 10 + out[currentPos++] = (val << 24) >>> 30; + out[currentPos++] = (val << 26) >>> 30; + out[currentPos++] = (val << 28) >>> 30; + out[currentPos++] = (val << 30) >>> 30; + out[currentPos++] = (valn << 0) >>> 30; + out[currentPos++] = (valn << 2) >>> 30; + // number : 14, bitwidth : 2 + out[currentPos++] = (valn << 4) >>> 30; + out[currentPos++] = (valn << 6) >>> 30; + out[currentPos++] = (valn << 8) >>> 30; + out[currentPos++] = (valn << 10) >>> 30; + out[currentPos++] = (valn << 12) >>> 30; + out[currentPos++] = (valn << 14) >>> 30; + out[currentPos++] = (valn << 16) >>> 30; + out[currentPos++] = (valn << 18) >>> 30; + out[currentPos++] = (valn << 20) >>> 30; + out[currentPos++] = (valn << 22) >>> 30; // 10 + out[currentPos++] = (valn << 24) >>> 30; + out[currentPos++] = (valn << 26) >>> 30; + out[currentPos++] = (valn << 28) >>> 30; + out[currentPos++] = (valn << 30) >>> 30; + } + + private void decode9(int val, int valn, int[] out, int currentPos) { + // number : 14, bitwidth : 2 + out[currentPos++] = (val << 8) >>> 30; + out[currentPos++] = (val << 10) >>> 30; + out[currentPos++] = (val << 12) >>> 30; + out[currentPos++] = (val << 14) >>> 30; + out[currentPos++] = (val << 16) >>> 30; + out[currentPos++] = (val << 18) >>> 30; + out[currentPos++] = (val << 20) >>> 30; + out[currentPos++] = (val << 22) >>> 30; // 10 + out[currentPos++] = (val << 24) >>> 30; + out[currentPos++] = (val << 26) >>> 30; + out[currentPos++] = (val << 28) >>> 30; + out[currentPos++] = (val << 30) >>> 30; + out[currentPos++] = (valn << 0) >>> 30; + out[currentPos++] = (valn << 2) >>> 30; + // number : 28, bitwidth : 1 + out[currentPos++] = (valn << 4) >>> 31; + out[currentPos++] = (valn << 5) >>> 31; + out[currentPos++] = (valn << 6) >>> 31; + out[currentPos++] = (valn << 7) >>> 31; + out[currentPos++] = (valn << 8) >>> 31; + out[currentPos++] = (valn << 9) >>> 31; + out[currentPos++] = (valn << 10) >>> 31; + out[currentPos++] = (valn << 11) >>> 31; + out[currentPos++] = (valn << 12) >>> 31; + out[currentPos++] = (valn << 13) >>> 31; // 10 + out[currentPos++] = (valn << 14) >>> 31; + out[currentPos++] = (valn << 15) >>> 31; + out[currentPos++] = (valn << 16) >>> 31; + out[currentPos++] = (valn << 17) >>> 31; + out[currentPos++] = (valn << 18) >>> 31; + out[currentPos++] = (valn << 19) >>> 31; + out[currentPos++] = (valn << 20) >>> 31; + out[currentPos++] = (valn << 21) >>> 31; + out[currentPos++] = (valn << 22) >>> 31; + out[currentPos++] = (valn << 23) >>> 31; // 20 + out[currentPos++] = (valn << 24) >>> 31; + out[currentPos++] = (valn << 25) >>> 31; + out[currentPos++] = (valn << 26) >>> 31; + out[currentPos++] = (valn << 27) >>> 31; + out[currentPos++] = (valn << 28) >>> 31; + out[currentPos++] = (valn << 29) >>> 31; + out[currentPos++] = (valn << 30) >>> 31; + out[currentPos++] = (valn << 31) >>> 31; + } + + private void decode8(int val, int valn, int[] out, int currentPos) { + // number : 28, bitwidth : 1 + out[currentPos++] = (val << 8) >>> 31; + out[currentPos++] = (val << 9) >>> 31; + out[currentPos++] = (val << 10) >>> 31; + out[currentPos++] = (val << 11) >>> 31; + out[currentPos++] = (val << 12) >>> 31; + out[currentPos++] = (val << 13) >>> 31; // 10 + out[currentPos++] = (val << 14) >>> 31; + out[currentPos++] = (val << 15) >>> 31; + out[currentPos++] = (val << 16) >>> 31; + out[currentPos++] = (val << 17) >>> 31; + out[currentPos++] = (val << 18) >>> 31; + out[currentPos++] = (val << 19) >>> 31; + out[currentPos++] = (val << 20) >>> 31; + out[currentPos++] = (val << 21) >>> 31; + out[currentPos++] = (val << 22) >>> 31; + out[currentPos++] = (val << 23) >>> 31; // 20 + out[currentPos++] = (val << 24) >>> 31; + out[currentPos++] = (val << 25) >>> 31; + out[currentPos++] = (val << 26) >>> 31; + out[currentPos++] = (val << 27) >>> 31; + out[currentPos++] = (val << 28) >>> 31; + out[currentPos++] = (val << 29) >>> 31; + out[currentPos++] = (val << 30) >>> 31; + out[currentPos++] = (val << 31) >>> 31; + out[currentPos++] = valn >>> 31; + out[currentPos++] = (valn << 1) >>> 31; + out[currentPos++] = (valn << 2) >>> 31; + out[currentPos++] = (valn << 3) >>> 31; + // number : 1, bitwidth : 28 + out[currentPos++] = (valn << 4) >>> 4; + } + + private void decode7(int val, int valn, int[] out, int currentPos) { + // number : 28, bitwidth : 1 + out[currentPos++] = (val << 8) >>> 31; + out[currentPos++] = (val << 9) >>> 31; + out[currentPos++] = (val << 10) >>> 31; + out[currentPos++] = (val << 11) >>> 31; + out[currentPos++] = (val << 12) >>> 31; + out[currentPos++] = (val << 13) >>> 31; // 10 + out[currentPos++] = (val << 14) >>> 31; + out[currentPos++] = (val << 15) >>> 31; + out[currentPos++] = (val << 16) >>> 31; + out[currentPos++] = (val << 17) >>> 31; + out[currentPos++] = (val << 18) >>> 31; + out[currentPos++] = (val << 19) >>> 31; + out[currentPos++] = (val << 20) >>> 31; + out[currentPos++] = (val << 21) >>> 31; + out[currentPos++] = (val << 22) >>> 31; + out[currentPos++] = (val << 23) >>> 31; // 20 + out[currentPos++] = (val << 24) >>> 31; + out[currentPos++] = (val << 25) >>> 31; + out[currentPos++] = (val << 26) >>> 31; + out[currentPos++] = (val << 27) >>> 31; + out[currentPos++] = (val << 28) >>> 31; + out[currentPos++] = (val << 29) >>> 31; + out[currentPos++] = (val << 30) >>> 31; + out[currentPos++] = (val << 31) >>> 31; + out[currentPos++] = valn >>> 31; + out[currentPos++] = (valn << 1) >>> 31; + out[currentPos++] = (valn << 2) >>> 31; + out[currentPos++] = (valn << 3) >>> 31; + // number : 2, bitwidth : 14 + out[currentPos++] = (valn << 4) >>> 18; + out[currentPos++] = (valn << 18) >>> 18; + } + + private void decode6(int val, int valn, int[] out, int currentPos) { + // number : 28, bitwidth : 1 + out[currentPos++] = (val << 8) >>> 31; + out[currentPos++] = (val << 9) >>> 31; + out[currentPos++] = (val << 10) >>> 31; + out[currentPos++] = (val << 11) >>> 31; + out[currentPos++] = (val << 12) >>> 31; + out[currentPos++] = (val << 13) >>> 31; // 10 + out[currentPos++] = (val << 14) >>> 31; + out[currentPos++] = (val << 15) >>> 31; + out[currentPos++] = (val << 16) >>> 31; + out[currentPos++] = (val << 17) >>> 31; + out[currentPos++] = (val << 18) >>> 31; + out[currentPos++] = (val << 19) >>> 31; + out[currentPos++] = (val << 20) >>> 31; + out[currentPos++] = (val << 21) >>> 31; + out[currentPos++] = (val << 22) >>> 31; + out[currentPos++] = (val << 23) >>> 31; // 20 + out[currentPos++] = (val << 24) >>> 31; + out[currentPos++] = (val << 25) >>> 31; + out[currentPos++] = (val << 26) >>> 31; + out[currentPos++] = (val << 27) >>> 31; + out[currentPos++] = (val << 28) >>> 31; + out[currentPos++] = (val << 29) >>> 31; + out[currentPos++] = (val << 30) >>> 31; + out[currentPos++] = (val << 31) >>> 31; + out[currentPos++] = (valn << 1) >>> 31; + out[currentPos++] = (valn << 2) >>> 31; + out[currentPos++] = (valn << 3) >>> 31; + out[currentPos++] = (valn << 4) >>> 31; + // number : 3, bitwidth : 9 + out[currentPos++] = (valn << 5) >>> 23; + out[currentPos++] = (valn << 14) >>> 23; + out[currentPos++] = (valn << 23) >>> 23; + } + + private void decode5(int val, int valn, int[] out, int currentPos) { + // number : 28, bitwidth : 1 + out[currentPos++] = (val << 8) >>> 31; + out[currentPos++] = (val << 9) >>> 31; + out[currentPos++] = (val << 10) >>> 31; + out[currentPos++] = (val << 11) >>> 31; + out[currentPos++] = (val << 12) >>> 31; + out[currentPos++] = (val << 13) >>> 31; // 10 + out[currentPos++] = (val << 14) >>> 31; + out[currentPos++] = (val << 15) >>> 31; + out[currentPos++] = (val << 16) >>> 31; + out[currentPos++] = (val << 17) >>> 31; + out[currentPos++] = (val << 18) >>> 31; + out[currentPos++] = (val << 19) >>> 31; + out[currentPos++] = (val << 20) >>> 31; + out[currentPos++] = (val << 21) >>> 31; + out[currentPos++] = (val << 22) >>> 31; + out[currentPos++] = (val << 23) >>> 31; // 20 + out[currentPos++] = (val << 24) >>> 31; + out[currentPos++] = (val << 25) >>> 31; + out[currentPos++] = (val << 26) >>> 31; + out[currentPos++] = (val << 27) >>> 31; + out[currentPos++] = (val << 28) >>> 31; + out[currentPos++] = (val << 29) >>> 31; + out[currentPos++] = (val << 30) >>> 31; + out[currentPos++] = (val << 31) >>> 31; + out[currentPos++] = valn >>> 31; + out[currentPos++] = (valn << 1) >>> 31; + out[currentPos++] = (valn << 2) >>> 31; + out[currentPos++] = (valn << 3) >>> 31; + // number : 4, bitwidth : 7 + out[currentPos++] = (valn << 4) >>> 25; + out[currentPos++] = (valn << 11) >>> 25; + out[currentPos++] = (valn << 18) >>> 25; + out[currentPos++] = (valn << 25) >>> 25; + } + + private void decode4(int val, int valn, int[] out, int currentPos) { + // number : 28, bitwidth : 1 + out[currentPos++] = (val << 8) >>> 31; + out[currentPos++] = (val << 9) >>> 31; + out[currentPos++] = (val << 10) >>> 31; + out[currentPos++] = (val << 11) >>> 31; + out[currentPos++] = (val << 12) >>> 31; + out[currentPos++] = (val << 13) >>> 31; // 10 + out[currentPos++] = (val << 14) >>> 31; + out[currentPos++] = (val << 15) >>> 31; + out[currentPos++] = (val << 16) >>> 31; + out[currentPos++] = (val << 17) >>> 31; + out[currentPos++] = (val << 18) >>> 31; + out[currentPos++] = (val << 19) >>> 31; + out[currentPos++] = (val << 20) >>> 31; + out[currentPos++] = (val << 21) >>> 31; + out[currentPos++] = (val << 22) >>> 31; + out[currentPos++] = (val << 23) >>> 31; // 20 + out[currentPos++] = (val << 24) >>> 31; + out[currentPos++] = (val << 25) >>> 31; + out[currentPos++] = (val << 26) >>> 31; + out[currentPos++] = (val << 27) >>> 31; + out[currentPos++] = (val << 28) >>> 31; + out[currentPos++] = (val << 29) >>> 31; + out[currentPos++] = (val << 30) >>> 31; + out[currentPos++] = (val << 31) >>> 31; + out[currentPos++] = (valn << 3) >>> 31;// 头部3bit + out[currentPos++] = (valn << 4) >>> 31; + out[currentPos++] = (valn << 5) >>> 31; + out[currentPos++] = (valn << 6) >>> 31; + // number : 5, bitwidth : 5 + out[currentPos++] = (valn << 7) >>> 27; + out[currentPos++] = (valn << 12) >>> 27; + out[currentPos++] = (valn << 17) >>> 27; + out[currentPos++] = (valn << 22) >>> 27; + out[currentPos++] = (valn << 27) >>> 27; + } + + private void decode3(int val, int valn, int[] out, int currentPos) { + // number : 28, bitwidth : 1 + out[currentPos++] = (val << 8) >>> 31; + out[currentPos++] = (val << 9) >>> 31; + out[currentPos++] = (val << 10) >>> 31; + out[currentPos++] = (val << 11) >>> 31; + out[currentPos++] = (val << 12) >>> 31; + out[currentPos++] = (val << 13) >>> 31; // 10 + out[currentPos++] = (val << 14) >>> 31; + out[currentPos++] = (val << 15) >>> 31; + out[currentPos++] = (val << 16) >>> 31; + out[currentPos++] = (val << 17) >>> 31; + out[currentPos++] = (val << 18) >>> 31; + out[currentPos++] = (val << 19) >>> 31; + out[currentPos++] = (val << 20) >>> 31; + out[currentPos++] = (val << 21) >>> 31; + out[currentPos++] = (val << 22) >>> 31; + out[currentPos++] = (val << 23) >>> 31; // 20 + out[currentPos++] = (val << 24) >>> 31; + out[currentPos++] = (val << 25) >>> 31; + out[currentPos++] = (val << 26) >>> 31; + out[currentPos++] = (val << 27) >>> 31; + out[currentPos++] = (val << 28) >>> 31; + out[currentPos++] = (val << 29) >>> 31; + out[currentPos++] = (val << 30) >>> 31; + out[currentPos++] = (val << 31) >>> 31; + out[currentPos++] = valn >>> 31; + out[currentPos++] = (valn << 1) >>> 31; + out[currentPos++] = (valn << 2) >>> 31; + out[currentPos++] = (valn << 3) >>> 31; + // number : 7, bitwidth : 4 + out[currentPos++] = (valn << 4) >>> 28; + out[currentPos++] = (valn << 8) >>> 28; + out[currentPos++] = (valn << 12) >>> 28; + out[currentPos++] = (valn << 16) >>> 28; + out[currentPos++] = (valn << 20) >>> 28; + out[currentPos++] = (valn << 24) >>> 28; + out[currentPos++] = (valn << 28) >>> 28; + } + + private void decode2(int val, int valn, int[] out, int currentPos) { + // number : 28, bitwidth : 1 + out[currentPos++] = (val << 8) >>> 31; + out[currentPos++] = (val << 9) >>> 31; + out[currentPos++] = (val << 10) >>> 31; + out[currentPos++] = (val << 11) >>> 31; + out[currentPos++] = (val << 12) >>> 31; + out[currentPos++] = (val << 13) >>> 31; // 10 + out[currentPos++] = (val << 14) >>> 31; + out[currentPos++] = (val << 15) >>> 31; + out[currentPos++] = (val << 16) >>> 31; + out[currentPos++] = (val << 17) >>> 31; + out[currentPos++] = (val << 18) >>> 31; + out[currentPos++] = (val << 19) >>> 31; + out[currentPos++] = (val << 20) >>> 31; + out[currentPos++] = (val << 21) >>> 31; + out[currentPos++] = (val << 22) >>> 31; + out[currentPos++] = (val << 23) >>> 31; // 20 + out[currentPos++] = (val << 24) >>> 31; + out[currentPos++] = (val << 25) >>> 31; + out[currentPos++] = (val << 26) >>> 31; + out[currentPos++] = (val << 27) >>> 31; + out[currentPos++] = (val << 28) >>> 31; + out[currentPos++] = (val << 29) >>> 31; + out[currentPos++] = (val << 30) >>> 31; + out[currentPos++] = (val << 31) >>> 31; + out[currentPos++] = (valn << 1) >>> 31;// 头部1bit + out[currentPos++] = (valn << 2) >>> 31; + out[currentPos++] = (valn << 3) >>> 31; + out[currentPos++] = (valn << 4) >>> 31; + // number : 9, bitwidth : 3 + out[currentPos++] = (valn << 5) >>> 29; + out[currentPos++] = (valn << 8) >>> 29; + out[currentPos++] = (valn << 11) >>> 29; + out[currentPos++] = (valn << 14) >>> 29; + out[currentPos++] = (valn << 17) >>> 29; + out[currentPos++] = (valn << 20) >>> 29; + out[currentPos++] = (valn << 23) >>> 29; + out[currentPos++] = (valn << 26) >>> 29; + out[currentPos++] = (valn << 29) >>> 29; + } + + private void decode1(int val, int valn, int[] out, int currentPos) { + // number : 28, bitwidth : 1 + out[currentPos++] = (val << 8) >>> 31; + out[currentPos++] = (val << 9) >>> 31; + out[currentPos++] = (val << 10) >>> 31; + out[currentPos++] = (val << 11) >>> 31; + out[currentPos++] = (val << 12) >>> 31; + out[currentPos++] = (val << 13) >>> 31; // 10 + out[currentPos++] = (val << 14) >>> 31; + out[currentPos++] = (val << 15) >>> 31; + out[currentPos++] = (val << 16) >>> 31; + out[currentPos++] = (val << 17) >>> 31; + out[currentPos++] = (val << 18) >>> 31; + out[currentPos++] = (val << 19) >>> 31; + out[currentPos++] = (val << 20) >>> 31; + out[currentPos++] = (val << 21) >>> 31; + out[currentPos++] = (val << 22) >>> 31; + out[currentPos++] = (val << 23) >>> 31;// 20 + out[currentPos++] = (val << 24) >>> 31; + out[currentPos++] = (val << 25) >>> 31; + out[currentPos++] = (val << 26) >>> 31; + out[currentPos++] = (val << 27) >>> 31; + out[currentPos++] = (val << 28) >>> 31; + out[currentPos++] = (val << 29) >>> 31; + out[currentPos++] = (val << 30) >>> 31; + out[currentPos++] = (val << 31) >>> 31; + out[currentPos++] = valn >>> 31; + out[currentPos++] = (valn << 1) >>> 31; + out[currentPos++] = (valn << 2) >>> 31; + out[currentPos++] = (valn << 3) >>> 31; + // number : 14, bitwidth : 2 + out[currentPos++] = (valn << 4) >>> 30; + out[currentPos++] = (valn << 6) >>> 30; + out[currentPos++] = (valn << 8) >>> 30; + out[currentPos++] = (valn << 10) >>> 30; + out[currentPos++] = (valn << 12) >>> 30; + out[currentPos++] = (valn << 14) >>> 30; + out[currentPos++] = (valn << 16) >>> 30; + out[currentPos++] = (valn << 18) >>> 30; + out[currentPos++] = (valn << 20) >>> 30; + out[currentPos++] = (valn << 22) >>> 30; // 10 + out[currentPos++] = (valn << 24) >>> 30; + out[currentPos++] = (valn << 26) >>> 30; + out[currentPos++] = (valn << 28) >>> 30; + out[currentPos++] = (valn << 30) >>> 30; + } + + private void decode0(int val, int valn, int[] out, int currentPos) { + // number : 28, bitwidth : 1 + out[currentPos++] = (val << 8) >>> 31; + out[currentPos++] = (val << 9) >>> 31; + out[currentPos++] = (val << 10) >>> 31; + out[currentPos++] = (val << 11) >>> 31; + out[currentPos++] = (val << 12) >>> 31; + out[currentPos++] = (val << 13) >>> 31; // 10 + out[currentPos++] = (val << 14) >>> 31; + out[currentPos++] = (val << 15) >>> 31; + out[currentPos++] = (val << 16) >>> 31; + out[currentPos++] = (val << 17) >>> 31; + out[currentPos++] = (val << 18) >>> 31; + out[currentPos++] = (val << 19) >>> 31; + out[currentPos++] = (val << 20) >>> 31; + out[currentPos++] = (val << 21) >>> 31; + out[currentPos++] = (val << 22) >>> 31; + out[currentPos++] = (val << 23) >>> 31; // 20 + out[currentPos++] = (val << 24) >>> 31; + out[currentPos++] = (val << 25) >>> 31; + out[currentPos++] = (val << 26) >>> 31; + out[currentPos++] = (val << 27) >>> 31; + out[currentPos++] = (val << 28) >>> 31; + out[currentPos++] = (val << 29) >>> 31; + out[currentPos++] = (val << 30) >>> 31; + out[currentPos++] = (val << 31) >>> 31; + out[currentPos++] = valn >>> 31; + out[currentPos++] = (valn << 1) >>> 31; + out[currentPos++] = (valn << 2) >>> 31; + out[currentPos++] = (valn << 3) >>> 31; + // number : 28, bitwidth : 1 + out[currentPos++] = (valn << 4) >>> 31; + out[currentPos++] = (valn << 5) >>> 31; + out[currentPos++] = (valn << 6) >>> 31; + out[currentPos++] = (valn << 7) >>> 31; + out[currentPos++] = (valn << 8) >>> 31; + out[currentPos++] = (valn << 9) >>> 31; + out[currentPos++] = (valn << 10) >>> 31; + out[currentPos++] = (valn << 11) >>> 31; + out[currentPos++] = (valn << 12) >>> 31; + out[currentPos++] = (valn << 13) >>> 31; // 10 + out[currentPos++] = (valn << 14) >>> 31; + out[currentPos++] = (valn << 15) >>> 31; + out[currentPos++] = (valn << 16) >>> 31; + out[currentPos++] = (valn << 17) >>> 31; + out[currentPos++] = (valn << 18) >>> 31; + out[currentPos++] = (valn << 19) >>> 31; + out[currentPos++] = (valn << 20) >>> 31; + out[currentPos++] = (valn << 21) >>> 31; + out[currentPos++] = (valn << 22) >>> 31; + out[currentPos++] = (valn << 23) >>> 31; // 20 + out[currentPos++] = (valn << 24) >>> 31; + out[currentPos++] = (valn << 25) >>> 31; + out[currentPos++] = (valn << 26) >>> 31; + out[currentPos++] = (valn << 27) >>> 31; + out[currentPos++] = (valn << 28) >>> 31; + out[currentPos++] = (valn << 29) >>> 31; + out[currentPos++] = (valn << 30) >>> 31; + out[currentPos++] = (valn << 31) >>> 31; + } + + + private final static int bitLength[] = { 1, 2, 3, 4, 5, 7, 9, 14, 28 }; + + private final static int codeNum[] = { 28, 14, 9, 7, 5, 4, 3, 2, 1 }; + + @Override + public String toString() { + return this.getClass().getSimpleName(); + } +} \ No newline at end of file diff --git a/src/main/java/me/lemire/integercompression/S16.java b/src/main/java/me/lemire/integercompression/S16.java index 4b3b577..08ffbc4 100644 --- a/src/main/java/me/lemire/integercompression/S16.java +++ b/src/main/java/me/lemire/integercompression/S16.java @@ -15,198 +15,191 @@ */ public final class S16 { - /** - * Compress an integer array using Simple16 - * - * - * @param in - * array to compress - * @param currentPos - * where to start reading - * @param inlength - * how many integers to read - * @param out output array - * @param tmpoutpos location in the output array - * @return the number of 32-bit words written (in compressed form) - */ - public static int compress(final int[] in, int currentPos, - int inlength, final int out[], final int tmpoutpos) { - int outpos = tmpoutpos; - final int finalin = currentPos + inlength; - while (currentPos < finalin) { - int inoffset = compressblock(out, outpos++, in, - currentPos, inlength); - if (inoffset == -1) - throw new RuntimeException("Too big a number"); - currentPos += inoffset; - inlength -= inoffset; - } - return outpos - tmpoutpos; - } - - /** - * Estimate size of the compressed output. - * - * @param in - * array to compress - * @param currentPos - * where to start reading - * @param inlength - * how many integers to read - * @return estimated size of the output (in 32-bit integers) - */ - public static int estimatecompress(final int[] in, int currentPos, - int inlength) { - final int finalin = currentPos + inlength; - int counter = 0; - while (currentPos < finalin) { - int inoffset = fakecompressblock(in, currentPos, - inlength); - if (inoffset == -1) - throw new RuntimeException("Too big a number"); - currentPos += inoffset; - inlength -= inoffset; - ++counter; - } - return counter; - } - - /** - * Compress an integer array using Simple16 - * - * @param out - * the compressed output - * @param outOffset - * the offset of the output in the number of integers - * @param in - * the integer input array - * @param inOffset - * the offset of the input in the number of integers - * @param n - * the number of elements to be compressed - * @return the size of the outputs in 32-bit integers - * - */ - public static final int compressblock(int[] out, int outOffset, - int[] in, int inOffset, int n) { - int numIdx, j, num, bits; - for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { - out[outOffset] = numIdx << S16_BITSSIZE; - num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; - - for (j = 0, bits = 0; (j < num) - && (in[inOffset + j] < SHIFTED_S16_BITS[numIdx][j]);) { - out[outOffset] |= (in[inOffset + j] << bits); - bits += S16_BITS[numIdx][j]; - j++; - } - - if (j == num) { - return num; - } - } - - return -1; - } - - private static final int fakecompressblock(int[] in, int inOffset, int n) { - int numIdx, j, num; - for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { - num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; - - for (j = 0; (j < num) - && (in[inOffset + j] < SHIFTED_S16_BITS[numIdx][j]);) { - j++; - } - - if (j == num) { - return num; - } - } - - return -1; - } - - /** - * Decompress an integer array using Simple16 - * - * @param out - * the decompressed output - * @param outOffset - * the offset of the output in the number of integers - * @param in - * the compressed input array - * @param inOffset - * the offset of the input in the number of integers - * @param n - * the number of elements to be compressed - * @return the number of processed integers - */ - public static final int decompressblock(int[] out, int outOffset, - int[] in, int inOffset, int n) { - int numIdx, j = 0, bits = 0; - numIdx = in[inOffset] >>> S16_BITSSIZE; - int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; - for (j = 0, bits = 0; j < num; j++) { - out[outOffset + j] = (in[inOffset] >>> bits) - & (0xffffffff >>> (32 - S16_BITS[numIdx][j])); - bits += S16_BITS[numIdx][j]; - } - return num; - } - - /** - * Uncompressed data from an input array into an output array - * - * @param in input array (in compressed form) - * @param tmpinpos starting location in the compressed input array - * @param inlength how much data we wish the read (in 32-bit words) - * @param out output array (in decompressed form) - * @param currentPos current position in the output array - * @param outlength available data in the output array - */ - public static void uncompress(final int[] in, int tmpinpos, - final int inlength, final int[] out, int currentPos, - int outlength) { - final int finalpos = tmpinpos + inlength; - while (tmpinpos < finalpos) { - final int howmany = decompressblock(out, currentPos, - in, tmpinpos, outlength); - outlength -= howmany; - currentPos += howmany; - tmpinpos += 1; - } - - } - - private static int[][] shiftme(int[][] x) { - int[][] answer = new int[x.length][]; - for (int k = 0; k < x.length; ++k) { - answer[k] = new int[x[k].length]; - for (int z = 0; z < answer[k].length; ++z) - answer[k][z] = 1 << x[k][z]; - } - return answer; - } - - private static final int S16_NUMSIZE = 16; - private static final int S16_BITSSIZE = 28; - // the possible number of bits used to represent one integer - private static final int[] S16_NUM = { 28, 21, 21, 21, 14, 9, 8, 7, 6, - 6, 5, 5, 4, 3, 2, 1 }; - // the corresponding number of elements for each value of the number of - // bits - private static final int[][] S16_BITS = { - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1 }, - { 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, - { 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1 }, - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2 }, - { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, - { 4, 3, 3, 3, 3, 3, 3, 3, 3 }, { 3, 4, 4, 4, 4, 3, 3, 3 }, - { 4, 4, 4, 4, 4, 4, 4 }, { 5, 5, 5, 5, 4, 4 }, - { 4, 4, 5, 5, 5, 5 }, { 6, 6, 6, 5, 5 }, { 5, 5, 6, 6, 6 }, - { 7, 7, 7, 7 }, { 10, 9, 9, }, { 14, 14 }, { 28 } }; - private static final int[][] SHIFTED_S16_BITS = shiftme(S16_BITS); + /** + * Compress an integer array using Simple16 + * + * + * @param in + * array to compress + * @param currentPos + * where to start reading + * @param inlength + * how many integers to read + * @param out + * output array + * @param tmpoutpos + * location in the output array + * @return the number of 32-bit words written (in compressed form) + */ + public static int compress(final int[] in, int currentPos, int inlength, final int out[], final int tmpoutpos) { + int outpos = tmpoutpos; + final int finalin = currentPos + inlength; + while (currentPos < finalin) { + int inoffset = compressblock(out, outpos++, in, currentPos, inlength); + if (inoffset == -1) + throw new RuntimeException("Too big a number"); + currentPos += inoffset; + inlength -= inoffset; + } + return outpos - tmpoutpos; + } + + /** + * Estimate size of the compressed output. + * + * @param in + * array to compress + * @param currentPos + * where to start reading + * @param inlength + * how many integers to read + * @return estimated size of the output (in 32-bit integers) + */ + public static int estimatecompress(final int[] in, int currentPos, int inlength) { + final int finalin = currentPos + inlength; + int counter = 0; + while (currentPos < finalin) { + int inoffset = fakecompressblock(in, currentPos, inlength); + if (inoffset == -1) + throw new RuntimeException("Too big a number"); + currentPos += inoffset; + inlength -= inoffset; + ++counter; + } + return counter; + } + + /** + * Compress an integer array using Simple16 + * + * @param out + * the compressed output + * @param outOffset + * the offset of the output in the number of integers + * @param in + * the integer input array + * @param inOffset + * the offset of the input in the number of integers + * @param n + * the number of elements to be compressed + * @return the size of the outputs in 32-bit integers + * + */ + public static final int compressblock(int[] out, int outOffset, int[] in, int inOffset, int n) { + int numIdx, j, num, bits; + for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { + out[outOffset] = numIdx << S16_BITSSIZE; + num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; + + for (j = 0, bits = 0; (j < num) && (in[inOffset + j] < SHIFTED_S16_BITS[numIdx][j]);) { + out[outOffset] |= (in[inOffset + j] << bits); + bits += S16_BITS[numIdx][j]; + j++; + } + + if (j == num) { + return num; + } + } + + return -1; + } + + private static final int fakecompressblock(int[] in, int inOffset, int n) { + int numIdx, j, num; + for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { + num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; + + for (j = 0; (j < num) && (in[inOffset + j] < SHIFTED_S16_BITS[numIdx][j]);) { + j++; + } + + if (j == num) { + return num; + } + } + + return -1; + } + + /** + * Decompress an integer array using Simple16 + * + * @param out + * the decompressed output + * @param outOffset + * the offset of the output in the number of integers + * @param in + * the compressed input array + * @param inOffset + * the offset of the input in the number of integers + * @param n + * the number of elements to be compressed + * @return the number of processed integers + */ + public static final int decompressblock(int[] out, int outOffset, int[] in, int inOffset, int n) { + int numIdx, j = 0, bits = 0; + numIdx = in[inOffset] >>> S16_BITSSIZE; + int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; + for (j = 0, bits = 0; j < num; j++) { + out[outOffset + j] = (in[inOffset] >>> bits) & (0xffffffff >>> (32 - S16_BITS[numIdx][j])); + bits += S16_BITS[numIdx][j]; + } + return num; + } + + /** + * Uncompressed data from an input array into an output array + * + * @param in + * input array (in compressed form) + * @param tmpinpos + * starting location in the compressed input array + * @param inlength + * how much data we wish the read (in 32-bit words) + * @param out + * output array (in decompressed form) + * @param currentPos + * current position in the output array + * @param outlength + * available data in the output array + */ + public static void uncompress(final int[] in, int tmpinpos, final int inlength, final int[] out, int currentPos, + int outlength) { + final int finalpos = tmpinpos + inlength; + while (tmpinpos < finalpos) { + final int howmany = decompressblock(out, currentPos, in, tmpinpos, outlength); + outlength -= howmany; + currentPos += howmany; + tmpinpos += 1; + } + + } + + private static int[][] shiftme(int[][] x) { + int[][] answer = new int[x.length][]; + for (int k = 0; k < x.length; ++k) { + answer[k] = new int[x[k].length]; + for (int z = 0; z < answer[k].length; ++z) + answer[k][z] = 1 << x[k][z]; + } + return answer; + } + + private static final int S16_NUMSIZE = 16; + private static final int S16_BITSSIZE = 28; + // the possible number of bits used to represent one integer + private static final int[] S16_NUM = { 28, 21, 21, 21, 14, 9, 8, 7, 6, 6, 5, 5, 4, 3, 2, 1 }; + // the corresponding number of elements for each value of the number of + // bits + private static final int[][] S16_BITS = { + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2 }, + { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, { 4, 3, 3, 3, 3, 3, 3, 3, 3 }, { 3, 4, 4, 4, 4, 3, 3, 3 }, + { 4, 4, 4, 4, 4, 4, 4 }, { 5, 5, 5, 5, 4, 4 }, { 4, 4, 5, 5, 5, 5 }, { 6, 6, 6, 5, 5 }, { 5, 5, 6, 6, 6 }, + { 7, 7, 7, 7 }, { 10, 9, 9, }, { 14, 14 }, { 28 } }; + private static final int[][] SHIFTED_S16_BITS = shiftme(S16_BITS); } diff --git a/src/main/java/me/lemire/integercompression/S9.java b/src/main/java/me/lemire/integercompression/S9.java index a14b1fb..2180e5a 100644 --- a/src/main/java/me/lemire/integercompression/S9.java +++ b/src/main/java/me/lemire/integercompression/S9.java @@ -11,202 +11,193 @@ *

    * Adapted by D. Lemire from the Apache Lucene project. *

    + * * @author Daniel Lemire */ public final class S9 { - /** - * Estimate size of the compressed output. - * - * @param in - * array to compress - * @param currentPos - * where to start reading - * @param inlength - * how many integers to read - * @return estimated size of the output (in 32-bit integers) - */ - public static int estimatecompress(int[] in, int currentPos, - int inlength) { - int tmpoutpos = 0; - int finalpos = currentPos + inlength; - outer: while (currentPos < finalpos) { - mainloop: for (int selector = 0; selector < 8; selector++) { - int compressedNum = codeNum[selector]; - if (finalpos <= currentPos + compressedNum - 1) - compressedNum = finalpos - currentPos; - int b = bitLength[selector]; - int max = 1 << b; - int i = 0; - for (; i < compressedNum; i++) - if (max <= in[currentPos + i]) - continue mainloop; - currentPos += compressedNum; - ++tmpoutpos; - continue outer; - } - final int selector = 8; - if (in[currentPos] >= 1 << bitLength[selector]) - throw new RuntimeException("Too big a number"); - tmpoutpos++; - currentPos++; - } - return tmpoutpos; - } + /** + * Estimate size of the compressed output. + * + * @param in + * array to compress + * @param currentPos + * where to start reading + * @param inlength + * how many integers to read + * @return estimated size of the output (in 32-bit integers) + */ + public static int estimatecompress(int[] in, int currentPos, int inlength) { + int tmpoutpos = 0; + int finalpos = currentPos + inlength; + outer: while (currentPos < finalpos) { + mainloop: for (int selector = 0; selector < 8; selector++) { - /** - * Compress an integer array using Simple9 - * - * - * @param in - * array to compress - * @param currentPos - * where to start reading - * @param inlength - * how many integers to read - * @param out output array - * @param tmpoutpos location in the output array - * @return the number of 32-bit words written (in compressed form) - */ - public static int compress(int[] in, int currentPos, int inlength, - int out[], int tmpoutpos) { - int origtmpoutpos = tmpoutpos; - int finalpos = currentPos + inlength; - outer: while (currentPos < finalpos) { - mainloop: for (int selector = 0; selector < 8; selector++) { - int res = 0; - int compressedNum = codeNum[selector]; - if (finalpos <= currentPos + compressedNum - 1) - compressedNum = finalpos - currentPos; - int b = bitLength[selector]; - int max = 1 << b; - int i = 0; - for (; i < compressedNum; i++) { - if (max <= in[currentPos + i]) - continue mainloop; - res = (res << b) + in[currentPos + i]; - } - if (compressedNum != codeNum[selector]) - res <<= (codeNum[selector] - compressedNum) - * b; - res |= selector << 28; - out[tmpoutpos++] = res; - currentPos += compressedNum; - continue outer; - } - final int selector = 8; - if (in[currentPos] >= 1 << bitLength[selector]) - throw new RuntimeException("Too big a number"); - out[tmpoutpos++] = in[currentPos++] | (selector << 28); - } - return tmpoutpos - origtmpoutpos; - } + int compressedNum = codeNum[selector]; + if (finalpos <= currentPos + compressedNum - 1) + compressedNum = finalpos - currentPos; + int b = bitLength[selector]; + int max = 1 << b; + int i = 0; + for (; i < compressedNum; i++) + if (Util.smallerorequalthan(max , in[currentPos + i])) + continue mainloop; + currentPos += compressedNum; + ++tmpoutpos; + continue outer; + } + final int selector = 8; + if (in[currentPos] >= 1 << bitLength[selector]) + throw new RuntimeException("Too big a number"); + tmpoutpos++; + currentPos++; - /** - * Uncompressed data from an input array into an output array - * - * @param in input array (in compressed form) - * @param tmpinpos starting location in the compressed input array - * @param inlength how much data we wish the read (in 32-bit words) - * @param out output array (in decompressed form) - * @param currentPos current position in the output array - * @param outlength available data in the output array - */ - public static void uncompress(int[] in, int tmpinpos, int inlength, - int[] out, int currentPos, int outlength) { - int finallength = currentPos + outlength; + } + return tmpoutpos; + } - while (currentPos < finallength) { - int val = in[tmpinpos++]; - int header = val >>> 28; - switch (header) { - case 0: { // number : 28, bitwidth : 1 - final int howmany = finallength - currentPos < 28 ? finallength - - currentPos - : 28; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (k + 4)) >>> 31; - } - break; - } - case 1: { // number : 14, bitwidth : 2 - final int howmany = finallength - currentPos < 14 ? finallength - - currentPos - : 14; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (2 * k + 4)) >>> 30; - } - break; - } - case 2: { // number : 9, bitwidth : 3 - final int howmany = finallength - currentPos < 9 ? finallength - - currentPos - : 9; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (3 * k + 5)) >>> 29; - } - break; - } - case 3: { // number : 7, bitwidth : 4 - final int howmany = finallength - currentPos < 7 ? finallength - - currentPos - : 7; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (4 * k + 4)) >>> 28; - } - break; - } - case 4: { // number : 5, bitwidth : 5 - final int howmany = finallength - currentPos < 5 ? finallength - - currentPos - : 5; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (5 * k + 7)) >>> 27; - } - break; - } - case 5: { // number : 4, bitwidth : 7 - final int howmany = finallength - currentPos < 4 ? finallength - - currentPos - : 4; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (7 * k + 4)) >>> 25; - } - break; - } - case 6: { // number : 3, bitwidth : 9 - final int howmany = finallength - currentPos < 3 ? finallength - - currentPos - : 3; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (9 * k + 5)) >>> 23; - } - break; - } - case 7: { // number : 2, bitwidth : 14 - final int howmany = finallength - currentPos < 2 ? finallength - - currentPos - : 2; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (14 * k + 4)) >>> 18; - } - break; - } - case 8: { // number : 1, bitwidth : 28 - out[currentPos++] = (val << 4) >>> 4; - break; - } - default: { - throw new RuntimeException("shouldn't happen"); - } - } - } + /** + * Compress an integer array using Simple9 + * + * + * @param in + * array to compress + * @param currentPos + * where to start reading + * @param inlength + * how many integers to read + * @param out + * output array + * @param tmpoutpos + * location in the output array + * @return the number of 32-bit words written (in compressed form) + */ + public static int compress(int[] in, int currentPos, int inlength, int out[], int tmpoutpos) { + int origtmpoutpos = tmpoutpos; + int finalpos = currentPos + inlength; + outer: while (currentPos < finalpos) { + mainloop: for (int selector = 0; selector < 8; selector++) { + int res = 0; + int compressedNum = codeNum[selector]; + if (finalpos <= currentPos + compressedNum - 1) + compressedNum = finalpos - currentPos; + int b = bitLength[selector]; + int max = 1 << b; + int i = 0; + for (; i < compressedNum; i++) { + if (Util.smallerorequalthan(max, in[currentPos + i])) + continue mainloop; + res = (res << b) + in[currentPos + i]; + } + if (compressedNum != codeNum[selector]) + res <<= (codeNum[selector] - compressedNum) * b; + res |= selector << 28; + out[tmpoutpos++] = res; + currentPos += compressedNum; + continue outer; + } + final int selector = 8; + if (in[currentPos] >= 1 << bitLength[selector]) + throw new RuntimeException("Too big a number"); + out[tmpoutpos++] = in[currentPos++] | (selector << 28); + } + return tmpoutpos - origtmpoutpos; + } - } + /** + * Uncompressed data from an input array into an output array + * + * @param in + * input array (in compressed form) + * @param tmpinpos + * starting location in the compressed input array + * @param inlength + * how much data we wish the read (in 32-bit words) + * @param out + * output array (in decompressed form) + * @param currentPos + * current position in the output array + * @param outlength + * available data in the output array + */ + public static void uncompress(int[] in, int tmpinpos, int inlength, int[] out, int currentPos, int outlength) { + int finallength = currentPos + outlength; - private final static int bitLength[] = { 1, 2, 3, 4, 5, 7, 9, 14, 28 }; + while (currentPos < finallength) { + int val = in[tmpinpos++]; + int header = val >>> 28; + switch (header) { + case 0: { // number : 28, bitwidth : 1 + final int howmany = finallength - currentPos < 28 ? finallength - currentPos : 28; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (k + 4)) >>> 31; + } + break; + } + case 1: { // number : 14, bitwidth : 2 + final int howmany = finallength - currentPos < 14 ? finallength - currentPos : 14; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (2 * k + 4)) >>> 30; + } + break; + } + case 2: { // number : 9, bitwidth : 3 + final int howmany = finallength - currentPos < 9 ? finallength - currentPos : 9; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (3 * k + 5)) >>> 29; + } + break; + } + case 3: { // number : 7, bitwidth : 4 + final int howmany = finallength - currentPos < 7 ? finallength - currentPos : 7; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (4 * k + 4)) >>> 28; + } + break; + } + case 4: { // number : 5, bitwidth : 5 + final int howmany = finallength - currentPos < 5 ? finallength - currentPos : 5; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (5 * k + 7)) >>> 27; + } + break; + } + case 5: { // number : 4, bitwidth : 7 + final int howmany = finallength - currentPos < 4 ? finallength - currentPos : 4; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (7 * k + 4)) >>> 25; + } + break; + } + case 6: { // number : 3, bitwidth : 9 + final int howmany = finallength - currentPos < 3 ? finallength - currentPos : 3; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (9 * k + 5)) >>> 23; + } + break; + } + case 7: { // number : 2, bitwidth : 14 + final int howmany = finallength - currentPos < 2 ? finallength - currentPos : 2; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (14 * k + 4)) >>> 18; + } + break; + } + case 8: { // number : 1, bitwidth : 28 + out[currentPos++] = (val << 4) >>> 4; + break; + } + default: { + throw new RuntimeException("shouldn't happen"); + } + } + } - private final static int codeNum[] = { 28, 14, 9, 7, 5, 4, 3, 2, 1 }; + } + + private final static int bitLength[] = { 1, 2, 3, 4, 5, 7, 9, 14, 28 }; + + private final static int codeNum[] = { 28, 14, 9, 7, 5, 4, 3, 2, 1 }; } diff --git a/src/main/java/me/lemire/integercompression/Simple16.java b/src/main/java/me/lemire/integercompression/Simple16.java index 9562c3a..e0f9d5a 100644 --- a/src/main/java/me/lemire/integercompression/Simple16.java +++ b/src/main/java/me/lemire/integercompression/Simple16.java @@ -1,8 +1,5 @@ package me.lemire.integercompression; - - - /** * This is an implementation of the popular Simple16 scheme. It is limited to * 28-bit integers (between 0 and 2^28-1). @@ -14,190 +11,175 @@ * Adapted by D. Lemire from the Apache Lucene project. *

    */ -public final class Simple16 implements IntegerCODEC,SkippableIntegerCODEC { - - public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int out[], - IntWrapper outpos) { - int i_inpos = inpos.get(); - int i_outpos = outpos.get(); - final int finalin = i_inpos + inlength; - while (i_inpos < finalin) { - int inoffset = compressblock(out, i_outpos++, in, i_inpos, inlength); - if (inoffset == -1) - throw new RuntimeException("Too big a number"); - i_inpos += inoffset; - inlength -= inoffset; - } - inpos.set(i_inpos); - outpos.set(i_outpos); - } - - /** - * Compress an integer array using Simple16 - * - * @param out - * the compressed output - * @param outOffset - * the offset of the output in the number of integers - * @param in - * the integer input array - * @param inOffset - * the offset of the input in the number of integers - * @param n - * the number of elements to be compressed - * @return the number of compressed integers - */ - public static final int compressblock(int[] out, int outOffset, int[] in, - int inOffset, int n) { - int numIdx, j, num, bits; - for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { - out[outOffset] = numIdx << S16_BITSSIZE; - num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; - - for (j = 0, bits = 0; (j < num) - && (in[inOffset + j] < SHIFTED_S16_BITS[numIdx][j]);) { - out[outOffset] |= (in[inOffset + j] << bits); - bits += S16_BITS[numIdx][j]; - j++; - } - - if (j == num) { - return num; - } - } - - return -1; - } - - - /** - * Decompress an integer array using Simple16 - * - * @param out - * the decompressed output - * @param outOffset - * the offset of the output in the number of integers - * @param in - * the compressed input array - * @param inOffset - * the offset of the input in the number of integers - * @param n - * the number of elements to be compressed - * @return the number of processed integers - */ - public static final int decompressblock(int[] out, int outOffset, int[] in, - int inOffset, int n) { - int numIdx, j = 0, bits = 0; - numIdx = in[inOffset] >>> S16_BITSSIZE; - int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; - for (j = 0, bits = 0; j < num; j++) { - out[outOffset + j] = (in[inOffset] >>> bits) - & (0xffffffff >>> (32 - S16_BITS[numIdx][j])); - bits += S16_BITS[numIdx][j]; - } - return num; - } - - - @Override - public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos,int num) { - int i_inpos = inpos.get(); - int i_outpos = outpos.get(); - while (num > 0) { - final int howmany = decompressblock(out, i_outpos, in, i_inpos, num); - num -= howmany; - i_outpos += howmany; - i_inpos++; - } - inpos.set(i_inpos); - outpos.set(i_outpos); - } - - /** - * Uncompress data from an array to another array. - * - * Both inpos and outpos parameters are modified to indicate new positions - * after read/write. - * - * @param in - * array containing data in compressed form - * @param tmpinpos - * where to start reading in the array - * @param inlength - * length of the compressed data (ignored by some schemes) - * @param out - * array where to write the compressed output - * @param currentPos - * where to write the compressed output in out - * @param outlength - * number of integers we want to decode - */ - public static void uncompress(int[] in, int tmpinpos, int inlength, - int[] out, int currentPos, int outlength) { - final int finalpos = tmpinpos + inlength; - while (tmpinpos < finalpos) { - final int howmany = decompressblock(out, currentPos, in, tmpinpos, - outlength); - outlength -= howmany; - currentPos += howmany; - tmpinpos += 1; - } - - } - - private static int[][] shiftme(int[][] x) { - int[][] answer = new int[x.length][]; - for (int k = 0; k < x.length; ++k) { - answer[k] = new int[x[k].length]; - for (int z = 0; z < answer[k].length; ++z) - answer[k][z] = 1 << x[k][z]; - } - return answer; - } - - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - if (inlength == 0) - return; - out[outpos.get()] = inlength; - outpos.increment(); - headlessCompress(in, inpos, inlength, out, outpos); - } - - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - if (inlength == 0) - return; - final int outlength = in[inpos.get()]; - inpos.increment(); - headlessUncompress(in, inpos, inlength, out, outpos, outlength); - - } - @Override - public String toString() { - return this.getClass().getSimpleName(); - } - - private static final int S16_NUMSIZE = 16; - private static final int S16_BITSSIZE = 28; - // the possible number of bits used to represent one integer - private static final int[] S16_NUM = { 28, 21, 21, 21, 14, 9, 8, 7, 6, 6, - 5, 5, 4, 3, 2, 1 }; - // the corresponding number of elements for each value of the number of bits - private static final int[][] S16_BITS = { - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1 }, - { 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, - { 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1 }, - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2 }, - { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, - { 4, 3, 3, 3, 3, 3, 3, 3, 3 }, { 3, 4, 4, 4, 4, 3, 3, 3 }, - { 4, 4, 4, 4, 4, 4, 4 }, { 5, 5, 5, 5, 4, 4 }, - { 4, 4, 5, 5, 5, 5 }, { 6, 6, 6, 5, 5 }, { 5, 5, 6, 6, 6 }, - { 7, 7, 7, 7 }, { 10, 9, 9, }, { 14, 14 }, { 28 } }; - private static final int[][] SHIFTED_S16_BITS = shiftme(S16_BITS); +public final class Simple16 implements IntegerCODEC, SkippableIntegerCODEC { + + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int out[], IntWrapper outpos) { + int i_inpos = inpos.get(); + int i_outpos = outpos.get(); + final int finalin = i_inpos + inlength; + while (i_inpos < finalin) { + int inoffset = compressblock(out, i_outpos++, in, i_inpos, inlength); + if (inoffset == -1) + throw new RuntimeException("Too big a number"); + i_inpos += inoffset; + inlength -= inoffset; + } + inpos.set(i_inpos); + outpos.set(i_outpos); + } + + /** + * Compress an integer array using Simple16 + * + * @param out + * the compressed output + * @param outOffset + * the offset of the output in the number of integers + * @param in + * the integer input array + * @param inOffset + * the offset of the input in the number of integers + * @param n + * the number of elements to be compressed + * @return the number of compressed integers + */ + public static final int compressblock(int[] out, int outOffset, int[] in, int inOffset, int n) { + int numIdx, j, num, bits; + for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { + out[outOffset] = numIdx << S16_BITSSIZE; + num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; + + for (j = 0, bits = 0; (j < num) && (in[inOffset + j] < SHIFTED_S16_BITS[numIdx][j]);) { + out[outOffset] |= (in[inOffset + j] << bits); + bits += S16_BITS[numIdx][j]; + j++; + } + + if (j == num) { + return num; + } + } + + return -1; + } + + /** + * Decompress an integer array using Simple16 + * + * @param out + * the decompressed output + * @param outOffset + * the offset of the output in the number of integers + * @param in + * the compressed input array + * @param inOffset + * the offset of the input in the number of integers + * @param n + * the number of elements to be compressed + * @return the number of processed integers + */ + public static final int decompressblock(int[] out, int outOffset, int[] in, int inOffset, int n) { + int numIdx, j = 0, bits = 0; + numIdx = in[inOffset] >>> S16_BITSSIZE; + int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; + for (j = 0, bits = 0; j < num; j++) { + out[outOffset + j] = (in[inOffset] >>> bits) & (0xffffffff >>> (32 - S16_BITS[numIdx][j])); + bits += S16_BITS[numIdx][j]; + } + return num; + } + + @Override + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num) { + int i_inpos = inpos.get(); + int i_outpos = outpos.get(); + while (num > 0) { + final int howmany = decompressblock(out, i_outpos, in, i_inpos, num); + num -= howmany; + i_outpos += howmany; + i_inpos++; + } + inpos.set(i_inpos); + outpos.set(i_outpos); + } + + /** + * Uncompress data from an array to another array. + * + * Both inpos and outpos parameters are modified to indicate new positions + * after read/write. + * + * @param in + * array containing data in compressed form + * @param tmpinpos + * where to start reading in the array + * @param inlength + * length of the compressed data (ignored by some schemes) + * @param out + * array where to write the compressed output + * @param currentPos + * where to write the compressed output in out + * @param outlength + * number of integers we want to decode + */ + public static void uncompress(int[] in, int tmpinpos, int inlength, int[] out, int currentPos, int outlength) { + final int finalpos = tmpinpos + inlength; + while (tmpinpos < finalpos) { + final int howmany = decompressblock(out, currentPos, in, tmpinpos, outlength); + outlength -= howmany; + currentPos += howmany; + tmpinpos += 1; + } + + } + + private static int[][] shiftme(int[][] x) { + int[][] answer = new int[x.length][]; + for (int k = 0; k < x.length; ++k) { + answer[k] = new int[x[k].length]; + for (int z = 0; z < answer[k].length; ++z) + answer[k][z] = 1 << x[k][z]; + } + return answer; + } + + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + if (inlength == 0) + return; + out[outpos.get()] = inlength; + outpos.increment(); + headlessCompress(in, inpos, inlength, out, outpos); + } + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + if (inlength == 0) + return; + final int outlength = in[inpos.get()]; + inpos.increment(); + headlessUncompress(in, inpos, inlength, out, outpos, outlength); + + } + + @Override + public String toString() { + return this.getClass().getSimpleName(); + } + + private static final int S16_NUMSIZE = 16; + private static final int S16_BITSSIZE = 28; + // the possible number of bits used to represent one integer + private static final int[] S16_NUM = { 28, 21, 21, 21, 14, 9, 8, 7, 6, 6, 5, 5, 4, 3, 2, 1 }; + // the corresponding number of elements for each value of the number of bits + private static final int[][] S16_BITS = { + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2 }, + { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, { 4, 3, 3, 3, 3, 3, 3, 3, 3 }, { 3, 4, 4, 4, 4, 3, 3, 3 }, + { 4, 4, 4, 4, 4, 4, 4 }, { 5, 5, 5, 5, 4, 4 }, { 4, 4, 5, 5, 5, 5 }, { 6, 6, 6, 5, 5 }, { 5, 5, 6, 6, 6 }, + { 7, 7, 7, 7 }, { 10, 9, 9, }, { 14, 14 }, { 28 } }; + private static final int[][] SHIFTED_S16_BITS = shiftme(S16_BITS); } \ No newline at end of file diff --git a/src/main/java/me/lemire/integercompression/Simple9.java b/src/main/java/me/lemire/integercompression/Simple9.java index 5703b04..032489d 100644 --- a/src/main/java/me/lemire/integercompression/Simple9.java +++ b/src/main/java/me/lemire/integercompression/Simple9.java @@ -7,10 +7,9 @@ package me.lemire.integercompression; - /** - * This is an implementation of the popular Simple9 scheme. - * It is limited to 28-bit integers (between 0 and 2^28-1). + * This is an implementation of the popular Simple9 scheme. It is limited to + * 28-bit integers (between 0 and 2^28-1). * * Note that this does not use differential coding: if you are working on sorted * lists, you must compute the deltas separately. @@ -19,296 +18,282 @@ * */ public final class Simple9 implements IntegerCODEC, SkippableIntegerCODEC { - @Override - public void headlessCompress(int[] in, IntWrapper inpos, int inlength, - int out[], IntWrapper outpos) { - int tmpoutpos = outpos.get(); - int currentPos = inpos.get(); - final int finalin = currentPos + inlength; - outer: while (currentPos < finalin - 28) { - mainloop: for (int selector = 0; selector < 8; selector++) { - int res = 0; - int compressedNum = codeNum[selector]; - int b = bitLength[selector]; - int max = 1 << b; - int i = 0; - for (; i < compressedNum; i++) { - if (max <= in[currentPos + i]) - continue mainloop; - res = (res << b) + in[currentPos + i]; - } - res |= selector << 28; - out[tmpoutpos++] = res; - currentPos += compressedNum; - continue outer; - } - final int selector = 8; - if (in[currentPos] >= 1 << bitLength[selector]) - throw new RuntimeException("Too big a number"); - out[tmpoutpos++] = in[currentPos++] | (selector << 28); - } - outer: while (currentPos < finalin) { - mainloop: for (int selector = 0; selector < 8; selector++) { - int res = 0; - int compressedNum = codeNum[selector]; - if (finalin <= currentPos + compressedNum - 1) - compressedNum = finalin - currentPos; - int b = bitLength[selector]; - int max = 1 << b; - int i = 0; - for (; i < compressedNum; i++) { - if (max <= in[currentPos + i]) - continue mainloop; - res = (res << b) + in[currentPos + i]; - } - if (compressedNum != codeNum[selector]) - res <<= (codeNum[selector] - compressedNum) - * b; - res |= selector << 28; - out[tmpoutpos++] = res; - currentPos += compressedNum; - continue outer; - } - final int selector = 8; - if (in[currentPos] >= 1 << bitLength[selector]) - throw new RuntimeException("Too big a number"); - out[tmpoutpos++] = in[currentPos++] | (selector << 28); - } - inpos.set(currentPos); - outpos.set(tmpoutpos); - } + @Override + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int out[], IntWrapper outpos) { + int tmpoutpos = outpos.get(); + int currentPos = inpos.get(); + final int finalin = currentPos + inlength; + outer: while (currentPos < finalin - 28) { + mainloop: for (int selector = 0; selector < 8; selector++) { + + int res = 0; + int compressedNum = codeNum[selector]; + int b = bitLength[selector]; + int max = 1 << b; + int i = 0; + for (; i < compressedNum; i++) { + if (max <= in[currentPos + i]) + continue mainloop; + res = (res << b) + in[currentPos + i]; + } + res |= selector << 28; + out[tmpoutpos++] = res; + currentPos += compressedNum; + continue outer; + } + final int selector = 8; + if (in[currentPos] >= 1 << bitLength[selector]) + throw new RuntimeException("Too big a number"); + out[tmpoutpos++] = in[currentPos++] | (selector << 28); + } + outer: while (currentPos < finalin) { + mainloop: for (int selector = 0; selector < 8; selector++) { + int res = 0; + int compressedNum = codeNum[selector]; + if (finalin <= currentPos + compressedNum - 1) + compressedNum = finalin - currentPos; + int b = bitLength[selector]; + int max = 1 << b; + int i = 0; + for (; i < compressedNum; i++) { + if (max <= in[currentPos + i]) + continue mainloop; + res = (res << b) + in[currentPos + i]; + } + + if (compressedNum != codeNum[selector]) + res <<= (codeNum[selector] - compressedNum) * b; + res |= selector << 28; + out[tmpoutpos++] = res; + currentPos += compressedNum; + continue outer; + } + final int selector = 8; + if (in[currentPos] >= 1 << bitLength[selector]) + throw new RuntimeException("Too big a number"); + out[tmpoutpos++] = in[currentPos++] | (selector << 28); + } + inpos.set(currentPos); + outpos.set(tmpoutpos); + } + + @Override + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, + int outlength) { + int currentPos = outpos.get(); + int tmpinpos = inpos.get(); + final int finalout = currentPos + outlength; + while (currentPos < finalout - 28) { + int val = in[tmpinpos++]; + int header = val >>> 28; + switch (header) { + case 0: { // number : 28, bitwidth : 1 + out[currentPos++] = (val << 4) >>> 31; + out[currentPos++] = (val << 5) >>> 31; + out[currentPos++] = (val << 6) >>> 31; + out[currentPos++] = (val << 7) >>> 31; + out[currentPos++] = (val << 8) >>> 31; + out[currentPos++] = (val << 9) >>> 31; + out[currentPos++] = (val << 10) >>> 31; + out[currentPos++] = (val << 11) >>> 31; + out[currentPos++] = (val << 12) >>> 31; + out[currentPos++] = (val << 13) >>> 31; // 10 + out[currentPos++] = (val << 14) >>> 31; + out[currentPos++] = (val << 15) >>> 31; + out[currentPos++] = (val << 16) >>> 31; + out[currentPos++] = (val << 17) >>> 31; + out[currentPos++] = (val << 18) >>> 31; + out[currentPos++] = (val << 19) >>> 31; + out[currentPos++] = (val << 20) >>> 31; + out[currentPos++] = (val << 21) >>> 31; + out[currentPos++] = (val << 22) >>> 31; + out[currentPos++] = (val << 23) >>> 31; // 20 + out[currentPos++] = (val << 24) >>> 31; + out[currentPos++] = (val << 25) >>> 31; + out[currentPos++] = (val << 26) >>> 31; + out[currentPos++] = (val << 27) >>> 31; + out[currentPos++] = (val << 28) >>> 31; + out[currentPos++] = (val << 29) >>> 31; + out[currentPos++] = (val << 30) >>> 31; + out[currentPos++] = (val << 31) >>> 31; + break; + } + case 1: { // number : 14, bitwidth : 2 + out[currentPos++] = (val << 4) >>> 30; + out[currentPos++] = (val << 6) >>> 30; + out[currentPos++] = (val << 8) >>> 30; + out[currentPos++] = (val << 10) >>> 30; + out[currentPos++] = (val << 12) >>> 30; + out[currentPos++] = (val << 14) >>> 30; + out[currentPos++] = (val << 16) >>> 30; + out[currentPos++] = (val << 18) >>> 30; + out[currentPos++] = (val << 20) >>> 30; + out[currentPos++] = (val << 22) >>> 30; // 10 + out[currentPos++] = (val << 24) >>> 30; + out[currentPos++] = (val << 26) >>> 30; + out[currentPos++] = (val << 28) >>> 30; + out[currentPos++] = (val << 30) >>> 30; + break; + } + case 2: { // number : 9, bitwidth : 3 + out[currentPos++] = (val << 5) >>> 29; + out[currentPos++] = (val << 8) >>> 29; + out[currentPos++] = (val << 11) >>> 29; + out[currentPos++] = (val << 14) >>> 29; + out[currentPos++] = (val << 17) >>> 29; + out[currentPos++] = (val << 20) >>> 29; + out[currentPos++] = (val << 23) >>> 29; + out[currentPos++] = (val << 26) >>> 29; + out[currentPos++] = (val << 29) >>> 29; + break; + } + case 3: { // number : 7, bitwidth : 4 + out[currentPos++] = (val << 4) >>> 28; + out[currentPos++] = (val << 8) >>> 28; + out[currentPos++] = (val << 12) >>> 28; + out[currentPos++] = (val << 16) >>> 28; + out[currentPos++] = (val << 20) >>> 28; + out[currentPos++] = (val << 24) >>> 28; + out[currentPos++] = (val << 28) >>> 28; + break; + } + case 4: { // number : 5, bitwidth : 5 + out[currentPos++] = (val << 7) >>> 27; + out[currentPos++] = (val << 12) >>> 27; + out[currentPos++] = (val << 17) >>> 27; + out[currentPos++] = (val << 22) >>> 27; + out[currentPos++] = (val << 27) >>> 27; + break; + } + case 5: { // number : 4, bitwidth : 7 + out[currentPos++] = (val << 4) >>> 25; + out[currentPos++] = (val << 11) >>> 25; + out[currentPos++] = (val << 18) >>> 25; + out[currentPos++] = (val << 25) >>> 25; + break; + } + case 6: { // number : 3, bitwidth : 9 + out[currentPos++] = (val << 5) >>> 23; + out[currentPos++] = (val << 14) >>> 23; + out[currentPos++] = (val << 23) >>> 23; + break; + } + case 7: { // number : 2, bitwidth : 14 + out[currentPos++] = (val << 4) >>> 18; + out[currentPos++] = (val << 18) >>> 18; + break; + } + case 8: { // number : 1, bitwidth : 28 + out[currentPos++] = (val << 4) >>> 4; + break; + } + default: { + throw new RuntimeException("shouldn't happen: limited to 28-bit integers"); + } + } + } + while (currentPos < finalout) { + int val = in[tmpinpos++]; + int header = val >>> 28; + switch (header) { + case 0: { // number : 28, bitwidth : 1 + final int howmany = finalout - currentPos; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (k + 4)) >>> 31; + } + break; + } + case 1: { // number : 14, bitwidth : 2 + final int howmany = finalout - currentPos < 14 ? finalout - currentPos : 14; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (2 * k + 4)) >>> 30; + } + break; + } + case 2: { // number : 9, bitwidth : 3 + final int howmany = finalout - currentPos < 9 ? finalout - currentPos : 9; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (3 * k + 5)) >>> 29; + } + break; + } + case 3: { // number : 7, bitwidth : 4 + final int howmany = finalout - currentPos < 7 ? finalout - currentPos : 7; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (4 * k + 4)) >>> 28; + } + break; + } + case 4: { // number : 5, bitwidth : 5 + final int howmany = finalout - currentPos < 5 ? finalout - currentPos : 5; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (5 * k + 7)) >>> 27; + } + break; + } + case 5: { // number : 4, bitwidth : 7 + final int howmany = finalout - currentPos < 4 ? finalout - currentPos : 4; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (7 * k + 4)) >>> 25; + } + break; + } + case 6: { // number : 3, bitwidth : 9 + final int howmany = finalout - currentPos < 3 ? finalout - currentPos : 3; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (9 * k + 5)) >>> 23; + } + break; + } + case 7: { // number : 2, bitwidth : 14 + final int howmany = finalout - currentPos < 2 ? finalout - currentPos : 2; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (14 * k + 4)) >>> 18; + } + break; + } + case 8: { // number : 1, bitwidth : 28 + out[currentPos++] = (val << 4) >>> 4; + break; + } + default: { + throw new RuntimeException("shouldn't happen"); + } + } + } + outpos.set(currentPos); + inpos.set(tmpinpos); + + } - @Override - public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, - int[] out, IntWrapper outpos, int outlength) { - int currentPos = outpos.get(); - int tmpinpos = inpos.get(); - final int finalout = currentPos + outlength; - while (currentPos < finalout - 28) { - int val = in[tmpinpos++]; - int header = val >>> 28; - switch (header) { - case 0: { // number : 28, bitwidth : 1 - out[currentPos++] = (val << 4) >>> 31; - out[currentPos++] = (val << 5) >>> 31; - out[currentPos++] = (val << 6) >>> 31; - out[currentPos++] = (val << 7) >>> 31; - out[currentPos++] = (val << 8) >>> 31; - out[currentPos++] = (val << 9) >>> 31; - out[currentPos++] = (val << 10) >>> 31; - out[currentPos++] = (val << 11) >>> 31; - out[currentPos++] = (val << 12) >>> 31; - out[currentPos++] = (val << 13) >>> 31; // 10 - out[currentPos++] = (val << 14) >>> 31; - out[currentPos++] = (val << 15) >>> 31; - out[currentPos++] = (val << 16) >>> 31; - out[currentPos++] = (val << 17) >>> 31; - out[currentPos++] = (val << 18) >>> 31; - out[currentPos++] = (val << 19) >>> 31; - out[currentPos++] = (val << 20) >>> 31; - out[currentPos++] = (val << 21) >>> 31; - out[currentPos++] = (val << 22) >>> 31; - out[currentPos++] = (val << 23) >>> 31; // 20 - out[currentPos++] = (val << 24) >>> 31; - out[currentPos++] = (val << 25) >>> 31; - out[currentPos++] = (val << 26) >>> 31; - out[currentPos++] = (val << 27) >>> 31; - out[currentPos++] = (val << 28) >>> 31; - out[currentPos++] = (val << 29) >>> 31; - out[currentPos++] = (val << 30) >>> 31; - out[currentPos++] = (val << 31) >>> 31; - break; - } - case 1: { // number : 14, bitwidth : 2 - out[currentPos++] = (val << 4) >>> 30; - out[currentPos++] = (val << 6) >>> 30; - out[currentPos++] = (val << 8) >>> 30; - out[currentPos++] = (val << 10) >>> 30; - out[currentPos++] = (val << 12) >>> 30; - out[currentPos++] = (val << 14) >>> 30; - out[currentPos++] = (val << 16) >>> 30; - out[currentPos++] = (val << 18) >>> 30; - out[currentPos++] = (val << 20) >>> 30; - out[currentPos++] = (val << 22) >>> 30; // 10 - out[currentPos++] = (val << 24) >>> 30; - out[currentPos++] = (val << 26) >>> 30; - out[currentPos++] = (val << 28) >>> 30; - out[currentPos++] = (val << 30) >>> 30; - break; - } - case 2: { // number : 9, bitwidth : 3 - out[currentPos++] = (val << 5) >>> 29; - out[currentPos++] = (val << 8) >>> 29; - out[currentPos++] = (val << 11) >>> 29; - out[currentPos++] = (val << 14) >>> 29; - out[currentPos++] = (val << 17) >>> 29; - out[currentPos++] = (val << 20) >>> 29; - out[currentPos++] = (val << 23) >>> 29; - out[currentPos++] = (val << 26) >>> 29; - out[currentPos++] = (val << 29) >>> 29; - break; - } - case 3: { // number : 7, bitwidth : 4 - out[currentPos++] = (val << 4) >>> 28; - out[currentPos++] = (val << 8) >>> 28; - out[currentPos++] = (val << 12) >>> 28; - out[currentPos++] = (val << 16) >>> 28; - out[currentPos++] = (val << 20) >>> 28; - out[currentPos++] = (val << 24) >>> 28; - out[currentPos++] = (val << 28) >>> 28; - break; - } - case 4: { // number : 5, bitwidth : 5 - out[currentPos++] = (val << 7) >>> 27; - out[currentPos++] = (val << 12) >>> 27; - out[currentPos++] = (val << 17) >>> 27; - out[currentPos++] = (val << 22) >>> 27; - out[currentPos++] = (val << 27) >>> 27; - break; - } - case 5: { // number : 4, bitwidth : 7 - out[currentPos++] = (val << 4) >>> 25; - out[currentPos++] = (val << 11) >>> 25; - out[currentPos++] = (val << 18) >>> 25; - out[currentPos++] = (val << 25) >>> 25; - break; - } - case 6: { // number : 3, bitwidth : 9 - out[currentPos++] = (val << 5) >>> 23; - out[currentPos++] = (val << 14) >>> 23; - out[currentPos++] = (val << 23) >>> 23; - break; - } - case 7: { // number : 2, bitwidth : 14 - out[currentPos++] = (val << 4) >>> 18; - out[currentPos++] = (val << 18) >>> 18; - break; - } - case 8: { // number : 1, bitwidth : 28 - out[currentPos++] = (val << 4) >>> 4; - break; - } - default: { - throw new RuntimeException("shouldn't happen: limited to 28-bit integers"); - } - } - } - while (currentPos < finalout) { - int val = in[tmpinpos++]; - int header = val >>> 28; - switch (header) { - case 0: { // number : 28, bitwidth : 1 - final int howmany = finalout - currentPos; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (k + 4)) >>> 31; - } - break; - } - case 1: { // number : 14, bitwidth : 2 - final int howmany = finalout - currentPos < 14 ? finalout - - currentPos - : 14; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (2 * k + 4)) >>> 30; - } - break; - } - case 2: { // number : 9, bitwidth : 3 - final int howmany = finalout - currentPos < 9 ? finalout - - currentPos - : 9; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (3 * k + 5)) >>> 29; - } - break; - } - case 3: { // number : 7, bitwidth : 4 - final int howmany = finalout - currentPos < 7 ? finalout - - currentPos - : 7; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (4 * k + 4)) >>> 28; - } - break; - } - case 4: { // number : 5, bitwidth : 5 - final int howmany = finalout - currentPos < 5 ? finalout - - currentPos - : 5; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (5 * k + 7)) >>> 27; - } - break; - } - case 5: { // number : 4, bitwidth : 7 - final int howmany = finalout - currentPos < 4 ? finalout - - currentPos - : 4; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (7 * k + 4)) >>> 25; - } - break; - } - case 6: { // number : 3, bitwidth : 9 - final int howmany = finalout - currentPos < 3 ? finalout - - currentPos - : 3; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (9 * k + 5)) >>> 23; - } - break; - } - case 7: { // number : 2, bitwidth : 14 - final int howmany = finalout - currentPos < 2 ? finalout - - currentPos - : 2; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (14 * k + 4)) >>> 18; - } - break; - } - case 8: { // number : 1, bitwidth : 28 - out[currentPos++] = (val << 4) >>> 4; - break; - } - default: { - throw new RuntimeException("shouldn't happen"); - } - } - } - outpos.set(currentPos); - inpos.set(tmpinpos); + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + if (inlength == 0) + return; + out[outpos.get()] = inlength; + outpos.increment(); + headlessCompress(in, inpos, inlength, out, outpos); + } - } - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - if (inlength == 0) - return; - out[outpos.get()] = inlength; - outpos.increment(); - headlessCompress(in, inpos, inlength, out, outpos); - } + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + if (inlength == 0) + return; + final int outlength = in[inpos.get()]; + inpos.increment(); + headlessUncompress(in, inpos, inlength, out, outpos, outlength); - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, - IntWrapper outpos) { - if (inlength == 0) - return; - final int outlength = in[inpos.get()]; - inpos.increment(); - headlessUncompress(in, inpos, inlength, out, outpos, outlength); + } - } - private final static int bitLength[] = { 1, 2, 3, 4, 5, 7, 9, 14, 28 }; + private final static int bitLength[] = { 1, 2, 3, 4, 5, 7, 9, 14, 28 }; - private final static int codeNum[] = { 28, 14, 9, 7, 5, 4, 3, 2, 1 }; + private final static int codeNum[] = { 28, 14, 9, 7, 5, 4, 3, 2, 1 }; - @Override - public String toString() { - return this.getClass().getSimpleName(); - } + @Override + public String toString() { + return this.getClass().getSimpleName(); + } } diff --git a/src/main/java/me/lemire/integercompression/Util.java b/src/main/java/me/lemire/integercompression/Util.java index 70e46b7..346e3b2 100644 --- a/src/main/java/me/lemire/integercompression/Util.java +++ b/src/main/java/me/lemire/integercompression/Util.java @@ -13,7 +13,15 @@ * */ public final class Util { - /** + + + + // check whether x is small than y as unsigned ints (supported by Java 8 natively); + protected static final boolean smallerorequalthan(int x, int y) { + return (x + Integer.MIN_VALUE) <= (y + Integer.MIN_VALUE); + } + + /** * Compute the maximum of the integer logarithms (ceil(log(x+1)) of a range * of value * diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java b/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java index 847a28a..c5fee69 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java @@ -15,6 +15,7 @@ import me.lemire.integercompression.DeltaZigzagVariableByte; import me.lemire.integercompression.FastPFOR; import me.lemire.integercompression.FastPFOR128; +import me.lemire.integercompression.GroupSimple9; import me.lemire.integercompression.IntWrapper; import me.lemire.integercompression.IntegerCODEC; import me.lemire.integercompression.JustCopy; @@ -24,6 +25,7 @@ import me.lemire.integercompression.OptPFD; import me.lemire.integercompression.OptPFDS16; import me.lemire.integercompression.OptPFDS9; +import me.lemire.integercompression.Simple16; import me.lemire.integercompression.Simple9; import me.lemire.integercompression.VariableByte; import me.lemire.integercompression.differential.Delta; @@ -153,7 +155,7 @@ private static void testCodec(PrintWriter csvLog, int sparsity, + data[k][m] + " found " + decompressBuffer[m] - + " at " + m); + + " at " + m + " out of " + outpos.get()); } } } @@ -487,7 +489,6 @@ private static void test(PrintWriter csvLog, int N, int nbr, int repeat) { int[][] data = generateTestData(cdg, N, nbr, sparsity); System.out.println("# generating random data... ok."); - testCodec(csvLog, sparsity, new Composition( new FastPFOR128(), new VariableByte()), data, repeat, false); @@ -635,6 +636,14 @@ private static void test(PrintWriter csvLog, int N, int nbr, int repeat) { System.out.println(); + testCodec(csvLog, sparsity, new Simple16(), data, + repeat, false); + testCodec(csvLog, sparsity, new Simple16(), data, + repeat, false); + testCodec(csvLog, sparsity, new Simple16(), data, + repeat, true); + System.out.println(); + testCodec(csvLog, sparsity, new Simple9(), data, repeat, false); testCodec(csvLog, sparsity, new Simple9(), data, @@ -643,6 +652,14 @@ private static void test(PrintWriter csvLog, int N, int nbr, int repeat) { repeat, true); System.out.println(); + testCodec(csvLog, sparsity, new GroupSimple9(), data, + repeat, false); + testCodec(csvLog, sparsity, new GroupSimple9(), data, + repeat, false); + testCodec(csvLog, sparsity, new GroupSimple9(), data, + repeat, true); + System.out.println(); + { IntegerCODEC c = new Composition( new XorBinaryPacking(), diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 1fe7255..cbdb60e 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -37,6 +37,7 @@ public class BasicTest { new Composition(new FastPFOR(), new VariableByte()), new Simple9(), new Simple16(), + new GroupSimple9(), new Composition(new XorBinaryPacking(), new VariableByte()), new Composition(new DeltaZigzagBinaryPacking(), new DeltaZigzagVariableByte()) }; @@ -128,6 +129,14 @@ public void varyingLengthTest2() { } catch (ClassNotFoundException e) { e.printStackTrace(); } + try { + // CODEC GroupSimple9 is limited to "small" integers. + if (c.getClass().equals( + Class.forName("me.lemire.integercompression.GroupSimple9"))) + continue; + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } for (int L = 1; L <= 128; L++) { int[] comp = TestUtils.compress(c, Arrays.copyOf(data, L)); From 97ebd37658665f28a1d005d075163316774b5d33 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 13 Sep 2016 17:18:35 -0400 Subject: [PATCH 263/412] [maven-release-plugin] prepare release JavaFastPFOR-0.1.8 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bdd7b57..95eac76 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.1.8-SNAPSHOT + 0.1.8 jar 1.6 From db9e3e99c785329d6c5bc882111e5cc7cf32b205 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 13 Sep 2016 17:18:42 -0400 Subject: [PATCH 264/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 95eac76..755e696 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.1.8 + 0.1.9-SNAPSHOT jar 1.6 From 07b1ffefc930c6ead9017ea02772967a3e94a91b Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 14 Sep 2016 09:10:58 -0400 Subject: [PATCH 265/412] Simplifying code somewhat --- .../integercompression/GroupSimple9.java | 829 +++++++----------- 1 file changed, 334 insertions(+), 495 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/GroupSimple9.java b/src/main/java/me/lemire/integercompression/GroupSimple9.java index d109fee..cbd99e0 100644 --- a/src/main/java/me/lemire/integercompression/GroupSimple9.java +++ b/src/main/java/me/lemire/integercompression/GroupSimple9.java @@ -25,32 +25,33 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int out[], IntWra outpos.add(1); final int finalin = currentPos + inlength; while (currentPos < finalin - 28 * 2) { + int nextCurrentPos = currentPos; mainloop1: for (selector1=0; selector1 <= 8; selector1++) { int compressedNum = codeNum[selector1]; - //if (finalin <= currentPos + compressedNum - 1) - // compressedNum = finalin - currentPos; + //if (finalin <= nextCurrentPos + compressedNum - 1) + // compressedNum = finalin - nextCurrentPos; int b = bitLength[selector1]; int max = 1 << b; int i = 0; for (; i < compressedNum; i++) { - if (Util.smallerorequalthan(max, in[currentPos + i])) + if (Util.smallerorequalthan(max, in[nextCurrentPos + i])) continue mainloop1; } - currentPos += compressedNum; + nextCurrentPos += compressedNum; break; } mainloop2: for (selector2 = 0; selector2 <= 8; selector2++) { int compressedNum = codeNum[selector2]; - //if (finalin <= currentPos + compressedNum - 1) - // compressedNum = finalin - currentPos; + //if (finalin <= nextCurrentPos + compressedNum - 1) + // compressedNum = finalin - nextCurrentPos; int b = bitLength[selector2]; int max = 1 << b; int i = 0; for (; i < compressedNum; i++) { - if (Util.smallerorequalthan(max, in[currentPos + i])) + if (Util.smallerorequalthan(max, in[nextCurrentPos + i])) continue mainloop2; } - currentPos += compressedNum; + nextCurrentPos += compressedNum; break; } int code = M[selector1][selector2]; @@ -58,253 +59,253 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int out[], IntWra out[tmpoutpos + 1] = 0; switch (code) { case 0: - encode0(in, inpos, code, out, outpos); + encode0(in, currentPos, code, out, tmpoutpos); break; case 1: - encode1(in, inpos, code, out, outpos); + encode1(in, currentPos, code, out, tmpoutpos); break; case 2: - encode2(in, inpos, code, out, outpos); + encode2(in, currentPos, code, out, tmpoutpos); break; case 3: - encode3(in, inpos, code, out, outpos); + encode3(in, currentPos, code, out, tmpoutpos); break; case 4: - encode4(in, inpos, code, out, outpos); + encode4(in, currentPos, code, out, tmpoutpos); break; case 5: - encode5(in, inpos, code, out, outpos); + encode5(in, currentPos, code, out, tmpoutpos); break; case 6: - encode6(in, inpos, code, out, outpos); + encode6(in, currentPos, code, out, tmpoutpos); break; case 7: - encode7(in, inpos, code, out, outpos); + encode7(in, currentPos, code, out, tmpoutpos); break; case 8: - encode8(in, inpos, code, out, outpos); + encode8(in, currentPos, code, out, tmpoutpos); break; case 9: - encode9(in, inpos, code, out, outpos); + encode9(in, currentPos, code, out, tmpoutpos); break; case 10: - encode10(in, inpos, code, out, outpos); + encode10(in, currentPos, code, out, tmpoutpos); break; case 11: - encode11(in, inpos, code, out, outpos); + encode11(in, currentPos, code, out, tmpoutpos); break; case 12: - encode12(in, inpos, code, out, outpos); + encode12(in, currentPos, code, out, tmpoutpos); break; case 13: - encode13(in, inpos, code, out, outpos); + encode13(in, currentPos, code, out, tmpoutpos); break; case 14: - encode14(in, inpos, code, out, outpos); + encode14(in, currentPos, code, out, tmpoutpos); break; case 15: - encode15(in, inpos, code, out, outpos); + encode15(in, currentPos, code, out, tmpoutpos); break; case 16: - encode16(in, inpos, code, out, outpos); + encode16(in, currentPos, code, out, tmpoutpos); break; case 17: - encode17(in, inpos, code, out, outpos); + encode17(in, currentPos, code, out, tmpoutpos); break; case 18: - encode18(in, inpos, code, out, outpos); + encode18(in, currentPos, code, out, tmpoutpos); break; case 19: - encode19(in, inpos, code, out, outpos); + encode19(in, currentPos, code, out, tmpoutpos); break; case 20: - encode20(in, inpos, code, out, outpos); + encode20(in, currentPos, code, out, tmpoutpos); break; case 21: - encode21(in, inpos, code, out, outpos); + encode21(in, currentPos, code, out, tmpoutpos); break; case 22: - encode22(in, inpos, code, out, outpos); + encode22(in, currentPos, code, out, tmpoutpos); break; case 23: - encode23(in, inpos, code, out, outpos); + encode23(in, currentPos, code, out, tmpoutpos); break; case 24: - encode24(in, inpos, code, out, outpos); + encode24(in, currentPos, code, out, tmpoutpos); break; case 25: - encode25(in, inpos, code, out, outpos); + encode25(in, currentPos, code, out, tmpoutpos); break; case 26: - encode26(in, inpos, code, out, outpos); + encode26(in, currentPos, code, out, tmpoutpos); break; case 27: - encode27(in, inpos, code, out, outpos); + encode27(in, currentPos, code, out, tmpoutpos); break; case 28: - encode28(in, inpos, code, out, outpos); + encode28(in, currentPos, code, out, tmpoutpos); break; case 29: - encode29(in, inpos, code, out, outpos); + encode29(in, currentPos, code, out, tmpoutpos); break; case 30: - encode30(in, inpos, code, out, outpos); + encode30(in, currentPos, code, out, tmpoutpos); break; case 31: - encode31(in, inpos, code, out, outpos); + encode31(in, currentPos, code, out, tmpoutpos); break; case 32: - encode32(in, inpos, code, out, outpos); + encode32(in, currentPos, code, out, tmpoutpos); break; case 33: - encode33(in, inpos, code, out, outpos); + encode33(in, currentPos, code, out, tmpoutpos); break; case 34: - encode34(in, inpos, code, out, outpos); + encode34(in, currentPos, code, out, tmpoutpos); break; case 35: - encode35(in, inpos, code, out, outpos); + encode35(in, currentPos, code, out, tmpoutpos); break; case 36: - encode36(in, inpos, code, out, outpos); + encode36(in, currentPos, code, out, tmpoutpos); break; case 37: - encode37(in, inpos, code, out, outpos); + encode37(in, currentPos, code, out, tmpoutpos); break; case 38: - encode38(in, inpos, code, out, outpos); + encode38(in, currentPos, code, out, tmpoutpos); break; case 39: - encode39(in, inpos, code, out, outpos); + encode39(in, currentPos, code, out, tmpoutpos); break; case 40: - encode40(in, inpos, code, out, outpos); + encode40(in, currentPos, code, out, tmpoutpos); break; case 41: - encode41(in, inpos, code, out, outpos); + encode41(in, currentPos, code, out, tmpoutpos); break; case 42: - encode42(in, inpos, code, out, outpos); + encode42(in, currentPos, code, out, tmpoutpos); break; case 43: - encode43(in, inpos, code, out, outpos); + encode43(in, currentPos, code, out, tmpoutpos); break; case 44: - encode44(in, inpos, code, out, outpos); + encode44(in, currentPos, code, out, tmpoutpos); break; case 45: - encode45(in, inpos, code, out, outpos); + encode45(in, currentPos, code, out, tmpoutpos); break; case 46: - encode46(in, inpos, code, out, outpos); + encode46(in, currentPos, code, out, tmpoutpos); break; case 47: - encode47(in, inpos, code, out, outpos); + encode47(in, currentPos, code, out, tmpoutpos); break; case 48: - encode48(in, inpos, code, out, outpos); + encode48(in, currentPos, code, out, tmpoutpos); break; case 49: - encode49(in, inpos, code, out, outpos); + encode49(in, currentPos, code, out, tmpoutpos); break; case 50: - encode50(in, inpos, code, out, outpos); + encode50(in, currentPos, code, out, tmpoutpos); break; case 51: - encode51(in, inpos, code, out, outpos); + encode51(in, currentPos, code, out, tmpoutpos); break; case 52: - encode52(in, inpos, code, out, outpos); + encode52(in, currentPos, code, out, tmpoutpos); break; case 53: - encode53(in, inpos, code, out, outpos); + encode53(in, currentPos, code, out, tmpoutpos); break; case 54: - encode54(in, inpos, code, out, outpos); + encode54(in, currentPos, code, out, tmpoutpos); break; case 55: - encode55(in, inpos, code, out, outpos); + encode55(in, currentPos, code, out, tmpoutpos); break; case 56: - encode56(in, inpos, code, out, outpos); + encode56(in, currentPos, code, out, tmpoutpos); break; case 57: - encode57(in, inpos, code, out, outpos); + encode57(in, currentPos, code, out, tmpoutpos); break; case 58: - encode58(in, inpos, code, out, outpos); + encode58(in, currentPos, code, out, tmpoutpos); break; case 59: - encode59(in, inpos, code, out, outpos); + encode59(in, currentPos, code, out, tmpoutpos); break; case 60: - encode60(in, inpos, code, out, outpos); + encode60(in, currentPos, code, out, tmpoutpos); break; case 61: - encode61(in, inpos, code, out, outpos); + encode61(in, currentPos, code, out, tmpoutpos); break; case 62: - encode62(in, inpos, code, out, outpos); + encode62(in, currentPos, code, out, tmpoutpos); break; case 63: - encode63(in, inpos, code, out, outpos); + encode63(in, currentPos, code, out, tmpoutpos); break; case 64: - encode64(in, inpos, code, out, outpos); + encode64(in, currentPos, code, out, tmpoutpos); break; case 65: - encode65(in, inpos, code, out, outpos); + encode65(in, currentPos, code, out, tmpoutpos); break; case 66: - encode66(in, inpos, code, out, outpos); + encode66(in, currentPos, code, out, tmpoutpos); break; case 67: - encode67(in, inpos, code, out, outpos); + encode67(in, currentPos, code, out, tmpoutpos); break; case 68: - encode68(in, inpos, code, out, outpos); + encode68(in, currentPos, code, out, tmpoutpos); break; case 69: - encode69(in, inpos, code, out, outpos); + encode69(in, currentPos, code, out, tmpoutpos); break; case 70: - encode70(in, inpos, code, out, outpos); + encode70(in, currentPos, code, out, tmpoutpos); break; case 71: - encode71(in, inpos, code, out, outpos); + encode71(in, currentPos, code, out, tmpoutpos); break; case 72: - encode72(in, inpos, code, out, outpos); + encode72(in, currentPos, code, out, tmpoutpos); break; case 73: - encode73(in, inpos, code, out, outpos); + encode73(in, currentPos, code, out, tmpoutpos); break; case 74: - encode74(in, inpos, code, out, outpos); + encode74(in, currentPos, code, out, tmpoutpos); break; case 75: - encode75(in, inpos, code, out, outpos); + encode75(in, currentPos, code, out, tmpoutpos); break; case 76: - encode76(in, inpos, code, out, outpos); + encode76(in, currentPos, code, out, tmpoutpos); break; case 77: - encode77(in, inpos, code, out, outpos); + encode77(in, currentPos, code, out, tmpoutpos); break; case 78: - encode78(in, inpos, code, out, outpos); + encode78(in, currentPos, code, out, tmpoutpos); break; case 79: - encode79(in, inpos, code, out, outpos); + encode79(in, currentPos, code, out, tmpoutpos); break; case 80: - encode80(in, inpos, code, out, outpos); + encode80(in, currentPos, code, out, tmpoutpos); break; default: throw new RuntimeException("unsupported code"); }// end switch - inpos.set(currentPos); tmpoutpos += 2; + currentPos = nextCurrentPos; } outer: while (currentPos < finalin) { @@ -337,10 +338,8 @@ public void compress(int[] in, IntWrapper inpos, int inlength, int out[], IntWra outpos.set(tmpoutpos); } - private void encode0(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode0(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 24; i++) out[outf + 0] = (out[outf + 0] << 1) + (in[inf + i]); for (int i = 0; i < 4; i++) @@ -348,13 +347,11 @@ private void encode0(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 28; i++) out[outf + 1] = (out[outf + 1] << 1) + in[inf + 28 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode1(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode1(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 24; i++) out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; for (int i = 0; i < 4; i++) @@ -362,13 +359,11 @@ private void encode1(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 14; i++) out[outf + 1] = (out[outf + 1] << 2) + in[inf + 28 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode2(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode2(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 24; i++) out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; for (int i = 0; i < 4; i++) @@ -376,13 +371,11 @@ private void encode2(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 9; i++) out[outf + 1] = (out[outf + 1] << 3) + in[inf + 28 + i];// 第二个28位是低位存储的,所以浪费的1比特在最顶端。 out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode3(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode3(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 24; i++) out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; for (int i = 0; i < 4; i++) @@ -390,13 +383,11 @@ private void encode3(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 7; i++) out[outf + 1] = (out[outf + 1] << 4) + in[inf + 28 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode4(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode4(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 24; i++) out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; for (int i = 0; i < 4; i++) @@ -404,13 +395,11 @@ private void encode4(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 5; i++) out[outf + 1] = (out[outf + 1] << 5) + in[inf + 28 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode5(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode5(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 24; i++) out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; for (int i = 0; i < 4; i++) @@ -418,13 +407,11 @@ private void encode5(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 4; i++) out[outf + 1] = (out[outf + 1] << 7) + in[inf + 28 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode6(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode6(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 24; i++) out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; for (int i = 0; i < 4; i++) @@ -432,13 +419,11 @@ private void encode6(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 3; i++) out[outf + 1] = (out[outf + 1] << 9) + in[inf + 28 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode7(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode7(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 24; i++) out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; for (int i = 0; i < 4; i++) @@ -446,13 +431,11 @@ private void encode7(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 2; i++) out[outf + 1] = (out[outf + 1] << 14) + in[inf + 28 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode8(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode8(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 24; i++) out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; for (int i = 0; i < 4; i++) @@ -460,13 +443,11 @@ private void encode8(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 1; i++) out[outf + 1] = (out[outf + 1] << 28) + in[inf + 28 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode9(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode9(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 12; i++) out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; for (int i = 0; i < 2; i++) @@ -475,13 +456,11 @@ private void encode9(final int[] in, final IntWrapper inOffset, final int code, out[outf + 1] = (out[outf + 1] << 1) + in[inf + 14 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode10(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode10(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 12; i++) { out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; @@ -492,13 +471,11 @@ private void encode10(final int[] in, final IntWrapper inOffset, final int code, out[outf + 1] = (out[outf + 1] << 2) + in[inf + 14 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode11(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode11(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 12; i++) out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; for (int i = 0; i < 2; i++) @@ -507,13 +484,11 @@ private void encode11(final int[] in, final IntWrapper inOffset, final int code, out[outf + 1] = (out[outf + 1] << 3) + in[inf + 14 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode12(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode12(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 12; i++) out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; for (int i = 0; i < 2; i++) @@ -522,13 +497,11 @@ private void encode12(final int[] in, final IntWrapper inOffset, final int code, out[outf + 1] = (out[outf + 1] << 4) + in[inf + 14 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode13(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode13(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 12; i++) out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; for (int i = 0; i < 2; i++) @@ -537,13 +510,11 @@ private void encode13(final int[] in, final IntWrapper inOffset, final int code, out[outf + 1] = (out[outf + 1] << 5) + in[inf + 14 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode14(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode14(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 12; i++) out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; for (int i = 0; i < 2; i++) @@ -552,13 +523,11 @@ private void encode14(final int[] in, final IntWrapper inOffset, final int code, out[outf + 1] = (out[outf + 1] << 7) + in[inf + 14 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode15(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode15(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 12; i++) out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; for (int i = 0; i < 2; i++) @@ -567,13 +536,11 @@ private void encode15(final int[] in, final IntWrapper inOffset, final int code, out[outf + 1] = (out[outf + 1] << 9) + in[inf + 14 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode16(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode16(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 12; i++) out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; for (int i = 0; i < 2; i++) @@ -582,13 +549,11 @@ private void encode16(final int[] in, final IntWrapper inOffset, final int code, out[outf + 1] = (out[outf + 1] << 14) + in[inf + 14 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode17(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode17(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 12; i++) out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; for (int i = 0; i < 2; i++) @@ -597,13 +562,11 @@ private void encode17(final int[] in, final IntWrapper inOffset, final int code, out[outf + 1] = (out[outf + 1] << 28) + in[inf + 14 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode18(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode18(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 8; i++) out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; for (int i = 0; i < 1; i++) @@ -612,13 +575,11 @@ private void encode18(final int[] in, final IntWrapper inOffset, final int code, out[outf + 1] = (out[outf + 1] << 1) + in[inf + 9 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode19(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode19(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 8; i++) out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; for (int i = 0; i < 1; i++) @@ -627,13 +588,11 @@ private void encode19(final int[] in, final IntWrapper inOffset, final int code, out[outf + 1] = (out[outf + 1] << 2) + in[inf + 9 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode20(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode20(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 8; i++) out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; for (int i = 0; i < 1; i++) @@ -642,13 +601,11 @@ private void encode20(final int[] in, final IntWrapper inOffset, final int code, out[outf + 1] = (out[outf + 1] << 3) + in[inf + 9 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode21(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode21(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 8; i++) out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; for (int i = 0; i < 1; i++) @@ -656,13 +613,11 @@ private void encode21(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 7; i++) out[outf + 1] = (out[outf + 1] << 4) + in[inf + 9 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode22(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode22(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 8; i++) out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; for (int i = 0; i < 1; i++) @@ -670,13 +625,11 @@ private void encode22(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 5; i++) out[outf + 1] = (out[outf + 1] << 5) + in[inf + 9 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode23(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode23(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 8; i++) out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; for (int i = 0; i < 1; i++) @@ -684,13 +637,11 @@ private void encode23(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 4; i++) out[outf + 1] = (out[outf + 1] << 7) + in[inf + 9 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode24(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode24(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 8; i++) out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; for (int i = 0; i < 1; i++) @@ -698,13 +649,11 @@ private void encode24(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 3; i++) out[outf + 1] = (out[outf + 1] << 9) + in[inf + 9 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode25(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode25(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 8; i++) out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; for (int i = 0; i < 1; i++) @@ -712,13 +661,11 @@ private void encode25(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 2; i++) out[outf + 1] = (out[outf + 1] << 14) + in[inf + 9 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode26(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode26(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 8; i++) out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; for (int i = 0; i < 1; i++) @@ -726,13 +673,11 @@ private void encode26(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 1; i++) out[outf + 1] = (out[outf + 1] << 28) + in[inf + 9 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode27(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode27(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 6; i++) out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; for (int i = 0; i < 1; i++) @@ -740,13 +685,11 @@ private void encode27(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 28; i++) out[outf + 1] = (out[outf + 1] << 1) + in[inf + 7 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode28(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode28(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 6; i++) out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; for (int i = 0; i < 1; i++) @@ -754,13 +697,11 @@ private void encode28(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 14; i++) out[outf + 1] = (out[outf + 1] << 2) + in[inf + 7 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode29(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode29(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 6; i++) out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; for (int i = 0; i < 1; i++) @@ -768,13 +709,11 @@ private void encode29(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 9; i++) out[outf + 1] = (out[outf + 1] << 3) + in[inf + 7 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode30(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode30(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 6; i++) out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; for (int i = 0; i < 1; i++) @@ -782,13 +721,11 @@ private void encode30(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 7; i++) out[outf + 1] = (out[outf + 1] << 4) + in[inf + 7 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode31(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode31(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 6; i++) out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; for (int i = 0; i < 1; i++) @@ -796,13 +733,11 @@ private void encode31(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 5; i++) out[outf + 1] = (out[outf + 1] << 5) + in[inf + 7 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode32(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode32(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 6; i++) out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; for (int i = 0; i < 1; i++) @@ -810,13 +745,11 @@ private void encode32(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 4; i++) out[outf + 1] = (out[outf + 1] << 7) + in[inf + 7 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode33(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode33(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 6; i++) out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; for (int i = 0; i < 1; i++) @@ -824,13 +757,11 @@ private void encode33(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 3; i++) out[outf + 1] = (out[outf + 1] << 9) + in[inf + 7 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode34(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode34(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 6; i++) out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; for (int i = 0; i < 1; i++) @@ -838,13 +769,11 @@ private void encode34(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 2; i++) out[outf + 1] = (out[outf + 1] << 14) + in[inf + 7 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode35(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode35(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 6; i++) out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; for (int i = 0; i < 1; i++) @@ -852,13 +781,11 @@ private void encode35(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 1; i++) out[outf + 1] = (out[outf + 1] << 28) + in[inf + 7 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode36(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode36(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 4; i++) out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); @@ -866,13 +793,11 @@ private void encode36(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 28; i++) out[outf + 1] = (out[outf + 1] << 1) + in[inf + 5 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode37(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode37(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 4; i++) out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); @@ -880,13 +805,11 @@ private void encode37(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 14; i++) out[outf + 1] = (out[outf + 1] << 2) + in[inf + 5 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode38(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode38(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 4; i++) out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); @@ -894,13 +817,11 @@ private void encode38(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 9; i++) out[outf + 1] = (out[outf + 1] << 3) + in[inf + 5 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode39(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode39(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 4; i++) out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); @@ -908,13 +829,11 @@ private void encode39(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 7; i++) out[outf + 1] = (out[outf + 1] << 4) + in[inf + 5 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode40(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode40(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 4; i++) out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); @@ -922,13 +841,11 @@ private void encode40(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 5; i++) out[outf + 1] = (out[outf + 1] << 5) + in[inf + 5 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode41(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode41(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 4; i++) out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); @@ -936,13 +853,11 @@ private void encode41(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 4; i++) out[outf + 1] = (out[outf + 1] << 7) + in[inf + 5 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode42(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode42(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 4; i++) out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); @@ -950,13 +865,11 @@ private void encode42(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 3; i++) out[outf + 1] = (out[outf + 1] << 9) + in[inf + 5 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode43(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode43(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 4; i++) out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); @@ -964,13 +877,11 @@ private void encode43(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 2; i++) out[outf + 1] = (out[outf + 1] << 14) + in[inf + 5 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode44(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode44(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 4; i++) out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); @@ -978,13 +889,11 @@ private void encode44(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 1; i++) out[outf + 1] = (out[outf + 1] << 28) + in[inf + 5 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode45(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode45(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 3; i++) out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); @@ -992,13 +901,11 @@ private void encode45(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 28; i++) out[outf + 1] = (out[outf + 1] << 1) + in[inf + 4 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode46(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode46(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 3; i++) out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); @@ -1006,13 +913,11 @@ private void encode46(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 14; i++) out[outf + 1] = (out[outf + 1] << 2) + in[inf + 4 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode47(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode47(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 3; i++) out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); @@ -1020,13 +925,11 @@ private void encode47(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 9; i++) out[outf + 1] = (out[outf + 1] << 3) + in[inf + 4 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode48(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode48(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 3; i++) out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); @@ -1034,13 +937,11 @@ private void encode48(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 7; i++) out[outf + 1] = (out[outf + 1] << 4) + in[inf + 4 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode49(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode49(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 3; i++) out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); @@ -1048,13 +949,11 @@ private void encode49(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 5; i++) out[outf + 1] = (out[outf + 1] << 5) + in[inf + 4 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode50(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode50(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 3; i++) out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); @@ -1062,13 +961,11 @@ private void encode50(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 4; i++) out[outf + 1] = (out[outf + 1] << 7) + in[inf + 4 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode51(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode51(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 3; i++) out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); @@ -1076,13 +973,11 @@ private void encode51(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 3; i++) out[outf + 1] = (out[outf + 1] << 9) + in[inf + 4 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode52(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode52(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 3; i++) out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); @@ -1090,13 +985,11 @@ private void encode52(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 2; i++) out[outf + 1] = (out[outf + 1] << 14) + in[inf + 4 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode53(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode53(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 3; i++) out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); @@ -1104,13 +997,11 @@ private void encode53(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 1; i++) out[outf + 1] = (out[outf + 1] << 28) + in[inf + 4 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode54(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode54(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 2; i++) out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); @@ -1118,13 +1009,11 @@ private void encode54(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 28; i++) out[outf + 1] = (out[outf + 1] << 1) + in[inf + 3 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode55(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode55(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 2; i++) out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); @@ -1132,13 +1021,11 @@ private void encode55(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 14; i++) out[outf + 1] = (out[outf + 1] << 2) + in[inf + 3 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode56(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode56(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 2; i++) out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); @@ -1146,13 +1033,11 @@ private void encode56(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 9; i++) out[outf + 1] = (out[outf + 1] << 3) + in[inf + 3 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode57(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode57(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 2; i++) out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); @@ -1160,13 +1045,11 @@ private void encode57(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 7; i++) out[outf + 1] = (out[outf + 1] << 4) + in[inf + 3 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode58(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode58(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 2; i++) out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); @@ -1174,13 +1057,11 @@ private void encode58(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 5; i++) out[outf + 1] = (out[outf + 1] << 5) + in[inf + 3 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode59(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode59(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 2; i++) out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); @@ -1188,13 +1069,11 @@ private void encode59(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 4; i++) out[outf + 1] = (out[outf + 1] << 7) + in[inf + 3 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode60(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode60(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 2; i++) out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); @@ -1202,13 +1081,11 @@ private void encode60(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 3; i++) out[outf + 1] = (out[outf + 1] << 9) + in[inf + 3 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode61(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode61(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 2; i++) out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); @@ -1216,13 +1093,11 @@ private void encode61(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 2; i++) out[outf + 1] = (out[outf + 1] << 14) + in[inf + 3 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode62(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode62(final int[] in, final int inf, final int code, final int[] out, + final int outf) { for (int i = 0; i < 2; i++) out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); @@ -1230,13 +1105,11 @@ private void encode62(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 1; i++) out[outf + 1] = (out[outf + 1] << 28) + in[inf + 3 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode63(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode63(final int[] in, final int inf, final int code, final int[] out, + final int outf) { out[outf + 0] = (out[outf + 0] << 14) + in[inf]; out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); @@ -1244,220 +1117,186 @@ private void encode63(final int[] in, final IntWrapper inOffset, final int code, for (int i = 0; i < 28; i++) out[outf + 1] = (out[outf + 1] << 1) + in[inf + 2 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode64(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode64(final int[] in, final int inf, final int code, final int[] out, + final int outf) { out[outf + 0] = (out[outf + 0] << 14) + in[inf]; out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); for (int i = 0; i < 14; i++) out[outf + 1] = (out[outf + 1] << 2) + in[inf + 2 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode65(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode65(final int[] in, final int inf, final int code, final int[] out, + final int outf) { out[outf + 0] = (out[outf + 0] << 14) + in[inf]; out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); for (int i = 0; i < 9; i++) out[outf + 1] = (out[outf + 1] << 3) + in[inf + 2 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode66(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode66(final int[] in, final int inf, final int code, final int[] out, + final int outf) { out[outf + 0] = (out[outf + 0] << 14) + in[inf]; out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); for (int i = 0; i < 7; i++) out[outf + 1] = (out[outf + 1] << 4) + in[inf + 2 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode67(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode67(final int[] in, final int inf, final int code, final int[] out, + final int outf) { out[outf + 0] = (out[outf + 0] << 14) + in[inf]; out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); for (int i = 0; i < 5; i++) out[outf + 1] = (out[outf + 1] << 5) + in[inf + 2 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode68(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode68(final int[] in, final int inf, final int code, final int[] out, + final int outf) { out[outf + 0] = (out[outf + 0] << 14) + in[inf]; out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); for (int i = 0; i < 4; i++) out[outf + 1] = (out[outf + 1] << 7) + in[inf + 2 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode69(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode69(final int[] in, final int inf, final int code, final int[] out, + final int outf) { out[outf + 0] = (out[outf + 0] << 14) + in[inf]; out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); for (int i = 0; i < 3; i++) out[outf + 1] = (out[outf + 1] << 9) + in[inf + 2 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode70(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode70(final int[] in, final int inf, final int code, final int[] out, + final int outf) { out[outf + 0] = (out[outf + 0] << 14) + in[inf]; out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); for (int i = 0; i < 2; i++) out[outf + 1] = (out[outf + 1] << 14) + in[inf + 2 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode71(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode71(final int[] in, final int inf, final int code, final int[] out, + final int outf) { out[outf + 0] = (out[outf + 0] << 14) + in[inf]; out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); for (int i = 0; i < 1; i++) out[outf + 1] = (out[outf + 1] << 28) + in[inf + 2 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode72(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode72(final int[] in, final int inf, final int code, final int[] out, + final int outf) { out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); for (int i = 0; i < 28; i++) out[outf + 1] = (out[outf + 1] << 1) + in[inf + 1 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode73(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode73(final int[] in, final int inf, final int code, final int[] out, + final int outf) { out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); for (int i = 0; i < 14; i++) out[outf + 1] = (out[outf + 1] << 2) + in[inf + 1 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode74(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode74(final int[] in, final int inf, final int code, final int[] out, + final int outf) { out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); for (int i = 0; i < 9; i++) out[outf + 1] = (out[outf + 1] << 3) + in[inf + 1 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode75(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode75(final int[] in, final int inf, final int code, final int[] out, + final int outf) { out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); for (int i = 0; i < 7; i++) out[outf + 1] = (out[outf + 1] << 4) + in[inf + 1 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode76(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode76(final int[] in, final int inf, final int code, final int[] out, + final int outf) { out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); for (int i = 0; i < 5; i++) out[outf + 1] = (out[outf + 1] << 5) + in[inf + 1 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode77(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode77(final int[] in, final int inf, final int code, final int[] out, + final int outf) { out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); for (int i = 0; i < 4; i++) out[outf + 1] = (out[outf + 1] << 7) + in[inf + 1 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode78(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode78(final int[] in, final int inf, final int code, final int[] out, + final int outf) { out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); for (int i = 0; i < 3; i++) out[outf + 1] = (out[outf + 1] << 9) + in[inf + 1 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode79(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode79(final int[] in, final int inf, final int code, final int[] out, + final int outf) { out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); for (int i = 0; i < 2; i++) out[outf + 1] = (out[outf + 1] << 14) + in[inf + 1 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } - private void encode80(final int[] in, final IntWrapper inOffset, final int code, final int[] out, - final IntWrapper outOffset) { - int inf = inOffset.get(); - int outf = outOffset.get(); + private void encode80(final int[] in, final int inf, final int code, final int[] out, + final int outf) { out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); for (int i = 0; i < 1; i++) out[outf + 1] = (out[outf + 1] << 28) + in[inf + 1 + i]; out[outf + 0] = code << 24 | out[outf + 0]; - outOffset.add(2); + } @Override From afd7dc474c9fe49bee532f67ee3f24bf1407bc68 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 14 Sep 2016 09:18:10 -0400 Subject: [PATCH 266/412] Tuning GroupSimple9 --- CHANGELOG | 3 + .../integercompression/GroupSimple9.java | 1793 +++++++++-------- 2 files changed, 910 insertions(+), 886 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index a899df4..7431667 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +0.1.9 (September 14th 2016) + - Tuning GroupSimple9 + 0.1.8 (September 13th 2016) - Added GroupSimple9 diff --git a/src/main/java/me/lemire/integercompression/GroupSimple9.java b/src/main/java/me/lemire/integercompression/GroupSimple9.java index cbd99e0..0ce10ce 100644 --- a/src/main/java/me/lemire/integercompression/GroupSimple9.java +++ b/src/main/java/me/lemire/integercompression/GroupSimple9.java @@ -1,13 +1,17 @@ package me.lemire.integercompression; /** - * Group Simple 9 Credit Kun Jiang, Yuexiang Yang and Qinghua Zheng source: + * Group Simple 9 is a variation on Simple 9 that preserves the same + * compression ratios but offers higher decoding speed by regrouping + * the 32-bit words into pairs of 64-bit words. + * + * original by Kun Jiang, Yuexiang Yang and Qinghua Zheng source: * https://github.com/deeper2/simple * * Adapted by D. Lemire. */ -public final class GroupSimple9 implements IntegerCODEC { +public final class GroupSimple9 implements IntegerCODEC, SkippableIntegerCODEC { private static final int[][] M = { { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, { 9, 10, 11, 12, 13, 14, 15, 16, 17 }, { 18, 19, 20, 21, 22, 23, 24, 25, 26 }, { 27, 28, 29, 30, 31, 32, 33, 34, 35 }, @@ -17,325 +21,11 @@ public final class GroupSimple9 implements IntegerCODEC { @Override public void compress(int[] in, IntWrapper inpos, int inlength, int out[], IntWrapper outpos) { - int tmpoutpos = outpos.get(); - int currentPos = inpos.get(); - int selector1 = 0; - int selector2 = 0; - out[tmpoutpos++] = inlength; - outpos.add(1); - final int finalin = currentPos + inlength; - while (currentPos < finalin - 28 * 2) { - int nextCurrentPos = currentPos; - mainloop1: for (selector1=0; selector1 <= 8; selector1++) { - int compressedNum = codeNum[selector1]; - //if (finalin <= nextCurrentPos + compressedNum - 1) - // compressedNum = finalin - nextCurrentPos; - int b = bitLength[selector1]; - int max = 1 << b; - int i = 0; - for (; i < compressedNum; i++) { - if (Util.smallerorequalthan(max, in[nextCurrentPos + i])) - continue mainloop1; - } - nextCurrentPos += compressedNum; - break; - } - mainloop2: for (selector2 = 0; selector2 <= 8; selector2++) { - int compressedNum = codeNum[selector2]; - //if (finalin <= nextCurrentPos + compressedNum - 1) - // compressedNum = finalin - nextCurrentPos; - int b = bitLength[selector2]; - int max = 1 << b; - int i = 0; - for (; i < compressedNum; i++) { - if (Util.smallerorequalthan(max, in[nextCurrentPos + i])) - continue mainloop2; - } - nextCurrentPos += compressedNum; - break; - } - int code = M[selector1][selector2]; - out[tmpoutpos] = 0; - out[tmpoutpos + 1] = 0; - switch (code) { - case 0: - encode0(in, currentPos, code, out, tmpoutpos); - break; - case 1: - encode1(in, currentPos, code, out, tmpoutpos); - break; - case 2: - encode2(in, currentPos, code, out, tmpoutpos); - break; - case 3: - encode3(in, currentPos, code, out, tmpoutpos); - break; - case 4: - encode4(in, currentPos, code, out, tmpoutpos); - break; - case 5: - encode5(in, currentPos, code, out, tmpoutpos); - break; - case 6: - encode6(in, currentPos, code, out, tmpoutpos); - break; - case 7: - encode7(in, currentPos, code, out, tmpoutpos); - break; - case 8: - encode8(in, currentPos, code, out, tmpoutpos); - break; - case 9: - encode9(in, currentPos, code, out, tmpoutpos); - break; - case 10: - encode10(in, currentPos, code, out, tmpoutpos); - break; - case 11: - encode11(in, currentPos, code, out, tmpoutpos); - break; - case 12: - encode12(in, currentPos, code, out, tmpoutpos); - break; - case 13: - encode13(in, currentPos, code, out, tmpoutpos); - break; - case 14: - encode14(in, currentPos, code, out, tmpoutpos); - break; - case 15: - encode15(in, currentPos, code, out, tmpoutpos); - break; - case 16: - encode16(in, currentPos, code, out, tmpoutpos); - break; - case 17: - encode17(in, currentPos, code, out, tmpoutpos); - break; - case 18: - encode18(in, currentPos, code, out, tmpoutpos); - break; - case 19: - encode19(in, currentPos, code, out, tmpoutpos); - break; - case 20: - encode20(in, currentPos, code, out, tmpoutpos); - break; - case 21: - encode21(in, currentPos, code, out, tmpoutpos); - break; - case 22: - encode22(in, currentPos, code, out, tmpoutpos); - break; - case 23: - encode23(in, currentPos, code, out, tmpoutpos); - break; - case 24: - encode24(in, currentPos, code, out, tmpoutpos); - break; - case 25: - encode25(in, currentPos, code, out, tmpoutpos); - break; - case 26: - encode26(in, currentPos, code, out, tmpoutpos); - break; - case 27: - encode27(in, currentPos, code, out, tmpoutpos); - break; - case 28: - encode28(in, currentPos, code, out, tmpoutpos); - break; - case 29: - encode29(in, currentPos, code, out, tmpoutpos); - break; - case 30: - encode30(in, currentPos, code, out, tmpoutpos); - break; - case 31: - encode31(in, currentPos, code, out, tmpoutpos); - break; - case 32: - encode32(in, currentPos, code, out, tmpoutpos); - break; - case 33: - encode33(in, currentPos, code, out, tmpoutpos); - break; - case 34: - encode34(in, currentPos, code, out, tmpoutpos); - break; - case 35: - encode35(in, currentPos, code, out, tmpoutpos); - break; - case 36: - encode36(in, currentPos, code, out, tmpoutpos); - break; - case 37: - encode37(in, currentPos, code, out, tmpoutpos); - break; - case 38: - encode38(in, currentPos, code, out, tmpoutpos); - break; - case 39: - encode39(in, currentPos, code, out, tmpoutpos); - break; - case 40: - encode40(in, currentPos, code, out, tmpoutpos); - break; - case 41: - encode41(in, currentPos, code, out, tmpoutpos); - break; - case 42: - encode42(in, currentPos, code, out, tmpoutpos); - break; - case 43: - encode43(in, currentPos, code, out, tmpoutpos); - break; - case 44: - encode44(in, currentPos, code, out, tmpoutpos); - break; - case 45: - encode45(in, currentPos, code, out, tmpoutpos); - break; - case 46: - encode46(in, currentPos, code, out, tmpoutpos); - break; - case 47: - encode47(in, currentPos, code, out, tmpoutpos); - break; - case 48: - encode48(in, currentPos, code, out, tmpoutpos); - break; - case 49: - encode49(in, currentPos, code, out, tmpoutpos); - break; - case 50: - encode50(in, currentPos, code, out, tmpoutpos); - break; - case 51: - encode51(in, currentPos, code, out, tmpoutpos); - break; - case 52: - encode52(in, currentPos, code, out, tmpoutpos); - break; - case 53: - encode53(in, currentPos, code, out, tmpoutpos); - break; - case 54: - encode54(in, currentPos, code, out, tmpoutpos); - break; - case 55: - encode55(in, currentPos, code, out, tmpoutpos); - break; - case 56: - encode56(in, currentPos, code, out, tmpoutpos); - break; - case 57: - encode57(in, currentPos, code, out, tmpoutpos); - break; - case 58: - encode58(in, currentPos, code, out, tmpoutpos); - break; - case 59: - encode59(in, currentPos, code, out, tmpoutpos); - break; - case 60: - encode60(in, currentPos, code, out, tmpoutpos); - break; - case 61: - encode61(in, currentPos, code, out, tmpoutpos); - break; - case 62: - encode62(in, currentPos, code, out, tmpoutpos); - break; - case 63: - encode63(in, currentPos, code, out, tmpoutpos); - break; - case 64: - encode64(in, currentPos, code, out, tmpoutpos); - break; - case 65: - encode65(in, currentPos, code, out, tmpoutpos); - break; - case 66: - encode66(in, currentPos, code, out, tmpoutpos); - break; - case 67: - encode67(in, currentPos, code, out, tmpoutpos); - break; - case 68: - encode68(in, currentPos, code, out, tmpoutpos); - break; - case 69: - encode69(in, currentPos, code, out, tmpoutpos); - break; - case 70: - encode70(in, currentPos, code, out, tmpoutpos); - break; - case 71: - encode71(in, currentPos, code, out, tmpoutpos); - break; - case 72: - encode72(in, currentPos, code, out, tmpoutpos); - break; - case 73: - encode73(in, currentPos, code, out, tmpoutpos); - break; - case 74: - encode74(in, currentPos, code, out, tmpoutpos); - break; - case 75: - encode75(in, currentPos, code, out, tmpoutpos); - break; - case 76: - encode76(in, currentPos, code, out, tmpoutpos); - break; - case 77: - encode77(in, currentPos, code, out, tmpoutpos); - break; - case 78: - encode78(in, currentPos, code, out, tmpoutpos); - break; - case 79: - encode79(in, currentPos, code, out, tmpoutpos); - break; - case 80: - encode80(in, currentPos, code, out, tmpoutpos); - break; - default: - throw new RuntimeException("unsupported code"); - }// end switch - tmpoutpos += 2; - currentPos = nextCurrentPos; - } - - outer: while (currentPos < finalin) { - mainloop: for (int selector = 0; selector < 8; selector++) { - int res = 0; - int compressedNum = codeNum[selector]; - if (finalin <= currentPos + compressedNum - 1) - compressedNum = finalin - currentPos; - int b = bitLength[selector]; - int max = 1 << b; - int i = 0; - for (; i < compressedNum; i++) { - if (Util.smallerorequalthan(max, in[currentPos + i])) - continue mainloop; - res = (res << b) + in[currentPos + i]; - } - if (compressedNum != codeNum[selector]) { - res <<= (codeNum[selector] - compressedNum) * b; - } - res |= selector << 28; - out[tmpoutpos++] = res; - - currentPos += compressedNum; - continue outer; - } - final int selector = 8; - out[tmpoutpos++] = in[currentPos++] | (selector << 28); - } - inpos.set(currentPos); - outpos.set(tmpoutpos); + if (inlength == 0) + return; + out[outpos.get()] = inlength; + outpos.increment(); + headlessCompress(in, inpos, inlength, out, outpos); } private void encode0(final int[] in, final int inf, final int code, final int[] out, @@ -1301,508 +991,21 @@ private void encode80(final int[] in, final int inf, final int code, final int[] @Override public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - int currentPos = outpos.get(); - int tmpinpos = inpos.get(); - final int finalout = currentPos + in[tmpinpos++]; - while (currentPos < finalout - 2 * 28) { + if (inlength == 0) + return; + final int outlength = in[inpos.get()]; + inpos.increment(); + headlessUncompress(in, inpos, inlength, out, outpos, outlength); + } - int val = in[tmpinpos++]; - int valn = in[tmpinpos++]; - int header = val >>> 24; - switch (header) { - case 0: { - decode0(val, valn, out, currentPos); - currentPos+=56; - break; - } - case 1: { - decode1(val, valn, out, currentPos); - currentPos+=42; - break; - } - case 2: { - decode2(val, valn, out, currentPos); - currentPos+=37; - break; - } - case 3: { - decode3(val, valn, out, currentPos); - currentPos+=35; - break; - } - case 4: { - decode4(val, valn, out, currentPos); - currentPos+=33; - break; - } - case 5: { - decode5(val, valn, out, currentPos); - currentPos+=32; - break; - } - case 6: { - decode6(val, valn, out, currentPos); - currentPos+=31; - break; - } - case 7: { - decode7(val, valn, out, currentPos); - currentPos+=30; - break; - } - case 8: { - decode8(val, valn, out, currentPos); - currentPos+=29; - break; - } - case 9: { - decode9(val, valn, out, currentPos); - currentPos+=42; - break; - } - case 10: { - decode10(val, valn, out, currentPos); - currentPos+=28; - break; - } - case 11: { - decode11(val, valn, out, currentPos); - currentPos+=23; - break; - } - case 12: { - decode12(val, valn, out, currentPos); - currentPos+=21; - break; - } - case 13: { - decode13(val, valn, out, currentPos); - currentPos+=19; - break; - } - case 14: { - decode14(val, valn, out, currentPos); - currentPos+=18; - break; - } - case 15: { - decode15(val, valn, out, currentPos); - currentPos+=17; - break; - } - case 16: { - decode16(val, valn, out, currentPos); - currentPos+=16; - break; - } - case 17: { - decode17(val, valn, out, currentPos); - currentPos+=15; - break; - } - case 18: { - decode18(val, valn, out, currentPos); - currentPos+=37; - break; - } - case 19: { - decode19(val, valn, out, currentPos); - currentPos+=23; - break; - } - case 20: { - decode20(val, valn, out, currentPos); - currentPos+=18; - break; - } - case 21: { - decode21(val, valn, out, currentPos); - currentPos+=16; - break; - } - case 22: { - decode22(val, valn, out, currentPos); - currentPos+=14; - break; - } - case 23: { - decode23(val, valn, out, currentPos); - currentPos+=13; - break; - } - case 24: { - decode24(val, valn, out, currentPos); - currentPos+=12; - break; - } - case 25: { - decode25(val, valn, out, currentPos); - currentPos+=11; - break; - } - case 26: { - decode26(val, valn, out, currentPos); - currentPos+=10; - break; - } - case 27: { - decode27(val, valn, out, currentPos); - currentPos+=35; - break; - } - case 28: { - decode28(val, valn, out, currentPos); - currentPos+=21; - break; - } - case 29: { - decode29(val, valn, out, currentPos); - currentPos+=16; - break; - } - - case 30: { - decode30(val, valn, out, currentPos); - currentPos+=14; - break; - } - case 31: { - decode31(val, valn, out, currentPos); - currentPos+=12; - break; - } - case 32: { - decode32(val, valn, out, currentPos); - currentPos+=11; - break; - } - case 33: { - decode33(val, valn, out, currentPos); - currentPos+=10; - break; - } - case 34: { - decode34(val, valn, out, currentPos); - currentPos+=9; - break; - } - case 35: { - decode35(val, valn, out, currentPos); - currentPos+=8; - break; - } - case 36: { - decode36(val, valn, out, currentPos); - currentPos+=33; - break; - } - case 37: { - decode37(val, valn, out, currentPos); - currentPos+=19; - break; - } - case 38: { - decode38(val, valn, out, currentPos); - currentPos+=14; - break; - } - case 39: { - decode39(val, valn, out, currentPos); - currentPos+=12; - break; - } - case 40: { - decode40(val, valn, out, currentPos); - currentPos+=10; - break; - } - case 41: { - decode41(val, valn, out, currentPos); - currentPos+=9; - break; - } - case 42: { - decode42(val, valn, out, currentPos); - currentPos+=8; - break; - } - case 43: { - decode43(val, valn, out, currentPos); - currentPos+=7; - break; - } - case 44: { - decode44(val, valn, out, currentPos); - currentPos+=6; - break; - } - case 45: { - decode45(val, valn, out, currentPos); - currentPos+=32; - break; - } - case 46: { - decode46(val, valn, out, currentPos); - currentPos+=18; - break; - } - case 47: { - decode47(val, valn, out, currentPos); - currentPos+=13; - break; - } - case 48: { - decode48(val, valn, out, currentPos); - currentPos+=11; - break; - } - case 49: { - decode49(val, valn, out, currentPos); - currentPos+=9; - break; - } - case 50: { - decode50(val, valn, out, currentPos); - currentPos+=8; - break; - } - case 51: { - decode51(val, valn, out, currentPos); - currentPos+=7; - break; - } - case 52: { - decode52(val, valn, out, currentPos); - currentPos+=6; - break; - } - case 53: { - decode53(val, valn, out, currentPos); - currentPos+=5; - break; - } - case 54: { - decode54(val, valn, out, currentPos); - currentPos+=31; - break; - } - case 55: { - decode55(val, valn, out, currentPos); - currentPos+=17; - break; - } - case 56: { - decode56(val, valn, out, currentPos); - currentPos+=12; - break; - } - case 57: { - decode57(val, valn, out, currentPos); - currentPos+=10; - break; - } - case 58: { - decode58(val, valn, out, currentPos); - currentPos+=8; - break; - } - case 59: { - decode59(val, valn, out, currentPos); - currentPos+=7; - break; - } - case 60: { - decode60(val, valn, out, currentPos); - currentPos+=6; - break; - } - case 61: { - decode61(val, valn, out, currentPos); - currentPos+=5; - break; - } - case 62: { - decode62(val, valn, out, currentPos); - currentPos+=4; - break; - } - case 63: { - decode63(val, valn, out, currentPos); - currentPos+=30; - break; - } - case 64: { - decode64(val, valn, out, currentPos); - currentPos+=16; - break; - } - case 65: { - decode65(val, valn, out, currentPos); - currentPos+=11; - break; - } - case 66: { - decode66(val, valn, out, currentPos); - currentPos+=9; - break; - } - case 67: { - decode67(val, valn, out, currentPos); - currentPos+=7; - break; - } - case 68: { - decode68(val, valn, out, currentPos); - currentPos+=6; - break; - } - case 69: { - decode69(val, valn, out, currentPos); - currentPos+=5; - break; - } - case 70: { - decode70(val, valn, out, currentPos); - currentPos+=4; - break; - } - case 71: { - decode71(val, valn, out, currentPos); - currentPos+=3; - break; - } - case 72: { - decode72(val, valn, out, currentPos); - currentPos+=29; - break; - } - case 73: { - decode73(val, valn, out, currentPos); - currentPos+=15; - break; - } - case 74: { - decode74(val, valn, out, currentPos); - currentPos+=10; - break; - } - case 75: { - decode75(val, valn, out, currentPos); - currentPos+=8; - break; - } - case 76: { - decode76(val, valn, out, currentPos); - currentPos+=6; - break; - } - case 77: { - decode77(val, valn, out, currentPos); - currentPos+=5; - break; - } - case 78: { - decode78(val, valn, out, currentPos); - currentPos+=4; - break; - } - case 79: { - decode79(val, valn, out, currentPos); - currentPos+=3; - break; - } - case 80: { - decode80(val, valn, out, currentPos); - currentPos+=2; - break; - } - default: - throw new RuntimeException("Wrong code: " + header); - }// end switch - } // end while - - while (currentPos < finalout) { - int val = in[tmpinpos++]; - int header = val >>> 28; - switch (header) { - case 0: { // number : 28, bitwidth : 1 - final int howmany = finalout - currentPos < 28 ? finalout - currentPos : 28; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (k + 4)) >>> 31; - } - break; - } - case 1: { // number : 14, bitwidth : 2 - final int howmany = finalout - currentPos < 14 ? finalout - currentPos : 14; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (2 * k + 4)) >>> 30; - } - break; - } - case 2: { // number : 9, bitwidth : 3 - final int howmany = finalout - currentPos < 9 ? finalout - currentPos : 9; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (3 * k + 5)) >>> 29; - } - break; - } - case 3: { // number : 7, bitwidth : 4 - final int howmany = finalout - currentPos < 7 ? finalout - currentPos : 7; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (4 * k + 4)) >>> 28; - } - break; - } - case 4: { // number : 5, bitwidth : 5 - final int howmany = finalout - currentPos < 5 ? finalout - currentPos : 5; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (5 * k + 7)) >>> 27; - } - break; - } - case 5: { // number : 4, bitwidth : 7 - final int howmany = finalout - currentPos < 4 ? finalout - currentPos : 4; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (7 * k + 4)) >>> 25; - } - break; - } - case 6: { // number : 3, bitwidth : 9 - final int howmany = finalout - currentPos < 3 ? finalout - currentPos : 3; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (9 * k + 5)) >>> 23; - } - break; - } - case 7: { // number : 2, bitwidth : 14 - final int howmany = finalout - currentPos < 2 ? finalout - currentPos : 2; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (14 * k + 4)) >>> 18; - } - break; - } - case 8: { // number : 1, bitwidth : 28 - out[currentPos++] = (val << 4) >>> 4; - break; - } - default: { - throw new RuntimeException("shouldn't happen"); - } - } - } - - outpos.set(finalout); - inpos.set(tmpinpos); - } - - - - private void decode80(int val, int valn, int[] out, int currentPos) { - // number : 1, bitwidth : 28 - out[currentPos++] = (val << 8) >>> 4 | (valn >>> 28); - // number : 1, bitwidth : 28 - out[currentPos++] = (valn << 4) >>> 4; - } + + + private void decode80(int val, int valn, int[] out, int currentPos) { + // number : 1, bitwidth : 28 + out[currentPos++] = (val << 8) >>> 4 | (valn >>> 28); + // number : 1, bitwidth : 28 + out[currentPos++] = (valn << 4) >>> 4; + } private void decode79(int val, int valn, int[] out, int currentPos) { // number : 1, bitwidth : 28 @@ -3458,74 +2661,892 @@ private void decode1(int val, int valn, int[] out, int currentPos) { out[currentPos++] = (valn << 30) >>> 30; } - private void decode0(int val, int valn, int[] out, int currentPos) { - // number : 28, bitwidth : 1 - out[currentPos++] = (val << 8) >>> 31; - out[currentPos++] = (val << 9) >>> 31; - out[currentPos++] = (val << 10) >>> 31; - out[currentPos++] = (val << 11) >>> 31; - out[currentPos++] = (val << 12) >>> 31; - out[currentPos++] = (val << 13) >>> 31; // 10 - out[currentPos++] = (val << 14) >>> 31; - out[currentPos++] = (val << 15) >>> 31; - out[currentPos++] = (val << 16) >>> 31; - out[currentPos++] = (val << 17) >>> 31; - out[currentPos++] = (val << 18) >>> 31; - out[currentPos++] = (val << 19) >>> 31; - out[currentPos++] = (val << 20) >>> 31; - out[currentPos++] = (val << 21) >>> 31; - out[currentPos++] = (val << 22) >>> 31; - out[currentPos++] = (val << 23) >>> 31; // 20 - out[currentPos++] = (val << 24) >>> 31; - out[currentPos++] = (val << 25) >>> 31; - out[currentPos++] = (val << 26) >>> 31; - out[currentPos++] = (val << 27) >>> 31; - out[currentPos++] = (val << 28) >>> 31; - out[currentPos++] = (val << 29) >>> 31; - out[currentPos++] = (val << 30) >>> 31; - out[currentPos++] = (val << 31) >>> 31; - out[currentPos++] = valn >>> 31; - out[currentPos++] = (valn << 1) >>> 31; - out[currentPos++] = (valn << 2) >>> 31; - out[currentPos++] = (valn << 3) >>> 31; - // number : 28, bitwidth : 1 - out[currentPos++] = (valn << 4) >>> 31; - out[currentPos++] = (valn << 5) >>> 31; - out[currentPos++] = (valn << 6) >>> 31; - out[currentPos++] = (valn << 7) >>> 31; - out[currentPos++] = (valn << 8) >>> 31; - out[currentPos++] = (valn << 9) >>> 31; - out[currentPos++] = (valn << 10) >>> 31; - out[currentPos++] = (valn << 11) >>> 31; - out[currentPos++] = (valn << 12) >>> 31; - out[currentPos++] = (valn << 13) >>> 31; // 10 - out[currentPos++] = (valn << 14) >>> 31; - out[currentPos++] = (valn << 15) >>> 31; - out[currentPos++] = (valn << 16) >>> 31; - out[currentPos++] = (valn << 17) >>> 31; - out[currentPos++] = (valn << 18) >>> 31; - out[currentPos++] = (valn << 19) >>> 31; - out[currentPos++] = (valn << 20) >>> 31; - out[currentPos++] = (valn << 21) >>> 31; - out[currentPos++] = (valn << 22) >>> 31; - out[currentPos++] = (valn << 23) >>> 31; // 20 - out[currentPos++] = (valn << 24) >>> 31; - out[currentPos++] = (valn << 25) >>> 31; - out[currentPos++] = (valn << 26) >>> 31; - out[currentPos++] = (valn << 27) >>> 31; - out[currentPos++] = (valn << 28) >>> 31; - out[currentPos++] = (valn << 29) >>> 31; - out[currentPos++] = (valn << 30) >>> 31; - out[currentPos++] = (valn << 31) >>> 31; + private void decode0(int val, int valn, int[] out, int currentPos) { + // number : 28, bitwidth : 1 + out[currentPos++] = (val << 8) >>> 31; + out[currentPos++] = (val << 9) >>> 31; + out[currentPos++] = (val << 10) >>> 31; + out[currentPos++] = (val << 11) >>> 31; + out[currentPos++] = (val << 12) >>> 31; + out[currentPos++] = (val << 13) >>> 31; // 10 + out[currentPos++] = (val << 14) >>> 31; + out[currentPos++] = (val << 15) >>> 31; + out[currentPos++] = (val << 16) >>> 31; + out[currentPos++] = (val << 17) >>> 31; + out[currentPos++] = (val << 18) >>> 31; + out[currentPos++] = (val << 19) >>> 31; + out[currentPos++] = (val << 20) >>> 31; + out[currentPos++] = (val << 21) >>> 31; + out[currentPos++] = (val << 22) >>> 31; + out[currentPos++] = (val << 23) >>> 31; // 20 + out[currentPos++] = (val << 24) >>> 31; + out[currentPos++] = (val << 25) >>> 31; + out[currentPos++] = (val << 26) >>> 31; + out[currentPos++] = (val << 27) >>> 31; + out[currentPos++] = (val << 28) >>> 31; + out[currentPos++] = (val << 29) >>> 31; + out[currentPos++] = (val << 30) >>> 31; + out[currentPos++] = (val << 31) >>> 31; + out[currentPos++] = valn >>> 31; + out[currentPos++] = (valn << 1) >>> 31; + out[currentPos++] = (valn << 2) >>> 31; + out[currentPos++] = (valn << 3) >>> 31; + // number : 28, bitwidth : 1 + out[currentPos++] = (valn << 4) >>> 31; + out[currentPos++] = (valn << 5) >>> 31; + out[currentPos++] = (valn << 6) >>> 31; + out[currentPos++] = (valn << 7) >>> 31; + out[currentPos++] = (valn << 8) >>> 31; + out[currentPos++] = (valn << 9) >>> 31; + out[currentPos++] = (valn << 10) >>> 31; + out[currentPos++] = (valn << 11) >>> 31; + out[currentPos++] = (valn << 12) >>> 31; + out[currentPos++] = (valn << 13) >>> 31; // 10 + out[currentPos++] = (valn << 14) >>> 31; + out[currentPos++] = (valn << 15) >>> 31; + out[currentPos++] = (valn << 16) >>> 31; + out[currentPos++] = (valn << 17) >>> 31; + out[currentPos++] = (valn << 18) >>> 31; + out[currentPos++] = (valn << 19) >>> 31; + out[currentPos++] = (valn << 20) >>> 31; + out[currentPos++] = (valn << 21) >>> 31; + out[currentPos++] = (valn << 22) >>> 31; + out[currentPos++] = (valn << 23) >>> 31; // 20 + out[currentPos++] = (valn << 24) >>> 31; + out[currentPos++] = (valn << 25) >>> 31; + out[currentPos++] = (valn << 26) >>> 31; + out[currentPos++] = (valn << 27) >>> 31; + out[currentPos++] = (valn << 28) >>> 31; + out[currentPos++] = (valn << 29) >>> 31; + out[currentPos++] = (valn << 30) >>> 31; + out[currentPos++] = (valn << 31) >>> 31; + } + + + private final static int bitLength[] = { 1, 2, 3, 4, 5, 7, 9, 14, 28 }; + + private final static int codeNum[] = { 28, 14, 9, 7, 5, 4, 3, 2, 1 }; + + @Override + public String toString() { + return this.getClass().getSimpleName(); + } + + @Override + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + int tmpoutpos = outpos.get(); + int currentPos = inpos.get(); + int selector1 = 0; + int selector2 = 0; + final int finalin = currentPos + inlength; + while (currentPos < finalin - 28 * 2) { + int nextCurrentPos = currentPos; + mainloop1: for (selector1=0; selector1 <= 8; selector1++) { + int compressedNum = codeNum[selector1]; + //if (finalin <= nextCurrentPos + compressedNum - 1) + // compressedNum = finalin - nextCurrentPos; + int b = bitLength[selector1]; + int max = 1 << b; + int i = 0; + for (; i < compressedNum; i++) { + if (Util.smallerorequalthan(max, in[nextCurrentPos + i])) + continue mainloop1; + } + nextCurrentPos += compressedNum; + break; + } + mainloop2: for (selector2 = 0; selector2 <= 8; selector2++) { + int compressedNum = codeNum[selector2]; + //if (finalin <= nextCurrentPos + compressedNum - 1) + // compressedNum = finalin - nextCurrentPos; + int b = bitLength[selector2]; + int max = 1 << b; + int i = 0; + for (; i < compressedNum; i++) { + if (Util.smallerorequalthan(max, in[nextCurrentPos + i])) + continue mainloop2; + } + nextCurrentPos += compressedNum; + break; + } + int code = M[selector1][selector2]; + out[tmpoutpos] = 0; + out[tmpoutpos + 1] = 0; + switch (code) { + case 0: + encode0(in, currentPos, code, out, tmpoutpos); + break; + case 1: + encode1(in, currentPos, code, out, tmpoutpos); + break; + case 2: + encode2(in, currentPos, code, out, tmpoutpos); + break; + case 3: + encode3(in, currentPos, code, out, tmpoutpos); + break; + case 4: + encode4(in, currentPos, code, out, tmpoutpos); + break; + case 5: + encode5(in, currentPos, code, out, tmpoutpos); + break; + case 6: + encode6(in, currentPos, code, out, tmpoutpos); + break; + case 7: + encode7(in, currentPos, code, out, tmpoutpos); + break; + case 8: + encode8(in, currentPos, code, out, tmpoutpos); + break; + case 9: + encode9(in, currentPos, code, out, tmpoutpos); + break; + case 10: + encode10(in, currentPos, code, out, tmpoutpos); + break; + case 11: + encode11(in, currentPos, code, out, tmpoutpos); + break; + case 12: + encode12(in, currentPos, code, out, tmpoutpos); + break; + case 13: + encode13(in, currentPos, code, out, tmpoutpos); + break; + case 14: + encode14(in, currentPos, code, out, tmpoutpos); + break; + case 15: + encode15(in, currentPos, code, out, tmpoutpos); + break; + case 16: + encode16(in, currentPos, code, out, tmpoutpos); + break; + case 17: + encode17(in, currentPos, code, out, tmpoutpos); + break; + case 18: + encode18(in, currentPos, code, out, tmpoutpos); + break; + case 19: + encode19(in, currentPos, code, out, tmpoutpos); + break; + case 20: + encode20(in, currentPos, code, out, tmpoutpos); + break; + case 21: + encode21(in, currentPos, code, out, tmpoutpos); + break; + case 22: + encode22(in, currentPos, code, out, tmpoutpos); + break; + case 23: + encode23(in, currentPos, code, out, tmpoutpos); + break; + case 24: + encode24(in, currentPos, code, out, tmpoutpos); + break; + case 25: + encode25(in, currentPos, code, out, tmpoutpos); + break; + case 26: + encode26(in, currentPos, code, out, tmpoutpos); + break; + case 27: + encode27(in, currentPos, code, out, tmpoutpos); + break; + case 28: + encode28(in, currentPos, code, out, tmpoutpos); + break; + case 29: + encode29(in, currentPos, code, out, tmpoutpos); + break; + case 30: + encode30(in, currentPos, code, out, tmpoutpos); + break; + case 31: + encode31(in, currentPos, code, out, tmpoutpos); + break; + case 32: + encode32(in, currentPos, code, out, tmpoutpos); + break; + case 33: + encode33(in, currentPos, code, out, tmpoutpos); + break; + case 34: + encode34(in, currentPos, code, out, tmpoutpos); + break; + case 35: + encode35(in, currentPos, code, out, tmpoutpos); + break; + case 36: + encode36(in, currentPos, code, out, tmpoutpos); + break; + case 37: + encode37(in, currentPos, code, out, tmpoutpos); + break; + case 38: + encode38(in, currentPos, code, out, tmpoutpos); + break; + case 39: + encode39(in, currentPos, code, out, tmpoutpos); + break; + case 40: + encode40(in, currentPos, code, out, tmpoutpos); + break; + case 41: + encode41(in, currentPos, code, out, tmpoutpos); + break; + case 42: + encode42(in, currentPos, code, out, tmpoutpos); + break; + case 43: + encode43(in, currentPos, code, out, tmpoutpos); + break; + case 44: + encode44(in, currentPos, code, out, tmpoutpos); + break; + case 45: + encode45(in, currentPos, code, out, tmpoutpos); + break; + case 46: + encode46(in, currentPos, code, out, tmpoutpos); + break; + case 47: + encode47(in, currentPos, code, out, tmpoutpos); + break; + case 48: + encode48(in, currentPos, code, out, tmpoutpos); + break; + case 49: + encode49(in, currentPos, code, out, tmpoutpos); + break; + case 50: + encode50(in, currentPos, code, out, tmpoutpos); + break; + case 51: + encode51(in, currentPos, code, out, tmpoutpos); + break; + case 52: + encode52(in, currentPos, code, out, tmpoutpos); + break; + case 53: + encode53(in, currentPos, code, out, tmpoutpos); + break; + case 54: + encode54(in, currentPos, code, out, tmpoutpos); + break; + case 55: + encode55(in, currentPos, code, out, tmpoutpos); + break; + case 56: + encode56(in, currentPos, code, out, tmpoutpos); + break; + case 57: + encode57(in, currentPos, code, out, tmpoutpos); + break; + case 58: + encode58(in, currentPos, code, out, tmpoutpos); + break; + case 59: + encode59(in, currentPos, code, out, tmpoutpos); + break; + case 60: + encode60(in, currentPos, code, out, tmpoutpos); + break; + case 61: + encode61(in, currentPos, code, out, tmpoutpos); + break; + case 62: + encode62(in, currentPos, code, out, tmpoutpos); + break; + case 63: + encode63(in, currentPos, code, out, tmpoutpos); + break; + case 64: + encode64(in, currentPos, code, out, tmpoutpos); + break; + case 65: + encode65(in, currentPos, code, out, tmpoutpos); + break; + case 66: + encode66(in, currentPos, code, out, tmpoutpos); + break; + case 67: + encode67(in, currentPos, code, out, tmpoutpos); + break; + case 68: + encode68(in, currentPos, code, out, tmpoutpos); + break; + case 69: + encode69(in, currentPos, code, out, tmpoutpos); + break; + case 70: + encode70(in, currentPos, code, out, tmpoutpos); + break; + case 71: + encode71(in, currentPos, code, out, tmpoutpos); + break; + case 72: + encode72(in, currentPos, code, out, tmpoutpos); + break; + case 73: + encode73(in, currentPos, code, out, tmpoutpos); + break; + case 74: + encode74(in, currentPos, code, out, tmpoutpos); + break; + case 75: + encode75(in, currentPos, code, out, tmpoutpos); + break; + case 76: + encode76(in, currentPos, code, out, tmpoutpos); + break; + case 77: + encode77(in, currentPos, code, out, tmpoutpos); + break; + case 78: + encode78(in, currentPos, code, out, tmpoutpos); + break; + case 79: + encode79(in, currentPos, code, out, tmpoutpos); + break; + case 80: + encode80(in, currentPos, code, out, tmpoutpos); + break; + default: + throw new RuntimeException("unsupported code"); + }// end switch + tmpoutpos += 2; + currentPos = nextCurrentPos; + } + + outer: while (currentPos < finalin) { + mainloop: for (int selector = 0; selector < 8; selector++) { + int res = 0; + int compressedNum = codeNum[selector]; + if (finalin <= currentPos + compressedNum - 1) + compressedNum = finalin - currentPos; + int b = bitLength[selector]; + int max = 1 << b; + int i = 0; + for (; i < compressedNum; i++) { + if (Util.smallerorequalthan(max, in[currentPos + i])) + continue mainloop; + res = (res << b) + in[currentPos + i]; + } + if (compressedNum != codeNum[selector]) { + res <<= (codeNum[selector] - compressedNum) * b; + } + res |= selector << 28; + out[tmpoutpos++] = res; + + currentPos += compressedNum; + continue outer; + } + final int selector = 8; + out[tmpoutpos++] = in[currentPos++] | (selector << 28); + } + inpos.set(currentPos); + outpos.set(tmpoutpos); } + @Override + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num) { + int currentPos = outpos.get(); + int tmpinpos = inpos.get(); + final int finalout = currentPos + num; + while (currentPos < finalout - 2 * 28) { - private final static int bitLength[] = { 1, 2, 3, 4, 5, 7, 9, 14, 28 }; + int val = in[tmpinpos++]; + int valn = in[tmpinpos++]; + int header = val >>> 24; + switch (header) { + case 0: { + decode0(val, valn, out, currentPos); + currentPos+=56; + break; + } + case 1: { + decode1(val, valn, out, currentPos); + currentPos+=42; + break; + } + case 2: { + decode2(val, valn, out, currentPos); + currentPos+=37; + break; + } + case 3: { + decode3(val, valn, out, currentPos); + currentPos+=35; + break; + } + case 4: { + decode4(val, valn, out, currentPos); + currentPos+=33; + break; + } + case 5: { + decode5(val, valn, out, currentPos); + currentPos+=32; + break; + } + case 6: { + decode6(val, valn, out, currentPos); + currentPos+=31; + break; + } + case 7: { + decode7(val, valn, out, currentPos); + currentPos+=30; + break; + } + case 8: { + decode8(val, valn, out, currentPos); + currentPos+=29; + break; + } + case 9: { + decode9(val, valn, out, currentPos); + currentPos+=42; + break; + } + case 10: { + decode10(val, valn, out, currentPos); + currentPos+=28; + break; + } + case 11: { + decode11(val, valn, out, currentPos); + currentPos+=23; + break; + } + case 12: { + decode12(val, valn, out, currentPos); + currentPos+=21; + break; + } + case 13: { + decode13(val, valn, out, currentPos); + currentPos+=19; + break; + } + case 14: { + decode14(val, valn, out, currentPos); + currentPos+=18; + break; + } + case 15: { + decode15(val, valn, out, currentPos); + currentPos+=17; + break; + } + case 16: { + decode16(val, valn, out, currentPos); + currentPos+=16; + break; + } + case 17: { + decode17(val, valn, out, currentPos); + currentPos+=15; + break; + } + case 18: { + decode18(val, valn, out, currentPos); + currentPos+=37; + break; + } + case 19: { + decode19(val, valn, out, currentPos); + currentPos+=23; + break; + } + case 20: { + decode20(val, valn, out, currentPos); + currentPos+=18; + break; + } + case 21: { + decode21(val, valn, out, currentPos); + currentPos+=16; + break; + } + case 22: { + decode22(val, valn, out, currentPos); + currentPos+=14; + break; + } + case 23: { + decode23(val, valn, out, currentPos); + currentPos+=13; + break; + } + case 24: { + decode24(val, valn, out, currentPos); + currentPos+=12; + break; + } + case 25: { + decode25(val, valn, out, currentPos); + currentPos+=11; + break; + } + case 26: { + decode26(val, valn, out, currentPos); + currentPos+=10; + break; + } + case 27: { + decode27(val, valn, out, currentPos); + currentPos+=35; + break; + } + case 28: { + decode28(val, valn, out, currentPos); + currentPos+=21; + break; + } + case 29: { + decode29(val, valn, out, currentPos); + currentPos+=16; + break; + } + + case 30: { + decode30(val, valn, out, currentPos); + currentPos+=14; + break; + } + case 31: { + decode31(val, valn, out, currentPos); + currentPos+=12; + break; + } + case 32: { + decode32(val, valn, out, currentPos); + currentPos+=11; + break; + } + case 33: { + decode33(val, valn, out, currentPos); + currentPos+=10; + break; + } + case 34: { + decode34(val, valn, out, currentPos); + currentPos+=9; + break; + } + case 35: { + decode35(val, valn, out, currentPos); + currentPos+=8; + break; + } + case 36: { + decode36(val, valn, out, currentPos); + currentPos+=33; + break; + } + case 37: { + decode37(val, valn, out, currentPos); + currentPos+=19; + break; + } + case 38: { + decode38(val, valn, out, currentPos); + currentPos+=14; + break; + } + case 39: { + decode39(val, valn, out, currentPos); + currentPos+=12; + break; + } + case 40: { + decode40(val, valn, out, currentPos); + currentPos+=10; + break; + } + case 41: { + decode41(val, valn, out, currentPos); + currentPos+=9; + break; + } + case 42: { + decode42(val, valn, out, currentPos); + currentPos+=8; + break; + } + case 43: { + decode43(val, valn, out, currentPos); + currentPos+=7; + break; + } + case 44: { + decode44(val, valn, out, currentPos); + currentPos+=6; + break; + } + case 45: { + decode45(val, valn, out, currentPos); + currentPos+=32; + break; + } + case 46: { + decode46(val, valn, out, currentPos); + currentPos+=18; + break; + } + case 47: { + decode47(val, valn, out, currentPos); + currentPos+=13; + break; + } + case 48: { + decode48(val, valn, out, currentPos); + currentPos+=11; + break; + } + case 49: { + decode49(val, valn, out, currentPos); + currentPos+=9; + break; + } + case 50: { + decode50(val, valn, out, currentPos); + currentPos+=8; + break; + } + case 51: { + decode51(val, valn, out, currentPos); + currentPos+=7; + break; + } + case 52: { + decode52(val, valn, out, currentPos); + currentPos+=6; + break; + } + case 53: { + decode53(val, valn, out, currentPos); + currentPos+=5; + break; + } + case 54: { + decode54(val, valn, out, currentPos); + currentPos+=31; + break; + } + case 55: { + decode55(val, valn, out, currentPos); + currentPos+=17; + break; + } + case 56: { + decode56(val, valn, out, currentPos); + currentPos+=12; + break; + } + case 57: { + decode57(val, valn, out, currentPos); + currentPos+=10; + break; + } + case 58: { + decode58(val, valn, out, currentPos); + currentPos+=8; + break; + } + case 59: { + decode59(val, valn, out, currentPos); + currentPos+=7; + break; + } + case 60: { + decode60(val, valn, out, currentPos); + currentPos+=6; + break; + } + case 61: { + decode61(val, valn, out, currentPos); + currentPos+=5; + break; + } + case 62: { + decode62(val, valn, out, currentPos); + currentPos+=4; + break; + } + case 63: { + decode63(val, valn, out, currentPos); + currentPos+=30; + break; + } + case 64: { + decode64(val, valn, out, currentPos); + currentPos+=16; + break; + } + case 65: { + decode65(val, valn, out, currentPos); + currentPos+=11; + break; + } + case 66: { + decode66(val, valn, out, currentPos); + currentPos+=9; + break; + } + case 67: { + decode67(val, valn, out, currentPos); + currentPos+=7; + break; + } + case 68: { + decode68(val, valn, out, currentPos); + currentPos+=6; + break; + } + case 69: { + decode69(val, valn, out, currentPos); + currentPos+=5; + break; + } + case 70: { + decode70(val, valn, out, currentPos); + currentPos+=4; + break; + } + case 71: { + decode71(val, valn, out, currentPos); + currentPos+=3; + break; + } + case 72: { + decode72(val, valn, out, currentPos); + currentPos+=29; + break; + } + case 73: { + decode73(val, valn, out, currentPos); + currentPos+=15; + break; + } + case 74: { + decode74(val, valn, out, currentPos); + currentPos+=10; + break; + } + case 75: { + decode75(val, valn, out, currentPos); + currentPos+=8; + break; + } + case 76: { + decode76(val, valn, out, currentPos); + currentPos+=6; + break; + } + case 77: { + decode77(val, valn, out, currentPos); + currentPos+=5; + break; + } + case 78: { + decode78(val, valn, out, currentPos); + currentPos+=4; + break; + } + case 79: { + decode79(val, valn, out, currentPos); + currentPos+=3; + break; + } + case 80: { + decode80(val, valn, out, currentPos); + currentPos+=2; + break; + } + default: + throw new RuntimeException("Wrong code: " + header); + }// end switch + } // end while - private final static int codeNum[] = { 28, 14, 9, 7, 5, 4, 3, 2, 1 }; + while (currentPos < finalout) { + int val = in[tmpinpos++]; + int header = val >>> 28; + switch (header) { + case 0: { // number : 28, bitwidth : 1 + final int howmany = finalout - currentPos < 28 ? finalout - currentPos : 28; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (k + 4)) >>> 31; + } + break; + } + case 1: { // number : 14, bitwidth : 2 + final int howmany = finalout - currentPos < 14 ? finalout - currentPos : 14; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (2 * k + 4)) >>> 30; + } + break; + } + case 2: { // number : 9, bitwidth : 3 + final int howmany = finalout - currentPos < 9 ? finalout - currentPos : 9; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (3 * k + 5)) >>> 29; + } + break; + } + case 3: { // number : 7, bitwidth : 4 + final int howmany = finalout - currentPos < 7 ? finalout - currentPos : 7; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (4 * k + 4)) >>> 28; + } + break; + } + case 4: { // number : 5, bitwidth : 5 + final int howmany = finalout - currentPos < 5 ? finalout - currentPos : 5; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (5 * k + 7)) >>> 27; + } + break; + } + case 5: { // number : 4, bitwidth : 7 + final int howmany = finalout - currentPos < 4 ? finalout - currentPos : 4; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (7 * k + 4)) >>> 25; + } + break; + } + case 6: { // number : 3, bitwidth : 9 + final int howmany = finalout - currentPos < 3 ? finalout - currentPos : 3; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (9 * k + 5)) >>> 23; + } + break; + } + case 7: { // number : 2, bitwidth : 14 + final int howmany = finalout - currentPos < 2 ? finalout - currentPos : 2; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (14 * k + 4)) >>> 18; + } + break; + } + case 8: { // number : 1, bitwidth : 28 + out[currentPos++] = (val << 4) >>> 4; + break; + } + default: { + throw new RuntimeException("shouldn't happen"); + } + } + } - @Override - public String toString() { - return this.getClass().getSimpleName(); + outpos.set(finalout); + inpos.set(tmpinpos); + } } \ No newline at end of file From 5fc20a0c61881e9e870c41a4160bface7fbc1c54 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 14 Sep 2016 09:24:57 -0400 Subject: [PATCH 267/412] [maven-release-plugin] prepare release JavaFastPFOR-0.1.9 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 755e696..bfa84c0 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.1.9-SNAPSHOT + 0.1.9 jar 1.6 From 2f252d61f16185548e3d1b12eb49cf50f6e03c6e Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 14 Sep 2016 09:25:00 -0400 Subject: [PATCH 268/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bfa84c0..65d6754 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.1.9 + 0.1.10-SNAPSHOT jar 1.6 From 15fa89bff528cf6bf183e2d1dc33db5ccd5f9d15 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 7 Oct 2016 10:00:56 -0400 Subject: [PATCH 269/412] Preparing update --- .../integercompression/IntCompressor.java | 13 ++- .../UncompressibleInputException.java | 19 ++++ .../differential/IntegratedIntCompressor.java | 16 +++- .../integercompression/ResourcedTest.java | 92 +++++++++++++++++++ 4 files changed, 133 insertions(+), 7 deletions(-) create mode 100644 src/main/java/me/lemire/integercompression/UncompressibleInputException.java create mode 100644 src/test/java/me/lemire/integercompression/ResourcedTest.java diff --git a/src/main/java/me/lemire/integercompression/IntCompressor.java b/src/main/java/me/lemire/integercompression/IntCompressor.java index 5f174fd..87e7bde 100644 --- a/src/main/java/me/lemire/integercompression/IntCompressor.java +++ b/src/main/java/me/lemire/integercompression/IntCompressor.java @@ -33,13 +33,20 @@ public IntCompressor() { * * @param input array to be compressed * @return compressed array + * @throws UncompressibleInputException if the data is too poorly compressible */ public int[] compress(int[] input) { - int [] compressed = new int[input.length+1024]; + int [] compressed = new int[input.length + input.length / 100 + 1024]; compressed[0] = input.length; IntWrapper outpos = new IntWrapper(1); - codec.headlessCompress(input, new IntWrapper(0), - input.length, compressed, outpos); + try { + codec.headlessCompress(input, new IntWrapper(0), + input.length, compressed, outpos); + } catch (IndexOutOfBoundsException ioebe) { + throw new + UncompressibleInputException("Your input is too poorly compressible " + + "with the current codec : "+codec); + } compressed = Arrays.copyOf(compressed,outpos.intValue()); return compressed; } diff --git a/src/main/java/me/lemire/integercompression/UncompressibleInputException.java b/src/main/java/me/lemire/integercompression/UncompressibleInputException.java new file mode 100644 index 0000000..c490946 --- /dev/null +++ b/src/main/java/me/lemire/integercompression/UncompressibleInputException.java @@ -0,0 +1,19 @@ +package me.lemire.integercompression; + +/** + * This exception might be thrown if the input is poorly compressible. + * + */ +public class UncompressibleInputException extends RuntimeException { + + /** + * Create new exception + * @param string explanation for the exception + */ + public UncompressibleInputException(String string) { + super(string); + } + + private static final long serialVersionUID = -798583799846489873L; + +} diff --git a/src/main/java/me/lemire/integercompression/differential/IntegratedIntCompressor.java b/src/main/java/me/lemire/integercompression/differential/IntegratedIntCompressor.java index 652c018..5808bdd 100644 --- a/src/main/java/me/lemire/integercompression/differential/IntegratedIntCompressor.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedIntCompressor.java @@ -3,10 +3,13 @@ import java.util.Arrays; import me.lemire.integercompression.IntWrapper; +import me.lemire.integercompression.UncompressibleInputException; /** * This is a convenience class that wraps a codec to provide - * a "friendly" API. + * a "friendly" API. It is useful to compress sorted integers. + * If your integers are not sorted (not even nearly so), please + * consider the IntCompressor class instead. * */ public class IntegratedIntCompressor { @@ -33,14 +36,19 @@ public IntegratedIntCompressor() { * * @param input array to be compressed * @return compressed array + * @throws UncompressibleInputException if the data is too poorly compressible */ public int[] compress(int[] input) { - int [] compressed = new int[input.length+1024]; + int [] compressed = new int[input.length + input.length / 100 + 1024]; compressed[0] = input.length; IntWrapper outpos = new IntWrapper(1); IntWrapper initvalue = new IntWrapper(0); - codec.headlessCompress(input, new IntWrapper(0), - input.length, compressed, outpos, initvalue); + try { + codec.headlessCompress(input, new IntWrapper(0), input.length, compressed, outpos, initvalue); + } catch (IndexOutOfBoundsException ioebe) { + throw new UncompressibleInputException( + "Your input is too poorly compressible with the current codec : " + codec); + } compressed = Arrays.copyOf(compressed,outpos.intValue()); return compressed; } diff --git a/src/test/java/me/lemire/integercompression/ResourcedTest.java b/src/test/java/me/lemire/integercompression/ResourcedTest.java new file mode 100644 index 0000000..b4cb5aa --- /dev/null +++ b/src/test/java/me/lemire/integercompression/ResourcedTest.java @@ -0,0 +1,92 @@ +package me.lemire.integercompression; + +import java.util.ArrayList; +import java.util.Arrays; + +import me.lemire.integercompression.differential.Delta; +import me.lemire.integercompression.differential.IntegratedBinaryPacking; +import me.lemire.integercompression.differential.IntegratedByteIntegerCODEC; +import me.lemire.integercompression.differential.IntegratedComposition; +import me.lemire.integercompression.differential.IntegratedIntCompressor; +import me.lemire.integercompression.differential.IntegratedIntegerCODEC; +import me.lemire.integercompression.differential.IntegratedVariableByte; +import me.lemire.integercompression.differential.SkippableIntegratedIntegerCODEC; +import me.lemire.integercompression.differential.XorBinaryPacking; + +import java.io.BufferedReader; +import java.io.File; +import org.junit.Assert; +import java.io.FileReader; +import java.io.IOException; +import java.nio.file.*; +import java.util.stream.Stream; + +import org.junit.Test; + +/** + * Tests with resources + * + */ +public class ResourcedTest { + SkippableIntegerCODEC[] codecs = { new JustCopy(), new VariableByte(), + new SkippableComposition(new BinaryPacking(), new VariableByte()), + new SkippableComposition(new NewPFD(), new VariableByte()), + new SkippableComposition(new NewPFDS9(), new VariableByte()), + new SkippableComposition(new NewPFDS16(), new VariableByte()), + new SkippableComposition(new OptPFD(), new VariableByte()), + new SkippableComposition(new OptPFDS9(), new VariableByte()), + new SkippableComposition(new OptPFDS16(), new VariableByte()), + new SkippableComposition(new FastPFOR128(), new VariableByte()), + new SkippableComposition(new FastPFOR(), new VariableByte()), new Simple9(), new Simple16() }; + + /** + * @throws IOException + * if the resource cannot be accessed (should be considered a + * bug) + * + */ + @Test + public void IntCompressorTest() throws IOException { + // next line requires Java8? + // int[] data = + // Files.lines(Paths.get("integers.txt")).mapToInt(Integer::parseInt).toArray(); + File f = new File("src/test/resources/integers.txt"); + System.out.println("loading test data from "+ f.getAbsolutePath()); + BufferedReader bfr = new BufferedReader(new FileReader(f)); + String line; + ArrayList ai = new ArrayList(); + while ((line = bfr.readLine()) != null) { + ai.add(Integer.parseInt(line)); + } + bfr.close(); + int[] data = new int[ai.size()]; + for (int k = 0; k < data.length; ++k) + data[k] = ai.get(k).intValue(); + ai = null; + // finally! + { + IntegratedIntCompressor iic = new IntegratedIntCompressor(); + int[] compressed = iic.compress(data); + int[] recovered = iic.uncompress(compressed); + Assert.assertArrayEquals(recovered, data); + } + for (SkippableIntegerCODEC C : codecs) { + IntCompressor iic = new IntCompressor(C); + int[] compressed = iic.compress(data); + int[] recovered = iic.uncompress(compressed); + Assert.assertArrayEquals(recovered, data); + + } + for (SkippableIntegerCODEC C : codecs) { + if (C instanceof SkippableIntegratedIntegerCODEC) { + IntegratedIntCompressor iic = new IntegratedIntCompressor((SkippableIntegratedIntegerCODEC) C); + int[] compressed = iic.compress(data); + int[] recovered = iic.uncompress(compressed); + Assert.assertArrayEquals(recovered, data); + } + + } + + } + +} From 0411964b9a7824cc82ab3e6b078ed75a7e822b76 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 7 Oct 2016 10:02:24 -0400 Subject: [PATCH 270/412] Update to changelog --- CHANGELOG | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 7431667..1377346 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +0.1.10 (October 7th 2016) + - Fix for issue 36 https://github.com/lemire/JavaFastPFOR/issues/36 + 0.1.9 (September 14th 2016) - Tuning GroupSimple9 From 6804c57b6a3fc0b437f7787e1c957d3b907749ec Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 7 Oct 2016 10:04:15 -0400 Subject: [PATCH 271/412] Adding new resource file --- src/test/resources/integers.txt | 130657 +++++++++++++++++++++++++++++ 1 file changed, 130657 insertions(+) create mode 100644 src/test/resources/integers.txt diff --git a/src/test/resources/integers.txt b/src/test/resources/integers.txt new file mode 100644 index 0000000..06a56d3 --- /dev/null +++ b/src/test/resources/integers.txt @@ -0,0 +1,130657 @@ +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +15 +30 +31 +9 +32 +19 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +4 +43 +44 +45 +19 +46 +47 +48 +49 +50 +9 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +16 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +9 +12 +86 +87 +88 +89 +90 +91 +92 +10 +93 +77 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +43 +20 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +89 +129 +130 +131 +132 +133 +19 +134 +19 +135 +136 +137 +138 +139 +140 +141 +142 +143 +57 +89 +20 +43 +144 +14 +145 +32 +43 +14 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +43 +158 +159 +160 +161 +43 +162 +163 +164 +165 +57 +166 +167 +168 +169 +170 +171 +172 +19 +173 +174 +9 +175 +19 +14 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +104 +189 +190 +25 +191 +19 +4 +192 +193 +194 +195 +32 +196 +197 +198 +199 +200 +201 +202 +12 +203 +204 +205 +206 +207 +48 +208 +2 +209 +4 +164 +104 +210 +211 +212 +2 +213 +214 +215 +216 +217 +2 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +19 +12 +3 +233 +234 +235 +236 +237 +48 +238 +239 +213 +240 +241 +22 +242 +243 +244 +245 +246 +247 +248 +249 +57 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +248 +269 +270 +271 +272 +273 +3 +57 +19 +46 +274 +275 +276 +213 +277 +278 +43 +279 +280 +281 +282 +283 +283 +248 +284 +213 +213 +2 +285 +43 +32 +286 +284 +287 +288 +289 +290 +15 +291 +292 +293 +57 +294 +60 +295 +296 +297 +179 +298 +299 +29 +300 +284 +301 +302 +303 +213 +213 +304 +305 +89 +306 +307 +308 +248 +99 +309 +19 +188 +310 +311 +19 +312 +313 +314 +155 +22 +213 +248 +315 +176 +316 +317 +318 +319 +320 +19 +57 +248 +321 +322 +323 +324 +325 +43 +326 +327 +303 +328 +329 +330 +15 +248 +303 +331 +332 +333 +205 +334 +335 +14 +336 +337 +283 +43 +338 +339 +340 +341 +57 +342 +343 +337 +43 +344 +345 +346 +284 +347 +337 +348 +349 +14 +350 +46 +337 +351 +352 +286 +353 +43 +15 +354 +355 +356 +357 +358 +359 +238 +9 +360 +361 +164 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +114 +380 +15 +381 +382 +43 +383 +384 +385 +386 +387 +388 +389 +179 +390 +358 +20 +391 +392 +349 +393 +9 +394 +395 +396 +397 +14 +398 +399 +210 +32 +400 +401 +20 +402 +403 +404 +405 +406 +407 +408 +409 +345 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +14 +48 +2 +420 +421 +422 +423 +424 +425 +426 +427 +228 +428 +20 +429 +430 +431 +432 +433 +434 +435 +9 +14 +436 +25 +437 +438 +32 +439 +440 +32 +441 +442 +443 +444 +137 +345 +445 +20 +446 +447 +448 +449 +450 +451 +452 +48 +453 +454 +455 +456 +457 +458 +459 +16 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +137 +470 +17 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +15 +482 +483 +484 +317 +485 +486 +19 +487 +488 +489 +490 +2 +491 +492 +369 +493 +494 +495 +496 +497 +9 +498 +499 +32 +500 +501 +502 +213 +14 +503 +77 +504 +505 +345 +506 +507 +508 +12 +509 +20 +510 +43 +511 +512 +115 +513 +514 +515 +176 +516 +15 +517 +518 +2 +519 +3 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +19 +530 +531 +532 +155 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +345 +115 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +354 +555 +556 +357 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +541 +568 +57 +569 +14 +66 +570 +15 +109 +249 +571 +572 +15 +573 +574 +575 +576 +201 +577 +578 +579 +274 +580 +581 +582 +583 +584 +585 +196 +586 +201 +342 +587 +588 +39 +589 +590 +140 +591 +592 +593 +594 +43 +595 +596 +597 +598 +9 +286 +599 +600 +601 +228 +602 +603 +604 +200 +605 +196 +606 +607 +608 +509 +609 +610 +10 +17 +611 +248 +612 +613 +614 +197 +615 +616 +617 +618 +48 +619 +286 +620 +621 +622 +509 +623 +20 +48 +624 +9 +625 +626 +15 +627 +628 +43 +337 +629 +630 +631 +632 +43 +633 +14 +634 +635 +14 +636 +637 +2 +4 +43 +638 +639 +640 +19 +52 +641 +248 +642 +643 +644 +284 +3 +645 +2 +646 +647 +19 +648 +649 +145 +650 +43 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +196 +662 +358 +663 +345 +19 +554 +664 +528 +665 +666 +667 +331 +19 +668 +669 +670 +671 +672 +673 +155 +491 +674 +675 +676 +57 +2 +677 +678 +679 +680 +140 +398 +681 +554 +682 +14 +683 +493 +684 +597 +685 +213 +686 +687 +688 +213 +689 +4 +690 +665 +284 +691 +692 +398 +693 +694 +270 +695 +141 +19 +696 +303 +697 +19 +698 +699 +337 +248 +700 +22 +4 +701 +702 +96 +286 +703 +704 +705 +706 +237 +707 +708 +48 +57 +709 +710 +20 +48 +213 +711 +712 +713 +270 +714 +715 +284 +155 +716 +717 +718 +4 +345 +719 +720 +721 +34 +722 +20 +723 +724 +725 +726 +15 +727 +728 +729 +730 +22 +731 +732 +733 +734 +735 +736 +286 +737 +20 +738 +739 +740 +270 +19 +741 +742 +743 +744 +196 +745 +746 +747 +10 +748 +749 +665 +249 +750 +751 +155 +752 +753 +19 +754 +248 +249 +755 +756 +757 +758 +759 +760 +60 +761 +762 +763 +213 +764 +765 +766 +345 +767 +768 +707 +769 +284 +770 +771 +772 +323 +773 +774 +775 +776 +137 +777 +778 +176 +779 +780 +781 +782 +16 +783 +784 +785 +786 +43 +787 +788 +789 +232 +790 +791 +792 +793 +794 +379 +795 +2 +796 +57 +797 +798 +178 +799 +178 +188 +800 +801 +802 +803 +804 +805 +806 +141 +807 +808 +15 +809 +15 +209 +3 +810 +811 +812 +813 +814 +48 +665 +815 +286 +25 +586 +816 +34 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +32 +833 +14 +834 +835 +15 +836 +837 +20 +838 +839 +840 +137 +841 +842 +843 +844 +845 +80 +846 +847 +848 +849 +323 +208 +155 +357 +850 +851 +852 +853 +3 +284 +854 +855 +32 +856 +201 +857 +399 +858 +859 +860 +861 +2 +48 +862 +863 +864 +745 +43 +865 +866 +845 +867 +868 +869 +870 +871 +19 +872 +873 +286 +874 +875 +876 +20 +877 +878 +879 +880 +201 +323 +881 +882 +883 +884 +885 +43 +886 +35 +887 +25 +888 +889 +890 +19 +891 +892 +893 +894 +895 +896 +48 +897 +898 +899 +900 +57 +901 +902 +903 +904 +566 +43 +905 +906 +907 +908 +32 +909 +99 +15 +910 +911 +721 +912 +913 +914 +915 +916 +917 +918 +554 +564 +919 +920 +317 +564 +921 +922 +923 +924 +10 +925 +665 +926 +10 +201 +927 +928 +929 +930 +931 +932 +933 +10 +934 +201 +20 +935 +936 +416 +937 +936 +938 +357 +19 +939 +940 +941 +942 +943 +249 +201 +554 +944 +945 +946 +77 +2 +947 +948 +949 +950 +951 +952 +9 +953 +954 +955 +956 +741 +957 +958 +959 +677 +960 +80 +43 +196 +961 +57 +962 +963 +354 +964 +658 +965 +966 +967 +968 +969 +970 +971 +286 +14 +2 +19 +972 +973 +974 +975 +976 +22 +977 +978 +979 +980 +981 +982 +983 +77 +984 +985 +986 +17 +2 +987 +155 +20 +34 +988 +989 +43 +990 +991 +9 +992 +993 +14 +994 +19 +115 +995 +57 +996 +3 +720 +997 +437 +2 +998 +999 +1000 +1001 +184 +1002 +1003 +1004 +15 +1005 +1006 +1007 +1008 +34 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +67 +910 +1017 +1018 +1019 +19 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +32 +19 +1027 +1028 +1029 +140 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +165 +1041 +1042 +1043 +1044 +658 +1045 +4 +1046 +14 +1047 +1048 +1049 +1050 +9 +34 +1051 +1052 +1053 +713 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +76 +1061 +1062 +19 +1063 +1064 +9 +1065 +736 +345 +1066 +15 +1067 +428 +1068 +1069 +286 +1070 +1071 +1072 +1073 +1074 +185 +1075 +1076 +57 +1077 +179 +1078 +1079 +703 +14 +1080 +1081 +491 +1082 +57 +1083 +1084 +1085 +1086 +1087 +1088 +788 +1089 +17 +1090 +1091 +1092 +1093 +1094 +692 +1095 +43 +1096 +180 +9 +19 +1097 +57 +14 +1098 +1099 +1100 +1101 +1102 +188 +1103 +1104 +89 +22 +1105 +286 +1106 +1107 +1108 +1109 +658 +1110 +1111 +1112 +1113 +1114 +1115 +57 +33 +1116 +373 +1117 +20 +1118 +32 +959 +179 +1119 +17 +114 +1120 +77 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +713 +57 +60 +671 +109 +1131 +1132 +57 +1133 +1134 +14 +1135 +1136 +1137 +301 +1138 +228 +1139 +249 +1140 +1141 +10 +137 +1142 +927 +1143 +1144 +43 +57 +464 +1145 +1146 +1147 +1148 +1149 +286 +1150 +1151 +1152 +19 +379 +1153 +20 +9 +1154 +32 +200 +1155 +1156 +1157 +16 +222 +1158 +358 +1082 +32 +1159 +1082 +1160 +1161 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +677 +915 +1170 +1171 +1172 +1173 +1174 +20 +1175 +1176 +15 +1177 +1178 +19 +1179 +1180 +323 +1181 +15 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1013 +1190 +237 +1191 +1192 +210 +1193 +4 +658 +1194 +1195 +32 +548 +201 +248 +19 +112 +1196 +1197 +1198 +1199 +323 +1200 +1112 +112 +910 +1201 +286 +707 +1202 +57 +1203 +1204 +317 +1205 +1206 +43 +1207 +15 +303 +1208 +15 +14 +1209 +1021 +1210 +1211 +1212 +43 +1213 +303 +1214 +19 +279 +9 +1215 +1216 +1217 +1218 +1219 +1220 +1221 +1011 +1222 +1105 +32 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +43 +1231 +284 +1232 +10 +4 +1233 +43 +349 +19 +845 +43 +1234 +1235 +213 +1236 +248 +493 +141 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +35 +284 +1245 +19 +14 +284 +1246 +1247 +1248 +57 +1249 +1224 +20 +32 +1250 +19 +57 +379 +274 +32 +1251 +337 +1252 +213 +1253 +1254 +1255 +43 +91 +323 +201 +1256 +1257 +1258 +1259 +196 +1260 +1261 +3 +19 +1262 +1263 +15 +20 +48 +1264 +99 +42 +303 +1265 +1266 +1267 +345 +1268 +770 +370 +1269 +1270 +10 +239 +1271 +1272 +15 +1273 +1274 +1275 +1276 +1277 +141 +1278 +1279 +1280 +1281 +849 +1282 +278 +1283 +1284 +464 +373 +1285 +303 +1286 +345 +10 +15 +509 +1287 +1262 +1288 +862 +286 +1289 +1290 +1291 +1292 +809 +514 +1047 +583 +1293 +3 +337 +1294 +201 +484 +1295 +1296 +1297 +1298 +1299 +1300 +237 +1301 +209 +1302 +1303 +872 +1304 +1305 +1306 +4 +1307 +15 +393 +15 +15 +57 +1308 +1309 +1310 +19 +1311 +910 +1312 +1313 +1314 +1315 +322 +20 +1316 +1317 +1318 +1319 +1300 +2 +15 +1320 +10 +699 +1321 +1322 +1323 +1324 +337 +57 +1325 +1326 +1327 +417 +1328 +1329 +32 +1330 +1331 +1021 +286 +1332 +533 +284 +1333 +1334 +1335 +57 +184 +1336 +822 +398 +1337 +1338 +57 +57 +20 +1339 +1340 +1341 +14 +1342 +1300 +1343 +1344 +1345 +155 +15 +1346 +269 +248 +1347 +1348 +2 +1349 +1350 +1048 +1351 +1352 +222 +303 +1353 +1354 +1355 +705 +1356 +1357 +43 +1358 +1359 +1360 +134 +1186 +1361 +1362 +1047 +188 +1363 +164 +1364 +1365 +1366 +32 +1367 +1368 +1369 +2 +22 +1370 +1371 +1372 +358 +842 +1373 +849 +1374 +15 +2 +1375 +1376 +1377 +1378 +1379 +790 +123 +201 +1380 +1381 +1382 +1383 +1384 +1385 +9 +1386 +1387 +1388 +1389 +1390 +9 +155 +1391 +1392 +1393 +1394 +1395 +281 +286 +1396 +1397 +1398 +1399 +1400 +1401 +725 +721 +1402 +1403 +89 +1404 +32 +15 +1405 +1406 +1407 +1408 +1409 +1410 +9 +1411 +317 +46 +1412 +1413 +1414 +1415 +1416 +352 +188 +1417 +1418 +647 +188 +1419 +1420 +1421 +1422 +1423 +43 +1424 +1091 +1425 +1426 +1427 +89 +1428 +1429 +1430 +1431 +77 +43 +1432 +1433 +862 +1434 +1435 +9 +495 +1436 +48 +1437 +1438 +554 +1439 +1440 +32 +971 +1441 +1425 +1442 +1443 +802 +155 +1444 +1445 +1446 +711 +1447 +1448 +57 +1449 +1450 +872 +1451 +1452 +1453 +1454 +1455 +249 +15 +1456 +1457 +1458 +43 +1459 +9 +1460 +1461 +1462 +1463 +1464 +501 +1465 +14 +1466 +1467 +1468 +1469 +1470 +1471 +1472 +1473 +43 +1474 +1475 +1476 +345 +1477 +1478 +1479 +1480 +1481 +1482 +696 +1483 +1484 +1485 +1486 +1487 +32 +1488 +248 +1489 +1490 +1491 +1492 +849 +1493 +228 +1494 +1495 +48 +17 +1496 +19 +286 +1497 +1498 +1499 +1500 +1501 +1502 +111 +10 +1503 +1504 +1384 +1505 +1506 +1507 +1508 +284 +1509 +1510 +331 +1511 +1512 +1396 +213 +32 +1513 +1514 +1515 +248 +1516 +4 +1517 +337 +1518 +244 +1519 +20 +1520 +1300 +1521 +1522 +1523 +43 +1524 +1525 +1526 +1245 +32 +32 +1527 +1528 +43 +597 +1465 +1465 +1364 +1529 +1530 +1531 +1437 +554 +188 +1532 +43 +1533 +958 +1534 +317 +1535 +1536 +1537 +1538 +528 +1384 +1539 +1540 +1541 +1542 +22 +597 +1543 +14 +1544 +19 +19 +1245 +1545 +1546 +1547 +1548 +1444 +1082 +14 +1549 +19 +70 +10 +1550 +57 +178 +1551 +1552 +1553 +1554 +1555 +15 +1556 +1557 +1558 +188 +845 +1559 +1560 +1561 +1562 +1563 +1564 +398 +1565 +1566 +1567 +178 +1568 +25 +9 +1077 +1021 +43 +1569 +1570 +1571 +1572 +1573 +989 +1212 +245 +1574 +1575 +1576 +286 +1577 +1578 +828 +1579 +1580 +1574 +9 +1581 +648 +237 +179 +1582 +1425 +193 +1583 +1584 +1234 +1569 +57 +1585 +1586 +713 +1587 +1588 +1224 +20 +1589 +138 +845 +1590 +1591 +1592 +1593 +43 +1594 +658 +1595 +1011 +1596 +1597 +1598 +1599 +15 +1600 +1601 +1149 +1602 +1603 +1604 +1605 +1606 +1607 +1608 +1609 +57 +178 +1610 +1251 +43 +1042 +738 +1611 +9 +1612 +1613 +1614 +43 +1615 +1580 +1452 +1616 +1617 +286 +1618 +1619 +1620 +1621 +1622 +1623 +1624 +1625 +842 +349 +1626 +213 +966 +1627 +822 +1628 +1629 +1630 +1631 +201 +1632 +1633 +1634 +1635 +1636 +1637 +19 +1638 +57 +12 +2 +178 +1639 +16 +15 +1640 +57 +1641 +1642 +1643 +1644 +1645 +1646 +303 +1647 +1648 +936 +19 +1649 +1650 +1651 +317 +1652 +213 +349 +1653 +365 +1654 +1655 +436 +1376 +1656 +1657 +1658 +1659 +1660 +1661 +1662 +38 +34 +14 +1663 +1664 +248 +1665 +32 +1666 +19 +1667 +284 +1668 +1669 +1670 +1671 +48 +1672 +57 +286 +1673 +274 +1674 +1675 +20 +1596 +1676 +57 +1677 +1678 +1679 +1680 +1681 +703 +1682 +1683 +213 +1684 +1685 +1686 +442 +43 +1220 +373 +1687 +1688 +1689 +1690 +1691 +1692 +1217 +379 +597 +15 +1693 +43 +1694 +248 +1262 +446 +48 +15 +536 +586 +402 +1695 +1696 +1697 +337 +1698 +22 +1699 +115 +1700 +1701 +1702 +1703 +1704 +20 +491 +1705 +1107 +1706 +34 +1707 +1708 +1149 +1709 +15 +1710 +1711 +1712 +1713 +57 +15 +1714 +1715 +14 +284 +1454 +764 +1716 +2 +1717 +1718 +1719 +358 +1720 +1721 +1722 +1723 +1724 +1425 +1725 +1726 +19 +43 +1727 +14 +1728 +1524 +586 +528 +305 +703 +1729 +1730 +337 +1731 +1732 +795 +1733 +1734 +1735 +1736 +286 +1737 +1738 +179 +1739 +152 +1740 +1741 +1742 +20 +1743 +1744 +1745 +1746 +1425 +654 +1747 +648 +495 +1112 +1748 +1749 +10 +1750 +1751 +1752 +1753 +201 +1754 +430 +1755 +1756 +1757 +2 +790 +15 +1758 +48 +1759 +1760 +1761 +1762 +114 +872 +1763 +1764 +201 +416 +1765 +1317 +1766 +1767 +936 +1768 +1769 +1770 +1771 +1772 +1773 +1774 +1234 +1775 +981 +1776 +1777 +1778 +1779 +1780 +1781 +1782 +1783 +1310 +665 +1784 +1785 +15 +1786 +1787 +345 +358 +1788 +29 +1789 +317 +43 +15 +9 +1790 +491 +1791 +415 +1792 +316 +9 +566 +1793 +43 +188 +1794 +1243 +1743 +1795 +155 +1796 +554 +1797 +208 +1798 +514 +1799 +32 +1800 +1801 +1802 +741 +1803 +1804 +1805 +201 +1806 +1807 +1808 +1809 +1300 +1810 +1100 +1811 +442 +1812 +1813 +276 +286 +32 +19 +1425 +1814 +354 +201 +1815 +237 +1816 +1817 +43 +1818 +19 +323 +34 +1819 +1820 +1821 +1822 +1823 +1824 +1825 +36 +1826 +1827 +1828 +1829 +1830 +1823 +1831 +1832 +1833 +1834 +201 +1835 +1836 +142 +1837 +1838 +1839 +1840 +1841 +411 +411 +1842 +1843 +1844 +1845 +369 +1300 +1846 +1847 +357 +1848 +586 +1849 +1850 +1851 +1852 +1853 +1854 +1855 +1856 +1857 +1858 +1859 +15 +1860 +1861 +1862 +1863 +1864 +284 +16 +1865 +1866 +1867 +1868 +1869 +1465 +1870 +1871 +1872 +15 +1873 +1874 +1875 +1876 +1877 +1878 +1879 +1880 +822 +1881 +14 +286 +14 +9 +1882 +1883 +1884 +1885 +14 +1886 +77 +3 +1887 +1888 +286 +14 +1889 +1890 +1100 +1891 +14 +1892 +1893 +1894 +15 +1895 +1896 +554 +43 +1897 +1010 +48 +1898 +708 +1899 +1208 +43 +1900 +1169 +1100 +1901 +1902 +1903 +299 +53 +66 +15 +1904 +1905 +1906 +1907 +1908 +16 +1909 +10 +1910 +671 +1369 +1465 +1911 +1912 +1913 +1655 +1914 +1915 +1916 +104 +1083 +1917 +213 +4 +1918 +1287 +1919 +213 +1920 +39 +1921 +1922 +1923 +43 +201 +1924 +1925 +1926 +43 +43 +1927 +1928 +112 +1929 +1930 +358 +1931 +248 +1932 +1933 +1934 +354 +694 +1907 +1935 +9 +213 +1936 +1937 +1938 +1939 +1940 +20 +178 +1941 +32 +20 +1942 +43 +1943 +1944 +35 +43 +1945 +286 +1946 +276 +1947 +1948 +1949 +1950 +19 +1951 +284 +1952 +14 +337 +1524 +1953 +713 +1513 +1954 +248 +284 +1149 +1955 +1956 +201 +1957 +1958 +1959 +43 +53 +1960 +1961 +1962 +1963 +1091 +1964 +303 +1965 +1966 +1863 +2 +1967 +1968 +1969 +354 +1970 +1971 +99 +1021 +1972 +665 +284 +1973 +1386 +286 +337 +1974 +1975 +1976 +1977 +1978 +1979 +269 +9 +1980 +1981 +337 +32 +1982 +1983 +1984 +713 +1985 +1986 +99 +176 +19 +910 +597 +303 +303 +1987 +1988 +1989 +1990 +32 +1991 +1992 +303 +213 +201 +1993 +237 +1994 +1995 +492 +1996 +155 +761 +1997 +1998 +1999 +2000 +2001 +2002 +2003 +2004 +2005 +2006 +2007 +2008 +2009 +1566 +1224 +1234 +99 +2010 +22 +2011 +936 +2012 +2013 +2014 +2015 +2016 +2017 +590 +2018 +2019 +2020 +15 +43 +2021 +415 +2022 +576 +10 +15 +1543 +48 +2023 +2024 +1684 +2025 +2026 +2027 +2028 +2029 +284 +2030 +248 +2031 +2032 +2033 +2034 +2035 +43 +2036 +2037 +2038 +2039 +2040 +57 +2041 +2042 +2043 +2044 +713 +188 +2045 +694 +586 +1221 +286 +2046 +2047 +2048 +1502 +2049 +554 +2050 +32 +2051 +249 +916 +2052 +2053 +2054 +38 +43 +2055 +2056 +2057 +910 +2058 +2059 +491 +2060 +2061 +170 +2062 +2063 +22 +2064 +2065 +270 +2066 +2067 +2040 +201 +2068 +32 +1542 +2069 +554 +2070 +19 +2071 +2072 +2073 +2074 +2075 +2076 +845 +2077 +201 +2078 +2079 +15 +2080 +77 +12 +2081 +2082 +2083 +57 +694 +2084 +345 +89 +597 +1047 +2085 +867 +2086 +2087 +2088 +1386 +2089 +14 +2090 +2091 +2092 +201 +2093 +373 +10 +764 +2094 +2095 +2096 +2097 +1584 +46 +2098 +9 +2099 +2100 +286 +89 +2101 +2102 +2103 +2104 +2105 +2106 +2107 +2108 +245 +2109 +179 +597 +2110 +1131 +2111 +25 +2112 +665 +2113 +201 +201 +2114 +2115 +2116 +197 +2117 +2118 +2119 +2120 +80 +2121 +176 +2122 +509 +1502 +2123 +2124 +179 +1502 +1047 +2125 +1698 +2126 +2127 +2128 +43 +2129 +2130 +2131 +2132 +2133 +1585 +2134 +2135 +573 +2136 +2137 +2138 +2139 +536 +2140 +2141 +2142 +647 +222 +2143 +2144 +2145 +2146 +2147 +89 +2148 +176 +2149 +2150 +2151 +22 +2152 +2153 +15 +2154 +286 +76 +2155 +2156 +77 +2157 +1522 +2158 +283 +36 +48 +1415 +178 +19 +1533 +1655 +2159 +2160 +43 +2161 +99 +2162 +2163 +2164 +2165 +1169 +2166 +3 +2167 +25 +2168 +138 +2169 +2170 +43 +1514 +2171 +2172 +188 +2173 +2174 +231 +1234 +2175 +21 +155 +2176 +2177 +2178 +2179 +2180 +2181 +2182 +2183 +2184 +2185 +2186 +2187 +2188 +2189 +2190 +2191 +10 +2192 +43 +2193 +2194 +179 +647 +77 +2009 +99 +2195 +2196 +2197 +19 +2198 +2199 +989 +2200 +238 +2201 +286 +2202 +1019 +2203 +22 +2204 +2205 +2206 +209 +188 +2207 +20 +2208 +2209 +155 +2210 +35 +2211 +2212 +15 +48 +2213 +155 +519 +2214 +2215 +3 +2216 +2217 +14 +1010 +2218 +345 +179 +2219 +2220 +188 +2221 +2222 +1091 +57 +2223 +2224 +2225 +2226 +2227 +2228 +2229 +2230 +2231 +201 +2232 +2233 +286 +2234 +2235 +237 +2236 +155 +292 +2237 +10 +791 +2238 +43 +20 +2239 +2240 +2241 +2242 +2243 +2244 +15 +2245 +196 +201 +379 +77 +2246 +2247 +1169 +16 +2248 +2249 +910 +2250 +2251 +9 +2252 +2253 +2254 +48 +2255 +2256 +1100 +2257 +2258 +2259 +2260 +2261 +2262 +2263 +2264 +2185 +2260 +2265 +2266 +57 +2267 +2268 +2269 +491 +89 +2270 +430 +541 +2271 +222 +616 +2272 +2273 +2274 +2275 +713 +2276 +700 +2277 +2278 +48 +2279 +77 +2280 +2281 +2282 +2283 +2284 +19 +43 +201 +15 +2285 +2286 +2287 +2288 +10 +2289 +616 +2290 +586 +2291 +398 +2292 +2293 +2294 +2295 +48 +2296 +411 +2297 +25 +349 +2298 +2299 +1829 +2300 +14 +15 +2301 +10 +2302 +1245 +2303 +2304 +19 +2305 +29 +2306 +598 +2307 +2308 +2309 +1765 +4 +815 +9 +2310 +345 +228 +741 +2311 +2 +2312 +2313 +19 +32 +2314 +2315 +2316 +1529 +590 +1116 +2317 +2318 +2319 +2320 +2321 +2322 +2 +2323 +2324 +2325 +2326 +2327 +2328 +179 +22 +2329 +2330 +2331 +2332 +2333 +2334 +201 +57 +2335 +1775 +2336 +2337 +188 +25 +2338 +14 +2339 +2340 +2341 +2342 +2343 +2344 +2345 +2346 +2347 +2348 +2349 +2042 +57 +2350 +2351 +2352 +2353 +2354 +2355 +35 +176 +2356 +2357 +155 +2358 +2359 +2360 +369 +20 +2361 +9 +1710 +1203 +369 +34 +2362 +57 +34 +2363 +2364 +2365 +536 +2366 +2367 +694 +2368 +2369 +43 +2370 +910 +2371 +141 +2372 +2373 +43 +2374 +2375 +25 +2376 +2377 +2378 +286 +2379 +2380 +19 +286 +2381 +2382 +2383 +20 +2384 +2385 +2386 +2387 +2388 +57 +2197 +3 +2389 +790 +165 +2390 +2391 +15 +1458 +2341 +741 +201 +710 +1038 +43 +2392 +2393 +2394 +188 +484 +2395 +1012 +2396 +2397 +4 +2398 +2399 +2400 +155 +2401 +2402 +283 +3 +2403 +2404 +2405 +2406 +2407 +2408 +209 +238 +2409 +179 +2410 +2411 +2412 +43 +11 +2413 +2414 +2415 +2416 +2417 +2418 +1082 +9 +2419 +2 +2420 +2421 +2422 +2423 +2424 +2425 +2426 +2427 +1364 +2428 +2429 +14 +2430 +43 +176 +201 +2431 +354 +9 +1049 +35 +2432 +2433 +1680 +57 +2434 +104 +2435 +2 +1765 +2135 +411 +397 +2436 +2437 +2438 +2439 +663 +2440 +1454 +43 +2441 +989 +1508 +32 +2442 +2443 +2281 +283 +564 +2444 +436 +155 +2445 +2446 +283 +188 +2447 +15 +2448 +2449 +1765 +2450 +491 +2451 +2452 +2453 +2454 +2455 +2456 +1710 +15 +1809 +43 +2457 +2458 +20 +2459 +2460 +2461 +14 +2462 +2410 +1385 +2463 +2464 +2465 +1790 +1436 +2466 +2467 +2468 +188 +35 +2140 +2469 +2399 +2470 +14 +2471 +2472 +19 +2473 +2474 +741 +1415 +9 +2475 +2476 +16 +2477 +2478 +34 +43 +2479 +2480 +14 +2481 +57 +10 +14 +2482 +554 +2483 +30 +2484 +416 +828 +1425 +2485 +155 +2486 +2487 +672 +2488 +19 +2489 +1124 +665 +2490 +19 +57 +2491 +2410 +2492 +707 +2493 +60 +249 +495 +286 +738 +2494 +16 +2495 +2496 +2497 +57 +2498 +1683 +2499 +815 +2500 +89 +188 +2501 +1867 +2502 +915 +237 +2503 +597 +2504 +2505 +19 +2506 +2507 +2508 +2509 +2510 +2511 +2512 +2513 +60 +2514 +2515 +19 +10 +2260 +2516 +2517 +2518 +2519 +2520 +2521 +99 +35 +2522 +788 +2523 +2524 +2525 +2526 +2527 +2528 +19 +1212 +2529 +2530 +2531 +2532 +201 +1425 +2533 +2534 +2535 +2536 +2537 +10 +272 +2538 +2539 +2540 +66 +2541 +10 +2122 +2542 +323 +2543 +2544 +48 +2545 +1248 +20 +2546 +2547 +1994 +2548 +2549 +2550 +671 +2551 +2552 +48 +1112 +222 +1175 +48 +2553 +2554 +2555 +1384 +43 +2556 +245 +2557 +2558 +2559 +1013 +2560 +201 +2561 +2562 +15 +15 +2563 +2564 +2565 +2566 +2567 +1901 +2568 +1286 +397 +2569 +2570 +2571 +155 +2572 +2287 +259 +179 +2573 +2574 +2575 +2576 +342 +2577 +2578 +286 +2579 +20 +34 +1559 +32 +2580 +989 +2581 +694 +1134 +2582 +2583 +2584 +2585 +484 +297 +2430 +2586 +2587 +105 +373 +2588 +2589 +3 +15 +2590 +2591 +2592 +2593 +2594 +705 +2595 +2596 +57 +2015 +2597 +2598 +2599 +188 +228 +2600 +2601 +1300 +2602 +2603 +2604 +2605 +2606 +1085 +12 +677 +2607 +1578 +2608 +2609 +2610 +1578 +57 +2611 +2612 +2613 +379 +1502 +2614 +2615 +1013 +493 +2616 +491 +671 +2617 +9 +15 +2618 +2 +2619 +2620 +15 +2 +2621 +2622 +457 +2623 +2624 +43 +14 +2625 +696 +2308 +2626 +2627 +2628 +2629 +137 +1870 +2630 +554 +237 +2631 +2632 +2633 +2634 +2635 +2636 +2637 +2638 +2639 +2640 +1291 +1855 +201 +286 +2641 +38 +2642 +2643 +2644 +57 +2645 +2547 +2646 +2318 +222 +345 +19 +104 +2647 +2648 +369 +2649 +342 +2650 +358 +43 +2651 +2652 +301 +677 +2653 +1047 +2654 +57 +845 +2655 +1107 +2656 +2657 +859 +2658 +2659 +123 +2660 +2661 +2662 +14 +1913 +32 +668 +2430 +2663 +2664 +274 +354 +2665 +1992 +2666 +2667 +2668 +2669 +2670 +180 +2671 +1822 +19 +2672 +2673 +22 +402 +2674 +32 +2675 +201 +2676 +2677 +2678 +2655 +2679 +2680 +138 +2681 +2682 +2121 +9 +2683 +286 +397 +2684 +2685 +2686 +770 +34 +2687 +2688 +1870 +2689 +2690 +2686 +554 +43 +286 +19 +2691 +2692 +2693 +1310 +2694 +2695 +2696 +1051 +2697 +2698 +19 +57 +2699 +791 +2700 +2701 +2702 +2703 +188 +2058 +2704 +317 +2705 +2706 +2707 +193 +484 +2708 +2709 +16 +17 +2710 +2711 +2712 +2713 +2714 +2715 +2716 +2717 +2718 +1437 +2719 +2720 +15 +2721 +2722 +2723 +2724 +2725 +509 +1570 +2726 +2727 +2728 +138 +2729 +16 +1716 +2730 +1513 +1287 +2731 +2732 +2733 +193 +2040 +2734 +2735 +2736 +2737 +910 +2738 +43 +2739 +34 +2740 +14 +2741 +2742 +20 +554 +2743 +2744 +597 +707 +2745 +2746 +721 +2747 +333 +2748 +2749 +2750 +2751 +15 +2752 +2753 +57 +2754 +2755 +2756 +20 +2757 +2758 +7 +2759 +2760 +2761 +2762 +2763 +286 +10 +2764 +3 +2765 +2766 +20 +179 +10 +2767 +3 +15 +2768 +2769 +1013 +2770 +2771 +1710 +2772 +15 +2773 +514 +15 +708 +2774 +19 +1172 +2775 +2776 +286 +19 +32 +2777 +415 +2778 +2779 +15 +1013 +1679 +2780 +983 +590 +379 +2781 +1042 +57 +1529 +2782 +188 +32 +200 +1738 +2783 +2784 +2785 +2786 +2787 +2788 +2789 +188 +2790 +417 +19 +2791 +20 +2792 +1606 +2793 +2794 +1711 +2795 +2796 +1169 +2797 +2798 +2799 +2800 +2801 +2802 +20 +10 +2803 +2804 +568 +2805 +2806 +2314 +1091 +2807 +2808 +2809 +915 +845 +32 +237 +2810 +2811 +80 +590 +2812 +2813 +2259 +2814 +2815 +201 +2816 +2817 +15 +586 +188 +2818 +2819 +43 +197 +2820 +66 +828 +1465 +2821 +2822 +2823 +357 +245 +2 +2824 +43 +2825 +2826 +478 +2827 +2828 +34 +1018 +10 +648 +2829 +2830 +2831 +2832 +39 +358 +43 +2833 +2550 +196 +2834 +4 +57 +2835 +2836 +2837 +2838 +2406 +2728 +2839 +2840 +2841 +22 +20 +2842 +2843 +2844 +2845 +2846 +2847 +1970 +2848 +2849 +228 +67 +1612 +2850 +2851 +2852 +98 +2853 +2854 +2414 +2855 +43 +2856 +2857 +2858 +2859 +2860 +2861 +463 +134 +2862 +2694 +201 +1165 +2863 +2864 +2865 +14 +2866 +142 +15 +2 +2867 +2868 +2476 +2869 +1606 +43 +2870 +2871 +2872 +872 +2873 +10 +2874 +583 +14 +19 +2875 +616 +2876 +2877 +15 +15 +2878 +2879 +25 +2880 +2881 +43 +2882 +2883 +48 +2884 +1001 +2885 +9 +9 +2886 +2887 +43 +2888 +2889 +57 +873 +2890 +2891 +2431 +26 +57 +533 +2892 +25 +2893 +533 +2894 +910 +2895 +19 +48 +2896 +2897 +34 +2898 +2526 +286 +2899 +2900 +2762 +19 +533 +2901 +554 +2902 +2903 +2904 +358 +2905 +2906 +2907 +2908 +2909 +2910 +249 +2911 +2912 +1924 +2913 +2092 +2914 +99 +2915 +665 +1066 +2253 +43 +2916 +57 +2917 +196 +2918 +2919 +2920 +2921 +2922 +123 +2923 +16 +237 +75 +284 +2924 +15 +2925 +2926 +237 +33 +2927 +2928 +20 +2929 +2930 +2931 +2932 +299 +721 +440 +1711 +213 +15 +20 +2933 +2934 +2935 +2936 +2937 +213 +303 +9 +2551 +2938 +303 +2939 +2940 +845 +286 +57 +89 +2941 +2942 +2943 +2944 +2945 +2946 +554 +2947 +284 +373 +2948 +2949 +2950 +533 +2951 +2260 +2952 +531 +2953 +2954 +575 +201 +2955 +1116 +213 +2956 +2957 +48 +286 +2958 +20 +2959 +269 +15 +2960 +1710 +1051 +2961 +19 +43 +2962 +43 +2963 +2964 +322 +140 +2965 +2966 +2967 +2968 +2 +2969 +491 +1384 +2970 +2971 +155 +2972 +15 +1425 +15 +2577 +2973 +2974 +14 +2975 +2976 +76 +658 +2977 +2978 +2979 +2980 +509 +2981 +2439 +337 +2982 +25 +57 +2983 +2984 +2985 +2986 +48 +15 +2987 +2988 +170 +3 +19 +2989 +2990 +349 +19 +22 +2525 +9 +43 +317 +788 +665 +32 +2991 +2992 +2993 +2994 +2995 +2996 +484 +2997 +2998 +2999 +3000 +3001 +3002 +67 +3003 +3 +43 +1013 +3004 +15 +248 +3005 +3006 +125 +337 +57 +3007 +3008 +3009 +2561 +3010 +3011 +96 +3012 +3013 +43 +514 +3014 +3015 +3016 +713 +3017 +3018 +3019 +936 +57 +78 +3020 +14 +3021 +1287 +3022 +137 +2764 +3023 +3024 +3025 +1605 +3026 +25 +3027 +15 +554 +43 +3028 +3029 +541 +1224 +3030 +22 +3031 +9 +3032 +663 +3033 +1051 +3034 +1612 +3035 +155 +399 +3036 +1861 +3037 +3038 +3039 +3040 +20 +43 +3041 +32 +3042 +14 +3043 +99 +15 +484 +3044 +3045 +165 +3046 +3047 +3048 +3049 +3050 +237 +3051 +3052 +3053 +3054 +3055 +3056 +3057 +3058 +3059 +3060 +2865 +3061 +57 +3062 +3063 +53 +3064 +399 +3065 +3066 +845 +417 +3067 +3068 +3069 +425 +3070 +3071 +491 +3072 +3073 +2260 +3074 +3075 +3076 +32 +19 +436 +22 +3077 +3078 +14 +3079 +3080 +3081 +3082 +3083 +3084 +57 +3085 +3086 +3087 +3088 +3089 +910 +3090 +3091 +411 +3092 +1245 +3093 +1470 +342 +1604 +3094 +3095 +1612 +3096 +60 +3097 +19 +3098 +3099 +32 +3100 +19 +3101 +3102 +3103 +32 +1172 +3104 +2 +3105 +3106 +270 +2537 +4 +3107 +3108 +20 +3109 +3110 +24 +57 +3111 +1808 +3112 +337 +3113 +480 +32 +3114 +3115 +3116 +3117 +3118 +554 +3119 +3120 +3121 +3122 +3123 +2926 +19 +3003 +19 +3124 +3125 +3126 +3127 +1437 +694 +3128 +3129 +3130 +3131 +2061 +398 +43 +3132 +3133 +3134 +741 +741 +3135 +3136 +3137 +248 +2471 +1513 +3138 +3139 +9 +3140 +3141 +3142 +3143 +3144 +3145 +2402 +2259 +2591 +3146 +3147 +3148 +1792 +3149 +3150 +3151 +3152 +3153 +3154 +3155 +3156 +3157 +3158 +3159 +286 +2769 +3160 +114 +3161 +3162 +3163 +32 +3164 +286 +16 +104 +711 +3165 +1232 +3166 +14 +745 +3167 +777 +3168 +43 +3169 +1668 +32 +125 +165 +3170 +3171 +3172 +3173 +10 +213 +3174 +43 +201 +3175 +3176 +179 +1047 +284 +3177 +3178 +3179 +22 +3180 +3181 +15 +213 +57 +3182 +16 +345 +3183 +3184 +2 +3185 +3186 +519 +66 +197 +3187 +3188 +3189 +104 +3190 +3191 +86 +3192 +3193 +2672 +286 +3194 +3195 +2835 +57 +3196 +337 +3197 +648 +3198 +10 +3199 +3200 +15 +337 +303 +228 +180 +3201 +32 +3202 +3203 +345 +3204 +3205 +1889 +915 +3206 +213 +337 +1401 +3207 +3208 +32 +3209 +3210 +3211 +248 +286 +2410 +1010 +3212 +3213 +3214 +3215 +3216 +32 +3217 +337 +3218 +3219 +3220 +3221 +3222 +337 +337 +2616 +849 +3223 +57 +3224 +317 +15 +293 +3225 +3226 +3227 +248 +3228 +3229 +3230 +915 +1091 +3231 +3232 +9 +1364 +3233 +43 +3234 +3235 +3236 +3237 +38 +1352 +3238 +3239 +3240 +3241 +3242 +3243 +3244 +43 +770 +22 +3245 +3246 +303 +303 +3247 +3248 +3249 +3250 +2728 +3251 +9 +17 +32 +2314 +3252 +3253 +3254 +3255 +3256 +2260 +19 +43 +349 +178 +1465 +337 +138 +3257 +3258 +12 +1364 +1224 +1604 +286 +188 +15 +478 +15 +379 +15 +20 +3259 +15 +3260 +3261 +3262 +3263 +491 +165 +1021 +3264 +3265 +3266 +3267 +3268 +188 +3269 +57 +3270 +3271 +3272 +3273 +3274 +297 +20 +3275 +2 +3276 +3277 +3278 +377 +15 +2129 +3279 +3280 +3281 +4 +270 +3282 +3283 +3284 +32 +1637 +1710 +3285 +2978 +3286 +89 +3287 +3288 +3287 +3289 +3290 +3291 +648 +3292 +3293 +3294 +20 +1961 +48 +3295 +188 +3296 +3297 +3298 +3299 +22 +201 +3300 +3301 +764 +3302 +3303 +3304 +3305 +3306 +2316 +1513 +540 +237 +3307 +583 +3308 +196 +15 +3309 +3310 +89 +89 +89 +104 +2035 +3311 +3312 +3313 +3314 +3315 +3178 +209 +3316 +272 +3317 +509 +3318 +3319 +3320 +764 +3321 +286 +43 +3322 +20 +3323 +15 +3324 +3325 +3326 +3327 +2546 +201 +358 +155 +3328 +554 +3329 +3330 +3331 +43 +3332 +3333 +1655 +1181 +3334 +1615 +3335 +155 +2129 +3336 +3337 +3338 +3339 +671 +3340 +1172 +3341 +142 +48 +3342 +3343 +3344 +3317 +2764 +3345 +3346 +3347 +910 +29 +3348 +3349 +3350 +3351 +3352 +3353 +3354 +3287 +99 +3355 +3356 +3357 +495 +861 +3358 +3359 +77 +3360 +15 +3361 +15 +3362 +2325 +3363 +3364 +379 +10 +3365 +354 +3366 +3367 +3368 +286 +32 +3369 +9 +3370 +1364 +3371 +665 +3372 +286 +142 +14 +3373 +3374 +3375 +99 +3376 +1547 +3377 +1529 +3378 +687 +491 +3379 +3380 +3381 +665 +373 +3382 +249 +3383 +3384 +19 +3385 +3386 +3387 +3388 +3389 +1502 +3390 +3391 +3392 +3393 +931 +22 +3394 +3395 +3396 +286 +2260 +3397 +373 +43 +3398 +3399 +3400 +3401 +15 +22 +1234 +3402 +3403 +943 +2896 +3404 +3405 +3406 +32 +354 +1790 +3407 +3408 +3054 +457 +3409 +3410 +345 +3050 +53 +738 +15 +3411 +3412 +3413 +3414 +2122 +345 +3415 +3416 +25 +3417 +213 +43 +3418 +3419 +3420 +3421 +14 +936 +3422 +3423 +3424 +3425 +3426 +38 +3427 +1508 +3428 +25 +713 +15 +3429 +57 +3430 +20 +3431 +3432 +3433 +14 +3434 +3435 +43 +3436 +3437 +745 +916 +700 +3438 +3439 +3440 +3441 +3442 +3443 +3444 +3445 +2804 +3446 +3447 +3448 +20 +815 +10 +19 +286 +3449 +3450 +3451 +3452 +213 +3453 +764 +57 +3454 +3455 +3456 +284 +3457 +57 +3458 +3459 +386 +248 +3460 +3461 +3462 +10 +3463 +379 +3464 +519 +3465 +3466 +22 +3467 +3468 +3469 +3470 +43 +3471 +3472 +3473 +3310 +12 +3474 +155 +3475 +694 +354 +2015 +3476 +14 +3477 +3478 +3247 +3479 +596 +303 +337 +683 +3480 +3481 +3482 +3483 +3484 +528 +48 +671 +3485 +554 +286 +610 +16 +178 +3486 +1514 +3487 +3488 +3489 +3490 +3491 +1066 +249 +3492 +3493 +3494 +9 +19 +43 +3495 +9 +665 +554 +3496 +3497 +32 +1502 +3498 +43 +3499 +248 +915 +3500 +3501 +3502 +248 +354 +3503 +1423 +248 +3504 +3505 +16 +3506 +3507 +19 +791 +3508 +185 +3509 +3510 +19 +337 +1976 +248 +2195 +1091 +303 +3511 +597 +3512 +2768 +1900 +3513 +3514 +3515 +3516 +3517 +109 +2601 +1585 +3518 +3519 +3520 +20 +20 +44 +66 +3521 +3522 +3523 +3524 +3525 +3526 +3527 +3528 +15 +2260 +3529 +3530 +3531 +1208 +1559 +3532 +3533 +791 +573 +16 +3534 +19 +3535 +3536 +19 +1907 +43 +209 +2019 +2489 +3537 +586 +3538 +15 +3539 +3540 +3541 +3542 +34 +3543 +3544 +15 +3545 +3546 +3547 +43 +3548 +554 +3549 +3550 +3551 +3552 +3553 +3554 +237 +109 +15 +791 +32 +43 +345 +3555 +1630 +248 +3556 +3557 +3558 +3559 +3560 +1716 +57 +1847 +484 +1927 +22 +2762 +3561 +415 +48 +15 +3562 +188 +48 +196 +3317 +3563 +3564 +3565 +3566 +32 +3567 +32 +694 +3568 +861 +3569 +554 +2029 +201 +1508 +3570 +188 +3571 +201 +1091 +3572 +180 +3573 +3287 +286 +3574 +736 +1149 +3575 +3576 +3577 +29 +172 +3578 +3579 +43 +3580 +3581 +3582 +3583 +20 +3584 +3585 +373 +43 +3586 +32 +1013 +3587 +32 +3588 +3589 +3590 +3591 +3592 +3593 +14 +1436 +3594 +3595 +210 +3330 +29 +3596 +9 +398 +430 +3597 +1529 +3598 +15 +3599 +3600 +2896 +3601 +19 +3602 +3603 +3604 +3605 +43 +57 +3606 +3607 +3608 +3609 +201 +3610 +3611 +3612 +1452 +3613 +3307 +3614 +3615 +3616 +57 +14 +1559 +1300 +3617 +178 +3618 +3619 +3620 +3621 +3622 +345 +188 +2260 +3623 +3316 +893 +3624 +595 +1524 +3625 +3626 +3627 +3628 +3629 +3630 +3631 +3632 +3633 +1655 +271 +3634 +3635 +3636 +3637 +3638 +48 +2 +15 +89 +491 +3353 +3639 +3640 +3641 +3642 +22 +3643 +1637 +3644 +279 +34 +2993 +3645 +560 +3646 +25 +3647 +1160 +15 +1019 +1531 +3648 +3649 +22 +3650 +3651 +3652 +3653 +3654 +3655 +3656 +19 +3657 +915 +3658 +323 +3659 +3660 +3661 +3662 +3663 +15 +43 +3664 +3665 +19 +20 +3666 +3667 +379 +3668 +3669 +237 +910 +3670 +3671 +3672 +3673 +3674 +3675 +3676 +3677 +3678 +3679 +3680 +3681 +32 +77 +3682 +57 +14 +3683 +3684 +3685 +3686 +2459 +3687 +3688 +15 +3689 +3690 +1817 +586 +3691 +3692 +1249 +3043 +185 +43 +3693 +57 +22 +3694 +99 +3695 +3696 +178 +15 +19 +3697 +3698 +595 +3699 +1149 +533 +3700 +3701 +3702 +188 +1688 +1508 +3703 +9 +57 +3704 +9 +77 +3705 +1961 +57 +3061 +3706 +1249 +317 +370 +3707 +4 +15 +43 +1015 +3708 +713 +43 +20 +3709 +43 +3710 +3711 +3712 +2314 +3713 +3714 +3715 +3716 +411 +112 +3717 +2289 +323 +3718 +3719 +3720 +3721 +345 +2721 +3722 +3723 +3724 +3725 +2764 +22 +3726 +15 +3727 +292 +3728 +3729 +32 +3730 +3731 +3732 +3733 +3734 +914 +3735 +3736 +2 +9 +3737 +3738 +2 +3739 +3740 +703 +528 +440 +1232 +3741 +1563 +3742 +484 +3743 +3744 +3745 +1559 +1364 +3746 +411 +20 +3747 +3748 +25 +3749 +3750 +566 +2728 +15 +3751 +15 +10 +357 +882 +3752 +178 +46 +3525 +3753 +2260 +3754 +1521 +3755 +20 +3756 +15 +2 +3 +19 +22 +112 +3757 +3758 +3759 +249 +2903 +2764 +3760 +3761 +3762 +694 +303 +3763 +155 +3764 +3765 +16 +3766 +3767 +3768 +3769 +3770 +3771 +15 +303 +3772 +15 +586 +57 +3773 +3003 +3774 +3775 +3776 +228 +3777 +1513 +4 +3778 +2 +3779 +3780 +337 +19 +284 +1889 +3781 +284 +248 +3782 +1021 +3783 +3784 +286 +9 +3785 +3786 +736 +2314 +3787 +464 +15 +3788 +20 +3789 +3790 +34 +43 +213 +337 +3791 +3792 +3793 +303 +3794 +3795 +1817 +3796 +358 +3797 +248 +188 +3798 +3799 +337 +3800 +19 +3801 +3802 +337 +20 +1354 +3803 +1817 +1765 +213 +1234 +3804 +1172 +3805 +1051 +337 +3806 +2410 +3807 +3808 +1013 +2009 +3809 +1682 +3810 +3811 +1468 +213 +43 +3812 +3813 +484 +3814 +10 +597 +3815 +3816 +3817 +337 +3818 +3819 +1833 +188 +3820 +809 +228 +415 +32 +2882 +3821 +1961 +791 +142 +2260 +597 +3822 +3 +3823 +2 +3824 +595 +3825 +14 +89 +3826 +3827 +751 +486 +3828 +3829 +3830 +2202 +3831 +3 +3832 +2035 +3833 +43 +915 +436 +3834 +317 +3835 +337 +1604 +155 +115 +379 +3836 +3837 +3838 +3839 +3840 +3841 +43 +3842 +2064 +3843 +3732 +3844 +3845 +15 +3846 +3847 +3848 +1889 +3849 +1291 +3850 +115 +3851 +3852 +155 +3853 +3854 +3855 +14 +48 +104 +3856 +3857 +3858 +3859 +152 +3860 +2042 +3861 +3862 +2439 +3863 +3864 +2465 +3865 +3866 +3867 +3868 +3869 +3870 +3871 +10 +3872 +1696 +42 +3873 +3546 +3874 +3875 +3876 +3790 +3877 +386 +3878 +286 +3879 +15 +3880 +3881 +3882 +3883 +57 +3884 +19 +495 +509 +3885 +20 +25 +155 +554 +3886 +9 +3887 +3888 +32 +1765 +15 +57 +3889 +3890 +20 +3891 +3476 +57 +20 +213 +1425 +3553 +179 +155 +3892 +271 +3893 +3894 +15 +3895 +3896 +15 +15 +3897 +46 +3898 +3899 +845 +3900 +1927 +22 +3901 +3902 +15 +15 +43 +1083 +3903 +3904 +76 +1655 +3905 +3484 +3906 +827 +3907 +3908 +1710 +3909 +3910 +3911 +3912 +1234 +3913 +3914 +3915 +57 +57 +3916 +1245 +3917 +736 +155 +1096 +3918 +179 +3919 +3920 +3921 +493 +3922 +3923 +1415 +3924 +3925 +3926 +2769 +43 +201 +3927 +48 +3928 +3929 +284 +3930 +1655 +3931 +3932 +3933 +3934 +3935 +3936 +3937 +19 +3938 +3939 +20 +1502 +345 +3940 +20 +3941 +272 +3942 +3943 +484 +283 +3944 +1051 +1115 +3945 +598 +3946 +3947 +3948 +123 +222 +3949 +3950 +3951 +3952 +3953 +3954 +3955 +3956 +12 +3957 +248 +19 +15 +665 +3958 +3959 +3960 +3961 +3962 +248 +2 +1128 +3963 +1864 +3964 +3965 +284 +3966 +3967 +1806 +39 +3968 +3969 +3970 +3971 +1559 +1401 +3972 +12 +43 +3973 +1047 +3974 +3975 +3976 +3654 +3977 +3978 +3979 +32 +3980 +3981 +213 +337 +720 +806 +213 +14 +3982 +284 +3983 +3984 +3985 +286 +284 +3986 +3987 +3988 +213 +3989 +1668 +3990 +3991 +3992 +248 +1234 +955 +15 +3993 +270 +352 +3994 +3995 +1889 +4 +3996 +1499 +3997 +19 +3998 +3999 +237 +4000 +4001 +25 +4002 +4003 +4004 +283 +248 +1217 +34 +4005 +137 +2581 +176 +4006 +19 +4007 +845 +89 +2463 +337 +1529 +4008 +4009 +373 +4010 +1386 +4011 +4012 +4013 +188 +4014 +303 +2500 +337 +349 +303 +586 +4015 +10 +4016 +379 +4017 +337 +4018 +882 +213 +519 +4019 +77 +32 +20 +1942 +386 +4020 +180 +12 +2140 +845 +4021 +4022 +3745 +4023 +4024 +4025 +2593 +180 +4026 +4027 +4028 +20 +1234 +1291 +4029 +155 +4030 +34 +303 +4031 +4032 +32 +4033 +14 +4034 +19 +4035 +70 +4036 +43 +137 +155 +9 +4037 +25 +272 +4038 +4039 +3351 +4040 +57 +4041 +4042 +4043 +4044 +4045 +4046 +2721 +4047 +4048 +9 +4049 +9 +2 +1817 +137 +286 +4050 +590 +4051 +2924 +3959 +4052 +99 +1961 +286 +4053 +57 +4054 +4055 +4056 +4057 +4058 +4059 +4060 +4061 +142 +43 +188 +1710 +4062 +15 +4063 +1018 +57 +38 +4064 +4065 +89 +4066 +861 +4067 +4068 +19 +4069 +4070 +4071 +53 +4072 +1800 +3317 +4073 +4074 +299 +4075 +4076 +2347 +4077 +248 +43 +4078 +1710 +1604 +721 +4079 +4080 +2012 +4081 +4082 +12 +4083 +4084 +4085 +4086 +32 +4087 +4088 +4089 +57 +4090 +188 +4091 +4092 +1637 +4093 +4094 +4095 +4096 +4097 +283 +4098 +519 +597 +3310 +9 +4099 +4100 +4101 +43 +4102 +4103 +22 +4104 +4105 +19 +4106 +4107 +4108 +1100 +4109 +915 +4110 +4111 +597 +2471 +4112 +43 +16 +4113 +60 +4114 +4115 +4116 +188 +1048 +20 +4117 +4118 +4119 +305 +4120 +4121 +4122 +4123 +1502 +16 +14 +716 +4124 +4125 +4126 +1655 +4127 +1292 +4128 +20 +4129 +671 +286 +1749 +2019 +12 +4130 +4131 +4132 +4133 +2157 +4134 +317 +4135 +4136 +4137 +415 +4138 +4139 +809 +317 +9 +25 +4140 +4141 +286 +4142 +915 +4143 +4144 +4145 +4146 +4147 +4148 +4149 +70 +4150 +4151 +4152 +43 +4153 +4154 +4155 +4156 +764 +1021 +411 +14 +4157 +286 +4158 +4159 +4160 +4161 +446 +4162 +4163 +4164 +15 +4165 +3003 +4166 +4167 +4168 +4169 +4170 +1698 +4171 +4172 +15 +4173 +19 +4174 +200 +4175 +4176 +4177 +44 +4178 +279 +4179 +15 +4180 +1655 +4181 +20 +2347 +4182 +4183 +942 +19 +4184 +4185 +4186 +4187 +4188 +4189 +4190 +57 +66 +4191 +1513 +317 +707 +4192 +4193 +815 +4194 +4 +1223 +4195 +19 +4196 +4197 +188 +4198 +112 +4199 +9 +4200 +22 +19 +43 +43 +1559 +4201 +286 +155 +4202 +4203 +9 +4204 +4205 +4206 +1710 +415 +208 +4207 +4208 +196 +1224 +4209 +3711 +141 +668 +4210 +4211 +4212 +4213 +1606 +4214 +4215 +43 +4216 +4217 +48 +3376 +1228 +4218 +77 +4219 +20 +4220 +4221 +4222 +354 +43 +4223 +178 +4224 +15 +20 +15 +4225 +15 +4226 +1900 +2043 +197 +4227 +4228 +4229 +20 +19 +4230 +369 +2061 +4231 +46 +4232 +561 +4233 +39 +188 +3790 +77 +4234 +286 +4235 +43 +14 +4236 +4237 +317 +4238 +4239 +4240 +597 +4241 +4242 +1011 +4243 +2762 +4244 +4245 +4246 +4247 +4248 +2330 +4249 +188 +213 +32 +379 +4250 +4251 +20 +284 +3055 +19 +4252 +20 +4253 +4254 +4255 +4256 +4257 +4258 +4259 +32 +3350 +4028 +4260 +4261 +145 +15 +4262 +4263 +1291 +4264 +337 +971 +32 +1961 +4265 +4266 +741 +4267 +1513 +4268 +238 +686 +4269 +4270 +2577 +213 +249 +1112 +4271 +694 +4272 +1889 +4273 +4274 +2043 +57 +4275 +4276 +4277 +4278 +4279 +4280 +3059 +66 +1015 +2039 +178 +337 +665 +237 +25 +2804 +4281 +303 +57 +60 +4282 +2476 +484 +4283 +25 +337 +4284 +237 +4285 +43 +1889 +3417 +4286 +4287 +179 +4288 +4289 +4290 +687 +19 +4291 +2855 +554 +4292 +4293 +20 +188 +1234 +4294 +20 +4295 +1220 +3406 +1364 +4139 +4296 +4297 +4298 +43 +201 +4299 +1955 +4300 +2982 +648 +4301 +188 +4302 +4 +170 +4303 +4304 +4305 +4306 +4307 +284 +35 +3055 +4308 +533 +4309 +4310 +1415 +4311 +286 +34 +4312 +379 +4313 +536 +1374 +1562 +303 +707 +4314 +554 +4315 +4316 +4317 +43 +4318 +15 +4319 +2195 +4320 +4321 +4322 +4323 +4324 +1244 +4325 +4326 +4327 +4328 +4329 +4330 +1508 +915 +4 +2764 +4331 +4332 +4333 +4334 +4335 +4336 +43 +736 +4337 +4338 +179 +317 +1149 +736 +4339 +4340 +4341 +4342 +4343 +416 +4344 +43 +19 +1673 +4345 +4346 +4347 +354 +4348 +4349 +4350 +4351 +2764 +4352 +180 +4353 +4354 +4355 +4 +286 +43 +286 +4356 +317 +4357 +4358 +4359 +3 +43 +15 +971 +20 +4360 +1018 +12 +4361 +4362 +14 +4363 +3553 +4364 +269 +554 +3055 +4346 +4365 +15 +57 +4366 +4180 +4367 +4368 +861 +176 +179 +114 +3 +4369 +4370 +188 +57 +4371 +4372 +4373 +4374 +4375 +2797 +2577 +4344 +4376 +1042 +1425 +201 +4377 +4378 +4379 +29 +4380 +4381 +19 +4382 +4383 +155 +1559 +586 +484 +4384 +4385 +4386 +4387 +1879 +4280 +4388 +4389 +15 +3543 +1384 +57 +4 +4390 +4391 +1559 +14 +174 +4392 +4393 +4394 +1870 +201 +4395 +4396 +4397 +4398 +554 +3300 +849 +4399 +4400 +4401 +19 +4402 +9 +4403 +2026 +586 +4404 +4405 +1533 +416 +4406 +4407 +4408 +4409 +4410 +4411 +9 +4 +4412 +4413 +270 +15 +4414 +2782 +4415 +4416 +4417 +39 +4418 +1234 +4419 +2164 +4420 +4421 +1481 +4422 +1710 +2040 +4423 +4424 +4425 +2060 +4426 +4427 +4428 +70 +4429 +2166 +4430 +4431 +2836 +4432 +4433 +4434 +4435 +1559 +4436 +33 +1851 +4437 +1605 +34 +15 +4438 +19 +1688 +4439 +1992 +249 +89 +4440 +57 +4441 +4442 +4443 +4444 +2836 +10 +14 +57 +4445 +176 +4446 +48 +57 +4447 +4448 +176 +4449 +4450 +915 +411 +4451 +4452 +59 +4453 +4454 +4455 +4456 +19 +4457 +3256 +4458 +4459 +4460 +43 +4461 +4462 +29 +2619 +4463 +2260 +1531 +57 +484 +4464 +35 +1426 +286 +4465 +43 +4466 +4467 +185 +2683 +4468 +586 +4469 +4470 +4471 +4472 +4473 +4474 +43 +2769 +4475 +43 +4476 +4477 +4478 +286 +4479 +915 +1605 +2 +4480 +20 +4481 +484 +872 +4482 +4483 +20 +141 +15 +3354 +15 +665 +990 +4484 +4485 +4486 +4487 +4488 +345 +43 +4489 +4490 +9 +4491 +1688 +573 +4492 +19 +57 +1120 +4493 +398 +4494 +4495 +4496 +4497 +4498 +4499 +2064 +4500 +4501 +4502 +142 +201 +345 +4503 +43 +4504 +1232 +4505 +4506 +3 +4507 +352 +2804 +349 +4508 +4509 +4510 +2728 +155 +15 +43 +4511 +4033 +4512 +4513 +4514 +4515 +586 +4516 +1716 +4517 +4518 +179 +1149 +48 +4519 +4520 +4521 +2113 +4522 +29 +4523 +165 +4524 +43 +4525 +4526 +4527 +4528 +4529 +43 +4530 +77 +9 +4531 +4532 +1244 +4533 +4534 +4535 +761 +4536 +4537 +140 +4538 +4539 +4540 +155 +4541 +4542 +4543 +4544 +9 +57 +4545 +155 +286 +4546 +4547 +1562 +4548 +4549 +4550 +2485 +4551 +3491 +250 +4552 +4553 +4554 +3003 +4555 +4556 +270 +4557 +282 +4558 +4559 +4560 +4561 +4562 +1768 +22 +4563 +15 +4564 +1834 +3335 +1262 +4565 +4566 +4567 +237 +4568 +4569 +4570 +4571 +4572 +57 +4573 +43 +4574 +345 +4575 +4576 +4577 +4578 +60 +2770 +4579 +4580 +4581 +301 +57 +15 +4582 +4583 +4584 +19 +15 +2347 +1604 +2954 +4585 +815 +4586 +1112 +4587 +4588 +4589 +4590 +14 +317 +53 +4591 +271 +4592 +4116 +4593 +4594 +4595 +17 +1021 +9 +4596 +48 +4597 +15 +4598 +19 +4599 +4600 +1605 +19 +342 +4601 +4602 +2476 +4603 +4317 +1824 +583 +201 +4604 +57 +3 +20 +4605 +4606 +4607 +2795 +402 +57 +916 +3984 +4608 +4609 +43 +4610 +915 +4611 +4612 +745 +57 +4613 +4614 +3061 +4615 +4616 +4617 +1234 +4618 +4619 +4620 +564 +4621 +4622 +4547 +4623 +32 +4624 +3626 +138 +936 +4625 +1710 +4626 +354 +4627 +4628 +379 +57 +4629 +1812 +4630 +4631 +4632 +43 +1689 +4633 +4634 +4635 +15 +4636 +4637 +4638 +4639 +4640 +9 +9 +155 +4641 +915 +4642 +4643 +59 +4644 +4645 +2770 +4646 +942 +2561 +4647 +4648 +32 +4649 +430 +4088 +531 +4650 +4651 +4652 +686 +57 +4653 +155 +4654 +9 +1524 +4655 +4656 +342 +237 +2029 +4657 +4658 +4659 +1880 +4660 +613 +4661 +57 +4662 +4663 +164 +43 +43 +4664 +4665 +694 +4587 +4666 +4667 +4668 +4669 +665 +484 +3958 +4670 +4671 +4672 +4673 +4674 +4675 +2136 +3287 +4676 +4677 +4678 +1668 +2489 +4679 +125 +4680 +4681 +4682 +4683 +57 +4684 +4685 +4686 +259 +665 +586 +4687 +4688 +464 +4689 +4690 +4691 +4692 +4693 +19 +4694 +4695 +4696 +32 +4697 +4698 +4699 +4700 +573 +4701 +249 +213 +1834 +2341 +4702 +45 +493 +665 +284 +32 +4703 +4704 +4705 +1444 +4706 +849 +677 +4707 +35 +153 +4708 +4709 +213 +4710 +4711 +4712 +4713 +4714 +68 +43 +4715 +4716 +4717 +586 +4718 +57 +22 +4719 +4720 +4721 +248 +915 +4722 +809 +15 +213 +4723 +4724 +259 +4725 +14 +1790 +4726 +4727 +4728 +2431 +4729 +2 +4730 +4731 +178 +4732 +4733 +4734 +2009 +19 +4735 +19 +4736 +14 +694 +4737 +1720 +4738 +2739 +4739 +284 +4740 +572 +4741 +317 +9 +4742 +251 +303 +4743 +4744 +4745 +4746 +57 +2619 +303 +4747 +4748 +1300 +19 +845 +4749 +43 +4750 +19 +19 +4751 +345 +4752 +4753 +4754 +201 +4755 +4756 +4757 +77 +286 +48 +4758 +238 +4759 +10 +4760 +3353 +4761 +4762 +4012 +4763 +19 +736 +861 +440 +4764 +1743 +4765 +4766 +1779 +4767 +4768 +43 +4769 +4770 +4771 +4413 +248 +4772 +4773 +764 +4774 +4775 +464 +4776 +2902 +4777 +1090 +222 +4778 +1047 +2591 +694 +32 +15 +845 +354 +4779 +1181 +43 +4780 +4781 +3842 +3 +4782 +286 +4783 +4784 +4785 +303 +2998 +4786 +4787 +4788 +4789 +4790 +4791 +4792 +4793 +4794 +4042 +4795 +4796 +616 +14 +4797 +1116 +4798 +4799 +1529 +4800 +790 +769 +32 +4801 +4802 +4803 +155 +4804 +57 +764 +3745 +4805 +536 +4806 +416 +4807 +4808 +4809 +4810 +3382 +4811 +20 +22 +77 +249 +4812 +2015 +43 +4813 +4814 +1377 +915 +4815 +4816 +57 +1889 +4817 +4818 +4819 +1559 +4820 +9 +4821 +354 +10 +4822 +4823 +357 +137 +4824 +4825 +4826 +4827 +4828 +180 +4829 +32 +4830 +14 +2459 +286 +19 +705 +345 +152 +14 +48 +15 +4831 +4832 +1112 +4833 +19 +19 +764 +648 +4834 +25 +4835 +736 +4836 +32 +491 +554 +4837 +4838 +22 +1543 +4839 +4840 +20 +4841 +4842 +286 +4843 +4844 +3946 +4845 +4846 +4847 +2274 +1234 +4848 +4849 +4850 +4790 +4851 +4852 +741 +4853 +2131 +201 +4854 +4855 +4856 +4857 +379 +4858 +4859 +2668 +4860 +9 +1612 +3601 +4861 +4174 +43 +4862 +4863 +4864 +4865 +464 +590 +791 +4866 +3300 +4867 +4868 +3278 +4869 +4870 +3354 +4871 +4872 +4873 +4874 +4875 +4876 +4877 +4878 +4716 +4879 +140 +101 +4880 +4881 +4882 +4050 +4883 +15 +155 +586 +4803 +4884 +19 +201 +19 +188 +4885 +4886 +1604 +4887 +4888 +4889 +2012 +595 +4890 +15 +4891 +943 +57 +4892 +10 +15 +4893 +4894 +4346 +4895 +4896 +43 +4897 +4898 +4899 +4900 +4901 +2125 +4902 +4903 +4904 +4905 +4906 +4907 +2 +279 +4908 +4909 +19 +665 +677 +176 +1425 +4910 +4911 +2316 +15 +4912 +4913 +4914 +1364 +4915 +4916 +1051 +3353 +349 +77 +286 +1169 +770 +4917 +4918 +20 +201 +4919 +1612 +48 +4920 +4921 +4922 +4923 +4924 +4925 +14 +4926 +22 +4927 +671 +597 +4264 +4928 +4929 +4930 +32 +692 +4931 +4932 +4933 +2009 +4934 +4935 +57 +4936 +4937 +4938 +4939 +1217 +4940 +4941 +14 +4942 +4943 +4944 +4945 +1212 +2113 +4946 +4947 +237 +4948 +915 +4949 +2349 +228 +286 +4950 +1295 +19 +436 +4 +4951 +43 +178 +4952 +22 +4953 +4954 +1124 +4955 +4956 +4957 +176 +1529 +89 +4958 +4959 +4 +4960 +104 +4961 +4624 +4962 +19 +4963 +4964 +4965 +3160 +4966 +4967 +1695 +15 +4968 +43 +4969 +4970 +2260 +3995 +4971 +178 +15 +4972 +1364 +4973 +4974 +1696 +665 +2 +4975 +4976 +4977 +4824 +248 +237 +2260 +19 +4978 +4979 +201 +4980 +1021 +4981 +1533 +4982 +4983 +4984 +4985 +4986 +4987 +4988 +4989 +647 +15 +4990 +4991 +2476 +337 +4992 +4993 +14 +4994 +4995 +4996 +4997 +4998 +4999 +155 +707 +213 +665 +248 +1060 +5000 +1710 +9 +5001 +337 +5002 +5003 +43 +5004 +5005 +2356 +5006 +5007 +5008 +5009 +22 +5010 +2537 +1710 +5011 +5012 +237 +5013 +337 +665 +19 +57 +284 +3743 +5014 +15 +9 +5015 +213 +4406 +5016 +303 +213 +5017 +5018 +5019 +3698 +5020 +3353 +5021 +5022 +5023 +5024 +2668 +5025 +2588 +5026 +5027 +5028 +5029 +22 +115 +15 +845 +5030 +5031 +2619 +19 +5032 +4344 +5033 +15 +188 +5034 +5035 +5036 +14 +43 +2356 +303 +5037 +5038 +9 +5039 +1465 +5040 +915 +1961 +32 +5041 +1531 +303 +5042 +5043 +5044 +43 +5045 +20 +5046 +2316 +32 +5047 +43 +16 +189 +915 +5048 +286 +4716 +342 +57 +57 +5049 +48 +5050 +5051 +5052 +15 +5053 +5054 +20 +5055 +305 +5056 +5057 +14 +4856 +5058 +32 +5059 +2040 +20 +109 +10 +15 +5060 +5061 +15 +178 +5062 +5063 +5064 +5065 +5066 +278 +707 +548 +57 +43 +269 +5067 +5068 +5069 +5070 +1236 +5071 +5072 +4859 +2009 +5073 +32 +1109 +436 +32 +10 +57 +5074 +5075 +1011 +5076 +5077 +2330 +5078 +5079 +5080 +5081 +3743 +3192 +32 +77 +448 +358 +5082 +5083 +5084 +57 +180 +286 +5085 +5086 +5087 +5088 +5089 +15 +5090 +5091 +178 +373 +5092 +358 +57 +57 +19 +317 +57 +201 +5093 +303 +5094 +3816 +738 +20 +5095 +3139 +222 +1109 +1013 +519 +5096 +5097 +5098 +5099 +5100 +5101 +5102 +5103 +5104 +22 +5105 +3544 +48 +25 +5106 +57 +5107 +258 +3408 +5108 +60 +554 +32 +5109 +5110 +1107 +19 +5111 +109 +43 +5112 +5113 +11 +14 +2594 +3480 +2446 +1612 +5114 +155 +276 +4 +57 +358 +3367 +5115 +265 +5116 +201 +5117 +43 +15 +984 +5118 +5119 +861 +2405 +927 +5120 +2694 +5121 +5122 +5123 +2314 +20 +2449 +5124 +3330 +5125 +20 +5126 +5080 +5127 +5128 +5129 +1228 +5130 +2135 +104 +20 +5131 +5132 +5133 +5134 +540 +2064 +4808 +5135 +910 +338 +5136 +5137 +5138 +2040 +5139 +5140 +43 +5141 +303 +416 +5142 +5143 +5144 +5145 +193 +5146 +25 +5147 +5148 +222 +43 +5149 +5150 +5151 +5152 +115 +5153 +5154 +5155 +831 +5156 +936 +5157 +4128 +5158 +5159 +5160 +213 +5161 +286 +379 +9 +5162 +5163 +5164 +1120 +5165 +5166 +2064 +1612 +19 +213 +337 +5167 +188 +213 +35 +5168 +5169 +5170 +5171 +597 +5172 +3842 +5173 +201 +337 +416 +5174 +301 +5175 +43 +3999 +5176 +5177 +5178 +5169 +5179 +873 +32 +201 +5180 +32 +5181 +222 +5182 +703 +424 +5183 +590 +10 +201 +188 +5184 +2045 +397 +5185 +5186 +303 +5187 +5188 +5189 +115 +57 +15 +5190 +764 +5191 +5192 +379 +3553 +104 +197 +5193 +5194 +643 +910 +480 +5195 +1696 +15 +5196 +915 +25 +357 +5197 +5198 +16 +5199 +5200 +5201 +5202 +5203 +5204 +14 +303 +5205 +15 +337 +317 +272 +337 +1655 +5206 +5207 +5208 +43 +5209 +5210 +5211 +43 +1870 +5212 +155 +9 +15 +5213 +5214 +1698 +3553 +648 +5215 +44 +176 +4562 +3289 +337 +5216 +519 +5217 +597 +5218 +14 +5219 +138 +5220 +352 +5221 +5222 +5223 +5224 +5225 +5226 +34 +5227 +5228 +5229 +5230 +5231 +3874 +703 +4485 +43 +5232 +5233 +5234 +5235 +548 +303 +5236 +14 +15 +5237 +5238 +1356 +5239 +5240 +5241 +1529 +5242 +5243 +5244 +5245 +2769 +5246 +5247 +1083 +5248 +5249 +1559 +3745 +303 +179 +5250 +5251 +5252 +46 +4461 +566 +15 +1300 +1112 +598 +5253 +5254 +5255 +5256 +2792 +5257 +1710 +5258 +15 +57 +861 +5259 +5260 +32 +5261 +19 +14 +5262 +5263 +3209 +1364 +597 +57 +5264 +5265 +5266 +586 +1864 +5267 +2794 +2264 +1291 +1559 +1765 +5268 +104 +5269 +5270 +345 +5271 +514 +5272 +3755 +3055 +5273 +5274 +122 +703 +1710 +2517 +5275 +57 +1169 +842 +5276 +5277 +5278 +5279 +5280 +5281 +185 +4907 +5282 +5283 +5284 +5285 +15 +5286 +613 +5287 +5288 +5289 +861 +46 +379 +3287 +10 +5290 +5291 +5292 +5293 +5080 +1710 +1122 +3407 +5294 +5295 +5296 +5297 +5298 +5299 +32 +32 +5084 +5300 +3732 +5301 +5302 +5303 +5304 +5305 +1710 +43 +349 +29 +5306 +5307 +822 +5308 +3421 +155 +178 +5309 +815 +5310 +5311 +4487 +5312 +5313 +5314 +5315 +5316 +5317 +5318 +5319 +5320 +398 +5321 +5322 +19 +5323 +849 +57 +5324 +57 +5325 +5326 +2341 +155 +597 +5327 +5328 +5329 +5330 +379 +1091 +1287 +5331 +5332 +5333 +5334 +77 +15 +9 +2427 +5335 +5336 +323 +554 +5337 +5338 +5339 +5340 +249 +15 +5341 +25 +5342 +5343 +44 +5344 +2561 +5345 +5346 +1889 +123 +14 +114 +1222 +20 +804 +5347 +22 +9 +178 +5348 +345 +19 +5080 +5349 +5350 +5351 +5352 +5353 +2728 +15 +5354 +5355 +57 +2694 +25 +3685 +10 +5356 +5357 +43 +5358 +540 +5359 +4502 +5360 +1182 +358 +5361 +1244 +46 +5362 +5363 +2158 +2540 +5364 +1847 +5365 +2921 +165 +5366 +2593 +172 +1992 +5367 +201 +57 +5368 +484 +43 +19 +63 +19 +5369 +5370 +48 +14 +5371 +4061 +5372 +16 +5373 +5374 +5375 +2770 +707 +1870 +5376 +5153 +5377 +5378 +43 +5150 +5379 +586 +5380 +301 +2849 +9 +5381 +5382 +5383 +5384 +10 +5343 +3110 +1012 +5385 +43 +345 +5386 +5387 +5388 +29 +5389 +2540 +2502 +5390 +5391 +5392 +5393 +5394 +123 +5395 +983 +5396 +278 +237 +363 +5397 +155 +10 +5398 +5399 +5400 +3984 +1503 +5401 +5402 +5403 +1559 +764 +20 +15 +5404 +2859 +5405 +5406 +15 +5407 +109 +554 +104 +5408 +57 +5409 +5410 +5411 +249 +509 +5412 +3599 +5413 +5344 +5414 +1710 +5415 +5416 +5417 +213 +19 +22 +1870 +936 +910 +5418 +43 +3160 +19 +1139 +5419 +5420 +5421 +5422 +20 +1812 +2260 +5423 +665 +20 +5424 +5425 +5426 +5427 +5428 +115 +5429 +5430 +43 +2764 +5431 +9 +519 +15 +5432 +248 +337 +5433 +14 +1559 +1508 +5434 +5435 +20 +22 +1514 +5436 +98 +5437 +5438 +1300 +5439 +5440 +286 +694 +19 +5441 +20 +5442 +284 +5443 +345 +5444 +4752 +5445 +1710 +815 +5446 +5447 +5448 +5449 +3241 +379 +57 +815 +15 +2135 +14 +2502 +864 +5450 +272 +5451 +989 +5452 +5453 +5454 +43 +5455 +5456 +416 +22 +910 +4586 +910 +179 +5293 +5457 +179 +178 +4116 +5458 +5459 +1630 +22 +272 +5460 +5461 +5462 +5463 +5464 +5465 +5466 +22 +20 +1388 +5467 +5468 +1244 +43 +5469 +5470 +248 +5471 +5472 +176 +5473 +5474 +5475 +5476 +5477 +5478 +5479 +5480 +29 +5481 +5482 +19 +5483 +345 +1905 +10 +936 +32 +364 +5484 +5485 +5486 +3796 +700 +5487 +213 +1529 +5488 +5489 +14 +3599 +1244 +5490 +5491 +14 +5492 +5493 +5494 +3034 +165 +43 +5495 +5496 +213 +5497 +5498 +4631 +22 +19 +5499 +1175 +5500 +10 +57 +5501 +15 +842 +5502 +5503 +5504 +4061 +5505 +9 +19 +4 +845 +345 +7 +2015 +15 +5506 +286 +1425 +554 +5075 +286 +705 +1307 +284 +3548 +5507 +2213 +286 +89 +57 +5508 +5509 +3353 +5510 +5511 +358 +14 +5512 +4364 +5513 +179 +25 +178 +5514 +1222 +5515 +736 +5516 +9 +439 +5517 +2500 +201 +5518 +5519 +15 +2243 +57 +77 +5520 +3422 +22 +5521 +5522 +5523 +77 +1508 +915 +19 +349 +25 +5524 +213 +188 +3316 +5525 +331 +5526 +5527 +32 +43 +5528 +5529 +1743 +5530 +5531 +5532 +5533 +5534 +354 +5535 +5536 +5537 +5538 +3698 +3 +5539 +5540 +5541 +5542 +178 +5543 +25 +484 +1867 +5544 +5545 +57 +483 +15 +5546 +9 +5547 +5548 +5549 +5550 +5551 +5552 +5553 +5554 +5555 +5556 +5557 +5558 +2259 +5559 +5560 +5561 +4791 +5562 +5563 +99 +713 +10 +26 +4160 +1026 +464 +5564 +5565 +5566 +5567 +5568 +66 +5569 +5570 +5571 +5572 +5573 +286 +1862 +115 +1100 +5574 +5575 +5576 +3161 +5577 +791 +57 +5578 +2616 +5579 +284 +5580 +5581 +1944 +5582 +5583 +57 +1665 +1710 +5584 +248 +15 +5585 +5586 +1100 +5587 +2406 +284 +5588 +5589 +5590 +155 +5591 +213 +20 +19 +5592 +5593 +248 +5594 +19 +337 +5595 +5596 +5597 +5598 +5599 +5600 +5025 +213 +1900 +5601 +5602 +5603 +5604 +15 +3598 +5605 +5606 +5607 +349 +5608 +2577 +1481 +1236 +1415 +4 +57 +5609 +5610 +32 +2124 +2043 +5611 +5612 +5512 +3569 +5613 +5614 +5615 +5616 +10 +873 +5617 +317 +15 +10 +2314 +3599 +5618 +57 +5619 +15 +32 +60 +5620 +5621 +5622 +19 +5623 +5624 +436 +5625 +2601 +32 +5626 +5627 +5628 +5629 +471 +5630 +5631 +5632 +5633 +5634 +19 +15 +5635 +89 +5636 +22 +19 +4982 +15 +201 +5637 +213 +201 +278 +741 +15 +19 +345 +984 +5638 +14 +554 +179 +270 +5639 +5640 +2085 +5641 +707 +5642 +900 +4285 +5643 +1310 +2811 +5644 +3626 +5645 +19 +5646 +53 +5647 +32 +1352 +9 +5648 +5649 +196 +2260 +5650 +5651 +5652 +610 +5653 +5654 +5655 +597 +5656 +5657 +5658 +43 +5659 +5660 +5661 +237 +1531 +14 +77 +5662 +1425 +15 +22 +188 +648 +201 +5169 +19 +5663 +57 +1765 +15 +647 +5664 +1425 +237 +357 +5665 +5666 +5667 +3055 +5668 +3376 +5669 +5670 +2728 +5671 +5672 +586 +352 +5673 +155 +178 +5674 +5675 +2958 +15 +5676 +5677 +5678 +12 +2 +5679 +142 +915 +5680 +5681 +1531 +5682 +5683 +5684 +5685 +9 +736 +5686 +155 +57 +5687 +66 +1870 +137 +5688 +5689 +2619 +5690 +14 +14 +5691 +1012 +5692 +5693 +5694 +57 +14 +32 +5695 +943 +15 +286 +5696 +5697 +586 +1234 +2318 +554 +815 +5698 +9 +5699 +2 +2124 +57 +5700 +5701 +5702 +5703 +34 +32 +369 +3431 +5704 +5705 +5706 +5707 +5708 +5709 +5710 +1559 +5711 +5712 +270 +5713 +5714 +15 +5715 +4714 +238 +5716 +5717 +3 +15 +57 +5718 +5719 +5720 +5721 +5722 +2477 +936 +5723 +5724 +3899 +2913 +5725 +5252 +3626 +5726 +43 +66 +5727 +5728 +5729 +5730 +5731 +687 +5732 +5733 +5623 +5273 +554 +5734 +677 +5735 +4155 +5736 +5737 +1514 +5738 +10 +5739 +5740 +60 +5741 +43 +1465 +5742 +5743 +2260 +5744 +66 +5745 +5746 +5747 +817 +5748 +5749 +5750 +5751 +1168 +201 +5752 +501 +5753 +648 +5754 +35 +5755 +1549 +5756 +48 +5757 +5758 +5759 +5760 +14 +5761 +3252 +22 +5762 +115 +5763 +5764 +5765 +5766 +5767 +14 +5768 +5769 +48 +5770 +5771 +5772 +484 +1291 +104 +5773 +540 +32 +5774 +5775 +5776 +2772 +5777 +5778 +104 +5779 +14 +5780 +5781 +5782 +5783 +5784 +5785 +5786 +5787 +554 +1716 +141 +554 +210 +5788 +5789 +250 +5790 +32 +3 +1542 +5791 +5792 +77 +5793 +5794 +57 +43 +43 +5795 +5796 +5629 +5797 +4961 +1226 +399 +5798 +5799 +2336 +5800 +48 +5801 +2724 +57 +5802 +5803 +5804 +2619 +286 +5805 +5806 +5807 +5808 +248 +15 +15 +5809 +1203 +1047 +5810 +17 +248 +5811 +5812 +495 +5813 +1232 +5814 +89 +5815 +32 +5816 +337 +5817 +5818 +20 +5819 +5820 +1647 +5821 +48 +19 +15 +586 +19 +32 +337 +764 +19 +5822 +299 +5823 +5824 +5825 +248 +20 +3466 +5826 +5827 +337 +303 +213 +213 +5828 +5829 +5830 +5831 +5832 +345 +5833 +57 +345 +5834 +15 +5835 +5836 +5837 +5838 +5839 +9 +3 +284 +2619 +303 +48 +19 +1021 +5840 +5841 +5842 +10 +15 +5843 +5844 +5845 +5846 +5847 +5848 +19 +15 +5849 +4124 +3755 +5850 +5851 +554 +5852 +303 +1425 +19 +5853 +1562 +22 +5854 +1637 +5855 +20 +2 +5856 +1384 +5857 +5858 +713 +5859 +713 +152 +5860 +5861 +5862 +5863 +861 +5864 +1018 +1885 +5865 +176 +5866 +5867 +5868 +5285 +286 +4281 +5869 +5870 +14 +5871 +32 +5872 +67 +4757 +249 +5873 +910 +77 +694 +43 +5874 +3729 +10 +5875 +4907 +60 +20 +1765 +20 +416 +5876 +1991 +19 +5877 +2314 +597 +15 +32 +176 +5878 +5879 +5880 +5881 +5882 +868 +5883 +3743 +5884 +292 +57 +5885 +57 +5886 +43 +5887 +5888 +20 +5889 +5890 +4 +5891 +188 +416 +882 +2 +5892 +286 +5856 +5130 +5893 +5894 +5895 +5896 +2314 +5897 +43 +77 +5898 +141 +5899 +5900 +57 +5901 +5902 +5903 +5904 +5905 +817 +34 +5906 +5907 +57 +1018 +5908 +12 +15 +5909 +57 +5780 +5910 +5911 +554 +1425 +5912 +5913 +5914 +15 +19 +2260 +20 +15 +5915 +270 +213 +5916 +286 +2999 +756 +5917 +4 +1808 +5918 +5919 +492 +1442 +5920 +152 +228 +484 +5921 +19 +43 +2260 +25 +5922 +1300 +2794 +276 +519 +5923 +196 +14 +5924 +5925 +5926 +5927 +19 +5928 +5929 +201 +222 +4364 +305 +1224 +213 +5930 +25 +318 +1384 +123 +213 +337 +2697 +5931 +15 +5932 +5933 +5934 +5935 +5936 +5937 +5938 +1401 +915 +67 +5939 +5940 +733 +5941 +15 +222 +2035 +5942 +5943 +19 +43 +509 +5944 +19 +1112 +5945 +1291 +272 +5946 +5947 +5512 +4606 +67 +5948 +5949 +357 +5950 +5951 +352 +5952 +5953 +4364 +1021 +4028 +14 +188 +5954 +161 +248 +20 +1465 +5955 +5956 +1696 +1749 +5957 +5958 +5080 +337 +57 +415 +57 +57 +337 +5959 +5960 +5961 +358 +5962 +1806 +5963 +5964 +43 +5965 +2239 +5966 +5967 +225 +57 +398 +5968 +5969 +5970 +137 +5971 +3841 +142 +1710 +19 +22 +5972 +5973 +5974 +1160 +5975 +5976 +32 +5977 +4247 +5978 +278 +20 +337 +2899 +5979 +933 +5980 +5981 +317 +5982 +1172 +4035 +3476 +1604 +2540 +248 +286 +5983 +5984 +1021 +5985 +196 +5986 +5987 +3777 +1232 +738 +22 +5988 +5989 +5990 +2728 +5991 +5992 +5993 +5994 +5995 +3 +5996 +5997 +5998 +5999 +358 +286 +764 +3059 +19 +861 +14 +514 +6000 +6001 +6002 +1245 +6003 +3484 +3486 +6004 +6005 +411 +6006 +6007 +19 +248 +6008 +6009 +6010 +1082 +6011 +6012 +1529 +284 +323 +6013 +6014 +6015 +15 +3291 +4897 +15 +6016 +6017 +15 +213 +284 +910 +201 +849 +5287 +6018 +358 +6019 +213 +15 +188 +6020 +2135 +14 +12 +6021 +6022 +6023 +354 +317 +6024 +6025 +6026 +573 +6027 +2043 +6028 +6029 +6030 +2835 +665 +1083 +6031 +849 +6032 +6033 +303 +57 +6034 +6035 +6036 +6037 +1018 +6038 +1245 +6039 +4677 +6040 +6041 +6042 +6043 +337 +34 +57 +6044 +1234 +6045 +6046 +6047 +3743 +6048 +5785 +6049 +237 +493 +3055 +6050 +6051 +6052 +2577 +248 +6053 +6054 +6055 +6056 +712 +6057 +201 +3546 +6058 +6059 +178 +67 +354 +290 +647 +4364 +15 +5780 +6060 +6061 +568 +338 +2 +6062 +1021 +1026 +24 +6063 +6064 +6065 +910 +15 +25 +2129 +6066 +6067 +6068 +554 +6069 +337 +6070 +6071 +152 +4088 +9 +6072 +1291 +6073 +10 +6074 +6075 +6076 +22 +286 +6077 +1066 +6078 +6079 +185 +32 +3202 +6080 +19 +6081 +303 +19 +6082 +6083 +2591 +6084 +2 +6085 +861 +6086 +6087 +6088 +6089 +201 +32 +3345 +317 +155 +6090 +1870 +6091 +99 +6092 +303 +43 +6093 +6094 +741 +19 +14 +597 +57 +416 +815 +6095 +873 +6096 +43 +6097 +6098 +1612 +6099 +213 +179 +5498 +15 +354 +19 +19 +5561 +6100 +43 +416 +6101 +6102 +6103 +3310 +6104 +694 +493 +6105 +616 +3503 +849 +6106 +6107 +4146 +245 +1122 +2694 +4627 +345 +6108 +248 +6109 +1044 +495 +491 +6110 +6111 +2286 +6112 +15 +6113 +178 +6114 +77 +9 +1716 +228 +48 +861 +6115 +6116 +6117 +155 +6118 +6119 +6120 +6121 +2140 +6122 +6123 +6124 +6125 +6126 +2314 +9 +6127 +6128 +6129 +6130 +48 +6131 +2064 +15 +6132 +6133 +3544 +89 +5780 +936 +14 +345 +6134 +6135 +514 +25 +6136 +6137 +6138 +6139 +6140 +248 +6141 +6142 +1234 +179 +188 +2728 +25 +6143 +6144 +3978 +286 +6145 +1571 +284 +1332 +6146 +6147 +15 +22 +6148 +6149 +77 +15 +6150 +6151 +155 +284 +337 +349 +6152 +9 +6153 +6154 +248 +337 +6155 +6156 +6157 +1021 +15 +20 +6158 +6159 +6160 +6161 +6162 +284 +48 +6163 +6164 +2971 +6165 +16 +6166 +6167 +5649 +6168 +6169 +337 +6170 +6171 +671 +6172 +19 +6173 +46 +201 +43 +2576 +237 +77 +6174 +6175 +2998 +2356 +9 +6176 +6177 +6178 +6179 +6180 +6181 +1668 +6182 +22 +5780 +6183 +6184 +6185 +6186 +337 +6187 +2902 +248 +6188 +6189 +1834 +683 +6190 +6191 +1684 +6192 +6193 +6194 +6195 +6196 +6197 +6198 +6199 +6200 +5904 +6201 +32 +6202 +6203 +541 +6204 +6205 +6206 +6207 +6208 +303 +57 +6209 +566 +358 +6210 +4 +6211 +2324 +6212 +1776 +14 +4007 +6213 +286 +701 +6214 +60 +6215 +6216 +6217 +3395 +6218 +6219 +6220 +6221 +20 +48 +1502 +14 +6222 +6223 +25 +6224 +6225 +6226 +6227 +5803 +6228 +6229 +2347 +6230 +6231 +3062 +1232 +196 +6232 +6233 +1189 +2580 +6234 +6235 +2410 +57 +6236 +6237 +222 +6238 +43 +6239 +493 +57 +6240 +2728 +3 +751 +6241 +3709 +6242 +6243 +6244 +6245 +6246 +222 +1425 +4315 +14 +32 +6247 +6248 +2566 +6249 +1574 +19 +6250 +179 +6251 +415 +6252 +178 +32 +6253 +6254 +3172 +77 +6255 +6256 +6257 +694 +6258 +3989 +6259 +6260 +6261 +6262 +155 +104 +6263 +57 +6264 +1502 +6265 +6212 +6266 +788 +6267 +6268 +270 +751 +6269 +6270 +6271 +6272 +6273 +6274 +5542 +1775 +6275 +6276 +19 +1710 +484 +6277 +6278 +1112 +6279 +6280 +16 +6281 +6282 +6283 +6284 +6285 +6286 +597 +402 +1542 +6287 +6288 +6289 +6290 +6291 +6292 +6293 +6294 +6295 +6296 +9 +2260 +6297 +6298 +178 +6299 +6300 +4839 +398 +6301 +514 +77 +6302 +22 +6303 +9 +6304 +6305 +417 +6306 +6307 +6308 +19 +6309 +6310 +3375 +6311 +6312 +6313 +6314 +6315 +6316 +2368 +6317 +6318 +3525 +6319 +6320 +6321 +6322 +3252 +6323 +6324 +6325 +6326 +6327 +3 +6328 +6329 +9 +176 +6330 +57 +1531 +272 +6331 +25 +6332 +6333 +815 +4952 +3104 +6334 +6335 +1512 +6336 +4280 +5127 +6337 +6338 +6339 +2 +67 +446 +6340 +179 +66 +6289 +6341 +6342 +43 +5780 +6343 +20 +32 +32 +6344 +2197 +6345 +6346 +6347 +6348 +6349 +2015 +6350 +6351 +188 +4405 +6352 +6353 +6354 +694 +6355 +345 +822 +354 +6356 +2907 +19 +6357 +6358 +597 +6359 +514 +6360 +6361 +6362 +185 +6363 +6364 +22 +6365 +6366 +286 +6367 +48 +6368 +3777 +3466 +6369 +687 +6370 +6371 +6372 +67 +6373 +564 +6374 +6375 +19 +15 +6376 +317 +201 +693 +1287 +6377 +2 +6378 +6379 +6380 +6381 +155 +6382 +43 +6383 +6384 +43 +6385 +6386 +6387 +6175 +6388 +5837 +2064 +6389 +6390 +2 +15 +6391 +14 +411 +286 +4088 +5856 +6392 +19 +1244 +43 +514 +222 +2316 +6393 +1100 +701 +861 +6394 +2262 +6395 +4627 +142 +6396 +6397 +32 +4900 +671 +6398 +3406 +1291 +6399 +15 +286 +6400 +6401 +6402 +6403 +57 +155 +4128 +155 +6404 +3307 +1710 +6405 +6406 +1961 +6407 +286 +6408 +1245 +6409 +2320 +14 +6410 +15 +815 +6411 +6054 +15 +6412 +6413 +6414 +48 +15 +713 +76 +14 +6415 +5856 +228 +6416 +6417 +6418 +19 +1465 +6419 +1870 +6420 +6421 +6422 +6423 +6424 +6425 +5780 +6426 +6427 +1105 +6428 +345 +6429 +2019 +1245 +286 +6430 +188 +3870 +14 +6431 +15 +6432 +19 +1502 +399 +141 +6433 +1047 +6434 +6435 +6436 +3725 +6437 +6438 +6439 +597 +6440 +989 +6441 +6442 +3061 +6443 +4 +6444 +6445 +179 +6446 +6447 +15 +6341 +3406 +3 +25 +36 +6448 +4647 +6449 +6450 +6451 +286 +6452 +6453 +6454 +411 +6455 +6456 +5856 +1808 +3055 +6457 +6458 +6459 +554 +2341 +6460 +6461 +6462 +6463 +4141 +745 +231 +491 +6464 +6465 +286 +43 +845 +9 +6466 +4 +815 +6467 +6468 +6469 +6470 +6471 +6472 +178 +114 +6473 +317 +3943 +417 +6474 +6475 +29 +3198 +6476 +5013 +270 +6477 +6478 +1386 +6479 +19 +6480 +6481 +6482 +6071 +1829 +6483 +6484 +14 +6485 +209 +6486 +1961 +6487 +3317 +6488 +6289 +6489 +6490 +6491 +1169 +2040 +6492 +1834 +6493 +6494 +6495 +6496 +228 +299 +4 +179 +6497 +665 +10 +6498 +2264 +19 +57 +6412 +790 +1920 +6499 +185 +20 +6500 +6501 +6502 +6503 +3050 +6504 +6505 +270 +237 +6506 +57 +265 +6507 +354 +6508 +6509 +57 +645 +6510 +5780 +6511 +6512 +6513 +6514 +448 +586 +6515 +6516 +6517 +6518 +6519 +10 +6520 +1384 +6521 +6522 +6523 +3309 +179 +6524 +399 +6525 +6526 +1956 +6527 +16 +57 +22 +6528 +6529 +6530 +6531 +6532 +6533 +286 +5856 +4028 +176 +3829 +2835 +6534 +14 +6535 +14 +6536 +6537 +6538 +6539 +1428 +4 +6540 +6541 +6542 +6543 +788 +6544 +6545 +6546 +176 +6547 +5780 +15 +6548 +6549 +6550 +6551 +6552 +77 +201 +540 +493 +4672 +6553 +6554 +137 +196 +184 +6555 +25 +6556 +6557 +6558 +57 +15 +6559 +6560 +6561 +6562 +6563 +5127 +6564 +19 +694 +1021 +6565 +34 +6566 +48 +1715 +15 +60 +491 +6567 +6568 +5856 +4512 +9 +237 +6569 +480 +892 +25 +6570 +345 +6571 +201 +34 +32 +6572 +6573 +6574 +1744 +6575 +6576 +6577 +9 +6578 +533 +6579 +43 +6580 +1019 +6581 +6582 +15 +6583 +6584 +6585 +6586 +6587 +15 +43 +331 +39 +6588 +665 +3376 +6589 +164 +6590 +331 +6591 +15 +6592 +6593 +1249 +6594 +6595 +6596 +2502 +1415 +20 +6597 +6598 +6599 +5895 +464 +6600 +2913 +155 +415 +57 +6601 +1716 +272 +6602 +1542 +736 +558 +6603 +2356 +9 +14 +6604 +15 +1172 +279 +15 +60 +3978 +349 +6605 +3814 +379 +6606 +25 +6607 +6608 +6609 +6610 +6611 +6612 +1438 +338 +6613 +6614 +16 +3946 +1961 +1718 +707 +1047 +6615 +6616 +6617 +5856 +10 +20 +436 +6618 +6619 +2164 +15 +6620 +6621 +86 +417 +6622 +751 +6623 +6624 +15 +6625 +1920 +6626 +1668 +1100 +6627 +345 +6628 +6629 +57 +6630 +6631 +6632 +6633 +10 +6634 +286 +32 +2329 +721 +493 +6412 +1605 +1768 +3241 +349 +19 +1374 +6635 +6636 +1942 +6637 +6638 +1698 +6639 +598 +6640 +138 +6641 +6642 +6643 +345 +764 +57 +6644 +6645 +272 +5298 +1481 +3213 +6646 +10 +6647 +89 +6648 +32 +6649 +274 +286 +6650 +6651 +22 +3 +43 +1567 +180 +4128 +1966 +815 +6652 +19 +9 +6653 +1011 +6654 +4 +936 +6655 +305 +1010 +6656 +6657 +32 +1120 +43 +286 +188 +6658 +34 +15 +14 +6659 +1232 +6660 +6661 +6662 +6663 +6664 +6665 +22 +6666 +3005 +19 +2427 +533 +6667 +1889 +6668 +825 +1867 +1710 +6669 +43 +3104 +6670 +57 +331 +1245 +6671 +1442 +1808 +6672 +694 +861 +6673 +3 +6674 +6675 +14 +6676 +2546 +4441 +6289 +201 +6677 +6678 +6679 +6680 +6681 +677 +5202 +1920 +6682 +6683 +2776 +6684 +57 +15 +6685 +12 +1765 +6686 +248 +6687 +32 +6688 +1169 +6689 +1824 +6289 +5780 +15 +6690 +286 +6691 +2208 +815 +6692 +6693 +6694 +6695 +22 +1743 +6696 +6697 +398 +213 +6698 +6699 +138 +231 +6700 +6701 +6702 +6703 +6704 +2318 +197 +6705 +6706 +19 +6707 +6708 +20 +2734 +6709 +6710 +6711 +6712 +6713 +286 +43 +6714 +2836 +6715 +1082 +6716 +6289 +26 +137 +6717 +43 +5564 +6718 +6719 +6720 +6721 +6722 +6723 +6724 +6725 +345 +4 +6726 +5780 +34 +6727 +831 +6086 +6728 +6729 +6730 +6731 +6732 +6733 +6734 +20 +155 +6735 +2043 +89 +331 +15 +237 +57 +1217 +16 +6736 +6737 +43 +48 +6738 +6739 +2619 +6740 +6741 +514 +286 +6742 +345 +6743 +6744 +6745 +6746 +6747 +15 +99 +6748 +6749 +6750 +6751 +6752 +6753 +6754 +6755 +751 +6756 +32 +20 +6757 +6758 +48 +6759 +278 +648 +6760 +6761 +6762 +20 +6763 +6289 +6764 +6412 +2260 +96 +201 +6765 +1232 +19 +6766 +6767 +564 +6768 +6769 +57 +373 +417 +6770 +2260 +6771 +112 +6772 +6773 +337 +484 +6774 +6775 +4364 +6776 +1913 +6777 +32 +6778 +10 +3192 +122 +270 +1508 +22 +5856 +392 +6779 +1716 +6780 +6781 +6782 +6783 +6784 +6785 +6786 +2561 +654 +6787 +6788 +6789 +6790 +6728 +11 +6791 +342 +6792 +286 +6793 +14 +6794 +6795 +6796 +6797 +6798 +6799 +2694 +6800 +99 +6801 +34 +2318 +6802 +15 +6803 +5314 +6804 +6805 +48 +6806 +19 +6807 +1465 +6808 +112 +6809 +6810 +15 +155 +34 +4745 +484 +6811 +6812 +6813 +89 +6814 +5659 +6480 +1172 +6164 +2913 +6815 +1559 +1559 +6816 +284 +6817 +6818 +6819 +566 +48 +14 +845 +15 +6820 +6821 +6822 +286 +1133 +345 +3055 +703 +6823 +32 +6824 +6825 +6826 +665 +16 +43 +6827 +4026 +6828 +1900 +6829 +5734 +286 +6830 +237 +6831 +4388 +1383 +6832 +6833 +6834 +2029 +6835 +6836 +6837 +6838 +369 +6839 +6840 +57 +1875 +554 +155 +1012 +6841 +4 +6842 +43 +2197 +354 +6843 +736 +3995 +6844 +1465 +1172 +6845 +6846 +4765 +6847 +6848 +4263 +284 +1107 +3 +6849 +736 +6850 +303 +6851 +2849 +6852 +6853 +32 +286 +6854 +6855 +6856 +48 +6857 +303 +357 +554 +6858 +15 +6859 +659 +696 +6860 +6861 +141 +6862 +1637 +4398 +6863 +5561 +2561 +6864 +6865 +514 +6866 +701 +6867 +6868 +1172 +6869 +4002 +6870 +1637 +6871 +2302 +6872 +6873 +491 +6874 +286 +155 +2978 +6875 +6876 +155 +6877 +586 +5169 +15 +647 +1870 +6878 +6879 +6880 +6881 +6882 +6883 +38 +6884 +6885 +6886 +6887 +5008 +6412 +6888 +22 +6889 +60 +323 +6890 +2790 +6891 +6892 +6893 +6894 +6895 +2289 +6896 +6897 +284 +303 +6898 +3981 +1223 +6899 +6900 +1559 +3543 +152 +6901 +1604 +397 +213 +48 +6902 +5304 +4859 +6903 +741 +6904 +6905 +6906 +5825 +6907 +17 +19 +6908 +6909 +1612 +6910 +6911 +248 +765 +4139 +915 +6912 +4487 +6913 +1808 +6914 +6915 +910 +6916 +6917 +299 +286 +19 +48 +3594 +6918 +6919 +1961 +4709 +6920 +6921 +6922 +6923 +6095 +6924 +2260 +597 +369 +15 +1956 +6925 +6926 +751 +3367 +6927 +284 +5780 +6928 +57 +43 +284 +3054 +6929 +6595 +284 +861 +6930 +6931 +6932 +566 +6900 +6933 +349 +6934 +6935 +209 +4425 +6936 +20 +2591 +484 +531 +5111 +583 +509 +6937 +355 +613 +6938 +6939 +6940 +57 +6941 +6942 +2770 +2356 +592 +6943 +39 +885 +201 +6944 +15 +6945 +6946 +6947 +179 +6948 +6949 +286 +2482 +6950 +6951 +6952 +6953 +2502 +5780 +955 +32 +573 +6954 +398 +201 +6955 +6956 +6957 +337 +694 +6958 +597 +6959 +6960 +1512 +6961 +6962 +284 +6963 +6964 +6965 +1249 +6966 +6967 +6968 +6969 +1157 +6970 +57 +9 +6971 +6972 +57 +165 +6973 +6974 +345 +9 +713 +6975 +6976 +1829 +248 +6977 +6978 +6979 +6980 +6981 +2733 +6982 +6533 +6983 +6984 +6985 +2410 +15 +6986 +4425 +6987 +6988 +6989 +845 +471 +6990 +699 +6991 +6992 +3905 +222 +6993 +237 +6994 +6995 +6996 +6997 +6998 +6999 +7000 +7001 +7002 +2136 +892 +19 +43 +7003 +7004 +197 +842 +15 +7005 +7006 +7007 +2477 +809 +7008 +7009 +7010 +9 +648 +89 +1961 +228 +721 +910 +7011 +15 +7012 +7013 +331 +3849 +1684 +7014 +7015 +7016 +7017 +7018 +7019 +7020 +7021 +7022 +19 +3647 +616 +5537 +32 +25 +1112 +3 +7023 +7024 +7025 +4 +4616 +1244 +3519 +7026 +7027 +57 +7028 +7029 +7030 +20 +7031 +112 +2260 +19 +25 +210 +43 +3640 +7032 +7033 +5556 +7034 +7035 +7036 +7037 +345 +7038 +9 +7039 +3534 +7040 +284 +2804 +7041 +1867 +7042 +7043 +7044 +440 +7045 +3599 +2064 +1965 +7046 +15 +7047 +272 +7048 +7049 +4855 +1364 +7050 +303 +2697 +7051 +7052 +15 +43 +5308 +597 +1346 +590 +7053 +7054 +7055 +4760 +7056 +7057 +694 +7058 +7059 +7060 +7061 +4518 +7062 +7063 +7064 +2841 +436 +2431 +201 +323 +7065 +15 +201 +7066 +2944 +7067 +7068 +7069 +936 +7070 +2314 +1612 +1415 +14 +7071 +7072 +6289 +7073 +7074 +7075 +665 +15 +7076 +7077 +464 +19 +7078 +286 +10 +7079 +7080 +4139 +190 +7081 +7082 +7083 +20 +1013 +2591 +7084 +738 +7085 +7086 +32 +1768 +7087 +7088 +19 +2694 +597 +10 +7089 +7090 +3553 +7091 +7092 +200 +7093 +5320 +7094 +1051 +57 +7095 +7096 +4634 +48 +1508 +430 +7097 +19 +15 +842 +373 +7098 +1010 +20 +7099 +713 +815 +7100 +284 +155 +7101 +57 +1021 +7102 +7103 +3417 +7104 +5700 +1566 +7105 +7106 +1047 +155 +7107 +7108 +7109 +22 +1090 +665 +1021 +7110 +887 +554 +7111 +15 +20 +597 +2561 +284 +6878 +3296 +869 +7112 +7113 +172 +7114 +32 +7115 +7116 +337 +7117 +43 +7118 +415 +7119 +7120 +7121 +9 +872 +1364 +7122 +3455 +32 +7123 +492 +7124 +99 +7125 +7126 +7127 +16 +1867 +9 +586 +1415 +7128 +7129 +7130 +22 +7131 +7132 +7133 +7134 +7135 +7136 +59 +7137 +989 +7138 +2593 +2925 +7139 +48 +7140 +345 +7141 +1124 +354 +7142 +1172 +34 +7143 +721 +7144 +7145 +57 +43 +7146 +6916 +7147 +7148 +7149 +19 +1531 +14 +7150 +32 +7151 +7152 +10 +7153 +7154 +7155 +1364 +7156 +1531 +20 +7157 +20 +7158 +7159 +57 +7160 +7161 +19 +7162 +7163 +7164 +7165 +7166 +493 +7167 +3317 +7168 +1356 +7169 +7170 +15 +7171 +1738 +286 +7172 +7173 +15 +1531 +3902 +815 +2593 +3852 +99 +7174 +7175 +7176 +610 +867 +7177 +7178 +109 +7179 +7180 +7181 +648 +9 +7182 +7183 +7184 +7185 +43 +7186 +7187 +495 +7188 +7189 +4634 +16 +7190 +7191 +7192 +7193 +317 +7194 +7195 +364 +1364 +14 +7196 +155 +7197 +2 +10 +1208 +7198 +7199 +295 +7200 +3216 +7201 +7202 +7203 +98 +1710 +677 +7204 +7205 +7206 +7207 +5780 +7208 +2040 +7209 +7210 +5659 +7211 +358 +402 +155 +7212 +89 +213 +7213 +7214 +7215 +6057 +7216 +16 +7217 +1154 +7218 +7219 +1502 +2415 +815 +15 +707 +185 +4574 +7220 +6731 +7221 +7222 +2175 +7223 +19 +7224 +331 +7225 +7226 +7227 +19 +7228 +3050 +20 +1149 +1710 +201 +7229 +279 +378 +188 +15 +7230 +2254 +2550 +861 +7231 +647 +20 +7232 +7233 +7234 +3978 +7235 +7236 +7237 +2281 +7238 +46 +2988 +7239 +3376 +43 +96 +1932 +19 +7240 +478 +533 +7241 +993 +7242 +7243 +15 +7244 +7245 +7246 +7247 +7248 +43 +7249 +966 +7250 +7251 +745 +57 +7252 +2289 +76 +7253 +7254 +248 +7255 +7256 +15 +15 +533 +7257 +22 +104 +60 +7258 +7259 +15 +7260 +7261 +317 +4088 +19 +872 +3908 +286 +286 +590 +7262 +437 +586 +201 +32 +7263 +2040 +7264 +7265 +7266 +7267 +7268 +43 +7269 +2 +7270 +7271 +7272 +7273 +7274 +7275 +317 +7276 +22 +2009 +48 +7277 +3059 +1425 +7278 +4950 +7279 +7280 +178 +7281 +7282 +571 +5623 +4411 +7283 +5251 +4411 +7284 +3598 +7285 +7286 +7287 +398 +7288 +6382 +7289 +7290 +2040 +7291 +45 +7292 +2564 +7293 +7294 +3599 +7295 +7296 +7297 +597 +7298 +533 +7299 +1465 +57 +7300 +7301 +201 +7302 +2009 +7303 +7304 +7305 +1513 +751 +7306 +7307 +5254 +2593 +77 +7308 +137 +7309 +4026 +7310 +1052 +15 +7311 +7312 +7313 +271 +712 +7314 +1675 +7315 +1710 +7316 +9 +7317 +7318 +7319 +7320 +7321 +323 +7322 +7323 +7324 +178 +7325 +284 +7326 +7327 +7328 +7329 +1293 +178 +5923 +248 +25 +7330 +7331 +11 +345 +6505 +7332 +6412 +10 +7333 +7334 +764 +7335 +7336 +7337 +827 +1386 +303 +237 +7338 +7339 +7340 +583 +32 +694 +3 +4 +7341 +19 +7342 +4053 +286 +7343 +1454 +1817 +176 +2314 +7344 +7345 +7346 +7347 +7348 +15 +6928 +20 +7349 +7350 +7351 +379 +7352 +25 +155 +7353 +270 +7354 +7355 +201 +7356 +19 +1531 +7357 +32 +7358 +6505 +7359 +3599 +22 +19 +7360 +7361 +7362 +201 +7363 +2974 +7364 +7365 +282 +178 +7366 +7367 +7368 +7369 +5203 +7370 +7371 +1224 +248 +4185 +57 +2176 +25 +3172 +554 +19 +910 +7372 +7373 +15 +14 +7374 +242 +7375 +3759 +15 +14 +7376 +7377 +155 +7378 +1112 +7379 +7380 +20 +7381 +1749 +248 +7382 +7383 +317 +373 +7384 +14 +25 +7357 +19 +648 +2029 +7385 +7386 +7387 +7388 +19 +7389 +915 +7390 +7391 +7392 +7393 +7394 +99 +1244 +32 +7395 +7396 +7397 +1364 +7398 +7399 +7400 +478 +3055 +7401 +1200 +7402 +399 +7403 +15 +3104 +4364 +19 +7404 +20 +19 +7405 +7406 +2728 +7407 +656 +7408 +7409 +1834 +2029 +7410 +7411 +399 +228 +7412 +7413 +284 +7414 +34 +20 +7415 +7416 +77 +213 +48 +19 +155 +7417 +7418 +2289 +415 +7419 +7420 +6501 +7421 +7422 +43 +164 +4 +7315 +345 +7423 +1834 +7424 +1900 +7425 +7426 +2979 +19 +337 +7427 +2913 +32 +533 +564 +7428 +7429 +1107 +7430 +7431 +7432 +2368 +337 +358 +7433 +7434 +1508 +19 +7435 +1232 +7436 +5265 +7437 +15 +7438 +284 +7439 +188 +364 +77 +7440 +9 +5780 +3148 +972 +155 +7441 +7442 +1465 +7443 +4 +7444 +7445 +7446 +7447 +1992 +323 +32 +7448 +7449 +7450 +43 +1222 +5780 +7451 +7452 +7453 +7454 +345 +1079 +7455 +7456 +7457 +7458 +7459 +2314 +7460 +15 +416 +7461 +536 +286 +269 +7462 +201 +20 +7463 +3202 +7464 +190 +7465 +7466 +7467 +7369 +3599 +7468 +22 +7469 +7470 +7471 +7472 +7473 +7474 +7475 +7476 +188 +7477 +34 +7478 +7479 +7480 +915 +5326 +7481 +2387 +1944 +286 +829 +22 +586 +66 +7482 +1112 +6289 +5839 +15 +7483 +7484 +7485 +7486 +7487 +7488 +77 +7489 +7490 +32 +415 +7491 +7492 +7493 +4364 +7494 +43 +7495 +3858 +7496 +7497 +7498 +3981 +3078 +345 +3465 +3543 +7499 +6518 +7500 +7501 +4598 +7502 +7503 +3515 +1823 +5629 +7504 +197 +1220 +7505 +15 +2347 +7506 +9 +2694 +7507 +7508 +7509 +7510 +3470 +7511 +7512 +15 +7513 +7514 +19 +7515 +845 +7516 +7517 +7518 +7519 +3959 +7520 +213 +57 +7521 +5908 +1401 +7522 +7523 +7524 +337 +7525 +213 +7526 +519 +7527 +7528 +7529 +7530 +7531 +7532 +736 +7533 +7534 +5780 +7535 +7536 +7276 +7137 +5552 +7537 +7538 +373 +7539 +19 +2356 +5336 +337 +4414 +7540 +7541 +15 +2260 +7542 +7543 +3914 +7544 +7545 +303 +7546 +7547 +303 +7548 +493 +573 +7549 +206 +7550 +7551 +19 +7552 +1046 +7553 +540 +720 +1517 +286 +7554 +7555 +299 +1352 +7556 +2429 +60 +7557 +213 +7558 +1870 +7559 +861 +7560 +6617 +1840 +20 +7561 +7562 +7563 +303 +4263 +7564 +7565 +25 +7566 +7567 +7568 +357 +4155 +7569 +7570 +15 +573 +19 +7571 +7572 +3999 +7573 +7574 +7575 +7576 +7577 +373 +7578 +7579 +2253 +7580 +19 +7581 +7582 +15 +7583 +7584 +43 +19 +4884 +7585 +7586 +849 +7587 +7588 +7589 +2902 +7590 +7591 +955 +828 +694 +7592 +486 +7593 +7594 +7595 +237 +464 +5521 +3 +1357 +2135 +2697 +12 +7596 +7597 +7598 +7599 +7600 +2 +586 +7601 +7602 +7289 +7603 +694 +7604 +43 +1918 +2577 +7605 +4963 +201 +2787 +2804 +7606 +5601 +286 +7607 +7608 +7609 +2316 +7610 +6518 +7611 +7612 +2762 +7613 +7614 +7615 +7616 +1955 +7617 +7618 +7619 +6449 +7620 +7621 +7622 +43 +7623 +558 +7624 +1799 +7625 +828 +7626 +7627 +354 +7628 +484 +32 +317 +7629 +6716 +7630 +7631 +43 +1710 +303 +7632 +209 +7633 +738 +43 +197 +16 +34 +7634 +7635 +7636 +1425 +2034 +7637 +7638 +15 +7639 +416 +7640 +201 +57 +7641 +317 +1364 +7642 +7643 +7644 +3354 +7645 +19 +373 +7646 +915 +7647 +345 +201 +77 +493 +7648 +7649 +7650 +115 +648 +77 +7651 +7652 +845 +5689 +1021 +7653 +1160 +7654 +7655 +2166 +7656 +7657 +2471 +7658 +597 +7659 +7660 +504 +25 +7661 +7236 +7662 +7663 +57 +7664 +201 +7665 +1425 +1710 +7666 +89 +7667 +721 +7668 +7669 +7670 +7671 +7672 +7673 +7674 +7675 +7676 +7677 +5623 +3553 +7678 +7679 +6289 +43 +7680 +7681 +7682 +7683 +2537 +20 +7684 +7685 +201 +43 +7686 +1160 +7687 +791 +7688 +7689 +5949 +4512 +7690 +417 +3353 +7691 +2129 +7692 +7693 +1153 +9 +19 +7694 +57 +43 +286 +1812 +7695 +1343 +2253 +6518 +7696 +5204 +345 +7697 +1696 +7698 +4028 +1710 +5780 +2782 +7699 +2769 +349 +10 +2615 +7700 +915 +7701 +4598 +12 +19 +354 +14 +6305 +89 +345 +7702 +201 +14 +15 +1116 +7703 +4634 +7704 +7705 +7706 +464 +4 +7707 +5312 +7708 +4905 +3999 +39 +7709 +4024 +7710 +5990 +286 +43 +19 +248 +317 +845 +3503 +3645 +7711 +7712 +66 +17 +7713 +7714 +7715 +57 +6463 +158 +7716 +7717 +7718 +7719 +7720 +7721 +2163 +29 +248 +303 +7722 +337 +7723 +20 +7724 +2849 +4048 +15 +7725 +284 +43 +6187 +14 +7726 +7727 +7728 +7729 +337 +7730 +237 +4075 +7731 +7732 +7733 +7734 +7735 +7736 +694 +736 +1352 +29 +272 +1559 +57 +248 +665 +7737 +7738 +20 +2879 +5340 +134 +7739 +1169 +4677 +7740 +7741 +7742 +7743 +7744 +7745 +416 +845 +225 +7746 +248 +7747 +200 +7748 +43 +43 +7749 +7750 +7751 +7752 +7577 +412 +7753 +155 +7754 +11 +7755 +4 +5326 +7756 +7757 +7758 +5556 +7442 +19 +7759 +7760 +43 +7761 +7762 +114 +2140 +20 +7763 +1169 +1011 +7764 +178 +278 +5731 +7765 +3844 +7766 +1011 +14 +317 +237 +7767 +7768 +519 +7769 +7770 +201 +7771 +7772 +7773 +7774 +7775 +7776 +7777 +7778 +188 +2314 +7779 +317 +7780 +7781 +7782 +7783 +703 +1784 +7784 +7785 +7786 +7787 +7788 +822 +7789 +936 +7790 +7791 +7792 +3976 +7793 +7794 +7795 +32 +7796 +7797 +495 +20 +5601 +7798 +7799 +7800 +7137 +7801 +7802 +7803 +7804 +7805 +4925 +7806 +7807 +7808 +7809 +7810 +7811 +7812 +1083 +764 +1105 +7364 +7813 +7814 +7815 +7816 +345 +7817 +7818 +7819 +15 +7820 +7821 +3906 +7822 +279 +7823 +14 +228 +357 +3059 +7824 +354 +7825 +7826 +7827 +7828 +377 +7829 +1112 +228 +597 +7830 +7831 +210 +3467 +7832 +7833 +1580 +7834 +694 +7835 +7836 +7837 +7838 +7839 +7840 +7841 +170 +7842 +7843 +7844 +7845 +48 +7846 +43 +7847 +10 +57 +7848 +5700 +7849 +7850 +7851 +7852 +7853 +7854 +694 +3376 +7855 +35 +7856 +7857 +7858 +7859 +201 +5243 +7860 +7861 +7862 +500 +7863 +7864 +7865 +7866 +7867 +4855 +1808 +7868 +7869 +5022 +7870 +7871 +2006 +7872 +43 +15 +7873 +7874 +2320 +7875 +7876 +1696 +7877 +213 +7878 +7879 +7880 +554 +7881 +7882 +248 +7883 +7884 +16 +7885 +303 +7886 +337 +2770 +7887 +7888 +1112 +610 +176 +7889 +7890 +10 +345 +15 +7891 +7892 +3546 +7893 +2949 +16 +303 +7894 +349 +7895 +7896 +7897 +1940 +201 +7898 +1710 +16 +7899 +7900 +284 +303 +7901 +5584 +303 +15 +7902 +7903 +7904 +7905 +7906 +1089 +7907 +3598 +7908 +7909 +15 +7910 +7911 +7912 +270 +19 +7913 +2029 +7914 +5075 +7915 +269 +10 +43 +411 +7916 +7917 +1612 +1425 +491 +2694 +859 +7918 +7919 +7920 +43 +741 +7921 +3465 +271 +15 +7922 +7923 +43 +7924 +7925 +4301 +7926 +7927 +248 +7928 +286 +647 +7929 +7930 +4907 +5065 +7931 +3 +7932 +7933 +9 +6950 +7934 +7935 +7936 +741 +99 +7937 +7938 +7939 +7940 +3148 +7941 +7942 +3095 +7943 +7944 +7945 +10 +7946 +6071 +7947 +7948 +892 +7949 +7531 +299 +14 +2546 +1172 +7950 +337 +7951 +3 +7952 +549 +703 +7953 +7954 +7955 +7956 +7835 +7957 +7958 +7959 +6439 +7960 +7961 +7962 +1262 +1021 +286 +7963 +7964 +15 +1089 +484 +7965 +19 +7966 +213 +7842 +7967 +32 +7968 +284 +464 +1470 +213 +22 +7969 +725 +7970 +7971 +7956 +398 +7972 +1456 +1637 +554 +317 +213 +7973 +7974 +337 +2700 +7975 +7976 +286 +7977 +7978 +533 +112 +15 +7979 +1955 +694 +7980 +7981 +7982 +7983 +1082 +2325 +7984 +6468 +22 +7985 +7986 +1765 +7987 +7988 +7989 +7990 +7991 +345 +6439 +3004 +7992 +3844 +21 +7993 +337 +2243 +196 +7994 +7995 +7270 +15 +7996 +1562 +179 +7997 +284 +1121 +7998 +915 +342 +586 +43 +892 +4634 +22 +7999 +2040 +8000 +342 +8001 +8002 +8003 +8004 +213 +446 +19 +8005 +1445 +2449 +317 +188 +317 +8006 +8007 +8008 +8009 +1112 +8010 +8011 +2 +8012 +8013 +20 +528 +4634 +8014 +57 +6915 +1356 +8015 +8016 +14 +8017 +6304 +8018 +647 +99 +5448 +34 +32 +22 +8019 +178 +8020 +8021 +201 +2804 +378 +270 +8022 +6490 +8023 +248 +8024 +8025 +15 +8026 +8027 +19 +8028 +8029 +8030 +2197 +694 +8031 +5780 +8032 +915 +8033 +8034 +8035 +323 +8036 +8037 +8038 +8039 +8040 +8041 +1655 +8042 +1513 +989 +15 +8043 +20 +32 +2694 +8044 +5976 +155 +8045 +8046 +1320 +249 +7215 +8047 +647 +8048 +8049 +8050 +8051 +7522 +5780 +8052 +7565 +3168 +8053 +104 +305 +1710 +4441 +1559 +8054 +4762 +416 +4028 +533 +8055 +2577 +222 +8056 +3669 +8057 +8058 +201 +8059 +8060 +292 +8061 +8062 +8063 +8064 +2993 +7522 +8065 +8066 +8067 +4053 +213 +8068 +8069 +8070 +8071 +14 +114 +815 +4227 +32 +242 +8072 +89 +8073 +179 +8074 +8075 +3 +8076 +19 +8077 +179 +8078 +8079 +8080 +8081 +4261 +14 +8082 +8083 +8084 +19 +1160 +115 +8085 +8086 +8087 +99 +279 +8088 +1889 +8089 +8090 +8091 +4 +8092 +1542 +303 +303 +416 +8093 +201 +102 +109 +8094 +3038 +5764 +8095 +337 +8096 +8097 +8098 +2836 +8099 +8100 +8101 +1071 +228 +8102 +493 +8103 +8104 +8105 +4747 +4390 +112 +8106 +869 +8107 +8108 +8109 +34 +8110 +7027 +8111 +8112 +8113 +8114 +8115 +8116 +8117 +1808 +8118 +415 +8119 +1502 +8120 +249 +8121 +910 +8122 +8123 +8124 +8125 +67 +8126 +8127 +8128 +8129 +57 +1551 +8130 +8131 +137 +8132 +19 +8133 +8134 +8135 +8136 +8137 +8138 +8139 +493 +8140 +8141 +8142 +1710 +286 +8143 +8144 +8145 +528 +8146 +286 +6533 +417 +8147 +77 +815 +1578 +8148 +8149 +8150 +57 +8151 +8152 +8153 +6627 +491 +16 +1453 +1021 +8154 +8155 +8156 +8157 +25 +1989 +8158 +5172 +8159 +8160 +8161 +8162 +2043 +8163 +8164 +8165 +253 +1252 +43 +8166 +5071 +1655 +2043 +8167 +2330 +19 +57 +337 +22 +12 +416 +228 +8168 +8169 +48 +8170 +8171 +8172 +3354 +8173 +8149 +8174 +8175 +8176 +8177 +586 +8178 +1224 +14 +8179 +8180 +8181 +8182 +8183 +8184 +8185 +8186 +646 +2872 +80 +8187 +8188 +8189 +8190 +8191 +751 +8192 +8193 +284 +491 +270 +8194 +5465 +8195 +20 +237 +8196 +15 +8197 +484 +8198 +493 +22 +179 +284 +1637 +4155 +8199 +5992 +8200 +232 +5846 +703 +8201 +8202 +8203 +5623 +2410 +8204 +8205 +8206 +10 +8207 +8208 +6161 +5130 +5080 +8209 +8210 +1249 +6505 +8211 +8212 +665 +5780 +2794 +43 +286 +8213 +5297 +665 +357 +8214 +8151 +2136 +8215 +8216 +8217 +8218 +2 +8219 +57 +2117 +8220 +8221 +331 +519 +8222 +8223 +3 +237 +1684 +8224 +845 +20 +22 +3844 +8225 +15 +35 +1710 +1824 +8226 +8227 +77 +8228 +43 +8229 +4173 +5773 +8230 +8231 +7768 +1817 +8232 +590 +8233 +8234 +8235 +8236 +8237 +286 +8238 +99 +8239 +416 +8240 +104 +8241 +9 +4227 +8242 +8243 +8244 +8245 +178 +137 +22 +8246 +8247 +8248 +213 +8249 +8250 +8251 +3061 +8252 +8253 +8254 +8255 +1042 +8256 +8257 +8258 +8259 +3976 +5838 +4 +1019 +2694 +8260 +5969 +3465 +8261 +1502 +8262 +8263 +8264 +6741 +15 +19 +8265 +270 +8266 +8267 +7522 +1562 +5614 +43 +3055 +8268 +15 +8269 +305 +8270 +2913 +1105 +8271 +176 +104 +8272 +164 +317 +1133 +15 +8273 +1710 +1812 +8274 +8275 +8276 +8277 +303 +8278 +57 +8279 +8280 +4961 +178 +8281 +98 +8282 +15 +484 +6505 +2 +32 +16 +8283 +8284 +5780 +8285 +8286 +12 +8287 +213 +8288 +8289 +8290 +8291 +1533 +398 +8292 +8293 +15 +5202 +1531 +8294 +4752 +19 +8295 +20 +8296 +140 +1354 +1383 +8297 +741 +8298 +8299 +8300 +8301 +8302 +8303 +616 +8304 +703 +1047 +8305 +8306 +8307 +2993 +19 +8308 +1018 +43 +43 +3407 +8309 +8310 +8311 +8312 +1364 +77 +5904 +8313 +8314 +8315 +8316 +8317 +616 +2953 +8318 +57 +8319 +8320 +1013 +590 +342 +8321 +8322 +209 +10 +8323 +4280 +1717 +1425 +8324 +3698 +715 +8325 +1710 +2804 +8326 +541 +8327 +8328 +8329 +8330 +317 +8331 +32 +8332 +8333 +8334 +8335 +662 +398 +8336 +77 +14 +4487 +8337 +8338 +2 +15 +2015 +286 +8339 +155 +286 +2477 +8340 +1738 +815 +8341 +140 +369 +4677 +178 +665 +658 +8342 +8343 +125 +2260 +8344 +354 +8345 +8346 +8347 +989 +436 +43 +22 +8348 +8349 +16 +8350 +8351 +8352 +299 +8353 +15 +15 +2733 +6335 +4422 +817 +8354 +8355 +8356 +74 +1234 +8357 +586 +8358 +8359 +8360 +8361 +5039 +1779 +8362 +8363 +598 +8364 +8365 +57 +317 +586 +57 +15 +12 +8366 +8367 +8368 +8369 +2060 +8370 +8371 +411 +8372 +125 +8373 +8374 +8375 +8376 +1710 +22 +8377 +8378 +43 +15 +8379 +8380 +172 +8381 +14 +6883 +7270 +8382 +413 +8115 +8383 +3626 +8384 +8385 +180 +8386 +57 +8387 +554 +8388 +2988 +671 +19 +5780 +178 +8389 +32 +8390 +8391 +284 +8392 +8393 +213 +8394 +5968 +8395 +8396 +43 +8397 +8398 +764 +6070 +8399 +176 +8400 +284 +303 +8401 +284 +305 +745 +8402 +8403 +8404 +2253 +32 +20 +8405 +2029 +43 +561 +8406 +34 +8407 +337 +8408 +411 +10 +3 +8409 +8410 +8411 +1426 +8412 +8413 +701 +3743 +25 +8414 +8415 +8416 +337 +8417 +8418 +5512 +3514 +861 +1692 +464 +1955 +8419 +57 +22 +8420 +8421 +8422 +5022 +8423 +1513 +411 +155 +8424 +197 +60 +188 +8425 +3732 +8426 +415 +8427 +57 +1153 +8428 +8429 +8430 +60 +8431 +8432 +8433 +8434 +317 +8435 +8436 +176 +6225 +8437 +8438 +624 +8439 +2982 +6736 +8440 +586 +8441 +8442 +7408 +1502 +176 +8443 +286 +8444 +8445 +8446 +213 +8447 +7743 +8448 +554 +703 +1310 +22 +822 +791 +8449 +57 +201 +8450 +6214 +7137 +8451 +15 +8448 +76 +8452 +19 +8453 +842 +2439 +936 +14 +8454 +1364 +8455 +8456 +19 +8457 +8458 +713 +8459 +15 +586 +8460 +8461 +8462 +8463 +8464 +8465 +3543 +8407 +2802 +597 +6400 +8466 +8467 +8468 +8469 +882 +17 +20 +2537 +8470 +8471 +8472 +4461 +10 +8473 +8474 +416 +8475 +8476 +19 +99 +357 +8477 +8478 +8479 +8480 +15 +1727 +8481 +301 +9 +9 +8482 +8483 +19 +248 +4024 +272 +8484 +8485 +8486 +317 +15 +4278 +19 +2762 +2347 +1049 +8487 +156 +15 +8488 +8489 +22 +8490 +8491 +1310 +8492 +178 +8493 +8494 +8495 +8496 +8497 +22 +528 +8498 +436 +8499 +751 +2253 +8500 +8501 +741 +694 +766 +345 +8502 +356 +8503 +8504 +8505 +8506 +137 +8507 +8508 +8509 +8510 +8511 +8512 +8513 +270 +8514 +8515 +4359 +8516 +8517 +8518 +357 +178 +8519 +8520 +1291 +8521 +8522 +740 +370 +2728 +8523 +1956 +764 +8524 +15 +3594 +8525 +8526 +8527 +8528 +8529 +8530 +349 +8531 +10 +3504 +8532 +7896 +200 +586 +700 +8533 +1559 +89 +19 +1401 +8534 +8535 +8536 +8537 +8538 +5561 +3369 +345 +178 +8539 +8540 +8541 +6335 +8542 +8543 +5780 +8544 +8545 +155 +8546 +8547 +2316 +8548 +915 +8549 +8550 +1481 +337 +8551 +8552 +155 +8553 +19 +137 +1109 +8554 +354 +8555 +2459 +1018 +8556 +8557 +15 +910 +8558 +178 +8559 +8560 +1401 +8561 +8562 +8563 +8564 +8565 +1169 +3182 +14 +971 +1574 +6071 +8566 +213 +8567 +9 +272 +8568 +10 +533 +5169 +331 +8569 +8570 +15 +402 +8571 +8572 +8573 +248 +2405 +8574 +114 +8575 +213 +43 +8576 +8577 +284 +8578 +8579 +8580 +8581 +1071 +8582 +8583 +3382 +8584 +8585 +966 +8586 +2289 +5078 +14 +8587 +32 +303 +1385 +900 +915 +8588 +15 +1502 +15 +8589 +8590 +43 +8591 +8592 +8593 +8594 +8595 +3148 +1668 +8596 +8597 +8598 +48 +20 +8599 +3026 +8600 +17 +15 +8601 +8602 +8603 +15 +8604 +541 +8605 +14 +8606 +8607 +873 +8608 +20 +8609 +1082 +1425 +8610 +8611 +119 +8612 +1109 +22 +8613 +3559 +5782 +8614 +89 +8615 +2924 +15 +3729 +8616 +8617 +2427 +60 +989 +597 +15 +303 +8618 +7661 +32 +8619 +8620 +7154 +8621 +2770 +115 +738 +501 +6505 +8622 +8623 +20 +8624 +6581 +4441 +8625 +1018 +8626 +8627 +19 +6010 +8628 +8629 +318 +8630 +7176 +248 +8631 +305 +416 +185 +8632 +10 +8633 +77 +8634 +1232 +8635 +15 +8636 +3251 +8637 +303 +19 +14 +2029 +19 +1100 +43 +8638 +8639 +8640 +4278 +8641 +4855 +19 +399 +16 +8642 +390 +337 +357 +1232 +1021 +6532 +8643 +188 +597 +8644 +8645 +1749 +8646 +915 +32 +1696 +354 +8647 +3055 +15 +983 +6987 +284 +2009 +4388 +8648 +15 +8649 +282 +20 +958 +8650 +270 +8651 +8652 +8653 +1314 +99 +8654 +4116 +8655 +915 +8656 +8657 +8658 +25 +213 +337 +8659 +303 +694 +14 +8660 +8661 +8662 +6761 +1566 +7830 +8663 +8664 +8665 +32 +8666 +8667 +8668 +213 +8669 +15 +8670 +331 +248 +284 +8671 +8672 +8673 +286 +8674 +4387 +8675 +8676 +8677 +8678 +2349 +8679 +8680 +8681 +8682 +8683 +8684 +8685 +8686 +1401 +323 +188 +8687 +8688 +1388 +5585 +2347 +8689 +3908 +8690 +305 +8256 +15 +8691 +8692 +8693 +8694 +8695 +8696 +8697 +8698 +8699 +8700 +8701 +534 +8702 +3279 +8703 +152 +48 +8704 +8705 +15 +8706 +8707 +845 +357 +8708 +152 +8709 +2537 +8710 +8711 +8712 +12 +8713 +8714 +8715 +741 +8716 +936 +8717 +509 +8718 +1513 +3553 +8719 +1515 +8720 +9 +8721 +8722 +1920 +8723 +845 +8724 +8725 +8726 +815 +6070 +676 +8727 +6654 +2009 +1765 +1790 +337 +43 +1234 +8728 +8729 +598 +8730 +57 +8731 +7379 +8732 +8733 +57 +8734 +8735 +43 +6035 +10 +286 +8736 +8737 +8738 +8739 +892 +20 +8740 +8741 +15 +1563 +8742 +4 +398 +665 +694 +284 +8743 +5211 +8744 +8745 +8746 +357 +8747 +8171 +15 +861 +8748 +19 +8749 +4354 +8750 +590 +831 +8751 +8752 +8753 +8754 +8755 +176 +6371 +225 +8756 +8757 +8758 +3 +491 +8759 +8760 +8761 +8762 +8763 +20 +8764 +8765 +2537 +1502 +8766 +1992 +8767 +1234 +484 +1112 +6594 +8768 +8769 +7479 +2446 +2234 +22 +3626 +597 +415 +8770 +1012 +4650 +1244 +8771 +111 +817 +8772 +15 +8773 +284 +1571 +349 +67 +738 +279 +225 +19 +317 +8774 +138 +2139 +8775 +493 +8776 +8777 +8778 +8779 +22 +248 +8780 +8781 +8782 +7675 +8783 +43 +15 +67 +768 +8784 +8785 +506 +8786 +8787 +8788 +1232 +1563 +19 +3598 +4650 +8789 +4070 +8790 +8791 +322 +8792 +19 +170 +8793 +8794 +137 +32 +225 +8795 +8796 +8797 +8798 +8799 +2338 +8800 +7836 +8280 +3828 +8801 +8802 +4298 +8803 +8804 +8805 +8806 +4406 +323 +8807 +10 +1166 +3553 +7176 +32 +8808 +8809 +8810 +33 +6441 +178 +8811 +8812 +915 +15 +286 +791 +8813 +8814 +3790 +6602 +665 +15 +3317 +8815 +8816 +2410 +303 +15 +8817 +8818 +1010 +210 +19 +3559 +4677 +8819 +15 +3252 +8820 +8821 +3827 +8822 +10 +8823 +8824 +8825 +3054 +104 +248 +2308 +213 +8826 +2619 +237 +8827 +1829 +2338 +597 +8828 +2619 +8829 +286 +2537 +2988 +152 +303 +8830 +8831 +800 +138 +8832 +9 +8833 +5780 +303 +501 +32 +8834 +15 +1834 +3739 +7105 +8835 +8836 +892 +8837 +8838 +34 +457 +5780 +8839 +8840 +354 +7139 +8841 +8842 +8843 +8844 +8845 +1965 +8846 +1364 +8847 +155 +8848 +4 +180 +1415 +8849 +5780 +8850 +1200 +2692 +8851 +8852 +487 +286 +155 +8853 +2694 +155 +8854 +8855 +15 +8856 +15 +3 +8857 +8858 +8859 +4283 +8860 +8861 +4954 +8862 +15 +8863 +8864 +8865 +8866 +8867 +8868 +4624 +8869 +1364 +8870 +8871 +2260 +179 +1026 +8872 +5080 +8873 +8874 +8875 +8876 +464 +8877 +6161 +6412 +8878 +8879 +16 +873 +5780 +8880 +5825 +6214 +8881 +1217 +48 +222 +8882 +8883 +345 +8884 +8885 +201 +137 +16 +2347 +1262 +8886 +8887 +57 +43 +8888 +8889 +415 +8890 +57 +8891 +2728 +8892 +19 +464 +8893 +8894 +8895 +8896 +8897 +386 +3029 +349 +872 +4430 +8898 +8899 +8900 +170 +8901 +8902 +4512 +3726 +8903 +1047 +1169 +8904 +8905 +8906 +701 +8907 +8908 +8909 +8910 +8911 +8912 +8913 +8914 +8915 +8916 +8917 +8918 +8919 +8920 +8921 +1870 +8922 +3559 +1287 +5820 +8923 +6878 +140 +188 +8924 +2841 +15 +32 +1870 +8925 +3976 +8926 +19 +8927 +8928 +541 +6304 +8929 +1744 +48 +8930 +1384 +915 +2347 +8931 +43 +8932 +8933 +694 +164 +8934 +8935 +741 +8936 +8937 +9 +43 +8938 +2260 +8939 +1232 +8940 +4685 +303 +2540 +8941 +554 +284 +15 +1257 +8942 +8943 +8944 +1856 +8945 +8946 +8947 +8948 +8949 +3553 +8950 +8951 +8952 +8953 +2476 +8954 +665 +142 +8955 +936 +155 +8956 +5912 +8957 +15 +137 +284 +286 +495 +57 +22 +8958 +8959 +8960 +14 +8961 +4012 +1870 +8962 +43 +8963 +8964 +8965 +8966 +15 +15 +3829 +3743 +6796 +8967 +519 +8968 +703 +648 +57 +232 +5650 +8969 +8970 +8971 +1847 +8972 +8973 +1465 +8974 +8975 +8976 +2849 +8977 +665 +8978 +4490 +8979 +274 +112 +286 +8980 +8981 +1907 +8982 +8983 +32 +8984 +8985 +20 +8986 +4422 +8987 +1575 +1149 +8988 +514 +8989 +8990 +2341 +15 +109 +323 +3930 +8991 +8992 +43 +14 +8993 +8994 +8995 +415 +8996 +19 +8997 +536 +2728 +32 +8998 +8999 +9000 +15 +9001 +3466 +9002 +9003 +2 +155 +286 +5304 +9004 +9005 +6260 +9006 +15 +8645 +15 +554 +9007 +9008 +9009 +9010 +179 +402 +4907 +43 +77 +9011 +10 +1907 +20 +9012 +123 +57 +9013 +9014 +9015 +303 +9016 +9017 +1606 +9018 +398 +9019 +201 +237 +337 +9020 +201 +9021 +15 +6518 +89 +9022 +284 +9023 +12 +984 +4963 +9024 +77 +8110 +9025 +9026 +9027 +5992 +9028 +892 +1956 +9029 +9030 +98 +43 +9 +647 +345 +3 +9031 +20 +15 +9032 +2314 +4297 +5770 +9033 +337 +9034 +179 +9035 +9036 +25 +301 +736 +19 +5731 +9037 +345 +464 +692 +9038 +9039 +9040 +9041 +9042 +19 +493 +1465 +9043 +616 +9044 +9045 +4693 +270 +9046 +916 +9047 +416 +9048 +1013 +9049 +9050 +9051 +1984 +9052 +416 +9053 +373 +9 +9054 +9055 +9056 +9057 +2349 +286 +19 +5780 +9058 +1426 +9059 +19 +9060 +2824 +1655 +9061 +317 +9062 +9063 +9064 +9065 +915 +9066 +9067 +9068 +3205 +9 +57 +9069 +501 +178 +9070 +9071 +1514 +5285 +1425 +9072 +1900 +32 +9073 +19 +9074 +19 +32 +9075 +2835 +15 +9076 +1955 +104 +9 +4364 +416 +9077 +9078 +9079 +9080 +9081 +533 +9082 +14 +9083 +2865 +9084 +9085 +5313 +9086 +1834 +9087 +225 +9088 +15 +4278 +286 +9089 +284 +7716 +9090 +43 +9091 +35 +9092 +2625 +284 +284 +9093 +1100 +38 +89 +6595 +248 +2000 +9094 +5780 +9095 +9096 +9097 +2770 +9098 +270 +9099 +9100 +9101 +237 +7969 +1674 +248 +2790 +9102 +9103 +9104 +9105 +9106 +43 +9107 +1716 +1559 +5614 +9108 +1817 +7982 +249 +9109 +180 +9110 +9111 +9112 +9113 +9114 +9115 +104 +25 +3406 +8146 +586 +3543 +2323 +9116 +586 +9117 +9118 +9119 +9120 +4873 +484 +9121 +738 +345 +4634 +331 +9122 +9123 +9124 +9125 +9126 +9127 +416 +9128 +357 +286 +9129 +5217 +9130 +2824 +694 +9131 +9132 +57 +286 +9133 +9134 +3601 +9135 +58 +176 +19 +9136 +9137 +7154 +7108 +9138 +9139 +1612 +1169 +736 +9140 +9141 +892 +32 +9142 +1082 +5908 +9143 +9144 +9145 +865 +2577 +4198 +57 +9146 +357 +9147 +9148 +43 +303 +201 +9149 +9150 +1531 +15 +5415 +57 +586 +270 +9151 +3279 +9152 +3745 +15 +9153 +9154 +46 +9155 +6513 +1232 +15 +815 +831 +9156 +9157 +2559 +491 +9158 +9159 +3330 +14 +9160 +9161 +19 +1013 +566 +9162 +9163 +9164 +9165 +4088 +9166 +9167 +4850 +399 +286 +57 +15 +415 +9168 +22 +9169 +9170 +9171 +694 +713 +9172 +32 +244 +9173 +8297 +2427 +7030 +493 +9174 +9175 +9176 +9177 +89 +533 +60 +9178 +9179 +15 +66 +9180 +448 +10 +9181 +9182 +46 +9183 +5780 +43 +927 +586 +8444 +19 +764 +9184 +9185 +6877 +9186 +213 +15 +9187 +9188 +910 +9189 +9190 +2018 +9191 +337 +9192 +972 +9193 +20 +115 +22 +201 +9194 +9195 +5780 +6372 +9196 +209 +9197 +14 +2806 +57 +416 +104 +303 +665 +741 +9198 +9199 +1357 +1961 +5825 +188 +9200 +492 +817 +436 +9201 +43 +99 +112 +1401 +9202 +248 +9203 +9204 +57 +9205 +9206 +9207 +9208 +2706 +99 +9209 +43 +9210 +379 +9211 +9212 +9213 +9214 +3328 +9215 +9216 +9217 +1817 +446 +7014 +9218 +9219 +9220 +4512 +213 +872 +9221 +9222 +817 +15 +179 +4012 +22 +9223 +745 +9224 +9225 +342 +3376 +9226 +9227 +9228 +9229 +1224 +464 +9230 +1364 +1710 +9231 +9232 +2356 +9233 +286 +665 +9234 +48 +248 +9235 +1310 +9236 +1987 +9237 +284 +9238 +8566 +9239 +9240 +248 +9241 +9242 +5908 +4070 +7072 +70 +2015 +5623 +1077 +9243 +5938 +248 +284 +248 +15 +4230 +9244 +9245 +12 +9246 +9247 +9248 +43 +9249 +9250 +9251 +586 +416 +9252 +213 +9 +7595 +303 +9253 +9254 +5797 +9255 +9256 +4963 +1720 +9257 +9258 +9259 +9260 +141 +9261 +9262 +77 +213 +9263 +2446 +616 +269 +9264 +9265 +237 +9266 +284 +6965 +32 +484 +9267 +9268 +137 +9269 +34 +9270 +237 +9271 +9272 +7746 +9273 +9274 +9275 +9276 +9277 +5702 +7666 +9278 +402 +9279 +519 +9280 +9281 +9282 +8091 +616 +9283 +9284 +9285 +9286 +9287 +9288 +1160 +9289 +9290 +7276 +9291 +9292 +20 +9293 +509 +9294 +9295 +43 +9296 +9297 +9298 +2625 +5601 +1574 +19 +379 +9 +8455 +22 +3055 +20 +9299 +4915 +9300 +9301 +228 +9302 +9303 +554 +15 +9304 +9305 +540 +9306 +3233 +9307 +9308 +9309 +9310 +842 +1870 +208 +741 +9311 +9312 +19 +9313 +5410 +9314 +9315 +12 +5780 +9005 +111 +9316 +9317 +7194 +15 +7610 +1300 +9318 +9319 +9320 +9321 +3978 +9322 +1580 +15 +20 +1655 +9323 +5299 +1775 +9324 +597 +19 +20 +9325 +9326 +32 +5825 +35 +9327 +22 +9328 +9329 +9330 +9331 +9332 +1637 +9333 +8778 +1470 +9334 +9335 +77 +9336 +1212 +57 +14 +9337 +286 +348 +1912 +114 +286 +9338 +745 +7350 +9339 +9340 +1425 +9341 +48 +172 +9342 +493 +57 +415 +9343 +9344 +9345 +9346 +9347 +345 +9348 +9349 +9350 +9351 +248 +9352 +9353 +9354 +284 +9355 +9356 +7429 +9357 +9358 +357 +9359 +178 +242 +9360 +9361 +9362 +9363 +697 +9364 +397 +493 +9365 +1169 +9366 +9367 +770 +15 +9368 +9123 +20 +9369 +665 +32 +9370 +9371 +15 +9372 +9373 +9374 +9375 +248 +1364 +9376 +9377 +707 +5627 +357 +1944 +5780 +9378 +67 +9039 +9379 +9380 +1001 +8351 +849 +2043 +14 +9381 +9382 +2157 +3172 +9383 +9384 +4551 +9385 +4294 +910 +1875 +14 +1356 +9386 +43 +9387 +9388 +48 +9389 +248 +1234 +5780 +1529 +9390 +305 +6741 +17 +14 +43 +249 +9391 +43 +9392 +43 +9393 +9394 +476 +8946 +9395 +9396 +9397 +4982 +22 +9398 +9399 +9400 +7743 +317 +32 +20 +9401 +2206 +671 +9402 +590 +1612 +9403 +9404 +77 +9405 +9406 +43 +9407 +9408 +16 +9409 +337 +402 +9410 +43 +9411 +915 +9412 +977 +9413 +9414 +9415 +303 +9416 +671 +201 +5431 +9417 +283 +583 +9418 +15 +9419 +9420 +3417 +671 +209 +9421 +861 +9422 +317 +248 +9423 +9424 +33 +303 +9425 +2419 +568 +48 +9426 +1401 +19 +9427 +9428 +9429 +57 +9430 +416 +354 +3128 +9431 +22 +1377 +9432 +9433 +9434 +2944 +9435 +9436 +5582 +15 +9437 +286 +15 +10 +9438 +9439 +1470 +9440 +201 +9441 +2318 +1291 +286 +9442 +9443 +9444 +827 +9445 +9446 +178 +9395 +3944 +9447 +9448 +3964 +15 +9449 +9450 +19 +484 +9451 +9452 +4634 +9453 +1927 +19 +9454 +9455 +15 +1364 +9456 +9457 +9458 +9459 +15 +3599 +9460 +9461 +5344 +9462 +25 +9463 +245 +1840 +178 +9464 +9465 +1584 +4317 +2824 +9466 +9467 +354 +9468 +751 +792 +9469 +9470 +5218 +9471 +2841 +43 +430 +2128 +9472 +9473 +32 +9474 +9475 +48 +1710 +9476 +9477 +1377 +9478 +9479 +9480 +9481 +9482 +9483 +9484 +185 +2619 +9485 +9486 +9487 +20 +1562 +2911 +9488 +586 +5877 +9395 +9 +3330 +9489 +9490 +9491 +67 +9492 +2944 +134 +9493 +15 +9494 +5654 +892 +2047 +1710 +3030 +201 +19 +597 +25 +1961 +9495 +14 +4278 +9496 +648 +9497 +9498 +9499 +225 +19 +22 +9500 +3743 +354 +9501 +983 +2835 +9502 +9503 +9504 +249 +9505 +15 +4518 +9506 +9507 +43 +9508 +3852 +9509 +9510 +1425 +1604 +9511 +3961 +9512 +9513 +9514 +9515 +9516 +4583 +9517 +9518 +10 +209 +1100 +9519 +9520 +9521 +9522 +9523 +4012 +9524 +32 +9525 +1051 +9526 +7291 +9527 +9528 +9529 +1021 +189 +286 +3442 +9530 +6384 +303 +337 +2410 +197 +9531 +9532 +4388 +9533 +3148 +9534 +22 +9535 +9536 +9537 +554 +9538 +9539 +1232 +4439 +554 +597 +4426 +4 +9540 +155 +9541 +9542 +33 +9543 +9544 +930 +514 +109 +861 +1282 +402 +554 +357 +2764 +9545 +9546 +3599 +9547 +19 +730 +12 +9548 +164 +586 +9549 +1559 +3417 +7238 +9550 +791 +9551 +10 +4070 +271 +9552 +15 +9553 +9554 +9555 +9556 +5299 +415 +1027 +415 +237 +9557 +9558 +9559 +57 +249 +25 +9560 +2697 +822 +9561 +9562 +6505 +352 +9563 +671 +9564 +22 +363 +1116 +548 +9565 +501 +34 +57 +9566 +9567 +9568 +1743 +9569 +379 +9570 +5208 +9571 +416 +7137 +8653 +9572 +179 +9573 +9574 +415 +3525 +9575 +14 +5820 +736 +9576 +178 +176 +914 +2764 +9577 +681 +9578 +15 +597 +213 +338 +9579 +9580 +213 +533 +416 +303 +25 +9395 +4714 +9581 +9395 +4506 +1172 +9395 +9582 +9583 +9584 +1295 +15 +66 +6086 +32 +15 +1710 +315 +19 +9585 +9395 +32 +9586 +303 +5623 +5039 +936 +554 +738 +9587 +9588 +9589 +9590 +1234 +9591 +1513 +7032 +9592 +9593 +178 +9594 +9595 +9596 +1010 +2728 +9597 +32 +9598 +4042 +9395 +9395 +9599 +58 +9600 +188 +1927 +22 +9601 +9602 +9603 +9604 +9605 +9606 +9607 +8465 +1212 +9608 +9395 +9395 +1710 +1540 +274 +114 +5923 +222 +9609 +9395 +9610 +270 +9611 +1606 +936 +9612 +22 +9613 +9614 +398 +248 +9615 +9616 +9617 +4419 +9618 +9619 +9620 +9621 +9622 +9323 +3964 +9623 +9624 +9625 +178 +3508 +9626 +1710 +9627 +188 +9628 +9629 +155 +2841 +284 +6612 +4165 +25 +4764 +9630 +9631 +337 +9632 +1637 +9633 +9634 +15 +284 +9635 +8414 +9636 +9637 +9638 +9639 +248 +9640 +317 +1262 +7429 +9641 +2026 +248 +9642 +925 +9643 +9644 +9645 +484 +9646 +761 +9647 +9648 +9649 +286 +16 +9650 +9651 +8653 +9652 +3427 +10 +9653 +43 +9654 +9655 +249 +3968 +4 +9656 +416 +9657 +43 +8297 +9658 +9659 +5400 +9660 +2309 +9661 +15 +5007 +286 +242 +9662 +464 +9663 +1514 +9664 +9665 +249 +9666 +4982 +317 +43 +9667 +48 +9668 +9669 +284 +9670 +9671 +9672 +540 +373 +7014 +9395 +9673 +9674 +179 +134 +43 +9675 +43 +377 +9676 +20 +15 +9677 +9678 +411 +9679 +8348 +19 +5577 +1386 +9395 +9680 +1018 +9681 +305 +686 +9210 +640 +9682 +3291 +9395 +9395 +9683 +9684 +842 +892 +9395 +9685 +1293 +9 +9686 +9687 +713 +9688 +5908 +9395 +9689 +9395 +1867 +1442 +9690 +1716 +9691 +25 +9692 +9693 +9694 +22 +1502 +9695 +2694 +9696 +713 +9697 +5326 +20 +9698 +9699 +9395 +15 +9 +9700 +9701 +9702 +19 +9119 +92 +9395 +9395 +9703 +9395 +9 +9395 +9704 +20 +2787 +15 +9705 +14 +484 +19 +299 +4 +3481 +9706 +9707 +225 +9708 +373 +3330 +9709 +2591 +9710 +1425 +43 +4364 +2694 +9711 +19 +9712 +9713 +9714 +9715 +9716 +9717 +2944 +9718 +9719 +14 +2694 +15 +9720 +9721 +1291 +43 +9722 +9723 +14 +9724 +9725 +2260 +648 +9395 +1083 +9726 +9727 +802 +237 +5080 +9728 +2430 +5780 +1808 +707 +2694 +2787 +5780 +9729 +9730 +9731 +15 +9732 +9395 +9733 +9395 +9395 +9734 +9395 +554 +9735 +9736 +9737 +9738 +303 +9739 +19 +9740 +9741 +1870 +3296 +1300 +9742 +3 +9743 +210 +15 +9744 +2029 +249 +357 +337 +2709 +57 +2 +4764 +416 +9745 +9746 +9747 +66 +32 +9748 +43 +20 +4042 +15 +9749 +9395 +9750 +9 +9751 +9752 +9753 +10 +736 +9754 +9755 +9756 +301 +114 +9757 +9758 +9759 +2430 +9760 +9761 +35 +201 +9762 +354 +9763 +9764 +9765 +9766 +9767 +98 +8320 +9768 +201 +19 +286 +19 +10 +192 +8249 +9769 +3514 +9395 +3034 +554 +9770 +337 +14 +9771 +464 +9772 +9773 +9774 +4714 +9775 +9776 +3958 +9777 +9395 +484 +32 +9778 +10 +9779 +5451 +354 +9780 +3995 +9395 +597 +22 +248 +14 +4269 +9781 +9782 +9783 +337 +398 +9784 +140 +9785 +9786 +178 +9787 +9395 +9788 +9789 +303 +3989 +15 +2289 +9790 +9791 +9792 +179 +9793 +822 +9794 +9795 +1502 +6616 +4855 +9796 +9395 +9797 +201 +153 +4 +9798 +9799 +317 +554 +493 +32 +694 +9800 +5837 +1655 +9801 +4 +9802 +9803 +9804 +43 +14 +668 +9020 +9805 +155 +16 +89 +32 +8685 +272 +357 +9806 +9807 +1808 +9808 +5169 +9809 +9810 +2243 +16 +9811 +9812 +9813 +32 +286 +15 +9814 +9815 +9816 +7137 +9817 +9818 +9819 +35 +9820 +9821 +185 +9822 +8344 +9823 +9824 +9825 +2403 +9826 +5900 +9827 +15 +9828 +9829 +1710 +14 +9830 +1790 +286 +48 +9831 +9832 +248 +6364 +9395 +248 +9833 +249 +9834 +764 +9835 +9836 +9837 +3100 +9838 +9839 +9840 +9841 +9842 +9843 +141 +9395 +2697 +9844 +9845 +9395 +9395 +9846 +9847 +9848 +9849 +286 +9850 +9851 +337 +98 +9395 +2 +9852 +9853 +2971 +9395 +9854 +415 +9855 +703 +115 +9856 +9857 +14 +9858 +32 +892 +213 +9859 +9860 +57 +9861 +9862 +9863 +9864 +9395 +337 +9865 +2919 +43 +9866 +188 +9867 +168 +9868 +9869 +3302 +9870 +9871 +6594 +9872 +692 +9780 +9873 +32 +9874 +4388 +9875 +6445 +4631 +1542 +15 +9876 +9877 +1013 +43 +1637 +9878 +34 +9879 +9880 +138 +9881 +249 +4855 +9882 +155 +9883 +9884 +7343 +9395 +5198 +57 +694 +43 +9395 +9885 +286 +9886 +3407 +238 +286 +9887 +2697 +9888 +9889 +3698 +15 +9890 +9891 +9395 +1082 +213 +9892 +14 +303 +9 +705 +9893 +9894 +9895 +2157 +9896 +8889 +9395 +9897 +7600 +9898 +9899 +9900 +2035 +9901 +9902 +1360 +9903 +9904 +9905 +9395 +35 +9906 +5792 +15 +1605 +248 +9907 +9908 +9909 +57 +3978 +9910 +2655 +9911 +9912 +9395 +201 +554 +1015 +9913 +57 +484 +9914 +9915 +179 +9916 +9917 +286 +43 +286 +9918 +9919 +9920 +345 +9921 +9922 +8853 +222 +3491 +694 +3055 +35 +9923 +32 +9924 +1710 +9925 +791 +3421 +9926 +9927 +270 +9395 +7580 +5314 +9928 +9929 +9930 +98 +99 +15 +9931 +15 +9932 +22 +590 +9395 +933 +2049 +25 +9309 +4747 +7183 +9933 +9934 +1026 +9935 +25 +9936 +9 +10 +8053 +176 +155 +15 +14 +5774 +1364 +9937 +9938 +9939 +9940 +178 +9941 +180 +9942 +6850 +12 +9943 +15 +19 +1230 +9944 +9945 +2849 +6771 +9946 +4982 +32 +9947 +8282 +9948 +125 +5127 +303 +9949 +9950 +9951 +9952 +5791 +9953 +354 +9954 +9955 +188 +9956 +9957 +9958 +274 +9959 +4075 +9960 +671 +9961 +411 +4028 +9962 +20 +9963 +1232 +222 +35 +155 +19 +9964 +9965 +9395 +303 +9966 +9 +872 +694 +237 +1513 +9967 +6029 +22 +9968 +5022 +286 +164 +1710 +9969 +9970 +2 +89 +9971 +115 +9972 +597 +8670 +9973 +178 +9974 +2619 +464 +9975 +9976 +9977 +24 +9978 +115 +9979 +9980 +9981 +9982 +827 +1870 +9983 +286 +3790 +9984 +2619 +9985 +3406 +1464 +9986 +647 +9987 +9988 +9989 +248 +284 +8437 +9990 +213 +337 +9991 +9992 +9993 +9994 +8602 +4185 +9995 +4 +9996 +9997 +9998 +9999 +10000 +10001 +2668 +15 +15 +179 +10002 +9395 +1987 +10003 +10004 +464 +32 +10005 +15 +176 +20 +286 +10006 +10 +10007 +2289 +10008 +10009 +2824 +10010 +484 +2356 +10011 +2009 +14 +9396 +6559 +10012 +10013 +10014 +736 +3407 +10015 +10016 +19 +10017 +7376 +10018 +1395 +10019 +10020 +10021 +10022 +10023 +10024 +8783 +9 +10025 +10026 +15 +10027 +648 +32 +1021 +57 +15 +286 +15 +10028 +10029 +286 +10030 +10031 +272 +10032 +10033 +331 +9395 +9074 +4278 +20 +10034 +1425 +19 +3353 +248 +10035 +10036 +10037 +15 +3251 +8367 +10038 +10039 +1559 +10040 +10041 +2834 +5780 +2035 +701 +20 +213 +19 +248 +10042 +10043 +10044 +10045 +284 +32 +10046 +10047 +10048 +1300 +7276 +109 +155 +2770 +10049 +1655 +10050 +10051 +10052 +1531 +694 +1026 +3507 +89 +10053 +10054 +389 +2471 +125 +10055 +10056 +10057 +10058 +3104 +10059 +10060 +14 +10061 +10062 +10063 +2924 +10064 +10065 +10066 +10067 +10068 +43 +10069 +10070 +10071 +250 +1716 +10072 +10073 +14 +10074 +10075 +1705 +77 +10076 +1710 +10077 +10078 +10079 +10080 +10081 +10082 +10083 +2309 +10084 +10085 +1169 +514 +3 +15 +10086 +213 +242 +152 +10087 +10088 +1604 +305 +10089 +10090 +9395 +1536 +10091 +10092 +10093 +10094 +248 +286 +10095 +16 +6496 +16 +9 +10096 +10097 +7835 +398 +10098 +379 +5900 +10099 +242 +10100 +337 +213 +10101 +10102 +10103 +178 +337 +201 +1364 +9395 +10104 +43 +10105 +10106 +10063 +10107 +20 +10108 +10109 +10110 +648 +9095 +271 +3055 +10111 +6243 +10112 +705 +3139 +305 +10113 +643 +10114 +484 +15 +284 +10115 +7531 +10116 +10117 +861 +10118 +2449 +10119 +10120 +15 +10121 +1382 +10122 +10123 +892 +10124 +10125 +10126 +10127 +10128 +10129 +12 +10130 +10131 +915 +10132 +57 +10133 +1710 +464 +10134 +7183 +10135 +10136 +10137 +1026 +1508 +10138 +6050 +1513 +10139 +849 +12 +10140 +10141 +10142 +213 +303 +10143 +10144 +10145 +99 +57 +1529 +179 +19 +10146 +514 +10147 +15 +57 +10148 +10149 +19 +10150 +10151 +10152 +10153 +10154 +102 +10155 +10156 +5561 +337 +822 +1119 +10157 +859 +249 +10158 +1575 +2281 +10159 +10160 +2550 +9037 +1524 +10161 +4918 +10162 +10163 +10164 +15 +3818 +305 +4 +77 +2836 +501 +716 +10165 +415 +1425 +32 +286 +822 +10166 +10167 +249 +10168 +178 +9 +10169 +305 +9123 +10170 +176 +10171 +331 +10172 +10173 +10174 +10175 +10176 +5561 +10177 +6214 +301 +703 +10178 +10179 +10180 +428 +6513 +3059 +10181 +10182 +10183 +10184 +10185 +57 +14 +10186 +10187 +1885 +10188 +10189 +19 +616 +19 +15 +10190 +10191 +10192 +48 +10193 +10 +10194 +10195 +10196 +1710 +10197 +9011 +1529 +4 +10198 +10199 +317 +10200 +152 +178 +3858 +10201 +15 +152 +8724 +910 +10202 +15 +25 +703 +1529 +10203 +10204 +10205 +10206 +583 +413 +3787 +1001 +357 +98 +20 +1465 +10207 +491 +305 +10208 +10209 +76 +10210 +10211 +286 +721 +10212 +10213 +10214 +10215 +10216 +1392 +10217 +10218 +10219 +2865 +598 +10220 +10221 +4075 +10222 +10223 +790 +10224 +10225 +10226 +4278 +99 +48 +7835 +10227 +1696 +14 +10228 +19 +10229 +42 +6507 +10230 +6364 +2593 +1513 +57 +4702 +10231 +303 +80 +10232 +77 +910 +10233 +303 +9395 +43 +10234 +10235 +10236 +22 +10237 +9178 +10238 +554 +48 +1531 +284 +317 +10239 +1817 +6171 +5223 +1604 +345 +8605 +10240 +19 +58 +2015 +10241 +10242 +6644 +337 +10243 +284 +4 +10244 +10245 +415 +32 +10246 +16 +10247 +10248 +286 +10249 +10250 +10251 +1047 +10252 +10253 +284 +10254 +10255 +10256 +1533 +10257 +2260 +89 +213 +10258 +10259 +2449 +337 +10260 +10261 +694 +43 +10262 +10263 +286 +872 +32 +10264 +1718 +5990 +4061 +10265 +5216 +32 +10266 +936 +411 +10224 +10267 +77 +10268 +4422 +1749 +43 +32 +10269 +10270 +9 +1018 +43 +10271 +286 +43 +10272 +10273 +10274 +10275 +10276 +845 +8338 +10277 +10278 +10064 +10279 +1502 +10280 +379 +10281 +10282 +14 +10283 +1514 +10284 +286 +2135 +237 +10285 +32 +2064 +10286 +10287 +501 +1011 +4530 +10288 +651 +15 +10289 +250 +910 +10290 +12 +6179 +3 +373 +10291 +200 +10292 +5438 +8593 +10293 +16 +5022 +8053 +10294 +10295 +5410 +20 +1991 +10296 +10297 +1513 +19 +10298 +10299 +10300 +1172 +15 +519 +10301 +1444 +10302 +10303 +9382 +43 +448 +213 +590 +10304 +349 +10305 +10306 +493 +248 +57 +32 +10307 +10308 +10309 +77 +2019 +10310 +10311 +286 +845 +142 +10312 +1425 +10313 +10314 +10315 +284 +5326 +6359 +10316 +19 +10317 +10318 +10319 +10320 +48 +10321 +10322 +3238 +1364 +10323 +6915 +10 +10324 +1692 +10325 +10326 +2537 +305 +15 +284 +10327 +10328 +1100 +10329 +10330 +15 +5839 +564 +365 +10331 +7624 +10332 +15 +286 +357 +10333 +1012 +1867 +10334 +10335 +10336 +15 +10337 +10338 +10339 +10340 +4024 +10341 +10342 +92 +554 +19 +10343 +10344 +10345 +10346 +10347 +8230 +10348 +4452 +10349 +10350 +694 +3413 +10230 +411 +613 +15 +10351 +10352 +245 +15 +10353 +358 +10354 +9037 +10355 +1018 +1558 +10356 +99 +5601 +222 +10357 +484 +10358 +4048 +1212 +1800 +1956 +10359 +10360 +10361 +548 +10362 +10363 +10364 +10235 +3139 +179 +10365 +966 +554 +10366 +398 +915 +10367 +2526 +10368 +10369 +43 +10370 +484 +14 +286 +10371 +179 +10372 +10373 +464 +1529 +137 +10374 +8946 +10375 +10376 +10377 +337 +10378 +337 +10379 +10380 +10381 +15 +42 +213 +303 +10382 +2043 +4918 +10383 +1356 +10384 +3385 +9210 +4116 +10385 +77 +3127 +337 +10386 +77 +213 +10387 +337 +7032 +19 +1531 +10388 +3544 +2314 +10313 +10389 +10390 +4963 +3032 +5923 +736 +5773 +10391 +10392 +222 +586 +10393 +10394 +345 +10395 +10396 +10397 +2463 +10398 +19 +4108 +10399 +342 +7380 +2993 +248 +20 +5780 +10400 +6121 +345 +9837 +10401 +10402 +3178 +2135 +10403 +354 +10404 +10405 +10406 +10407 +10408 +1047 +10409 +2259 +2995 +573 +337 +4907 +10410 +10411 +10412 +112 +10413 +10414 +303 +10415 +10416 +464 +7379 +10417 +6289 +10418 +57 +484 +10419 +15 +7729 +1612 +337 +10420 +337 +10421 +16 +10422 +278 +10423 +66 +1052 +48 +2243 +286 +9144 +303 +10424 +10425 +35 +1668 +4317 +115 +10426 +514 +10427 +10428 +10429 +6920 +3061 +10430 +2526 +3225 +10431 +10432 +2427 +10433 +250 +10434 +77 +70 +10435 +4334 +10436 +10437 +1100 +2347 +10438 +20 +647 +2306 +178 +10439 +10440 +827 +10441 +3470 +1181 +10442 +10443 +10444 +10445 +66 +19 +270 +10446 +15 +188 +9583 +386 +10447 +10448 +14 +10449 +2724 +10450 +2325 +10451 +6962 +188 +10452 +2776 +3010 +10453 +1410 +10454 +10455 +10456 +10457 +10458 +323 +1829 +10459 +7600 +369 +10460 +20 +10461 +7442 +10462 +2627 +3055 +1149 +12 +464 +10463 +10464 +1425 +10465 +10466 +10467 +10468 +10439 +10469 +10470 +57 +278 +10471 +1149 +10472 +10473 +10474 +10475 +10476 +176 +10477 +10478 +10479 +357 +10480 +10481 +738 +10482 +397 +493 +8593 +845 +1596 +2971 +10483 +8508 +6543 +10484 +284 +741 +77 +10485 +10486 +179 +10487 +213 +10488 +10489 +7806 +10490 +337 +10491 +10463 +586 +3660 +337 +10492 +9 +5780 +15 +4032 +1912 +2804 +1710 +10493 +415 +303 +43 +10494 +10495 +15 +282 +446 +859 +67 +286 +305 +10496 +10497 +7968 +10498 +769 +2015 +77 +179 +317 +10499 +10500 +3842 +5990 +3978 +155 +1364 +8338 +225 +590 +5439 +60 +10501 +10502 +2397 +176 +936 +248 +10503 +32 +10504 +10505 +5869 +10506 +10507 +10508 +10509 +1234 +2577 +10510 +7908 +10511 +10512 +176 +1956 +1932 +10513 +10514 +2406 +284 +10515 +10516 +1853 +32 +10517 +354 +2653 +809 +10518 +10519 +10520 +43 +683 +10521 +286 +1605 +10522 +10523 +242 +10524 +10525 +10526 +10527 +248 +10528 +80 +10529 +14 +10530 +10531 +1251 +861 +10532 +303 +10533 +284 +5717 +176 +10534 +248 +10535 +10536 +57 +10537 +331 +10538 +910 +10539 +248 +10540 +32 +2 +10541 +736 +10542 +10543 +1808 +10544 +9148 +2988 +8392 +9 +317 +10545 +176 +10546 +10547 +10548 +1580 +10549 +3709 +6122 +10550 +10551 +303 +10552 +278 +10553 +10554 +646 +38 +14 +4631 +820 +10555 +10556 +10557 +201 +6110 +10558 +10559 +57 +964 +874 +5006 +5797 +10560 +4075 +10561 +10562 +2577 +10563 +10564 +5316 +10565 +10566 +286 +57 +48 +14 +2768 +7357 +10567 +317 +10568 +12 +10569 +10570 +1529 +10571 +10572 +25 +1021 +10573 +3660 +10574 +10575 +331 +10576 +282 +10577 +1100 +671 +270 +142 +10578 +566 +586 +1382 +10579 +10580 +1291 +10581 +10582 +1364 +5261 +10583 +10584 +10585 +301 +10586 +10587 +10588 +15 +5880 +10589 +10590 +6317 +931 +32 +34 +10591 +9395 +5629 +12 +10592 +1083 +10593 +1234 +10594 +10595 +10596 +8532 +10597 +741 +2347 +32 +586 +188 +213 +10598 +213 +155 +10599 +32 +5291 +10600 +19 +337 +98 +10601 +745 +303 +10602 +493 +10603 +1481 +77 +10604 +248 +6822 +369 +19 +10605 +10606 +10607 +10608 +32 +10609 +464 +10610 +10611 +10612 +4 +10613 +5153 +4856 +10614 +10615 +10616 +10617 +10618 +10619 +2197 +10620 +357 +1533 +92 +936 +10621 +514 +2035 +10622 +303 +3447 +185 +48 +10623 +861 +303 +354 +7419 +3523 +540 +357 +1775 +10624 +2804 +10625 +943 +19 +5145 +14 +10626 +10627 +694 +10628 +3546 +10629 +1401 +1012 +10630 +14 +3055 +8685 +10631 +17 +10632 +10633 +10634 +10635 +10636 +10637 +10638 +57 +10639 +4624 +48 +873 +10640 +10641 +10642 +10643 +947 +10644 +10645 +19 +10646 +10647 +15 +1364 +10648 +3964 +10649 +10650 +2 +284 +10651 +279 +4606 +2195 +9 +10652 +34 +10653 +2743 +3067 +363 +10654 +10655 +552 +99 +14 +213 +34 +70 +10656 +10657 +10658 +3406 +8853 +10659 +10660 +10661 +3978 +14 +6343 +337 +10662 +484 +4491 +249 +478 +104 +10663 +43 +10664 +3369 +5326 +10665 +10666 +70 +10667 +4269 +22 +10668 +3484 +10669 +10670 +57 +10671 +10672 +248 +10673 +5780 +10674 +14 +43 +9497 +10675 +32 +10676 +2764 +5803 +6507 +10677 +2733 +10678 +303 +10679 +57 +10680 +598 +10681 +10682 +4982 +10683 +10684 +10685 +286 +10686 +484 +10687 +303 +357 +237 +271 +10688 +4278 +10689 +10690 +305 +10691 +10692 +89 +10693 +8555 +4 +4388 +15 +10694 +57 +10695 +70 +8208 +10696 +4018 +248 +10697 +284 +165 +10698 +2314 +10699 +1364 +284 +10700 +1021 +10701 +337 +10702 +10703 +10704 +303 +10705 +66 +436 +10706 +10707 +3601 +10708 +4820 +10709 +3902 +2135 +10710 +32 +10711 +10712 +10713 +10714 +10715 +10716 +10717 +5946 +7014 +10718 +10719 +10720 +10721 +10722 +48 +10723 +354 +10724 +10725 +10726 +10727 +48 +701 +1710 +10728 +7137 +10729 +345 +10730 +10731 +10732 +10733 +10734 +10735 +10736 +155 +3764 +10737 +15 +10717 +9718 +237 +10738 +845 +8200 +10739 +10740 +10741 +677 +17 +694 +10742 +10743 +15 +10744 +10745 +43 +5217 +10746 +10747 +1244 +10748 +10749 +48 +10750 +1021 +713 +10751 +10752 +10753 +34 +10754 +10755 +4402 +1531 +910 +305 +7137 +1559 +10756 +1356 +22 +10757 +115 +15 +15 +10758 +2 +10759 +936 +411 +10760 +10761 +10762 +10763 +10764 +10765 +3553 +286 +10766 +9 +10767 +137 +741 +1021 +2052 +10768 +3599 +57 +284 +337 +7600 +10769 +284 +3645 +10770 +5202 +1107 +213 +10771 +1513 +10772 +345 +10773 +3 +10774 +2415 +10775 +10776 +10777 +179 +417 +931 +10778 +10779 +1745 +10780 +797 +10781 +213 +10782 +8142 +827 +10783 +10784 +201 +7137 +10785 +32 +331 +43 +10786 +10787 +10788 +10789 +778 +10790 +10791 +9 +10792 +10793 +703 +15 +155 +286 +10794 +7032 +10795 +10796 +10797 +2043 +10798 +15 +10799 +10800 +10801 +10802 +176 +10803 +669 +10286 +10804 +10805 +9201 +5022 +1710 +20 +1301 +337 +10806 +10807 +10808 +10809 +6420 +29 +43 +3492 +10810 +4812 +736 +22 +4461 +22 +10811 +10075 +1991 +10812 +337 +10813 +337 +10814 +648 +9 +6011 +1502 +354 +10815 +15 +10816 +917 +10 +10817 +10818 +10819 +1912 +1091 +1716 +10820 +112 +10821 +10822 +10823 +10824 +10825 +213 +10826 +32 +10827 +10828 +10829 +10830 +20 +7860 +10831 +1203 +10832 +15 +77 +14 +10833 +10834 +2811 +104 +10835 +10836 +10837 +10838 +1870 +237 +20 +3186 +43 +2058 +10839 +2197 +5860 +10840 +10841 +14 +43 +10842 +2777 +15 +10843 +10844 +5662 +43 +10845 +317 +10846 +10847 +10848 +2253 +10849 +10850 +10851 +43 +43 +10852 +6833 +5249 +476 +9395 +464 +10853 +89 +845 +730 +269 +10854 +10855 +10856 +57 +3 +10857 +20 +10858 +10859 +10860 +10861 +17 +10862 +764 +10863 +10864 +10865 +741 +10866 +10867 +952 +10868 +10869 +2009 +3055 +4631 +337 +10870 +284 +3976 +5326 +10871 +331 +10872 +357 +3842 +6010 +10873 +915 +1862 +5340 +4278 +179 +648 +10874 +284 +10875 +705 +10876 +248 +7137 +10877 +10878 +7811 +10879 +10880 +10881 +1502 +464 +2809 +493 +10882 +10883 +25 +8803 +10884 +665 +10 +237 +2762 +3908 +1745 +10885 +10886 +7801 +16 +57 +10887 +2849 +5561 +152 +10888 +10889 +10235 +12 +10890 +10891 +10892 +2406 +10893 +25 +10894 +10895 +4441 +1853 +10896 +610 +10897 +10898 +6317 +10899 +317 +10900 +10901 +10902 +10903 +10904 +1018 +10905 +284 +10906 +284 +337 +10907 +1817 +9504 +2202 +9560 +10908 +10909 +10910 +10911 +740 +936 +10912 +10913 +57 +10914 +10915 +10916 +43 +8050 +10917 +3472 +822 +1824 +57 +1808 +10918 +10919 +519 +10920 +2347 +10921 +10922 +10923 +10924 +10925 +10926 +2427 +1343 +10927 +10928 +43 +10929 +16 +10930 +43 +10 +707 +10931 +10932 +10933 +710 +10934 +10935 +10936 +15 +10 +10937 +10938 +10939 +14 +7543 +10940 +5780 +164 +910 +4906 +10 +3546 +677 +4023 +19 +8255 +1244 +10941 +10942 +10943 +10944 +10945 +201 +10946 +10947 +2040 +10948 +19 +613 +10782 +25 +4905 +10949 +10950 +10951 +43 +10952 +10953 +188 +10954 +10955 +357 +12 +115 +10956 +303 +70 +1307 +14 +213 +32 +10957 +303 +10958 +10959 +10960 +284 +43 +337 +10961 +10962 +10963 +15 +554 +286 +10964 +303 +10965 +43 +7480 +10966 +248 +14 +1710 +337 +10967 +249 +286 +10968 +464 +10969 +7137 +43 +1013 +10970 +1870 +201 +8342 +10971 +5553 +2083 +8994 +1224 +32 +4491 +10972 +415 +10973 +10974 +10975 +10976 +10977 +10978 +10979 +10980 +10981 +1047 +10982 +20 +6732 +16 +3332 +305 +10983 +301 +2213 +10984 +10985 +10986 +10987 +67 +378 +225 +10988 +10989 +712 +201 +10990 +16 +188 +10757 +10991 +10992 +10993 +4532 +10994 +10995 +501 +1109 +10996 +10997 +10998 +415 +5780 +10999 +43 +178 +1637 +11000 +14 +11001 +1912 +936 +210 +3354 +11002 +1867 +11003 +7283 +6303 +7137 +7357 +11004 +53 +3417 +11005 +11006 +4 +7104 +590 +1245 +11007 +15 +11008 +11009 +3732 +179 +11010 +815 +25 +11011 +11012 +11013 +248 +303 +2415 +11014 +11015 +15 +8583 +11016 +11017 +53 +11018 +11019 +2446 +671 +11020 +11021 +248 +337 +402 +337 +493 +193 +11022 +6741 +613 +11023 +11024 +104 +11025 +7683 +9738 +2476 +11026 +411 +11027 +11028 +104 +1739 +303 +305 +11029 +9 +11030 +11031 +11032 +11033 +861 +397 +11034 +11035 +48 +11036 +11037 +9796 +11038 +32 +11039 +11040 +15 +493 +140 +11041 +43 +5869 +11042 +11043 +703 +12 +11044 +11045 +11046 +176 +11047 +304 +2924 +11048 +11049 +11050 +11051 +8110 +11052 +398 +11053 +15 +10535 +5623 +1623 +11054 +11055 +1710 +11056 +11057 +303 +11058 +284 +10849 +11059 +2302 +284 +11060 +11061 +14 +11062 +11063 +43 +892 +1232 +11064 +9449 +248 +10621 +11065 +77 +11066 +32 +2136 +11067 +11068 +11069 +11070 +317 +398 +831 +11071 +3059 +6350 +19 +11072 +11073 +4075 +586 +5817 +11074 +2310 +11075 +11076 +11077 +11078 +11079 +43 +11080 +11081 +15 +11082 +416 +99 +11083 +176 +11084 +1345 +5780 +11085 +1382 +11086 +11087 +19 +317 +11088 +2382 +1705 +11089 +11090 +53 +11091 +11092 +11093 +11094 +6341 +9465 +10500 +564 +2537 +506 +317 +11095 +2591 +201 +8244 +533 +77 +8460 +345 +1647 +11096 +10720 +114 +11097 +11098 +11099 +11100 +11101 +11102 +2428 +345 +989 +2081 +1300 +14 +8755 +16 +2410 +286 +11103 +11104 +2776 +66 +11105 +11106 +5780 +11107 +11108 +11109 +9449 +5797 +11110 +457 +11111 +11112 +11113 +11114 +9660 +6294 +1514 +11115 +11116 +3470 +210 +331 +284 +9766 +4789 +11117 +286 +5540 +11118 +11119 +248 +11120 +337 +11121 +11122 +11123 +11124 +11125 +1083 +2045 +11126 +11127 +2135 +11128 +15 +15 +11129 +11130 +11131 +10947 +57 +249 +10338 +11132 +11133 +416 +11134 +1066 +1889 +1637 +11135 +10835 +11136 +11137 +305 +11138 +11139 +179 +11140 +170 +11141 +11142 +201 +77 +11143 +176 +11144 +11145 +671 +11146 +331 +9578 +648 +4116 +11147 +25 +11148 +228 +11149 +11150 +11151 +11152 +4 +7097 +19 +2040 +11153 +48 +11154 +11155 +19 +4793 +11156 +11157 +11158 +32 +11159 +11160 +57 +6341 +337 +11161 +9617 +48 +536 +2314 +11162 +11163 +11164 +1021 +887 +11165 +284 +11166 +11167 +3598 +11168 +222 +11169 +5523 +11170 +14 +11171 +11172 +142 +11173 +11174 +4031 +11175 +32 +11176 +15 +11177 +11178 +10016 +35 +3186 +1531 +20 +694 +11179 +11180 +358 +453 +646 +11181 +20 +11182 +11183 +15 +237 +2287 +11184 +1896 +4202 +5780 +14 +7137 +11185 +8724 +1824 +272 +11186 +11187 +331 +25 +11188 +188 +11189 +586 +43 +484 +11190 +11191 +43 +32 +188 +11192 +2 +11193 +11194 +554 +11195 +11196 +8718 +233 +3287 +11197 +11198 +11199 +10016 +11200 +12 +11201 +342 +337 +1739 +11202 +4855 +5324 +11203 +248 +11204 +386 +48 +446 +188 +57 +8297 +164 +2409 +11205 +11206 +11207 +11208 +11209 +286 +48 +14 +6012 +10016 +15 +11210 +11211 +248 +5438 +10393 +11212 +11213 +1066 +15 +43 +11214 +11215 +11216 +11217 +11218 +11219 +11220 +19 +11221 +43 +286 +22 +1812 +10822 +7357 +11222 +11223 +3 +11224 +4637 +11225 +8183 +3 +4028 +11226 +5601 +11227 +11228 +43 +11229 +11230 +11231 +11232 +11233 +11234 +11235 +32 +1232 +176 +11236 +586 +4765 +11237 +11238 +19 +15 +193 +11239 +11240 +11241 +1514 +43 +11242 +11243 +11244 +10280 +112 +10 +9293 +201 +9372 +25 +11245 +77 +5344 +248 +248 +5314 +11246 +11247 +19 +616 +11248 +11249 +1021 +11250 +11251 +11252 +248 +10359 +11253 +11148 +35 +231 +15 +1655 +11254 +11255 +4 +703 +1048 +249 +869 +5080 +15 +11256 +201 +11257 +1200 +11258 +9928 +9948 +19 +11259 +11260 +560 +11261 +11262 +11263 +4990 +703 +9020 +2195 +286 +11264 +11265 +398 +11266 +10993 +11267 +323 +11268 +11269 +48 +11270 +1224 +286 +1425 +2476 +2560 +5898 +493 +11271 +6284 +713 +11272 +178 +11273 +1017 +694 +15 +7137 +11274 +11275 +15 +11276 +317 +7031 +11277 +3 +559 +11278 +11279 +11280 +11281 +1291 +11282 +345 +8230 +272 +9913 +11283 +11284 +337 +11285 +11286 +1374 +730 +1232 +25 +11287 +15 +806 +11288 +53 +11289 +11290 +11291 +11292 +845 +11293 +60 +43 +8249 +114 +11294 +11295 +11296 +11297 +3732 +2882 +11298 +11299 +11300 +3867 +11301 +11302 +201 +4 +11303 +11304 +2700 +11305 +317 +3626 +19 +305 +11306 +11307 +1655 +32 +322 +11308 +11309 +15 +10 +11310 +11311 +11312 +305 +342 +2700 +11313 +11314 +11315 +3059 +345 +11316 +11317 +11318 +11319 +99 +66 +11320 +11321 +19 +11322 +11323 +914 +354 +178 +11324 +25 +11325 +5022 +19 +576 +205 +11326 +11327 +15 +11328 +11329 +43 +11330 +15 +11331 +1262 +1224 +11332 +402 +2769 +11333 +3828 +3055 +11334 +284 +11335 +464 +213 +11336 +11337 +11338 +11339 +11340 +270 +2134 +14 +176 +11341 +259 +4730 +11342 +57 +11343 +200 +11344 +11345 +15 +11346 +9313 +57 +11347 +305 +32 +11348 +5045 +6181 +11349 +15 +11350 +4364 +9066 +5780 +1559 +10 +20 +6894 +11351 +11352 +164 +11353 +11354 +357 +11355 +1291 +14 +11356 +11357 +11358 +345 +1604 +213 +112 +60 +11359 +11148 +11360 +19 +2804 +11361 +15 +11362 +213 +305 +11363 +11364 +11365 +11366 +11367 +11368 +11369 +646 +11370 +337 +286 +11371 +248 +237 +57 +1169 +11372 +11373 +155 +2728 +6994 +11374 +11375 +11376 +528 +11377 +2 +7739 +11378 +11379 +19 +11380 +272 +4278 +32 +11381 +5780 +11382 +6006 +192 +11383 +707 +11384 +11385 +10 +11386 +11387 +665 +11388 +647 +1169 +11389 +11390 +1790 +11391 +11392 +1048 +331 +19 +11393 +11394 +11395 +11396 +11397 +15 +11398 +22 +11399 +11400 +4304 +7502 +11401 +861 +1109 +11402 +3644 +11403 +354 +11404 +11405 +2836 +305 +364 +284 +11406 +1011 +4713 +1169 +11407 +11408 +10 +9713 +11409 +4028 +303 +566 +11410 +11411 +357 +137 +11412 +4192 +11413 +11414 +8042 +32 +11415 +11416 +11417 +299 +11418 +11419 +11420 +11421 +14 +11422 +764 +11423 +11424 +349 +11425 +11426 +11427 +11428 +11429 +11430 +11431 +43 +57 +2008 +11428 +43 +11432 +4677 +11433 +9112 +11434 +11435 +57 +11436 +989 +15 +11437 +11438 +11439 +11440 +11441 +14 +11442 +11443 +872 +11444 +303 +11148 +11445 +11446 +15 +11447 +10256 +9298 +11448 +11449 +3239 +20 +11450 +11451 +11452 +11453 +616 +11454 +412 +11455 +892 +11456 +323 +11457 +11458 +11459 +9 +11460 +11461 +1585 +11462 +305 +1232 +48 +11463 +9114 +10 +114 +11464 +156 +11465 +11466 +11467 +11468 +11469 +11470 +66 +11471 +7575 +4033 +213 +11472 +317 +8096 +11473 +11474 +1823 +43 +11475 +11476 +11477 +43 +11148 +3225 +11478 +4364 +11479 +11480 +4 +11481 +137 +11482 +686 +1513 +2537 +648 +3 +665 +369 +373 +43 +11483 +194 +4963 +484 +279 +1912 +659 +57 +425 +22 +57 +738 +10909 +11484 +1262 +11485 +228 +11486 +11487 +20 +48 +4808 +11488 +3066 +493 +11489 +11490 +11491 +484 +4116 +1655 +1224 +9560 +11492 +11493 +96 +5022 +286 +10583 +11494 +16 +11495 +60 +10946 +9939 +11496 +11497 +11498 +213 +11499 +7418 +11500 +2260 +2561 +2966 +11501 +11502 +205 +337 +11503 +11504 +303 +1169 +11505 +1425 +286 +188 +11506 +11507 +11508 +11509 +11510 +303 +242 +5993 +11511 +11512 +11513 +11514 +20 +286 +274 +873 +11515 +11516 +8257 +398 +1662 +11517 +11518 +11519 +19 +822 +11520 +791 +11521 +11522 +270 +1364 +11523 +11524 +19 +11525 +8427 +809 +11526 +19 +3599 +464 +11527 +3119 +305 +5649 +845 +533 +671 +11528 +11148 +19 +1425 +11529 +11530 +77 +1232 +791 +357 +11531 +11532 +11533 +11534 +11535 +349 +4028 +11536 +32 +11537 +15 +11538 +201 +11539 +11540 +9254 +11541 +11542 +5792 +11543 +11544 +11545 +815 +11546 +248 +48 +11547 +11548 +286 +284 +493 +4918 +25 +11549 +337 +284 +11550 +11551 +11552 +303 +9396 +11553 +11554 +3213 +1018 +11555 +323 +373 +11556 +11557 +11558 +11559 +11560 +11561 +43 +8783 +323 +2764 +11562 +11563 +11564 +11565 +8950 +11566 +11567 +48 +11568 +11188 +11321 +736 +373 +48 +14 +11569 +11570 +11571 +137 +11572 +822 +931 +11573 +11574 +1870 +11575 +11576 +11577 +11578 +11579 +11580 +5075 +11581 +11582 +15 +228 +201 +1531 +66 +1604 +11583 +8682 +11114 +11584 +213 +11585 +11586 +11587 +931 +248 +8832 +5229 +365 +11588 +464 +11589 +11590 +11591 +11592 +272 +11593 +3105 +916 +11594 +11595 +11596 +11597 +11598 +6439 +34 +358 +11599 +11600 +11601 +11602 +11603 +11604 +11605 +11606 +11607 +11608 +464 +11609 +11610 +11611 +11612 +11613 +1128 +11614 +2309 +11615 +15 +11616 +11617 +11598 +493 +554 +2406 +845 +48 +11618 +43 +11619 +201 +828 +15 +11620 +11621 +11622 +7071 +464 +114 +43 +1229 +48 +32 +15 +2591 +11623 +1364 +8263 +11624 +2770 +464 +955 +11625 +153 +694 +11626 +11627 +43 +14 +11628 +11629 +11114 +11630 +213 +2577 +179 +11631 +11632 +248 +2042 +357 +1508 +3944 +11633 +11114 +11634 +345 +15 +11635 +11636 +528 +16 +11637 +57 +99 +155 +303 +11638 +10318 +11639 +3 +6728 +11640 +741 +2195 +11641 +11642 +11643 +707 +11644 +11645 +11646 +237 +11647 +77 +11648 +305 +354 +11649 +43 +5080 +2 +1425 +5601 +11650 +11651 +11652 +11653 +736 +11654 +10 +11655 +3768 +2264 +6344 +11656 +11657 +5561 +11658 +11321 +11659 +19 +4684 +11660 +305 +15 +11661 +11662 +11663 +179 +21 +11664 +11665 +15 +11666 +2944 +5361 +6869 +248 +11667 +11668 +11669 +11670 +104 +11671 +573 +11672 +861 +379 +77 +11673 +11674 +493 +11675 +11676 +10 +873 +3 +11677 +11678 +3485 +11321 +179 +176 +17 +493 +4 +11679 +238 +665 +4538 +2733 +11680 +583 +665 +11681 +11682 +11683 +11684 +43 +43 +11685 +11686 +32 +11687 +8798 +11688 +11689 +9 +2619 +3559 +11690 +305 +586 +32 +9967 +4600 +2314 +11691 +11692 +11693 +11694 +1636 +528 +2513 +284 +11695 +3367 +11696 +586 +11697 +11698 +337 +11699 +11700 +2135 +11701 +11702 +11703 +11704 +11705 +9 +284 +11706 +303 +77 +12 +11707 +11708 +3569 +11709 +43 +109 +416 +104 +8297 +8210 +2935 +286 +11710 +11711 +9898 +2043 +519 +11712 +6110 +48 +284 +2882 +178 +11713 +29 +2015 +1889 +11714 +1605 +11715 +11716 +11717 +2 +822 +25 +1870 +8751 +15 +14 +43 +4023 +11718 +14 +357 +11719 +43 +4980 +2308 +3976 +284 +6106 +8255 +11188 +11720 +11721 +11722 +11723 +142 +11724 +11725 +32 +11726 +11727 +210 +43 +11728 +11729 +464 +11730 +5769 +11731 +9132 +11732 +11733 +11148 +15 +11734 +15 +11735 +11736 +6099 +11737 +915 +11738 +11739 +11740 +11741 +303 +248 +1013 +2 +11742 +11743 +11744 +493 +3316 +48 +15 +6915 +98 +11745 +272 +11746 +11747 +4081 +11748 +464 +8367 +11749 +2006 +11750 +1655 +337 +11751 +11752 +11753 +274 +1090 +354 +11754 +927 +2804 +3 +22 +11755 +5792 +5976 +201 +11756 +15 +11757 +484 +416 +11758 +11148 +11759 +554 +1956 +11760 +11761 +11762 +66 +11763 +11764 +3521 +11765 +3055 +248 +11766 +958 +248 +11767 +8724 +345 +11768 +337 +248 +34 +11769 +213 +8447 +5780 +11762 +14 +2213 +11770 +303 +11771 +11772 +11773 +11774 +11775 +1449 +11776 +2577 +989 +5912 +9 +9 +647 +2330 +624 +53 +11777 +11778 +2015 +11779 +11780 +14 +11781 +11782 +1091 +286 +11783 +25 +1674 +11784 +3354 +1604 +4182 +12 +305 +43 +9026 +11785 +3976 +2406 +528 +1112 +2045 +11786 +11787 +2787 +1026 +354 +9910 +32 +11788 +11789 +11790 +11791 +11792 +213 +6258 +6935 +741 +11793 +11794 +2 +11795 +11796 +770 +11797 +11798 +2136 +11799 +5627 +3317 +3406 +11800 +11114 +11801 +9526 +6507 +11802 +11803 +3553 +11804 +2477 +11805 +2029 +11806 +284 +48 +262 +5877 +586 +114 +11807 +1048 +11808 +237 +7891 +597 +713 +464 +57 +11419 +11809 +11810 +11811 +2042 +80 +11812 +5780 +2733 +11813 +34 +11814 +1169 +11815 +11816 +11817 +248 +286 +646 +248 +11818 +486 +66 +43 +11819 +411 +67 +1011 +1364 +11820 +337 +1232 +1291 +11821 +1169 +14 +15 +1458 +137 +809 +11822 +11823 +11824 +915 +11825 +11826 +48 +345 +11827 +213 +43 +11828 +11522 +14 +4907 +11829 +11830 +11831 +648 +1026 +32 +15 +2213 +11832 +11833 +11834 +5920 +11835 +2157 +48 +3172 +745 +11836 +345 +1674 +11837 +22 +48 +345 +11838 +6175 +11839 +11678 +6173 +11840 +1364 +4056 +826 +155 +2015 +11841 +10807 +213 +402 +11842 +4028 +15 +305 +983 +286 +7134 +11843 +179 +11844 +43 +11845 +741 +11846 +5747 +11847 +11848 +11849 +2314 +11850 +1679 +11851 +11852 +11853 +11854 +11855 +2561 +11856 +32 +11857 +1291 +791 +3213 +8042 +43 +11858 +286 +11859 +48 +222 +1013 +11860 +11861 +11862 +1364 +5 +286 +11863 +11864 +11865 +11866 +11867 +11868 +11869 +43 +11870 +176 +19 +11871 +10 +11872 +115 +11873 +464 +48 +11676 +4624 +15 +480 +11874 +345 +11875 +11876 +1514 +11877 +2 +57 +11878 +1684 +11879 +11880 +10256 +6310 +9 +5446 +11881 +11882 +11883 +11884 +11885 +1208 +11886 +1710 +1091 +11887 +305 +284 +8783 +11888 +11889 +665 +2403 +11890 +213 +11891 +11892 +11893 +493 +11894 +11895 +2561 +6035 +337 +331 +11734 +331 +11896 +11897 +3914 +1423 +357 +10500 +11898 +11899 +11900 +317 +4905 +46 +284 +11901 +11902 +284 +11903 +11904 +8297 +9289 +11905 +656 +11906 +11907 +10 +76 +1870 +11908 +11909 +942 +152 +57 +11910 +11911 +11912 +11913 +11914 +11915 +48 +5418 +8219 +213 +11916 +1091 +1013 +213 +11917 +11918 +248 +484 +11919 +1956 +11920 +648 +6661 +303 +213 +17 +9757 +11921 +11922 +1710 +11923 +354 +11924 +284 +188 +11925 +11926 +10973 +11927 +76 +1100 +11928 +11929 +11930 +11931 +11932 +4855 +11933 +19 +11934 +11935 +11936 +717 +2289 +11937 +2792 +11938 +2338 +11939 +11940 +104 +11941 +484 +11670 +104 +11942 +15 +179 +11943 +155 +11944 +9156 +11945 +317 +43 +11946 +10 +14 +77 +11947 +11948 +303 +10 +48 +14 +5041 +11949 +10117 +48 +11148 +43 +11148 +43 +4805 +11950 +11951 +11952 +5780 +317 +48 +11587 +11953 +5344 +77 +11954 +19 +25 +11955 +11956 +286 +1577 +11957 +16 +284 +6249 +11958 +1559 +11959 +42 +9 +11960 +11961 +11962 +3334 +11963 +284 +196 +741 +11964 +2314 +11965 +284 +842 +11966 +337 +281 +7483 +3978 +337 +1051 +464 +11967 +2537 +413 +48 +3852 +11968 +11969 +11970 +713 +14 +10363 +1956 +11971 +11972 +11973 +11974 +11975 +237 +11976 +3059 +57 +337 +43 +11977 +11978 +11979 +43 +284 +11980 +11981 +11982 +11983 +305 +11984 +11985 +339 +11986 +624 +184 +185 +10049 +11987 +48 +11988 +1232 +11989 +19 +9402 +9948 +11990 +11991 +249 +11992 +11993 +25 +11994 +43 +11995 +185 +11996 +15 +12 +11997 +11998 +11999 +12000 +12001 +12002 +12003 +12004 +12005 +57 +12006 +345 +12007 +317 +12008 +17 +12009 +12010 +817 +12011 +12012 +19 +179 +12013 +4 +7615 +12014 +12015 +12016 +43 +2314 +12017 +12018 +5186 +12019 +20 +12020 +12021 +12022 +48 +12023 +12024 +7291 +12025 +35 +11434 +14 +48 +14 +15 +554 +493 +12026 +12027 +213 +12028 +43 +4637 +12029 +248 +554 +12030 +213 +8230 +12031 +12032 +9 +12033 +12034 +12035 +439 +12036 +286 +337 +43 +12037 +12038 +213 +12039 +12040 +12041 +286 +12042 +357 +12043 +4278 +9 +14 +43 +15 +12044 +4855 +12045 +3978 +12046 +357 +12047 +1907 +43 +2 +12048 +12049 +415 +43 +104 +2561 +440 +464 +12050 +48 +12051 +12052 +12053 +10156 +457 +11822 +2330 +12054 +12055 +2136 +12056 +2213 +12057 +12058 +892 +337 +1154 +1112 +323 +9942 +1992 +963 +12059 +12060 +12061 +764 +303 +15 +1823 +1889 +284 +43 +12062 +19 +305 +4169 +7697 +12063 +303 +12064 +11808 +12065 +15 +43 +12066 +1423 +48 +34 +12067 +12068 +12069 +12070 +12071 +12072 +10 +576 +12073 +493 +1442 +9 +736 +137 +12074 +764 +8367 +398 +12075 +284 +104 +8261 +1082 +659 +284 +48 +12076 +558 +5543 +12077 +19 +14 +4012 +12078 +5791 +337 +8996 +12079 +12080 +12081 +12082 +10 +12083 +12084 +4217 +12085 +12086 +178 +12087 +12088 +12089 +1779 +12090 +25 +12091 +12092 +323 +12093 +12094 +12095 +43 +12096 +237 +12097 +7381 +12098 +284 +12099 +213 +12100 +12101 +43 +12102 +12103 +174 +12104 +964 +12105 +12106 +3503 +12107 +1889 +2356 +12108 +152 +3553 +12109 +486 +1311 +12110 +764 +43 +12111 +12112 +12113 +12114 +5208 +11942 +4964 +668 +2 +12115 +2911 +25 +12116 +2315 +305 +12117 +12118 +48 +1013 +3354 +48 +2260 +677 +12119 +4278 +12120 +990 +12121 +12122 +43 +12123 +873 +89 +12124 +5780 +12125 +6612 +4053 +1232 +2264 +12126 +12127 +1061 +12128 +12129 +8784 +213 +12130 +337 +11762 +4766 +12131 +43 +11963 +464 +299 +48 +12132 +12133 +12134 +12135 +12136 +104 +3252 +233 +12137 +7908 +303 +12138 +12139 +232 +12140 +184 +12141 +12142 +12143 +12144 +12145 +1056 +2 +10087 +12146 +15 +12147 +12148 +331 +43 +12149 +5253 +1559 +6480 +12150 +15 +303 +12151 +12152 +12153 +10 +12154 +12155 +345 +32 +12156 +12157 +14 +43 +12158 +892 +12159 +188 +12160 +284 +12161 +25 +12162 +354 +70 +6850 +103 +439 +1172 +43 +337 +12163 +248 +213 +373 +12164 +10767 +4285 +12165 +872 +213 +12166 +10300 +48 +14 +736 +104 +12167 +12168 +12169 +12170 +12171 +5780 +114 +12172 +8853 +11328 +14 +12173 +12174 +1172 +861 +11421 +12175 +345 +20 +514 +10933 +12176 +12177 +12178 +12179 +3989 +237 +12180 +249 +1513 +12181 +12182 +11321 +10136 +12183 +12184 +15 +14 +12185 +707 +12186 +43 +12187 +9402 +202 +2501 +5415 +501 +12188 +12189 +12190 +317 +12191 +12192 +12193 +2234 +915 +12194 +12195 +2135 +12196 +5561 +12197 +12198 +12199 +237 +337 +14 +213 +12200 +9465 +12201 +519 +2500 +112 +12202 +12203 +178 +554 +32 +4278 +5963 +8935 +12204 +12205 +12206 +272 +286 +237 +4364 +12207 +12208 +10614 +1291 +57 +554 +4278 +8789 +237 +15 +317 +43 +77 +12209 +11804 +12210 +12211 +213 +493 +12212 +12213 +43 +12214 +99 +12215 +12216 +12217 +4317 +248 +19 +12218 +237 +248 +2243 +4028 +7451 +303 +12219 +12220 +12221 +12222 +5319 +337 +12223 +10 +764 +337 +2433 +554 +1300 +286 +12224 +397 +12225 +12226 +8297 +2 +9 +12227 +12228 +1688 +4855 +12229 +12230 +1425 +12231 +12232 +12233 +237 +43 +140 +12234 +12235 +2298 +12236 +12237 +2697 +2799 +12238 +15 +232 +12239 +11 +12240 +184 +12241 +6341 +317 +12242 +305 +12243 +1465 +43 +1021 +720 +12244 +10313 +12245 +248 +10638 +19 +2308 +12246 +12247 +12248 +43 +12249 +14 +1384 +365 +10880 +11483 +12250 +17 +43 +12251 +5797 +1692 +10769 +936 +12252 +12253 +12254 +12255 +12256 +12257 +3743 +66 +12258 +14 +248 +12259 +12260 +48 +12261 +892 +6939 +4144 +12262 +48 +12263 +10516 +12264 +12265 +14 +4028 +3213 +9497 +12266 +3354 +3 +317 +10450 +43 +12267 +12268 +209 +12269 +12270 +12271 +210 +6483 +20 +48 +12272 +12273 +12274 +2501 +12275 +2865 +12276 +12277 +14 +48 +12278 +493 +399 +12279 +12280 +12281 +12282 +345 +345 +12283 +12284 +12285 +19 +11148 +12286 +12287 +12288 +493 +9245 +228 +12289 +48 +354 +2770 +12290 +12291 +1203 +282 +12292 +48 +12293 +4806 +12294 +4153 +12295 +12296 +892 +12297 +12298 +12299 +12300 +38 +43 +730 +12301 +12302 +22 +12303 +5601 +3337 +12304 +12305 +12306 +12307 +12189 +15 +464 +5912 +1124 +9582 +1236 +19 +12308 +345 +43 +6616 +12309 +12310 +12311 +8053 +12312 +237 +12313 +345 +12314 +179 +12315 +12316 +12317 +741 +12318 +12319 +12320 +60 +1364 +4 +12321 +357 +2 +12322 +12323 +1157 +12324 +12325 +9 +19 +12326 +12327 +12328 +1966 +12329 +12330 +3599 +377 +1961 +12331 +48 +1605 +53 +12332 +213 +12333 +25 +284 +12334 +185 +12335 +12336 +43 +809 +12337 +554 +12338 +303 +14 +1889 +345 +1655 +2234 +342 +14 +337 +12339 +15 +12340 +3626 +12 +12341 +12342 +12343 +48 +10179 +694 +1542 +1234 +15 +32 +12344 +2919 +43 +12345 +12346 +15 +43 +12347 +491 +10470 +6173 +38 +32 +2728 +12348 +519 +12349 +12350 +12351 +528 +12352 +43 +10256 +12353 +12354 +57 +8889 +354 +12355 +1224 +825 +8798 +7134 +12356 +19 +1927 +12357 +12358 +12359 +104 +12360 +43 +12361 +2136 +237 +12362 +12363 +815 +188 +2197 +12364 +2318 +12365 +464 +12366 +12367 +12368 +2694 +53 +57 +2841 +11675 +12369 +201 +43 +48 +1100 +12370 +8460 +2 +12371 +12372 +12373 +3 +519 +12374 +48 +12375 +1912 +12376 +14 +286 +12377 +140 +12378 +12379 +14 +12380 +1514 +10880 +6214 +48 +15 +464 +12381 +12382 +12383 +12384 +14 +11600 +12385 +4684 +12386 +12387 +12388 +3999 +519 +2446 +48 +12005 +10356 +12389 +14 +12390 +12391 +12392 +12393 +910 +12394 +43 +12395 +2135 +12396 +12397 +12398 +14 +12399 +656 +12400 +48 +188 +12401 +736 +12402 +11185 +12403 +48 +35 +12404 +77 +12405 +12406 +12407 +12408 +48 +1425 +12409 +12410 +2 +12411 +12412 +703 +12413 +12414 +12415 +11224 +12416 +12417 +1852 +12418 +12419 +12420 +76 +12421 +305 +12422 +12423 +43 +586 +2 +323 +411 +665 +43 +12424 +12425 +2035 +3908 +12426 +12427 +736 +554 +12428 +7522 +272 +140 +12429 +12430 +12431 +12432 +3003 +692 +12433 +12434 +12435 +58 +43 +12436 +12437 +3310 +232 +12438 +12439 +12440 +370 +1051 +8849 +305 +12441 +5780 +449 +14 +701 +12442 +12443 +12444 +272 +413 +48 +1232 +12445 +671 +12446 +436 +12447 +413 +12448 +12449 +249 +12450 +66 +286 +12451 +48 +43 +286 +152 +12452 +2650 +12453 +2847 +2694 +11148 +12454 +12455 +15 +12456 +1425 +12457 +491 +43 +12458 +14 +237 +12459 +12460 +57 +1604 +43 +12461 +12462 +764 +1047 +213 +303 +12463 +303 +6209 +12464 +345 +12465 +12466 +12467 +12468 +12469 +114 +98 +12470 +35 +12471 +12472 +5780 +57 +12473 +12474 +1442 +12475 +43 +9832 +12476 +586 +57 +11046 +1112 +16 +861 +249 +12477 +38 +12478 +12479 +12480 +12481 +48 +8020 +12482 +43 +703 +15 +8779 +12483 +12484 +2471 +9 +179 +12485 +12486 +12487 +12488 +122 +176 +12489 +12490 +12491 +12492 +12493 +237 +12494 +155 +12495 +357 +2260 +6479 +1727 +196 +48 +4803 +12496 +48 +1559 +12497 +12498 +185 +12499 +4055 +12500 +30 +12501 +137 +14 +248 +178 +43 +2988 +399 +303 +7624 +305 +12502 +12477 +2919 +2202 +12503 +66 +12504 +12505 +12506 +12507 +345 +12508 +3468 +12509 +12510 +1870 +586 +357 +573 +4187 +12511 +1546 +43 +80 +12512 +12513 +43 +2043 +493 +5780 +369 +7 +12514 +10299 +9363 +12515 +12516 +188 +12517 +5839 +904 +43 +43 +464 +12518 +11754 +12519 +12520 +12521 +12522 +12523 +12524 +703 +12525 +4430 +337 +6877 +880 +12526 +12527 +14 +179 +12528 +707 +4081 +48 +9 +694 +7208 +8724 +6398 +286 +1605 +12529 +10560 +43 +2409 +14 +2804 +1112 +2012 +1082 +12530 +10883 +12531 +671 +358 +9603 +10600 +14 +48 +493 +12532 +12533 +861 +48 +3287 +12534 +12535 +12536 +20 +14 +12537 +12538 +11551 +12539 +721 +12540 +12541 +12542 +10151 +305 +272 +10657 +12543 +1716 +12544 +12545 +345 +14 +140 +1364 +188 +1536 +453 +1224 +12546 +3711 +43 +12547 +2694 +8961 +12548 +12549 +32 +12550 +12551 +3543 +1543 +12552 +2064 +12553 +11353 +10880 +2042 +8037 +12554 +12555 +12556 +12557 +8779 +12558 +185 +1812 +12559 +12560 +12561 +12562 +12563 +43 +12564 +5808 +237 +12565 +43 +10310 +12566 +464 +305 +12567 +12568 +1165 +213 +213 +248 +9417 +12569 +12570 +14 +4606 +12571 +12572 +12573 +213 +43 +14 +12574 +12575 +12576 +12577 +303 +2499 +176 +1232 +764 +15 +4053 +3 +12578 +12579 +12580 +43 +12581 +357 +12 +736 +12582 +2093 +2764 +12583 +112 +3984 +25 +5990 +12584 +12585 +12586 +3 +11762 +464 +613 +6090 +12587 +12588 +10 +12589 +5577 +12590 +12591 +12592 +1244 +98 +12593 +12594 +12595 +43 +286 +12596 +12597 +19 +43 +12598 +6505 +2804 +12599 +12600 +12601 +11762 +12602 +12603 +3842 +2790 +284 +15 +201 +647 +12604 +43 +12605 +7045 +357 +331 +12606 +11754 +19 +237 +345 +43 +12607 +11483 +1942 +12034 +10 +1817 +12608 +337 +12609 +270 +12610 +4278 +12611 +2790 +303 +7276 +12612 +8724 +12613 +1048 +12614 +12615 +12616 +4 +12617 +12618 +12619 +272 +8297 +12620 +7855 +12621 +2764 +16 +12622 +12623 +2035 +12624 +43 +6527 +12625 +12626 +12627 +590 +3978 +237 +12628 +12629 +12630 +15 +57 +114 +32 +12631 +12632 +14 +12633 +3743 +12634 +48 +1251 +3238 +15 +57 +1169 +11960 +12635 +12636 +764 +12466 +8468 +4855 +10 +14 +12637 +114 +19 +32 +12638 +12639 +12640 +114 +3 +12641 +48 +43 +2 +12642 +15 +43 +12643 +57 +2234 +42 +12644 +2 +12645 +12646 +228 +43 +12647 +12648 +12649 +14 +12650 +345 +12651 +14 +713 +12652 +12653 +651 +29 +12654 +12655 +286 +12656 +48 +12657 +345 +12658 +155 +12241 +19 +1295 +2136 +12659 +43 +5418 +6480 +248 +12660 +12661 +12662 +209 +14 +5080 +6507 +337 +12663 +12664 +12665 +4116 +12666 +15 +12667 +213 +1157 +12668 +12669 +12203 +12670 +1665 +11966 +1696 +48 +12671 +12672 +647 +5990 +15 +12673 +12674 +12675 +493 +237 +12676 +12677 +2561 +4441 +12678 +12679 +185 +48 +12680 +179 +12681 +4 +12682 +484 +43 +242 +176 +12683 +67 +2975 +2 +11728 +25 +958 +4855 +12684 +14 +19 +736 +43 +1584 +12685 +6518 +1812 +970 +7357 +790 +4123 +43 +554 +2 +12686 +222 +12687 +12688 +19 +3543 +12689 +892 +12690 +3 +616 +57 +98 +43 +12691 +6741 +1049 +188 +5780 +464 +12692 +1812 +2 +12693 +137 +14 +10 +237 +331 +337 +10 +12694 +10 +12695 +43 +12696 +48 +9798 +303 +12697 +228 +14 +337 +12698 +12699 +248 +12700 +284 +446 +245 +48 +12701 +12702 +8867 +4 +741 +12703 +398 +484 +48 +3385 +12704 +2 +2406 +1626 +12705 +12706 +48 +9 +12707 +1224 +12708 +12709 +915 +12710 +43 +7291 +10 +12711 +9988 +12712 +20 +12713 +11754 +12714 +12715 +43 +342 +12716 +12717 +12718 +237 +10 +6054 +7855 +19 +2042 +48 +19 +1314 +12719 +12720 +12721 +178 +12722 +493 +12723 +8392 +822 +15 +1105 +12724 +12725 +9738 +12726 +12031 +12727 +12728 +12729 +12730 +4 +12351 +12731 +12732 +11822 +12733 +43 +248 +872 +7666 +12734 +12735 +284 +1100 +12736 +8098 +1251 +12737 +1232 +4075 +2320 +39 +272 +237 +12738 +1425 +12739 +12740 +12741 +12742 +14 +1203 +764 +10699 +10592 +3543 +12743 +12744 +5169 +12745 +48 +12746 +20 +43 +43 +12747 +12748 +12749 +14 +12750 +20 +14 +2061 +43 +72 +48 +43 +12751 +12752 +12753 +20 +369 +1217 +12754 +12755 +12756 +6839 +12757 +12758 +8163 +12759 +12760 +6106 +9 +2356 +12761 +12762 +43 +12763 +554 +6306 +491 +12764 +12765 +12716 +795 +12766 +20 +484 +12767 +43 +112 +1684 +379 +338 +12768 +237 +1533 +12769 +2865 +12770 +12771 +10557 +7521 +9497 +12772 +12773 +533 +12774 +286 +12775 +282 +12776 +43 +10 +12777 +741 +12778 +12779 +12780 +12781 +155 +286 +707 +12782 +809 +48 +1082 +12783 +3944 +3 +484 +12784 +42 +12785 +12786 +1082 +1220 +12787 +1710 +12788 +12789 +2 +12790 +10750 +2865 +43 +2239 +12791 +357 +1012 +43 +231 +12792 +2197 +43 +1605 +8517 +671 +196 +12793 +12794 +237 +43 +1224 +12795 +14 +12796 +12797 +7522 +736 +12798 +142 +915 +417 +3239 +9345 +14 +12799 +12800 +12801 +19 +12802 +970 +12803 +12804 +12805 +12806 +3 +11480 +12807 +12808 +43 +736 +457 +3 +12795 +338 +2488 +249 +12809 +1364 +12810 +1716 +286 +43 +25 +48 +12811 +3594 +365 +237 +12812 +14 +12813 +1829 +12814 +493 +12815 +43 +43 +9095 +4 +249 +210 +15 +1011 +12816 +646 +12817 +12818 +12819 +12820 +12821 +8724 +11489 +12822 +48 +2566 +1696 +671 +104 +357 +15 +12823 +4038 +12824 +12402 +12825 +6382 +12826 +48 +4487 +305 +12827 +19 +7259 +286 +112 +12828 +373 +14 +554 +373 +12543 +12829 +12830 +12831 +12832 +337 +32 +14 +12833 +12834 +1244 +12835 +12761 +12836 +43 +12837 +43 +12838 +2004 +4745 +4441 +12839 +12840 +1688 +10727 +43 +12841 +12842 +57 +12843 +6468 +12844 +3603 +3660 +12845 +12846 +48 +659 +2018 +12847 +12848 +12795 +12849 +14 +3172 +11754 +8896 +12850 +373 +4313 +11822 +12851 +12852 +647 +12853 +1955 +6701 +12854 +4441 +12855 +11400 +5601 +14 +12824 +4269 +446 +464 +12856 +12857 +12426 +14 +7355 +10 +12858 +176 +2239 +12859 +12110 +1503 +1817 +12860 +1425 +493 +12861 +12862 +12863 +48 +12864 +48 +12865 +12866 +12867 +12868 +284 +14 +43 +12869 +12795 +741 +564 +43 +12870 +12871 +337 +48 +1655 +213 +48 +286 +12872 +14 +48 +48 +12873 +237 +12874 +12875 +286 +8015 +43 +10418 +12876 +12877 +2694 +5650 +12878 +188 +12879 +6335 +12880 +43 +43 +43 +2459 +12881 +43 +2694 +12882 +14 +1765 +2064 +1710 +3543 +3 +237 +6400 +43 +12883 +12884 +11601 +141 +707 +6076 +48 +11762 +12885 +48 +5134 +317 +12886 +1001 +11482 +12887 +12888 +12889 +720 +12890 +209 +1547 +12891 +12892 +2064 +12893 +1262 +12894 +12895 +12896 +4002 +43 +9617 +9082 +284 +12897 +1425 +713 +3343 +12898 +265 +12899 +12900 +12901 +5627 +12902 +3239 +5751 +2593 +12903 +43 +11822 +12904 +12905 +4144 +8458 +12906 +10 +10 +10 +4483 +15 +19 +9 +8041 +12907 +32 +12908 +237 +188 +12909 +12910 +5293 +5780 +248 +237 +12911 +48 +6871 +12912 +1149 +14 +2 +12913 +14 +12914 +12915 +12916 +48 +283 +12917 +6618 +1364 +12621 +1817 +8249 +12918 +14 +43 +790 +3519 +1049 +12919 +3553 +89 +2 +12920 +11963 +12921 +2042 +12922 +548 +3317 +4028 +12923 +1956 +104 +2577 +12924 +1232 +14 +12925 +9999 +43 +1160 +12926 +237 +43 +10880 +43 +12927 +11762 +12928 +48 +5089 +59 +19 +12929 +12930 +616 +1011 +12931 +10 +12932 +12933 +14 +48 +2577 +43 +11085 +12934 +1232 +5134 +12935 +10908 +4899 +12936 +2686 +665 +11808 +12937 +1082 +12938 +12939 +237 +12940 +7836 +12941 +7945 +2356 +12942 +19 +2202 +12943 +1745 +12944 +436 +2 +16 +43 +915 +2577 +12945 +15 +43 +1223 +12946 +1082 +5614 +12947 +12948 +12949 +12950 +4125 +274 +272 +5410 +12951 +43 +14 +12952 +10880 +12953 +286 +12954 +4352 +379 +12955 +12956 +48 +48 +12957 +1451 +2804 +7357 +155 +1091 +5791 +12958 +12959 +12960 +43 +1513 +12961 +5860 +3755 +12962 +536 +6537 +272 +12963 +12964 +43 +185 +5963 +12965 +352 +12966 +12967 +12968 +48 +12969 +2264 +12970 +1051 +48 +114 +1425 +1090 +7419 +19 +12971 +12972 +12973 +9 +12974 +43 +12975 +379 +1749 +1154 +5769 +12976 +48 +12977 +493 +14 +12978 +554 +10880 +12979 +165 +12980 +12981 +12982 +9849 +12983 +12984 +12985 +12986 +12987 +12988 +2561 +15 +9749 +12989 +43 +12990 +647 +357 +12991 +2 +12992 +12993 +810 +576 +12994 +12995 +12067 +12996 +3743 +6285 +12997 +2009 +35 +272 +12998 +286 +809 +272 +1012 +2919 +1716 +237 +12999 +66 +357 +8297 +2314 +269 +586 +1425 +13000 +10 +365 +872 +13001 +13002 +13003 +13004 +272 +13005 +13006 +15 +43 +6718 +14 +13007 +2302 +48 +13008 +554 +1112 +13009 +13010 +493 +13011 +4789 +13012 +1655 +1051 +13013 +14 +5627 +13014 +155 +337 +13015 +13016 +13017 +13018 +2314 +13019 +213 +43 +13020 +357 +48 +13021 +4907 +13022 +43 +13023 +13024 +15 +13025 +32 +13026 +13027 +12067 +43 +317 +155 +184 +286 +13028 +48 +13029 +741 +12402 +1765 +2260 +13030 +2330 +305 +213 +4963 +10 +12684 +13031 +303 +13032 +43 +2764 +48 +13033 +764 +14 +43 +2314 +209 +491 +13034 +14 +712 +13035 +13036 +2045 +736 +13037 +2 +13038 +43 +48 +595 +7053 +13039 +2 +13040 +48 +14 +13041 +13042 +2463 +13043 +2459 +13044 +2499 +764 +13045 +2561 +5418 +13046 +13047 +237 +14 +5780 +99 +303 +43 +357 +13048 +13049 +43 +48 +13050 +13051 +707 +48 +974 +13052 +13053 +12195 +15 +13054 +14 +48 +13055 +13056 +10930 +13057 +286 +713 +12067 +13058 +14 +89 +788 +13059 +1961 +30 +60 +13060 +11787 +13061 +43 +303 +501 +237 +13062 +2957 +1437 +13063 +3 +13064 +13065 +13066 +210 +554 +13067 +237 +11754 +13068 +13069 +13070 +13071 +115 +13072 +13073 +237 +5780 +10 +9784 +237 +7256 +13074 +13075 +1051 +43 +13076 +13077 +43 +155 +13078 +43 +12005 +3561 +13079 +9395 +14 +13080 +13081 +349 +43 +14 +48 +1502 +48 +7208 +13082 +15 +6480 +13083 +6870 +13084 +13085 +4756 +48 +10 +286 +13086 +142 +3546 +13087 +5780 +19 +14 +3553 +48 +5679 +3546 +13088 +12987 +3480 +13089 +491 +13090 +13091 +349 +1364 +3553 +2314 +13092 +554 +2619 +4028 +1961 +1533 +19 +192 +16 +13093 +43 +10 +9713 +43 +48 +13094 +357 +19 +3 +48 +13095 +1021 +13096 +1018 +4982 +491 +43 +989 +2 +48 +416 +2395 +13097 +13098 +14 +2019 +349 +13099 +13100 +1901 +237 +9987 +13101 +694 +3543 +140 +13102 +13103 +4765 +2310 +14 +493 +13104 +1513 +43 +13105 +647 +19 +665 +4028 +188 +1817 +13106 +8249 +57 +13107 +303 +13108 +66 +13109 +13110 +12 +43 +13111 +2 +284 +741 +5780 +48 +237 +34 +14 +872 +48 +984 +57 +13112 +48 +2181 +974 +48 +1423 +13113 +2 +43 +1605 +13114 +13115 +13116 +13117 +48 +2 +872 +13118 +35 +613 +554 +48 +77 +4380 +13119 +15 +201 +11224 +14 +12987 +43 +13120 +13121 +35 +6484 +13122 +43 +13123 +48 +13124 +712 +6251 +137 +13125 +13126 +48 +32 +1765 +35 +12987 +14 +11702 +13127 +43 +13128 +43 +13129 +13130 +13131 +493 +5293 +1738 +13132 +12987 +77 +237 +13133 +13134 +13135 +225 +2733 +43 +48 +13011 +13136 +249 +13137 +4960 +2561 +13138 +237 +43 +2513 +13139 +13140 +9 +597 +13141 +43 +303 +10 +3 +13142 +13143 +411 +19 +303 +8867 +377 +305 +13144 +13145 +1232 +13146 +616 +13147 +13148 +1364 +43 +13149 +892 +13150 +43 +554 +13151 +43 +2463 +4461 +43 +13152 +317 +1612 +48 +1013 +14 +13153 +11498 +1224 +43 +14 +43 +14 +178 +13154 +13155 +188 +43 +2733 +13156 +849 +10365 +13157 +686 +936 +43 +13158 +43 +201 +13159 +13160 +464 +48 +13161 +13162 +13163 +13164 +5827 +48 +13165 +13166 +2697 +12893 +20 +13167 +13168 +13169 +5318 +196 +13170 +13171 +7449 +13172 +13173 +1051 +872 +13174 +13175 +13176 +89 +8248 +14 +1214 +13177 +13178 +1356 +2577 +5659 +48 +6595 +13179 +305 +741 +1384 +48 +43 +43 +13180 +43 +13181 +13182 +373 +1377 +2035 +11762 +13183 +13184 +13185 +13186 +13187 +348 +13188 +112 +13189 +14 +13190 +2 +13191 +741 +2064 +13192 +13193 +43 +1232 +13194 +9 +1823 +242 +11822 +1051 +13195 +20 +13196 +13197 +2356 +13198 +1120 +2835 +13199 +155 +13200 +13201 +13202 +741 +48 +464 +2239 +13203 +13204 +2593 +13205 +8849 +2239 +13206 +13207 +1335 +13208 +9232 +13209 +14 +13210 +4730 +2064 +209 +13211 +77 +13212 +741 +15 +13213 +13214 +12203 +10262 +3 +7595 +11428 +13215 +9 +2577 +43 +13216 +98 +20 +43 +1612 +286 +397 +13217 +14 +14 +6341 +5780 +13218 +46 +13219 +48 +13220 +3059 +5169 +13221 +13222 +4980 +35 +57 +692 +1559 +736 +13223 +32 +491 +13224 +7137 +13225 +845 +43 +13226 +13227 +1655 +43 +11482 +13228 +13229 +1428 +554 +99 +13230 +2 +5780 +1244 +14 +1229 +98 +915 +13231 +13232 +13233 +201 +1169 +13234 +872 +2919 +13235 +554 +48 +13236 +323 +13237 +13238 +13239 +13240 +48 +16 +13241 +741 +13242 +13243 +2414 +4536 +48 +12807 +554 +2 +11762 +32 +43 +11593 +13244 +3709 +13245 +13246 +13247 +13248 +12203 +35 +5833 +77 +13249 +35 +286 +13250 +14 +2131 +2042 +13251 +10 +250 +1559 +13252 +1296 +13253 +13254 +1091 +13255 +13256 +12987 +1018 +48 +13257 +14 +13258 +354 +13259 +13260 +43 +43 +43 +13261 +2064 +13262 +13263 +6874 +480 +5780 +5212 +1612 +590 +8367 +2769 +528 +104 +43 +13264 +692 +1013 +14 +209 +13265 +6123 +613 +13266 +43 +209 +13267 +248 +7855 +6732 +9 +14 +176 +13268 +213 +323 +43 +13269 +736 +48 +66 +373 +13270 +7032 +13271 +13272 +13273 +13274 +11754 +13275 +10239 +13276 +5780 +272 +48 +13277 +13278 +13279 +11754 +13280 +1817 +13281 +303 +14 +873 +4 +1217 +13282 +13283 +13284 +13285 +13286 +4851 +155 +185 +13287 +13288 +13289 +13290 +13291 +13292 +43 +32 +13293 +286 +5992 +48 +13294 +13295 +48 +185 +2865 +849 +155 +237 +736 +6400 +13296 +1310 +11754 +1425 +13297 +13162 +13298 +411 +14 +48 +13299 +248 +13300 +13301 +13302 +358 +48 +13303 +8297 +13304 +13305 +10 +15 +5806 +13306 +43 +14 +13307 +43 +10362 +13308 +13309 +13310 +188 +13311 +13312 +13313 +13314 +13315 +554 +13316 +13317 +13318 +2035 +8076 +2697 +303 +13307 +48 +43 +3480 +764 +13319 +43 +349 +770 +9364 +13320 +13321 +13322 +1376 +13323 +915 +13324 +19 +5169 +741 +13325 +12460 +48 +43 +357 +13326 +13327 +19 +284 +1251 +14 +155 +286 +2 +57 +43 +43 +43 +13328 +13329 +741 +9 +13330 +416 +13331 +2804 +22 +1112 +11961 +5316 +554 +10 +13332 +43 +13333 +13334 +558 +4441 +305 +647 +741 +337 +48 +1051 +43 +13335 +12987 +598 +3546 +43 +13336 +13337 +13338 +13339 +13340 +971 +13341 +13342 +1082 +43 +48 +48 +13343 +13344 +6877 +13345 +13346 +237 +13347 +2733 +13348 +43 +14 +1710 +48 +11607 +13175 +707 +822 +2 +3995 +286 +13349 +3543 +323 +686 +1743 +32 +10 +13350 +237 +1107 +13351 +13352 +2 +1107 +13353 +210 +80 +2 +1234 +13354 +19 +48 +13355 +13356 +48 +616 +3425 +1745 +1693 +112 +176 +210 +43 +13357 +188 +554 +1300 +13358 +8946 +13359 +13360 +1232 +10 +554 +425 +13361 +13362 +48 +7226 +9402 +13248 +13363 +14 +13364 +2561 +1927 +13365 +19 +43 +13366 +19 +707 +6950 +13367 +48 +2591 +237 +48 +22 +9237 +13368 +1542 +3546 +14 +530 +2 +2804 +1889 +43 +13369 +15 +13370 +1082 +741 +5192 +1232 +9 +48 +13371 +43 +6441 +13372 +1531 +43 +89 +13373 +155 +1287 +795 +13374 +10 +248 +13375 +1716 +43 +43 +13376 +15 +2591 +284 +3251 +19 +213 +7945 +176 +10899 +48 +48 +8392 +43 +43 +647 +13223 +19 +4963 +43 +2012 +43 +48 +303 +248 +66 +57 +1232 +13377 +48 +2804 +43 +43 +1371 +13378 +12402 +5781 +416 +13379 +1141 +14 +13380 +185 +1232 +48 +20 +2 +13381 +13382 +197 +13383 +741 +13384 +14 +6484 +2768 +13385 +6940 +22 +13386 +647 +286 +11754 +13387 +317 +2 +13388 +1920 +237 +13389 +13390 +13391 +13392 +13393 +43 +43 +1514 +48 +1335 +43 +13394 +13395 +741 +13396 +15 +1543 +13397 +7998 +736 +13398 +3 +3284 +1710 +32 +5211 +43 +13399 +13400 +201 +15 +9451 +12807 +12563 +222 +237 +12987 +13401 +13402 +13403 +43 +8448 +13404 +32 +13405 +11330 +284 +48 +1011 +13406 +13407 +15 +43 +13408 +19 +286 +13409 +13410 +2347 +240 +178 +32 +14 +13411 +9 +35 +188 +48 +741 +8151 +13412 +13413 +13414 +872 +13415 +590 +13416 +32 +1817 +13417 +3279 +2804 +13418 +10356 +13419 +14 +5022 +13420 +5065 +13421 +13422 +48 +590 +1051 +806 +282 +13423 +284 +5080 +464 +3406 +7739 +1384 +14 +2084 +13424 +8367 +43 +272 +1425 +1112 +13425 +43 +9258 +43 +13426 +43 +13427 +155 +13428 +560 +2 +1010 +13429 +12807 +13430 +13195 +13431 +13432 +13433 +13434 +13435 +209 +13436 +286 +3317 +48 +13437 +5780 +4055 +48 +323 +201 +13438 +22 +7855 +13439 +2 +13440 +13441 +3452 +13442 +13443 +5780 +342 +13444 +48 +486 +286 +13445 +171 +770 +13446 +13447 +2550 +48 +13448 +1577 +1399 +13449 +13450 +43 +1226 +13451 +48 +1051 +209 +43 +10 +989 +7836 +48 +48 +13452 +13453 +279 +13454 +286 +13455 +560 +43 +13456 +13457 +39 +3546 +13458 +4388 +12402 +3546 +1203 +109 +2330 +188 +179 +13459 +13460 +43 +4963 +15 +32 +13461 +13462 +4747 +736 +13463 +43 +2944 +1716 +13464 +13465 +5933 +491 +11817 +13466 +12372 +13467 +13468 +13469 +115 +19 +13470 +1847 +13471 +13472 +1232 +19 +971 +48 +32 +4257 +13473 +13474 +13475 +892 +10 +583 +590 +12926 +43 +14 +13476 +7208 +13477 +3066 +13478 +13479 +13480 +4806 +13481 +13482 +647 +13483 +2029 +13484 +13485 +48 +48 +13486 +13487 +13488 +13489 +11762 +1920 +8893 +32 +14 +43 +13490 +13491 +554 +43 +1112 +13492 +5318 +13493 +13494 +13394 +2 +43 +43 +1048 +13495 +7053 +13496 +13497 +1384 +188 +13498 +4716 +4313 +5659 +43 +13499 +13500 +13501 +11593 +13502 +13503 +13504 +179 +48 +48 +4020 +13505 +13506 +1765 +38 +4125 +2865 +13507 +13508 +1566 +43 +14 +10 +3546 +4934 +13509 +13510 +3 +10 +1425 +48 +13511 +13512 +13513 +237 +1481 +13514 +2165 +2427 +188 +464 +13515 +237 +13516 +13517 +13518 +1617 +188 +43 +13519 +13520 +58 +13521 +1232 +13522 +8244 +1562 +590 +13523 +13524 +1454 +484 +11238 +1244 +4 +4313 +13525 +36 +89 +19 +2896 +13526 +13527 +12310 +43 +286 +43 +4388 +13528 +48 +1021 +6990 +32 +1632 +43 +11822 +1696 +5780 +13529 +46 +2 +13530 +648 +43 +379 +2019 +4388 +7544 +379 +2593 +13531 +597 +184 +13532 +358 +13533 +13534 +13535 +13536 +193 +13537 +13538 +13539 +13540 +8188 +2136 +13541 +43 +10 +13542 +13543 +2577 +464 +66 +13544 +48 +13545 +2314 +677 +13546 +2913 +13547 +5780 +13548 +11483 +167 +13549 +1710 +13550 +284 +13551 +13552 +43 +248 +13553 +872 +14 +1559 +48 +3546 +14 +705 +14 +2463 +1107 +43 +733 +14 +48 +13554 +13555 +10280 +493 +13556 +1529 +13557 +2944 +4806 +284 +13558 +5009 +936 +155 +1425 +43 +13559 +272 +13560 +25 +213 +13561 +43 +13361 +13562 +2550 +3546 +43 +872 +13563 +48 +13564 +43 +32 +13565 +13566 +13567 +770 +10028 +2 +43 +10950 +237 +19 +13568 +13569 +43 +464 +8102 +13570 +799 +1901 +43 +14 +16 +13571 +12093 +13572 +112 +43 +210 +13573 +14 +790 +13574 +14 +1612 +48 +29 +1044 +484 +196 +770 +32 +155 +3408 +9948 +13575 +9 +13576 +2911 +10 +646 +13577 +1013 +12808 +13578 +57 +13579 +237 +2 +1415 +564 +8460 +11039 +184 +665 +43 +48 +43 +209 +13580 +13581 +3759 +736 +13582 +43 +13583 +5837 +14 +13584 +4762 +13585 +13586 +19 +48 +13587 +474 +209 +6188 +286 +1765 +48 +647 +43 +12372 +43 +210 +13588 +13589 +6776 +13590 +222 +7887 +13591 +13592 +43 +13593 +931 +828 +1514 +279 +6671 +647 +13594 +13595 +741 +13596 +48 +13597 +13598 +13599 +48 +2 +3354 +43 +2591 +13600 +13601 +14 +13602 +13603 +13604 +1920 +14 +13605 +369 +8230 +9633 +2053 +13606 +13607 +29 +4764 +43 +1100 +43 +15 +14 +13608 +1157 +43 +13609 +12788 +237 +13610 +248 +32 +13611 +397 +4677 +13612 +13613 +13614 +13615 +13616 +4028 +337 +13617 +14 +2 +11754 +13618 +11754 +6595 +13619 +48 +284 +2 +13620 +48 +736 +12299 +8569 +13621 +2919 +7048 +2251 +43 +13622 +303 +48 +13623 +20 +3732 +3546 +48 +13624 +237 +1655 +647 +48 +2954 +13625 +2213 +13626 +13627 +13628 +333 +8614 +13629 +708 +48 +13630 +272 +13631 +2560 +9560 +13632 +48 +188 +43 +6874 +4900 +66 +1870 +13633 +13634 +13635 +13636 +19 +48 +237 +3 +13637 +99 +48 +43 +13638 +2093 +188 +13639 +13640 +57 +13641 +13642 +6720 +3745 +533 +16 +646 +3546 +13643 +13644 +20 +397 +1529 +1961 +2040 +14 +15 +48 +48 +399 +13645 +14 +415 +188 +7291 +665 +13646 +13647 +1566 +13648 +13649 +201 +13650 +13651 +2577 +5780 +301 +14 +2 +9 +48 +13652 +4028 +13653 +13654 +1684 +13030 +10003 +48 +19 +1425 +14 +554 +741 +13655 +10880 +96 +1502 +1992 +3546 +43 +13656 +1765 +43 +13657 +13658 +13659 +7517 +13660 +48 +14 +13661 +1234 +19 +13662 +272 +43 +13663 +6214 +13664 +379 +13665 +13666 +201 +13667 +43 +48 +13668 +11482 +13669 +13670 +2790 +3546 +43 +13671 +13672 +14 +491 +4684 +13673 +13674 +3546 +13675 +13676 +3546 +354 +48 +13677 +13678 +764 +43 +4963 +3507 +13679 +48 +873 +13680 +10 +13681 +13682 +4028 +4028 +13683 +13684 +12987 +13685 +1559 +13686 +13687 +13688 +13689 +1538 +237 +1011 +2865 +861 +142 +13690 +1082 +616 +13691 +155 +13692 +43 +357 +5005 +1310 +13693 +4174 +32 +5577 +2260 +14 +616 +784 +13694 +11754 +12999 +12824 +2804 +185 +43 +48 +399 +9 +1364 +305 +1049 +286 +13179 +13695 +43 +11754 +1335 +48 +237 +13696 +48 +1066 +6095 +13697 +13698 +12479 +286 +2309 +43 +415 +13699 +1203 +764 +48 +155 +554 +13700 +4364 +861 +46 +15 +13701 +13702 +57 +14 +13703 +2804 +533 +104 +3546 +19 +48 +13390 +155 +48 +12987 +13704 +486 +13705 +19 +155 +6214 +3908 +10649 +13706 +14 +13707 +43 +11754 +13708 +14 +13709 +13710 +43 +493 +373 +13711 +57 +1578 +13712 +13713 +2 +43 +48 +1428 +13714 +2 +286 +13715 +286 +1655 +19 +564 +13716 +4313 +13717 +43 +13718 +13719 +19 +140 +1232 +2537 +3546 +13720 +2668 +3 +13721 +32 +48 +155 +13722 +317 +1765 +357 +13282 +13723 +11508 +13724 +13725 +43 +6950 +13726 +872 +77 +13727 +13728 +6222 +13729 +741 +17 +13730 +3354 +12987 +13731 +48 +48 +237 +1604 +13732 +80 +1562 +1577 +873 +32 +13733 +48 +9112 +554 +13734 +13735 +377 +43 +1920 +13566 +1514 +764 +12397 +13736 +13737 +13738 +13739 +13740 +3842 +892 +13741 +2769 +13742 +13743 +1013 +13744 +13745 +43 +2064 +48 +13746 +616 +2733 +8102 +13747 +650 +2 +43 +13748 +13749 +4 +1612 +142 +1051 +12067 +13750 +323 +188 +1425 +43 +13751 +19 +13752 +13733 +15 +237 +13753 +155 +13754 +2302 +7053 +19 +13755 +1091 +10 +703 +286 +13756 +13757 +13758 +2804 +4357 +3546 +14 +13759 +7276 +43 +43 +1026 +225 +33 +791 +13760 +4522 +286 +178 +11762 +13761 +13762 +13763 +7431 +9 +43 +237 +13764 +13760 +3546 +13765 +43 +13766 +13767 +13768 +943 +57 +11593 +14 +13769 +98 +43 +1112 +20 +179 +43 +1961 +464 +13770 +13771 +13772 +43 +13773 +3768 +43 +554 +176 +2309 +13774 +13775 +12932 +48 +13776 +13777 +13778 +1051 +2253 +13779 +958 +13780 +43 +13781 +13782 +1091 +12590 +98 +237 +616 +13783 +2 +13784 +13785 +13786 +464 +741 +13787 +185 +13788 +13789 +13790 +237 +7960 +13791 +43 +5780 +43 +20 +12407 +484 +13792 +13793 +13794 +7328 +5780 +43 +43 +3395 +237 +13795 +1543 +112 +915 +1154 +286 +286 +13796 +48 +22 +13797 +11362 +13798 +439 +13799 +1090 +228 +13800 +13801 +43 +25 +736 +35 +185 +1100 +9705 +12987 +3546 +43 +13311 +14 +13205 +741 +29 +1465 +13802 +237 +6182 +2 +57 +13803 +13804 +14 +13805 +237 +13806 +213 +48 +19 +13566 +13260 +237 +7855 +13807 +13808 +1012 +13809 +13810 +13811 +13812 +248 +2804 +1870 +13813 +48 +2310 +13814 +6915 +13802 +13815 +13816 +915 +2 +13817 +5438 +13818 +2 +337 +43 +4217 +305 +32 +1425 +12159 +248 +13819 +13820 +12596 +152 +213 +13393 +13821 +13822 +9 +13823 +14 +4943 +48 +6638 +13824 +13825 +43 +1920 +13826 +152 +43 +112 +14 +13827 +13828 +48 +13829 +2 +5780 +11158 +703 +4745 +1287 +43 +201 +13830 +20 +248 +13831 +48 +11670 +29 +554 +13832 +43 +554 +286 +7891 +13833 +13834 +13835 +3546 +5418 +13836 +249 +13837 +2 +13838 +15 +274 +7855 +36 +399 +13839 +402 +1217 +19 +7960 +741 +48 +358 +14 +12746 +8418 +209 +13840 +43 +13841 +13842 +2919 +13843 +43 +13844 +11754 +13845 +1224 +564 +48 +57 +12220 +6371 +13846 +554 +13847 +2 +43 +43 +43 +1384 +2804 +13848 +13849 +13850 +43 +13851 +13852 +152 +411 +237 +915 +13853 +48 +237 +13854 +13855 +2334 +286 +237 +7137 +43 +14 +188 +19 +22 +2694 +104 +14 +11762 +616 +213 +2697 +48 +4055 +10 +13856 +13857 +13858 +48 +237 +48 +4634 +14 +13859 +13643 +303 +10 +1224 +248 +397 +48 +12600 +237 +13860 +303 +554 +5780 +1112 +48 +13861 +13459 +32 +303 +303 +48 +13862 +137 +13863 +13864 +13865 +13866 +13867 +43 +13868 +590 +13869 +1502 +736 +554 +2029 +14 +13870 +13871 +1719 +13872 +915 +3546 +13873 +357 +43 +176 +13874 +43 +1224 +915 +3546 +13875 +13876 +13877 +13878 +1051 +13879 +1232 +13880 +915 +237 +3546 +13881 +3546 +1115 +77 +12642 +2 +495 +1442 +104 +2762 +19 +13882 +13883 +32 +13884 +13885 +286 +14 +7208 +2414 +11762 +827 +3066 +13886 +970 +323 +13887 +13888 +4963 +13889 +57 +13890 +13891 +14 +13892 +3415 +3003 +20 +48 +3 +822 +152 +1112 +57 +13893 +48 +13894 +32 +48 +3546 +13895 +43 +1513 +43 +155 +1011 +20 +13896 +155 +1700 +13897 +43 +16 +13898 +104 +720 +5601 +13899 +13900 +13901 +13902 +357 +13903 +13904 +13201 +13905 +286 +48 +13906 +10287 +2579 +35 +11800 +43 +13907 +741 +694 +32 +1517 +13908 +13909 +237 +237 +13910 +358 +20 +13911 +13912 +13913 +1716 +331 +647 +2314 +13914 +13915 +48 +13916 +8826 +14 +13917 +19 +13918 +48 +13919 +13920 +22 +1364 +1051 +43 +349 +13921 +104 +43 +1091 +13922 +1224 +554 +14 +624 +15 +299 +13923 +272 +14 +13924 +13925 +1091 +647 +2 +3546 +48 +13926 +616 +43 +11762 +13927 +13928 +188 +13929 +369 +1100 +13930 +13931 +19 +8392 +13932 +19 +13933 +3553 +8378 +14 +3973 +155 +14 +185 +13934 +43 +2430 +14 +8098 +43 +19 +1153 +13935 +13936 +373 +13937 +799 +237 +13938 +3546 +13939 +11907 +686 +13940 +13941 +3570 +43 +43 +33 +13942 +1753 +13943 +1514 +495 +590 +6505 +13944 +13945 +13946 +286 +1817 +13947 +13948 +4963 +165 +373 +3323 +155 +13949 +12120 +13950 +5202 +13951 +48 +1920 +57 +48 +13952 +13953 +13954 +15 +1229 +13955 +2463 +66 +5990 +43 +10642 +209 +43 +13956 +7855 +36 +13957 +48 +13958 +3546 +13959 +14 +7991 +48 +43 +1082 +1920 +333 +2694 +155 +43 +48 +13960 +13961 +13962 +1232 +43 +14 +1632 +6877 +1109 +43 +12267 +13963 +13964 +10 +11754 +398 +416 +13965 +13966 +13967 +13968 +19 +13969 +43 +2414 +13970 +3382 +583 +43 +43 +209 +12180 +48 +13733 +8867 +13971 +741 +14 +13972 +188 +13973 +43 +915 +2577 +13974 +14 +13975 +43 +6741 +12913 +43 +13976 +237 +48 +112 +2 +3439 +13977 +13978 +5601 +2314 +13979 +10880 +3421 +2 +13980 +13981 +13982 +5344 +14 +10 +14 +188 +13983 +13984 +14 +305 +10 +11341 +15 +13985 +13986 +1790 +43 +13987 +2561 +677 +25 +2 +12987 +14 +13988 +13989 +1513 +2213 +9738 +3546 +13990 +9 +13991 +57 +13992 +11754 +6785 +11308 +2733 +104 +237 +12987 +2891 +958 +1229 +11754 +1208 +14 +112 +46 +259 +13993 +237 +13179 +48 +48 +554 +14 +48 +1765 +4364 +188 +48 +13994 +7336 +112 +152 +13995 +3 +1232 +13996 +13997 +3916 +237 +286 +14 +43 +741 +13998 +554 +11762 +6766 +5973 +43 +13999 +278 +14000 +66 +1696 +365 +14001 +152 +14002 +10 +9739 +14003 +14004 +43 +14005 +14006 +43 +3279 +19 +14007 +1612 +14008 +2 +14 +14009 +2446 +48 +57 +15 +352 +14010 +14011 +48 +13464 +286 +14 +48 +1817 +42 +14012 +2 +43 +19 +14013 +14014 +14015 +2 +2 +1224 +14016 +14 +14017 +14018 +2733 +48 +741 +5780 +1203 +48 +14019 +14020 +14021 +13935 +14 +237 +4411 +2 +32 +323 +14022 +2457 +3406 +3250 +112 +43 +48 +751 +14023 +13935 +14024 +3546 +19 +6950 +13336 +2012 +48 +14025 +13325 +188 +14026 +14 +1224 +11754 +14027 +3452 +152 +1560 +379 +736 +14028 +610 +4227 +14029 +14030 +286 +741 +48 +48 +14031 +14032 +48 +14033 +3989 +14034 +14035 +7799 +13179 +9 +14036 +14037 +14038 +14039 +14040 +14041 +53 +430 +14042 +8512 +14043 +345 +1870 +286 +14044 +707 +13929 +989 +12402 +19 +237 +14 +19 +2153 +554 +14045 +14046 +14047 +6463 +278 +14048 +14049 +57 +14 +272 +43 +1364 +286 +446 +14050 +14051 +3958 +14052 +5981 +14053 +14054 +43 +14055 +15 +554 +14056 +1637 +439 +11471 +2944 +14057 +14058 +36 +971 +237 +237 +14059 +14060 +14061 +6054 +14062 +14063 +43 +3546 +14064 +14065 +14066 +14067 +5780 +48 +19 +14068 +305 +3484 +15 +3546 +14069 +19 +10230 +14070 +14071 +1012 +138 +10230 +14072 +5780 +104 +1991 +20 +43 +764 +14073 +57 +14074 +14075 +14076 +648 +3546 +14077 +48 +7835 +48 +2042 +2058 +14078 +43 +137 +14079 +3 +48 +14080 +2197 +14081 +14 +16 +14082 +349 +14083 +14084 +14085 +14086 +14 +13452 +2 +6518 +5627 +43 +590 +14087 +2694 +48 +48 +9410 +554 +3310 +57 +910 +137 +9543 +48 +14088 +14089 +43 +486 +14090 +14091 +14092 +17 +14093 +741 +43 +8727 +6776 +286 +648 +14094 +764 +3546 +4398 +5780 +872 +3 +196 +14 +43 +1220 +43 +3239 +176 +14095 +14096 +745 +14097 +245 +14098 +43 +14099 +14100 +14101 +1232 +14102 +1559 +142 +14103 +2577 +14104 +140 +14105 +2314 +354 +14106 +43 +14107 +14108 +14 +237 +14109 +237 +13843 +323 +4855 +14110 +14111 +2804 +1112 +14112 +14113 +1203 +14114 +14 +1821 +305 +43 +237 +14115 +286 +10880 +1100 +2430 +14 +4971 +14116 +13772 +57 +237 +14117 +12404 +14 +14118 +397 +137 +1566 +19 +12893 +1056 +14119 +19 +317 +43 +237 +373 +48 +491 +2988 +14120 +14121 +77 +14122 +7357 +764 +14123 +887 +1374 +14124 +495 +209 +1800 +14125 +5192 +20 +3287 +14126 +179 +11754 +14127 +5041 +19 +14128 +48 +7855 +14129 +1232 +14130 +5556 +14131 +28 +286 +48 +14132 +13913 +43 +14133 +14134 +13349 +14 +19 +14135 +683 +14 +14136 +43 +989 +57 +14137 +272 +14138 +237 +237 +2804 +354 +194 +2 +14139 +14140 +13282 +4461 +194 +3543 +53 +48 +19 +3 +43 +14141 +14142 +14 +48 +9400 +13842 +32 +14143 +210 +14144 +14145 +416 +19 +48 +5780 +14146 +66 +14147 +14148 +14149 +4963 +14150 +237 +8733 +43 +13390 +14151 +11754 +14152 +1011 +768 +8460 +14 +1710 +14153 +736 +14154 +136 +48 +43 +142 +20 +3546 +14155 +1229 +48 +14156 +14157 +536 +2035 +6341 +38 +14158 +185 +14159 +43 +3052 +317 +317 +2197 +3 +43 +2577 +43 +14160 +14161 +14162 +12555 +43 +14163 +19 +4990 +48 +35 +14164 +14165 +43 +1181 +14166 +548 +14167 +720 +14168 +14169 +178 +4278 +14170 +14171 +20 +14172 +1166 +43 +19 +43 +14173 +43 +12067 +379 +25 +2769 +14174 +3546 +14175 +14176 +284 +14177 +98 +14178 +827 +2015 +554 +284 +48 +1300 +8566 +43 +14179 +5780 +14180 +225 +14181 +14182 +48 +48 +1425 +1376 +9 +32 +9410 +213 +14183 +14174 +14 +237 +349 +48 +272 +188 +14 +12477 +958 +14184 +14185 +647 +6480 +10 +14186 +554 +14187 +201 +48 +7045 +2 +14188 +176 +915 +14189 +14190 +138 +14191 +14192 +19 +43 +14193 +10622 +57 +9688 +14194 +14195 +1287 +48 +4028 +14196 +5435 +2791 +48 +4634 +764 +43 +48 +971 +14197 +14198 +14199 +12456 +14200 +14201 +7817 +43 +237 +14202 +14203 +14204 +590 +14205 +6950 +20 +3066 +4028 +13685 +11421 +20 +3279 +14206 +14207 +14208 +20 +237 +3546 +14209 +7137 +213 +303 +1124 +20 +2804 +14210 +14211 +284 +43 +237 +57 +14212 +14001 +358 +48 +14213 +12987 +14214 +14215 +137 +7014 +155 +2316 +89 +14216 +15 +14217 +5169 +48 +3239 +286 +8994 +5780 +14218 +43 +19 +1175 +1010 +6950 +43 +14219 +48 +5949 +225 +14220 +14221 +22 +32 +14222 +733 +237 +14223 +43 +14 +14224 +303 +2 +1090 +14225 +14226 +14227 +14228 +9705 +14229 +14230 +14231 +14232 +48 +33 +14233 +286 +14234 +1927 +712 +720 +14235 +9 +4 +14236 +4730 +286 +736 +14237 +43 +323 +14238 +19 +536 +1870 +705 +12746 +305 +14239 +19 +43 +14240 +14241 +4852 +357 +14242 +14243 +14244 +248 +478 +13543 +8566 +7855 +112 +32 +14245 +2 +43 +14246 +14247 +14248 +14249 +286 +14 +647 +12937 +7256 +14250 +14251 +14252 +14253 +14254 +9 +14001 +13150 +14255 +6214 +14256 +14257 +272 +7855 +14258 +14259 +2841 +48 +4963 +14 +286 +43 +14260 +14261 +22 +14262 +536 +14263 +14264 +284 +14265 +248 +14266 +48 +337 +14267 +248 +3 +14268 +14 +248 +4263 +14269 +14270 +2600 +4053 +14271 +14272 +43 +14273 +19 +43 +201 +14 +14274 +16 +741 +14275 +14276 +14277 +1049 +2121 +1765 +2406 +2561 +337 +248 +43 +699 +342 +14278 +14279 +1710 +5582 +14 +14280 +14281 +32 +9918 +1224 +48 +8297 +14282 +48 +4570 +2316 +14283 +826 +4075 +57 +14284 +2 +14285 +14286 +14287 +1765 +14 +1604 +248 +48 +14288 +43 +48 +1425 +48 +14289 +14290 +1200 +1172 +14291 +822 +14292 +12402 +14293 +14 +19 +5243 +1992 +43 +286 +14294 +14295 +873 +14296 +48 +14297 +14 +1559 +14298 +2040 +14299 +14300 +14301 +6087 +2 +43 +14302 +14303 +43 +323 +14304 +1013 +152 +721 +14305 +10583 +5209 +425 +14306 +2349 +286 +237 +14307 +14 +14308 +14309 +14310 +14311 +14312 +14313 +14314 +57 +14315 +237 +48 +14316 +647 +8033 +14317 +1364 +14318 +736 +4226 +398 +14 +14319 +14320 +14321 +43 +165 +14322 +14323 +48 +408 +745 +915 +810 +14324 +155 +48 +43 +14325 +764 +14326 +72 +43 +9472 +48 +176 +14327 +14328 +14329 +590 +271 +43 +14330 +14331 +741 +5344 +12466 +3 +14332 +14333 +3546 +1655 +741 +14334 +14335 +2804 +19 +554 +155 +14 +14336 +1513 +14337 +14338 +20 +3546 +822 +43 +43 +64 +14339 +286 +6121 +5080 +14340 +775 +14 +4306 +14341 +2804 +14342 +8566 +14343 +3546 +3 +155 +10 +1385 +424 +14344 +14345 +14346 +720 +8428 +43 +14347 +14348 +14349 +2 +14350 +14351 +1013 +2314 +19 +12363 +43 +4637 +14 +1454 +14 +14352 +13748 +304 +14353 +29 +14354 +14355 +8554 +1228 +237 +43 +8188 +14356 +6363 +10 +14357 +764 +14 +123 +14358 +32 +4278 +9 +14359 +1415 +14360 +48 +15 +936 +14361 +14362 +14363 +14364 +14365 +741 +14366 +14367 +554 +3546 +14368 +6766 +15 +14369 +14370 +237 +14 +14371 +237 +248 +248 +14372 +19 +22 +14373 +32 +7522 +14374 +19 +14375 +4441 +9 +248 +14376 +14377 +303 +12343 +2804 +712 +11176 +43 +616 +3147 +14378 +3055 +14379 +155 +14380 +19 +19 +284 +9939 +823 +14381 +138 +14382 +19 +3743 +713 +14383 +14384 +14385 +3005 +14386 +43 +12013 +14387 +286 +1234 +14388 +140 +43 +155 +43 +305 +14389 +1203 +3546 +14390 +5770 +10 +554 +3886 +14391 +43 +14392 +14393 +19 +14394 +32 +14395 +11822 +1454 +741 +104 +5627 +8010 +14396 +14397 +14398 +2469 +14399 +3732 +14400 +14401 +14 +2324 +14402 +14403 +13823 +43 +14404 +14 +14405 +4192 +14406 +14407 +6728 +48 +14408 +14409 +3488 +14410 +720 +14411 +14412 +4388 +43 +14413 +57 +19 +48 +1696 +2308 +14414 +1343 +1524 +14415 +14416 +590 +14417 +89 +14418 +32 +647 +14419 +14420 +14421 +155 +590 +43 +9 +2847 +14422 +1465 +11966 +741 +14423 +14424 +770 +14425 +831 +4790 +14426 +14427 +474 +741 +282 +3546 +14428 +14 +14429 +14430 +1817 +5780 +14431 +14432 +1100 +5483 +48 +43 +14433 +1961 +5648 +2045 +14434 +14435 +14436 +48 +14437 +184 +43 +14 +13307 +48 +43 +14438 +11483 +14439 +14440 +14441 +140 +14442 +14443 +14444 +32 +14445 +286 +14446 +1540 +2463 +14447 +4020 +14448 +14449 +3711 +2 +196 +3546 +14450 +7176 +590 +14451 +14452 +1559 +14 +185 +137 +48 +764 +14453 +14454 +12404 +188 +48 +14455 +14456 +12746 +14457 +48 +14458 +1234 +57 +48 +14459 +337 +14460 +19 +14461 +14 +14462 +48 +3 +6970 +4765 +14463 +43 +14464 +590 +3976 +293 +104 +48 +14465 +4247 +14363 +43 +32 +57 +14466 +43 +286 +379 +590 +43 +14467 +57 +3216 +14 +12987 +14468 +14469 +19 +43 +12093 +43 +32 +60 +14470 +14471 +14472 +13798 +14473 +14 +7835 +14474 +13961 +13361 +286 +43 +3296 +2097 +19 +6294 +1258 +14475 +3757 +43 +4 +48 +1471 +14476 +647 +43 +590 +1051 +112 +1018 +14477 +14478 +14479 +5408 +237 +590 +36 +14480 +6595 +2944 +323 +43 +201 +3030 +19 +272 +14481 +188 +14482 +13566 +14483 +14484 +14485 +11762 +14486 +12479 +19 +712 +14487 +2561 +4917 +14488 +188 +48 +14489 +2561 +1559 +286 +14490 +357 +98 +9481 +436 +2561 +1425 +43 +1425 +32 +7283 +14491 +14477 +48 +6331 +14492 +155 +1710 +14493 +573 +764 +14494 +5483 +705 +14495 +14496 +14497 +554 +590 +57 +14 +57 +3543 +14 +48 +14498 +14499 +155 +397 +14500 +14501 +43 +11966 +14502 +5963 +2 +14503 +14 +14504 +14505 +3768 +43 +14506 +11762 +493 +14507 +14508 +3353 +3976 +2835 +11817 +43 +859 +10764 +2042 +14 +57 +1049 +12987 +12351 +3239 +48 +14509 +736 +196 +554 +1385 +14510 +14511 +712 +7183 +20 +14512 +8994 +14513 +2064 +14514 +14515 +1823 +43 +5739 +1617 +14278 +14363 +19 +14516 +19 +1859 +14517 +14518 +14519 +614 +29 +14520 +14521 +665 +1829 +810 +14522 +48 +14523 +14524 +14525 +43 +14526 +14527 +38 +845 +2 +14528 +286 +57 +14529 +428 +14530 +1154 +9112 +4808 +14531 +4028 +14532 +536 +43 +43 +8205 +349 +14533 +14534 +19 +112 +14535 +1051 +13508 +3808 +10 +1013 +14536 +1637 +1109 +43 +14537 +14538 +2039 +43 +590 +43 +14539 +3546 +14540 +14541 +6011 +14 +1011 +43 +14 +11740 +349 +14542 +590 +14543 +33 +20 +484 +48 +2459 +5318 +14544 +14 +1021 +872 +14545 +14546 +1710 +14547 +707 +14548 +112 +286 +48 +14549 +8263 +1051 +3 +48 +10137 +43 +12013 +1901 +13361 +14550 +152 +554 +5780 +48 +770 +14551 +14552 +48 +14553 +2064 +14554 +2882 +14555 +14556 +14557 +14558 +14559 +14560 +2550 +14561 +14562 +745 +10789 +358 +7471 +8297 +3034 +43 +446 +322 +14563 +32 +958 +14564 +4918 +4364 +178 +14565 +14566 +493 +590 +14567 +14568 +741 +349 +14569 +48 +13361 +14570 +14571 +8566 +915 +14572 +590 +1291 +1154 +14573 +43 +14574 +14575 +43 +14363 +14576 +48 +14577 +590 +155 +14 +6439 +104 +14578 +5080 +14579 +590 +872 +7855 +140 +14580 +14 +412 +14581 +9 +11762 +19 +6468 +48 +2 +14582 +1425 +48 +14583 +2463 +142 +14584 +7276 +323 +14585 +3546 +12987 +14586 +14587 +590 +14588 +14589 +14590 +14591 +14592 +14593 +3546 +352 +14 +14594 +5780 +76 +14595 +14 +14596 +14597 +20 +590 +14598 +155 +3252 +14599 +14600 +14515 +12987 +24 +14601 +8249 +14602 +43 +14603 +286 +12214 +915 +14604 +137 +3 +590 +14605 +8392 +43 +14606 +14607 +43 +14 +14 +14608 +14609 +14610 +14611 +43 +14612 +43 +14613 +3317 +188 +48 +11483 +6950 +14 +12987 +19 +14614 +14615 +647 +14616 +665 +1369 +692 +57 +19 +14617 +14618 +365 +9783 +14619 +14620 +14621 +14622 +14623 +590 +14624 +590 +3546 +14625 +188 +14626 +5162 +14627 +5601 +286 +849 +10993 +493 +14628 +14629 +2129 +286 +357 +12274 +14630 +14631 +14632 +9115 +590 +286 +1765 +1220 +8188 +48 +14633 +286 +43 +2040 +14634 +14 +14635 +43 +237 +11822 +14636 +140 +8218 +8457 +8297 +20 +8392 +43 +14637 +14638 +354 +7379 +14639 +20 +14640 +590 +1503 +14641 +379 +14642 +14643 +43 +155 +464 +286 +14644 +14645 +14646 +155 +764 +358 +20 +14647 +155 +237 +354 +14648 +10 +2035 +43 +57 +1605 +48 +14649 +741 +1217 +2 +14650 +19 +14651 +8740 +8896 +14652 +10 +14653 +14274 +14654 +2804 +13223 +14655 +14656 +2446 +12577 +590 +14657 +286 +43 +736 +14658 +14659 +43 +272 +964 +14660 +14661 +927 +5601 +3599 +14662 +46 +155 +14663 +14 +541 +554 +1716 +48 +7137 +43 +12661 +43 +1232 +3546 +741 +14664 +29 +48 +736 +590 +43 +338 +9900 +354 +14665 +14185 +12987 +14666 +2 +14667 +720 +8566 +2577 +14668 +5780 +9 +6499 +1765 +10 +590 +57 +249 +43 +14669 +155 +57 +1604 +14670 +14671 +14672 +14673 +14674 +14675 +14676 +1100 +3421 +14677 +741 +6439 +2828 +1617 +14678 +14679 +29 +7855 +12684 +12600 +43 +20 +4713 +19 +2577 +2577 +14680 +188 +14681 +14682 +19 +43 +3546 +14683 +354 +590 +9300 +2042 +788 +14684 +43 +19 +14685 +19 +323 +2476 +14686 +14687 +7341 +188 +284 +14363 +14688 +7653 +2430 +14689 +14690 +1637 +14 +85 +9210 +43 +14691 +14692 +48 +301 +14693 +14694 +11995 +4747 +12987 +14695 +140 +51 +66 +43 +10 +14696 +586 +2 +14 +284 +4963 +57 +20 +305 +303 +286 +703 +955 +1214 +14697 +10993 +48 +14698 +57 +43 +14699 +2324 +14604 +1082 +14700 +9 +43 +14701 +1056 +4873 +1612 +14702 +14703 +14704 +6809 +11428 +14705 +43 +14706 +2540 +48 +3553 +8297 +6903 +171 +48 +48 +14 +43 +43 +14001 +1066 +9078 +14707 +14708 +936 +137 +745 +7855 +14709 +14604 +14710 +14711 +590 +590 +3034 +14712 +13774 +590 +57 +19 +2042 +14713 +32 +590 +1232 +9278 +48 +13205 +647 +43 +1139 +12600 +11224 +48 +14714 +2197 +3 +43 +43 +590 +14715 +1220 +14716 +14717 +14718 +14719 +253 +19 +3546 +14720 +14721 +1696 +57 +48 +720 +554 +57 +14 +586 +14532 +2721 +14 +152 +14722 +5780 +14723 +14724 +48 +14725 +259 +14 +14691 +625 +770 +745 +3491 +4963 +43 +305 +2260 +6499 +8024 +14726 +764 +43 +5780 +43 +14727 +1229 +43 +14728 +2 +249 +14729 +14477 +2349 +14730 +1716 +1513 +590 +32 +3 +764 +1224 +14731 +671 +14477 +14732 +14 +2804 +237 +14733 +4227 +48 +251 +33 +155 +741 +14734 +14735 +590 +6011 +14736 +14737 +43 +554 +590 +14738 +14739 +14740 +14741 +14 +14742 +6741 +14743 +379 +14744 +57 +14745 +43 +14746 +14747 +14748 +373 +14749 +14750 +43 +736 +14751 +14752 +140 +741 +43 +3553 +7032 +14753 +1442 +14754 +9 +284 +6096 +10 +14755 +7897 +14756 +14757 +14758 +14759 +14760 +590 +1885 +484 +3553 +1049 +764 +9194 +14761 +14762 +4028 +1154 +533 +2287 +14763 +415 +19 +14764 +14765 +14766 +741 +9946 +13387 +43 +14767 +2577 +5134 +1051 +48 +8685 +590 +1425 +590 +2315 +14768 +1883 +14769 +2944 +720 +2859 +197 +272 +14770 +14771 +14 +14772 +590 +8188 +284 +379 +713 +14773 +590 +1415 +104 +14774 +209 +10 +9440 +303 +14775 +14695 +43 +14776 +2136 +14777 +14 +14778 +14779 +14780 +14477 +14781 +14782 +152 +43 +13375 +14494 +43 +188 +14 +14783 +9913 +14784 +14785 +20 +1232 +14786 +43 +48 +6106 +14787 +1115 +14788 +14789 +2 +2035 +14790 +14791 +741 +14363 +3543 +14792 +6766 +3764 +14793 +14794 +1716 +1181 +3553 +13223 +14795 +554 +43 +43 +14796 +484 +3484 +14797 +14798 +14799 +14800 +3 +2269 +14801 +1753 +1154 +14802 +14803 +14804 +138 +4518 +43 +14805 +14806 +1465 +536 +1013 +647 +14807 +14808 +14809 +14810 +14811 +14812 +14813 +1798 +14814 +10120 +590 +14815 +14816 +57 +14 +14817 +59 +14818 +14819 +12614 +1082 +358 +43 +9 +14820 +11696 +14821 +11754 +573 +8789 +5931 +3546 +14822 +14823 +11593 +14824 +2724 +42 +14825 +14826 +14827 +14828 +14829 +8297 +14830 +6341 +823 +14831 +43 +3251 +736 +14 +14015 +14832 +1107 +14833 +736 +1198 +14834 +14835 +14836 +14 +98 +19 +43 +57 +14837 +14838 +2 +1115 +14839 +14840 +48 +14841 +43 +155 +14842 +14843 +3844 +590 +14844 +43 +196 +14845 +14846 +19 +14847 +14848 +14849 +6917 +4532 +8217 +8116 +57 +14850 +305 +14851 +2593 +1051 +1547 +35 +14852 +14853 +352 +554 +2790 +152 +3842 +14854 +43 +14855 +778 +5601 +14856 +4088 +2164 +8566 +14857 +741 +13361 +11963 +590 +14858 +14859 +14860 +14861 +48 +11522 +32 +48 +32 +1817 +404 +80 +14862 +1824 +10 +43 +20 +6915 +590 +14863 +14864 +12404 +14415 +14865 +48 +10 +43 +14866 +736 +14867 +14868 +14869 +48 +14870 +14871 +14872 +554 +32 +1056 +43 +14873 +14874 +48 +2 +14875 +14876 +14877 +590 +1124 +14878 +14879 +14880 +12120 +14881 +14882 +1514 +43 +8610 +14883 +590 +14884 +3546 +1112 +14885 +12093 +43 +14886 +2859 +2764 +14000 +48 +590 +9922 +484 +43 +286 +915 +43 +1882 +4153 +14066 +14887 +155 +14888 +14 +590 +14889 +20 +48 +14890 +2733 +2243 +14891 +12987 +14892 +1369 +48 +590 +14893 +14894 +12005 +43 +14895 +43 +14896 +14897 +14 +14898 +14899 +1018 +590 +399 +14900 +237 +43 +590 +827 +14901 +14902 +14903 +14904 +14905 +14906 +14668 +201 +3 +10028 +3476 +14907 +397 +14908 +20 +10 +14477 +14909 +1261 +155 +14910 +48 +137 +14911 +14912 +14913 +14477 +10156 +2314 +43 +14914 +14 +464 +48 +14915 +185 +14916 +2865 +554 +14917 +11762 +43 +14918 +43 +14919 +286 +1232 +14 +155 +14920 +14921 +14922 +14923 +3 +142 +14924 +43 +14925 +10 +286 +14926 +14927 +48 +14928 +342 +9 +19 +14929 +14930 +2 +12246 +14931 +14932 +14933 +43 +14934 +7176 +2 +14935 +14936 +3546 +14 +2 +1732 +48 +14937 +32 +14938 +14939 +14940 +2804 +48 +19 +43 +3908 +14941 +14942 +14604 +14943 +14 +11822 +402 +5659 +554 +1228 +14944 +590 +11754 +7014 +8024 +7137 +122 +14945 +14946 +5650 +48 +11754 +14947 +48 +201 +869 +48 +10590 +43 +14948 +590 +48 +13985 +1920 +1891 +14949 +12055 +3546 +48 +14950 +14951 +43 +14952 +14953 +936 +14954 +4396 +15 +2308 +14955 +14956 +43 +590 +155 +14185 +43 +43 +590 +13349 +14957 +7509 +14958 +14959 +14960 +3546 +57 +14961 +1817 +892 +43 +14962 +14963 +14964 +19 +5080 +48 +11754 +43 +14634 +138 +14965 +14966 +14967 +14968 +736 +14969 +14970 +2764 +286 +14 +14971 +9 +2561 +1465 +14972 +12600 +14973 +14974 +286 +210 +142 +14975 +14976 +1226 +32 +1249 +3494 +14977 +1920 +590 +43 +14978 +554 +2463 +152 +20 +43 +32 +43 +11754 +590 +14979 +43 +14980 +32 +12600 +2577 +14981 +14982 +14983 +15 +14984 +590 +745 +1688 +14 +43 +2561 +2790 +14985 +43 +155 +3546 +3842 +3546 +14 +39 +14986 +43 +2029 +3949 +915 +590 +14987 +590 +286 +14988 +13361 +764 +1604 +43 +57 +14989 +104 +13570 +14332 +43 +1905 +14990 +10583 +4 +237 +849 +14991 +2 +14992 +4764 +872 +14993 +14994 +14995 +14996 +590 +1612 +19 +43 +14997 +112 +11762 +14998 +43 +590 +14999 +15000 +590 +2135 +9 +3546 +484 +10 +43 +590 +2035 +590 +15001 +15002 +155 +15003 +590 +590 +15004 +19 +43 +4028 +15005 +1804 +15006 +2125 +2047 +14 +15007 +15008 +10 +15009 +736 +48 +15010 +15011 +15012 +8512 +185 +32 +15013 +185 +13566 +43 +15014 +1513 +1229 +15015 +43 +15016 +14 +12987 +2 +3 +15017 +2804 +13576 +15018 +1716 +14 +15019 +15020 +12987 +15021 +2 +14001 +8098 +15022 +15023 +15024 +15025 +4760 +1364 +15026 +43 +2 +15027 +1578 +185 +323 +1244 +590 +15028 +43 +201 +590 +10356 +15029 +1232 +32 +7137 +213 +213 +15030 +15031 +6439 +15032 +14629 +15 +19 +15033 +305 +3546 +3743 +14 +15034 +32 +15035 +1244 +15036 +213 +3546 +1508 +15037 +2804 +286 +10147 +8896 +2 +48 +1112 +15038 +590 +590 +15039 +22 +337 +590 +764 +15040 +15041 +15042 +32 +140 +3 +590 +188 +15043 +9 +15044 +19 +15045 +597 +15046 +43 +4278 +2 +286 +43 +590 +741 +48 +20 +2 +15047 +43 +14327 +201 +3732 +112 +590 +48 +14477 +43 +14477 +15048 +14477 +15049 +1807 +43 +8188 +554 +15050 +15051 +13566 +354 +8220 +590 +1049 +3546 +15052 +590 +12605 +2064 +2 +11754 +2804 +43 +15053 +3546 +15054 +15055 +849 +12622 +590 +15056 +43 +43 +1889 +43 +590 +15057 +43 +14 +3546 +736 +6776 +43 +15058 +303 +15059 +764 +15060 +19 +1223 +491 +14 +15061 +1051 +720 +10222 +248 +48 +823 +5080 +286 +373 +764 +98 +590 +15062 +15063 +15064 +43 +15065 +14105 +35 +4760 +1578 +15066 +15067 +1745 +43 +6121 +43 +15068 +14973 +337 +32 +15069 +2 +15070 +197 +4487 +15071 +6950 +7291 +15072 +9705 +15073 +15074 +12600 +3546 +823 +500 +66 +43 +15075 +32 +15076 +15077 +13325 +3546 +1107 +15078 +4650 +15079 +15080 +15081 +13393 +15082 +15083 +43 +323 +15084 +15085 +48 +665 +1961 +1612 +13598 +15086 +15087 +6582 +15088 +13390 +32 +48 +15089 +1765 +17 +2314 +15090 +15091 +15092 +22 +137 +464 +590 +15093 +15094 +15095 +5041 +15096 +2 +15097 +2 +15098 +15099 +2 +43 +15100 +15101 +12862 +14 +647 +3543 +15102 +3553 +104 +2561 +29 +19 +15103 +12987 +3732 +15104 +57 +720 +15105 +15106 +43 +15107 +1524 +15108 +66 +1051 +15109 +104 +15110 +337 +616 +1716 +2314 +1920 +349 +15111 +9 +6950 +15112 +3546 +809 +22 +15113 +32 +15114 +15115 +15116 +15117 +98 +15118 +15119 +15120 +504 +15121 +15122 +15123 +14846 +15124 +14485 +736 +14610 +3546 +155 +155 +15125 +764 +15126 +43 +14 +15127 +597 +15128 +740 +15129 +15130 +14477 +1051 +15131 +5582 +705 +15 +15132 +57 +791 +10 +48 +213 +1051 +15133 +11321 +3470 +590 +2243 +15134 +1768 +11593 +8297 +8762 +14819 +15135 +349 +915 +15136 +1465 +15137 +15138 +176 +1377 +15139 +272 +3546 +590 +15140 +57 +3421 +15141 +15142 +6263 +48 +15143 +15144 +845 +15145 +48 +15146 +48 +15147 +14448 +15148 +2 +713 +6305 +9664 +15149 +590 +48 +4760 +15150 +15151 +745 +3626 +48 +12987 +590 +15152 +15153 +286 +48 +590 +57 +15154 +15155 +14 +665 +15156 +43 +2537 +3421 +284 +4518 +15157 +1870 +590 +15158 +764 +15159 +15160 +15161 +1604 +15162 +15163 +9766 +15164 +1208 +590 +20 +284 +2026 +14477 +286 +48 +12987 +43 +66 +15165 +14 +1617 +155 +2 +20 +647 +43 +15166 +15167 +411 +3546 +4116 +15168 +15169 +231 +48 +14571 +77 +48 +647 +15170 +12005 +15171 +1559 +19 +720 +15172 +19 +15173 +1578 +2042 +43 +590 +15174 +15175 +43 +1604 +707 +15176 +491 +14 +3 +15177 +15178 +15179 +20 +35 +790 +201 +14668 +464 +2728 +14185 +20 +15180 +1013 +6504 +15181 +647 +104 +4028 +2 +2 +1437 +14 +15182 +349 +48 +15183 +20 +15184 +178 +15185 +15186 +213 +12013 +5627 +57 +2882 +196 +6011 +222 +19 +15187 +15188 +9617 +15189 +5271 +590 +2064 +15190 +2260 +15191 +43 +155 +15192 +48 +493 +13387 +15193 +1712 +43 +15194 +14343 +43 +15195 +3594 +155 +48 +43 +15196 +2790 +15197 +57 +15198 +15199 +15200 +19 +15201 +15202 +15203 +14 +15204 +43 +15205 +15206 +259 +15207 +80 +98 +411 +15208 +15 +43 +705 +415 +22 +14509 +15209 +14 +15210 +2 +11754 +15211 +5780 +30 +48 +2975 +43 +1961 +861 +11754 +15212 +15213 +48 +2 +1578 +349 +823 +873 +19 +15214 +155 +141 +15215 +48 +43 +349 +15063 +19 +15216 +48 +1716 +2561 +15217 +15218 +1262 +741 +14 +15219 +15220 +1465 +8338 +245 +8230 +8392 +15221 +14 +15222 +11537 +66 +3317 +2239 +1765 +11482 +15223 +15224 +10659 +15225 +286 +15226 +15227 +15228 +43 +32 +14 +1091 +272 +15229 +43 +14219 +209 +43 +15230 +57 +48 +14603 +35 +15231 +15232 +541 +196 +1696 +15018 +48 +141 +286 +272 +155 +15233 +15234 +15235 +5614 +15236 +43 +32 +15237 +286 +5344 +201 +43 +15238 +369 +15239 +15240 +112 +15241 +15242 +15243 +15244 +15 +5271 +15245 +1696 +15246 +5627 +15247 +43 +15248 +3080 +274 +15249 +1870 +15250 +3553 +48 +720 +365 +15251 +155 +15252 +15253 +43 +10946 +3470 +15254 +15255 +48 +14957 +493 +1280 +15256 +9 +554 +7855 +48 +15257 +15258 +2 +15259 +169 +15260 +15261 +15262 +14 +15263 +397 +32 +15264 +15265 +13929 +57 +590 +15266 +1425 +15267 +43 +15268 +554 +15269 +590 +15270 +15271 +349 +43 +736 +155 +10 +9543 +15272 +1508 +15273 +590 +958 +15274 +15275 +3684 +15276 +741 +2790 +7855 +590 +3546 +43 +141 +342 +15277 +15278 +15279 +1508 +15280 +1612 +15 +48 +43 +3 +15281 +15282 +19 +15283 +15 +1013 +19 +15284 +14 +2064 +648 +43 +14603 +1942 +3732 +14 +25 +15285 +15286 +15287 +8357 +317 +1817 +736 +694 +15 +15288 +15289 +8297 +14770 +15290 +10574 +32 +15291 +722 +43 +5614 +15292 +6950 +590 +3546 +48 +305 +1013 +1011 +15293 +9 +60 +43 +15294 +15295 +15 +48 +9460 +15296 +9454 +3252 +14 +2446 +7855 +1612 +8188 +15297 +286 +764 +14 +57 +8188 +478 +3330 +823 +15298 +14888 +7977 +15299 +15300 +15301 +14604 +15302 +43 +15303 +3480 +48 +2804 +48 +15304 +13364 +43 +736 +19 +3915 +2042 +15305 +10933 +13961 +15306 +57 +15307 +484 +590 +286 +4028 +15308 +1870 +11428 +15309 +15220 +791 +2135 +12987 +48 +19 +43 +15310 +7356 +15311 +15312 +15313 +48 +15314 +29 +15315 +15316 +10 +590 +1091 +1027 +15317 +590 +12819 +15318 +15319 +15320 +4411 +15321 +12987 +9739 +8103 +19 +104 +554 +140 +590 +590 +15322 +1214 +15323 +720 +15324 +286 +590 +15325 +3546 +764 +15326 +15327 +5780 +19 +8566 +286 +741 +4406 +32 +1559 +48 +22 +14 +15328 +57 +210 +14 +15329 +590 +13248 +80 +647 +9472 +5683 +15330 +2410 +1051 +493 +104 +15331 +15332 +665 +155 +43 +36 +43 +15333 +1021 +15334 +43 +3546 +15335 +1655 +9 +89 +15336 +13913 +15337 +15338 +10 +590 +5780 +665 +11482 +48 +43 +590 +6624 +1765 +43 +14 +342 +14573 +1465 +15 +57 +14 +15339 +15340 +15341 +349 +15342 +11762 +15343 +286 +15344 +736 +2919 +20 +15345 +15346 +15347 +15348 +2804 +6915 +5764 +15349 +15350 +15351 +590 +32 +43 +15352 +15353 +43 +4088 +416 +1013 +15354 +590 +209 +2 +2499 +2430 +15355 +590 +528 +15 +15356 +48 +14957 +12987 +2804 +15357 +15358 +5780 +15359 +15360 +1234 +138 +15361 +15362 +495 +15363 +15364 +48 +2832 +15365 +15366 +3544 +15367 +14 +20 +3669 +48 +12987 +15368 +12402 +736 +2 +14001 +1116 +8297 +155 +887 +741 +9245 +4979 +104 +4278 +19 +1543 +112 +5561 +349 +9160 +272 +15369 +2 +15370 +10 +5415 +43 +19 +323 +4487 +8320 +15371 +12987 +48 +2865 +548 +15372 +15373 +138 +43 +15374 +590 +19 +554 +446 +155 +14 +14204 +1961 +2058 +15375 +15376 +1012 +14825 +43 +137 +19 +43 +24 +57 +15377 +43 +15378 +1648 +43 +9913 +15220 +12479 +15379 +6439 +301 +15380 +15381 +19 +286 +35 +15382 +9163 +6480 +15383 +5780 +15384 +15385 +1157 +286 +32 +5253 +4028 +2577 +9543 +3291 +373 +402 +15386 +736 +15387 +15388 +19 +15389 +278 +10356 +43 +1513 +15390 +1529 +15391 +14477 +3251 +15392 +48 +15393 +15394 +8566 +15395 +1991 +15396 +823 +15397 +48 +15398 +48 +2561 +15399 +19 +25 +164 +48 +48 +15400 +15401 +14 +14001 +112 +15402 +15403 +249 +15404 +1612 +2015 +4028 +43 +19 +43 +14 +57 +192 +373 +590 +15405 +57 +590 +15406 +3 +15407 +1326 +3559 +1376 +11822 +15408 +15409 +15410 +2550 +6671 +1011 +1091 +3105 +15411 +15412 +1153 +665 +15413 +15414 +19 +15415 +10230 +823 +15416 +15417 +892 +43 +15418 +14363 +15419 +15420 +15421 +15422 +3489 +48 +15423 +349 +1013 +2202 +7855 +7032 +15424 +12330 +15425 +12402 +48 +43 +15426 +1415 +1048 +19 +358 +57 +15427 +155 +2 +2314 +14477 +3546 +590 +1021 +104 +15428 +648 +764 +7215 +590 +15429 +2 +43 +4752 +354 +155 +19 +43 +43 +7154 +15430 +16 +764 +15431 +2769 +15432 +770 +13150 +48 +2 +590 +15433 +1606 +5963 +6874 +1870 +15434 +14 +80 +14 +15435 +138 +15436 +15437 +2476 +43 +590 +9 +15438 +15439 +736 +1870 +2 +15440 +1503 +15441 +48 +14 +48 +48 +15442 +12987 +3061 +2314 +3 +3417 +19 +1513 +1051 +15443 +590 +140 +6928 +1458 +554 +15444 +5204 +1091 +48 +15445 +14066 +590 +152 +15446 +493 +15447 +15448 +736 +6275 +14 +15449 +15450 +1310 +15451 +14477 +15452 +2764 +15453 +352 +5780 +8967 +1310 +15454 +15455 +872 +15456 +14604 +13045 +15457 +6965 +15458 +4821 +14816 +1013 +6776 +43 +43 +13566 +10 +4396 +48 +1716 +15459 +19 +201 +48 +15460 +15461 +10791 +19 +3842 +8205 +57 +15462 +15463 +5327 +377 +188 +15464 +15465 +15466 +48 +4897 +15467 +15468 +15469 +1364 +15470 +15471 +2056 +2029 +286 +6950 +15472 +15473 +2029 +48 +1425 +43 +43 +13424 +286 +32 +57 +590 +13904 +15474 +15475 +1013 +590 +10123 +8255 +9598 +12832 +873 +8244 +43 +5908 +15476 +736 +272 +9910 +15477 +237 +7855 +20 +15 +2197 +15478 +349 +1637 +8428 +6400 +43 +15479 +10306 +15480 +337 +1655 +14473 +248 +378 +14001 +104 +14 +237 +3066 +48 +1051 +201 +19 +15481 +48 +15482 +10 +15 +15483 +349 +590 +887 +2064 +98 +99 +14604 +15484 +15485 +15486 +15487 +8891 +15488 +337 +2769 +1232 +3 +15489 +15490 +43 +15491 +4056 +286 +286 +286 +15492 +286 +349 +379 +6145 +142 +514 +15493 +48 +104 +14477 +764 +14 +15494 +1021 +590 +13208 +10246 +15495 +15496 +14957 +14327 +2213 +492 +209 +15497 +48 +5833 +15498 +19 +15499 +43 +248 +14477 +15500 +43 +15501 +43 +15502 +15503 +1605 +741 +11762 +12987 +15504 +14477 +1612 +1566 +590 +2 +12936 +80 +15505 +1716 +15506 +15507 +137 +15508 +272 +15509 +686 +15510 +43 +286 +14647 +19 +15511 +741 +48 +15512 +15513 +3546 +14 +6817 +3906 +6054 +1765 +3119 +15514 +43 +15515 +15217 +29 +15516 +736 +3491 +12987 +1011 +3546 +10673 +43 +15517 +10 +736 +112 +15518 +8566 +14 +15519 +15520 +1889 +15521 +2457 +554 +201 +736 +43 +741 +1047 +1768 +15522 +66 +15523 +303 +43 +15524 +15525 +112 +286 +1612 +887 +15526 +15527 +15528 +669 +892 +48 +1912 +590 +15529 +66 +15530 +15531 +15532 +14 +2 +19 +188 +15533 +9 +15534 +15535 +104 +15536 +10723 +5780 +15537 +15538 +590 +1229 +43 +32 +48 +48 +213 +15539 +3 +5083 +590 +736 +15540 +323 +43 +15 +590 +15541 +736 +8269 +66 +15542 +2 +43 +12094 +15543 +15544 +15545 +8351 +872 +15546 +185 +15547 +15548 +4218 +15549 +4907 +15550 +554 +14 +590 +15551 +1011 +861 +5197 +14 +4752 +15552 +15553 +15554 +15555 +11369 +5496 +15556 +3034 +337 +528 +15557 +345 +272 +15558 +14 +155 +15559 +4747 +15560 +112 +14 +57 +13364 +590 +48 +357 +8566 +590 +14604 +2356 +1710 +15406 +15561 +4684 +1696 +1232 +15562 +15563 +15564 +11762 +2 +590 +15565 +14 +590 +14 +12987 +19 +14 +13781 +15566 +48 +112 +15567 +48 +736 +15568 +15569 +15570 +15571 +1465 +15572 +15573 +1508 +15574 +590 +14 +15575 +621 +14477 +248 +566 +15 +4414 +1243 +8053 +2260 +1992 +15576 +43 +15577 +48 +48 +736 +278 +14603 +647 +5162 +2356 +15578 +15579 +43 +2 +1154 +15580 +15581 +323 +98 +15582 +208 +15583 +11762 +7154 +15584 +1011 +48 +15585 +15586 +43 +32 +15384 +1423 +15587 +2463 +284 +1013 +15588 +13150 +15589 +8896 +736 +741 +2769 +15590 +10 +15591 +48 +440 +15592 +2281 +14 +14 +48 +48 +15593 +48 +2006 +15594 +14576 +286 +590 +590 +5304 +590 +15595 +10147 +2356 +15596 +15597 +46 +15598 +15599 +15600 +15601 +11176 +10 +1181 +15602 +5074 +590 +15603 +15604 +5089 +378 +2764 +13566 +15605 +15606 +14 +43 +14 +10 +6499 +14239 +46 +15607 +4963 +19 +647 +3543 +2 +15608 +14 +36 +2790 +15609 +3546 +13802 +15610 +3546 +15611 +48 +33 +15612 +19 +15613 +533 +5803 +15614 +48 +15615 +15616 +8460 +464 +13913 +43 +15617 +8297 +15618 +677 +14363 +15619 +155 +43 +448 +99 +1612 +14947 +2064 +12267 +15620 +176 +13361 +15621 +14816 +15622 +3 +15623 +15624 +15625 +43 +14 +3251 +15626 +15627 +15628 +15629 +15630 +43 +15631 +845 +1217 +15632 +43 +43 +15633 +1885 +15634 +15635 +590 +15636 +29 +43 +15637 +15638 +15639 +590 +7544 +15640 +43 +43 +43 +188 +741 +32 +3546 +2318 +43 +15641 +4302 +43 +699 +57 +10993 +6513 +590 +14416 +43 +3381 +4463 +14 +15642 +15643 +349 +15644 +514 +2330 +15645 +3598 +15646 +43 +15647 +15648 +15649 +14 +272 +10318 +15446 +379 +112 +15650 +104 +15651 +721 +8249 +2561 +590 +14 +3546 +48 +3546 +15652 +43 +15653 +15654 +13038 +1612 +590 +15655 +14896 +112 +554 +10016 +590 +20 +1049 +15656 +32 +12005 +299 +15657 +48 +155 +15658 +15659 +15660 +15661 +43 +11085 +9560 +11754 +15662 +3406 +15663 +464 +15664 +14 +764 +57 +15665 +48 +15666 +15667 +14185 +15668 +2561 +15669 +14 +590 +590 +8351 +15670 +48 +3546 +43 +43 +15671 +8789 +48 +201 +8916 +57 +188 +764 +15672 +48 +741 +2744 +15673 +15674 +1021 +152 +14434 +11754 +15675 +15676 +15677 +48 +11822 +526 +43 +15 +15678 +15679 +13760 +3546 +305 +3546 +9 +14477 +15680 +15681 +764 +57 +5420 +48 +590 +349 +196 +491 +43 +15682 +2409 +43 +15683 +43 +4341 +13361 +15684 +13807 +19 +971 +15445 +15685 +15306 +4341 +14477 +48 +15686 +43 +3546 +7276 +15687 +14 +15688 +15689 +358 +416 +155 +15690 +104 +43 +15691 +1961 +590 +15692 +15693 +15694 +13228 +249 +36 +573 +4376 +48 +43 +493 +48 +15695 +43 +1571 +352 +15696 +464 +6341 +19 +3 +1688 +736 +14001 +15697 +228 +15698 +5298 +15699 +15700 +1817 +15701 +2569 +15702 +11966 +15703 +722 +48 +2 +15704 +13150 +38 +14 +411 +15705 +10230 +15706 +286 +14660 +15707 +15708 +14604 +4411 +590 +15709 +15710 +8721 +15711 +845 +3553 +855 +415 +12987 +1870 +14 +14 +15712 +15713 +9 +15714 +15715 +10946 +43 +43 +590 +15716 +15717 +15718 +272 +590 +2804 +528 +14 +741 +43 +590 +48 +123 +12153 +43 +43 +15719 +15720 +5659 +3546 +15721 +286 +15722 +15723 +48 +14884 +15724 +13108 +3959 +15725 +15726 +14 +57 +1696 +1732 +4230 +43 +176 +15727 +15728 +15729 +14 +48 +15730 +822 +43 +15731 +15732 +11321 +931 +15733 +2 +1376 +10 +590 +15734 +554 +43 +15735 +349 +15736 +48 +15737 +15738 +590 +2 +5780 +155 +15739 +1060 +14604 +1542 +196 +14 +12077 +15740 +10 +2446 +741 +15741 +15742 +15743 +14477 +6400 +14604 +590 +3553 +14363 +32 +2859 +1112 +9994 +590 +349 +14363 +1444 +12987 +15744 +15745 +5438 +5305 +43 +590 +43 +2567 +19 +646 +15746 +15747 +590 +1514 +15748 +14 +19 +15749 +15750 +590 +15751 +15752 +19 +14 +4907 +249 +15753 +15754 +15755 +12202 +15756 +3849 +8867 +741 +764 +3842 +15757 +15622 +15758 +2 +1245 +15759 +3732 +741 +43 +57 +43 +15760 +2463 +15761 +590 +32 +14 +11483 +15762 +3291 +13271 +14 +1051 +15763 +15764 +3546 +15765 +2958 +590 +43 +7780 +12808 +14 +590 +32 +15766 +57 +3553 +590 +10 +7045 +43 +112 +259 +48 +43 +15767 +270 +15768 +3546 +43 +10 +15769 +43 +15770 +15771 +15772 +15773 +15774 +155 +15775 +48 +19 +15776 +15777 +43 +358 +19 +15778 +15779 +1637 +286 +1470 +590 +647 +286 +3353 +2700 +703 +358 +3546 +9 +15780 +140 +73 +14 +15781 +15782 +5627 +7291 +13528 +15783 +43 +5162 +14007 +14 +43 +15784 +43 +32 +43 +15785 +357 +48 +15786 +720 +7276 +15787 +303 +4790 +15788 +13208 +57 +2314 +13282 +15789 +15790 +2006 +14 +741 +11754 +5614 +19 +15791 +48 +15792 +15793 +5293 +14624 +736 +29 +3119 +20 +15794 +7137 +2 +213 +337 +590 +15795 +2009 +213 +3546 +15796 +4963 +249 +411 +5582 +284 +286 +5483 +15797 +15798 +1208 +1726 +12560 +14 +15799 +1066 +15800 +15801 +2064 +15802 +12 +7034 +15803 +13282 +5780 +7226 +15804 +15805 +1481 +2679 +1232 +15806 +5780 +15807 +15808 +4387 +15809 +1605 +2694 +15810 +14985 +15811 +983 +43 +8351 +15812 +2040 +15813 +15814 +10 +15815 +15816 +14532 +12013 +15817 +15818 +13508 +4808 +741 +14532 +15819 +43 +15820 +43 +14 +5780 +48 +15821 +15822 +1924 +14957 +15823 +15824 +590 +764 +13508 +48 +1765 +20 +43 +15825 +155 +155 +210 +741 +282 +43 +1291 +15156 +188 +15826 +379 +15827 +554 +15828 +19 +590 +15351 +15829 +349 +707 +48 +1751 +48 +15830 +29 +48 +3129 +554 +349 +13904 +15756 +43 +12807 +15831 +17 +57 +43 +15832 +292 +4907 +15833 +272 +4997 +15834 +15835 +15836 +3546 +1157 +15837 +48 +141 +15838 +15839 +337 +13913 +2804 +590 +15840 +554 +1251 +10117 +15841 +1524 +57 +14 +48 +48 +43 +9320 +48 +13282 +43 +15842 +15843 +15844 +764 +43 +358 +590 +1956 +15845 +15846 +43 +15847 +15848 +43 +14276 +48 +15849 +15850 +647 +12307 +509 +2600 +971 +15851 +1051 +15852 +9 +15756 +15853 +15854 +15855 +15856 +3 +1095 +32 +15857 +15858 +1300 +15859 +1232 +15860 +3484 +15861 +15862 +15863 +48 +590 +7014 +5088 +15864 +13492 +15865 +272 +20 +2197 +15866 +104 +43 +12621 +15867 +6518 +15868 +48 +15869 +15870 +8297 +349 +15871 +137 +155 +9418 +927 +15872 +6877 +48 +8701 +43 +15873 +3615 +286 +43 +14 +15874 +15875 +6741 +10 +1401 +15876 +43 +12987 +15877 +15878 +590 +14 +8566 +887 +12267 +349 +736 +15879 +15880 +43 +1234 +15881 +2064 +19 +15882 +15883 +15884 +15885 +3003 +20 +3546 +590 +11321 +11762 +15886 +13162 +741 +15887 +15888 +15889 +178 +43 +1224 +15890 +397 +1169 +15891 +590 +15892 +15699 +349 +1903 +99 +15893 +13361 +707 +43 +7601 +9 +1559 +15894 +43 +720 +9 +15895 +15896 +15897 +15898 +13150 +11754 +15899 +15900 +19 +15901 +1232 +32 +99 +1901 +1883 +10030 +15902 +19 +15903 +286 +14 +15904 +892 +7908 +1316 +13957 +15905 +176 +15906 +741 +15907 +15908 +590 +1465 +272 +43 +1912 +15909 +48 +15910 +48 +15911 +15912 +1917 +15913 +14 +2 +2 +15914 +15915 +15916 +11471 +590 +201 +112 +43 +5045 +60 +15917 +15918 +15428 +590 +15919 +7183 +57 +564 +15920 +29 +22 +22 +152 +14897 +2 +48 +1655 +80 +12534 +15921 +43 +15922 +720 +15923 +201 +15924 +15925 +5780 +15926 +14343 +1232 +15927 +19 +15928 +15929 +43 +32 +43 +48 +2459 +1385 +5344 +19 +209 +15930 +14 +286 +3546 +48 +43 +1465 +349 +4 +345 +155 +2476 +12120 +533 +2392 +15931 +13655 +15932 +43 +15933 +57 +1234 +19 +745 +1612 +2625 +14477 +12711 +43 +15934 +1961 +36 +2 +286 +15935 +14 +48 +317 +12772 +43 +590 +15936 +509 +493 +15937 +15938 +8733 +15939 +48 +2465 +4852 +590 +14 +590 +4230 +5827 +1169 +15940 +43 +3546 +15941 +15942 +15943 +15944 +3844 +1115 +15945 +1824 +590 +15946 +9 +15947 +14482 +590 +15948 +323 +43 +15949 +15950 +15951 +15952 +7236 +301 +5780 +15953 +15954 +15955 +15956 +15957 +14 +15958 +66 +1710 +590 +15959 +188 +15960 +1364 +415 +15327 +15961 +155 +15962 +15963 +15964 +48 +1234 +43 +15965 +20 +648 +15966 +5197 +3546 +48 +15967 +11483 +36 +15968 +15969 +1991 +15970 +155 +370 +48 +15971 +15972 +12329 +15973 +14 +1295 +2260 +286 +5780 +15974 +15975 +15976 +2029 +15977 +13361 +89 +15978 +15 +741 +7886 +1920 +590 +12987 +155 +141 +15979 +15980 +15981 +1223 +104 +43 +590 +15 +15982 +4179 +14553 +22 +15983 +14603 +15984 +5204 +19 +15985 +3546 +554 +9 +741 +15986 +142 +48 +15987 +9 +15988 +15989 +1154 +188 +15990 +736 +590 +590 +2 +48 +15991 +15992 +15993 +43 +43 +590 +536 +272 +6011 +15994 +43 +590 +1013 +152 +209 +6764 +48 +2 +272 +590 +9713 +8907 +15995 +1047 +15996 +5780 +478 +14185 +15997 +5344 +15998 +11321 +15999 +9 +6741 +12005 +16000 +1089 +16001 +16002 +16003 +764 +43 +8787 +14477 +16004 +16005 +10 +16006 +6764 +272 +16007 +14369 +112 +14 +20 +138 +48 +3417 +282 +2600 +4425 +286 +10 +590 +48 +3546 +2 +272 +720 +453 +14604 +707 +14477 +43 +11483 +1870 +286 +16008 +2762 +16009 +16010 +1578 +16011 +1295 +15699 +16012 +11762 +3546 +19 +16013 +16014 +3546 +1232 +13929 +16015 +15 +16016 +528 +1901 +349 +4928 +322 +43 +16017 +3546 +16018 +43 +43 +647 +16019 +16020 +20 +9 +16021 +16022 +11593 +2733 +16023 +16024 +1547 +16025 +16026 +112 +1449 +741 +16027 +1889 +720 +57 +43 +12397 +9 +16028 +16029 +11882 +736 +43 +20 +14 +19 +4524 +16030 +3610 +48 +5780 +43 +1371 +10 +16031 +1051 +15989 +16032 +188 +2577 +16033 +16034 +590 +15449 +6668 +19 +16035 +3 +16036 +48 +32 +213 +2694 +16037 +11762 +14 +7835 +16038 +14690 +16039 +13655 +12987 +16040 +16041 +16042 +152 +57 +536 +349 +1166 +3546 +14 +16043 +43 +14477 +14 +349 +19 +7357 +43 +43 +13282 +48 +16044 +16045 +8566 +1529 +35 +16046 +2117 +16047 +915 +16048 +590 +14843 +16049 +89 +2577 +16050 +2124 +16051 +19 +286 +43 +317 +751 +495 +707 +4961 +43 +57 +5208 +9965 +845 +16052 +48 +3976 +13973 +14 +43 +5780 +3417 +337 +10 +43 +2459 +16053 +2 +14884 +6287 +514 +1569 +4820 +597 +16054 +2286 +5119 +6950 +14 +272 +590 +16055 +3546 +16056 +3546 +1232 +5243 +2415 +399 +15778 +16057 +303 +16058 +2514 +13108 +274 +16059 +16060 +286 +43 +155 +16061 +5080 +16062 +48 +43 +16063 +3546 +11256 +16064 +16065 +12620 +43 +14 +16066 +16067 +8249 +2 +15 +2040 +5418 +16068 +16069 +305 +16070 +48 +4765 +16071 +185 +14 +583 +16072 +35 +16073 +155 +15 +16074 +16075 +16076 +8295 +16077 +509 +5351 +272 +16078 +272 +32 +590 +12987 +16079 +8351 +19 +495 +590 +11301 +14 +152 +140 +3546 +14 +6950 +397 +4280 +337 +286 +16064 +16080 +43 +2 +16081 +48 +43 +342 +57 +16082 +16083 +590 +19 +152 +3546 +16084 +694 +104 +3317 +12778 +5088 +16085 +16086 +16087 +43 +137 +16088 +16089 +8249 +775 +201 +9 +1082 +32 +3543 +16090 +14341 +16091 +16092 +57 +16093 +12560 +1012 +16094 +16095 +16096 +57 +210 +43 +533 +590 +16097 +43 +415 +29 +16098 +337 +3546 +14 +590 +14901 +43 +16099 +104 +5820 +16100 +239 +2035 +665 +16101 +16102 +1915 +14369 +590 +12987 +14363 +16103 +43 +16104 +209 +10003 +16105 +590 +1508 +590 +9 +16106 +16107 +3546 +3546 +586 +43 +48 +1232 +4982 +48 +16108 +16109 +152 +16110 +10004 +16102 +43 +16111 +10031 +16112 +48 +2042 +16113 +48 +16114 +1013 +349 +9 +16115 +16054 +16116 +6766 +43 +10 +16117 +16118 +3546 +872 +16119 +248 +1765 +19 +12996 +16120 +5780 +16121 +14 +16122 +2769 +16123 +16124 +590 +9583 +6766 +6214 +2316 +464 +15 +16125 +13282 +16126 +16127 +2764 +9 +323 +11211 +590 +3128 +647 +2550 +1425 +48 +16128 +22 +16129 +32 +16130 +16131 +349 +12277 +2356 +736 +15797 +590 +14 +5837 +4803 +16132 +14 +4982 +14 +16133 +16134 +8943 +16135 +6950 +16136 +349 +3546 +1021 +14 +20 +16137 +761 +16138 +16139 +16140 +1021 +764 +590 +43 +590 +16141 +16142 +213 +3368 +345 +248 +48 +647 +590 +14477 +16143 +16144 +16145 +16146 +13566 +16147 +590 +16148 +3638 +16149 +16150 +43 +14604 +1112 +736 +1765 +2 +14483 +12402 +16151 +16152 +13959 +15756 +57 +1107 +19 +12220 +20 +16153 +16154 +1765 +16155 +9 +583 +16156 +3 +16157 +43 +32 +16158 +16159 +872 +8351 +43 +16160 +2694 +16161 +647 +8758 +16162 +1559 +415 +14843 +11754 +16163 +686 +16164 +16165 +16166 +16167 +16168 +20 +43 +2 +12987 +16169 +1026 +43 +16170 +16171 +10 +16172 +43 +16173 +493 +142 +43 +10163 +16174 +349 +43 +43 +823 +16175 +13566 +13225 +15592 +43 +342 +12987 +16176 +16177 +14 +16178 +98 +16179 +10583 +16180 +13223 +32 +16181 +14604 +16182 +16183 +89 +1710 +9 +1214 +14 +4855 +16184 +222 +3139 +16185 +115 +48 +3546 +16186 +6950 +648 +48 +14 +38 +671 +16187 +1217 +16188 +349 +16189 +303 +16190 +16191 +16192 +16193 +10 +16194 +14604 +373 +16195 +1300 +286 +43 +20 +43 +741 +48 +16196 +3546 +640 +272 +12987 +828 +43 +16197 +16198 +3 +741 +5751 +2038 +48 +16199 +29 +16200 +14 +48 +134 +43 +16201 +2314 +155 +764 +16202 +3546 +16203 +823 +9514 +43 +16204 +647 +32 +2493 +48 +823 +16205 +14 +43 +9 +10 +590 +16206 +188 +6214 +13988 +286 +10979 +3598 +19 +43 +274 +417 +333 +12987 +6950 +378 +1217 +16207 +48 +16208 +590 +19 +10 +16209 +112 +3546 +14 +43 +16210 +43 +1310 +1295 +8864 +1224 +616 +43 +16211 +43 +6209 +4927 +16212 +736 +14532 +48 +3075 +201 +2 +8724 +5647 +286 +286 +590 +14 +16213 +43 +6744 +57 +16214 +3906 +16215 +9 +20 +43 +554 +379 +16216 +16217 +14 +1716 +16218 +15953 +16219 +16220 +14 +16221 +5220 +19 +1172 +15914 +16222 +48 +14 +13756 +16223 +13282 +16224 +43 +616 +554 +10 +16225 +6075 +57 +379 +16226 +16227 +57 +41 +14827 +16228 +16229 +1245 +13566 +16230 +16231 +2260 +1287 +9 +286 +43 +5780 +1013 +15 +590 +861 +369 +1012 +140 +43 +1314 +3 +590 +345 +16232 +48 +16233 +764 +16234 +1356 +915 +43 +98 +16235 +6068 +16236 +16237 +16238 +1013 +736 +554 +16239 +379 +48 +16240 +16241 +16242 +16243 +590 +80 +5299 +10 +349 +13321 +12807 +16244 +16245 +4028 +43 +1112 +791 +14 +16246 +10 +647 +16247 +16248 +16249 +16250 +16251 +3546 +43 +3546 +349 +16252 +16253 +16254 +3546 +29 +16255 +16256 +868 +7855 +14477 +16257 +1018 +16258 +16259 +16260 +16261 +16262 +16263 +2 +43 +32 +53 +736 +1217 +43 +3546 +590 +5332 +16264 +272 +13576 +16265 +43 +12457 +9 +14666 +42 +10 +15914 +242 +222 +668 +2039 +16266 +2314 +16267 +14693 +4824 +15975 +43 +16268 +14 +11522 +9583 +34 +16269 +14 +1181 +137 +112 +16270 +8593 +16271 +554 +16272 +16273 +16274 +43 +16275 +16276 +590 +354 +10 +16277 +14594 +4747 +8566 +16278 +16279 +43 +14 +2882 +3546 +8188 +16280 +178 +16281 +6736 +282 +16282 +590 +548 +9595 +43 +38 +590 +48 +48 +3369 +32 +1696 +16283 +16284 +5561 +16285 +16286 +15720 +3546 +115 +14 +16287 +53 +39 +5731 +16288 +16289 +9103 +16290 +7137 +14477 +616 +590 +43 +16291 +152 +14363 +16292 +3546 +5340 +15 +8566 +16293 +648 +16294 +16295 +48 +48 +15718 +8255 +115 +286 +573 +48 +16296 +16297 +16298 +43 +16299 +1100 +16300 +16301 +379 +398 +665 +701 +48 +13790 +16302 +12987 +14 +16303 +272 +16304 +16305 +2694 +16306 +16307 +528 +3546 +15504 +536 +222 +1172 +16308 +7379 +16309 +16310 +43 +2281 +16311 +1912 +11754 +16312 +3546 +16313 +210 +694 +16314 +16315 +349 +10727 +19 +989 +43 +1514 +16316 +210 +16317 +43 +16318 +16319 +16320 +3546 +16321 +16322 +379 +11754 +15 +16323 +6095 +590 +16324 +2957 +4752 +14420 +6950 +43 +16325 +358 +14477 +11408 +57 +590 +14477 +12560 +1566 +741 +3546 +16326 +7137 +16327 +16328 +849 +590 +1578 +2975 +15756 +16329 +16330 +16331 +3119 +416 +272 +8566 +14 +1107 +35 +16332 +48 +16333 +12987 +14 +16334 +43 +16335 +16336 +389 +1743 +4028 +57 +3066 +19 +16337 +590 +36 +15718 +1563 +16338 +43 +590 +43 +11762 +1300 +16339 +412 +5410 +48 +4293 +3 +16340 +16341 +112 +14477 +16342 +32 +6877 +14 +11754 +1232 +16343 +16344 +3119 +2811 +16345 +48 +590 +16346 +3546 +16347 +5344 +35 +3452 +201 +16348 +16349 +1048 +301 +15718 +16350 +140 +188 +16351 +16352 +3546 +13492 +210 +15 +2053 +1232 +377 +53 +1684 +16353 +16354 +1991 +3849 +155 +1961 +16355 +32 +48 +8724 +16060 +16356 +48 +3 +32 +16357 +59 +8297 +16230 +1991 +3355 +3275 +10993 +16358 +1149 +1559 +15718 +188 +10356 +20 +222 +16359 +16360 +14477 +16361 +43 +16362 +48 +4963 +22 +19 +16363 +13566 +9 +2787 +16364 +14477 +43 +14871 +3546 +250 +1817 +349 +170 +16365 +1082 +736 +16366 +16367 +14 +13296 +16368 +16369 +272 +16370 +16371 +48 +1049 +16372 +823 +4 +14866 +590 +185 +8188 +1987 +15797 +14 +3182 +1217 +16373 +35 +736 +16374 +16090 +201 +14679 +2925 +16375 +13582 +3334 +43 +14 +48 +13365 +16376 +16377 +16378 +16379 +7855 +152 +14 +14886 +60 +16380 +1470 +16381 +15 +16382 +16383 +43 +338 +16384 +43 +16385 +741 +590 +590 +14 +16386 +43 +34 +3546 +7137 +16387 +43 +14 +16388 +2434 +1181 +196 +1382 +4387 +43 +11341 +6877 +4155 +16389 +16390 +1083 +12987 +14 +15 +22 +16391 +43 +53 +123 +43 +6950 +1531 +16392 +43 +12987 +15756 +16393 +16394 +9402 +590 +112 +286 +207 +99 +6341 +16395 +16396 +155 +43 +16397 +12798 +16398 +2243 +5780 +48 +43 +12166 +16399 +43 +19 +16400 +43 +317 +607 +4907 +16401 +16402 +3546 +15 +14477 +12987 +736 +14001 +14603 +43 +1853 +1442 +705 +16403 +16404 +122 +16405 +43 +14604 +16406 +3317 +736 +16407 +16408 +43 +4717 +16409 +16410 +16411 +14814 +43 +14 +10389 +16412 +1160 +1018 +284 +16413 +16414 +213 +1604 +12560 +10 +8279 +16415 +1559 +16416 +16417 +2859 +57 +188 +43 +1013 +16418 +15744 +16419 +16420 +16421 +38 +16422 +8171 +303 +989 +9 +16190 +3353 +3546 +3546 +4179 +16423 +16424 +242 +43 +16425 +16426 +9 +14477 +16427 +284 +16428 +272 +16429 +16430 +16431 +358 +16432 +16433 +284 +48 +43 +2 +741 +20 +16434 +16435 +971 +16436 +16437 +1051 +16438 +16439 +15810 +6877 +11966 +48 +16440 +29 +16441 +57 +16442 +43 +337 +284 +16443 +48 +16444 +11539 +43 +16445 +16446 +10230 +342 +48 +16447 +16448 +1244 +43 +14689 +48 +16348 +19 +337 +15 +48 +43 +48 +315 +5688 +48 +43 +1013 +933 +849 +7259 +48 +12987 +16449 +323 +20 +16450 +16451 +1800 +16452 +16453 +1961 +16454 +2 +2136 +16258 +16455 +14363 +43 +1203 +398 +209 +1232 +12005 +558 +286 +16456 +590 +2577 +590 +16457 +14604 +3546 +16458 +12987 +16459 +32 +43 +16437 +6950 +16460 +16461 +43 +736 +590 +286 +284 +720 +16462 +16205 +741 +16463 +14957 +19 +16464 +16465 +14 +7283 +16466 +16467 +57 +14663 +2958 +16468 +248 +16469 +3353 +9 +1542 +14 +349 +16470 +10 +16471 +564 +590 +43 +16472 +16473 +15718 +16474 +15406 +16475 +14 +16476 +16477 +48 +14 +8367 +272 +16478 +16479 +11808 +16480 +1232 +397 +16481 +43 +16482 +590 +249 +3492 +16483 +43 +112 +1011 +16484 +16485 +16486 +303 +16487 +590 +6950 +16488 +2 +590 +16489 +16490 +3 +16491 +16492 +16493 +16494 +3546 +16495 +590 +2734 +590 +43 +5780 +7137 +16496 +7855 +590 +225 +671 +16497 +57 +16498 +646 +16499 +43 +48 +1157 +16500 +590 +8988 +5780 +48 +48 +16440 +1765 +19 +16096 +3034 +8005 +16501 +3435 +16502 +38 +16503 +8744 +15718 +16504 +16505 +29 +509 +16506 +1232 +16507 +15718 +14001 +2260 +16508 +14 +16509 +349 +3546 +16510 +286 +16511 +57 +16512 +43 +16513 +16514 +5217 +373 +153 +16515 +16516 +14 +43 +16517 +16518 +720 +14001 +43 +16519 +16520 +14 +16521 +22 +137 +2253 +196 +2006 +16522 +15384 +16523 +590 +590 +16524 +590 +43 +16525 +16526 +284 +16527 +457 +484 +16437 +16528 +5627 +188 +112 +155 +16529 +15718 +6915 +14 +16530 +16531 +35 +16532 +60 +16533 +16534 +15718 +337 +16535 +2733 +971 +1220 +16536 +43 +16537 +213 +14 +7960 +15 +16538 +14957 +14603 +590 +16539 +16540 +16541 +14 +43 +16542 +284 +2260 +43 +745 +48 +16543 +188 +43 +16544 +43 +12185 +8566 +16545 +323 +43 +16546 +590 +35 +43 +9461 +14477 +2561 +16547 +16548 +32 +323 +8297 +16549 +3546 +3598 +43 +43 +6121 +2254 +322 +14 +16550 +16551 +736 +142 +9617 +10 +16437 +2577 +16552 +14 +2772 +1738 +15824 +16553 +2733 +248 +5780 +590 +14 +16554 +16555 +43 +16556 +16557 +16558 +1991 +32 +43 +16559 +1563 +303 +16560 +16561 +16562 +1229 +16563 +349 +16564 +14 +14 +12351 +9 +16565 +192 +16566 +1524 +16567 +210 +16568 +17 +11207 +16569 +16570 +16437 +137 +3546 +16571 +16572 +14 +16573 +647 +272 +248 +16574 +16575 +43 +823 +43 +16576 +16577 +248 +16578 +57 +16579 +43 +20 +590 +5438 +43 +3546 +6950 +16580 +43 +248 +43 +5780 +16581 +9705 +16582 +16583 +590 +210 +43 +152 +597 +15 +1787 +2921 +349 +16584 +15718 +647 +16585 +741 +16586 +48 +16587 +32 +16588 +16589 +14916 +1799 +7917 +43 +2243 +29 +2 +590 +8392 +32 +648 +1013 +16590 +1437 +14604 +16591 +16592 +2 +1465 +16593 +48 +872 +286 +736 +19 +12987 +14546 +48 +16594 +357 +16595 +43 +22 +16596 +12987 +12483 +43 +16597 +16598 +349 +590 +2561 +15718 +14215 +541 +9681 +3546 +554 +286 +3553 +1559 +3546 +16334 +92 +14 +19 +16599 +1912 +1415 +16600 +29 +16601 +16602 +16603 +16604 +43 +16605 +3546 +16606 +16607 +9560 +16608 +14 +3546 +286 +272 +16609 +16610 +16611 +12936 +14 +11754 +16612 +448 +14 +1082 +43 +19 +43 +43 +2 +1208 +16613 +305 +16614 +20 +43 +1232 +1013 +16615 +19 +16616 +35 +16617 +16618 +16437 +16619 +43 +736 +15718 +464 +317 +790 +1542 +16620 +14 +89 +286 +16621 +16491 +5561 +495 +16622 +19 +38 +14695 +2 +272 +741 +16623 +5780 +14693 +16624 +16625 +10230 +10961 +849 +12987 +16626 +16627 +16628 +15 +6121 +43 +14477 +16629 +13361 +14 +3 +3508 +5601 +16630 +188 +349 +790 +16631 +43 +16632 +43 +9 +80 +6595 +16633 +16634 +4113 +692 +16635 +16636 +16637 +16638 +16639 +590 +19 +15694 +16640 +16641 +16642 +16643 +38 +16644 +11754 +5803 +554 +43 +16645 +16646 +14001 +5780 +14816 +3546 +647 +12605 +711 +16647 +16648 +16649 +2804 +5601 +43 +43 +16650 +20 +14594 +13954 +2540 +16651 +1425 +6595 +3055 +16652 +16653 +5088 +48 +16654 +16655 +249 +16656 +48 +16657 +12402 +16658 +48 +14 +13902 +2 +416 +48 +16659 +14179 +736 +16660 +845 +152 +16661 +16662 +16663 +43 +3491 +16664 +770 +14420 +4278 +15718 +16665 +16666 +16667 +16668 +349 +16669 +3484 +6950 +155 +1013 +178 +25 +43 +16670 +11176 +686 +43 +14 +16671 +16672 +399 +16673 +16674 +16675 +1018 +16150 +16676 +12 +7553 +48 +2 +358 +2245 +4907 +16171 +16677 +819 +16678 +11247 +43 +915 +16679 +446 +16680 +671 +554 +11754 +16681 +16682 +14 +152 +15 +590 +590 +16683 +590 +1157 +770 +19 +16684 +1047 +48 +43 +16685 +4028 +1765 +16686 +8244 +16687 +11483 +16688 +141 +89 +16689 +12987 +16690 +16691 +10259 +12 +16692 +43 +16693 +751 +3310 +648 +16694 +32 +590 +1425 +1154 +16695 +155 +16696 +590 +43 +16697 +14759 +19 +2577 +15718 +16698 +10720 +3546 +16699 +1021 +43 +3546 +7123 +11321 +59 +736 +16437 +43 +349 +2324 +16700 +13271 +554 +15718 +43 +16584 +9 +828 +16701 +76 +4790 +43 +16702 +11005 +1232 +16703 +13279 +48 +14 +16704 +12067 +32 +12434 +16705 +9849 +1364 +13803 +1364 +14546 +15718 +43 +16706 +16707 +5041 +1991 +16708 +1425 +14 +16709 +736 +15718 +16710 +15595 +590 +1012 +15472 +16711 +16712 +43 +16713 +39 +16714 +590 +1232 +32 +16715 +736 +231 +3408 +349 +9 +16716 +13150 +1295 +16717 +188 +48 +8046 +16718 +741 +16719 +253 +80 +14 +16720 +741 +3546 +8050 +16721 +43 +16722 +14603 +16723 +19 +1208 +16724 +16725 +16726 +16727 +16728 +16729 +12185 +57 +16730 +16731 +14001 +11762 +16732 +10 +16733 +16734 +16735 +16736 +16737 +48 +773 +16437 +16738 +16739 +16740 +48 +590 +19 +43 +14363 +38 +13484 +16741 +2012 +16742 +16634 +155 +665 +16743 +6877 +823 +14477 +14553 +9262 +2476 +590 +48 +16744 +554 +3 +19 +647 +554 +15054 +10737 +14 +16745 +2882 +43 +16746 +16747 +16748 +14 +14523 +48 +936 +272 +464 +415 +16749 +1013 +16750 +16751 +533 +16752 +209 +57 +43 +16753 +16754 +32 +2930 +16755 +8566 +25 +16756 +43 +286 +48 +2733 +48 +188 +16757 +14274 +16758 +16759 +7855 +13464 +16760 +6794 +6214 +590 +16761 +16762 +15718 +43 +1109 +210 +713 +2446 +112 +5780 +16763 +16764 +16765 +6341 +12402 +349 +2537 +43 +209 +16766 +3575 +11762 +16767 +3542 +15 +16768 +6939 +13754 +48 +43 +286 +16769 +647 +12987 +2537 +16770 +5969 +16413 +1232 +16437 +16771 +43 +349 +4717 +15718 +16772 +15718 +6741 +16773 +43 +16774 +590 +43 +43 +590 +16775 +590 +14 +1765 +16776 +16118 +16777 +14 +323 +14 +927 +2577 +464 +48 +10 +16778 +22 +8100 +57 +590 +43 +43 +14363 +16437 +16779 +16780 +15 +3546 +16781 +1051 +14 +16782 +2314 +48 +12402 +48 +1446 +736 +2314 +43 +16783 +1529 +554 +16784 +3546 +16785 +209 +590 +14 +43 +16786 +7923 +590 +16787 +43 +736 +16788 +16437 +16789 +16790 +1217 +3546 +16791 +16792 +3330 +19 +20 +669 +15384 +16793 +8685 +1961 +57 +15498 +16794 +1364 +16171 +15718 +16795 +349 +16035 +3491 +48 +16796 +16797 +16798 +16799 +19 +16800 +6950 +2015 +9 +16801 +16802 +3546 +590 +16803 +1082 +16804 +155 +15039 +16805 +14 +16806 +22 +2064 +15819 +48 +16807 +647 +16808 +16809 +3546 +590 +2253 +188 +849 +741 +358 +2769 +16810 +590 +16811 +16284 +112 +13179 +4118 +3481 +15718 +16812 +2136 +19 +15718 +741 +873 +16813 +48 +16814 +13666 +16815 +16816 +16817 +16818 +16819 +560 +5780 +872 +2012 +3768 +16820 +590 +16821 +12560 +13279 +16822 +1905 +15649 +48 +15 +9 +16823 +14 +14 +43 +11762 +305 +1181 +193 +16824 +16825 +43 +16826 +48 +16827 +34 +14363 +16828 +590 +7137 +15718 +16829 +89 +1524 +16830 +15718 +16831 +397 +16832 +286 +188 +2 +43 +16833 +16834 +595 +104 +16835 +1912 +849 +14007 +16836 +16837 +16838 +14477 +14 +14 +764 +13897 +8867 +43 +16839 +3546 +43 +5582 +14537 +590 +16840 +14 +16841 +2790 +48 +16842 +554 +16843 +16844 +1013 +16845 +3546 +590 +16846 +16847 +140 +16848 +16849 +16850 +8362 +16851 +15718 +5614 +823 +16852 +16853 +16468 +16854 +16855 +16856 +16857 +19 +16858 +188 +736 +11301 +16859 +3119 +48 +188 +112 +15718 +16437 +2195 +16860 +2804 +4388 +19 +16861 +43 +15718 +16437 +16862 +845 +10 +3768 +16863 +16864 +48 +67 +10079 +16865 +16866 +1765 +3546 +6736 +2042 +57 +491 +554 +9 +7137 +4606 +57 +16867 +16868 +590 +16869 +48 +19 +19 +16870 +16871 +16872 +48 +43 +16873 +76 +741 +32 +16874 +48 +16205 +13131 +36 +16875 +1082 +3546 +16876 +43 +2260 +43 +1513 +16877 +29 +16878 +14477 +1847 +1425 +770 +14477 +16879 +19 +736 +16880 +16881 +15 +43 +3105 +16882 +16883 +20 +16884 +16885 +286 +43 +16437 +16886 +48 +11762 +48 +15810 +43 +43 +357 +5318 +9 +5780 +741 +14477 +57 +650 +3543 +16887 +16888 +8758 +16889 +16890 +14 +43 +590 +16891 +16892 +48 +80 +379 +831 +9 +1542 +43 +16437 +48 +29 +15797 +7855 +8994 +3546 +7521 +179 +5990 +590 +15 +286 +11822 +2064 +16893 +3978 +2 +16894 +14477 +13484 +20 +1224 +16895 +5451 +14276 +2254 +16896 +48 +20 +342 +209 +5075 +16897 +349 +9 +14 +48 +43 +3546 +2121 +16898 +16899 +197 +647 +19 +16900 +15914 +16901 +1992 +16902 +43 +14 +6095 +3546 +3228 +16903 +16904 +566 +1316 +155 +16905 +11301 +16906 +16907 +43 +3546 +3546 +44 +2550 +5973 +1559 +2006 +1465 +43 +590 +590 +112 +16908 +16909 +16910 +16911 +1080 +16912 +1425 +43 +590 +16913 +1808 +2694 +16914 +12 +16915 +16916 +16917 +188 +43 +5190 +16656 +590 +10 +22 +1234 +155 +16918 +554 +741 +16919 +741 +20 +206 +43 +14185 +493 +16920 +14477 +16921 +14 +48 +16922 +5963 +29 +14420 +1120 +16923 +2404 +16924 +16925 +1458 +16926 +16927 +13760 +20 +16928 +6720 +16929 +6915 +590 +16930 +16931 +16932 +4684 +16933 +2117 +16934 +6741 +2764 +16437 +3546 +491 +2790 +35 +790 +16935 +1859 +354 +43 +14 +590 +12621 +48 +48 +286 +48 +19 +3553 +201 +16936 +43 +1169 +43 +8351 +14 +16937 +43 +14477 +1765 +2764 +43 +14957 +286 +14363 +15486 +3546 +48 +11321 +43 +16938 +16939 +16940 +4717 +554 +2769 +29 +3546 +8188 +3546 +2202 +14363 +1012 +43 +16941 +16942 +16437 +16943 +16944 +16945 +43 +1011 +4 +16946 +439 +16947 +16948 +16949 +16950 +13150 +16951 +43 +19 +48 +43 +16145 +19 +590 +14 +4278 +16952 +14 +43 +16953 +9 +15356 +286 +5416 +16954 +16955 +16881 +12987 +16956 +16957 +43 +16958 +16959 +741 +48 +16960 +616 +887 +590 +554 +3546 +16961 +7215 +16962 +16963 +7137 +1154 +16964 +7855 +741 +10958 +16965 +16966 +4278 +48 +48 +43 +590 +1077 +57 +1765 +2314 +16967 +595 +53 +16968 +1688 +48 +590 +16491 +16969 +12907 +12987 +16970 +16437 +19 +48 +474 +16971 +43 +2561 +16972 +43 +16973 +9 +16974 +112 +16975 +201 +14001 +16976 +43 +48 +16977 +590 +43 +1437 +16978 +48 +19 +9739 +15 +48 +16979 +15718 +845 +42 +80 +16980 +286 +741 +590 +155 +13566 +16981 +1992 +14 +16982 +1912 +16983 +16437 +43 +16984 +16985 +379 +43 +16986 +9 +1559 +57 +16987 +272 +210 +16988 +16989 +303 +29 +616 +16990 +16991 +16992 +48 +16993 +16994 +16995 +16996 +14 +613 +11522 +213 +16437 +48 +286 +2879 +16997 +357 +43 +14909 +16998 +358 +14477 +43 +19 +16999 +17000 +1054 +3546 +590 +43 +14185 +17001 +17002 +43 +43 +17003 +57 +337 +397 +333 +14 +2 +17004 +349 +14185 +17005 +590 +9 +17006 +17007 +15820 +43 +286 +14185 +1901 +16981 +15 +17008 +17009 +17010 +17011 +17012 +30 +43 +15 +48 +590 +14 +16437 +17013 +6301 +17014 +590 +590 +1361 +14477 +17011 +446 +590 +17015 +17016 +14 +17017 +736 +13555 +89 +17018 +4963 +337 +795 +15718 +19 +17019 +357 +5119 +104 +1502 +17020 +4388 +705 +6499 +5780 +14373 +736 +3546 +590 +11483 +3546 +80 +19 +17021 +89 +17022 +17023 +509 +17024 +536 +43 +1524 +2732 +17025 +971 +48 +17026 +201 +1228 +11321 +17027 +2650 +3192 +590 +2577 +3546 +1920 +152 +736 +14 +14853 +17028 +8255 +2594 +17029 +6950 +2514 +17030 +48 +5418 +17031 +1577 +57 +17032 +11754 +17033 +43 +32 +17034 +17035 +22 +48 +17036 +590 +17037 +14814 +17038 +1066 +4116 +17039 +43 +5218 +17040 +248 +43 +17041 +373 +3764 +16437 +43 +17042 +2349 +17043 +12891 +104 +5780 +17044 +17045 +17046 +1465 +32 +2409 +745 +7855 +3546 +17047 +17048 +48 +1011 +15220 +6106 +17049 +15855 +14 +17050 +736 +14 +590 +17051 +7276 +17052 +6072 +825 +590 +5780 +9705 +17053 +17054 +17055 +15718 +48 +17056 +2040 +17057 +17058 +493 +43 +17059 +3548 +3546 +358 +2694 +570 +15720 +2804 +17060 +17061 +188 +590 +17062 +57 +188 +3546 +17063 +11046 +137 +14363 +349 +13405 +17064 +17065 +17066 +16437 +17067 +43 +35 +5780 +2015 +17068 +48 +17069 +14 +15183 +17070 +1168 +14 +4934 +16826 +222 +17071 +17072 +9 +43 +19 +2260 +2009 +48 +15026 +17073 +17074 +17075 +14 +1612 +17076 +7962 +43 +15183 +8566 +15 +17077 +1021 +14 +17078 +17079 +43 +8392 +2593 +4808 +14 +17080 +590 +17081 +17082 +222 +9942 +17083 +3546 +17084 +17085 +48 +3216 +4056 +59 +701 +15718 +14 +893 +2457 +4026 +17086 +14477 +823 +736 +9444 +2009 +14 +43 +736 +17087 +8961 +3546 +17088 +43 +43 +17089 +11995 +48 +43 +179 +590 +3546 +8566 +15718 +32 +17090 +43 +14603 +10 +16488 +17091 +43 +1444 +43 +43 +17092 +14 +43 +14477 +17093 +48 +1153 +3626 +3317 +17094 +17095 +11727 +17096 +17097 +16491 +9649 +17098 +1364 +19 +17099 +17100 +5387 +16014 +9 +1817 +315 +13361 +317 +7176 +17101 +17102 +379 +17103 +17104 +17105 +17106 +20 +17107 +2864 +43 +484 +43 +7522 +17108 +17109 +6950 +349 +17110 +249 +17111 +43 +48 +43 +8668 +2577 +17112 +2769 +6048 +20 +17113 +48 +14 +5435 +17114 +17115 +17116 +14343 +17117 +533 +15989 +17118 +20 +17119 +43 +721 +8188 +17120 +17121 +1559 +14 +861 +590 +590 +19 +43 +17122 +17123 +15275 +17124 +17125 +17126 +3330 +741 +9 +590 +17127 +17128 +2979 +12987 +48 +590 +11754 +43 +43 +17129 +14477 +399 +43 +14 +19 +1051 +17130 +32 +25 +17131 +15718 +590 +17132 +6776 +17133 +9184 +5780 +12987 +17134 +15718 +1508 +764 +1992 +48 +8994 +4691 +12674 +15718 +590 +10 +11647 +11762 +17135 +590 +2318 +17136 +1287 +6741 +15442 +17042 +533 +1606 +17137 +43 +352 +188 +34 +15 +48 +17138 +358 +1612 +209 +19 +15975 +17139 +15240 +17140 +2316 +32 +17141 +16826 +17142 +46 +17143 +736 +14594 +11754 +53 +16741 +43 +286 +9 +48 +14911 +590 +43 +43 +17144 +736 +43 +7137 +5022 +17145 +3546 +2694 +17146 +17147 +1425 +379 +43 +179 +17148 +493 +43 +17149 +17150 +1559 +17151 +14 +377 +17152 +17153 +188 +3546 +14186 +583 +43 +17154 +17155 +15718 +694 +43 +17156 +590 +17157 +398 +1696 +647 +3546 +1765 +736 +495 +14477 +17158 +15645 +19 +683 +17159 +11483 +17160 +17161 +3546 +17162 +17163 +17164 +5601 +57 +590 +17165 +22 +4055 +137 +3335 +16197 +5067 +17166 +43 +17167 +48 +1232 +323 +9578 +823 +17168 +17169 +57 +10 +554 +17170 +618 +17171 +15914 +48 +17172 +2410 +14477 +16437 +43 +16589 +10147 +6950 +9427 +533 +201 +43 +17173 +931 +76 +17174 +19 +12987 +17175 +17176 +16826 +845 +17177 +17178 +17179 +15718 +17180 +14660 +286 +1612 +17181 +586 +43 +48 +17182 +16866 +17183 +17184 +17185 +3546 +2872 +2260 +17186 +17187 +17188 +17189 +114 +286 +3546 +270 +16436 +2260 +17190 +590 +43 +5409 +17191 +1513 +48 +14363 +17192 +9103 +15718 +16640 +48 +43 +48 +43 +17193 +15718 +48 +17194 +43 +17195 +4760 +14 +17196 +17197 +989 +43 +14825 +17198 +736 +57 +17199 +365 +17200 +17201 +17202 +43 +741 +590 +17203 +17204 +8668 +5582 +17205 +14185 +17136 +48 +17206 +4364 +3546 +43 +48 +2260 +43 +14 +14 +17011 +15718 +43 +6518 +1606 +209 +43 +1870 +1048 +32 +14 +17207 +17208 +17209 +12267 +16437 +1011 +14 +17210 +43 +5785 +9 +17211 +17212 +43 +1291 +17213 +2787 +89 +791 +17214 +1232 +10 +25 +14538 +17215 +14 +4803 +6505 +17216 +647 +17217 +188 +17218 +48 +17219 +399 +3999 +564 +317 +590 +188 +17220 +17221 +1912 +1924 +17222 +3553 +17223 +17224 +17225 +415 +17226 +694 +17227 +17228 +17229 +48 +474 +17230 +2 +178 +560 +17231 +17232 +17233 +5675 +17234 +2560 +22 +17235 +43 +2430 +17236 +17237 +17238 +17239 +2790 +10 +4908 +19 +17240 +48 +17241 +17242 +17243 +1232 +99 +10 +19 +1577 +43 +48 +17244 +17245 +14477 +736 +17246 +17247 +9 +43 +17248 +43 +844 +5344 +17249 +8566 +43 +14048 +1222 +17250 +112 +3417 +14185 +265 +736 +17251 +43 +8566 +17252 +48 +57 +2733 +590 +17253 +15824 +17254 +1154 +4028 +17255 +590 +16092 +17256 +17257 +9 +17258 +590 +6341 +286 +2316 +17259 +14 +5080 +7872 +48 +14 +1765 +57 +5780 +17260 +365 +17261 +22 +17262 +17263 +48 +1172 +17264 +43 +48 +48 +17265 +272 +43 +17266 +1765 +590 +155 +17267 +2577 +17268 +17269 +17270 +209 +48 +17271 +17272 +17273 +43 +43 +57 +7835 +14 +14185 +17274 +17275 +286 +2728 +16014 +590 +1529 +17276 +43 +17277 +43 +8994 +17278 +17279 +17280 +9410 +1224 +1961 +43 +1531 +5119 +17281 +43 +9784 +398 +5780 +2550 +14 +152 +736 +17282 +1051 +32 +14604 +647 +48 +201 +43 +17283 +2476 +1615 +12402 +48 +14 +17284 +48 +9 +17285 +1559 +17286 +17287 +17288 +5192 +595 +9705 +823 +17289 +707 +3050 +823 +1924 +17290 +16437 +48 +48 +17291 +43 +17292 +12404 +1154 +17293 +349 +14477 +358 +17294 +665 +17295 +17296 +43 +14 +741 +17297 +14 +43 +1376 +35 +1300 +14 +11286 +11757 +14001 +17298 +48 +15718 +17299 +736 +17300 +3599 +2697 +9 +12220 +17301 +17302 +19 +17303 +228 +590 +2577 +76 +17304 +12966 +4028 +43 +590 +590 +17305 +17306 +16437 +3543 +741 +17307 +14 +713 +14 +1232 +4313 +48 +14 +17308 +17309 +48 +48 +3546 +8301 +14871 +228 +17310 +5169 +48 +1115 +14 +1817 +3546 +1855 +736 +822 +3480 +17311 +15718 +741 +590 +43 +286 +1889 +17312 +365 +17313 +155 +22 +17314 +43 +15426 +12 +15718 +17315 +15 +6732 +1862 +17316 +5780 +17317 +17318 +17319 +48 +590 +17320 +15975 +43 +17321 +17322 +14 +17323 +17324 +5175 +43 +1605 +76 +43 +416 +17325 +17326 +17327 +349 +17328 +17329 +43 +17330 +14 +323 +17331 +17332 +1249 +97 +209 +17333 +17334 +3546 +17335 +17336 +32 +17337 +13307 +17338 +112 +17339 +17340 +14185 +17341 +43 +48 +2035 +17055 +22 +17342 +43 +10789 +17343 +17344 +17345 +17346 +17347 +17348 +17349 +32 +278 +15026 +17350 +10 +17351 +1524 +17352 +1229 +1615 +17353 +15718 +32 +736 +446 +2577 +17354 +491 +1612 +590 +17355 +43 +564 +2833 +1013 +3546 +43 +15718 +3546 +14 +9 +3484 +17356 +17357 +554 +17358 +17359 +590 +17360 +2733 +17361 +17362 +14 +493 +15 +17363 +122 +2913 +573 +4028 +17364 +17365 +12 +4963 +590 +22 +3417 +464 +8188 +17366 +1157 +43 +9 +17367 +1907 +323 +17368 +17369 +2117 +10230 +12987 +12534 +17370 +17371 +2202 +15586 +17372 +22 +17373 +1051 +17374 +17375 +17376 +17377 +16640 +358 +590 +14477 +43 +14 +590 +17378 +17379 +43 +14 +17380 +17381 +17382 +17073 +15718 +1232 +12351 +12005 +16437 +17383 +1287 +590 +14477 +1090 +17384 +272 +17385 +43 +20 +17386 +14477 +4684 +1287 +2577 +8249 +11471 +11593 +6776 +17387 +554 +17388 +17389 +20 +13913 +15718 +17390 +379 +17391 +17392 +9 +17235 +3546 +989 +720 +349 +2035 +741 +1502 +43 +6518 +20 +17393 +17394 +17395 +43 +3546 +17396 +112 +14 +17397 +4765 +17398 +9 +14 +5920 +5381 +501 +590 +3546 +17399 +17400 +671 +3546 +17401 +2577 +17402 +823 +17403 +17404 +19 +2286 +17405 +1542 +17406 +1051 +6294 +2349 +5627 +196 +1234 +17407 +10 +1021 +17408 +590 +2410 +16826 +284 +10673 +17409 +86 +17410 +2476 +17411 +12120 +14001 +43 +17412 +4765 +17413 +17414 +1369 +17415 +17416 +14001 +57 +15122 +17417 +16089 +1232 +2064 +17413 +17418 +616 +17419 +17420 +597 +2739 +358 +43 +248 +43 +43 +736 +3790 +17421 +17422 +8566 +16437 +19 +590 +11762 +15718 +17423 +9 +736 +43 +29 +5920 +17424 +17425 +16604 +3546 +14868 +17426 +3287 +349 +17427 +17428 +17429 +48 +286 +15 +2009 +43 +14 +1578 +2389 +17430 +43 +736 +176 +3034 +17431 +17432 +201 +17433 +12299 +43 +349 +11754 +17434 +43 +764 +484 +17435 +19 +17436 +683 +19 +188 +5611 +14 +14 +14 +179 +1112 +2308 +17437 +11685 +141 +17438 +14603 +17439 +590 +43 +17440 +13974 +17441 +337 +15718 +284 +349 +4521 +17442 +16604 +17443 +646 +17413 +17444 +2324 +17356 +3546 +43 +17445 +590 +43 +17446 +16102 +14067 +16437 +17447 +416 +43 +17448 +17449 +17450 +17451 +590 +17452 +17453 +2315 +17454 +43 +17455 +43 +590 +17456 +46 +48 +13529 +4153 +590 +15 +17457 +12062 +349 +2 +2849 +354 +14161 +1543 +640 +17458 +15824 +590 +3546 +17459 +590 +284 +2577 +48 +17460 +48 +6468 +17461 +17462 +590 +590 +17463 +30 +6950 +736 +17464 +14477 +17465 +17466 +17467 +43 +892 +13325 +188 +14846 +3330 +9 +17468 +1688 +15308 +677 +14532 +17469 +1154 +3330 +32 +17470 +349 +9 +337 +713 +17471 +736 +1465 +696 +43 +213 +590 +286 +48 +17472 +1743 +17473 +17474 +17475 +17476 +6171 +152 +8367 +112 +14 +1232 +2 +16003 +590 +48 +48 +48 +43 +554 +15217 +43 +48 +48 +77 +17477 +14001 +9 +43 +17478 +17479 +213 +6505 +1605 +17480 +48 +17481 +590 +3080 +43 +9 +590 +17482 +13030 +8188 +22 +17483 +17484 +14477 +14 +43 +15 +6617 +123 +17485 +713 +4028 +57 +17486 +1013 +849 +17487 +43 +17488 +1920 +22 +971 +16866 +17489 +9842 +43 +17490 +1605 +7276 +43 +736 +590 +17491 +2 +10 +17492 +138 +17493 +17494 +17495 +17496 +43 +48 +43 +1637 +5446 +57 +48 +741 +13430 +48 +284 +9 +17497 +286 +48 +694 +17470 +17498 +17499 +57 +2009 +6406 +1047 +17500 +43 +3072 +179 +43 +32 +887 +13569 +286 +15951 +14 +43 +3546 +822 +694 +48 +17501 +1442 +349 +2655 +5908 +17228 +15583 +155 +17502 +17503 +48 +1056 +590 +17504 +16190 +17505 +48 +4441 +17506 +17507 +1513 +3546 +8668 +6877 +17508 +155 +17509 +17510 +17511 +9259 +17512 +43 +17513 +1716 +590 +5627 +15797 +16981 +15881 +3743 +8469 +17514 +8188 +32 +14 +590 +14 +14841 +17515 +137 +112 +5080 +17516 +17517 +354 +48 +17518 +915 +17519 +17229 +99 +213 +17520 +213 +745 +17521 +17522 +4081 +17523 +17524 +141 +17525 +337 +1508 +17526 +43 +14189 +12013 +213 +14 +17527 +17528 +17529 +29 +736 +19 +17530 +8849 +564 +416 +17531 +17532 +209 +17533 +1364 +17534 +11483 +9 +17535 +17536 +8994 +43 +29 +43 +17537 +43 +115 +17538 +17539 +48 +16437 +12005 +17540 +2 +2356 +533 +17541 +7208 +1961 +2 +590 +958 +17542 +19 +14363 +337 +2864 +46 +475 +248 +43 +17543 +6214 +17544 +3546 +43 +17545 +14 +17546 +337 +17547 +17548 +17549 +17550 +17551 +484 +57 +282 +19 +17552 +17553 +14477 +17554 +13985 +590 +19 +14 +15718 +15592 +3415 +43 +3330 +741 +43 +48 +11995 +43 +57 +3034 +43 +77 +16102 +98 +1364 +17555 +17556 +971 +10 +8297 +17557 +272 +2260 +11483 +57 +14477 +17558 +13466 +284 +17559 +15718 +12120 +17560 +43 +17561 +15718 +17562 +17563 +4306 +647 +17564 +337 +48 +17565 +15334 +48 +14947 +1637 +337 +7154 +272 +213 +16437 +8392 +43 +337 +16437 +15718 +15 +10 +14 +17566 +17567 +558 +17568 +14 +3491 +8076 +48 +17569 +43 +1727 +4963 +3546 +590 +43 +17570 +17571 +5304 +303 +1112 +590 +17572 +17573 +17055 +17574 +17575 +590 +2577 +3546 +15718 +43 +736 +16437 +17576 +303 +19 +43 +17577 +57 +14363 +43 +112 +17578 +248 +11995 +17579 +17580 +14 +305 +590 +17581 +43 +286 +60 +12807 +20 +15718 +741 +1924 +46 +15718 +3626 +17582 +17583 +6058 +474 +4677 +15001 +188 +17584 +491 +48 +1799 +958 +43 +17585 +3329 +5627 +823 +424 +3553 +10757 +34 +19 +286 +17586 +14 +48 +11600 +43 +48 +43 +104 +11475 +17587 +17588 +17589 +17590 +1716 +12722 +14 +17591 +2136 +8297 +10843 +3572 +3546 +8670 +15718 +17592 +17593 +590 +19 +17594 +2042 +3553 +17595 +17596 +17597 +11754 +17598 +694 +590 +20 +17599 +17600 +17601 +8249 +17602 +10 +17603 +48 +43 +43 +9 +2035 +10356 +137 +14 +17604 +48 +17605 +9 +17606 +2006 +590 +14477 +358 +43 +17607 +17608 +20 +590 +17609 +14 +16437 +17610 +57 +17611 +17612 +3310 +14 +20 +12987 +286 +1051 +822 +15 +416 +14 +17613 +1524 +48 +5299 +17614 +188 +9118 +1513 +14 +17615 +5267 +43 +872 +17616 +196 +17617 +17618 +122 +17619 +14 +1912 +17620 +17621 +17622 +5780 +872 +8849 +43 +43 +66 +323 +17623 +155 +188 +1716 +17624 +736 +286 +1082 +43 +17625 +286 +17626 +43 +1423 +17627 +17628 +1992 +209 +590 +17629 +791 +17630 +1696 +17631 +17632 +42 +9 +17262 +17633 +17634 +15649 +15654 +17635 +17636 +770 +590 +43 +48 +14 +17637 +155 +2 +13492 +4313 +11522 +17638 +43 +48 +1172 +2525 +17639 +554 +189 +17640 +8867 +43 +11754 +590 +14 +170 +14102 +17151 +48 +17641 +590 +349 +790 +707 +3546 +43 +286 +17642 +238 +19 +17643 +349 +8566 +19 +17644 +990 +15 +14 +958 +8428 +67 +14189 +720 +15718 +648 +3546 +17645 +20 +16437 +17646 +822 +5085 +790 +161 +17647 +17648 +11817 +286 +17649 +17650 +32 +17651 +32 +17652 +17653 +16437 +15761 +500 +4441 +17654 +66 +16981 +417 +536 +48 +7855 +43 +14477 +590 +6214 +17655 +14 +17656 +5080 +19 +112 +554 +14604 +17657 +48 +3546 +17658 +43 +2975 +554 +9 +6011 +155 +48 +17659 +17596 +17660 +16437 +48 +48 +4313 +17136 +1648 +17661 +19 +4963 +9 +15718 +9 +7154 +1287 +48 +17662 +17663 +17664 +7783 +590 +176 +8668 +16437 +2769 +17665 +17666 +10 +15118 +17667 +2314 +764 +15718 +17668 +48 +43 +43 +43 +349 +6468 +48 +15320 +14604 +590 +17669 +694 +140 +17670 +19 +2769 +57 +15718 +15718 +1051 +48 +6571 +66 +112 +15 +1808 +112 +2 +1745 +3072 +10 +1112 +11754 +14604 +19 +13566 +554 +17671 +48 +17672 +43 +17673 +1330 +48 +140 +4808 +1710 +3484 +17674 +15 +9 +1961 +1232 +48 +5217 +17675 +554 +17676 +17677 +590 +57 +590 +15 +10 +16437 +14363 +15683 +97 +671 +590 +48 +613 +48 +1817 +14604 +3944 +17678 +17679 +365 +647 +17680 +17681 +17682 +17683 +5780 +17684 +12120 +15 +17685 +12987 +17686 +1203 +17687 +43 +17688 +1018 +379 +17689 +2577 +12864 +8208 +272 +17097 +1612 +12600 +915 +17690 +2865 +16437 +43 +17691 +17692 +736 +17693 +13711 +17694 +17695 +2697 +3546 +43 +17696 +43 +17697 +1384 +17698 +590 +15054 +590 +17699 +14 +14185 +872 +4278 +17700 +402 +2260 +19 +7860 +15 +491 +17701 +17702 +2202 +2577 +14 +11754 +43 +22 +16437 +2694 +536 +1401 +17703 +323 +5088 +19 +1066 +590 +43 +43 +7580 +17704 +7253 +12202 +17705 +1927 +115 +14 +10 +590 +7812 +17706 +17707 +17708 +17709 +17710 +17711 +210 +17712 +17713 +43 +17714 +352 +590 +16305 +10993 +17715 +89 +15 +741 +138 +22 +736 +590 +17716 +590 +17717 +533 +15493 +2253 +17718 +43 +48 +720 +4684 +48 +17719 +17720 +2733 +17721 +17722 +35 +3005 +60 +17723 +17724 +15824 +17725 +2 +1134 +8188 +17726 +4929 +17727 +17728 +3546 +17729 +1437 +3653 +17730 +17731 +17732 +11754 +1559 +323 +15718 +17733 +17734 +17735 +17736 +17737 +1203 +17738 +665 +17739 +48 +6900 +17740 +14 +590 +48 +179 +17741 +736 +16437 +669 +464 +1013 +16150 +17742 +1578 +15853 +1514 +17743 +43 +16844 +17744 +12404 +14 +152 +1765 +48 +14477 +17745 +11321 +43 +11754 +16719 +14477 +2314 +5403 +17746 +15718 +1559 +14007 +1425 +19 +17747 +17748 +736 +4760 +80 +48 +3544 +17749 +80 +573 +15718 +2537 +892 +17750 +57 +17751 +554 +10 +17752 +14079 +5780 +17753 +17754 +43 +10028 +17755 +43 +1021 +1847 +1091 +17756 +17757 +14 +1425 +5780 +12987 +17758 +13375 +17759 +1112 +19 +17760 +14 +17761 +17762 +43 +3546 +14477 +13349 +48 +13282 +17763 +43 +2619 +1442 +413 +12402 +1559 +17764 +66 +2577 +349 +817 +43 +16443 +14957 +2941 +43 +1612 +3077 +3034 +17765 +2561 +48 +16024 +9 +17766 +817 +42 +48 +48 +17767 +17768 +17769 +1169 +17770 +17771 +17772 +14679 +17773 +17774 +12987 +736 +17775 +15718 +1049 +14 +1425 +590 +43 +8208 +1384 +17776 +43 +17777 +1992 +14935 +541 +17778 +15148 +2577 +349 +349 +17779 +17780 +17781 +17782 +17783 +19 +305 +428 +665 +17784 +48 +17785 +17786 +15928 +17787 +17788 +3546 +3546 +14 +11593 +48 +17789 +647 +533 +17790 +286 +17791 +590 +14 +17792 +4963 +76 +193 +17793 +272 +17794 +741 +1011 +1808 +590 +4269 +17795 +12 +15718 +2392 +104 +16927 +17796 +647 +5041 +14 +17797 +590 +4196 +48 +647 +12241 +17466 +17798 +15 +1232 +17799 +66 +17800 +3279 +764 +14693 +2764 +8263 +43 +48 +34 +14477 +590 +2336 +3546 +305 +15989 +5780 +178 +17801 +17802 +17803 +17804 +1442 +15718 +32 +140 +17805 +590 +17806 +590 +2476 +13209 +17807 +16437 +11593 +17808 +17809 +10946 +43 +17810 +590 +17811 +15718 +590 +13179 +48 +14 +17812 +2 +48 +17813 +15718 +705 +17814 +3546 +1181 +2000 +98 +1232 +14 +152 +17815 +17816 +14604 +43 +17817 +17818 +185 +5780 +590 +738 +12684 +12722 +4808 +17819 +17820 +17821 +15 +17822 +17823 +6804 +17824 +14 +14 +17825 +817 +338 +1793 +60 +14 +17826 +14 +57 +736 +17827 +2769 +17828 +17829 +17830 +3546 +43 +741 +590 +14363 +590 +17831 +4963 +10789 +17602 +971 +9 +15874 +17832 +14 +13528 +17833 +3546 +16437 +736 +17834 +14 +3172 +1559 +17835 +17836 +16640 +9 +43 +14 +48 +590 +3 +17837 +415 +43 +9660 +155 +17838 +17839 +17840 +9 +590 +17841 +43 +17842 +15718 +17843 +11733 +32 +48 +201 +43 +17844 +43 +14477 +9 +57 +554 +16180 +48 +17845 +554 +14 +1091 +6953 +17846 +9945 +14872 +14603 +15718 +17847 +17848 +590 +15718 +2477 +209 +43 +17849 +112 +35 +8214 +225 +2064 +17850 +17381 +648 +17851 +15718 +17852 +17853 +6950 +17854 +155 +478 +43 +17855 +48 +14082 +357 +590 +57 +1090 +14 +17856 +861 +17857 +3546 +1563 +43 +17858 +14 +17859 +358 +2594 +17860 +17861 +1425 +17862 +2982 +17863 +6776 +155 +48 +19 +590 +17864 +19 +1356 +17865 +17866 +16437 +17867 +17868 +2035 +17869 +43 +17870 +590 +3316 +910 +15308 +736 +717 +32 +370 +109 +349 +17871 +9119 +2043 +17872 +16020 +14 +2 +48 +17873 +17874 +2 +8188 +17875 +13566 +15 +349 +14604 +43 +17876 +17877 +17878 +14 +286 +17879 +493 +17880 +4524 +48 +17881 +17882 +11754 +14 +17883 +17884 +15 +590 +43 +1154 +15797 +17885 +17886 +14603 +533 +15718 +484 +17887 +43 +43 +14560 +2804 +11483 +590 +43 +48 +14603 +19 +17888 +1157 +17889 +57 +9 +17890 +6537 +48 +10642 +4128 +7624 +3543 +17891 +8188 +48 +17892 +686 +17893 +17894 +17895 +14 +57 +17770 +17896 +4650 +43 +17897 +1295 +590 +590 +20 +48 +14477 +16413 +17898 +48 +43 +849 +17899 +849 +17900 +15 +155 +248 +736 +17901 +2721 +17902 +17903 +17904 +6785 +43 +10 +4963 +43 +17905 +20 +17906 +48 +155 +188 +213 +17907 +155 +3546 +188 +303 +16927 +17908 +17909 +17910 +14604 +17911 +43 +741 +416 +590 +17912 +3546 +1425 +3546 +14 +597 +349 +3546 +43 +16128 +48 +286 +873 +736 +17913 +19 +43 +345 +349 +22 +15 +17914 +554 +2029 +5169 +17915 +43 +17916 +17917 +590 +1612 +48 +337 +17918 +1716 +43 +16464 +14 +17919 +43 +17920 +17921 +12158 +13307 +15718 +155 +2314 +17922 +17923 +17924 +17 +248 +48 +17925 +14363 +1696 +17926 +32 +17927 +17928 +6935 +35 +43 +17929 +17930 +13150 +590 +1680 +17931 +10028 +11966 +16696 +323 +2804 +590 +736 +17932 +17933 +11754 +155 +43 +1232 +590 +43 +17934 +3546 +2035 +20 +8685 +20 +11593 +8610 +2318 +7239 +66 +43 +6214 +43 +43 +137 +17935 +17936 +2804 +647 +17937 +48 +590 +43 +3546 +3553 +16437 +861 +17938 +736 +823 +17939 +286 +1465 +14 +13375 +2791 +1222 +823 +554 +17940 +736 +1559 +17941 +8297 +16826 +7137 +286 +2733 +1902 +13282 +10356 +89 +936 +17942 +1181 +17943 +14406 +17944 +17945 +17946 +647 +17947 +17948 +32 +17949 +17950 +17951 +32 +43 +43 +17952 +284 +15 +17953 +464 +22 +80 +3330 +736 +9 +5780 +43 +17954 +17955 +17956 +17957 +17958 +32 +155 +8668 +13317 +399 +43 +17959 +2593 +3546 +736 +2567 +11762 +48 +19 +1082 +1011 +15 +17960 +3059 +43 +6765 +769 +1817 +17872 +17663 +15 +248 +5027 +17961 +590 +42 +36 +13484 +5601 +741 +3034 +12722 +17962 +17963 +17964 +17965 +43 +17966 +48 +17967 +43 +43 +572 +48 +19 +16844 +736 +43 +43 +13484 +17968 +1513 +17969 +43 +5780 +48 +1139 +17970 +17971 +303 +17972 +303 +17973 +17974 +17975 +736 +17976 +17977 +17978 +9 +48 +357 +11762 +17979 +17980 +43 +17981 +17982 +43 +12560 +397 +17983 +1920 +17984 +284 +17985 +17986 +213 +48 +478 +17987 +6114 +48 +48 +3546 +248 +20 +286 +14 +248 +736 +7448 +4963 +4963 +19 +14 +865 +590 +365 +17988 +17989 +323 +248 +43 +736 +17990 +764 +955 +17991 +22 +13459 +32 +4461 +152 +48 +48 +188 +17992 +14 +11176 +1051 +213 +736 +17993 +17994 +43 +3546 +1577 +736 +15718 +10510 +17995 +823 +17996 +17997 +17998 +590 +16696 +590 +43 +43 +14477 +15718 +16239 +17999 +18000 +18001 +18002 +18003 +18004 +3460 +18005 +43 +18006 +873 +17412 +18007 +5601 +19 +18008 +18009 +18010 +43 +18011 +48 +721 +286 +13807 +5780 +3546 +14001 +18012 +6400 +18013 +18014 +19 +2591 +4684 +155 +18015 +18016 +5780 +2258 +18017 +18018 +18019 +14981 +3491 +12319 +9 +18020 +18021 +188 +2314 +286 +18022 +18023 +18024 +13431 +18025 +18012 +18026 +286 +286 +18027 +1287 +554 +2045 +707 +155 +18028 +9 +43 +18029 +18030 +3353 +14 +18012 +3546 +1091 +590 +209 +18031 +790 +18032 +32 +98 +43 +18033 +32 +770 +18034 +13730 +18035 +15031 +18036 +18037 +18038 +14 +18039 +14477 +18040 +358 +18041 +7137 +18042 +18043 +43 +6883 +19 +3 +741 +1107 +19 +14693 +18044 +201 +18045 +14 +112 +3546 +18046 +43 +18047 +12397 +18048 +43 +365 +18049 +13466 +10 +32 +18050 +43 +43 +188 +15720 +528 +48 +7978 +20 +11762 +18051 +201 +98 +18052 +590 +18053 +209 +6531 +3546 +18054 +18055 +1013 +915 +647 +616 +18056 +17370 +554 +18057 +8218 +3546 +286 +209 +57 +554 +18058 +48 +18059 +14604 +18060 +18061 +18062 +2314 +2026 +111 +48 +1824 +3732 +18063 +48 +48 +43 +15285 +931 +43 +4028 +18064 +3546 +14 +18065 +18066 +12989 +3546 +43 +18067 +18068 +590 +19 +43 +18069 +18070 +15718 +338 +8668 +590 +18071 +48 +15268 +3287 +43 +349 +736 +18072 +3447 +15718 +1247 +323 +17728 +18073 +43 +18074 +17675 +180 +349 +112 +18075 +43 +18076 +590 +1437 +3546 +43 +3034 +14604 +7137 +18077 +18078 +18079 +15 +16937 +17480 +11483 +1048 +16014 +18080 +349 +3598 +554 +18081 +18082 +57 +43 +43 +14 +590 +764 +18083 +15 +48 +16437 +188 +4 +138 +1481 +349 +18084 +9 +9 +741 +5780 +18085 +789 +18086 +5780 +17228 +18087 +14477 +18088 +15718 +10 +48 +10117 +4411 +18089 +178 +1300 +845 +18090 +19 +272 +349 +18091 +32 +1048 +14 +188 +10287 +77 +736 +11762 +1542 +80 +48 +18092 +43 +18093 +9371 +741 +18094 +554 +4070 +48 +349 +15718 +18095 +48 +18096 +201 +14 +694 +3944 +18097 +2 +9 +2762 +286 +112 +590 +18098 +3553 +18099 +43 +15718 +13599 +349 +18100 +18101 +18102 +1446 +1547 +250 +590 +2 +18103 +19 +5188 +18104 +18105 +46 +14 +18106 +10 +3 +18107 +43 +8053 +1955 +590 +18108 +11762 +15 +8320 +18109 +18110 +14871 +43 +48 +18111 +18112 +16180 +18113 +3976 +286 +1710 +1870 +590 +18114 +15 +18115 +43 +43 +6950 +43 +3351 +18116 +19 +14420 +48 +6950 +18117 +590 +222 +19 +1232 +7451 +43 +18118 +1991 +16437 +286 +647 +18119 +15718 +13150 +18120 +2476 +736 +18121 +18122 +18123 +14 +272 +5780 +14604 +18124 +48 +1868 +9 +18125 +12344 +2287 +647 +43 +18126 +18127 +2591 +18128 +3546 +554 +590 +18129 +13179 +16437 +18130 +15718 +18131 +122 +5650 +2459 +1364 +18132 +2035 +1502 +1310 +536 +66 +1989 +3546 +590 +16014 +14 +7537 +14604 +112 +1824 +16437 +48 +18133 +1912 +554 +18134 +18135 +66 +18136 +4315 +152 +647 +18137 +10 +13913 +18138 +14 +1112 +349 +3546 +6766 +43 +12987 +13566 +590 +18139 +4441 +32 +554 +18140 +18141 +18142 +647 +18143 +16102 +18144 +43 +98 +18145 +2 +14186 +18146 +43 +590 +18147 +694 +18148 +1425 +18149 +590 +736 +18150 +286 +17749 +590 +48 +32 +46 +43 +1465 +411 +3462 +32 +18151 +18152 +14001 +2892 +349 +14386 +15540 +18153 +57 +13179 +48 +18154 +18155 +14616 +11283 +286 +18156 +788 +2325 +48 +66 +112 +18157 +2975 +1912 +15 +2410 +323 +18158 +14102 +249 +7624 +16437 +3546 +11860 +14477 +19 +48 +3546 +18159 +48 +18160 +18161 +12013 +119 +15530 +18162 +573 +60 +18163 +18164 +48 +18165 +1648 +741 +18166 +18167 +817 +48 +15820 +305 +249 +18168 +1112 +18169 +43 +18170 +249 +349 +18171 +18172 +32 +3 +15 +18173 +18174 +1513 +590 +1021 +9 +18175 +15718 +18176 +48 +32 +43 +20 +14 +43 +18177 +137 +590 +18178 +18179 +76 +57 +43 +717 +18180 +13150 +590 +18181 +1060 +18182 +703 +18183 +18184 +18185 +18186 +18187 +18188 +48 +18189 +18190 +18191 +18192 +9 +1011 +89 +9 +8367 +915 +15718 +18193 +43 +18194 +18195 +349 +13150 +958 +18196 +43 +590 +18197 +17303 +18198 +3034 +43 +18199 +4160 +43 +48 +5780 +5990 +14363 +7747 +43 +14007 +1920 +19 +3546 +3546 +6457 +18200 +10 +18201 +4793 +15877 +8392 +18202 +18203 +18204 +5623 +3546 +305 +18205 +7137 +176 +22 +18206 +15718 +13343 +201 +18207 +590 +15720 +43 +18208 +18209 +18210 +18211 +18212 +3546 +18213 +48 +11754 +18045 +18214 +1907 +6874 +18215 +15718 +16437 +11312 +349 +2 +1612 +3546 +18216 +18217 +18218 +286 +15647 +18219 +15718 +590 +14 +48 +823 +412 +3546 +48 +18220 +18221 +18222 +18223 +1481 +18224 +6834 +18225 +18226 +8297 +1919 +17055 +18227 +18228 +416 +18229 +140 +228 +43 +18230 +2166 +2164 +18231 +1090 +1047 +18232 +10848 +16966 +18233 +20 +48 +18234 +89 +349 +12402 +13484 +43 +18235 +10356 +1361 +18236 +1912 +18237 +541 +492 +18238 +373 +43 +20 +613 +15718 +18239 +18240 +18241 +18012 +5780 +11754 +43 +18242 +430 +18243 +590 +14 +18244 +4820 +57 +849 +138 +1612 +4174 +590 +18245 +46 +18246 +370 +18247 +19 +16437 +989 +99 +18248 +14 +2 +18249 +14916 +43 +554 +736 +2260 +17033 +32 +1716 +16788 +18250 +7137 +43 +18251 +18252 +18253 +827 +8668 +18254 +77 +1790 +13375 +18255 +18256 +18257 +2694 +18258 +43 +14007 +13282 +18259 +18260 +18261 +18262 +18263 +9 +24 +18264 +18265 +43 +590 +14477 +18266 +14612 +18267 +590 +18268 +18269 +2476 +18270 +15989 +22 +18271 +18272 +14 +18273 +18274 +286 +3338 +3 +18275 +2197 +43 +18276 +57 +43 +18277 +590 +5007 +75 +18278 +18279 +18280 +333 +14 +18281 +18282 +590 +18283 +4677 +399 +18284 +1437 +112 +155 +970 +112 +18285 +19 +10979 +25 +15778 +18286 +8351 +18287 +43 +16329 +43 +18288 +19 +18289 +6214 +18290 +590 +18291 +349 +18292 +745 +18293 +43 +12845 +18294 +1013 +18295 +18296 +1425 +14 +10583 +14 +958 +2769 +14 +6883 +665 +18297 +18298 +6499 +18064 +259 +349 +18299 +18300 +18301 +764 +18302 +48 +14 +43 +590 +66 +18303 +18304 +18305 +14 +43 +301 +18306 +18307 +18308 +16656 +43 +342 +32 +18309 +193 +12247 +736 +18310 +18311 +1502 +18312 +12120 +11480 +18313 +279 +14 +736 +6785 +1578 +14693 +15718 +18314 +18315 +18316 +4001 +915 +358 +43 +18317 +18318 +286 +17698 +16437 +18319 +18320 +18321 +12005 +18322 +43 +349 +1901 +18323 +14 +19 +17557 +15718 +1232 +495 +24 +16 +1517 +11762 +2 +379 +12404 +18324 +18325 +1942 +43 +358 +13126 +18045 +12913 +279 +43 +6316 +1228 +13150 +18326 +6766 +18327 +43 +201 +3354 +188 +3546 +18328 +333 +3546 +9 +9 +14 +43 +18329 +19 +1212 +16437 +4028 +155 +9 +286 +43 +43 +18330 +272 +6950 +1258 +80 +18331 +11754 +15718 +13664 +14 +14240 +18332 +18333 +43 +22 +1364 +188 +677 +14604 +1637 +18334 +18335 +32 +18336 +13459 +48 +18337 +3976 +590 +14 +509 +736 +590 +272 +10 +20 +1013 +626 +18338 +17868 +155 +18339 +188 +2000 +2577 +915 +6766 +18340 +16180 +2 +48 +15718 +286 +1604 +18341 +18342 +3 +43 +554 +18343 +43 +48 +18344 +14 +18345 +14420 +18346 +590 +8188 +18347 +18348 +18349 +18350 +18351 +3546 +222 +17868 +15718 +18352 +18353 +9 +43 +647 +14604 +10 +18354 +1992 +43 +14 +6794 +14477 +43 +14604 +1012 +20 +48 +43 +48 +18355 +18356 +548 +18357 +1236 +18358 +17635 +185 +14 +11306 +349 +19 +18359 +19 +2 +16437 +1765 +18360 +590 +48 +32 +2260 +4963 +48 +15718 +2430 +3066 +18361 +18362 +317 +9 +18363 +464 +4023 +18364 +43 +12987 +16437 +20 +155 +4077 +18365 +379 +14477 +18012 +745 +2314 +15718 +48 +2476 +6950 +17 +14 +2 +178 +112 +590 +43 +48 +349 +43 +5780 +1961 +188 +1234 +533 +18366 +18367 +22 +9 +15 +18368 +18369 +155 +18370 +18371 +155 +18372 +14 +14374 +18373 +19 +1920 +736 +12372 +554 +48 +3546 +18374 +18375 +18376 +286 +17253 +18377 +286 +15586 +590 +18378 +244 +48 +12404 +349 +18379 +18380 +590 +6776 +228 +2769 +18381 +6915 +16511 +18382 +43 +2 +5780 +3546 +18383 +3546 +155 +18384 +114 +2258 +736 +209 +3546 +3491 +474 +18045 +18385 +1655 +18386 +43 +43 +349 +590 +11670 +18387 +736 +145 +18388 +18389 +6011 +1502 +19 +12907 +43 +43 +1425 +18390 +590 +22 +13648 +2957 +927 +19 +14 +1531 +491 +11762 +16656 +736 +18391 +18392 +43 +43 +6400 +590 +20 +15 +15931 +20 +11822 +1817 +18393 +19 +18394 +141 +17136 +18395 +554 +18396 +18397 +7048 +5178 +138 +18398 +14710 +18399 +15718 +18400 +386 +1683 +18401 +16981 +18402 +17370 +17653 +613 +18403 +590 +1232 +18404 +18405 +5773 +19 +18406 +14477 +11480 +14 +18407 +272 +14 +99 +43 +1109 +14363 +958 +14001 +18408 +15951 +2 +43 +19 +8015 +560 +1047 +14645 +15586 +48 +16230 +48 +12178 +14856 +43 +43 +4155 +66 +15 +19 +18409 +57 +18410 +18411 +349 +1738 +18412 +48 +17119 +48 +14 +14477 +18413 +1765 +18414 +179 +17698 +286 +18415 +18416 +18417 +6344 +18418 +18419 +18420 +590 +2 +741 +14 +495 +5780 +18421 +349 +1716 +18422 +15 +16437 +301 +15486 +18423 +18424 +1976 +1991 +18425 +2197 +19 +222 +17602 +18426 +18427 +14515 +1924 +18428 +18429 +9 +43 +48 +18430 +2430 +590 +18431 +14 +6950 +18343 +57 +18432 +18433 +2694 +349 +18434 +358 +1021 +9 +3546 +590 +18435 +13566 +48 +8218 +32 +18436 +15819 +97 +48 +2733 +2324 +18437 +1566 +48 +1559 +809 +19 +43 +43 +14363 +10 +22 +373 +14532 +590 +18438 +43 +74 +17670 +43 +1364 +18439 +10485 +323 +10 +112 +16944 +19 +19 +5415 +18440 +18441 +8758 +18442 +6621 +18443 +18444 +18445 +18446 +12404 +1021 +18447 +152 +590 +18448 +590 +18449 +1223 +43 +764 +43 +764 +14 +14 +13393 +6874 +48 +18450 +398 +43 +14477 +14 +18451 +43 +18452 +15 +284 +18453 +5421 +11607 +18454 +32 +20 +18455 +18456 +43 +48 +554 +18457 +491 +14 +43 +5925 +18458 +213 +18459 +4028 +15718 +15 +18460 +17303 +4820 +18461 +14 +18462 +18463 +6243 +15718 +179 +2577 +284 +18464 +22 +18465 +43 +3546 +14477 +14 +18466 +18467 +32 +18468 +18469 +284 +19 +12907 +337 +18470 +590 +595 +43 +38 +18471 +14871 +1012 +4594 +12466 +18472 +590 +18473 +1426 +303 +736 +18474 +1612 +18475 +6950 +3655 +10028 +2525 +99 +741 +16014 +18476 +43 +9402 +349 +5780 +590 +18477 +18478 +741 +12258 +18479 +43 +1425 +10642 +590 +590 +4083 +14 +18406 +5469 +3546 +15718 +337 +16925 +18480 +18481 +18482 +365 +5780 +18483 +15718 +18484 +5264 +11341 +6669 +3546 +554 +613 +17046 +18485 +48 +337 +18486 +18487 +188 +38 +369 +18488 +19 +18489 +89 +3052 +18490 +18491 +14 +18492 +4285 +989 +43 +14604 +15718 +43 +18493 +3640 +18494 +590 +43 +18495 +1295 +590 +590 +736 +590 +48 +138 +18496 +1066 +48 +1356 +11754 +99 +43 +12005 +18497 +284 +18498 +286 +18499 +18500 +721 +18501 +14 +8668 +14 +18502 +19 +18503 +17385 +9389 +18504 +18505 +188 +43 +13913 +5409 +11822 +6518 +155 +736 +48 +349 +1738 +48 +415 +43 +18506 +18507 +284 +43 +19 +3130 +188 +18508 +18509 +18510 +16118 +18511 +16342 +3767 +845 +46 +18512 +43 +4151 +18513 +18514 +590 +3417 +248 +18002 +18515 +6214 +11754 +17941 +32 +18516 +12798 +57 +18012 +57 +18517 +18518 +2264 +18519 +16437 +18520 +48 +18521 +14 +19 +43 +14 +9 +18522 +9 +14693 +18523 +18524 +590 +5659 +541 +17871 +19 +1364 +58 +48 +18525 +14603 +2 +18526 +9649 +590 +3301 +18527 +19 +18528 +373 +6004 +18529 +19 +18530 +1013 +873 +18531 +665 +9 +286 +43 +32 +18532 +18533 +3546 +736 +18534 +18535 +16437 +18536 +493 +554 +155 +18537 +6011 +18538 +18539 +20 +18540 +18541 +736 +18542 +286 +111 +495 +201 +7053 +18543 +11321 +19 +415 +48 +43 +2971 +3 +48 +10 +48 +10601 +597 +18544 +48 +16944 +2707 +19 +354 +43 +18545 +18546 +48 +2593 +3546 +18547 +19 +19 +43 +18548 +12603 +43 +1749 +12 +43 +18549 +19 +18550 +349 +1021 +16527 +18551 +17 +18552 +18553 +80 +18554 +286 +43 +43 +5169 +9 +590 +1226 +43 +248 +349 +18555 +18556 +15 +35 +741 +2567 +286 +19 +18155 +14 +43 +43 +764 +15830 +18557 +48 +43 +2 +736 +43 +18558 +14603 +18559 +18560 +7379 +736 +2446 +11995 +18561 +18562 +872 +3546 +650 +48 +43 +43 +18563 +248 +18564 +446 +18565 +18566 +15718 +1310 +18567 +48 +18568 +152 +9979 +10 +4387 +9 +2348 +4083 +11593 +3 +7048 +464 +19 +19 +18569 +80 +18570 +19 +18571 +11762 +18572 +7964 +18573 +18574 +48 +138 +10 +18575 +736 +590 +43 +2042 +48 +17228 +590 +213 +284 +18576 +8098 +18577 +11571 +647 +764 +18578 +1559 +43 +18579 +18580 +2309 +590 +15718 +3 +3 +490 +16437 +4028 +213 +12722 +18581 +8098 +18582 +18583 +11822 +1112 +18584 +14477 +17173 +18585 +590 +10 +248 +18586 +2476 +48 +1425 +10262 +14 +4693 +18587 +5780 +18588 +18589 +15782 +378 +5438 +1847 +18590 +155 +18591 +12365 +8994 +18592 +18593 +2733 +18594 +18595 +18596 +18597 +18598 +5780 +18599 +286 +18600 +18601 +213 +14 +18602 +349 +1157 +303 +2325 +1157 +590 +123 +18603 +43 +18604 +741 +13282 +18605 +1013 +112 +11754 +9 +15683 +18606 +12987 +18607 +1157 +5438 +248 +1169 +18608 +554 +3944 +18609 +18610 +89 +43 +18611 +1018 +11762 +10930 +10262 +18612 +303 +43 +1870 +590 +1208 +48 +18613 +18614 +48 +713 +303 +349 +18615 +12621 +18616 +48 +18617 +18618 +3546 +99 +736 +43 +2026 +18619 +32 +286 +18620 +18621 +5253 +2577 +60 +590 +18622 +43 +741 +18623 +17670 +213 +43 +19 +18624 +6068 +18625 +736 +11011 +10 +222 +2577 +16437 +1912 +18626 +484 +337 +1688 +18627 +2029 +201 +669 +8351 +43 +18628 +18629 +741 +43 +18630 +583 +11963 +32 +18631 +10727 +11330 +3546 +2859 +3546 +16437 +18632 +48 +43 +57 +18633 +18634 +931 +736 +11537 +2694 +18635 +10 +13167 +18636 +9945 +1723 +11762 +43 +18637 +736 +5837 +18638 +123 +19 +18639 +18640 +14 +18641 +18642 +18643 +3546 +43 +155 +48 +3543 +18644 +11762 +7137 +14 +11364 +14886 +736 +18645 +14 +590 +18646 +18647 +12225 +8103 +18648 +18649 +201 +18650 +15 +22 +18651 +32 +18652 +14 +2281 +10028 +1961 +2577 +16180 +18653 +12661 +213 +152 +15718 +19 +18654 +9 +18655 +18656 +9 +43 +1310 +13150 +16637 +18657 +18658 +16117 +48 +1384 +48 +18659 +18660 +18661 +1112 +18662 +18663 +9 +43 +18664 +248 +18665 +1513 +18666 +590 +17557 +48 +651 +349 +201 +6950 +43 +18667 +48 +415 +32 +18668 +3 +533 +48 +5243 +43 +14 +1533 +18669 +764 +722 +1437 +18670 +18671 +12746 +43 +11483 +16981 +18672 +1907 +18673 +18674 +18675 +349 +19 +590 +590 +18676 +18677 +1612 +861 +14604 +2764 +80 +323 +18678 +349 +989 +18679 +19 +18680 +43 +1648 +4477 +18681 +18682 +43 +4364 +18683 +8992 +18684 +533 +18685 +286 +18686 +32 +18687 +201 +10 +269 +43 +736 +43 +7137 +18688 +18689 +1529 +48 +18690 +18691 +1749 +19 +1232 +48 +9 +15720 +18692 +2728 +18693 +1356 +18694 +57 +18695 +4028 +18696 +18697 +18698 +14477 +823 +14520 +48 +18699 +18700 +14771 +48 +8566 +18701 +14 +32 +8249 +155 +10028 +18702 +10 +272 +18703 +11321 +8280 +3546 +9 +48 +18695 +20 +12600 +18704 +519 +43 +3548 +48 +590 +278 +17859 +14 +16437 +4055 +16089 +18705 +18706 +1234 +2318 +2944 +736 +590 +741 +14515 +3408 +3 +48 +18707 +590 +590 +12304 +16925 +14363 +18708 +32 +34 +590 +248 +590 +18709 +43 +337 +1696 +8218 +2140 +15718 +1100 +18710 +3484 +18711 +18712 +286 +19 +647 +18713 +2672 +13228 +1889 +2724 +9 +8188 +15216 +14335 +2694 +18714 +12987 +15724 +590 +3546 +18715 +15 +18716 +6877 +57 +6952 +43 +18717 +18718 +18719 +1902 +48 +4364 +9 +1224 +18720 +48 +18721 +48 +48 +18722 +122 +14604 +18723 +4212 +286 +188 +5780 +32 +2672 +6950 +18724 +43 +14363 +18725 +12913 +57 +823 +1082 +18726 +18727 +18728 +141 +1605 +373 +2577 +2577 +18729 +1810 +18730 +18731 +6214 +18732 +43 +22 +4803 +18733 +736 +6463 +80 +18734 +48 +18735 +18736 +18737 +48 +18738 +18739 +305 +8297 +43 +2040 +5426 +3546 +590 +815 +5599 +823 +17571 +18740 +12832 +272 +18741 +18742 +464 +18743 +18744 +286 +43 +286 +18745 +5908 +18746 +3 +18747 +11754 +3 +43 +3553 +18748 +349 +18749 +1011 +18750 +43 +3155 +20 +18751 +48 +554 +48 +5627 +242 +48 +18752 +14567 +18753 +4907 +48 +14 +43 +15989 +1245 +43 +2919 +14 +14 +18754 +713 +18755 +18756 +18757 +18758 +18759 +1115 +349 +6877 +80 +349 +12003 +3546 +43 +18760 +18761 +616 +18762 +43 +14477 +1612 +43 +1091 +590 +22 +1244 +323 +18763 +2202 +43 +18764 +12013 +18765 +18766 +15718 +18767 +4278 +43 +887 +5316 +349 +3546 +9 +18768 +764 +4116 +14 +3546 +533 +18769 +20 +352 +18770 +152 +48 +590 +323 +57 +18771 +15541 +22 +18772 +18773 +18774 +18775 +2939 +647 +48 +18776 +18777 +12120 +915 +32 +1615 +11013 +2314 +18778 +48 +6916 +590 +12120 +43 +18779 +11754 +155 +15718 +842 +1604 +18780 +48 +18781 +14 +201 +18782 +741 +48 +43 +18783 +349 +18784 +43 +18785 +5780 +18786 +48 +16881 +9 +16909 +590 +13599 +48 +18787 +2260 +741 +9 +5780 +18788 +1169 +3543 +1013 +741 +1051 +142 +18789 +18345 +8512 +845 +18790 +4814 +18791 +3391 +43 +18792 +48 +286 +48 +48 +18793 +14 +18794 +1912 +250 +18795 +349 +43 +43 +18796 +1559 +18797 +20 +357 +3476 +14001 +590 +15718 +18798 +18799 +43 +18800 +18801 +77 +665 +14 +48 +823 +188 +20 +43 +2430 +2325 +586 +18802 +411 +272 +2806 +18803 +57 +791 +13961 +14 +18804 +18805 +791 +18806 +1765 +590 +18807 +18808 +18809 +1181 +48 +7053 +18810 +201 +14 +3546 +823 +137 +18811 +14162 +155 +43 +4155 +5438 +16383 +3334 +13570 +18045 +18812 +16303 +18813 +823 +20 +43 +9 +318 +14 +590 +18814 +138 +17228 +399 +18815 +887 +349 +43 +821 +16437 +18816 +9543 +590 +18045 +222 +7215 +15384 +137 +2879 +18817 +286 +4963 +514 +349 +18818 +590 +6883 +6950 +2410 +14001 +3546 +32 +19 +43 +13656 +3252 +18819 +1560 +2561 +18037 +19 +9 +188 +764 +48 +32 +15054 +18820 +14477 +14 +647 +16234 +8668 +14603 +1226 +15442 +14 +9 +2577 +18821 +1232 +1425 +6987 +18822 +32 +18823 +43 +48 +3239 +286 +18824 +12987 +3078 +3543 +14 +19 +3546 +18825 +43 +14 +12402 +14477 +14 +48 +18826 +14240 +18827 +48 +18828 +12936 +18553 +18829 +18830 +18831 +736 +17508 +14 +13929 +18832 +43 +43 +349 +18833 +18834 +514 +764 +18835 +2577 +2260 +590 +32 +18836 +13710 +19 +18837 +15718 +18838 +17326 +43 +18839 +18840 +736 +590 +5780 +2129 +18841 +9543 +18842 +14001 +4313 +6950 +9784 +736 +18843 +18844 +736 +18597 +14 +590 +18845 +18846 +18847 +1743 +57 +12404 +48 +48 +18848 +11822 +12792 +18849 +18850 +1716 +11787 +4752 +5908 +16205 +19 +18851 +671 +112 +11593 +18852 +9254 +1559 +249 +18853 +18854 +5161 +18855 +301 +5966 +14203 +15398 +282 +3546 +590 +18856 +18857 +647 +1013 +2865 +18858 +18859 +14 +43 +365 +18860 +15572 +9 +15058 +18861 +48 +3546 +5780 +12479 +15718 +201 +18862 +2 +48 +6950 +18863 +1115 +590 +647 +22 +590 +1955 +18864 +18865 +18866 +9 +2042 +12308 +590 +595 +48 +18867 +18868 +48 +57 +18869 +18870 +48 +18871 +43 +9 +8253 +14477 +14603 +48 +18872 +18873 +665 +590 +16591 +17515 +18874 +736 +1300 +18875 +18876 +48 +15718 +18877 +43 +14 +16 +590 +42 +2896 +60 +3440 +18878 +112 +1149 +9 +349 +18879 +2023 +1612 +18880 +14 +7053 +2537 +18881 +2197 +43 +16437 +208 +18882 +18883 +2260 +18524 +7935 +48 +1566 +9 +3543 +18884 +18885 +43 +18886 +18887 +12987 +53 +18888 +15718 +5438 +1011 +43 +1674 +18889 +19 +18890 +738 +18891 +18892 +188 +18893 +14 +18894 +209 +18895 +57 +349 +18896 +18897 +43 +272 +9396 +10960 +43 +18898 +4414 +18899 +5920 +5188 +349 +18900 +18901 +536 +18902 +20 +18903 +43 +18904 +155 +18905 +18906 +10 +15718 +5169 +349 +19 +2274 +554 +5650 +9125 +1172 +2117 +12560 +397 +1559 +18907 +18908 +18909 +16788 +2372 +770 +590 +43 +1100 +13466 +18910 +323 +18911 +18912 +14 +18913 +9 +18914 +286 +16436 +1169 +18429 +155 +12661 +89 +18915 +8297 +11754 +2471 +3519 +15583 +18916 +323 +349 +18917 +18918 +18919 +11335 +18920 +18921 +1765 +590 +18922 +18923 +48 +3546 +18924 +14 +590 +43 +3 +18925 +3546 +18695 +18926 +17174 +1637 +18927 +18928 +3546 +3 +18929 +48 +7183 +48 +18930 +18931 +17571 +1442 +18932 +3353 +2253 +16981 +15989 +3958 +18933 +15054 +18934 +14 +2733 +43 +18935 +18936 +18937 +43 +18938 +18939 +9 +548 +18940 +18941 +14 +590 +43 +736 +736 +32 +43 +18942 +43 +48 +736 +770 +1100 +4616 +6877 +16437 +43 +3546 +2 +7117 +48 +15718 +590 +18943 +15907 +590 +3440 +590 +18944 +18945 +18946 +8668 +18947 +29 +19 +14 +18948 +3353 +989 +286 +20 +14 +18949 +18950 +2314 +6958 +18951 +616 +14477 +2728 +18952 +43 +18953 +18954 +1217 +18955 +9339 +43 +741 +18956 +14477 +18957 +7703 +18958 +14843 +284 +9 +18959 +370 +18960 +736 +18961 +2320 +323 +43 +18962 +2577 +48 +18963 +18964 +9 +115 +18965 +15718 +18966 +892 +9 +5791 +18967 +15026 +1950 +648 +2733 +18159 +3546 +18968 +18969 +19 +18970 +18971 +18972 +2697 +18973 +590 +77 +18974 +13205 +14 +12404 +155 +5217 +30 +284 +590 +18975 +18976 +35 +5755 +9 +842 +18977 +10 +13361 +18978 +7521 +7233 +1992 +15 +18979 +14666 +32 +590 +43 +17144 +286 +18980 +11754 +18981 +2035 +43 +18695 +18982 +14363 +6518 +18983 +11762 +43 +18984 +18985 +15068 +18986 +18987 +19 +616 +1291 +590 +1232 +10 +18988 +18989 +18990 +222 +268 +18991 +18992 +18993 +17 +303 +7053 +14 +19 +573 +2694 +25 +18980 +18994 +18995 +19 +18996 +18997 +248 +18998 +18999 +213 +2040 +12185 +48 +19000 +1562 +9465 +48 +43 +6499 +19001 +11754 +34 +19002 +9 +6915 +43 +39 +19003 +13529 +9 +707 +19004 +2 +3546 +248 +14604 +19005 +590 +17571 +1870 +3196 +4388 +6543 +22 +48 +9 +19006 +19007 +48 +19008 +155 +48 +19009 +19010 +19011 +3546 +19012 +196 +677 +22 +18695 +19013 +379 +10789 +19014 +19015 +10 +19016 +17177 +989 +19 +13848 +43 +19017 +19018 +77 +57 +19019 +19020 +155 +19021 +5469 +554 +3 +590 +48 +19022 +19023 +48 +590 +284 +1765 +201 +19024 +14 +19025 +19026 +1992 +43 +142 +3059 +6258 +19027 +3546 +19028 +19029 +15 +19030 +213 +1011 +1956 +19031 +43 +188 +188 +15718 +1013 +3926 +751 +533 +14 +7137 +2311 +11754 +19032 +677 +736 +590 +18695 +19033 +379 +19034 +15308 +19035 +19036 +43 +29 +43 +590 +48 +48 +25 +19 +14 +15 +3546 +19037 +13430 +8566 +19038 +3491 +19039 +19040 +9 +8392 +951 +1765 +286 +19041 +19042 +43 +19043 +9 +19044 +43 +694 +13375 +19045 +19046 +14 +19009 +16560 +2733 +19047 +303 +48 +5780 +5780 +5004 +736 +1738 +19048 +536 +19049 +14 +43 +1232 +1529 +48 +19050 +43 +1364 +8668 +48 +15 +19051 +533 +2398 +10 +19052 +17136 +19053 +1181 +19054 +19055 +14001 +15 +19056 +590 +2744 +8351 +19057 +19058 +19059 +19 +303 +5963 +3553 +19060 +48 +2 +19061 +14 +19062 +2019 +19063 +646 +19064 +19065 +3546 +3546 +284 +16 +14 +647 +9144 +770 +12397 +500 +590 +19066 +18045 +5662 +19067 +1434 +19068 +1100 +11762 +19069 +16437 +11283 +1559 +10933 +17801 +3407 +1765 +207 +43 +19070 +3411 +1217 +4803 +19071 +358 +2316 +43 +17871 +590 +19072 +13361 +1049 +19073 +19074 +15718 +19075 +9994 +590 +272 +590 +720 +14 +10 +10 +19076 +19077 +19 +272 +16092 +32 +15718 +19078 +3546 +19079 +19080 +19081 +15718 +9462 +741 +48 +19082 +1961 +16437 +19083 +284 +48 +19084 +19085 +19086 +19087 +155 +19088 +34 +372 +19089 +43 +19090 +57 +16205 +19091 +48 +303 +2019 +14477 +9688 +48 +10 +13361 +19092 +19093 +11822 +19094 +17136 +43 +9 +17653 +272 +48 +349 +209 +19095 +19096 +14477 +19097 +9 +43 +3239 +14 +14 +34 +10 +536 +19098 +19099 +646 +10094 +66 +5601 +7183 +19100 +57 +19101 +7752 +248 +7053 +19102 +112 +19103 +19104 +19 +9 +196 +155 +1051 +11971 +57 +17380 +1481 +43 +19105 +3546 +43 +7032 +43 +815 +19106 +817 +720 +98 +284 +1112 +1013 +19107 +48 +764 +19108 +1232 +20 +112 +19109 +19110 +671 +1745 +9 +19111 +19112 +14 +11321 +303 +19113 +464 +12260 +349 +19114 +201 +24 +2593 +1617 +43 +17698 +19115 +15718 +1559 +43 +179 +15718 +19116 +337 +736 +19117 +16437 +5579 +19118 +19119 +2865 +18896 +19120 +19121 +3353 +915 +554 +2476 +12746 +648 +188 +19122 +19123 +19124 +1223 +19125 +16437 +1562 +17868 +590 +1885 +19126 +1513 +936 +14025 +7053 +272 +19127 +188 +19128 +19046 +990 +736 +43 +19129 +647 +15 +15718 +18951 +19130 +19131 +536 +19132 +19133 +13648 +19134 +19135 +43 +19136 +19137 +19138 +19139 +8249 +19140 +590 +43 +179 +196 +43 +18869 +2430 +19141 +19142 +11321 +19143 +18325 +43 +43 +19144 +3546 +48 +3484 +19145 +284 +1869 +19146 +2577 +736 +2790 +32 +379 +19147 +2042 +19148 +683 +19149 +18940 +448 +15718 +19150 +474 +19151 +590 +32 +19152 +57 +3546 +19153 +823 +17752 +19154 +32 +1310 +19 +43 +43 +19155 +832 +19156 +19157 +19158 +2944 +2694 +19159 +19160 +6766 +32 +590 +43 +3546 +57 +19161 +19162 +19163 +104 +12987 +18334 +19164 +1710 +554 +19165 +11762 +43 +590 +19166 +8553 +43 +19167 +19168 +19 +6950 +1012 +43 +77 +1048 +284 +5391 +19169 +4803 +19170 +2 +286 +5217 +20 +48 +14 +19171 +2197 +741 +19172 +1385 +7137 +19173 +48 +5780 +3546 +43 +43 +284 +19174 +19 +590 +48 +43 +43 +1332 +8668 +19175 +19176 +14189 +19177 +15718 +43 +2694 +1852 +19178 +19179 +720 +6317 +284 +1562 +19180 +1637 +3875 +19181 +845 +43 +590 +349 +9 +7053 +337 +19182 +19 +303 +19183 +19184 +19185 +14363 +1012 +48 +613 +9 +19 +14477 +5344 +19186 +19187 +736 +286 +3546 +1082 +646 +142 +43 +19188 +6250 +155 +13955 +5780 +43 +3544 +683 +1972 +1559 +32 +13375 +3546 +19189 +19190 +12 +155 +19191 +19192 +12158 +2187 +19193 +19 +19194 +11697 +19195 +19196 +590 +1797 +915 +6994 +19197 +3067 +19 +14477 +3095 +4907 +43 +19198 +48 +9 +43 +736 +18928 +48 +19199 +18120 +17698 +20 +80 +104 +19 +3034 +19200 +48 +3 +14215 +19201 +5791 +19202 +18045 +43 +19203 +5204 +19204 +43 +10 +9 +19 +590 +707 +19205 +822 +17920 +19206 +741 +7137 +19207 +14477 +19208 +19209 +19210 +14 +19211 +590 +48 +8249 +19212 +19213 +590 +43 +2329 +48 +10381 +3906 +14 +1920 +19 +197 +19214 +14240 +4166 +17173 +8351 +19215 +377 +19216 +3546 +1823 +9 +14 +14 +18982 +19217 +48 +18695 +5041 +647 +19218 +19 +19219 +554 +3546 +11762 +249 +19 +19220 +19221 +43 +9 +11321 +19222 +19223 +764 +358 +12158 +19224 +48 +19225 +19226 +32 +43 +15718 +9 +19227 +48 +14066 +842 +590 +533 +43 +15001 +286 +19228 +19229 +14515 +411 +19230 +8668 +19231 +19232 +15718 +1559 +286 +155 +48 +48 +16349 +48 +19233 +19234 +19235 +18980 +590 +19236 +11754 +19237 +8807 +1384 +1605 +16437 +573 +38 +17206 +19238 +554 +57 +43 +19239 +3981 +573 +19240 +48 +1425 +19241 +3546 +19242 +43 +43 +19243 +19244 +19245 +48 +19246 +43 +32 +12807 +286 +2314 +590 +1765 +43 +1425 +7747 +19247 +19248 +1232 +19 +43 +5148 +19249 +286 +590 +5344 +19250 +9913 +1107 +736 +43 +13140 +646 +736 +19251 +15123 +19252 +16437 +2804 +4028 +104 +209 +22 +19253 +5780 +7137 +19254 +32 +19255 +5601 +9 +43 +14 +43 +19256 +7053 +19 +15718 +19257 +19258 +349 +43 +155 +155 +19259 +665 +19260 +155 +5623 +43 +3 +14 +19261 +19228 +14435 +19262 +19263 +19264 +1109 +179 +736 +14 +828 +43 +15649 +4634 +14 +19265 +15 +590 +201 +9 +736 +29 +155 +15718 +18980 +1082 +19266 +32 +19267 +20 +155 +14604 +19268 +9 +14957 +9 +19269 +590 +19270 +13807 +2577 +809 +286 +43 +176 +32 +736 +286 +12497 +19271 +43 +19272 +14 +1817 +736 +19273 +18869 +19274 +6143 +720 +33 +6531 +2 +48 +590 +17144 +19275 +19276 +1224 +1217 +155 +554 +677 +590 +14001 +18695 +14604 +5780 +19277 +669 +43 +590 +19278 +647 +14 +14 +683 +3 +9 +2721 +647 +43 +17093 +43 +80 +19279 +19280 +43 +6513 +19281 +1896 +140 +12987 +8131 +16951 +1961 +19282 +3484 +19283 +5808 +206 +19284 +647 +338 +43 +19285 +14 +764 +2187 +46 +3546 +1765 +197 +19286 +18300 +15718 +43 +1765 +19287 +17670 +1224 +19288 +19289 +590 +554 +19290 +43 +14477 +8244 +1668 +19291 +3376 +19292 +19293 +4388 +19294 +14 +19 +32 +590 +1376 +19295 +2287 +317 +48 +48 +19296 +14 +15718 +412 +19297 +43 +19298 +57 +19299 +5780 +19300 +13569 +19301 +19302 +19303 +19304 +1870 +43 +14 +5780 +43 +349 +43 +10592 +43 +272 +2 +228 +317 +19305 +2042 +286 +6877 +2463 +822 +19306 +5627 +19307 +19308 +590 +19309 +7053 +19310 +19 +590 +272 +2988 +736 +671 +16437 +48 +1991 +19311 +16437 +20 +19312 +15718 +14 +14916 +9400 +19313 +7053 +14 +13973 +1224 +8668 +286 +9 +4684 +14102 +4387 +16589 +590 +286 +19314 +1154 +19315 +225 +741 +1364 +2287 +19316 +19317 +4234 +14 +19318 +3546 +1352 +43 +46 +17571 +1352 +2064 +14 +15718 +1991 +19319 +19320 +43 +5391 +5168 +5780 +43 +43 +10 +19321 +1927 +19322 +533 +19323 +1559 +19324 +9 +19325 +12185 +38 +19 +19326 +590 +19327 +19328 +19329 +19330 +19331 +4053 +19332 +19333 +19334 +38 +15718 +29 +5007 +43 +43 +19335 +514 +14 +48 +112 +6766 +8566 +1543 +19336 +12987 +6950 +32 +19337 +19338 +272 +11762 +48 +48 +140 +18969 +14 +2724 +7208 +554 +48 +14 +2197 +19339 +19340 +19341 +14 +1107 +43 +286 +57 +15718 +19342 +19343 +19344 +1612 +14660 +48 +14 +14 +19345 +14962 +9 +19346 +14477 +19347 +19348 +43 +19349 +19350 +14 +19351 +19352 +19353 +2770 +616 +19354 +823 +19355 +19356 +736 +13943 +19357 +3546 +19358 +2287 +19359 +19360 +2865 +586 +5780 +20 +43 +48 +19361 +1524 +9 +590 +19362 +15718 +237 +19363 +155 +18846 +19364 +354 +415 +17112 +491 +19365 +397 +7253 +43 +19366 +8668 +9400 +19367 +43 +4963 +14477 +12923 +13566 +3421 +683 +43 +19368 +16012 +19369 +43 +19370 +112 +19371 +104 +1100 +19372 +19373 +43 +1696 +18954 +7053 +19374 +155 +493 +19 +1989 +43 +590 +3213 +43 +349 +349 +495 +19375 +9 +19376 +19377 +19378 +19 +15 +13532 +19379 +19380 +19381 +4 +43 +19382 +19383 +152 +19384 +19199 +17042 +48 +19385 +18299 +18982 +17602 +19386 +1012 +286 +12987 +48 +19387 +1886 +43 +237 +19388 +823 +19389 +12462 +43 +19390 +1920 +7053 +14 +19391 +2577 +19392 +14 +8508 +19393 +18951 +19394 +15718 +17027 +15 +19395 +2 +13769 +1232 +14689 +43 +19396 +322 +270 +19397 +36 +10500 +19398 +13807 +14 +13656 +16437 +2314 +19399 +14 +14527 +19400 +19401 +19402 +14 +43 +2446 +19 +6776 +597 +19403 +14884 +19404 +19405 +48 +590 +48 +19406 +745 +8218 +19407 +1655 +19408 +138 +736 +12907 +19409 +19410 +19411 +19 +43 +14102 +18045 +43 +2042 +19412 +514 +19413 +43 +16180 +8220 +19414 +19415 +15718 +398 +19416 +4963 +155 +2260 +15 +19417 +19418 +2197 +32 +18448 +43 +233 +18846 +1232 +19419 +19420 +19421 +14477 +19422 +43 +3875 +2035 +19423 +3546 +19424 +19425 +57 +14 +16240 +720 +6054 +43 +590 +14 +57 +19426 +34 +43 +2 +43 +19427 +14856 +19 +19 +8444 +38 +13182 +48 +89 +554 +19428 +14477 +19404 +19429 +19430 +14 +2577 +5088 +250 +1116 +3546 +19431 +188 +590 +9 +43 +19432 +43 +19404 +4918 +1051 +6341 +11210 +19433 +19434 +19435 +18045 +43 +5827 +19436 +536 +43 +720 +19437 +764 +19438 +286 +9396 +19439 +14599 +9024 +19 +5780 +14 +15 +14 +19440 +12807 +17608 +201 +48 +185 +19441 +9039 +12647 +155 +1976 +43 +19 +19442 +176 +823 +349 +3546 +15718 +14 +7117 +14363 +4963 +43 +19443 +583 +671 +16681 +299 +18695 +19444 +3569 +19445 +8668 +5217 +6766 +19446 +19447 +3553 +19448 +590 +140 +8668 +8855 +19167 +736 +10356 +15718 +15 +19449 +19450 +19451 +741 +43 +19452 +2882 +19453 +15718 +19454 +416 +19455 +19 +43 +19 +19456 +19457 +6400 +19458 +32 +3297 +18869 +19459 +6249 +8787 +12987 +19460 +1790 +43 +1051 +15975 +19461 +19462 +112 +720 +11963 +7053 +6766 +17508 +3546 +2 +19463 +19404 +1251 +19 +164 +1889 +19464 +823 +4803 +590 +2 +590 +19465 +8668 +736 +57 +11483 +19466 +19467 +43 +3484 +590 +2 +9 +19468 +188 +19469 +19470 +1912 +590 +12987 +43 +2577 +9 +3546 +140 +19471 +19472 +19473 +19474 +19475 +13361 +155 +48 +823 +16640 +22 +22 +478 +19476 +19477 +11646 +17043 +19478 +18980 +1091 +19479 +19480 +14603 +741 +2117 +554 +1444 +1120 +14604 +98 +11158 +19481 +11754 +43 +19482 +155 +155 +9 +19483 +19484 +19485 +53 +19486 +19487 +17281 +19488 +19489 +1817 +19490 +19491 +19492 +3546 +19493 +15718 +19494 +597 +43 +14804 +2 +2561 +6468 +19495 +19496 +13848 +19497 +590 +43 +43 +15718 +19105 +809 +2983 +57 +19498 +19499 +19500 +19501 +1798 +43 +19502 +707 +18163 +14 +18980 +14604 +11301 +43 +19503 +19504 +19505 +19 +17433 +43 +2121 +590 +19506 +6776 +19507 +15718 +19508 +19404 +19509 +9 +19510 +19511 +1011 +349 +16085 +15718 +7053 +17799 +13663 +14477 +464 +19512 +286 +57 +8392 +19513 +861 +249 +17730 +19514 +1559 +19 +8041 +19515 +8460 +43 +9259 +5208 +19516 +8367 +11428 +57 +19517 +15718 +14 +19518 +1912 +18695 +5298 +13954 +19519 +43 +590 +17635 +19520 +13375 +491 +43 +19521 +43 +5780 +14 +19522 +19523 +19524 +1578 +1542 +590 +286 +18695 +14 +4050 +5780 +19525 +16387 +19526 +19527 +43 +823 +590 +57 +9688 +43 +18982 +19 +10 +1021 +57 +14770 +18503 +19 +1561 +554 +14467 +10500 +2040 +19528 +616 +745 +19529 +43 +11754 +19530 +19531 +590 +43 +19532 +17972 +19 +514 +9 +43 +4803 +9 +13798 +209 +17314 +1524 +48 +43 +349 +43 +1244 +43 +19533 +19534 +19535 +137 +370 +958 +19536 +2 +3034 +16092 +19537 +19538 +188 +10 +13150 +590 +19539 +464 +8188 +15324 +590 +14 +373 +3484 +10287 +19540 +3030 +19541 +4907 +43 +138 +19542 +590 +19543 +354 +15572 +1817 +8895 +19 +18980 +19544 +19545 +19 +19546 +590 +19547 +196 +19 +19548 +197 +7855 +15 +19549 +613 +8668 +19550 +19551 +625 +19552 +14 +8220 +43 +18951 +8110 +4963 +1765 +4963 +19553 +736 +155 +19554 +19555 +2415 +20 +2804 +590 +19556 +32 +16118 +16283 +13915 +2406 +19557 +19558 +493 +19559 +13361 +19560 +43 +19404 +19561 +19562 +5561 +43 +22 +590 +736 +19563 +349 +19564 +43 +155 +43 +3876 +1481 +1100 +19565 +398 +19566 +715 +1471 +3546 +1710 +19567 +15874 +6950 +19568 +19569 +14 +590 +19570 +3251 +19571 +14843 +19572 +514 +112 +9 +19573 +15718 +19 +19 +155 +11593 +16437 +249 +19574 +42 +301 +43 +6086 +9 +590 +971 +3546 +19575 +809 +19576 +536 +19577 +1810 +19578 +3546 +349 +7053 +4028 +590 +5314 +3417 +736 +14 +19 +43 +14843 +8392 +14527 +15 +17342 +2624 +19579 +19580 +3492 +342 +122 +19581 +43 +19582 +5489 +43 +493 +43 +2561 +43 +19583 +19584 +19585 +19586 +19587 +15989 +43 +1112 +3546 +590 +19588 +4 +9 +2733 +19199 +19 +19589 +19590 +590 +19591 +19592 +3546 +48 +19593 +19 +1648 +339 +3546 +19594 +57 +19404 +19595 +590 +19596 +38 +19597 +19598 +741 +3546 +19599 +16329 +25 +18577 +1470 +15718 +5207 +19600 +5415 +43 +5780 +1502 +43 +590 +19601 +14477 +1481 +196 +19602 +43 +43 +1765 +4806 +15718 +9 +8668 +43 +12953 +19603 +19604 +19605 +827 +4821 +19606 +19607 +19335 +8668 +19608 +19609 +3944 +14 +19610 +19404 +19611 +548 +12777 +4411 +19612 +43 +19 +3546 +19 +6837 +19404 +43 +14477 +2 +19613 +19614 +541 +15 +590 +19615 +590 +4084 +19616 +89 +20 +19304 +35 +19617 +20 +19618 +14 +14 +8297 +1961 +647 +15718 +770 +5780 +19619 +19 +13466 +19620 +19 +365 +15718 +14477 +10 +19621 +19 +19622 +43 +6122 +2006 +736 +19623 +16437 +19624 +2035 +113 +155 +2260 +18774 +19625 +2260 +57 +13205 +284 +10 +19626 +19627 +590 +19628 +1295 +5780 +89 +358 +8392 +19618 +19629 +164 +19630 +19631 +16527 +89 +1232 +19 +5371 +19632 +19633 +19634 +15718 +9 +12987 +2859 +18695 +1688 +7110 +43 +1300 +19635 +14 +590 +15669 +1013 +19 +6883 +19 +48 +19 +13279 +19636 +43 +19637 +18742 +98 +17919 +2804 +43 +7377 +14 +57 +292 +19638 +43 +590 +19639 +43 +1604 +303 +19640 +15220 +19641 +14527 +736 +19642 +19643 +17032 +43 +286 +19644 +3519 +10899 +286 +19404 +137 +19056 +19618 +19645 +19646 +16437 +14240 +18100 +19647 +19648 +19649 +19650 +19651 +19652 +2672 +9567 +19653 +19404 +16866 +19654 +5169 +19655 +19656 +590 +134 +1870 +11762 +32 +349 +19657 +248 +248 +590 +1517 +19658 +2577 +337 +19659 +5211 +1765 +19660 +1768 +4905 +19661 +1696 +590 +3546 +19662 +3488 +19663 +1385 +14477 +736 +19664 +43 +19665 +533 +8355 +1901 +8244 +18980 +43 +3330 +18982 +12245 +15718 +13566 +446 +19666 +8853 +349 +284 +590 +7053 +337 +15737 +19667 +13465 +707 +14 +590 +1961 +15881 +19668 +373 +188 +14175 +352 +17941 +155 +19669 +43 +19670 +7328 +4722 +590 +1442 +349 +19432 +19671 +286 +9163 +357 +19672 +18045 +19673 +14477 +14 +9 +2197 +9 +19674 +9 +19675 +19676 +19677 +19678 +3546 +5188 +2029 +249 +8255 +3559 +349 +3546 +43 +16092 +19679 +17698 +337 +19680 +19 +14 +590 +590 +1104 +248 +19681 +19618 +19682 +9474 +19683 +19684 +15 +19685 +10 +533 +15054 +3546 +1228 +1606 +8953 +19686 +15 +7137 +15718 +11762 +303 +764 +823 +19687 +15924 +7137 +19688 +19689 +736 +823 +155 +19690 +3353 +19691 +19692 +17085 +19693 +3330 +3546 +286 +19694 +3546 +43 +209 +15 +590 +19695 +19696 +19697 +19698 +19699 +19 +337 +43 +19700 +19701 +704 +19702 +2593 +43 +57 +16102 +19703 +19704 +14342 +14660 +1605 +590 +19705 +19706 +19707 +19708 +19709 +19 +1090 +19710 +19 +43 +4684 +10 +32 +286 +7137 +152 +10356 +19711 +2051 +19712 +9 +317 +286 +2762 +20 +1310 +3546 +14 +2042 +57 +19713 +19714 +1112 +17608 +19715 +18982 +2593 +155 +14477 +16981 +3 +19 +2412 +19716 +19717 +24 +1955 +19718 +14185 +43 +6058 +19719 +19720 +590 +32 +19 +16866 +19721 +19722 +2356 +9400 +19655 +19723 +19724 +14369 +6095 +590 +736 +14 +43 +5267 +38 +707 +19725 +155 +8716 +155 +19726 +19727 +213 +19728 +19729 +665 +4793 +43 +7053 +18980 +590 +19730 +19731 +19732 +15718 +736 +286 +2804 +286 +19733 +19734 +286 +533 +19735 +19736 +19737 +19738 +9 +19739 +2310 +14527 +19655 +155 +1018 +43 +19740 +15 +2009 +19741 +9 +373 +286 +14477 +19199 +14 +12534 +19 +19742 +19743 +112 +2804 +2 +14477 +42 +19744 +491 +15718 +7053 +448 +137 +770 +1513 +590 +15718 +19745 +284 +6595 +22 +14 +19746 +19747 +19748 +19749 +484 +11970 +43 +19750 +5267 +19 +19751 +13343 +2314 +57 +19097 +19752 +18980 +91 +19753 +19754 +19755 +284 +1131 +19756 +19370 +19 +3546 +213 +16437 +9 +19757 +43 +19758 +822 +42 +19759 +43 +5410 +19760 +76 +3546 +16437 +15647 +19761 +43 +15718 +19762 +1514 +43 +272 +19763 +19764 +3275 +1710 +19765 +7053 +19766 +19092 +43 +3472 +11762 +19655 +19767 +19768 +19769 +6518 +16437 +8610 +19 +4411 +19770 +43 +19771 +19772 +19773 +188 +57 +8849 +8392 +249 +286 +1559 +9 +15384 +19774 +137 +15718 +19775 +3546 +35 +19776 +19777 +142 +19618 +3546 +19618 +43 +286 +3546 +590 +7291 +19778 +554 +3546 +14 +19779 +5080 +1812 +19 +590 +19780 +19781 +112 +1961 +9184 +3546 +9402 +18045 +9102 +6565 +971 +142 +7053 +12363 +377 +19618 +379 +19782 +19783 +19784 +10527 +9 +19785 +19786 +19 +16826 +19787 +19655 +16437 +15649 +19788 +1920 +19789 +19618 +6766 +13282 +12067 +19790 +19791 +3546 +3995 +19 +19618 +16272 +18321 +43 +14604 +13841 +188 +19792 +647 +19793 +19794 +590 +19795 +19796 +19797 +6504 +19798 +14 +14 +3546 +19799 +683 +10311 +1364 +464 +19800 +1765 +317 +5780 +201 +554 +7137 +19801 +19792 +15989 +19802 +19803 +1226 +19804 +19805 +823 +19806 +19807 +827 +1559 +19808 +349 +1013 +19809 +3310 +19810 +36 +19811 +19792 +19812 +19813 +705 +43 +19 +590 +19814 +6950 +1514 +13985 +19815 +18176 +57 +32 +10946 +19816 +8351 +17865 +19404 +19817 +19 +19818 +286 +9 +305 +19819 +4487 +284 +823 +155 +989 +5101 +590 +11483 +19820 +8721 +303 +7855 +213 +19821 +9 +248 +1513 +188 +43 +19822 +213 +411 +14 +4502 +19823 +6877 +337 +249 +34 +14 +19824 +19825 +19826 +20 +19827 +377 +16126 +14 +19828 +20 +19829 +303 +861 +284 +20 +13150 +1428 +213 +3546 +19830 +19831 +12101 +286 +14604 +248 +5780 +19832 +15718 +3353 +1011 +564 +19833 +303 +1425 +19655 +8392 +15886 +19834 +14 +19835 +3546 +19836 +6335 +5780 +4274 +3050 +19837 +10 +16437 +19618 +19838 +20 +15718 +19839 +736 +43 +19840 +4174 +14 +379 +2314 +7053 +19841 +19218 +2694 +15718 +1224 +286 +19806 +152 +9 +517 +18695 +19842 +19843 +1310 +8351 +2029 +19618 +19 +5780 +14477 +2006 +48 +9245 +19844 +14477 +14 +19618 +1560 +19845 +19846 +19042 +19847 +16437 +19848 +1924 +19849 +29 +19850 +19851 +19806 +2164 +57 +3790 +188 +1444 +8444 +349 +1502 +18120 +18695 +19 +19852 +286 +19853 +248 +958 +286 +19854 +14483 +19855 +19856 +19857 +16826 +19858 +720 +19 +19859 +13150 +13913 +14603 +19860 +14 +43 +823 +19861 +4550 +19862 +19863 +19864 +5791 +19439 +19 +590 +19865 +15 +3497 +4 +111 +57 +15718 +349 +43 +12005 +19866 +43 +4801 +554 +19867 +19491 +4406 +1090 +1386 +815 +225 +2 +5344 +19618 +19868 +14 +19 +3546 +9 +248 +18896 +19869 +155 +19870 +19871 +19872 +16024 +1234 +1369 +590 +43 +736 +19655 +2446 +7053 +19873 +19 +19874 +3491 +323 +8779 +586 +7137 +19875 +14 +19806 +16445 +19876 +43 +155 +19877 +15406 +590 +590 +3842 +19878 +19879 +8244 +19880 +19618 +19618 +10729 +19881 +13959 +32 +19882 +2 +19883 +2561 +2356 +36 +790 +14363 +19884 +19885 +861 +19886 +19887 +15718 +19806 +12807 +188 +15718 +19888 +827 +155 +4398 +19889 +989 +286 +112 +1444 +484 +7137 +19890 +827 +7053 +2234 +19 +2032 +1513 +19891 +741 +2259 +14477 +590 +590 +18695 +15285 +1083 +16190 +10381 +19892 +19893 +2040 +1013 +573 +14363 +6741 +590 +736 +19894 +3546 +19895 +14 +19896 +19897 +9 +12067 +736 +1013 +915 +19618 +790 +2849 +286 +14 +213 +5780 +5088 +19898 +1563 +323 +16466 +2117 +554 +2047 +19899 +736 +19900 +286 +1051 +15087 +33 +1083 +17320 +590 +3034 +7923 +19901 +2 +12913 +12093 +19902 +19618 +19903 +112 +1944 +16310 +4278 +14604 +19904 +5791 +19905 +19906 +16183 +43 +19907 +16437 +19908 +3491 +9 +19909 +3546 +19910 +19911 +736 +17604 +188 +3546 +11966 +32 +43 +19912 +9410 +19913 +19914 +43 +14 +19915 +7419 +19916 +112 +19917 +736 +2446 +48 +1139 +19918 +104 +43 +349 +19919 +18771 +188 +7032 +19920 +18891 +15 +1051 +6363 +19921 +3251 +18684 +1907 +19922 +823 +3427 +43 +14 +13375 +19923 +14477 +19404 +19618 +2415 +2314 +189 +5249 +398 +19924 +19925 +19926 +19927 +500 +3546 +18561 +5283 +554 +20 +1559 +35 +19928 +19929 +4634 +16437 +12247 +284 +14846 +43 +19930 +1559 +8566 +10 +13848 +15718 +140 +14770 +19931 +16121 +15592 +19932 +19933 +213 +19934 +213 +284 +19935 +19936 +14 +19 +647 +1112 +19937 +14363 +590 +19938 +10503 +19 +284 +18503 +11870 +19939 +19618 +19940 +32 +15718 +19941 +14 +349 +1559 +19942 +43 +736 +736 +19943 +3546 +99 +19646 +19618 +15718 +17698 +7260 +19944 +14 +14 +48 +18683 +19945 +970 +1566 +188 +13656 +19946 +303 +19947 +13566 +19 +4083 +15718 +19948 +1529 +19949 +19950 +19951 +119 +8566 +3635 +1157 +7053 +248 +19952 +19953 +176 +1021 +9 +4747 +19954 +303 +5623 +7987 +7208 +19 +10 +13179 +4196 +337 +1889 +19404 +19955 +19956 +19957 +2577 +19958 +19959 +2260 +19 +19960 +284 +19961 +19962 +17903 +19963 +19964 +9 +43 +276 +3 +1992 +11321 +19965 +17698 +1234 +1013 +228 +19966 +303 +14 +7137 +1244 +77 +713 +4963 +19967 +19404 +827 +19968 +11754 +15 +19969 +6741 +3546 +823 +19970 +1051 +590 +379 +19971 +19972 +19439 +19973 +745 +13282 +9 +7053 +19974 +16 +3546 +16855 +349 +1688 +19975 +671 +19976 +19289 +43 +770 +9 +19 +1517 +14 +19977 +19978 +8566 +13140 +15054 +5627 +14 +60 +1364 +19979 +13279 +19980 +597 +590 +19981 +19982 +12987 +19983 +32 +178 +12973 +19 +19984 +1236 +25 +19985 +17920 +1224 +2476 +10094 +19655 +60 +303 +14523 +6766 +19986 +19987 +15718 +19988 +8460 +140 +14143 +43 +43 +19806 +188 +19989 +19990 +9 +1051 +17774 +15384 +7836 +15 +19991 +19992 +19993 +19 +19994 +213 +5623 +12479 +19995 +98 +43 +16375 +19996 +248 +957 +19 +19997 +349 +8668 +590 +19998 +19999 +20000 +1415 +1013 +20001 +590 +15718 +19 +20002 +736 +137 +20003 +1920 +20004 +20005 +1574 +19 +16014 +1222 +7799 +14422 +20006 +19806 +286 +20007 +188 +20008 +590 +1300 +5561 +2 +303 +19404 +20009 +10003 +20010 +2577 +323 +5022 +20011 +19 +32 +19404 +17541 +20012 +4966 +7276 +5963 +20013 +590 +20014 +57 +790 +20015 +10 +20016 +20017 +827 +8685 +20018 +20019 +1229 +736 +20020 +554 +20021 +20022 +2166 +20023 +7609 +1817 +5582 +613 +14477 +20024 +57 +20025 +20026 +2694 +14020 +14 +14 +20027 +20028 +590 +9 +4227 +3172 +20029 +22 +19404 +20030 +249 +29 +1912 +20031 +20032 +43 +1765 +2764 +7855 +20033 +20034 +15080 +20035 +16831 +19404 +17661 +20036 +3546 +19655 +9 +98 +14 +651 +11483 +155 +20037 +19 +20038 +3743 +20039 +583 +4 +16437 +20040 +7053 +9 +20041 +19404 +11762 +19806 +16165 +286 +590 +19618 +6565 +2577 +20042 +15584 +19917 +20043 +3546 +16437 +20044 +43 +20045 +3546 +14977 +500 +5438 +16437 +15718 +209 +30 +20046 +20047 +20048 +4278 +20049 +536 +519 +20050 +3507 +19 +29 +20051 +22 +19381 +20052 +20053 +20054 +10381 +8668 +20055 +1013 +10310 +20056 +16866 +22 +16798 +590 +317 +20057 +1107 +20058 +16437 +13908 +1224 +20059 +80 +1870 +20060 +57 +43 +20061 +358 +14 +373 +20062 +19618 +6915 +20063 +20064 +20065 +20066 +14 +14429 +20067 +20068 +20069 +1212 +20070 +20071 +20072 +20073 +20074 +20075 +3958 +20076 +3256 +19 +20077 +3470 +20078 +201 +647 +4088 +2550 +1091 +486 +6505 +764 +38 +286 +16437 +43 +17374 +20079 +36 +20080 +20081 +20082 +20083 +20084 +19618 +554 +20085 +20086 +10028 +43 +373 +20087 +1112 +6214 +11762 +20088 +20089 +57 +936 +568 +11298 +17229 +20090 +286 +43 +3546 +16925 +20091 +1437 +20092 +20093 +3546 +20094 +597 +3698 +99 +15718 +137 +20095 +20 +20096 +1779 +7053 +19009 +9 +201 +20097 +14 +20098 +736 +20099 +20100 +20101 +823 +20 +138 +1047 +576 +11762 +15718 +43 +20102 +20103 +22 +20104 +590 +457 +10 +14603 +2770 +1107 +6395 +20105 +8668 +286 +57 +20106 +764 +3546 +20107 +20108 +19 +20109 +14 +19618 +5297 +20110 +16640 +20111 +20112 +2733 +823 +20113 +17555 +18539 +2577 +32 +42 +43 +20 +14 +20114 +20115 +7815 +1716 +590 +19 +14603 +7516 +6741 +712 +22 +20116 +16866 +43 +10356 +14 +20117 +20118 +43 +7137 +5627 +20119 +4765 +936 +915 +20120 +8218 +14 +20121 +8110 +590 +415 +18325 +7137 +11754 +201 +647 +14299 +15718 +20122 +14 +872 +20123 +20124 +19806 +11321 +16925 +9 +10 +7419 +16437 +15810 +1013 +13150 +2637 +20125 +7137 +20126 +20127 +590 +43 +11389 +20128 +1013 +3546 +736 +201 +274 +19806 +1230 +20 +18852 +15718 +19404 +4165 +19091 +10500 +9 +43 +1513 +20129 +14 +2164 +11754 +20130 +1574 +15 +1578 +15718 +835 +43 +19618 +1316 +13713 +647 +7379 +20131 +20132 +20133 +4426 +20134 +14973 +349 +1115 +5144 +57 +15718 +3 +20135 +19404 +20136 +20137 +20138 +35 +736 +19618 +764 +188 +20139 +873 +22 +411 +3236 +15718 +9738 +323 +9 +2561 +20140 +20141 +43 +9 +249 +179 +5670 +2197 +20142 +20143 +20144 +20145 +20146 +15718 +20147 +43 +14148 +20148 +11341 +15925 +20149 +19404 +1012 +2264 +15655 +1051 +1013 +20150 +19618 +20151 +15351 +20152 +1765 +20153 +20154 +14604 +20155 +20156 +20157 +19806 +201 +2517 +20158 +2349 +19 +43 +2594 +9 +20159 +19852 +19 +20160 +20161 +14 +14 +16881 +43 +14477 +590 +9 +349 +12404 +14148 +9194 +20162 +140 +665 +19404 +2 +590 +7379 +20163 +2476 +9 +3 +9713 +554 +80 +827 +5316 +739 +20164 +12620 +20165 +19 +20166 +20167 +272 +20168 +2 +536 +20169 +20170 +3546 +590 +19091 +20171 +286 +20172 +18145 +20173 +20174 +15186 +20175 +616 +3546 +590 +20176 +1249 +48 +1048 +6217 +20177 +20178 +20179 +14477 +3794 +20180 +16028 +2804 +16310 +20181 +1912 +20182 +14816 +1253 +20183 +20184 +20185 +12957 +15718 +736 +20186 +20187 +20188 +286 +4907 +19792 +8809 +20189 +2577 +14 +20190 +1012 +80 +11976 +2884 +6058 +19618 +67 +4313 +823 +2 +9 +13566 +358 +43 +43 +1082 +1425 +20 +20191 +1542 +20192 +1148 +14947 +20193 +5522 +736 +365 +20194 +2577 +20195 +20196 +3635 +43 +373 +19335 +16798 +20197 +20198 +9363 +7053 +20199 +3543 +20200 +35 +590 +48 +20201 +20202 +9688 +9 +20203 +590 +1013 +9 +20204 +20205 +20206 +10117 +13137 +1244 +20207 +19 +14 +20208 +14 +9 +3553 +20209 +20210 +16242 +20211 +15018 +20212 +646 +1107 +20213 +20214 +5080 +2577 +17698 +19 +20215 +17571 +736 +19618 +736 +9 +18283 +590 +15718 +20216 +20217 +349 +20218 +14961 +1051 +286 +20219 +20220 +20221 +286 +9 +20222 +1276 +105 +19 +20223 +3236 +10 +832 +20224 +245 +970 +20225 +3546 +448 +20226 +8188 +14 +3329 +20227 +20228 +9 +20229 +3546 +15718 +20230 +188 +43 +19618 +2430 +286 +14066 +20231 +590 +9440 +5791 +20232 +20233 +43 +15533 +43 +272 +43 +3105 +25 +20234 +209 +14 +20235 +20236 +178 +345 +15718 +185 +5837 +19404 +43 +178 +4963 +1105 +6341 +590 +15541 +57 +192 +248 +349 +5755 +349 +15158 +2330 +43 +18579 +19618 +13279 +20237 +43 +20238 +20239 +18154 +20240 +2129 +915 +20241 +15718 +20242 +6364 +20243 +586 +6028 +13566 +3213 +4126 +20244 +60 +11087 +20245 +736 +9 +11762 +12005 +8668 +43 +16014 +286 +8188 +1956 +4765 +20246 +10946 +20247 +8668 +16981 +20248 +736 +20249 +14 +369 +2804 +20250 +14343 +822 +411 +590 +20251 +365 +11762 +590 +19618 +20 +16925 +20252 +20253 +20254 +20255 +5990 +10 +20256 +19618 +1710 +20257 +19806 +8853 +20258 +9 +14420 +5438 +12555 +1991 +20259 +16656 +2561 +20260 +411 +14 +1107 +274 +590 +20261 +10 +20262 +5920 +20263 +20264 +590 +20265 +43 +80 +14 +20266 +20267 +20268 +20269 +2694 +2314 +3546 +20270 +1927 +10038 +1083 +20271 +14 +15 +1765 +14148 +3553 +590 +831 +14215 +823 +9 +736 +20272 +20273 +2790 +590 +5080 +17821 +20274 +20275 +2577 +6776 +14 +20276 +305 +20277 +9 +20278 +736 +19939 +736 +1364 +10004 +707 +9396 +14 +32 +20279 +15649 +43 +20280 +19 +2577 +323 +5803 +43 +4963 +736 +15718 +18951 +590 +20281 +613 +15595 +20282 +2896 +43 +501 +1154 +19 +14127 +14185 +7032 +20283 +3546 +2770 +509 +3 +19 +43 +15744 +20284 +43 +20285 +20286 +20287 +20288 +8668 +32 +1382 +5820 +282 +2694 +2476 +20289 +32 +590 +57 +20290 +554 +14 +20291 +15925 +9 +6924 +20292 +20293 +20294 +1112 +1444 +10094 +20295 +14026 +20296 +20297 +17112 +2577 +17338 +9 +2561 +1234 +20298 +736 +10946 +590 +20299 +43 +1295 +20300 +20301 +1612 +20302 +15 +9 +1578 +20303 +9 +11966 +9 +20304 +861 +14216 +6011 +20305 +286 +272 +590 +20306 +11822 +20307 +201 +286 +352 +14 +4547 +20308 +20309 +15193 +14 +17635 +20310 +20311 +19655 +14 +3546 +20312 +15647 +20313 +1051 +20314 +14 +305 +2459 +20315 +20316 +20317 +20318 +20319 +2835 +861 +19618 +590 +668 +2 +43 +15 +19 +14363 +14868 +14 +20320 +19404 +32 +20321 +98 +20322 +176 +43 +19 +13349 +491 +349 +18661 +14477 +3732 +20323 +1560 +19618 +20324 +20325 +411 +20326 +842 +17920 +15718 +20327 +20328 +20329 +20330 +20331 +20332 +15718 +20333 +192 +2 +19 +19 +22 +19618 +19806 +20334 +20335 +590 +4952 +155 +3546 +17872 +20336 +20 +20337 +11321 +3909 +540 +20338 +2577 +20339 +20340 +20341 +536 +22 +20342 +7053 +20343 +20344 +1091 +2794 +1013 +196 +2577 +11482 +20345 +20346 +616 +590 +379 +20347 +349 +32 +20348 +20349 +43 +5659 +43 +5780 +20350 +13179 +2325 +12397 +43 +57 +14666 +10356 +20351 +36 +20352 +20353 +18956 +14477 +188 +8100 +20354 +20355 +1245 +2971 +7053 +19618 +20356 +20357 +274 +19618 +19618 +9 +7328 +14 +20358 +20359 +12397 +19618 +20360 +936 +1536 +20361 +821 +32 +20362 +20363 +20364 +15141 +14 +14131 +4506 +7048 +20365 +20366 +20367 +7701 +15718 +823 +15718 +590 +43 +12987 +20368 +9 +20369 +14 +1716 +18503 +272 +20370 +20371 +20372 +20373 +10230 +20374 +20 +19 +2253 +590 +677 +955 +20375 +15589 +751 +20376 +20377 +209 +20378 +20379 +20380 +12241 +8367 +861 +20381 +20382 +20383 +20384 +18982 +20385 +19655 +19404 +1738 +20386 +1942 +2463 +707 +20387 +11230 +209 +43 +4023 +20388 +14604 +20389 +20390 +20391 +20392 +3 +20393 +18695 +20394 +19 +19618 +650 +19618 +2410 +1217 +590 +20395 +20396 +20397 +5780 +3546 +15824 +19618 +1019 +222 +2561 +20398 +20399 +19 +683 +20400 +20401 +20402 +707 +155 +32 +43 +43 +19 +20403 +20404 +20405 +2064 +20406 +9 +590 +16437 +19618 +20407 +15586 +59 +736 +2316 +2316 +164 +541 +13257 +201 +20408 +20409 +43 +98 +14 +610 +9 +20410 +7053 +20411 +20412 +19618 +590 +20413 +19618 +8297 +916 +20414 +18951 +3546 +6766 +20415 +15718 +10163 +736 +22 +415 +20416 +155 +20417 +20418 +20419 +15384 +2144 +8392 +5780 +20420 +286 +1169 +20421 +12231 +1738 +57 +20422 +15654 +19 +10 +19618 +379 +1513 +1224 +19655 +20423 +20424 +20425 +19618 +20426 +20427 +19404 +4126 +20428 +20429 +9526 +89 +590 +20430 +20431 +20432 +6095 +20433 +20434 +20435 +57 +20436 +14299 +349 +1011 +20437 +20438 +20439 +20440 +373 +20441 +20442 +7477 +20443 +7045 +20444 +10287 +20445 +2593 +1696 +865 +32 +46 +764 +590 +590 +9 +19618 +43 +590 +1765 +19917 +20446 +20447 +369 +20448 +20449 +16205 +18045 +20450 +18100 +9497 +19 +14 +19797 +2733 +14 +20451 +19618 +43 +8668 +155 +4961 +15718 +17482 +8188 +15718 +20452 +12987 +439 +20453 +19 +14 +20454 +18798 +1716 +20455 +20456 +20457 +20458 +3353 +20459 +20460 +707 +3034 +7053 +20461 +155 +4963 +20462 +345 +14001 +20463 +57 +7912 +14 +20464 +5780 +1316 +20465 +15 +20466 +20467 +9 +20468 +1529 +12987 +736 +20469 +14477 +4684 +20470 +20471 +2 +43 +20472 +209 +590 +1082 +20473 +1965 +1013 +20474 +57 +17084 +9 +43 +138 +20475 +20476 +7253 +20477 +20478 +20479 +8188 +6518 +7536 +20480 +720 +1912 +16925 +20481 +20482 +20483 +6571 +20484 +20485 +14477 +20486 +15 +20487 +20488 +14148 +20489 +20490 +1166 +5773 +20491 +20492 +29 +865 +720 +3317 +12304 +8882 +20493 +379 +3546 +2009 +20 +43 +14 +20494 +20495 +19655 +20496 +32 +18956 +19655 +20497 +15718 +19618 +1566 +4028 +915 +590 +282 +20498 +590 +20499 +845 +19742 +9 +43 +2260 +14 +13582 +345 +20500 +20501 +19 +9 +43 +14001 +32 +20502 +20503 +2260 +590 +20504 +1991 +20505 +647 +35 +20506 +5438 +8882 +590 +19806 +590 +20507 +5780 +19618 +43 +19618 +8255 +4565 +245 +188 +8367 +12013 +20508 +20509 +20510 +20511 +1307 +272 +590 +590 +446 +5197 +349 +20512 +20513 +2314 +201 +155 +20514 +11315 +155 +66 +2832 +8188 +155 +7053 +464 +15654 +345 +20515 +19618 +14 +14 +1612 +20 +4441 +196 +188 +20516 +15718 +19618 +4141 +20517 +345 +14 +43 +590 +2064 +554 +440 +20518 +17151 +20519 +397 +1520 +43 +20520 +349 +20521 +22 +43 +20522 +17228 +20523 +20524 +590 +20525 +20526 +19618 +14 +213 +590 +2035 +20527 +3546 +9 +13807 +5314 +3546 +14477 +10 +14 +14 +1809 +4918 +9801 +20528 +20529 +53 +14 +20530 +155 +3 +155 +15718 +484 +1765 +20531 +19404 +20532 +89 +770 +1224 +3067 +823 +5217 +345 +14562 +19218 +272 +590 +590 +19 +19 +4775 +20533 +1287 +20534 +19618 +20535 +20536 +590 +16205 +2561 +12987 +20537 +20538 +20539 +19 +155 +20 +43 +20540 +590 +20541 +20542 +20543 +18283 +736 +12402 +7521 +43 +20544 +17834 +595 +17670 +3421 +10 +20545 +272 +2260 +20546 +14604 +15315 +14260 +89 +20547 +20548 +2029 +20549 +3546 +345 +379 +20550 +20551 +1442 +20552 +15718 +18956 +10 +213 +3417 +20553 +558 +18683 +751 +17698 +20554 +2 +20555 +16844 +15718 +2975 +345 +20 +20556 +80 +14477 +209 +20557 +5438 +3546 +16437 +13854 +20558 +6441 +20559 +9 +20560 +1224 +20561 +3546 +43 +20562 +1559 +647 +20563 +1230 +19 +192 +249 +3546 +20564 +713 +6071 +20565 +20435 +20566 +20567 +12987 +20558 +736 +20568 +736 +1112 +43 +4313 +20569 +14 +19091 +14363 +648 +9941 +12827 +20570 +20571 +16844 +1157 +15308 +57 +20572 +2790 +9898 +20573 +20574 +20 +3546 +3546 +713 +590 +80 +112 +1920 +20575 +20576 +349 +20577 +20578 +2694 +736 +19618 +4028 +13539 +20579 +20388 +6741 +5052 +7364 +915 +20580 +349 +736 +20581 +20582 +20583 +20584 +20585 +20586 +20587 +354 +20588 +272 +43 +5117 +7176 +745 +1698 +745 +7137 +647 +20589 +20590 +35 +20591 +20592 +15267 +20593 +736 +20594 +14342 +7053 +1727 +9 +683 +20595 +12832 +1508 +647 +32 +43 +20596 +14 +19 +590 +20597 +15718 +43 +4341 +590 +19 +13959 +38 +2865 +8256 +417 +32 +13566 +19197 +9 +15001 +7379 +14 +32 +15718 +736 +20598 +6741 +2125 +823 +3353 +20599 +20600 +10880 +10574 +3546 +15718 +20601 +9 +20602 +16437 +14 +22 +20603 +20604 +7053 +32 +16743 +1710 +6701 +20605 +590 +15 +19 +3435 +20606 +57 +14603 +2844 +12480 +349 +8149 +19618 +20607 +18798 +9320 +1889 +20608 +77 +11995 +19 +8015 +20609 +323 +20610 +18503 +14 +20611 +20612 +915 +14 +20613 +5601 +32 +18951 +286 +3546 +14477 +19618 +18045 +5333 +19618 +590 +17920 +647 +3546 +188 +20614 +19 +3407 +209 +20615 +19404 +6420 +3 +14477 +16437 +15 +1208 +185 +590 +20616 +19618 +20617 +14477 +17247 +720 +1569 +493 +590 +1212 +17872 +3213 +18862 +20 +20618 +13307 +213 +20619 +20620 +3546 +272 +20621 +43 +20622 +590 +20623 +8967 +377 +736 +20624 +286 +178 +590 +736 +20555 +20625 +20626 +3050 +19 +2314 +1251 +791 +590 +34 +18951 +357 +5780 +1013 +20627 +16389 +20628 +20629 +713 +761 +20630 +533 +1013 +5542 +10 +1442 +646 +20631 +3 +20632 +5780 +20633 +20634 +337 +590 +20635 +16927 +3999 +20636 +590 +17698 +7743 +1217 +1385 +2925 +6741 +20637 +20638 +57 +18052 +590 +6294 +20639 +1688 +10230 +20640 +20641 +2517 +20642 +20643 +32 +842 +20644 +19 +3059 +1870 +3546 +284 +3546 +20645 +20646 +20647 +20648 +9 +222 +18695 +20649 +3 +519 +2697 +20650 +20651 +7053 +20652 +13945 +6028 +533 +493 +504 +1208 +20653 +284 +43 +613 +9 +43 +20654 +3480 +2872 +43 +9 +590 +20655 +6950 +8668 +590 +20656 +3 +19618 +8668 +20141 +14363 +188 +3976 +20657 +20658 +1056 +791 +20659 +19618 +3546 +2804 +590 +17602 +4441 +20660 +20661 +20662 +3067 +1517 +1051 +741 +20663 +20664 +20665 +43 +4 +20666 +188 +4196 +19 +8996 +3546 +1013 +1912 +6571 +713 +20667 +2260 +205 +57 +3546 +20 +20668 +1765 +15718 +1716 +8999 +590 +3559 +20669 +188 +3546 +20670 +2035 +18455 +10 +248 +303 +20671 +20672 +323 +20673 +764 +736 +1710 +20674 +20 +2694 +20675 +713 +10 +20 +3252 +188 +8218 +19042 +4441 +19 +964 +736 +13370 +736 +5904 +411 +6354 +209 +14 +12987 +14363 +323 +286 +15 +20676 +19618 +590 +13127 +17545 +590 +20677 +3546 +18814 +20678 +20679 +2129 +1100 +1961 +1013 +10787 +20680 +89 +1300 +155 +917 +20681 +20682 +20683 +20684 +19576 +248 +2316 +464 +20685 +20686 +29 +590 +736 +20687 +20688 +20689 +1738 +5780 +10 +15718 +19618 +20690 +20691 +20692 +19618 +6205 +19 +20693 +8351 +20694 +32 +2775 +7053 +18025 +20695 +2537 +20696 +20697 +590 +20698 +15649 +43 +2 +155 +10 +1847 +20699 +4907 +14 +20700 +3546 +2243 +19 +43 +38 +20701 +590 +2550 +20702 +9 +274 +213 +20703 +1465 +35 +6877 +155 +284 +213 +3994 +43 +11762 +20704 +1559 +274 +1870 +590 +8668 +19 +4081 +248 +43 +20705 +19806 +590 +16991 +20706 +20707 +12936 +20708 +20709 +8218 +9 +647 +345 +736 +19806 +19 +43 +20710 +790 +20711 +14127 +10 +248 +745 +112 +22 +20712 +590 +20713 +20714 +43 +337 +474 +590 +3317 +357 +665 +43 +43 +14 +278 +20715 +8668 +18695 +3546 +20716 +9 +13045 +10 +15 +15540 +209 +18954 +19618 +176 +20717 +647 +19323 +137 +20700 +248 +1013 +590 +32 +10038 +872 +155 +20718 +14363 +20719 +20720 +20721 +19 +20722 +478 +5601 +9 +345 +12788 +188 +20723 +20724 +554 +15718 +8351 +19618 +736 +12987 +14 +20725 +155 +20726 +13375 +20727 +20728 +48 +971 +3732 +14 +25 +15 +20729 +19618 +2476 +3546 +20730 +590 +20731 +20732 +14604 +519 +16472 +590 +286 +7053 +3546 +3476 +616 +823 +2593 +19618 +19 +14 +24 +586 +20 +1208 +12584 +20733 +20734 +6364 +20735 +590 +20736 +20737 +20 +3546 +12768 +18128 +286 +286 +2121 +20738 +3417 +19618 +155 +590 +590 +19624 +648 +32 +2694 +209 +15718 +19 +1018 +6785 +9400 +14 +3543 +358 +19806 +43 +20739 +18552 +501 +3944 +823 +3599 +38 +20740 +533 +20741 +20742 +20743 +20744 +20745 +590 +20746 +349 +286 +17467 +8566 +590 +14001 +43 +795 +20747 +14477 +1208 +1018 +3376 +7053 +1817 +20748 +10 +9 +5601 +13375 +99 +590 +16 +14 +1021 +20749 +201 +20750 +20751 +43 +15496 +89 +345 +19792 +5099 +2637 +3743 +14 +11618 +20752 +20753 +15718 +18178 +2356 +20754 +20755 +29 +20756 +155 +4144 +6571 +20757 +20758 +554 +20759 +573 +20760 +12987 +17356 +720 +20761 +20762 +20 +14 +20763 +8668 +1764 +20764 +2 +1575 +20765 +14477 +14 +20766 +317 +20767 +274 +20768 +20769 +683 +286 +20770 +18283 +339 +970 +152 +20771 +20772 +14 +3546 +20773 +43 +112 +39 +4717 +554 +155 +20774 +286 +1091 +345 +4581 +3546 +20775 +9 +3546 +5441 +20776 +2577 +2253 +665 +20777 +20778 +20779 +14 +20780 +20781 +20 +16305 +971 +57 +3553 +20782 +20783 +14477 +720 +20784 +20785 +3695 +5689 +2415 +849 +20786 +1437 +12333 +3353 +13474 +10706 +20787 +826 +14 +66 +590 +20788 +20789 +20790 +9 +2 +1109 +16672 +8668 +20791 +43 +16437 +2 +19 +19404 +2164 +20792 +20793 +20 +1655 +20794 +20795 +15718 +12987 +20 +15744 +12254 +1684 +970 +80 +19655 +9 +272 +590 +1310 +20796 +9 +764 +15718 +5316 +474 +11073 +137 +188 +20499 +20797 +279 +20798 +411 +20799 +20800 +43 +10439 +5208 +19618 +10 +2446 +1229 +647 +4174 +109 +1742 +736 +7855 +32 +1100 +20801 +20802 +15975 +57 +18816 +14689 +213 +16941 +379 +349 +13279 +3330 +60 +286 +19618 +20803 +4485 +648 +20804 +554 +20805 +43 +349 +20806 +19618 +43 +12893 +20807 +1011 +19618 +15 +20808 +13543 +1738 +20809 +38 +1559 +29 +20810 +213 +18695 +15535 +11321 +20811 +827 +345 +5780 +20812 +519 +349 +18896 +1559 +20813 +20814 +4084 +6571 +20815 +43 +20816 +43 +20817 +20818 +491 +4820 +20819 +20820 +20821 +345 +20822 +17 +15649 +10028 +152 +1423 +20823 +20824 +20825 +1927 +20826 +625 +2694 +9314 +43 +20827 +736 +19618 +20828 +3546 +590 +32 +590 +19404 +20829 +19618 +17602 +18683 +1630 +19618 +590 +57 +464 +8392 +8351 +20830 +179 +20831 +18982 +20832 +20833 +20834 +19618 +9796 +19404 +10 +14 +207 +14 +284 +20835 +1082 +20836 +6140 +3059 +20837 +20838 +43 +10621 +15718 +2015 +20839 +3546 +20840 +57 +16012 +20841 +20842 +13138 +2254 +19 +827 +155 +349 +415 +20843 +7799 +9 +20844 +2832 +20845 +20846 +2694 +20847 +20848 +20849 +20850 +20851 +20852 +20 +53 +590 +3 +19618 +20853 +43 +137 +20854 +20855 +365 +20856 +20174 +185 +20857 +20858 +554 +19 +20859 +43 +15820 +248 +17670 +20860 +12397 +43 +20861 +2314 +6441 +399 +5418 +2260 +823 +16437 +20 +20862 +20863 +213 +7379 +823 +20864 +19 +2197 +14916 +3408 +2694 +3 +20865 +736 +12996 +20 +43 +554 +7908 +20866 +20867 +248 +20868 +1234 +354 +3548 +57 +14152 +20869 +14274 +3546 +20 +595 +303 +32 +201 +20870 +20871 +1112 +15583 +19618 +209 +20872 +3491 +19 +19618 +590 +7328 +155 +16375 +1605 +248 +2015 +20873 +20874 +20875 +323 +9 +4230 +20876 +2770 +4441 +4230 +20877 +1859 +14 +19 +15699 +293 +495 +9 +971 +446 +4118 +20878 +20879 +14680 +8297 +823 +20880 +345 +38 +20881 +791 +1100 +20161 +2804 +590 +14 +18054 +14 +1384 +248 +209 +554 +20882 +20883 +1961 +20884 +43 +590 +20885 +140 +305 +20886 +2577 +1091 +20887 +20888 +20889 +20890 +20891 +10993 +20892 +13666 +3192 +20893 +1425 +18257 +2197 +20894 +20895 +4963 +19 +20896 +32 +3546 +20897 +155 +19 +5780 +1100 +736 +5582 +141 +5632 +1066 +1157 +13908 +13943 +2260 +43 +16696 +2 +20898 +248 +573 +20899 +20900 +15694 +16437 +20901 +14477 +284 +19478 +12560 +736 +20902 +349 +13149 +43 +20428 +20903 +20904 +1013 +20905 +519 +43 +345 +20906 +2577 +32 +43 +590 +9 +519 +9 +43 +3335 +17356 +1765 +57 +20907 +14082 +10 +842 +14 +20908 +809 +43 +20909 +13528 +43 +1912 +20910 +32 +20911 +665 +736 +8668 +20912 +20913 +14 +43 +20914 +192 +3546 +1508 +736 +20915 +201 +2064 +19404 +16927 +20916 +791 +286 +20917 +9 +20918 +20919 +20920 +20921 +20922 +3291 +57 +17247 +1090 +19618 +5804 +14 +20923 +20924 +20925 +18372 +3546 +20926 +20927 +20928 +20929 +2029 +20930 +20931 +519 +1927 +35 +15718 +19 +398 +9485 +4544 +2 +19 +3553 +43 +590 +7027 +17112 +10487 +20932 +20 +20933 +20934 +872 +20935 +590 +19655 +286 +736 +20936 +349 +1559 +11715 +2314 +2316 +554 +19618 +14 +14603 +4269 +66 +20937 +1961 +59 +349 +20938 +14 +20939 +12642 +43 +13976 +20940 +13361 +720 +20941 +20942 +2694 +16826 +20943 +3296 +20944 +19965 +352 +43 +5344 +19404 +20945 +3752 +19 +2919 +201 +11808 +12987 +12987 +10 +323 +20946 +3546 +20947 +1566 +43 +20948 +2197 +412 +43 +11754 +286 +20572 +1924 +18695 +20949 +20950 +20951 +22 +9 +1502 +683 +20952 +7053 +17635 +20953 +14 +20954 +20955 +43 +20956 +590 +20957 +7053 +1864 +20958 +694 +19 +345 +17083 +89 +14538 +14477 +19304 +14603 +20959 +249 +20960 +20961 +20962 +228 +222 +20963 +20964 +17251 +15718 +43 +6121 +32 +20965 +4752 +12202 +616 +20966 +8351 +14388 +20967 +4544 +736 +2577 +10031 +20968 +4963 +20969 +1051 +20970 +20971 +736 +20972 +20973 +9 +20448 +10 +19 +155 +8255 +5823 +1559 +448 +155 +358 +4364 +20974 +7145 +20975 +286 +16981 +20976 +12005 +1442 +849 +20977 +17872 +20978 +20979 +590 +736 +20980 +764 +736 +20981 +402 +20982 +20983 +3546 +20984 +12005 +20985 +13807 +20986 +11087 +209 +809 +20987 +11335 +43 +1465 +20988 +292 +2459 +20989 +7053 +715 +18951 +4766 +19 +43 +20990 +18956 +1817 +19 +590 +20991 +1716 +14 +155 +20572 +20992 +15718 +14477 +20993 +20994 +20 +20995 +20996 +19655 +14477 +3543 +20997 +5267 +590 +20998 +20999 +35 +3995 +21000 +647 +2733 +823 +7238 +21001 +683 +21002 +595 +826 +2577 +155 +19618 +2330 +3546 +34 +14527 +823 +43 +155 +3421 +21003 +815 +548 +164 +694 +21004 +6251 +369 +155 +2790 +43 +21005 +21006 +971 +357 +21007 +25 +18982 +21008 +14 +397 +21009 +43 +20326 +188 +21010 +21011 +43 +1364 +21012 +21013 +17571 +11995 +21014 +1314 +2029 +16535 +21015 +10439 +38 +12067 +2804 +1090 +590 +665 +14 +6095 +21016 +57 +9 +21017 +11754 +272 +32 +21018 +21019 +13874 +21020 +21021 +21022 +15744 +14001 +12743 +3095 +21023 +14 +1048 +349 +349 +2804 +677 +915 +13564 +21024 +8743 +349 +2124 +19618 +3978 +21021 +43 +9 +272 +1112 +18120 +19 +3546 +21025 +10004 +21026 +2314 +590 +43 +21027 +21028 +21029 +2314 +19 +3546 +21030 +19 +286 +21031 +6095 +21032 +15718 +2314 +14 +21033 +590 +21034 +21035 +14 +21036 +19655 +554 +590 +17635 +736 +20 +399 +21037 +2164 +21038 +736 +21039 +155 +14351 +21040 +3484 +417 +9 +5533 +4029 +3546 +21041 +21042 +14 +736 +196 +15718 +21043 +647 +1226 +43 +21044 +13039 +16788 +3546 +3316 +4387 +21045 +21046 +43 +123 +4278 +21047 +20555 +16240 +21048 +2314 +15193 +1566 +21049 +7537 +21050 +21051 +155 +21052 +21053 +21054 +554 +10 +1168 +21055 +21056 +21057 +3239 +57 +671 +15809 +21058 +14 +3119 +399 +597 +21059 +43 +14363 +14770 +21060 +201 +43 +11274 +1013 +21061 +3546 +19 +3546 +2859 +58 +21062 +345 +21063 +21064 +15718 +19618 +201 +43 +14 +21065 +20206 +43 +19 +19618 +1013 +21066 +21067 +18100 +14 +823 +21068 +345 +2476 +21069 +8210 +1824 +3239 +21070 +345 +20774 +20 +519 +21071 +43 +590 +12761 +3743 +514 +21072 +590 +19618 +6950 +827 +21073 +554 +788 +736 +16437 +15 +12203 +21074 +21075 +554 +15845 +7053 +568 +823 +14 +21076 +14 +6732 +21077 +21078 +104 +345 +736 +43 +19655 +12987 +14 +201 +21079 +21080 +19792 +3546 +7137 +6617 +21081 +5344 +486 +155 +20 +17082 +19 +104 +21082 +2733 +647 +43 +21083 +57 +21084 +21085 +21086 +201 +21087 +21088 +43 +19695 +15718 +21089 +21090 +286 +21091 +21092 +19792 +590 +16437 +21093 +1991 +21094 +21095 +21096 +21097 +345 +21098 +21099 +21100 +18806 +20 +21101 +57 +4227 +43 +14604 +42 +9410 +21102 +3 +2459 +15592 +43 +18283 +16180 +21103 +21104 +12788 +21105 +43 +11483 +3236 +16681 +17670 +21106 +21107 +6283 +7815 +21108 +1051 +19404 +20737 +21109 +1889 +22 +21110 +3546 +21111 +2830 +155 +21112 +278 +21113 +590 +43 +18637 +32 +21114 +349 +11762 +32 +1870 +188 +57 +778 +21115 +14 +764 +349 +99 +21116 +2728 +43 +1310 +19752 +6571 +1961 +21117 +21118 +19618 +2019 +21119 +21120 +8967 +4126 +21121 +2260 +8214 +14 +7917 +5495 +5299 +14 +20343 +2042 +7053 +1508 +2009 +21122 +21123 +196 +17911 +21124 +2804 +4414 +21125 +827 +19806 +43 +15168 +736 +21126 +21127 +21128 +5601 +6441 +20773 +21129 +1992 +21130 +21131 +21132 +21133 +21134 +16790 +21135 +3406 +1765 +554 +1543 +21136 +7045 +14477 +43 +533 +11762 +1605 +155 +736 +21137 +21138 +155 +14477 +6571 +2657 +19 +286 +3772 +155 +5410 +21139 +43 +21140 +2260 +43 +21141 +4367 +21142 +4929 +4793 +20340 +21143 +3546 +14933 +4808 +765 +21144 +11087 +1716 +323 +141 +43 +3978 +1749 +155 +21145 +519 +35 +10439 +22 +5204 +2537 +5877 +21146 +1027 +13566 +16780 +9 +590 +21147 +21148 +59 +32 +21149 +20555 +590 +823 +590 +3559 +21150 +3546 +14240 +713 +21151 +823 +21152 +19806 +43 +21153 +137 +349 +21031 +7053 +185 +21154 +141 +597 +7146 +590 +21155 +21156 +14192 +5318 +21157 +887 +21158 +21159 +21160 +2944 +21161 +21162 +32 +21163 +7053 +13710 +21164 +10727 +15 +21165 +21166 +5908 +6776 +19618 +32 +21167 +21168 +9 +1648 +1224 +3546 +21169 +2356 +3354 +10 +349 +57 +1710 +43 +21170 +21171 +3476 +19 +21172 +20952 +14 +43 +4414 +8743 +11362 +21173 +590 +17879 +21174 +1091 +590 +104 +7053 +21175 +18047 +736 +10 +21176 +197 +736 +4682 +683 +19 +5027 +1021 +2694 +3 +15497 +13973 +345 +21177 +13974 +8380 +745 +1056 +345 +19618 +19618 +349 +155 +9934 +21178 +21179 +9123 +15824 +21180 +694 +21181 +104 +21182 +2260 +20384 +286 +20572 +1011 +14792 +9 +14 +21183 +8392 +2 +317 +245 +21184 +21185 +590 +736 +21186 +98 +823 +21187 +16890 +1222 +272 +736 +21188 +21189 +21190 +3546 +32 +13624 +16899 +13566 +155 +1961 +17635 +21191 +21192 +21193 +21194 +201 +21195 +16 +14844 +19404 +15406 +21196 +21197 +21198 +19 +155 +2285 +1655 +10 +9873 +19618 +18798 +21199 +823 +8210 +21200 +15561 +18951 +2318 +21201 +21202 +590 +6617 +43 +19271 +21203 +464 +14 +19618 +14797 +274 +21204 +17136 +21205 +21206 +12987 +5582 +66 +21207 +21208 +21209 +736 +377 +16437 +648 +1847 +21210 +823 +21211 +21212 +43 +8297 +869 +33 +3546 +21213 +379 +21214 +2476 +21215 +3995 +17947 +17981 +21216 +590 +21217 +5650 +2804 +21218 +823 +21219 +554 +16387 +14215 +20 +590 +21220 +19618 +197 +21221 +21222 +21223 +43 +21224 +21225 +9 +19439 +13484 +21226 +1224 +21227 +21228 +19618 +43 +1154 +1503 +14603 +19883 +14102 +2415 +1013 +19 +43 +21229 +809 +1965 +19 +21230 +7935 +10439 +11762 +16850 +21231 +21232 +1716 +2540 +209 +21233 +14 +21234 +21235 +3546 +554 +21236 +43 +590 +590 +1160 +970 +19918 +270 +590 +21237 +4812 +1160 +19 +21238 +43 +21239 +21240 +21241 +15718 +21242 +590 +286 +21232 +19655 +77 +5438 +14 +194 +286 +21243 +412 +32 +21244 +17670 +11702 +1224 +707 +19618 +20 +21245 +21246 +7379 +21247 +2879 +14 +21248 +21249 +1042 +43 +21250 +14 +57 +188 +736 +1502 +10356 +21251 +2 +21252 +21253 +730 +12067 +736 +21254 +3546 +43 +1716 +7053 +14 +1696 +6504 +21255 +317 +286 +21256 +1749 +21257 +1051 +20952 +19 +21258 +20 +15718 +19965 +1082 +57 +509 +1533 +20600 +536 +6571 +21259 +8270 +138 +4288 +647 +19404 +21260 +9 +14 +19618 +14477 +15718 +21261 +1107 +345 +14 +20291 +8512 +21262 +15595 +590 +7799 +6571 +39 +373 +21263 +21264 +21265 +18455 +19 +21266 +3546 +873 +21267 +15718 +5780 +21268 +20 +21269 +20657 +21270 +7855 +736 +3546 +21271 +21272 +155 +21273 +10 +19618 +21274 +14 +21275 +21276 +10439 +7270 +155 +5780 +828 +21277 +19 +4315 +6071 +32 +14 +286 +3546 +201 +14 +21278 +11754 +14524 +19 +14520 +21279 +19618 +590 +345 +21280 +533 +20 +12158 +15592 +21281 +21282 +21283 +21284 +2006 +590 +21285 +21286 +21287 +119 +3669 +9402 +2762 +12987 +533 +2593 +9 +20572 +21288 +3395 +669 +720 +21289 +19404 +21290 +590 +15592 +686 +21291 +590 +21292 +21293 +17473 +1559 +21294 +590 +19618 +185 +10117 +1090 +10303 +7137 +21295 +9162 +2577 +21296 +19 +274 +286 +15718 +209 +21297 +1696 +19618 +3546 +21298 +590 +761 +21299 +15971 +21300 +5203 +4 +140 +6533 +14 +21301 +11707 +9 +16589 +14477 +21302 +8249 +13569 +21303 +21304 +32 +15718 +19618 +345 +19 +11762 +21305 +12005 +21306 +21307 +4907 +590 +13801 +3990 +286 +345 +1517 +3341 +21308 +21309 +228 +379 +21310 +21311 +21312 +21313 +5780 +21314 +21315 +21316 +10 +13538 +5627 +155 +43 +15718 +19 +21317 +349 +21318 +14604 +2287 +21319 +1012 +1154 +12684 +9 +21320 +5780 +19 +6776 +17608 +20 +20 +1164 +21321 +16118 +21322 +14 +8668 +21323 +21324 +10230 +57 +17228 +1976 +21325 +9 +22 +21326 +155 +8789 +19852 +21327 +21328 +10 +18283 +21329 +13624 +764 +209 +21330 +14363 +19048 +5803 +1109 +590 +99 +338 +21331 +14 +720 +14001 +20127 +201 +19 +21332 +2 +21333 +514 +21334 +201 +1716 +12989 +21335 +21336 +1013 +21337 +14 +823 +14 +538 +222 +21338 +1442 +554 +19 +21339 +9 +10028 +21340 +43 +21341 +21342 +345 +21343 +21344 +21345 +21346 +19 +4118 +15 +21347 +590 +495 +554 +19 +323 +21348 +21349 +286 +21350 +14 +21351 +18919 +5601 +43 +29 +2550 +19618 +21352 +5803 +21353 +19 +4518 +21354 +3213 +21355 +21356 +21357 +14 +19 +7835 +21358 +16180 +228 +21359 +21360 +179 +1139 +595 +8249 +11754 +8301 +4278 +11754 +21361 +19 +21362 +764 +21363 +12987 +21364 +43 +4 +21365 +16437 +5803 +349 +4278 +21366 +21367 +15718 +43 +5627 +60 +21368 +21369 +43 +19404 +21370 +613 +568 +3839 +21371 +736 +21372 +11308 +495 +19618 +21373 +21374 +14 +21375 +16126 +18045 +43 +21376 +16437 +21377 +21378 +14 +21379 +12561 +15356 +286 +19618 +196 +873 +11362 +21380 +18095 +32 +21381 +14 +21382 +849 +14 +43 +1668 +286 +16883 +5582 +21383 +21384 +11483 +1157 +66 +3842 +21385 +1517 +21386 +10222 +7053 +887 +155 +15720 +20 +9 +21168 +590 +14 +647 +21387 +222 +7379 +21388 +21389 +1870 +736 +14 +2349 +2 +17670 +3978 +21390 +1559 +21391 +21392 +533 +21393 +2446 +19618 +21336 +286 +590 +1765 +43 +3546 +10236 +21394 +16437 +38 +21395 +99 +845 +736 +16437 +21396 +21397 +590 +43 +21398 +17144 +43 +13285 +1013 +1765 +345 +2134 +21399 +17571 +1208 +21400 +21401 +21402 +21403 +21404 +10699 +7896 +21405 +32 +20 +1013 +19 +19404 +14 +1012 +19655 +536 +286 +15054 +19618 +20941 +5780 +10 +346 +21088 +872 +176 +21406 +16437 +20702 +21407 +17119 +21408 +3484 +43 +20677 +21409 +21410 +21411 +19 +6877 +21412 +57 +8668 +10 +21413 +21414 +43 +21415 +12807 +43 +3546 +2733 +736 +21416 +10439 +21417 +8188 +1991 +21418 +21419 +21420 +3546 +583 +590 +14 +21421 +915 +5318 +590 +764 +21422 +104 +19618 +57 +21423 +18896 +21424 +21425 +345 +683 +21426 +9 +2694 +736 +18951 +21427 +138 +21428 +1465 +21429 +2018 +21430 +176 +2064 +16389 +21431 +19404 +3546 +9144 +9934 +21432 +398 +19 +35 +21433 +7653 +3251 +18047 +284 +7053 +21434 +248 +3353 +7536 +155 +21435 +21436 +21437 +736 +12185 +14 +21438 +21439 +1013 +8668 +827 +14 +48 +1051 +736 +213 +25 +18283 +16437 +21440 +8041 +14 +14 +19618 +17229 +21441 +15718 +21442 +21443 +872 +1870 +57 +21444 +21445 +19 +19 +15718 +213 +5211 +21446 +14 +248 +21447 +14603 +17519 +823 +21448 +1991 +21449 +1190 +248 +590 +21450 +21451 +21405 +21452 +1912 +19 +21453 +1696 +15718 +1425 +12987 +1224 +16640 +15 +21454 +14 +323 +3546 +590 +12404 +19404 +21455 +590 +248 +6439 +1612 +10640 +176 +5344 +590 +10230 +16437 +590 +21456 +201 +21457 +5134 +21458 +19404 +32 +823 +9 +21459 +14 +21460 +8668 +19618 +21461 +303 +1385 +36 +11762 +35 +14604 +823 +349 +345 +21462 +7231 +21463 +21464 +21465 +305 +9 +21466 +19 +21467 +20 +13230 +337 +21468 +21469 +2314 +1559 +16429 +21176 +14 +20 +43 +20 +14 +8249 +15975 +21470 +303 +104 +14 +736 +14 +21471 +196 +6571 +915 +155 +43 +21472 +21473 +3546 +337 +21474 +21475 +21476 +21477 +20803 +21478 +284 +18139 +21479 +21480 +19 +15718 +14020 +286 +713 +10 +13207 +21481 +43 +590 +590 +16437 +12321 +32 +21482 +590 +21483 +21484 +1415 +21485 +21486 +43 +21487 +21488 +21489 +303 +345 +2281 +16437 +19618 +5801 +9102 +3768 +43 +21490 +21491 +21492 +705 +14603 +1082 +19 +4023 +6496 +21050 +1912 +4916 +1168 +8668 +19 +770 +21493 +21494 +8208 +15718 +11754 +349 +720 +303 +1234 +9 +15718 +20794 +2537 +21495 +21496 +21497 +21498 +57 +14 +21499 +19404 +21500 +446 +19 +14 +21501 +665 +11754 +21502 +17698 +43 +19404 +21503 +248 +185 +21504 +5780 +21505 +4278 +564 +43 +21506 +590 +590 +21507 +590 +155 +4126 +21508 +305 +8280 +3978 +2243 +21509 +683 +15384 +22 +20181 +21510 +19618 +16887 +19918 +21511 +19 +21512 +19 +21513 +915 +21514 +554 +248 +43 +14 +21515 +590 +21516 +19 +112 +21517 +2790 +19618 +20 +8668 +21518 +21519 +1012 +8403 +1208 +21520 +3964 +21521 +647 +4907 +19618 +21522 +21523 +272 +21524 +337 +349 +21525 +248 +21526 +21527 +278 +155 +5592 +303 +18045 +21528 +12987 +8367 +21529 +21530 +345 +21531 +21532 +21533 +573 +3546 +4 +315 +21534 +21535 +323 +9410 +590 +284 +21536 +21537 +14604 +1047 +21538 +13364 +13913 +379 +10222 +237 +19 +659 +21539 +1655 +17136 +411 +21540 +19404 +21541 +43 +43 +21542 +19618 +20 +19 +57 +989 +21543 +43 +15718 +590 +18780 +21544 +1927 +9 +2841 +305 +3 +21545 +21546 +2412 +21547 +13111 +2310 +21548 +14 +43 +1559 +3546 +21549 +21550 +21551 +15720 +3601 +201 +15718 +8849 +14477 +19618 +3944 +13566 +21552 +21553 +9628 +43 +155 +43 +286 +21554 +2314 +137 +14 +21555 +155 +21556 +8392 +21557 +345 +464 +5211 +21558 +21559 +21560 +15 +495 +21561 +5780 +21562 +2463 +15 +5780 +43 +8098 +590 +2 +842 +1364 +21563 +21564 +823 +590 +21565 +43 +19456 +286 +19 +21566 +2286 +345 +10111 +14020 +21567 +21568 +21569 +14477 +536 +770 +21570 +21571 +21572 +12668 +103 +21573 +21574 +337 +14 +590 +21575 +19 +19404 +248 +137 +14 +15274 +21576 +19618 +21577 +323 +21578 +21579 +1382 +5725 +337 +21580 +21581 +2 +770 +25 +16511 +590 +10727 +19241 +9 +188 +9 +21582 +237 +14477 +17871 +736 +21583 +6096 +349 +21584 +99 +1119 +138 +21585 +286 +3546 +590 +14 +43 +18695 +57 +21586 +590 +19664 +21587 +21588 +17602 +178 +19618 +32 +11754 +16826 +741 +1153 +8188 +21589 +185 +3546 +77 +14 +21590 +540 +21591 +5780 +736 +3376 +196 +21592 +1991 +52 +6217 +21593 +242 +21594 +14420 +32 +21595 +21596 +14477 +21597 +21598 +21599 +21600 +4083 +2314 +5498 +14 +57 +6883 +21601 +89 +15 +2577 +21602 +736 +16991 +43 +10 +164 +43 +590 +25 +1090 +21603 +284 +21604 +18695 +21605 +21606 +14477 +21607 +21608 +21609 +915 +250 +736 +21610 +284 +21611 +286 +19655 +18047 +19838 +21612 +21613 +736 +349 +14477 +9 +15 +14 +345 +14523 +21614 +21615 +10591 +20600 +303 +21616 +12987 +536 +827 +21617 +19618 +9 +790 +21618 +80 +21619 +14 +21620 +213 +2004 +21621 +590 +3601 +21622 +43 +19618 +16461 +1559 +250 +437 +20576 +1310 +14 +21623 +15720 +12987 +20315 +21624 +21625 +357 +873 +21626 +22 +5780 +21627 +656 +21628 +3100 +248 +554 +284 +18045 +349 +21629 +286 +337 +21630 +345 +1013 +21631 +89 +554 +6363 +21632 +2135 +43 +21633 +21634 +21635 +11087 +21636 +1831 +440 +104 +823 +21637 +21638 +303 +554 +19460 +1011 +21639 +5780 +188 +2 +21640 +9 +14 +3480 +339 +21641 +21642 +114 +845 +115 +21643 +21644 +21645 +2 +305 +337 +21646 +248 +2 +21647 +21648 +21649 +21650 +57 +590 +736 +3546 +43 +15718 +286 +736 +21651 +14 +13361 +7053 +1648 +971 +21652 +16437 +358 +21653 +1961 +21654 +1531 +15718 +2832 +21655 +21656 +18283 +15718 +4606 +303 +21657 +21658 +21659 +21660 +21661 +19618 +21662 +21663 +21664 +21665 +155 +712 +21666 +43 +20952 +21667 +2476 +19618 +248 +10787 +43 +21668 +21669 +10439 +736 +21670 +1018 +3354 +823 +43 +2287 +13409 +21671 +3575 +205 +21672 +3546 +20 +8809 +2733 +21673 +21674 +248 +440 +9 +14 +665 +19 +286 +21675 +43 +10439 +15718 +177 +20383 +66 +4963 +17602 +12987 +665 +15592 +2121 +8188 +21676 +645 +57 +590 +21677 +9 +21678 +284 +21679 +21680 +21681 +19 +17372 +19618 +21682 +17834 +5208 +43 +43 +823 +16180 +373 +43 +823 +17608 +278 +365 +21683 +345 +715 +12987 +2 +736 +21684 +21685 +2029 +286 +21686 +2787 +21687 +21688 +10439 +791 +21689 +19618 +770 +3546 +17698 +2694 +18695 +21690 +3204 +19 +21691 +14 +590 +8297 +15718 +14 +19618 +1503 +736 +21692 +21693 +1382 +2414 +1316 +21694 +21695 +3546 +155 +21696 +270 +104 +19 +15349 +18695 +19 +21697 +536 +21698 +21699 +21700 +284 +21701 +3239 +14 +13566 +21276 +8668 +43 +21702 +21703 +21704 +15718 +17625 +1012 +491 +3369 +43 +10880 +590 +764 +21705 +5075 +3553 +590 +19218 +36 +21706 +1606 +43 +21707 +21708 +14 +2029 +21709 +21710 +10727 +2117 +17039 +4128 +2944 +43 +15971 +11754 +823 +15 +5169 +21711 +12479 +6341 +5117 +21712 +11822 +14 +19199 +16725 +823 +19618 +15275 +21713 +3546 +1385 +10439 +21714 +13375 +21715 +1817 +823 +43 +21716 +1224 +590 +770 +8297 +345 +14 +286 +845 +3546 +21717 +19618 +1382 +21718 +21719 +15054 +3435 +19 +19618 +590 +21720 +21721 +14 +249 +14 +48 +21722 +5387 +15989 +13973 +43 +373 +9 +20 +19 +2804 +21723 +1249 +7835 +43 +736 +18597 +692 +8508 +17698 +21724 +11762 +21725 +398 +13151 +2837 +19 +14363 +6627 +736 +21726 +3484 +19218 +6518 +21727 +15718 +720 +286 +1442 +43 +345 +19852 +21728 +6430 +9 +14079 +32 +377 +43 +213 +192 +2314 +21729 +736 +21730 +20 +19618 +21731 +14 +21732 +18283 +21733 +3546 +3045 +20 +46 +823 +15914 +736 +3546 +21734 +2197 +43 +43 +21735 +3546 +21736 +21737 +345 +19618 +971 +3995 +379 +21738 +2540 +6595 +7011 +178 +1157 +1047 +21739 +8501 +57 +4269 +21740 +38 +2 +7053 +21741 +21742 +21743 +19 +15718 +201 +590 +43 +21744 +21745 +21746 +176 +21747 +11995 +21748 +590 +21749 +1082 +16437 +21750 +9 +21751 +21752 +21753 +1224 +21754 +7137 +416 +7053 +188 +14 +2302 +21755 +13988 +21756 +19 +21757 +21758 +19 +80 +21759 +21760 +14986 +11762 +21761 +21762 +43 +665 +43 +21763 +21764 +424 +21765 +21766 +19618 +14 +21767 +2316 +21768 +19 +21769 +13266 +3324 +21770 +21771 +21772 +14477 +21773 +21774 +21775 +21776 +15220 +21777 +21778 +21779 +736 +3546 +5197 +21780 +21781 +15718 +14 +19585 +21782 +10913 +21783 +21784 +21785 +13150 +21786 +1107 +770 +13361 +1991 +21787 +21788 +15535 +21789 +21790 +19 +2734 +9 +16917 +2459 +4313 +21791 +11483 +16389 +3546 +317 +11754 +21792 +21793 +21794 +98 +9 +7045 +4185 +770 +21795 +19404 +21796 +5780 +3353 +21797 +21798 +21799 +21800 +21801 +21802 +14342 +3 +21803 +21804 +352 +21805 +1166 +21806 +155 +21807 +345 +155 +5169 +14 +16 +21350 +14 +4665 +21808 +21809 +155 +1578 +193 +7137 +6571 +18418 +21810 +583 +736 +19618 +19618 +3546 +15718 +415 +21811 +21812 +21813 +21814 +21815 +19304 +21816 +683 +1109 +590 +57 +3755 +2314 +22 +20586 +21817 +1542 +3546 +1021 +3546 +19404 +153 +20340 +188 +21818 +32 +9 +21819 +21820 +3546 +6095 +21821 +1961 +21822 +21823 +18047 +21824 +22 +213 +284 +19 +21825 +21826 +20 +76 +21827 +286 +21828 +21829 +35 +3546 +21830 +21831 +21832 +21833 +1612 +14856 +349 +21834 +43 +5438 +590 +21835 +21836 +19 +736 +10239 +6950 +1090 +155 +16619 +21837 +1817 +43 +35 +4414 +665 +18982 +19404 +248 +12118 +19 +18453 +19918 +20 +59 +21838 +809 +22 +8876 +8668 +349 +3546 +21839 +213 +16447 +21840 +2 +21841 +21842 +18695 +2039 +14 +21843 +20803 +164 +1208 +248 +303 +303 +15 +21844 +21845 +21846 +349 +1615 +21847 +155 +21848 +536 +21849 +43 +1384 +284 +21850 +14 +248 +3978 +345 +284 +21851 +14604 +14 +21852 +21853 +303 +19618 +178 +21854 +193 +15718 +3546 +590 +337 +337 +19 +21855 +736 +533 +209 +736 +213 +21856 +21857 +21858 +345 +179 +1364 +284 +21859 +19 +303 +213 +20888 +21860 +21861 +284 +1425 +590 +18695 +21862 +248 +21863 +21864 +1295 +1442 +3470 +5326 +21865 +4750 +491 +358 +9 +21866 +20 +3978 +10497 +21867 +34 +21868 +21869 +5083 +21870 +736 +21871 +5075 +14 +14 +15718 +6086 +322 +21872 +15939 +22 +11483 +21873 +21874 +248 +3216 +1481 +554 +590 +9 +590 +14660 +21875 +272 +21876 +222 +10 +14 +1529 +21877 +20952 +337 +21878 +1648 +16 +21879 +43 +270 +21880 +971 +21579 +3228 +7835 +4028 +21881 +1559 +43 +21882 +14240 +21883 +12864 +21884 +14299 +21885 +222 +15718 +21886 +21887 +21888 +590 +11482 +19413 +303 +14 +29 +1765 +12222 +651 +1217 +21889 +5755 +21890 +43 +21891 +5085 +6214 +138 +6841 +5561 +21892 +43 +21893 +21894 +20825 +80 +21895 +209 +21896 +12772 +13721 +99 +1066 +21897 +21898 +345 +21899 +10117 +21900 +646 +21901 +2804 +7137 +590 +21902 +14 +21903 +154 +1082 +21904 +21905 +21906 +17112 +21907 +21908 +21909 +21910 +21911 +823 +5780 +17136 +790 +57 +21912 +18683 +736 +19618 +57 +13721 +21913 +9804 +3858 +590 +57 +21914 +1566 +21915 +21916 +21917 +14369 +32 +13748 +21918 +1189 +21919 +21920 +345 +424 +21921 +14 +13721 +43 +21922 +3452 +1442 +155 +2655 +13721 +21923 +590 +21855 +9900 +2577 +16981 +1208 +9 +19119 +21924 +21925 +19655 +9 +8351 +21926 +10 +1056 +21927 +201 +25 +4414 +21928 +21929 +590 +19 +19 +19618 +590 +21930 +11683 +19 +21931 +21932 +21933 +13721 +15718 +345 +3546 +4651 +20 +21934 +43 +590 +10287 +8210 +2537 +43 +21935 +16437 +19404 +21936 +21937 +21938 +19618 +21939 +533 +15718 +21940 +14 +43 +21941 +770 +1559 +349 +18418 +13045 +112 +20 +21942 +646 +21943 +21944 +36 +21945 +573 +21946 +21947 +14 +201 +14 +651 +1765 +2314 +9 +32 +15718 +915 +21948 +4028 +14 +21949 +21950 +19852 +590 +1134 +1310 +6877 +19618 +20572 +590 +5719 +15141 +9 +250 +590 +1481 +21951 +2324 +19852 +823 +21952 +554 +21953 +19655 +286 +590 +21954 +13803 +15649 +21955 +115 +10 +7172 +17277 +373 +683 +21956 +1049 +21957 +14 +20 +21958 +21959 +1536 +6997 +21960 +57 +21961 +590 +2419 +13721 +21947 +5197 +21962 +5085 +4634 +2 +21963 +3546 +6950 +21964 +21965 +21966 +21967 +822 +21968 +18327 +13411 +21969 +317 +7053 +14629 +10 +3270 +7053 +19342 +20600 +6877 +21970 +21971 +21972 +57 +3086 +5839 +3095 +9837 +21973 +188 +21974 +17635 +2358 +21975 +19 +21976 +4873 +16437 +17749 +21689 +13570 +21947 +15718 +12053 +21977 +21978 +568 +19618 +19 +16437 +1508 +590 +14 +21979 +21980 +6341 +43 +21981 +19618 +345 +21982 +43 +19 +14 +868 +196 +19618 +1817 +209 +11471 +1612 +21983 +172 +2035 +736 +9 +345 +357 +155 +590 +349 +21373 +21984 +155 +19500 +21985 +21986 +345 +1912 +19618 +573 +3548 +9 +21987 +797 +21988 +10789 +21947 +14001 +21989 +15718 +286 +736 +4028 +1300 +8334 +2372 +3546 +2260 +21990 +21991 +736 +736 +2733 +43 +4364 +19 +21992 +5085 +14 +21993 +21994 +3546 +21995 +345 +21996 +155 +683 +14477 +38 +21997 +43 +21998 +19472 +21999 +736 +736 +7053 +14 +22000 +22001 +7032 +22002 +22003 +14 +686 +19 +22004 +648 +590 +43 +22005 +16437 +22006 +272 +22 +21631 +134 +1481 +22007 +9 +827 +5438 +3978 +22008 +345 +19 +3296 +22009 +10791 +19618 +21947 +43 +15461 +1542 +22010 +43 +22011 +9 +9 +12005 +22012 +887 +1765 +19404 +22013 +14 +14604 +21947 +22014 +57 +12788 +15220 +22015 +22016 +4 +21681 +11282 +19 +4 +12166 +2734 +22017 +3546 +590 +21698 +22018 +22019 +21776 +14 +22020 +13564 +345 +2 +22021 +155 +22022 +22023 +15595 +164 +22024 +57 +21088 +22025 +16205 +862 +9 +22026 +53 +22027 +3546 +22028 +57 +22029 +4388 +22030 +22031 +104 +8244 +1425 +22032 +22033 +22034 +80 +2289 +22035 +21689 +14363 +15718 +22036 +1604 +38 +823 +5083 +22037 +14 +21947 +22038 +2234 +21947 +22039 +19 +590 +936 +345 +2197 +6776 +22040 +22041 +15718 +17515 +16609 +32 +22042 +22043 +48 +22044 +137 +8307 +14 +590 +22045 +21315 +2935 +22046 +15718 +22047 +22048 +3546 +872 +22049 +554 +22050 +7717 +2 +590 +22051 +590 +22 +22052 +9688 +13721 +22053 +5780 +22054 +357 +1310 +22055 +4 +22056 +284 +19 +35 +19 +19 +519 +19 +248 +22057 +16437 +590 +22058 +14477 +2476 +1870 +20555 +3546 +22059 +22060 +13361 +11321 +1961 +2561 +16437 +19 +22061 +19 +13721 +22062 +22063 +16693 +21689 +1049 +58 +21947 +22064 +3546 +6741 +1696 +22065 +3598 +284 +248 +9 +590 +14 +14 +22066 +22067 +590 +13529 +1109 +22068 +21947 +22069 +590 +16484 +213 +22070 +22071 +4055 +22072 +22073 +22074 +19939 +22075 +20199 +590 +3546 +736 +22076 +19655 +17571 +22077 +303 +80 +13675 +22078 +11471 +8351 +7716 +9 +736 +22079 +1047 +14 +22080 +46 +18209 +22081 +7078 +3546 +303 +21947 +8668 +500 +590 +365 +4502 +20 +2804 +22082 +43 +2064 +14001 +14363 +337 +228 +22083 +22084 +22085 +1013 +3546 +201 +8226 +250 +22086 +2640 +474 +22087 +22088 +6496 +43 +22089 +19618 +21947 +1559 +3 +1425 +1066 +358 +11321 +22090 +22091 +8668 +22092 +9 +22093 +22094 +22095 +14603 +155 +681 +840 +15718 +1181 +22096 +10407 +209 +269 +9 +3317 +554 +14477 +21947 +22097 +213 +595 +701 +21947 +209 +2550 +22098 +354 +22099 +22100 +20305 +590 +22101 +5457 +436 +21947 +8668 +14 +248 +155 +15718 +16844 +16443 +13150 +15 +2733 +201 +19 +22102 +22103 +590 +22104 +22105 +209 +22106 +19 +1091 +20803 +22107 +1160 +10 +317 +590 +22108 +22109 +19618 +4056 +14 +14000 +22110 +823 +4752 +22111 +484 +43 +24 +4414 +22112 +22113 +22114 +11685 +2764 +9705 +21776 +15476 +22115 +1710 +22116 +22117 +5085 +22118 +22119 +19404 +22120 +57 +2577 +11762 +43 +3353 +1208 +22121 +22122 +1352 +736 +57 +15 +22123 +22124 +12987 +22125 +155 +22126 +2733 +3875 +3684 +14 +2139 +13721 +22127 +22128 +671 +22129 +19 +22130 +2577 +22131 +869 +15 +22132 +6571 +736 +171 +22133 +1384 +707 +1502 +22134 +43 +764 +3 +14 +43 +12603 +169 +22135 +22136 +29 +3546 +77 +5204 +22137 +22138 +43 +22139 +4055 +21947 +3220 +196 +22140 +22141 +22142 +8297 +14 +43 +14603 +1680 +16234 +22143 +22144 +21947 +155 +22145 +36 +2911 +12588 +22146 +21947 +22147 +1605 +9 +19 +22148 +6612 +1199 +22149 +21947 +22150 +1332 +43 +19404 +22151 +21947 +349 +16826 +22152 +4174 +7137 +1863 +3546 +22153 +1384 +14604 +2476 +1181 +22154 +22155 +3601 +8668 +13961 +20 +89 +22156 +20 +22157 +22158 +21338 +8234 +4979 +22159 +22160 +21947 +694 +665 +16450 +2410 +22161 +13721 +14 +22162 +345 +250 +22163 +1300 +19218 +22164 +22165 +19 +519 +14 +21745 +5976 +7053 +736 +22166 +22167 +38 +20952 +554 +15718 +286 +22168 +14 +21778 +22169 +3553 +22015 +22170 +22171 +345 +7855 +8566 +2577 +22172 +3546 +671 +1011 +21689 +19618 +22173 +22174 +286 +22175 +11754 +1326 +22176 +22177 +18695 +377 +554 +22178 +21869 +736 +22179 +11212 +13566 +43 +286 +14 +590 +22180 +98 +22181 +22182 +22183 +19209 +22184 +22185 +17011 +1316 +22186 +590 +22187 +169 +14 +22188 +15718 +20 +22189 +5209 +22190 +22191 +22192 +209 +14856 +3546 +22193 +22194 +22195 +22196 +4028 +43 +1864 +286 +14604 +5780 +22197 +22198 +237 +19618 +4552 +1090 +43 +22199 +8214 +7747 +576 +21904 +1181 +43 +19 +22200 +22201 +16826 +22202 +32 +22203 +22204 +22205 +13493 +699 +19635 +22 +21947 +22206 +11341 +22207 +646 +1742 +19 +22208 +1853 +19618 +5344 +43 +14 +22209 +591 +22210 +2260 +22211 +2561 +14477 +4450 +13721 +19519 +590 +22212 +2035 +22213 +9095 +12404 +7835 +19618 +823 +22214 +19618 +43 +22215 +1112 +22216 +22217 +15583 +3995 +57 +22218 +19 +22219 +3601 +448 +14363 +19844 +1112 +22220 +8255 +22221 +14477 +9 +736 +22222 +736 +10 +910 +14 +155 +10392 +21947 +725 +2872 +16822 +22223 +15586 +22224 +22225 +1425 +43 +1013 +22226 +22227 +22228 +764 +22229 +22230 +22231 +43 +21947 +13721 +22232 +19 +22233 +19 +590 +19404 +2577 +22234 +22235 +57 +22236 +22237 +18982 +2577 +3470 +43 +22238 +19618 +22239 +519 +345 +1154 +736 +6095 +22240 +3172 +13721 +20058 +19 +590 +22241 +12300 +22242 +22243 +17670 +29 +19618 +7053 +590 +4650 +10 +43 +15718 +3330 +2577 +19 +22244 +1134 +8936 +286 +21031 +14 +2830 +931 +14420 +15044 +3369 +142 +21999 +13355 +22245 +22246 +15718 +736 +22247 +20572 +14604 +3546 +20679 +19618 +2790 +17464 +8668 +2042 +8351 +7037 +22248 +22249 +1364 +22250 +14 +14102 +19618 +22251 +43 +22158 +2449 +1559 +22252 +209 +22253 +43 +22254 +19 +1425 +22255 +22 +22256 +2415 +9194 +22257 +22258 +22259 +590 +22260 +19852 +22261 +2928 +22262 +720 +22263 +19404 +713 +19655 +590 +7379 +21698 +554 +22264 +43 +8188 +8297 +3601 +185 +18695 +3546 +7516 +8037 +201 +1563 +22265 +3546 +21947 +22266 +14482 +22267 +22268 +590 +22269 +613 +57 +155 +3657 +625 +22270 +22271 +20 +1066 +22272 +764 +2561 +21947 +18798 +14 +196 +22273 +22274 +22275 +22276 +21947 +22277 +21947 +14 +22278 +5773 +22279 +155 +11762 +3 +22280 +4028 +167 +379 +14856 +6096 +57 +2065 +15718 +2 +22281 +14603 +21338 +2 +1100 +16589 +22282 +22283 +22284 +590 +345 +1912 +338 +22285 +22286 +764 +22287 +823 +590 +15569 +20 +13943 +57 +3546 +21088 +22288 +3546 +5438 +19342 +22289 +17687 +345 +21947 +14 +14 +286 +4441 +22290 +15 +22291 +185 +22292 +14 +22293 +20 +22294 +22295 +2764 +22296 +22297 +21947 +19404 +736 +15324 +22298 +13721 +873 +21947 +1115 +22299 +21947 +22300 +13566 +2 +11471 +345 +155 +11762 +21947 +179 +22301 +22302 +4075 +17602 +2733 +22303 +8188 +1508 +21947 +16102 +14 +7242 +736 +22304 +19655 +22305 +137 +43 +43 +22306 +2 +22307 +3546 +13111 +22308 +22309 +15229 +14 +3546 +22310 +80 +14 +286 +4502 +1095 +6335 +8668 +15 +43 +2121 +22311 +18503 +286 +412 +22312 +22313 +11966 +15 +286 +22314 +11341 +22315 +15054 +253 +15054 +14524 +43 +8367 +2019 +21947 +22316 +7053 +2629 +19 +22317 +22318 +22319 +178 +2537 +5773 +20555 +22320 +9 +22321 +22322 +22323 +8021 +20877 +736 +554 +22324 +22325 +3546 +21947 +21947 +21947 +89 +13721 +22326 +1533 +2882 +19 +272 +43 +3559 +22327 +22328 +22329 +6766 +22330 +22331 +3546 +22332 +20616 +22333 +12987 +22334 +19618 +22335 +677 +22336 +349 +22337 +21689 +707 +8668 +590 +7855 +22338 +1529 +345 +22339 +22340 +89 +6766 +9 +22341 +9 +20991 +22342 +22343 +1011 +15683 +590 +140 +1051 +176 +20952 +22344 +12696 +13721 +2287 +21947 +19472 +1529 +165 +21947 +8297 +22345 +22346 +22347 +3546 +22348 +7137 +677 +22349 +14 +7137 +2 +242 +1364 +9389 +67 +21947 +22350 +22351 +22352 +22353 +22354 +22355 +21689 +22356 +16340 +5085 +43 +43 +22357 +4502 +43 +8668 +22041 +345 +14 +248 +22358 +10793 +22359 +22360 +22361 +665 +1571 +13260 +14 +22362 +167 +22363 +823 +22364 +22365 +21947 +22366 +16453 +19852 +1208 +590 +43 +736 +1961 +7053 +14532 +16437 +21947 +1112 +22367 +22368 +17340 +345 +19797 +1013 +29 +43 +823 +46 +9 +21947 +7053 +22369 +8220 +22370 +19404 +43 +172 +14 +22371 +19404 +22372 +228 +21947 +12584 +3546 +22373 +677 +22374 +21777 +9 +8508 +22375 +5039 +22376 +9 +12404 +20803 +8297 +19404 +915 +21889 +43 +22377 +590 +9 +237 +495 +15308 +1961 +22378 +20876 +2593 +9 +22379 +22380 +43 +720 +22381 +34 +22382 +22383 +3775 +15 +7137 +554 +22384 +345 +43 +98 +7183 +7176 +14 +15718 +590 +345 +38 +22385 +22386 +286 +22387 +590 +5780 +1423 +22388 +22389 +983 +2310 +22390 +1316 +155 +1169 +4756 +6560 +19655 +1976 +22391 +14 +590 +9024 +22392 +22393 +22394 +7835 +14477 +7174 +22395 +22396 +22397 +590 +915 +1696 +1214 +22398 +19404 +21031 +515 +22399 +1307 +22400 +21507 +14524 +872 +12596 +22401 +21947 +22402 +2537 +15 +15718 +22403 +22404 +22405 +825 +590 +43 +22406 +7855 +8458 +22407 +22408 +379 +22409 +19618 +21947 +22410 +22411 +9 +22412 +3978 +22413 +22414 +209 +15 +16378 +3546 +2795 +22415 +32 +22416 +22417 +20199 +1091 +3546 +14363 +22418 +22419 +22420 +6095 +22421 +590 +21689 +22422 +43 +22423 +3353 +22424 +15238 +32 +2577 +14363 +22425 +22426 +22427 +22428 +7855 +1834 +13721 +176 +19655 +22429 +21947 +2019 +14 +22430 +20199 +22065 +19618 +14 +3546 +514 +22431 +22432 +22433 +22434 +590 +736 +22435 +20952 +18045 +6939 +22308 +22196 +665 +17277 +1316 +7835 +14689 +22436 +586 +29 +677 +22437 +17247 +22438 +2 +19057 +16609 +22439 +22440 +415 +13721 +22441 +590 +736 +22442 +17920 +19655 +13375 +19793 +14 +8465 +1765 +6950 +20819 +22443 +22444 +22307 +22445 +13030 +19655 +22446 +22447 +13721 +15718 +32 +22448 +193 +22449 +9410 +43 +590 +3553 +3251 +22450 +22451 +2314 +22452 +5780 +345 +533 +736 +15 +22453 +3546 +155 +2410 +66 +4313 +3546 +13721 +736 +19 +22454 +14 +178 +809 +22455 +22456 +736 +22457 +14604 +1688 +22458 +22459 +1112 +19 +22460 +2514 +21776 +11754 +10004 +17151 +598 +22461 +10381 +345 +14025 +284 +15718 +872 +155 +7053 +14 +1559 +22462 +22463 +22464 +1203 +22465 +22466 +22467 +5764 +5314 +13721 +9 +14001 +18184 +19 +22468 +1745 +286 +18823 +358 +15718 +22469 +12220 +13474 +21045 +22470 +8668 +57 +590 +22471 +22472 +12864 +303 +32 +2135 +14477 +22473 +22474 +2459 +22475 +22476 +11934 +22477 +248 +22478 +22479 +736 +349 +43 +22480 +22481 +22482 +590 +121 +22483 +22484 +22485 +14603 +19119 +14 +14 +20228 +22486 +14 +7987 +286 +3192 +1234 +14 +22487 +248 +21107 +3416 +22488 +568 +21947 +14477 +22489 +5387 +736 +11428 +9 +22490 +213 +3978 +14603 +17470 +5502 +32 +17277 +14603 +4747 +10 +22491 +213 +14 +13721 +22492 +76 +337 +22493 +21947 +16826 +17302 +213 +9 +3421 +337 +176 +21947 +22494 +22495 +2064 +2356 +22496 +22497 +22498 +20708 +18047 +736 +22499 +345 +3546 +21947 +21947 +22500 +4 +5420 +21947 +590 +22501 +345 +1961 +14 +15718 +43 +736 +43 +20 +3407 +590 +21947 +155 +43 +22502 +22308 +22503 +201 +22504 +1559 +22505 +158 +22506 +554 +22507 +9 +13721 +5441 +22508 +22509 +43 +22510 +43 +1038 +22511 +303 +22512 +823 +11754 +22513 +5780 +21031 +43 +17412 +22514 +22515 +7053 +1820 +17871 +8668 +22 +22516 +590 +22517 +32 +2577 +14 +22518 +22519 +19655 +13721 +1442 +21947 +13150 +22520 +8961 +22521 +22522 +1060 +590 +13495 +17911 +22523 +22524 +22525 +22526 +12117 +22527 +15356 +21947 +22528 +286 +52 +2 +14179 +286 +14363 +22529 +22530 +22308 +19 +1508 +1696 +16826 +22012 +22531 +7053 +22532 +8094 +22533 +15207 +22534 +6171 +19624 +17062 +19655 +3546 +936 +22535 +22536 +43 +590 +22537 +15718 +323 +2310 +590 +22538 +22539 +9 +3 +399 +13150 +22540 +57 +22541 +13913 +868 +22542 +3546 +19618 +590 +323 +19618 +13721 +286 +19939 +5780 +22420 +19618 +15718 +3546 +21947 +1508 +21947 +22543 +248 +22544 +15718 +14 +22545 +790 +9123 +1423 +4502 +345 +18045 +5085 +22546 +22547 +22548 +5344 +4 +22549 +22550 +153 +43 +4765 +2035 +7053 +14 +2593 +301 +22551 +22552 +2804 +22553 +1180 +43 +1514 +57 +99 +18882 +22554 +345 +57 +349 +19995 +22555 +5080 +5601 +57 +3978 +323 +22556 +665 +43 +22557 +1115 +15718 +22558 +43 +337 +21947 +22559 +22560 +35 +16258 +10 +22561 +13721 +1090 +345 +14079 +5908 +19618 +14343 +1961 +14 +272 +17608 +590 +411 +19618 +22562 +19 +16437 +22563 +19404 +19220 +22564 +22565 +2 +14 +20 +22566 +16437 +22567 +43 +10245 +15 +22568 +22569 +4403 +2851 +6468 +2818 +14808 +872 +2015 +713 +7991 +2579 +7291 +21947 +22570 +6372 +9 +597 +25 +2694 +22571 +586 +22572 +22573 +1666 +22268 +14856 +2577 +22574 +43 +22575 +14 +19852 +3546 +22576 +22577 +22578 +536 +22579 +22580 +22581 +19 +1364 +19 +22582 +22583 +19740 +46 +22584 +22585 +736 +14477 +9 +22586 +20555 +19618 +1048 +13721 +155 +18038 +19838 +3452 +13721 +22587 +22588 +222 +22589 +22 +398 +2446 +286 +22590 +8685 +22591 +3908 +823 +17136 +57 +303 +16992 +16443 +1415 +22592 +3491 +22593 +22594 +272 +14477 +19618 +22595 +12404 +6122 +201 +22596 +20765 +519 +1914 +303 +43 +2919 +15 +57 +22597 +398 +3484 +43 +590 +590 +14 +19618 +201 +22598 +5100 +14 +647 +21107 +16826 +17267 +18517 +823 +3553 +770 +10 +22599 +22600 +22601 +464 +225 +22602 +43 +1011 +57 +22603 +19 +22604 +1524 +284 +1224 +22605 +18503 +43 +284 +14 +43 +22606 +22607 +286 +22608 +345 +15718 +22609 +29 +7835 +14604 +22610 +286 +22611 +213 +17855 +22612 +14 +22613 +22614 +2316 +43 +16437 +1442 +22615 +22616 +4441 +22617 +22618 +303 +519 +22619 +43 +15845 +155 +736 +345 +9 +349 +22620 +677 +590 +22621 +12404 +22622 +10 +22623 +22624 +15881 +590 +16899 +590 +12858 +4907 +8668 +22625 +16798 +22626 +548 +17859 +345 +14 +18686 +1287 +647 +22627 +22628 +43 +21053 +22629 +399 +590 +22630 +10999 +4441 +22631 +22632 +13721 +21947 +15718 +2769 +22633 +22634 +823 +21947 +22635 +22636 +209 +2 +188 +345 +8981 +18978 +7577 +20575 +284 +303 +345 +1222 +22637 +19618 +22638 +18896 +22639 +6095 +22640 +22641 +22268 +15645 +2 +20 +179 +22642 +1048 +17136 +345 +14477 +22643 +21947 +43 +10318 +3546 +38 +8351 +8355 +19 +22644 +22645 +22308 +9 +6877 +1696 +2446 +22646 +590 +1823 +16975 +22647 +21947 +15951 +11822 +590 +22648 +1300 +349 +1605 +22649 +22650 +15718 +276 +15914 +21947 +14 +22651 +46 +22652 +22653 +14420 +21947 +590 +19404 +337 +2561 +22654 +21689 +22655 +201 +484 +2 +248 +22656 +19404 +10 +270 +22657 +22658 +6741 +279 +345 +14604 +22659 +22660 +22661 +345 +20555 +22662 +8351 +554 +6776 +19 +12404 +21947 +17404 +519 +13807 +43 +590 +1927 +22663 +1531 +22664 +9 +5117 +1226 +11321 +590 +2756 +22665 +22666 +57 +303 +345 +337 +22667 +22668 +43 +16947 +3491 +22669 +22670 +286 +43 +22671 +22672 +35 +2356 +9837 +436 +22673 +6505 +671 +22674 +286 +22675 +8668 +16322 +2015 +22676 +22677 +22678 +22679 +13700 +43 +538 +22680 +12684 +22681 +7053 +590 +19618 +5780 +2577 +43 +9 +16437 +9 +683 +21947 +22682 +740 +22683 +11762 +286 +5119 +18869 +43 +155 +1203 +22684 +5780 +22685 +7276 +60 +590 +22686 +1955 +32 +10230 +22687 +323 +22688 +303 +1423 +2768 +21889 +349 +20 +284 +22689 +590 +7379 +2 +1577 +22690 +823 +3546 +6096 +43 +736 +57 +541 +22028 +3546 +19618 +1013 +10782 +1739 +22691 +57 +196 +15718 +22692 +22693 +22694 +43 +6496 +1465 +2310 +1091 +15690 +20 +43 +18257 +22695 +20 +43 +2550 +358 +411 +448 +13721 +7053 +22696 +22697 +209 +284 +22698 +17956 +13721 +22699 +849 +495 +12152 +14 +345 +30 +22700 +14 +22701 +21694 +590 +345 +21947 +3 +8246 +22702 +9 +20 +22703 +20132 +9 +7585 +541 +22704 +5085 +373 +22705 +823 +155 +32 +272 +6950 +22706 +7855 +19 +16102 +13578 +22707 +22708 +22709 +98 +4827 +2035 +11762 +22710 +22711 +14477 +22712 +22713 +22714 +6496 +3546 +6114 +19136 +14 +22715 +6518 +14 +22716 +20572 +1637 +13452 +14 +22717 +57 +22718 +331 +22719 +22720 +21947 +43 +22721 +22722 +18792 +22723 +22724 +15718 +22725 +344 +2764 +57 +32 +77 +14604 +22726 +959 +823 +1765 +590 +19655 +22727 +14 +3866 +21947 +2577 +22728 +21689 +9 +19852 +21947 +9 +4502 +286 +22729 +22730 +14 +22731 +2 +2 +1082 +3601 +823 +19 +22732 +15 +22 +22268 +21947 +22733 +22734 +2260 +22735 +19618 +3546 +13721 +22268 +19655 +1720 +720 +25 +32 +1792 +286 +519 +22736 +22737 +21947 +21331 +22738 +2 +11482 +22739 +21947 +15718 +3601 +590 +590 +1364 +1648 +22740 +8668 +1203 +22741 +22742 +9738 +18064 +22743 +15718 +22744 +22745 +43 +10274 +9 +18695 +19266 +2009 +18798 +13721 +1765 +5791 +19618 +15720 +22746 +278 +22747 +9 +22748 +22749 +19229 +9563 +22750 +20499 +22308 +22751 +22752 +19618 +345 +19618 +22753 +22754 +22755 +790 +22756 +22757 +14856 +18484 +21947 +22758 +22759 +19618 +5267 +1559 +22760 +43 +10848 +7624 +9 +2790 +397 +1229 +18512 +5085 +20657 +19 +22761 +19618 +18896 +22762 +1991 +22763 +1524 +22764 +13801 +22765 +22766 +22767 +19970 +5489 +22768 +13405 +590 +9 +19618 +12230 +14477 +1234 +19491 +263 +22769 +3546 +1364 +22770 +21947 +22771 +358 +22772 +1571 +43 +22773 +249 +4684 +2744 +29 +22774 +60 +15914 +1559 +286 +8249 +22775 +10848 +265 +22776 +15167 +22777 +22778 +7046 +3546 +22599 +14 +19 +15618 +22779 +554 +13179 +20 +85 +2259 +286 +22780 +8668 +2577 +3978 +1352 +736 +2733 +397 +5438 +22781 +1051 +22782 +1423 +188 +5197 +5773 +22783 +22784 +22785 +15 +14079 +15031 +178 +736 +770 +22786 +519 +22787 +21947 +19655 +10790 +22788 +22789 +5299 +22790 +1107 +345 +2243 +137 +22791 +19 +22792 +21947 +19655 +1109 +19 +9 +16 +21947 +22793 +17973 +2 +21947 +22794 +22795 +35 +9837 +22796 +2 +43 +22797 +22798 +2697 +4125 +3546 +5085 +22799 +22800 +188 +1612 +11822 +22801 +13508 +9913 +22802 +590 +22803 +22804 +22805 +22806 +4765 +22807 +14 +22808 +736 +11509 +1423 +345 +14079 +22809 +15718 +4367 +22810 +22811 +57 +15914 +286 +21947 +22812 +19852 +373 +22813 +13721 +22814 +22815 +22816 +22817 +19160 +22818 +14 +19792 +822 +7835 +155 +349 +22819 +22820 +345 +22821 +10137 +32 +2040 +2577 +21947 +22822 +1553 +20 +18047 +22823 +155 +13721 +21947 +3067 +14 +155 +15 +22824 +22825 +1812 +22826 +345 +2577 +7451 +992 +22827 +22828 +22829 +1157 +10146 +590 +1214 +21947 +590 +22830 +80 +22831 +1112 +5650 +2042 +736 +22832 +21947 +22833 +22 +176 +21841 +22834 +22835 +13143 +7256 +21947 +18683 +32 +22836 +43 +6480 +590 +8508 +4990 +1109 +11029 +7053 +22837 +22838 +19618 +99 +22839 +345 +20 +15718 +22840 +936 +22841 +3978 +14524 +8999 +349 +22842 +345 +3546 +19618 +22843 +22844 +484 +597 +12194 +22845 +10031 +345 +137 +43 +22846 +19 +22847 +22308 +7855 +464 +3543 +43 +265 +32 +22 +22848 +22849 +13721 +15824 +22850 +22851 +14276 +22852 +19618 +16695 +22853 +17385 +16402 +915 +4906 +5599 +19618 +736 +6627 +59 +46 +43 +5326 +286 +2577 +22124 +22854 +22855 +22856 +590 +9143 +16437 +5649 +22857 +22858 +22859 +272 +14 +345 +22860 +43 +213 +213 +22861 +590 +21947 +22862 +15068 +736 +21947 +22863 +89 +22864 +10737 +2694 +14604 +9 +2410 +22865 +665 +22866 +18896 +21947 +713 +736 +22867 +19160 +21030 +345 +22868 +4227 +5780 +22869 +284 +286 +9 +22870 +22871 +22872 +8465 +2310 +14363 +213 +9 +22873 +17790 +3546 +20942 +22874 +19737 +22875 +915 +9 +22876 +138 +22877 +22878 +1559 +272 +823 +22879 +22420 +22880 +22881 +22882 +22883 +590 +1290 +22884 +2804 +14 +9 +2000 +22885 +484 +18951 +22886 +1090 +770 +248 +19 +22308 +22887 +22888 +22268 +6883 +13528 +21689 +115 +2415 +43 +7835 +22889 +14 +4313 +18798 +22890 +1901 +21947 +14 +22891 +22892 +22893 +14 +19618 +590 +22894 +14 +19618 +5837 +20572 +10 +9 +1091 +770 +538 +379 +19 +590 +20 +43 +22895 +4364 +22896 +19792 +22897 +11480 +5780 +22898 +19618 +13721 +22899 +736 +590 +19852 +57 +10256 +590 +8849 +22900 +15167 +13721 +8566 +14404 +14477 +22901 +345 +22902 +14477 +21947 +1385 +6950 +22903 +22904 +8393 +15718 +35 +845 +19618 +286 +4808 +22905 +3095 +3546 +2260 +694 +7231 +13721 +22906 +7364 +22907 +43 +22908 +22909 +2314 +155 +15718 +20 +345 +554 +22910 +10151 +3291 +1082 +22911 +533 +22912 +1012 +2804 +22865 +5791 +22913 +11754 +22914 +22915 +1920 +3544 +22916 +14477 +4414 +43 +43 +22917 +98 +22918 +22919 +14 +3435 +22920 +648 +20949 +736 +22921 +22922 +20803 +19 +3546 +9 +303 +22923 +22924 +19 +736 +3406 +138 +19618 +337 +12621 +22925 +17466 +22926 +5085 +590 +9156 +22927 +3546 +616 +8249 +22928 +3546 +22929 +9578 +14604 +43 +22930 +19404 +66 +20572 +22931 +22407 +15419 +22932 +22933 +590 +764 +53 +22934 +519 +22935 +365 +13721 +736 +5725 +18061 +284 +19478 +9410 +22936 +19 +32 +21947 +554 +590 +22937 +764 +19 +349 +14363 +24 +22938 +22939 +4441 +21947 +616 +22940 +22941 +19618 +2243 +18448 +590 +15914 +22942 +1437 +712 +22943 +22944 +286 +22945 +58 +712 +248 +8103 +14679 +1716 +21947 +1943 +22946 +114 +22947 +3546 +1606 +19 +11754 +22948 +4263 +15989 +19618 +16102 +22949 +22950 +19618 +22951 +19 +337 +1612 +19206 +19618 +8566 +17687 +3553 +22855 +43 +19618 +730 +2253 +15718 +1021 +22952 +17043 +22953 +274 +22954 +21693 +14 +1310 +345 +22955 +15973 +22956 +22957 +303 +14770 +196 +19 +19852 +22958 +7137 +21947 +17553 +3291 +44 +303 +21947 +22959 +22960 +1082 +4502 +10239 +5476 +22961 +13721 +2834 +3546 +19 +736 +14 +345 +29 +19655 +22962 +22963 +5215 +22964 +209 +590 +22965 +22409 +22966 +590 +222 +22967 +18345 +533 +4518 +32 +915 +14001 +22968 +4683 +1100 +1605 +22969 +736 +2419 +43 +22970 +7835 +533 +597 +15623 +1503 +14604 +19 +345 +873 +1289 +66 +57 +22971 +19 +4278 +22972 +19 +3626 +915 +9 +22973 +22974 +19797 +5764 +9986 +22975 +6883 +22976 +57 +19618 +14 +21947 +22977 +3546 +11321 +2926 +736 +500 +3546 +222 +21947 +21947 +16024 +22978 +22979 +3276 +17112 +8668 +736 +22980 +22981 +22982 +60 +22983 +22984 +22985 +22986 +22987 +9 +15718 +22988 +22989 +538 +22990 +7835 +20390 +22991 +14 +1115 +43 +29 +286 +19 +12743 +19924 +22992 +22993 +22994 +4441 +7053 +9 +18440 +22995 +761 +19489 +22996 +22997 +22998 +5780 +3626 +3546 +22999 +142 +23000 +23001 +23002 +286 +15 +3546 +23003 +23004 +14603 +286 +3491 +13721 +21947 +17799 +16437 +23005 +23006 +43 +303 +23007 +13168 +323 +3973 +379 +14477 +23008 +827 +23009 +22308 +23010 +1012 +23011 +1612 +665 +16826 +43 +23012 +2243 +720 +16981 +23013 +7835 +23014 +23015 +12916 +23016 +248 +284 +284 +1905 +46 +590 +590 +209 +2577 +23017 +23018 +19965 +23019 +19 +823 +590 +15718 +354 +412 +10338 +23020 +18882 +19 +15 +35 +21045 +15068 +1513 +23021 +19 +19618 +1688 +23022 +21947 +23023 +22 +15718 +23024 +2983 +337 +20280 +284 +19918 +11192 +13721 +284 +16477 +11274 +22268 +345 +12987 +8460 +3816 +671 +4808 +23025 +249 +286 +23026 +213 +6095 +14 +15513 +23027 +23028 +15 +23029 +1442 +19655 +19404 +23030 +1356 +1513 +23031 +12560 +6766 +32 +23032 +21947 +23033 +272 +9396 +23034 +23035 +338 +2459 +22922 +284 +7032 +14 +23036 +736 +1765 +337 +23037 +21947 +8255 +590 +248 +23038 +23039 +248 +2 +590 +23040 +250 +8566 +23041 +10781 +11762 +23042 +1870 +137 +23043 +590 +21947 +57 +16437 +32 +745 +5990 +10063 +7444 +2790 +2135 +43 +21947 +19965 +15718 +57 +3546 +23044 +9 +721 +23045 +213 +23046 +23047 +32 +19 +23048 +2 +13908 +15496 +11754 +3546 +98 +23049 +23050 +23051 +23052 +23053 +23054 +18695 +2197 +14 +19618 +23055 +286 +590 +23056 +15845 +19 +1698 +14477 +23057 +23058 +13570 +514 +23059 +23060 +23061 +7208 +23062 +1021 +23063 +23064 +43 +43 +23065 +286 +1559 +23066 +9 +13721 +8188 +9 +23067 +18744 +736 +7666 +23068 +155 +14 +345 +23069 +23070 +23071 +3551 +32 +286 +23072 +720 +5085 +23073 +736 +240 +2008 +23074 +2042 +19 +2476 +23075 +5119 +23076 +910 +1529 +21947 +23077 +1172 +349 +12337 +1100 +23078 +18695 +6449 +23079 +16 +9 +2260 +8188 +23080 +6786 +736 +23081 +23082 +590 +19 +23083 +13801 +23084 +15718 +109 +736 +19618 +23085 +23086 +43 +13721 +286 +14 +11283 +3601 +23087 +23088 +8668 +1090 +590 +23089 +12531 +9 +3546 +2561 +20 +18792 +823 +1386 +23090 +23091 +2561 +2026 +20087 +35 +14 +338 +23092 +345 +8297 +4441 +9 +345 +23093 +286 +21947 +32 +23094 +3601 +23095 +23096 +23097 +790 +11321 +1300 +713 +23098 +533 +20442 +23099 +17903 +4166 +9 +15 +2309 +21947 +23100 +23101 +10 +23102 +23103 +23104 +2 +3543 +23105 +1082 +22236 +14 +23106 +23063 +11762 +16178 +15720 +2260 +21947 +9 +2944 +23107 +764 +23108 +19618 +14343 +10163 +286 +23109 +23110 +23111 +1310 +4634 +554 +23112 +21947 +349 +1051 +586 +9788 +386 +3946 +18503 +23113 +23114 +12307 +18503 +1169 +398 +1051 +345 +590 +43 +19456 +23115 +345 +86 +590 +17360 +96 +250 +23116 +23117 +14477 +1181 +707 +23118 +13721 +43 +32 +137 +21689 +23119 +23120 +23121 +89 +21947 +21947 +7053 +23122 +274 +43 +915 +23123 +590 +23124 +519 +23125 +23126 +5611 +9 +53 +23127 +1524 +13754 +23128 +21947 +6571 +23129 +23130 +1425 +23131 +43 +1688 +349 +23132 +590 +1765 +19 +3546 +155 +179 +9410 +1190 +317 +9 +23133 +23134 +23135 +17670 +12402 +23136 +1356 +9577 +18807 +12479 +20952 +23137 +349 +23138 +645 +3978 +19618 +23139 +23140 +23141 +23142 +1559 +19 +11341 +10 +23143 +14 +5326 +23144 +23145 +5110 +12203 +23146 +23147 +14 +590 +23148 +15718 +3601 +3649 +20785 +155 +23149 +3544 +1605 +23150 +19 +3546 +868 +23151 +23152 +23153 +14477 +586 +1051 +23154 +23155 +1224 +6095 +14 +57 +590 +736 +3546 +23156 +8566 +57 +3546 +1095 +46 +19 +21947 +209 +23157 +9 +23158 +590 +23159 +23160 +3385 +23161 +23162 +683 +16826 +2 +18862 +23163 +1052 +23164 +590 +4677 +21689 +720 +19404 +23165 +23166 +2 +377 +5099 +19618 +736 +9 +23167 +2121 +590 +32 +736 +1382 +379 +3546 +14342 +274 +23168 +20803 +23169 +14 +178 +560 +23170 +23171 +18695 +23172 +19 +22 +1612 +590 +22474 +14604 +2414 +16437 +823 +3546 +43 +23173 +23174 +19 +2577 +7137 +8297 +14 +15810 +23175 +21031 +14693 +345 +23176 +19795 +18978 +209 +832 +20803 +2 +249 +14621 +23177 +590 +23178 +1310 +736 +23179 +23180 +3553 +43 +1710 +13721 +57 +9422 +14 +21947 +43 +23181 +16 +22 +1517 +23182 +7940 +9 +19095 +11522 +23183 +809 +23184 +23185 +23186 +23187 +32 +1593 +3034 +23188 +23189 +32 +736 +15914 +15 +23190 +3546 +23191 +23192 +20 +2 +23193 +9 +23194 +1149 +2 +21947 +5780 +23195 +23196 +32 +616 +22282 +23197 +23198 +1847 +286 +250 +23199 +201 +23200 +21947 +222 +23201 +12005 +790 +23202 +827 +23203 +14 +15471 +573 +11 +703 +23204 +43 +23205 +399 +19618 +9 +43 +23206 +736 +3559 +590 +2234 +2061 +16437 +18503 +823 +57 +23207 +272 +23208 +7208 +23209 +6480 +23210 +22057 +1812 +23211 +57 +345 +9 +155 +32 +590 +23212 +377 +23213 +8668 +365 +14 +23214 +5218 +4441 +20 +1698 +21947 +20555 +43 +21947 +23215 +272 +20373 +3546 +23216 +2476 +9 +19 +23217 +286 +20864 +9 +14814 +2550 +1332 +23218 +43 +8392 +18798 +15718 +14477 +23219 +35 +20616 +15718 +23220 +23221 +23222 +19 +7835 +370 +19404 +4816 +23223 +1517 +19618 +23224 +23225 +23226 +16102 +23227 +590 +14001 +18695 +3119 +16825 +9 +23228 +357 +23229 +14 +842 +43 +823 +323 +286 +32 +23230 +23231 +23232 +23233 +3 +345 +1992 +43 +13721 +43 +971 +15 +23234 +7945 +12120 +23235 +23208 +23236 +13721 +16437 +822 +43 +2 +23237 +23238 +1513 +23239 +9 +14477 +23240 +20085 +23241 +8392 +23242 +8476 +23243 +23244 +14 +19618 +13207 +23245 +22618 +23246 +19 +23247 +23248 +23249 +9 +23250 +23251 +7167 +14343 +11551 +23252 +3546 +9 +23103 +3 +23253 +23254 +23255 +18376 +1823 +19404 +19 +1051 +14 +23256 +286 +590 +613 +16121 +43 +23257 +23258 +2249 +23259 +19 +23260 +736 +19618 +23261 +14001 +683 +60 +21689 +5614 +9939 +43 +23262 +5757 +3546 +590 +43 +1867 +590 +35 +720 +13721 +23263 +11209 +21627 +19335 +5851 +13721 +23264 +23265 +13484 +23266 +13721 +23267 +14 +21947 +23268 +15 +558 +43 +13150 +19404 +22041 +23269 +23270 +15 +23271 +15914 +7962 +23272 +15541 +15167 +6354 +590 +15718 +23273 +23274 +17571 +23275 +1051 +23226 +349 +19618 +5022 +155 +142 +23276 +23277 +18778 +736 +9 +286 +155 +23278 +23279 +19143 +23280 +23281 +15718 +647 +23282 +23111 +10 +23283 +1716 +4775 +358 +201 +541 +265 +23284 +17698 +13638 +23285 +5780 +915 +23286 +23287 +5085 +23288 +43 +3546 +23289 +23290 +809 +21791 +23291 +23292 +14363 +23293 +1116 +9 +13375 +23294 +23295 +1100 +23296 +1739 +43 +21947 +23297 +14846 +23298 +3546 +23299 +736 +23300 +23301 +2577 +21535 +19 +20 +349 +2035 +23302 +23303 +19618 +9 +1765 +23304 +5085 +2625 +5820 +18914 +265 +12005 +3002 +20 +89 +2410 +5410 +19655 +23063 +43 +23305 +23306 +590 +3546 +23307 +5837 +23308 +23309 +3787 +345 +201 +23310 +23311 +201 +1559 +23312 +14 +23313 +349 +349 +21947 +23314 +3543 +23315 +19091 +590 +23316 +4765 +21947 +23317 +1332 +18003 +10791 +19618 +22276 +23318 +9 +5627 +23319 +23320 +38 +3546 +6533 +23321 +23322 +23323 +15595 +2260 +23324 +3325 +23325 +201 +736 +17571 +1834 +23326 +23327 +23328 +17815 +14122 +872 +21947 +590 +32 +122 +3 +1696 +12067 +23329 +20 +23330 +23331 +2 +222 +23332 +14 +4292 +13721 +736 +19618 +155 +23333 +23334 +23335 +23336 +23337 +21947 +23338 +23339 +286 +2243 +11735 +5085 +692 +23340 +23341 +23342 +5326 +342 +32 +10349 +23343 +23344 +23345 +35 +23346 +1012 +989 +3601 +15483 +590 +23347 +23348 +317 +23349 +32 +179 +3559 +538 +23350 +554 +14856 +43 +3546 +1056 +23351 +21947 +484 +357 +23352 +19 +19 +21689 +3598 +590 +13412 +23353 +823 +23354 +23355 +21947 +736 +23356 +6341 +20776 +23357 +43 +19965 +13721 +17380 +46 +23358 +23359 +3155 +23360 +10946 +23361 +1716 +43 +272 +23362 +10356 +23363 +155 +13361 +9591 +23364 +21947 +11364 +14846 +19 +22865 +19792 +1423 +23365 +14 +15 +89 +8149 +13721 +13721 +101 +736 +14 +57 +13721 +21669 +140 +23366 +19 +23367 +15914 +15442 +17871 +57 +19618 +23368 +23369 +14 +23370 +3958 +12359 +209 +9 +13721 +20 +23371 +21947 +4263 +590 +19404 +573 +23372 +23373 +23374 +12534 +19618 +3030 +13721 +13976 +23375 +23376 +4824 +7379 +21689 +2 +23377 +14604 +23378 +21947 +23379 +3759 +554 +586 +590 +3 +43 +10 +9 +21947 +23380 +23381 +23382 +23383 +3546 +21947 +23384 +21031 +23385 +8460 +3638 +19404 +14 +22688 +416 +14 +23386 +23387 +23388 +43 +17809 +23389 +424 +21947 +23390 +10 +23391 +9 +43 +89 +23392 +23393 +4775 +21947 +9 +19 +23394 +23395 +23396 +2243 +23397 +23398 +9 +1696 +4764 +23399 +15824 +3543 +23400 +185 +21947 +21199 +1038 +23401 +43 +4441 +2459 +19 +5271 +823 +21947 +8855 +20 +1566 +155 +14363 +19 +19 +8356 +23402 +23403 +23404 +23405 +4702 +23406 +349 +554 +14 +23407 +4741 +9953 +14 +1316 +23408 +590 +3492 +23409 +32 +20 +23410 +21947 +15718 +3446 +712 +14 +286 +736 +2694 +19 +23411 +9118 +14 +6877 +590 +13721 +20952 +23412 +9 +23413 +9210 +590 +23414 +29 +12987 +16981 +43 +286 +1157 +12067 +590 +590 +12987 +23415 +1559 +188 +640 +23416 +43 +14 +14 +533 +10 +7291 +1529 +155 +23417 +7137 +23418 +3553 +20185 +349 +14420 +21947 +18982 +23419 +1465 +3546 +19 +736 +23420 +46 +23421 +21947 +23422 +4824 +19 +23423 +2 +15718 +23424 +23425 +23426 +7032 +23427 +9630 +5041 +286 +23428 +590 +1716 +337 +112 +19 +23429 +32 +19091 +23430 +345 +22042 +21947 +3473 +590 +23431 +6430 +3005 +19618 +13721 +14 +23432 +57 +43 +1870 +8789 +23433 +809 +178 +323 +23434 +22420 +331 +19 +178 +23417 +21947 +23435 +2804 +23436 +379 +23437 +23438 +23439 +25 +7053 +23440 +3059 +19918 +12845 +23441 +590 +23442 +9871 +4441 +8849 +179 +936 +23443 +590 +23444 +736 +137 +23445 +13129 +23446 +590 +736 +22010 +23314 +23447 +9 +13343 +1559 +2042 +12934 +5085 +736 +23448 +671 +23449 +23450 +768 +4296 +43 +23451 +1107 +23452 +683 +23453 +6571 +15718 +17466 +23454 +57 +4544 +19984 +23063 +379 +3543 +19404 +23455 +23456 +19 +2975 +6766 +14 +10737 +12307 +176 +23457 +23458 +683 +19413 +9396 +7291 +5780 +23459 +23460 +23461 +137 +23462 +19 +6055 +736 +21947 +736 +20952 +22587 +21947 +3251 +7053 +23226 +9 +823 +23463 +34 +665 +23464 +5085 +23465 +19 +32 +18995 +23466 +23467 +16780 +23468 +23469 +286 +23470 +19618 +14 +23471 +23472 +13049 +11966 +23473 +764 +18045 +23474 +23475 +23476 +20245 +19 +23477 +1559 +20785 +9177 +43 +23478 +23479 +23480 +1090 +1316 +18956 +590 +14 +23481 +6038 +15718 +23482 +259 +19 +43 +19618 +13566 +12976 +1091 +104 +495 +23483 +23484 +23485 +164 +3034 +16437 +23486 +272 +35 +5973 +23487 +416 +823 +23488 +23489 +2 +23490 +43 +720 +21947 +14 +23491 +23492 +21947 +23493 +201 +6571 +849 +590 +23494 +10028 +222 +14 +16437 +21947 +1013 +57 +15039 +736 +11995 +23495 +23496 +6011 +23497 +23498 +19 +23499 +23500 +23501 +1082 +22 +250 +19 +19 +23502 +23503 +155 +936 +23504 +16437 +590 +23505 +345 +23506 +19404 +23507 +43 +23508 +23509 +23510 +865 +377 +23511 +23512 +647 +21947 +19404 +23513 +286 +104 +23514 +23515 +213 +23516 +23517 +23518 +284 +43 +370 +21027 +20 +590 +12033 +23519 +23520 +345 +23521 +141 +8668 +3228 +10 +349 +5071 +2770 +2537 +23522 +284 +590 +1529 +590 +18951 +23523 +1018 +23524 +21849 +23525 +18978 +23526 +23527 +9054 +23528 +21947 +12893 +2260 +23529 +21947 +989 +23530 +20 +411 +586 +286 +736 +14477 +19618 +23531 +2 +23532 +590 +43 +23533 +4693 +23534 +1688 +15718 +12757 +17495 +43 +590 +349 +1716 +14079 +43 +9497 +345 +188 +379 +23535 +12579 +42 +43 +23536 +23537 +20340 +13566 +23538 +23539 +378 +13721 +3492 +248 +66 +248 +23540 +3842 +15718 +2202 +9 +21947 +279 +23541 +21947 +21947 +823 +38 +19618 +20 +14 +8668 +12404 +5780 +23542 +915 +3849 +22042 +495 +671 +2 +23543 +23544 +23545 +23546 +23547 +23548 +15699 +22666 +248 +23549 +13265 +43 +23550 +3 +20507 +13474 +16557 +303 +683 +13405 +15914 +23551 +23176 +23552 +23553 +6874 +23554 +23555 +23556 +23557 +248 +23558 +736 +17011 +23559 +23560 +3 +872 +14 +736 +80 +1364 +23359 +23561 +1107 +1604 +23103 +23562 +2561 +21811 +23563 +23564 +23565 +337 +7328 +18132 +323 +8566 +23566 +12987 +23567 +17698 +248 +23568 +23569 +284 +756 +23570 +38 +9 +23571 +1870 +11420 +5689 +112 +21947 +21947 +2449 +823 +823 +20952 +23572 +284 +23573 +23574 +23575 +1517 +2 +23576 +19618 +213 +2035 +23577 +1112 +23359 +23578 +19404 +248 +23579 +23580 +23504 +345 +23581 +5577 +13279 +23582 +23583 +11995 +23584 +23585 +21947 +560 +23586 +8566 +14 +284 +590 +5622 +15 +12466 +259 +14477 +15 +3 +1012 +9 +736 +15718 +8668 +23587 +23588 +23589 +23590 +14604 +23591 +43 +3546 +7835 +3553 +22403 +2804 +23592 +57 +23593 +43 +337 +16281 +371 +736 +3546 +23594 +8566 +827 +9 +590 +23595 +23063 +23596 +23597 +23103 +736 +23598 +23599 +23600 +13361 +19 +15718 +756 +14 +823 +1049 +13721 +19 +32 +19 +23601 +19655 +8668 +23602 +21947 +23603 +43 +23604 +1316 +19218 +96 +43 +1104 +18250 +736 +23605 +2197 +19405 +14 +23606 +23607 +7137 +338 +736 +936 +1157 +23608 +23609 +19 +43 +23610 +43 +209 +23611 +2159 +19 +4463 +23612 +23613 +345 +23614 +11762 +23615 +13616 +590 +178 +10356 +23616 +23617 +23618 +1502 +22308 +23619 +23620 +23621 +23622 +2769 +538 +249 +23623 +20533 +345 +23624 +865 +57 +23625 +77 +1604 +9 +23626 +590 +201 +23627 +20773 +16437 +19404 +8668 +19009 +23628 +5438 +11754 +23629 +5085 +9759 +20 +14 +23630 +23631 +57 +11321 +213 +23632 +770 +16866 +286 +5833 +23633 +53 +1961 +1520 +23634 +3081 +2919 +23635 +1352 +23313 +23636 +13943 +23637 +21947 +21947 +272 +16437 +16 +23638 +303 +32 +9 +23639 +1961 +48 +23640 +201 +16437 +23641 +43 +23642 +23643 +23644 +349 +14527 +43 +23645 +23646 +1508 +2 +15718 +647 +3396 +23647 +590 +15 +23648 +1100 +19852 +1442 +19 +23649 +5820 +2577 +823 +19618 +23650 +2593 +23651 +23652 +43 +165 +23653 +23654 +23655 +23656 +16437 +23657 +554 +43 +57 +18064 +23658 +1655 +4765 +10 +23659 +736 +22 +23660 +23661 +286 +14477 +23662 +14001 +19 +713 +23663 +6571 +1066 +23664 +23665 +1291 +23666 +3546 +225 +22 +590 +3546 +514 +23667 +18951 +15572 +3978 +23668 +8351 +19 +683 +5780 +6950 +19 +11210 +21947 +9 +23669 +4963 +303 +23670 +845 +936 +23671 +11341 +7236 +23672 +7053 +286 +122 +23673 +736 +23674 +3546 +23675 +736 +286 +21947 +5022 +21947 +16437 +4263 +5067 +21031 +23676 +188 +23677 +23678 +22075 +2 +23679 +23680 +16118 +21776 +21947 +17151 +43 +20803 +57 +19404 +2 +13721 +12827 +286 +272 +958 +2561 +23681 +23682 +720 +5780 +286 +402 +14816 +1082 +3 +590 +23683 +5415 +2824 +14216 +7379 +248 +23684 +14175 +23685 +23686 +1870 +349 +213 +399 +23687 +213 +8696 +590 +303 +89 +21947 +337 +2561 +23688 +9 +23689 +23690 +18045 +11762 +2577 +43 +23063 +23691 +1316 +23692 +213 +32 +23693 +23694 +21947 +13721 +2911 +23695 +23696 +21947 +21947 +23697 +13721 +43 +21947 +213 +1026 +23507 +22 +3252 +1559 +974 +10 +887 +21947 +2804 +14102 +23698 +337 +1991 +345 +1606 +823 +19 +20113 +9 +303 +176 +14 +32 +155 +23699 +23226 +23700 +23701 +590 +3034 +23702 +23703 +5438 +16253 +23704 +1042 +19091 +23705 +284 +554 +16826 +970 +23706 +248 +412 +345 +7835 +23707 +22865 +1316 +17151 +14001 +495 +21080 +14033 +23708 +21947 +5833 +23709 +15720 +23710 +23711 +21947 +23712 +7137 +23713 +9 +736 +3546 +188 +155 +14 +2694 +14 +20 +22371 +303 +23714 +345 +1905 +303 +248 +23715 +14586 +22963 +23716 +15820 +18823 +707 +2 +303 +23717 +23718 +14 +303 +284 +23719 +23720 +213 +23721 +21947 +23722 +22 +349 +21947 +12987 +20797 +1930 +9 +23723 +23724 +7053 +23725 +23726 +892 +349 +14477 +23727 +2790 +8610 +3876 +13129 +23728 +823 +736 +19618 +23729 +15 +519 +15718 +23730 +1212 +248 +23731 +23732 +20 +23733 +590 +5085 +155 +590 +1961 +23734 +823 +323 +14 +43 +12080 +23735 +9245 +23736 +23737 +23738 +590 +11762 +18234 +17064 +19618 +23739 +23740 +13476 +23741 +887 +23742 +19 +337 +284 +23743 +21849 +23744 +23745 +2281 +23746 +694 +213 +213 +15320 +22042 +21947 +7945 +4012 +4543 +23747 +23748 +9 +23749 +16144 +23750 +14 +23751 +284 +23752 +16190 +9 +23753 +57 +15713 +23754 +8566 +457 +104 +15820 +9 +17698 +337 +23755 +345 +301 +22986 +222 +18283 +19618 +213 +823 +23756 +23757 +5085 +317 +8244 +15718 +23758 +286 +10406 +13713 +23759 +5773 +23760 +155 +23761 +23762 +32 +5119 +137 +9 +1696 +23763 +303 +3026 +23764 +23765 +23766 +12431 +2567 +23767 +4128 +23768 +5908 +323 +23769 +317 +323 +9 +19 +23770 +323 +23771 +23772 +18816 +23773 +379 +21403 +590 +23774 +21689 +155 +736 +19 +23775 +4502 +23776 +23777 +43 +2975 +21947 +15054 +23778 +349 +10356 +1051 +35 +32 +23779 +23780 +23781 +35 +23782 +178 +1356 +590 +13721 +15068 +23783 +23784 +77 +43 +1901 +14 +14 +10096 +23785 +21947 +19618 +23786 +23787 +14020 +23788 +915 +23789 +648 +20 +23103 +19655 +23790 +590 +14603 +15 +590 +23791 +286 +1154 +345 +23792 +19 +23793 +1765 +22505 +21947 +21698 +3546 +22242 +23794 +43 +21310 +345 +23795 +788 +23796 +3724 +23797 +23798 +14599 +23799 +23800 +140 +23801 +19 +57 +349 +18695 +19486 +13361 +193 +3 +9 +13721 +23802 +43 +22187 +57 +57 +23803 +1517 +349 +14 +23804 +590 +23805 +17151 +23806 +16411 +23807 +19618 +9 +842 +1224 +23808 +337 +23809 +446 +19 +1027 +14 +10846 +23810 +23811 +15718 +23812 +1107 +17273 +7379 +23813 +15718 +2609 +23814 +19618 +43 +7183 +32 +57 +19 +2 +3669 +21947 +21947 +23815 +23816 +21947 +16573 +23817 +23818 +23819 +20143 +18616 +8668 +43 +23820 +573 +155 +23821 +3546 +19 +21947 +23822 +23823 +3546 +10177 +19404 +23824 +21107 +23825 +3275 +23826 +415 +861 +23827 +19618 +23828 +23829 +4306 +927 +43 +23168 +7053 +140 +1578 +19792 +23830 +13721 +303 +23831 +21947 +22 +43 +1384 +23832 +23833 +6907 +23834 +19655 +23835 +52 +98 +23836 +1226 +21049 +15460 +7053 +22 +20 +865 +23226 +349 +265 +188 +43 +707 +21947 +17151 +23837 +349 +19 +23838 +590 +19 +23839 +23840 +29 +16413 +15810 +23841 +7458 +586 +21947 +23842 +23843 +1223 +23844 +23845 +23846 +23847 +23848 +23842 +23849 +23850 +23851 +43 +155 +23852 +19 +23853 +358 +14175 +349 +3626 +23854 +19618 +19 +345 +23855 +736 +23856 +137 +23857 +590 +1384 +23858 +5085 +21947 +1112 +23859 +23860 +349 +5041 +23861 +2550 +3139 +495 +7448 +1867 +23862 +23863 +23864 +23865 +13279 +23866 +9 +23867 +533 +2415 +20 +845 +23868 +43 +23869 +23870 +23871 +23872 +23873 +19852 +23874 +491 +23875 +23464 +1307 +155 +23876 +7137 +16437 +1048 +2 +23877 +23878 +2859 +21947 +349 +23879 +15718 +23880 +736 +2537 +15951 +23881 +23426 +23882 +1082 +32 +43 +15384 +23883 +23884 +1696 +23885 +819 +590 +16102 +57 +23886 +23887 +8297 +17956 +11471 +89 +23888 +272 +736 +23889 +23890 +23891 +23892 +23893 +23894 +554 +1496 +23895 +14 +671 +1716 +23896 +9481 +23897 +9187 +6744 +57 +23898 +23899 +590 +19618 +137 +137 +21947 +22099 +5085 +23842 +7291 +1224 +22 +12987 +6784 +7053 +1154 +23900 +23901 +1768 +23902 +66 +19792 +1090 +23903 +7598 +14001 +1991 +1091 +23904 +1222 +19618 +17151 +23905 +9389 +21280 +21947 +23906 +4625 +286 +23907 +4827 +23908 +23909 +2694 +23910 +2769 +15442 +23911 +43 +3546 +9 +20572 +1942 +14 +23912 +7276 +9 +790 +12013 +566 +23913 +358 +23914 +11013 +19618 +2410 +1920 +11607 +21947 +15975 +21947 +647 +14 +21947 +590 +2577 +736 +23915 +89 +936 +9 +23916 +10 +1571 +249 +23917 +155 +2035 +286 +23918 +7053 +915 +13375 +5764 +32 +185 +823 +23919 +2561 +23920 +349 +730 +155 +57 +1442 +1012 +736 +23921 +23922 +1524 +19618 +1149 +4578 +3546 +23923 +7855 +9797 +23924 +19797 +22233 +5601 +80 +1442 +5331 +5075 +379 +23925 +7276 +16910 +2617 +237 +23926 +13721 +18982 +23927 +23928 +4368 +3059 +736 +23929 +89 +23930 +14392 +23931 +7778 +736 +23932 +3546 +590 +77 +19 +155 +4364 +23933 +23934 +19404 +23935 +23103 +10030 +14 +23936 +23937 +616 +345 +23938 +15718 +23939 +23940 +23941 +16885 +15718 +19618 +764 +806 +23942 +23943 +2804 +23944 +122 +23945 +3546 +43 +303 +13721 +23946 +647 +32 +23947 +23948 +1066 +23949 +1307 +23842 +188 +20785 +23950 +9 +23951 +17136 +89 +32 +554 +17635 +8297 +736 +345 +23952 +345 +14 +720 +2117 +3572 +303 +13721 +23953 +22666 +23220 +17151 +337 +213 +19160 +23954 +17151 +23955 +17698 +1508 +21999 +248 +43 +248 +23956 +9 +13807 +720 +23842 +284 +23957 +20773 +416 +21947 +23958 +23959 +21947 +23960 +23961 +23962 +23963 +23964 +647 +817 +10 +2577 +13721 +248 +2 +3544 +3546 +2117 +736 +284 +345 +23965 +23966 +736 +13566 +32 +339 +213 +1612 +18041 +9 +13655 +573 +23967 +248 +23968 +23969 +23970 +23971 +19618 +402 +23972 +1425 +3546 +248 +349 +23973 +14001 +43 +590 +23974 +15718 +23975 +43 +23976 +248 +23977 +23978 +10028 +872 +23979 +5085 +23980 +22986 +23981 +1300 +14001 +23358 +13721 +43 +21947 +398 +643 +1716 +23982 +790 +14147 +4278 +22891 +23983 +303 +22 +299 +20952 +23984 +19 +23985 +23986 +23987 +17151 +89 +4278 +23988 +23989 +23990 +23991 +43 +15718 +23992 +10004 +15718 +1314 +22 +1529 +43 +23993 +21947 +14 +464 +1150 +23994 +248 +7053 +23995 +12042 +29 +17151 +936 +23996 +23997 +23998 +21947 +21475 +23999 +43 +6817 +43 +14604 +491 +20 +7053 +38 +24000 +590 +24001 +43 +24002 +720 +24003 +60 +32 +1423 +345 +5316 +21947 +22639 +13150 +14 +349 +14909 +24004 +18664 +337 +2336 +24005 +24006 +24007 +19810 +20040 +14131 +24008 +3601 +24009 +24010 +14693 +19618 +6741 +736 +24011 +24012 +6364 +2841 +2 +24013 +19618 +24014 +416 +16736 +57 +21947 +317 +21947 +1824 +15718 +7053 +19 +201 +284 +57 +24015 +24016 +590 +345 +24017 +24018 +13848 +13721 +14477 +590 +21947 +21947 +24019 +7855 +24020 +303 +24021 +24022 +19618 +10789 +13038 +736 +24023 +22505 +24024 +24025 +24026 +24027 +590 +19 +7357 +9 +21947 +790 +22 +19618 +14591 +15 +345 +24028 +9 +554 +21947 +349 +24029 +590 +2 +9 +23226 +43 +24030 +22355 +519 +533 +637 +24031 +14 +14477 +10 +303 +19618 +24032 +736 +868 +9449 +24033 +24034 +60 +13361 +21627 +3842 +2859 +24035 +12618 +23842 +24036 +14013 +17638 +24037 +19218 +590 +21947 +7183 +21947 +9 +19218 +24038 +24039 +24040 +24041 +24042 +17151 +112 +20600 +17608 +815 +24043 +24044 +24045 +8807 +286 +12534 +2600 +24046 +15718 +13320 +24047 +24048 +114 +24049 +18798 +590 +590 +43 +7134 +1822 +17 +57 +1538 +2 +5907 +53 +18553 +8798 +155 +24050 +24051 +3978 +1612 +12701 +155 +24052 +24053 +590 +17151 +24054 +24055 +24056 +1011 +19 +736 +1090 +24057 +13343 +2260 +24058 +24059 +24060 +24061 +2577 +23688 +354 +16976 +24062 +590 +2694 +14 +24063 +24064 +18695 +1172 +23805 +248 +21947 +24065 +2009 +24066 +24067 +6741 +23196 +5780 +16826 +2 +24068 +2724 +5310 +38 +213 +9 +24069 +24070 +13721 +24071 +20 +24072 +14 +24073 +379 +24074 +19655 +7276 +17410 +6171 +13045 +3678 +24075 +60 +2859 +34 +21947 +7855 +20315 +21947 +21947 +21947 +373 +43 +21947 +495 +1612 +17670 +43 +21947 +24076 +16118 +3543 +10147 +189 +24077 +24078 +24079 +32 +24080 +4278 +24081 +823 +24082 +3546 +250 +19439 +17400 +23842 +1224 +7855 +958 +15993 +24083 +24084 +24085 +3684 +3256 +590 +8668 +1716 +349 +286 +24086 +683 +17670 +3599 +7855 +13721 +647 +7379 +24087 +3546 +24088 +15 +19404 +17119 +9713 +19618 +4407 +249 +22183 +24089 +24090 +20 +4461 +20 +1047 +10356 +17698 +24091 +2 +57 +20340 +1198 +24092 +533 +24093 +590 +2983 +209 +24094 +5085 +24095 +24096 +24097 +24098 +24099 +1991 +1531 +24100 +19 +57 +14914 +24101 +24102 +14000 +24103 +9759 +17151 +1026 +1559 +213 +24104 +213 +23842 +19 +24105 +57 +9 +24106 +201 +24107 +7208 +24108 +24109 +24110 +35 +7835 +3341 +21947 +284 +1559 +19 +24111 +24112 +284 +24113 +3876 +24114 +14216 +7960 +209 +14 +554 +98 +43 +29 +9 +9 +24115 +6501 +17151 +3546 +20600 +349 +2577 +22787 +590 +23571 +155 +24116 +1300 +24117 +19 +155 +24118 +19618 +24119 +590 +17340 +736 +32 +1044 +303 +349 +15971 +349 +19 +24120 +24121 +14 +32 +22442 +554 +349 +19618 +24122 +213 +1870 +345 +22417 +24123 +19618 +24124 +3546 +24125 +554 +284 +2415 +24126 +43 +24127 +1810 +2 +397 +8939 +5780 +4126 +24128 +24129 +15 +16437 +24130 +284 +24131 +15 +24132 +24133 +15718 +24134 +3251 +9 +155 +554 +24135 +24136 +43 +590 +6283 +24137 +595 +24138 +3553 +23842 +11057 +7117 +24139 +43 +9118 +1696 +24140 +20952 +24141 +349 +21486 +24142 +22 +16413 +23842 +21947 +2499 +220 +415 +15718 +15718 +1300 +57 +24143 +15 +3546 +598 +179 +201 +1300 +8766 +14 +43 +6408 +21947 +24144 +169 +19 +155 +24145 +24146 +213 +38 +24147 +21689 +32 +13721 +24148 +24149 +24150 +24151 +24152 +354 +24153 +6130 +9 +24154 +24155 +3599 +4024 +12214 +20952 +24156 +337 +24157 +5577 +14420 +5627 +2988 +24158 +22888 +4364 +24159 +19618 +21947 +24160 +3950 +9 +24161 +24162 +24163 +24164 +14 +15718 +303 +21031 +14 +245 +2197 +2609 +24165 +43 +24166 +43 +12987 +586 +5662 +19618 +24167 +20 +286 +9 +24168 +24169 +11966 +9 +24170 +10 +9 +2476 +286 +43 +24171 +7855 +32 +9 +1244 +43 +2356 +671 +1688 +5791 +345 +24172 +1220 +24173 +22 +18982 +1051 +24174 +24175 +24176 +323 +32 +19 +24177 +24178 +89 +32 +286 +21049 +18683 +19618 +13848 +22599 +19494 +1384 +590 +21947 +10031 +19091 +24179 +24180 +9 +16102 +16436 +24181 +24182 +5505 +24183 +9 +14 +24184 +9 +43 +12821 +5119 +15 +60 +19 +595 +4993 +14477 +21834 +17871 +21947 +942 +24185 +2556 +24186 +24187 +24188 +13131 +24189 +590 +1157 +2728 +19192 +53 +24189 +3546 +14982 +24190 +24191 +24192 +6480 +6400 +705 +286 +5601 +15797 +590 +24193 +24194 +24195 +590 +24196 +19 +720 +1578 +9 +24197 +24198 +3546 +24199 +24200 +24201 +4242 +379 +20 +1089 +24202 +24203 +573 +613 +24204 +24205 +1364 +24206 +24207 +872 +222 +24208 +1745 +323 +12425 +24209 +15914 +43 +24210 +155 +24211 +19 +32 +24212 +873 +17151 +24213 +720 +24214 +6950 +6531 +20040 +24215 +590 +24216 +24217 +566 +10789 +44 +2577 +43 +24218 +24219 +24220 +13582 +24221 +349 +713 +24222 +10559 +8171 +13721 +24223 +24224 +142 +43 +9363 +16413 +24225 +15 +15989 +38 +1696 +137 +616 +24226 +24227 +11087 +21947 +24228 +4296 +19573 +24229 +24230 +1700 +24231 +683 +24232 +24233 +1812 +24234 +15718 +24235 +24236 +10003 +14 +17596 +736 +21947 +7183 +43 +32 +19618 +21947 +19 +7053 +43 +3484 +14 +286 +4463 +272 +4306 +24237 +7291 +915 +597 +43 +1768 +5627 +24238 +32 +1648 +790 +24239 +24240 +13150 +3353 +249 +3601 +533 +4055 +1559 +9526 +24241 +5515 +24242 +23741 +4821 +8669 +590 +19 +590 +14 +24243 +1920 +590 +24244 +554 +42 +24245 +24246 +14 +3067 +2289 +17821 +21947 +24247 +349 +564 +24248 +24249 +10 +2733 +20 +809 +24250 +24251 +155 +378 +32 +24252 +43 +24253 +2769 +43 +24254 +16640 +57 +1251 +24255 +66 +24256 +4745 +1688 +24257 +77 +19 +9 +15512 +19 +24258 +18234 +17151 +24259 +24260 +1302 +3978 +43 +971 +15589 +8297 +16437 +24261 +2882 +142 +2 +24262 +11341 +24263 +446 +21698 +24264 +17151 +11364 +24265 +24266 +23573 +24267 +19939 +1382 +13361 +15720 +24268 +8593 +4185 +7053 +797 +24269 +17 +21947 +14240 +595 +15718 +24270 +1605 +11639 +1112 +24271 +509 +342 +12987 +24272 +24273 +24274 +24275 +48 +19618 +24276 +16437 +24277 +1749 +736 +286 +1082 +6571 +20 +24278 +24279 +22666 +24280 +8668 +24281 +24282 +35 +43 +24283 +11 +19797 +24284 +24285 +4 +15 +345 +24286 +24287 +8508 +24288 +115 +59 +16437 +1013 +58 +5022 +3546 +790 +32 +24289 +43 +1091 +9 +59 +24290 +1047 +232 +590 +14363 +667 +2830 +249 +19763 +815 +17062 +24291 +32 +24292 +7256 +11762 +23196 +345 +24293 +333 +1992 +15824 +24294 +24295 +20 +32 +17151 +19 +24296 +11822 +707 +2302 +24297 +24298 +3 +23464 +2772 +1580 +24299 +24300 +24301 +590 +1051 +21126 +5499 +24302 +15718 +2 +249 +19618 +178 +9 +915 +538 +3553 +24303 +24304 +24305 +4547 +24306 +32 +24307 +24308 +19 +24309 +43 +24310 +24311 +23842 +15720 +10356 +11601 +13566 +7522 +22 +43 +3743 +11647 +4422 +24312 +24313 +24314 +24315 +19 +24316 +4790 +3553 +24317 +1559 +24318 +24319 +14 +155 +1612 +4609 +21947 +24320 +14 +24321 +1655 +22986 +13283 +57 +24322 +2550 +24323 +43 +541 +18703 +24324 +19618 +237 +15718 +24325 +7034 +57 +24326 +590 +14477 +590 +2305 +24327 +15107 +24328 +24329 +24330 +24331 +2260 +439 +345 +16139 +9160 +22643 +299 +23647 +14363 +21947 +272 +24332 +13721 +14 +24333 +1157 +4 +11428 +842 +24334 +43 +1566 +9 +43 +142 +24335 +122 +1680 +3708 +1668 +1124 +745 +24336 +7835 +16152 +24337 +1013 +24338 +16079 +6950 +21947 +349 +24339 +1716 +24340 +286 +24341 +1712 +15718 +8668 +24005 +201 +24342 +1688 +12 +155 +21681 +196 +2828 +24343 +14 +16437 +18707 +24344 +24345 +24346 +24347 +6395 +24348 +647 +1513 +13721 +24349 +24350 +24351 +24352 +819 +20 +24353 +3546 +9 +13615 +228 +24354 +24355 +24356 +16656 +2410 +7183 +24357 +11102 +2042 +11321 +1817 +15824 +43 +1481 +24358 +24359 +2790 +2577 +19618 +24360 +21947 +590 +736 +23842 +10147 +345 +14 +24361 +24362 +14079 +1169 +24363 +11421 +24364 +1765 +14621 +14000 +24365 +24366 +24367 +43 +4409 +1870 +15718 +12005 +15718 +23842 +24368 +24369 +12987 +1817 +24370 +2502 +18364 +370 +24371 +5253 +24372 +845 +21947 +24373 +24374 +19618 +16437 +17151 +2446 +590 +345 +13721 +1382 +24375 +10727 +647 +17151 +349 +590 +24376 +5075 +35 +3 +10 +24377 +24378 +32 +7835 +43 +8566 +15 +24379 +345 +43 +19 +2609 +2550 +24380 +12987 +17602 +23842 +11420 +13721 +24381 +24382 +5248 +21947 +24383 +590 +478 +249 +24384 +265 +24385 +24386 +209 +14102 +13570 +14477 +24387 +12506 +104 +1517 +24388 +24389 +24390 +24391 +20280 +24392 +24393 +196 +43 +3353 +286 +24394 +24395 +19618 +57 +554 +24396 +24397 +4463 +19 +43 +491 +23103 +21947 +24398 +24399 +24400 +22963 +57 +21947 +24401 +24402 +24403 +10111 +24404 +8208 +14 +24405 +4414 +24406 +24407 +2129 +24408 +32 +9 +24409 +57 +24410 +21947 +24303 +24411 +24412 +2 +19 +24413 +23166 +19 +24414 +21689 +32 +4745 +24415 +286 +24416 +590 +19618 +1920 +21947 +2197 +8134 +15718 +2764 +2550 +720 +16089 +2 +24144 +3270 +24417 +13405 +583 +21947 +24418 +7810 +7835 +24419 +286 +13652 +745 +3050 +15718 +13721 +647 +24420 +519 +24303 +9 +24421 +24422 +14363 +24423 +24424 +24144 +24425 +170 +3546 +24426 +827 +24427 +24428 +23190 +24429 +24430 +590 +15 +345 +21947 +19655 +7855 +7053 +10 +19 +24144 +16931 +13993 +1244 +13721 +24431 +13375 +66 +24432 +11273 +823 +18695 +17151 +24433 +1817 +24434 +24435 +2356 +5780 +24436 +24437 +24438 +2 +15 +2733 +1517 +20142 +19 +24439 +4502 +4124 +24440 +5318 +1677 +21947 +24441 +590 +590 +14 +60 +24442 +1698 +24443 +24444 +564 +2550 +1655 +24445 +22371 +43 +24446 +3034 +89 +2577 +24447 +16437 +24303 +4536 +15718 +9 +24448 +2314 +24449 +24450 +2446 +8976 +237 +7183 +286 +24451 +18784 +11413 +23103 +24452 +4961 +16102 +24453 +19655 +9 +827 +24454 +651 +4985 +4388 +24455 +3546 +15476 +24456 +20792 +24457 +24458 +590 +19 +15 +3601 +15 +43 +24459 +17151 +24460 +10470 +24461 +286 +24462 +24463 +24464 +24465 +15 +24466 +24467 +809 +19 +1230 +24468 +185 +14 +21947 +13173 +9 +155 +24469 +3546 +24470 +10123 +24471 +2254 +19 +2 +17865 +77 +24472 +764 +2804 +89 +24473 +3062 +14363 +24474 +373 +13721 +1021 +9649 +78 +24475 +24476 +249 +14216 +286 +24477 +2410 +736 +17151 +24478 +24479 +70 +8701 +19 +43 +4116 +24480 +1011 +358 +24481 +10117 +24482 +259 +24483 +24484 +24485 +24486 +9 +9 +21776 +3546 +17151 +590 +5659 +24487 +24488 +2459 +24489 +24490 +16079 +8669 +24491 +12260 +24492 +1160 +24493 +1696 +24494 +23842 +24495 +18896 +274 +17151 +11394 +24496 +1300 +3546 +14 +24497 +286 +89 +17151 +5085 +24498 +683 +24499 +25 +24500 +590 +24501 +590 +14 +647 +20 +24502 +16437 +19 +349 +24503 +24504 +24505 +2 +7717 +24506 +165 +5780 +19918 +2694 +24507 +24508 +24509 +24510 +24511 +4088 +915 +24512 +24513 +17144 +21031 +554 +11471 +19618 +155 +14185 +112 +168 +24514 +24515 +990 +3484 +24516 +24517 +13343 +345 +9 +1316 +1286 +24518 +14597 +111 +5257 +18283 +196 +24519 +18982 +137 +24520 +464 +16437 +22962 +16437 +274 +24521 +6171 +1056 +43 +36 +24522 +16571 +14 +15489 +686 +24523 +19868 +24524 +19618 +436 +24525 +24526 +18589 +24527 +1013 +720 +424 +22986 +24528 +7137 +13364 +345 +24303 +541 +16437 +24335 +4293 +24529 +4050 +24303 +1291 +24530 +24531 +13662 +24532 +24533 +24534 +24535 +736 +24536 +14 +24537 +5780 +24538 +14001 +2 +13988 +24539 +24540 +554 +17136 +24541 +23619 +24542 +24543 +24544 +32 +24545 +17920 +19839 +14240 +24546 +3546 +1013 +24547 +9 +7835 +24548 +20700 +24144 +1542 +35 +861 +7835 +4398 +342 +554 +24549 +7601 +19323 +24550 +3236 +17136 +3 +24551 +583 +21889 +48 +24552 +24553 +22802 +57 +17151 +24554 +23103 +18423 +24555 +24556 +2330 +36 +17670 +6430 +66 +24557 +13721 +24558 +24559 +19655 +15 +590 +20 +10967 +24560 +24561 +9 +24562 +24563 +188 +10 +24564 +89 +19797 +12404 +12005 +24565 +286 +24566 +43 +66 +57 +21947 +5197 +24567 +24568 +24569 +647 +24570 +14532 +1382 +19618 +322 +24571 +24572 +19931 +3007 +16437 +24573 +19386 +24574 +1021 +43 +7053 +24575 +14604 +12768 +23600 +9060 +24576 +17151 +1013 +15914 +13375 +43 +9578 +14477 +1612 +24577 +43 +24578 +24579 +22307 +23110 +3055 +24580 +24581 +23842 +17603 +10 +1013 +24582 +23196 +1961 +24583 +9 +20141 +24584 +21947 +24585 +24586 +24587 +24588 +24589 +11087 +1716 +9 +17698 +12005 +12402 +6782 +21947 +16640 +19618 +17151 +17754 +1901 +12987 +3278 +2042 +155 +14 +20228 +24590 +24591 +57 +2577 +24592 +519 +24593 +583 +155 +21776 +24594 +24595 +21947 +24596 +24597 +24598 +24599 +24600 +5085 +4824 +24601 +24602 +9 +20 +873 +566 +18695 +2132 +736 +2790 +24603 +24604 +345 +2537 +24605 +24606 +24607 +43 +519 +24608 +24609 +1566 +286 +14 +1423 +379 +590 +8351 +19618 +22787 +10 +24610 +3546 +24335 +24611 +24612 +24613 +492 +155 +8962 +21947 +14 +6430 +24614 +92 +349 +23579 +1680 +19618 +24615 +24616 +1198 +15718 +1481 +21947 +24617 +2117 +9 +24339 +1914 +22 +24618 +10 +138 +21947 +155 +24619 +43 +2117 +213 +19 +19852 +4055 +43 +24620 +43 +14586 +23196 +24621 +24622 +19618 +284 +1524 +20115 +1578 +21689 +284 +249 +43 +24623 +7600 +248 +14529 +24624 +149 +17633 +283 +57 +24625 +10230 +303 +13848 +24626 +24627 +411 +17151 +24628 +1109 +1155 +24629 +354 +399 +24630 +80 +2146 +13897 +5780 +24631 +24632 +541 +23842 +2008 +345 +24633 +3743 +24634 +3421 +24635 +24636 +590 +24637 +8256 +24638 +24639 +19618 +1578 +14 +19091 +14 +24640 +647 +24641 +1524 +4293 +1710 +24642 +22260 +24643 +12987 +24644 +13529 +24645 +24646 +43 +24647 +17151 +13721 +3842 +18616 +20 +24648 +24649 +3345 +8883 +9 +24650 +24651 +24652 +10 +24653 +573 +6531 +21730 +209 +3755 +23226 +1295 +16445 +736 +114 +16437 +17136 +24654 +8458 +303 +21796 +590 +6179 +4827 +24655 +24656 +5757 +323 +24657 +1765 +188 +24658 +590 +533 +24659 +24660 +24661 +24662 +2243 +213 +155 +24663 +303 +832 +736 +19337 +1559 +24664 +286 +2314 +14 +8779 +2 +19 +2410 +286 +4028 +155 +24665 +16437 +9 +3546 +3546 +1357 +19218 +14477 +8814 +24666 +24667 +21999 +19883 +286 +3316 +590 +24668 +24669 +20952 +24670 +24671 +5085 +19581 +24672 +15437 +8668 +24673 +21947 +24674 +377 +24675 +3543 +24676 +1870 +4808 +14 +24677 +24678 +24679 +24680 +24681 +12584 +46 +14 +24682 +14914 +24683 +9 +861 +16629 +872 +8186 +21947 +24684 +971 +24685 +354 +22091 +15085 +24686 +19 +6341 +13361 +20 +155 +24687 +2035 +349 +1764 +3904 +89 +345 +19 +24688 +24689 +19 +80 +8297 +89 +4317 +24690 +3546 +2264 +43 +15718 +24691 +345 +284 +24692 +24485 +21947 +24693 +16681 +8994 +3546 +3959 +43 +3353 +24694 +4550 +24695 +15718 +43 +20339 +1637 +7276 +3 +32 +4028 +14 +24696 +7014 +24697 +448 +24698 +590 +164 +201 +24699 +11224 +5169 +24700 +24701 +821 +5627 +24702 +24703 +24704 +24705 +24706 +9 +515 +24707 +590 +22818 +646 +24708 +24709 +349 +43 +827 +24710 +24711 +24712 +590 +24713 +5908 +12117 +14668 +24714 +21776 +1230 +24715 +1920 +24716 +23842 +137 +19404 +887 +24717 +24718 +14 +9705 +24719 +6341 +1100 +19618 +930 +9475 +24720 +14 +24721 +24722 +24723 +21776 +24303 +14546 +14363 +19404 +17136 +21947 +22 +1316 +14147 +80 +1559 +769 +1181 +536 +17670 +18978 +14 +2721 +232 +43 +23603 +24724 +12684 +209 +7855 +590 +24725 +23842 +89 +14 +936 +1090 +3546 +43 +19404 +19618 +7980 +76 +3258 +46 +24725 +24726 +24727 +43 +24728 +24729 +345 +1817 +20156 +24730 +3546 +24731 +24732 +22029 +286 +24733 +176 +24734 +15592 +24735 +14079 +24736 +6364 +2694 +213 +24737 +4502 +24738 +57 +8188 +24739 +1559 +21947 +24740 +3421 +14477 +13405 +19918 +989 +861 +303 +1749 +8351 +590 +861 +1364 +21947 +21627 +24741 +2238 +19 +14 +24742 +24743 +19618 +24744 +699 +24745 +248 +24746 +15589 +14 +9 +21947 +5085 +590 +23842 +24747 +345 +24748 +24749 +15 +24750 +464 +323 +58 +2 +554 +24751 +12987 +24752 +3034 +3546 +22556 +24753 +590 +13502 +2 +6086 +2314 +590 +24754 +16645 +24755 +43 +12987 +13721 +24756 +412 +24757 +24758 +23842 +379 +24759 +8392 +1688 +736 +19618 +24760 +24761 +2117 +19618 +24762 +24763 +590 +8566 +19618 +24764 +24765 +1051 +24766 +24767 +24768 +725 +21893 +24769 +9 +24770 +24771 +60 +24772 +1244 +77 +1051 +24773 +24774 +5319 +43 +1442 +24775 +7208 +43 +14477 +24776 +14 +24777 +24778 +12618 +5267 +24779 +188 +32 +24780 +24781 +140 +13721 +25 +24782 +24783 +1465 +1615 +24784 +683 +21947 +9801 +3553 +24785 +24786 +9 +213 +9 +1244 +24144 +24787 +24788 +6877 +24789 +21261 +24790 +20623 +24791 +24792 +1425 +345 +9 +345 +3546 +14017 +98 +15539 +2348 +14945 +18695 +21947 +24793 +24794 +24795 +1949 +123 +349 +24796 +12722 +24797 +303 +24798 +57 +21947 +5963 +24799 +345 +23867 +2577 +349 +32 +1870 +2410 +19 +19 +24800 +248 +872 +43 +19 +989 +24303 +18631 +13721 +99 +24801 +590 +554 +24802 +25 +24803 +2476 +1992 +24804 +35 +24805 +303 +14981 +14 +554 +57 +24806 +14477 +19 +24807 +1867 +24808 +24809 +2919 +3546 +24810 +24811 +155 +259 +24812 +349 +24813 +24814 +14 +24815 +2694 +3601 +24816 +24817 +21681 +19 +201 +24818 +24819 +24820 +491 +213 +43 +24821 +9 +23103 +12077 +24822 +12005 +24823 +22196 +24425 +284 +24824 +9 +24144 +1812 +18760 +14616 +32 +19618 +9 +1765 +1364 +11762 +15718 +24825 +9 +14363 +24826 +1604 +24827 +554 +9402 +104 +24828 +43 +43 +713 +21776 +1083 +19618 +17151 +13150 +24829 +24830 +9 +213 +15718 +19618 +24831 +24832 +24833 +16437 +24834 +19618 +11754 +21947 +32 +2865 +24303 +21947 +24835 +24836 +24837 +24838 +16437 +23226 +24839 +43 +2 +24840 +24841 +24842 +24843 +12912 +24844 +14660 +541 +8392 +18045 +24845 +24846 +24847 +196 +24848 +14 +24849 +1222 +590 +24850 +13721 +24851 +14 +155 +24852 +823 +3546 +24853 +24854 +43 +24855 +19655 +24856 +9 +21947 +15 +24857 +15718 +24858 +17151 +509 +18612 +19618 +665 +24859 +77 +24860 +24861 +358 +24862 +104 +32 +15718 +222 +24863 +24864 +13721 +22 +1745 +138 +14 +5418 +17472 +1529 +24865 +15718 +2694 +2 +11966 +4226 +24866 +9 +24867 +345 +24868 +24869 +13721 +323 +24870 +6877 +19 +19 +2 +24871 +24872 +19 +155 +24873 +249 +10 +21947 +411 +13566 +23842 +357 +24471 +373 +379 +24144 +24874 +24875 +24876 +19797 +1382 +24877 +14477 +24878 +358 +20125 +155 +24879 +4293 +14102 +24880 +11483 +24881 +9630 +19618 +9 +24882 +19 +24883 +43 +6400 +24884 +14001 +14340 +57 +24885 +671 +24886 +13721 +12351 +19 +24887 +736 +21947 +24888 +6095 +66 +15 +155 +24332 +15 +14563 +647 +24889 +303 +415 +21947 +105 +22 +16437 +16443 +24890 +14 +19 +24891 +13179 +9 +19 +24892 +24893 +590 +22717 +24894 +19618 +24895 +1316 +23231 +43 +24896 +24897 +201 +24898 +12387 +179 +19783 +14 +17151 +24899 +14660 +17484 +2764 +7855 +9 +24900 +24901 +2 +1442 +24902 +24903 +24904 +3171 +7835 +19 +2042 +345 +57 +24905 +764 +1226 +11754 +2499 +250 +24906 +15 +590 +24907 +24908 +24909 +590 +24910 +24144 +14001 +24911 +13566 +24912 +13497 +2818 +24913 +24914 +24915 +14216 +24916 +24917 +57 +365 +24918 +15720 +17151 +9 +9 +554 +21627 +2427 +24919 +24920 +2260 +590 +24921 +2314 +32 +14 +24303 +24922 +12366 +24923 +6950 +22888 +24924 +24925 +24926 +8291 +24927 +536 +4141 +3976 +24896 +24928 +8151 +14 +590 +24929 +24930 +66 +115 +24931 +14 +43 +1090 +176 +15 +590 +872 +910 +349 +18047 +1181 +10642 +15406 +14001 +16437 +32 +14369 +24932 +24933 +24934 +19209 +24935 +19 +20 +14 +104 +24936 +24937 +369 +665 +21947 +24303 +24938 +43 +24939 +5627 +286 +1048 +21947 +24940 +24941 +6147 +15718 +11995 +5920 +24942 +9 +15718 +21947 +24943 +24944 +24945 +19 +9 +14 +20 +1517 +286 +9 +21947 +24946 +15 +342 +14477 +495 +24947 +4702 +11423 +2459 +43 +24948 +38 +665 +24949 +14477 +9 +9 +24950 +24207 +24896 +4128 +24951 +24952 +14 +18734 +590 +14 +14477 +9 +19655 +24953 +272 +24954 +24955 +2804 +24956 +155 +2386 +286 +24957 +24958 +19 +24959 +415 +8685 +24960 +3546 +21947 +24961 +323 +86 +19 +5665 +24962 +24963 +24964 +7835 +568 +24965 +24966 +9560 +21540 +24967 +14 +137 +24968 +24969 +13623 +17670 +24970 +14185 +10793 +13721 +7053 +22308 +3546 +7183 +201 +2694 +24971 +24972 +720 +23842 +22230 +17716 +21269 +43 +24973 +19 +21947 +24974 +7137 +24975 +24976 +24977 +20187 +12 +13721 +12250 +4278 +3353 +14454 +8392 +8809 +665 +5316 +19 +24978 +345 +24979 +936 +24980 +24981 +14001 +11762 +832 +179 +24982 +24983 +323 +24984 +24985 +18896 +24986 +89 +43 +19478 +24987 +765 +7273 +345 +1425 +57 +915 +14 +24988 +19 +415 +24989 +22 +2 +24990 +21947 +23653 +9 +24991 +24992 +201 +16899 +24993 +15718 +3353 +5781 +12479 +188 +272 +17911 +12987 +24994 +57 +9 +24995 +17412 +24996 +24997 +43 +140 +24998 +349 +8994 +3546 +286 +24999 +25000 +25001 +25002 +9497 +741 +345 +17698 +14369 +25003 +6595 +7053 +3476 +3649 +7729 +228 +196 +25004 +15517 +5650 +14 +10482 +669 +25005 +707 +8787 +25006 +14369 +590 +9 +213 +5791 +21947 +43 +25007 +6058 +24303 +9 +14369 +373 +25008 +595 +736 +5299 +597 +19 +25009 +25010 +1991 +14369 +8188 +25011 +19458 +24303 +25012 +3546 +3330 +25013 +25014 +25015 +48 +14 +8967 +25016 +1542 +9275 +278 +25017 +25018 +25019 +14 +4388 +19091 +3417 +1051 +590 +25020 +1513 +25021 +19918 +25022 +665 +25023 +25024 +2234 +25025 +14 +25026 +25027 +21947 +9 +12402 +5085 +25028 +3546 +10 +9 +21849 +25029 +25030 +43 +14 +13365 +25031 +284 +5629 +25032 +1991 +25033 +3353 +19965 +7276 +17136 +25034 +10846 +2197 +25035 +14 +13721 +25036 +590 +19618 +1425 +9 +24045 +286 +15589 +745 +2537 +14477 +11762 +1920 +10 +25037 +25038 +185 +15730 +9396 +590 +25039 +5614 +3976 +25040 +590 +3546 +303 +590 +590 +590 +43 +19252 +25041 +16126 +25 +25042 +25043 +3 +25044 +14 +25045 +57 +25046 +20 +8624 +18798 +19 +720 +176 +14363 +9622 +590 +19218 +9 +25047 +25048 +25049 +13721 +9 +24144 +10642 +764 +25050 +15718 +590 +25051 +464 +57 +19618 +21689 +201 +1245 +25052 +25053 +936 +248 +25054 +19655 +25055 +25056 +1637 +25057 +25058 +2764 +14477 +6877 +1330 +25059 +2367 +303 +25060 +4414 +25061 +25062 +13566 +1765 +25063 +4387 +4411 +17136 +13721 +590 +286 +1051 +21947 +18896 +590 +14369 +25064 +971 +15718 +7835 +19003 +337 +25065 +16637 +3546 +849 +590 +35 +3251 +25066 +25067 +694 +14603 +19404 +25068 +3034 +209 +57 +213 +3 +19618 +3546 +14 +17033 +25069 +337 +12777 +736 +13721 +43 +7014 +303 +1066 +25070 +10094 +8171 +6518 +2694 +694 +1090 +25071 +648 +411 +25072 +25073 +25074 +14385 +478 +4585 +25075 +14381 +25076 +20852 +25077 +25078 +15989 +43 +25079 +15 +14079 +272 +25080 +3844 +19404 +1287 +15471 +849 +971 +25081 +736 +19 +365 +18423 +25082 +590 +11423 +19109 +25083 +25084 +43 +25085 +1082 +43 +25086 +14 +89 +25087 +1465 +155 +43 +25088 +8668 +25089 +1013 +8787 +15496 +18695 +1021 +25090 +2770 +25091 +25092 +1300 +9 +3417 +25 +3546 +17698 +5438 +13721 +25093 +25094 +24978 +17635 +25095 +7855 +25096 +15718 +19618 +19 +25097 +25098 +303 +19618 +25099 +25100 +3546 +3546 +21834 +4764 +25101 +25102 +25103 +2836 +25104 +25105 +1021 +25106 +25107 +15949 +4116 +13150 +1842 +25108 +25109 +14369 +2577 +43 +25110 +25111 +11757 +303 +647 +7053 +16437 +25112 +25113 +1112 +25114 +554 +25110 +3546 +43 +25115 +21947 +16648 +19 +24045 +2577 +24335 +590 +25116 +25117 +25118 +3095 +24144 +1316 +25119 +25120 +14477 +25121 +25122 +25123 +14 +397 +19 +25124 +25125 +24978 +25126 +25127 +25128 +21947 +43 +20666 +25129 +25130 +14693 +1529 +6741 +19618 +24862 +730 +19 +21729 +2971 +1604 +5601 +20 +25131 +15718 +5780 +1236 +25132 +25133 +8103 +16687 +345 +349 +19655 +590 +12987 +24303 +15824 +15285 +25134 +590 +4 +14 +25135 +8297 +25136 +25137 +25138 +12544 +4313 +19241 +4650 +17151 +25139 +13813 +14127 +25140 +25141 +1090 +25142 +13956 +25143 +14 +9 +24802 +20 +21947 +25144 +25145 +15797 +10672 +25146 +19618 +284 +25147 +345 +25148 +25149 +284 +25097 +590 +11370 +13721 +25150 +711 +154 +4055 +213 +1160 +2764 +25151 +2537 +2561 +17606 +1224 +16205 +25152 +25153 +365 +2314 +3657 +25154 +6950 +11341 +25155 +43 +9 +1051 +449 +43 +9688 +32 +21947 +1423 +590 +2635 +586 +25156 +25157 +3407 +12772 +2764 +887 +25158 +25159 +3330 +6354 +25160 +20 +22 +25161 +25162 +6300 +25163 +707 +8208 +9 +25164 +337 +21947 +8248 +21947 +349 +25165 +25166 +19 +736 +3484 +25167 +138 +22 +349 +25168 +2865 +25169 +284 +23364 +12315 +3546 +3546 +1987 +4364 +25170 +19 +6518 +358 +14477 +43 +323 +5780 +25171 +7812 +43 +590 +15718 +14 +25172 +8392 +5628 +25173 +25174 +25175 +303 +25176 +2040 +25177 +25178 +25179 +357 +1091 +9355 +20218 +736 +19618 +15220 +16437 +25180 +25181 +201 +17920 +14369 +25182 +14 +14477 +345 +7215 +9 +5085 +7283 +13721 +1508 +24896 +597 +25183 +14869 +3484 +25184 +20773 +3872 +590 +25185 +21947 +13230 +345 +1716 +14369 +25186 +16437 +25187 +284 +25188 +3546 +4550 +2260 +770 +19618 +14 +25189 +25190 +25191 +140 +13137 +337 +25192 +845 +25193 +25194 +25195 +21947 +12893 +19 +1181 +9 +24978 +284 +495 +25196 +25197 +25139 +43 +2733 +2113 +19 +15809 +25198 +541 +25199 +213 +25200 +5310 +21698 +25201 +379 +25202 +25203 +25204 +17698 +23103 +25205 +2197 +3251 +25206 +25207 +1316 +213 +3546 +161 +58 +25208 +822 +16 +25209 +155 +25210 +98 +2502 +21947 +514 +338 +8994 +25211 +23495 +13988 +20952 +284 +24532 +1090 +286 +337 +713 +25212 +1090 +590 +25213 +25214 +11762 +25215 +24617 +25216 +349 +25217 +14660 +14001 +1224 +43 +249 +25218 +18037 +25219 +509 +222 +43 +14827 +21947 +237 +43 +15718 +24144 +12287 +10 +17151 +3546 +25220 +284 +2577 +25221 +25222 +25223 +89 +25224 +25225 +15718 +7053 +25226 +14619 +25227 +43 +25228 +21276 +586 +11966 +25229 +590 +915 +7835 +17151 +25230 +25231 +425 +25232 +411 +349 +590 +25233 +35 +25234 +3546 +13648 +16121 +25235 +323 +25236 +4411 +4547 +24144 +25237 +155 +1224 +303 +25238 +57 +17151 +24036 +12987 +25239 +5780 +25240 +43 +24045 +25241 +9 +18896 +53 +21698 +1203 +21569 +32 +24896 +25242 +20199 +25243 +25244 +586 +25245 +25246 +25247 +821 +57 +1885 +19597 +25248 +770 +25249 +12479 +25250 +25251 +25252 +1018 +57 +25253 +24725 +1021 +2260 +4490 +2978 +25254 +25255 +12934 +25256 +25257 +24045 +1090 +25258 +25259 +14887 +5085 +25260 +2287 +19655 +720 +9 +25261 +9939 +25262 +20803 +25263 +35 +138 +15718 +19618 +14143 +14000 +2971 +25264 +1310 +25265 +14477 +25266 +25267 +248 +4550 +213 +299 +25268 +25269 +57 +22963 +4760 +19618 +23103 +23741 +25270 +1415 +2318 +43 +303 +1700 +25271 +19439 +20 +9705 +349 +25272 +25273 +25274 +487 +19618 +13713 +22963 +25275 +5650 +24978 +2042 +20212 +43 +590 +1655 +25276 +6766 +25277 +1700 +3546 +12812 +14 +1956 +536 +15824 +14 +19 +1384 +10094 +25278 +24896 +18044 +25279 +19334 +25280 +2756 +1688 +21947 +15238 +1048 +25281 +155 +19 +9688 +25282 +7048 +1047 +590 +2577 +4166 +8895 +345 +14 +25283 +1295 +155 +25284 +11966 +25285 +25286 +24303 +25287 +25288 +25289 +4502 +25290 +25291 +57 +25292 +25293 +7835 +25294 +24896 +966 +15311 +25295 +3128 +25296 +21947 +19797 +13721 +21947 +5376 +379 +6341 +5415 +57 +25297 +9 +43 +13721 +554 +893 +25298 +25299 +20 +5085 +20 +32 +7110 +25300 +25301 +8297 +24144 +17228 +10002 +590 +3601 +8188 +20450 +9 +25302 +5780 +14369 +25303 +43 +25304 +20530 +24646 +1316 +1812 +25305 +18548 +25306 +176 +590 +98 +8188 +25307 +21031 +43 +683 +21999 +24303 +25308 +12987 +25309 +25310 +24303 +2909 +379 +24303 +3034 +98 +7053 +24061 +21947 +25311 +25312 +4463 +25313 +14 +57 +9 +43 +25314 +43 +25315 +1823 +25316 +651 +1425 +25317 +25318 +24978 +21947 +25319 +1049 +25320 +817 +2314 +25321 +17670 +25322 +14477 +9 +14 +269 +19 +25323 +25324 +25325 +25326 +2476 +5119 +14477 +25327 +519 +15544 +21947 +13721 +16024 +19 +24896 +25328 +59 +25329 +1617 +25330 +4237 +1680 +25331 +345 +736 +8244 +43 +43 +13721 +43 +25332 +286 +2 +8295 +14000 +25333 +379 +3553 +25334 +9 +2040 +22 +282 +303 +25335 +14369 +21947 +19 +25336 +970 +25337 +5074 +21889 +3546 +25338 +25339 +448 +25340 +1013 +25341 +23103 +209 +14369 +9 +17872 +25342 +14527 +15406 +349 +16211 +14363 +24896 +25343 +13721 +15718 +25344 +14 +198 +24896 +21834 +3999 +7991 +15 +1514 +43 +25345 +16437 +17635 +19646 +23406 +25346 +3034 +25347 +25348 +25349 +15718 +25350 +19618 +25351 +1615 +25352 +20 +3546 +38 +15 +1612 +765 +2 +25353 +25354 +25355 +590 +18317 +25356 +1090 +25357 +1513 +5085 +60 +25358 +2260 +2 +25359 +43 +11249 +19797 +21947 +89 +14215 +25360 +25361 +560 +25362 +25363 +2556 +25364 +25365 +20019 +201 +25366 +411 +1605 +16437 +17236 +25367 +43 +155 +357 +590 +9402 +25368 +25369 +2577 +25370 +25371 +25372 +25373 +25374 +25375 +12987 +25376 +13375 +3484 +24303 +10 +1013 +25377 +25378 +25379 +5085 +590 +8668 +25172 +25380 +22308 +10117 +1425 +21031 +2728 +25381 +25382 +1991 +155 +19 +4458 +25383 +2577 +25384 +9 +736 +573 +14 +10298 +20161 +25385 +21947 +9 +14515 +77 +24045 +13721 +9560 +25386 +155 +25387 +178 +8351 +24303 +25388 +345 +286 +1425 +9 +25389 +590 +13760 +15511 +25390 +25391 +22587 +25392 +2308 +25393 +25394 +25395 +25237 +4315 +6928 +809 +25396 +25397 +5085 +2061 +25398 +323 +25399 +22 +590 +14369 +9 +25400 +21947 +2776 +25401 +25402 +16103 +22923 +11321 +286 +25403 +16437 +1300 +17151 +7208 +25404 +77 +17144 +25405 +3546 +21947 +22652 +1090 +23368 +25406 +25407 +25408 +2 +25237 +25409 +24896 +2 +25410 +21998 +25411 +25412 +9 +15718 +9 +25413 +14 +16 +25414 +155 +208 +9 +25415 +52 +3026 +25416 +3546 +25417 +20700 +25418 +17670 +1384 +597 +4 +189 +19618 +25419 +250 +25420 +25421 +713 +43 +25422 +3842 +25423 +25424 +9 +3 +764 +24303 +4536 +43 +2406 +707 +25425 +25426 +1384 +16003 +554 +14962 +25427 +25428 +25429 +25430 +10028 +25431 +155 +23103 +209 +13116 +4747 +19 +25432 +25433 +1295 +2324 +25434 +1870 +24302 +25435 +25436 +439 +25437 +13905 +25438 +14369 +25439 +1710 +1021 +3546 +22 +412 +4855 +25440 +2 +24303 +25441 +7053 +25442 +3645 +57 +25443 +1542 +23103 +590 +15572 +25444 +915 +15 +25445 +25446 +25447 +21947 +6701 +25448 +25449 +21947 +23103 +18998 +13905 +25450 +3981 +43 +3655 +201 +35 +554 +915 +17151 +286 +15718 +13375 +14477 +25334 +13721 +25451 +19 +736 +43 +2804 +18798 +248 +32 +4536 +337 +25452 +25453 +25454 +228 +25455 +76 +188 +25456 +25457 +3863 +25458 +14369 +345 +9 +25227 +25459 +9 +6275 +2609 +6764 +25460 +25461 +3546 +442 +13855 +25462 +25463 +3546 +25464 +201 +12937 +25465 +19576 +21627 +3241 +1559 +12671 +25466 +248 +44 +736 +25467 +25468 +25469 +13139 +345 +25470 +9 +25471 +24864 +52 +19655 +6950 +8218 +43 +43 +5438 +25472 +25473 +20803 +337 +9396 +248 +25474 +25475 +590 +32 +2542 +25476 +345 +2769 +57 +1364 +25477 +16671 +25478 +14581 +25479 +5755 +25480 +13988 +337 +1559 +15718 +25481 +14776 +24303 +25482 +2029 +25483 +25484 +25485 +248 +25486 +3610 +25487 +21947 +12832 +5085 +25488 +5963 +25489 +21947 +25490 +15718 +25491 +25492 +8668 +2 +21947 +2009 +12053 +286 +25493 +21908 +25494 +194 +25495 +43 +1364 +25496 +25497 +25498 +32 +43 +3 +43 +15718 +590 +24256 +745 +18685 +25499 +43 +25500 +1364 +25501 +25502 +14 +1961 +8798 +15718 +4550 +1444 +272 +25503 +3310 +2 +1566 +4425 +941 +9 +10 +25504 +21947 +25505 +19528 +18503 +23323 +25506 +25507 +16466 +13131 +25508 +25509 +25510 +5085 +15699 +2 +25364 +25511 +647 +24864 +720 +15718 +25512 +14 +9 +25513 +25514 +25515 +495 +6095 +595 +25516 +43 +11822 +4403 +4808 +25517 +25518 +10 +590 +248 +13721 +1991 +16118 +21689 +686 +25519 +19618 +25520 +379 +25521 +25522 +5627 +14363 +3546 +21947 +25523 +25524 +21689 +9561 +24864 +10 +25525 +13721 +155 +284 +24725 +25526 +25527 +25528 +2769 +14240 +16 +14 +7891 +303 +1559 +286 +357 +43 +25529 +248 +25530 +1765 +15038 +653 +25531 +25532 +25533 +17920 +1812 +751 +3546 +21672 +9 +25534 +831 +21627 +9705 +9 +1247 +533 +188 +3 +14131 +25535 +278 +21563 +8967 +3964 +21689 +10946 +25536 +25537 +24303 +25538 +13721 +20682 +25539 +1212 +213 +6096 +19 +23103 +25540 +12255 +89 +6621 +2790 +1423 +303 +3939 +3978 +1716 +8566 +14369 +25541 +25542 +25543 +19 +237 +24045 +3543 +25544 +18064 +25545 +18045 +14369 +18798 +4463 +25546 +272 +2253 +339 +20228 +9 +2086 +25547 +25548 +25549 +25550 +17920 +43 +15 +24896 +2135 +10325 +21947 +24144 +7053 +1989 +43 +25551 +25552 +25553 +16437 +22977 +590 +25554 +25555 +25556 +22075 +292 +25557 +20952 +484 +25558 +2 +3976 +14 +14 +18048 +2998 +2325 +25559 +42 +15978 +13375 +5780 +25560 +16437 +10 +15556 +14369 +1208 +24896 +1286 +1715 +7923 +2694 +25237 +25561 +22268 +13748 +24303 +15308 +25562 +19618 +25563 +25564 +694 +25565 +23832 +1578 +10356 +13307 +155 +188 +19 +19 +8098 +25566 +25567 +19 +25568 +192 +11736 +25569 +19304 +345 +1048 +25570 +3171 +25571 +25572 +21947 +14 +222 +25573 +15718 +12 +3491 +5542 +647 +25574 +16437 +7379 +339 +25575 +25576 +19618 +1442 +1208 +9842 +14001 +713 +25577 +25578 +25579 +25580 +57 +23608 +11483 +25581 +25582 +24303 +11995 +25583 +21947 +595 +25584 +25585 +25586 +21947 +17134 +185 +25587 +3480 +25588 +25589 +43 +15783 +1559 +19618 +3546 +1154 +2356 +3601 +25590 +349 +25584 +25591 +616 +25592 +25593 +25594 +25595 +25596 +155 +25597 +7836 +222 +19618 +12479 +14477 +24144 +14477 +43 +11762 +19 +25598 +2694 +25599 +3601 +25600 +14369 +21869 +5340 +286 +10642 +209 +25601 +19618 +20339 +1425 +18612 +25602 +345 +25603 +21689 +345 +13754 +10356 +14369 +10265 +6655 +3543 +13317 +2415 +19404 +14477 +25334 +1229 +14 +98 +21947 +1612 +57 +8566 +43 +1765 +25604 +25605 +19618 +1220 +25606 +590 +358 +25607 +25608 +25609 +18384 +286 +25610 +25611 +189 +25237 +25612 +25613 +25614 +25615 +25616 +365 +3546 +25617 +25618 +892 +2260 +1013 +25619 +25620 +887 +9 +677 +12722 +15718 +2157 +43 +683 +25621 +25622 +4851 +8367 +24864 +25623 +20616 +43 +25624 +25625 +286 +14477 +25626 +11762 +25627 +57 +21947 +25628 +137 +20442 +6883 +25629 +3546 +14 +13721 +19655 +25630 +14660 +590 +17698 +1295 +10094 +25631 +16437 +25632 +25633 +4550 +25634 +15762 +3395 +788 +25635 +25636 +109 +915 +25637 +536 +24725 +4806 +16190 +2694 +22666 +590 +25638 +3546 +25639 +17920 +16121 +720 +19 +24303 +25640 +24877 +4550 +14017 +20 +24864 +15718 +21689 +25641 +25642 +21529 +25643 +13721 +57 +25644 +43 +554 +25645 +25646 +25647 +25334 +25648 +25649 +21947 +345 +25650 +377 +13721 +17151 +1566 +286 +25651 +2029 +15718 +25652 +3787 +25653 +3546 +43 +1562 +10030 +2593 +6616 +179 +3239 +15216 +1605 +3548 +201 +2697 +25654 +15054 +196 +2243 +25655 +25656 +25657 +25658 +19 +25237 +25659 +18695 +57 +2175 +25660 +19 +13721 +590 +3546 +14369 +4414 +8668 +25661 +10338 +25159 +5031 +3908 +24919 +23697 +23103 +2 +272 +509 +25662 +11702 +19655 +25663 +24864 +19 +4961 +14 +24896 +4 +15718 +19286 +25664 +7855 +25503 +12741 +1295 +9 +554 +14 +25665 +19 +13721 +9993 +25666 +25667 +590 +25668 +24045 +286 +2476 +590 +17284 +2609 +2318 +2540 +14369 +14477 +9 +25669 +20 +46 +1241 +3546 +14363 +193 +19618 +13127 +2260 +248 +2287 +9 +11211 +25670 +25671 +3050 +14343 +1011 +25672 +25673 +25674 +20 +613 +19404 +1300 +1208 +57 +114 +379 +495 +2550 +1384 +25675 +25676 +25677 +25678 +10 +25679 +24207 +1972 +18896 +25237 +23406 +590 +590 +1051 +25680 +4463 +25681 +25682 +19 +7855 +4951 +2 +2029 +1172 +155 +25683 +25684 +303 +25685 +25686 +14 +25687 +25688 +23603 +213 +416 +25689 +2 +19 +25690 +43 +18874 +845 +20 +745 +745 +18749 +25691 +554 +25692 +25237 +17670 +25693 +5780 +8869 +720 +19 +25694 +10406 +25695 +613 +590 +14369 +590 +25696 +14369 +25697 +15 +25698 +7855 +213 +16118 +17151 +3353 +20 +18956 +25699 +4518 +14369 +4315 +248 +25700 +303 +25701 +15004 +23608 +14363 +8668 +373 +286 +9784 +1364 +5415 +15 +379 +22787 +13721 +32 +15018 +25702 +1212 +2622 +16437 +22273 +16480 +25703 +25704 +2958 +1090 +1085 +3 +25705 +25706 +21332 +25707 +19 +3119 +19618 +25237 +14369 +19404 +25708 +14 +25709 +25710 +4263 +590 +25711 +15718 +7154 +25712 +14 +25713 +337 +7531 +21947 +25714 +19 +7532 +9539 +15 +18792 +10236 +337 +14369 +24896 +8297 +303 +25715 +38 +345 +303 +303 +25716 +15000 +411 +2 +25717 +2733 +5204 +20768 +3546 +25718 +25719 +25720 +2009 +25721 +25722 +25723 +21947 +25724 +20572 +13523 +20 +14 +25725 +590 +25726 +590 +4116 +764 +286 +25727 +13529 +25728 +4550 +19618 +25729 +25730 +34 +25 +43 +24978 +5558 +25731 +185 +25237 +590 +1316 +25732 +1488 +25733 +379 +16790 +21988 +25734 +5877 +24896 +14583 +14477 +1578 +43 +7053 +736 +1082 +25735 +17151 +115 +1562 +286 +25736 +1212 +14 +25737 +284 +25738 +15511 +2131 +25683 +21947 +13721 +43 +19618 +25739 +9144 +1018 +827 +22317 +25740 +586 +19404 +25741 +25742 +25743 +7419 +25744 +1013 +665 +21947 +3599 +14124 +12005 +5188 +720 +9 +25745 +25746 +25747 +15 +590 +43 +25748 +11995 +15 +1465 +25749 +24497 +286 +9 +440 +22 +25750 +19655 +25751 +23103 +4793 +21885 +720 +5780 +57 +14604 +1169 +25752 +25753 +2697 +15094 +14477 +3034 +8668 +25754 +25755 +137 +345 +3 +25756 +2195 +14369 +25757 +2197 +22967 +16780 +2197 +25237 +4550 +25758 +25759 +25760 +3660 +25761 +18942 +25762 +25763 +745 +1446 +25764 +1100 +248 +25765 +25766 +14604 +9 +25767 +9 +597 +24896 +13361 +19404 +25768 +25769 +19618 +249 +25770 +25771 +21689 +12729 +23103 +13566 +24715 +19 +72 +2 +13721 +17151 +7457 +15 +22 +43 +248 +1013 +24896 +15844 +25772 +25773 +25683 +590 +9 +43 +25162 +21947 +14 +25774 +21947 +5085 +25775 +16028 +25776 +25777 +6517 +57 +14604 +345 +19618 +25778 +57 +19618 +720 +25779 +12987 +17083 +43 +25780 +1090 +15854 +201 +25781 +155 +209 +24725 +22308 +25782 +25783 +25784 +10230 +25785 +43 +11762 +23103 +9617 +25786 +648 +2197 +43 +9 +18406 +25787 +25788 +89 +337 +13959 +25789 +14 +25790 +12808 +3553 +2577 +25791 +14 +22468 +590 +2499 +25792 +736 +24785 +32 +14 +25793 +43 +14369 +3279 +286 +14 +18778 +17151 +3 +25794 +43 +25795 +1976 +25796 +25797 +25798 +25799 +21486 +272 +8465 +315 +13721 +16466 +13721 +19655 +15718 +15 +16118 +9 +11162 +25800 +32 +1829 +25801 +25802 +8668 +25803 +25804 +25805 +25806 +554 +8668 +25807 +43 +25808 +25809 +19091 +337 +24303 +14369 +43 +25810 +25811 +286 +10477 +590 +23103 +25812 +736 +14 +18372 +14363 +3546 +2694 +25813 +13721 +25814 +849 +25815 +21947 +18670 +573 +20941 +24864 +14435 +25816 +1091 +11754 +14 +11176 +25817 +5833 +6341 +432 +14 +25818 +14 +3291 +25819 +3335 +10946 +24978 +5780 +19 +25820 +25821 +20161 +25822 +25823 +248 +25382 +25824 +8297 +3546 +24864 +345 +32 +2056 +25825 +25826 +25827 +4581 +25828 +18421 +1889 +25829 +25830 +3 +13578 +25334 +15 +345 +9234 +25831 +2035 +25832 +14369 +6457 +25833 +25834 +16866 +286 +25835 +2029 +2389 +1234 +20339 +2197 +1637 +21947 +25836 +209 +25837 +19 +1382 +32 +25838 +25839 +25840 +25841 +1542 +25842 +665 +25237 +9 +286 +25843 +3484 +7604 +19618 +25844 +25845 +9566 +25846 +677 +4020 +201 +25847 +25848 +3601 +248 +21947 +4518 +8218 +25659 +21947 +14658 +7291 +1316 +24864 +284 +43 +2052 +5582 +10993 +707 +25334 +25849 +25850 +25851 +25852 +7053 +22308 +23103 +23603 +213 +25853 +21371 +2577 +1147 +19 +14 +25854 +17480 +25855 +25856 +19091 +25857 +25858 +98 +25859 +14604 +3546 +57 +9449 +590 +1542 +7137 +17349 +15 +25860 +25202 +2724 +25861 +14 +13372 +32 +213 +1051 +25862 +19618 +13721 +25863 +25864 +21698 +25865 +14369 +2 +1765 +21835 +12397 +665 +3546 +1100 +22717 +2882 +4441 +25866 +19618 +337 +8668 +25867 +694 +25868 +284 +18695 +2121 +25869 +20 +25870 +24303 +989 +3978 +9 +32 +3119 +25871 +6110 +25872 +25873 +20 +25874 +8427 +24907 +25875 +1715 +4616 +25876 +213 +25877 +155 +57 +1244 +25878 +491 +25879 +1563 +303 +8029 +10290 +9 +21126 +6372 +25880 +337 +358 +303 +16121 +25881 +25882 +25883 +1742 +248 +25884 +25885 +25584 +1090 +25886 +19 +1018 +15705 +213 +25887 +25888 +23666 +15 +25889 +18798 +272 +32 +25890 +19 +720 +25891 +25892 +24951 +24896 +24896 +3484 +442 +25893 +4 +25894 +4684 +25895 +18045 +6741 +14 +24862 +5649 +3546 +24864 +25896 +25897 +25898 +3546 +1812 +3543 +25899 +25900 +21698 +6212 +25901 +3546 +14 +25902 +11593 +43 +24303 +1134 +345 +25903 +3546 +1817 +25904 +25905 +1357 +25906 +272 +2314 +590 +9 +5780 +590 +514 +25907 +2 +25908 +25909 +590 +25910 +19618 +14079 +25911 +566 +43 +13721 +21947 +7917 +96 +4285 +2809 +1991 +13721 +25912 +1049 +286 +1542 +25913 +2 +590 +17082 +25914 +2476 +8255 +19618 +514 +10011 +43 +25915 +98 +25916 +25917 +43 +2314 +1517 +25918 +303 +14369 +24862 +25919 +19931 +590 +373 +4550 +15718 +25920 +25921 +25636 +21031 +201 +303 +25922 +25923 +25924 +25925 +25926 +25927 +1961 +8280 +25928 +19362 +25929 +25930 +23547 +2830 +24978 +25931 +25932 +14 +25933 +14477 +14369 +5614 +15718 +13721 +1423 +25934 +19 +23727 +3543 +3546 +25935 +2197 +25936 +25937 +25938 +9578 +25939 +155 +25940 +14 +18300 +72 +7743 +25941 +3546 +25942 +11754 +590 +155 +6785 +7053 +286 +5088 +10946 +25943 +809 +373 +25944 +22963 +24303 +14 +9410 +25945 +25946 +25947 +25948 +25949 +25584 +25950 +12 +25951 +4280 +24725 +25952 +2764 +20339 +13111 +16140 +25953 +25954 +2201 +10030 +137 +4050 +21947 +25955 +5204 +464 +12067 +16885 +25237 +170 +3546 +14 +13721 +22 +6459 +25956 +18178 +1577 +25957 +14604 +25958 +25959 +1300 +1160 +20 +373 +25683 +345 +13721 +20645 +13721 +19618 +201 +25960 +19618 +3030 +13721 +1364 +19 +554 +25871 +3709 +21045 +3338 +373 +22940 +43 +349 +9123 +18982 +3546 +3546 +36 +19 +25961 +25962 +19931 +6261 +533 +3546 +6794 +25963 +6928 +25964 +13721 +25965 +14 +159 +24144 +25584 +25146 +25966 +19218 +8188 +43 +590 +43 +19618 +3353 +25967 +228 +25659 +7053 +2707 +23103 +25968 +6095 +1082 +25969 +25970 +25971 +22986 +2009 +43 +25972 +286 +25973 +25974 +10108 +25975 +9410 +23103 +17654 +23071 +2136 +23196 +25976 +1817 +1765 +3546 +4990 +25977 +48 +14369 +15 +25978 +19 +25979 +25980 +538 +17151 +188 +25981 +25237 +15038 +25982 +16437 +25983 +15718 +286 +25984 +21689 +25985 +6518 +9 +25986 +270 +16618 +25987 +286 +11762 +24896 +6004 +20329 +25988 +5085 +25989 +18695 +25990 +16798 +25991 +22787 +495 +20063 +590 +19 +21689 +25992 +4463 +25993 +16 +53 +25994 +25995 +32 +32 +25996 +14369 +1743 +24303 +1804 +25997 +43 +14369 +25998 +14369 +25999 +26000 +26001 +14069 +26002 +1961 +26003 +554 +26004 +21947 +26005 +19478 +519 +89 +26006 +15824 +5803 +272 +26007 +2000 +19618 +188 +26008 +958 +26009 +15998 +26010 +26011 +554 +26012 +26013 +1013 +22065 +1961 +554 +26014 +26015 +1021 +26016 +9 +142 +1524 +26017 +12506 +14 +19404 +26018 +9 +7886 +19655 +15592 +9937 +26019 +590 +5780 +3394 +1529 +17609 +13721 +3077 +9 +536 +11762 +9 +21947 +26020 +26021 +13721 +14 +19 +21031 +43 +26022 +586 +26023 +1991 +26024 +2316 +11762 +1013 +26025 +26026 +613 +19 +377 +345 +26027 +24864 +26028 +18045 +26029 +26030 +24303 +26031 +26032 +26033 +26034 +26035 +14369 +349 +1642 +3067 +19091 +12987 +179 +24725 +213 +19 +43 +26036 +26037 +736 +7053 +19 +21734 +1300 +26038 +19 +17084 +26039 +5627 +155 +26040 +1012 +21689 +8015 +19618 +57 +2410 +10 +8351 +32 +12067 +26041 +7357 +3546 +23490 +26042 +26043 +14477 +554 +9 +26044 +26045 +6950 +26046 +26047 +26048 +98 +14369 +2537 +32 +26049 +20195 +8248 +21947 +101 +8053 +26050 +11804 +3546 +1912 +9 +19 +15718 +17151 +26051 +12826 +5117 +26052 +1384 +26053 +1784 +26054 +915 +26055 +26056 +17112 +89 +21947 +26057 +9 +26058 +26059 +15541 +11282 +26060 +225 +26061 +278 +665 +14 +14278 +21947 +19218 +13566 +26062 +26063 +590 +26064 +89 +590 +22302 +57 +26065 +43 +52 +3546 +2577 +26066 +21947 +1364 +16102 +13396 +26067 +12005 +26068 +26069 +14369 +7912 +1382 +1011 +17982 +3546 +17400 +155 +12404 +208 +8721 +20068 +16941 +4411 +32 +24896 +26070 +26071 +24864 +26072 +345 +13721 +1742 +26073 +24725 +14363 +647 +6571 +14477 +17911 +26074 +573 +2978 +43 +8367 +26075 +26076 +590 +19 +26077 +20497 +872 +720 +26078 +12005 +861 +13721 +349 +1100 +3546 +21689 +24732 +519 +26079 +26080 +155 +26081 +14369 +590 +26082 +11647 +9617 +18045 +26083 +26084 +3546 +10385 +43 +3546 +17151 +677 +26085 +647 +22918 +736 +14369 +4221 +1300 +1561 +26086 +272 +26087 +4388 +26088 +43 +26089 +13539 +17136 +26090 +19404 +26091 +13721 +1739 +24339 +16437 +24978 +1768 +207 +2 +26092 +26093 +26094 +14 +9 +26095 +317 +26096 +26097 +26098 +19 +7137 +26099 +21947 +3546 +590 +26100 +26101 +8668 +8967 +1107 +18045 +22963 +43 +862 +38 +26102 +26103 +26104 +19 +2 +2040 +26105 +26106 +345 +1917 +16102 +971 +3601 +26107 +590 +26108 +14 +43 +19823 +26109 +26110 +9 +3978 +21947 +26111 +528 +1172 +14 +24864 +26112 +345 +15104 +26113 +13375 +14369 +32 +17698 +24303 +282 +26114 +29 +14 +865 +14 +677 +26115 +24864 +26116 +26117 +17151 +4463 +1234 +26118 +26119 +26120 +14 +26121 +26122 +1612 +26123 +2694 +9 +566 +16437 +26124 +7987 +26125 +26126 +4230 +4550 +4764 +26127 +26128 +2 +26129 +13330 +1018 +14001 +24565 +24864 +19618 +26130 +7291 +26131 +53 +21689 +4 +14369 +590 +43 +14369 +17151 +26132 +26133 +4088 +12768 +21947 +26134 +5085 +7014 +13721 +26135 +12152 +26136 +15 +5780 +26137 +1090 +26138 +26139 +26140 +26141 +14363 +1112 +26142 +26143 +26144 +790 +234 +26145 +590 +3242 +398 +14 +26146 +8392 +13701 +140 +1382 +26147 +26148 +2009 +26149 +26150 +26151 +14369 +14 +26152 +21947 +14 +26153 +43 +349 +14369 +26154 +26155 +19797 +5446 +22 +26156 +1520 +720 +17136 +23122 +26157 +16014 +1090 +26158 +379 +43 +26159 +24725 +26160 +4463 +358 +26161 +14693 +7053 +26162 +590 +26163 +7048 +14814 +26164 +26165 +57 +399 +57 +26166 +26167 +25237 +26168 +14369 +26169 +14369 +19 +19618 +14185 +26170 +590 +21947 +24144 +845 +26171 +32 +43 +519 +3546 +25237 +26172 +345 +1021 +26173 +16118 +25833 +9 +1465 +14369 +21947 +26174 +6776 +17846 +345 +26175 +1100 +26176 +590 +9 +21947 +26177 +26178 +43 +2733 +26179 +26180 +19618 +137 +1738 +4918 +26181 +57 +13856 +8798 +4526 +20645 +26182 +21947 +333 +21689 +7137 +1013 +26183 +14909 +26184 +26185 +554 +26186 +15694 +22 +26187 +13721 +286 +26188 +14 +2919 +26189 +26190 +19 +43 +345 +14 +24790 +24303 +26191 +14 +29 +4088 +26192 +17151 +14 +26001 +1870 +26193 +14 +26194 +1010 +379 +26195 +26196 +968 +597 +26197 +26198 +23541 +4550 +377 +590 +43 +26199 +13484 +887 +26200 +21947 +26201 +286 +26202 +9 +26203 +26204 +23290 +286 +18591 +1224 +26205 +24864 +18019 +21947 +345 +1823 +26206 +43 +6620 +9431 +26207 +26208 +26209 +25683 +26210 +3546 +590 +24303 +26211 +1091 +19 +14604 +26212 +358 +3546 +3559 +26213 +26214 +21689 +36 +24303 +26215 +9400 +25659 +26216 +7137 +26217 +323 +3546 +25683 +7032 +1612 +8037 +26218 +5117 +501 +345 +720 +590 +13721 +26219 +7982 +24303 +19538 +26220 +26221 +590 +26222 +2770 +3330 +26223 +14 +3519 +827 +26224 +26225 +15 +3338 +484 +18383 +26226 +11822 +1208 +26227 +14604 +26228 +21947 +8668 +15906 +19 +4855 +20942 +26229 +25237 +3546 +25659 +15240 +736 +14477 +26230 +26231 +2034 +104 +8967 +16102 +924 +5326 +7588 +26232 +26233 +3978 +26234 +7053 +4518 +8110 +558 +14 +19109 +457 +590 +26235 +26236 +26237 +1502 +13361 +19 +26238 +19618 +2832 +21947 +26239 +14 +809 +590 +14 +3553 +26240 +19618 +26241 +19030 +23192 +14 +26242 +7855 +26243 +14477 +26244 +10 +4070 +564 +26245 +3119 +647 +21947 +26246 +519 +26247 +590 +14992 +14935 +26248 +26249 +12479 +59 +22269 +7357 +32 +26250 +26251 +1924 +26252 +1870 +18655 +16925 +9543 +3546 +590 +26253 +13405 +26254 +26255 +16437 +26256 +140 +26257 +26258 +17151 +26259 +43 +25927 +2260 +11274 +89 +26260 +11321 +9 +98 +22468 +112 +9779 +624 +3330 +2019 +495 +10 +22552 +5305 +14477 +286 +1316 +8177 +19 +26261 +20265 +26262 +10706 +26263 +26264 +26265 +23727 +26266 +14 +10364 +26267 +19 +7835 +43 +26268 +15 +26269 +6261 +1316 +474 +14342 +26270 +26271 +26272 +14 +26273 +533 +26274 +26275 +22500 +17136 +26276 +4550 +26277 +26278 +13131 +736 +14000 +21885 +22 +25334 +11762 +6479 +26279 +26280 +7477 +26281 +26282 +26283 +20340 +21947 +26284 +5085 +13361 +43 +2804 +15718 +32 +713 +1989 +19 +8188 +115 +209 +827 +345 +6627 +57 +26285 +26286 +1100 +185 +26287 +14369 +26288 +13484 +14 +26289 +26290 +21947 +1817 +14604 +15914 +645 +26291 +26292 +208 +1013 +16437 +8994 +26293 +24862 +26294 +23406 +3546 +9 +13619 +21947 +26295 +26296 +14 +26297 +26298 +25140 +745 +26299 +43 +14363 +9 +21947 +209 +3764 +43 +17151 +33 +17151 +26300 +14962 +24864 +16949 +26301 +9849 +8316 +1425 +3546 +1066 +26302 +1514 +26303 +24896 +26304 +5614 +26305 +17228 +26306 +26307 +155 +915 +2561 +590 +9 +13721 +1512 +590 +5085 +26308 +26309 +10 +286 +43 +14369 +26310 +19 +9 +26311 +26312 +3546 +6499 +5780 +43 +20946 +43 +26313 +590 +26314 +1124 +26315 +26316 +26317 +26318 +14 +19 +26319 +26320 +26321 +26322 +14 +887 +43 +19209 +16118 +5085 +272 +2325 +713 +26323 +57 +26324 +590 +57 +12722 +196 +2577 +1817 +373 +817 +26325 +5085 +26326 +26327 +2410 +349 +26328 +3950 +10846 +1655 +26329 +2121 +20676 +671 +2577 +590 +861 +22236 +24269 +26330 +3343 +188 +19931 +16819 +26331 +11762 +3546 +16695 +3924 +26332 +26333 +26334 +26335 +21947 +32 +26336 +26337 +590 +26338 +155 +22075 +24227 +26339 +3546 +2064 +6251 +18045 +26340 +13721 +25237 +26341 +487 +2427 +26342 +3460 +21947 +25928 +25758 +26343 +19 +1021 +19209 +1823 +26344 +26345 +2029 +790 +53 +4550 +77 +18136 +26346 +2197 +16125 +23103 +16369 +26347 +14369 +26348 +21947 +26349 +286 +12936 +14369 +26350 +6560 +26351 +349 +26352 +25564 +188 +26353 +26354 +590 +26355 +24207 +10621 +2694 +26356 +14369 +26357 +21947 +26358 +3978 +22 +26359 +26360 +26361 +424 +26362 +14 +26363 +26364 +22308 +4502 +26365 +13149 +26366 +4550 +26367 +536 +6010 +1338 +26368 +10642 +26369 +286 +14369 +26370 +26371 +352 +3376 +23547 +3978 +9 +26372 +155 +26373 +21947 +26374 +26375 +24864 +26376 +2310 +26377 +6950 +26378 +21947 +15216 +9 +24423 +19618 +26379 +586 +1222 +155 +14477 +3243 +26380 +14 +3546 +43 +1961 +18579 +14 +14477 +590 +26381 +3484 +26382 +26383 +16941 +8651 +26384 +936 +26385 +14369 +251 +26386 +43 +43 +26387 +26388 +20 +9 +26389 +26390 +26391 +26392 +26393 +26394 +3171 +5627 +19618 +14 +43 +2260 +14604 +26395 +26396 +1369 +1882 +26397 +13307 +26398 +10 +26399 +13897 +21947 +24303 +26400 +3649 +26401 +26402 +554 +17653 +13457 +26403 +14 +26404 +13149 +26405 +2694 +26406 +568 +590 +26407 +43 +26408 +26409 +26410 +155 +23037 +2260 +26411 +26412 +26413 +25683 +26414 +26415 +23103 +25683 +24144 +1710 +14 +26416 +554 +26417 +26418 +3553 +26419 +9 +26420 +26421 +19618 +9 +24864 +11762 +14 +43 +26422 +26423 +26424 +89 +5085 +14369 +26425 +26426 +22963 +3 +21947 +43 +19 +21947 +26427 +17151 +3546 +43 +17607 +21947 +19404 +26428 +9837 +19 +1870 +26429 +1051 +26430 +9 +43 +25584 +8188 +26431 +5803 +4 +26432 +764 +26433 +3546 +26434 +15718 +22 +26435 +26436 +70 +26403 +26437 +5584 +26438 +1224 +26439 +26440 +14843 +26441 +827 +26442 +155 +10428 +26443 +18951 +26444 +590 +5085 +26445 +26446 +13129 +12987 +43 +250 +43 +26447 +26448 +60 +26449 +26450 +671 +12304 +272 +1364 +26451 +26452 +43 +14369 +14152 +2769 +16118 +26453 +26454 +3252 +15647 +26455 +2040 +8465 +14343 +26456 +8188 +2733 +3 +25683 +26457 +26458 +7835 +323 +57 +26459 +19618 +2065 +25683 +26460 +26461 +12 +24896 +26462 +26463 +26464 +22042 +9 +26465 +16121 +822 +15809 +17346 +683 +26466 +15718 +8668 +15 +22798 +26467 +2029 +15 +8670 +1090 +14 +514 +6341 +3553 +43 +357 +25140 +20161 +1875 +8351 +8103 +43 +2 +26468 +26469 +6877 +14 +446 +286 +19618 +14211 +26470 +26471 +10 +13150 +10486 +26472 +19 +5085 +1961 +26473 +21947 +21947 +7183 +4855 +15810 +26474 +19 +24896 +558 +3946 +26475 +21947 +14369 +26476 +8953 +415 +3546 +1559 +14 +2728 +26477 +26478 +3470 +9 +22 +12155 +26479 +26480 +9 +13721 +2 +26481 +9819 +791 +26482 +21947 +26483 +26484 +19 +12067 +17790 +14477 +26485 +26486 +26487 +26488 +590 +3546 +14369 +10774 +26489 +26490 +15466 +26491 +26492 +11374 +823 +26493 +590 +14 +26494 +26495 +9 +22485 +96 +43 +3063 +17151 +26496 +26497 +915 +26498 +11964 +26499 +2 +646 +536 +26500 +24725 +1834 +272 +26501 +26502 +3801 +26503 +6499 +19 +20941 +7053 +25683 +26504 +26505 +590 +647 +26506 +6072 +26507 +26508 +7907 +26509 +25237 +4387 +26510 +26511 +1200 +345 +974 +222 +26512 +26513 +2795 +3105 +26514 +26515 +338 +21947 +26516 +7810 +26517 +14603 +26518 +26519 +32 +19618 +11229 +21947 +2449 +26520 +286 +1542 +8496 +26521 +11754 +26522 +9 +26403 +26523 +1817 +715 +26524 +26525 +3317 +21947 +3546 +936 +590 +26526 +827 +26527 +26528 +26529 +19 +2 +26530 +15948 +26531 +19928 +872 +26532 +19 +1011 +736 +26533 +590 +26534 +24017 +4650 +832 +11845 +26535 +26536 +26537 +249 +26538 +18695 +26539 +18695 +348 +23343 +249 +17039 +26540 +21947 +26541 +26542 +26543 +806 +25140 +26544 +26545 +21947 +26546 +9074 +32 +4550 +26547 +590 +26548 +26549 +26550 +10642 +19 +286 +6877 +26551 +58 +43 +26552 +19 +9410 +43 +26553 +201 +14369 +25584 +16876 +21689 +24039 +25683 +3546 +25584 +15 +1066 +17151 +26554 +14 +26555 +3546 +26556 +196 +554 +14369 +19 +25334 +286 +9 +17033 +22 +9074 +26557 +43 +554 +26558 +415 +17411 +26559 +24896 +19618 +26560 +3546 +43 +26561 +26562 +10 +399 +26563 +16017 +14000 +26564 +43 +5451 +26565 +26566 +14369 +15718 +19 +272 +2260 +26567 +15 +1605 +26568 +286 +286 +26569 +26570 +590 +349 +26571 +19 +26572 +19 +533 +8297 +4463 +20442 +19 +333 +26573 +26574 +5780 +1559 +21947 +26575 +12005 +8668 +19 +26576 +3353 +536 +26577 +16653 +26578 +11428 +286 +26579 +14 +70 +590 +16826 +21947 +586 +43 +26580 +24896 +3417 +15 +26581 +26582 +26583 +20643 +23530 +2324 +57 +8127 +17635 +17151 +1154 +2012 +26584 +25584 +9 +17345 +22666 +4388 +20470 +26585 +286 +15683 +26586 +14369 +14604 +26587 +1529 +1542 +3030 +26588 +26589 +213 +26590 +1090 +25140 +26591 +3452 +14 +26592 +26593 +21947 +26594 +26595 +26596 +26597 +303 +26598 +26599 +379 +21947 +11215 +26600 +14 +26601 +7208 +19618 +25140 +209 +25735 +26602 +26603 +26604 +26476 +26605 +26339 +3908 +17294 +14369 +26606 +15 +23103 +248 +2561 +284 +26607 +1578 +26608 +349 +284 +26609 +4028 +9900 +26610 +26611 +19 +3446 +4899 +358 +3976 +303 +14 +22573 +26612 +213 +15584 +26613 +5654 +26614 +26615 +23885 +17653 +26616 +337 +284 +8668 +11995 +15 +26617 +10 +26618 +26619 +26620 +26621 +1356 +19 +14369 +9384 +26622 +248 +4367 +8743 +15718 +26623 +10 +16727 +26624 +26625 +24864 +26626 +2342 +26627 +272 +1513 +26628 +15 +26629 +586 +19918 +20 +7855 +26630 +590 +26631 +57 +19220 +3546 +26632 +337 +26633 +7364 +7256 +66 +26634 +20563 +18325 +25584 +337 +176 +21947 +26635 +26636 +26637 +1774 +5780 +17691 +9 +26638 +24896 +21947 +26639 +43 +43 +7458 +1011 +26640 +15193 +26641 +17405 +16684 +337 +15939 +13566 +272 +590 +303 +8100 +19 +19618 +13213 +15907 +43 +26642 +491 +26643 +554 +284 +9 +26644 +19 +2770 +13349 +13343 +554 +671 +26645 +43 +26646 +9 +20 +2006 +43 +26647 +24864 +26648 +26649 +26650 +20866 +14 +915 +19 +25904 +26651 +26652 +26653 +2804 +24207 +20315 +26654 +26655 +26656 +24238 +26657 +9 +66 +26658 +19 +337 +26659 +26660 +26661 +736 +26662 +26663 +201 +26664 +349 +345 +26665 +26666 +8668 +26667 +26668 +286 +25009 +5904 +26669 +26670 +26671 +43 +1382 +12438 +22103 +26672 +2117 +26673 +274 +720 +349 +14 +8798 +26674 +2040 +25683 +18386 +26675 +26676 +26677 +142 +26678 +5780 +7048 +827 +26679 +2410 +14604 +13566 +14020 +14 +26680 +357 +26681 +26682 +26683 +26493 +115 +26684 +272 +3287 +590 +26685 +3601 +21947 +26686 +3559 +17151 +26687 +8256 +24449 +26688 +26689 +22633 +20328 +14369 +21947 +590 +26690 +23464 +1425 +286 +26691 +26692 +26493 +21947 +14 +17871 +26693 +2415 +337 +842 +3480 +26694 +4278 +1696 +20 +26695 +15820 +2496 +20 +213 +26696 +1013 +26697 +26698 +18718 +26699 +21689 +705 +4367 +9245 +26700 +24303 +19 +19618 +53 +248 +26701 +26702 +16826 +26703 +43 +5085 +736 +26704 +26705 +26706 +26707 +14770 +26708 +26709 +26710 +29 +178 +19 +590 +26711 +17151 +5393 +13721 +1991 +26712 +26713 +26714 +590 +80 +26715 +21947 +8953 +24 +8566 +825 +14369 +26716 +701 +26717 +8668 +274 +14 +14 +14 +26718 +13296 +284 +1082 +19404 +26719 +26720 +736 +15107 +26721 +26722 +3546 +3546 +358 +26723 +18824 +9210 +26724 +13721 +8668 +112 +647 +17320 +25129 +23579 +9 +1482 +3034 +26725 +26726 +823 +26631 +286 +1612 +32 +13411 +23226 +16387 +29 +3546 +9497 +26727 +345 +26728 +17698 +26729 +43 +26730 +4634 +736 +114 +26731 +26732 +3484 +14 +1224 +24303 +14 +1745 +12987 +14001 +26733 +17151 +26734 +26735 +3435 +915 +26736 +15560 +1090 +140 +411 +736 +12832 +1882 +26493 +272 +12 +196 +1961 +26737 +590 +15718 +16440 +5085 +26738 +20 +284 +736 +43 +26739 +26740 +1529 +19 +1787 +43 +16826 +20442 +26741 +26742 +43 +26743 +26744 +3546 +26745 +26746 +13721 +2957 +18695 +26239 +43 +24725 +26747 +3546 +14369 +10616 +26748 +26749 +26493 +19 +57 +26750 +26751 +67 +9 +15 +337 +14369 +3546 +43 +26752 +26753 +26754 +9 +26755 +14 +12987 +19489 +15 +26756 +26757 +19 +16944 +2 +11308 +4551 +3119 +2764 +11321 +137 +9 +4805 +736 +26758 +140 +25140 +2577 +3 +301 +26759 +717 +26760 +26761 +26762 +17749 +26763 +19 +823 +25683 +26764 +554 +369 +26765 +43 +5085 +26766 +19852 +2 +19 +3546 +24174 +26767 +828 +849 +1090 +26403 +7835 +26768 +590 +3546 +1812 +26769 +26770 +26771 +213 +43 +1090 +14186 +26772 +17151 +16024 +26493 +26773 +26774 +1051 +554 +11321 +26775 +13435 +26776 +1172 +590 +9 +26777 +38 +286 +16102 +26778 +26779 +1605 +15683 +665 +16028 +26780 +590 +3546 +137 +248 +21947 +19 +284 +284 +3252 +14477 +26781 +26782 +7009 +1562 +4221 +26783 +14515 +15718 +26784 +3251 +665 +3119 +19817 +15718 +2998 +3394 +564 +303 +10389 +248 +26785 +26786 +26787 +9 +3546 +590 +484 +26788 +248 +159 +26789 +26790 +24505 +20442 +8392 +26791 +26792 +155 +286 +32 +349 +24541 +25140 +188 +1513 +24908 +60 +26793 +26794 +8210 +751 +26795 +26796 +213 +303 +590 +1160 +284 +26797 +26798 +25778 +1768 +26676 +26799 +23207 +9 +26800 +4179 +32 +4735 +26801 +4550 +16437 +9343 +26802 +26803 +26804 +16118 +284 +5438 +26805 +26806 +26807 +14477 +248 +26808 +24896 +26809 +14603 +4684 +26810 +14369 +26811 +19404 +26812 +10654 +24303 +15657 +43 +1018 +26813 +286 +23226 +24864 +14363 +26814 +26815 +26816 +26817 +21947 +26818 +11762 +26819 +21689 +26820 +26821 +26822 +26403 +14871 +26823 +20339 +43 +25237 +26676 +202 +26824 +213 +26825 +736 +26826 +26827 +26828 +26829 +8330 +26830 +795 +26831 +19404 +26549 +3544 +2733 +1561 +18081 +14 +2281 +11822 +20470 +26832 +3353 +3546 +303 +2577 +24998 +57 +26833 +12 +24144 +720 +2 +26834 +12480 +14369 +2577 +3994 +213 +16024 +248 +26835 +26836 +58 +18860 +26837 +736 +16788 +26838 +26839 +6991 +26840 +26841 +26842 +26843 +26844 +4581 +26845 +1812 +25140 +1100 +26846 +14909 +26847 +19 +647 +2 +4463 +349 +46 +536 +26848 +484 +26849 +32 +26545 +26850 +4406 +26851 +26852 +26853 +14369 +6939 +26854 +43 +11762 +26855 +26856 +26857 +26858 +26859 +24423 +25683 +16240 +26792 +663 +3753 +26860 +26861 +8392 +4550 +26862 +14660 +8188 +14363 +1090 +26863 +345 +7585 +14363 +26864 +26865 +26866 +43 +26867 +5780 +26868 +20 +213 +26869 +26870 +11471 +14369 +590 +14 +26871 +21689 +26872 +284 +14369 +19618 +1543 +26873 +1829 +26874 +18382 +43 +2318 +24324 +9 +25683 +26496 +3546 +19655 +26875 +647 +26876 +2832 +19969 +21947 +20617 +9 +21947 +25237 +345 +26877 +26878 +2040 +26879 +24207 +11548 +2463 +1961 +323 +26880 +337 +337 +1244 +20646 +213 +1790 +248 +5022 +10 +26881 +270 +14369 +5314 +213 +1038 +2902 +26882 +26883 +8460 +26884 +6840 +736 +1696 +26885 +26886 +26887 +26888 +3484 +26889 +21149 +14 +26890 +43 +15 +137 +26891 +26892 +21947 +26893 +21947 +1384 +9 +26894 +26029 +26895 +26896 +2561 +11808 +43 +3546 +20340 +20897 +345 +213 +4028 +26897 +26898 +6364 +7516 +22684 +26899 +17151 +26900 +248 +9 +26901 +284 +303 +10702 +57 +213 +26902 +12152 +43 +23196 +3994 +720 +26903 +18503 +26904 +3 +26905 +590 +26906 +590 +8465 +43 +3546 +26907 +4441 +26908 +26909 +26910 +32 +25237 +3764 +25281 +26911 +13721 +1817 +3 +26184 +26912 +14369 +720 +15718 +26913 +379 +11754 +411 +20470 +15 +19618 +26914 +6915 +17670 +26915 +26916 +26917 +26918 +26919 +26920 +26921 +1021 +13150 +3790 +26922 +514 +26923 +14 +3546 +14649 +14 +26924 +26925 +26926 +26403 +573 +13721 +26927 +12180 +26928 +14 +1787 +26929 +9 +43 +248 +3417 +26724 +9 +519 +4241 +3828 +26930 +26931 +1513 +26932 +26933 +19 +13974 +4502 +213 +1369 +26934 +26935 +26936 +26937 +1091 +48 +16413 +7045 +2009 +5704 +694 +590 +26938 +26939 +19618 +15 +26940 +4650 +23425 +26941 +11889 +57 +11762 +26942 +5629 +22 +26943 +26944 +188 +26945 +57 +26946 +411 +19 +14369 +872 +14604 +26947 +26948 +26949 +1021 +20600 +17749 +26950 +491 +11428 +590 +26951 +26952 +26953 +12987 +286 +26954 +26955 +17972 +3601 +5561 +590 +17490 +1961 +138 +26956 +2733 +590 +26957 +26958 +26959 +764 +26960 +286 +57 +442 +26961 +26962 +43 +26963 +4209 +26964 +24864 +16437 +14 +415 +26965 +501 +26966 +11762 +9524 +26967 +26968 +26969 +26970 +19618 +188 +46 +345 +3546 +9 +20339 +26971 +2619 +26972 +17338 +12468 +3546 +26973 +21681 +43 +1011 +1082 +590 +26974 +26975 +590 +24864 +936 +1870 +519 +2514 +26976 +645 +590 +286 +43 +5780 +3187 +26977 +26978 +26979 +26980 +32 +14079 +26981 +5627 +872 +26982 +10 +16389 +26983 +26984 +26985 +568 +14604 +647 +43 +5780 +1817 +22 +24207 +12684 +20871 +2540 +26986 +284 +185 +26987 +26988 +6286 +16437 +2459 +2514 +26989 +590 +26990 +284 +14369 +4803 +15939 +3546 +9 +26991 +182 +736 +3546 +19618 +26992 +26403 +19 +345 +26993 +26994 +15728 +342 +213 +26995 +345 +446 +345 +14369 +5773 +15718 +19573 +26996 +26997 +5271 +26998 +26999 +317 +43 +27000 +24640 +345 +27001 +286 +5188 +665 +1529 +27002 +790 +3546 +27003 +27004 +57 +57 +27005 +27006 +27007 +7944 +4217 +19 +13721 +66 +27008 +1502 +27009 +25584 +27010 +519 +18364 +27011 +24716 +27012 +349 +24896 +1907 +10 +27013 +27014 +27015 +24207 +178 +14369 +286 +3994 +99 +827 +18695 +25442 +27016 +1295 +19009 +18205 +3546 +2902 +3406 +3546 +9 +16607 +646 +379 +590 +209 +303 +21245 +3601 +27017 +8994 +155 +21439 +27018 +9796 +213 +2415 +27019 +464 +337 +2601 +14369 +326 +27020 +648 +27021 +590 +478 +1287 +21889 +27022 +77 +15045 +1749 +647 +910 +27023 +27024 +19618 +27025 +27026 +25683 +43 +13721 +646 +27027 +27028 +43 +25140 +21947 +349 +27029 +27030 +89 +15 +27031 +27032 +21522 +21947 +8668 +43 +21947 +66 +2537 +590 +303 +22963 +2019 +1743 +43 +27033 +27034 +27035 +1181 +27036 +19 +3994 +24873 +250 +89 +20770 +57 +5169 +27037 +265 +25237 +26484 +27038 +19 +27039 +27040 +27041 +1889 +27042 +27043 +27044 +27045 +25097 +25683 +27046 +104 +19 +27047 +19404 +27048 +13848 +10781 +23103 +14 +34 +27049 +27050 +178 +14 +8967 +720 +14369 +882 +27051 +14532 +2882 +32 +27052 +12916 +18833 +15797 +1415 +27053 +27054 +27055 +27056 +27057 +1066 +27058 +27059 +8188 +17151 +27060 +27061 +27062 +27063 +2329 +25584 +27064 +27065 +27066 +24896 +27067 +5561 +5780 +1160 +25683 +2577 +2287 +4979 +3421 +3546 +27068 +27069 +27070 +24303 +27071 +590 +1157 +27072 +865 +27073 +3317 +10 +19 +27074 +14477 +3484 +27075 +27076 +27077 +2 +27078 +27079 +27080 +15050 +317 +27081 +27082 +15718 +2029 +27083 +25144 +27084 +694 +10727 +590 +4502 +14276 +249 +14369 +412 +209 +27085 +27086 +27087 +27088 +14 +27089 +5041 +27090 +1542 +27091 +7379 +249 +7981 +27092 +5780 +27093 +20470 +27094 +1961 +27095 +92 +22 +317 +27096 +19 +27097 +6095 +411 +27098 +2668 +27099 +20 +27100 +27101 +10028 +1817 +4982 +1870 +3862 +790 +11282 +27102 +27103 +3601 +15320 +27104 +26706 +89 +12987 +27105 +137 +19 +19618 +27106 +27107 +27108 +1955 +27109 +14 +26975 +10038 +14 +14645 +16121 +27110 +27111 +1870 +411 +19404 +13721 +4020 +3546 +27112 +27113 +17 +27114 +14 +27115 +27116 +2733 +3978 +15718 +23550 +26744 +24896 +24303 +20161 +43 +25584 +2043 +27117 +27118 +9 +24896 +14 +27119 +6499 +27120 +822 +24725 +21041 +27121 +590 +1765 +417 +27122 +27123 +27124 +27125 +27126 +1139 +27127 +27128 +27129 +17119 +425 +14 +27130 +8004 +27131 +14 +104 +6122 +5908 +27132 +11762 +11341 +201 +3546 +27133 +27134 +27135 +1219 +8762 +27136 +25140 +27137 +9 +27138 +4126 +4765 +936 +27139 +21947 +22420 +10604 +3034 +3067 +6188 +27140 +11321 +7053 +3 +27141 +4028 +32 +27142 +27143 +27144 +27145 +27146 +21187 +27147 +18896 +2560 +179 +13721 +745 +14369 +21027 +3034 +27148 +9796 +14 +345 +27149 +27150 +3546 +27151 +1524 +24038 +303 +142 +15718 +27152 +7053 +14369 +446 +8098 +1523 +66 +27153 +27154 +27155 +27156 +27157 +27158 +24 +27159 +15 +27160 +2140 +19618 +19618 +8019 +4388 +27161 +705 +43 +23103 +15728 +52 +14369 +21689 +9 +27162 +989 +20541 +22666 +27163 +27164 +27165 +1924 +27166 +23881 +43 +27167 +2015 +27168 +22555 +2260 +1559 +1169 +21947 +14 +349 +27169 +27170 +590 +3 +20315 +19994 +284 +245 +27171 +23418 +299 +24896 +27172 +491 +104 +27173 +27174 +13721 +590 +3553 +7053 +27175 +27176 +27177 +15556 +665 +38 +9 +8392 +27178 +13721 +554 +27179 +25683 +1812 +27180 +3546 +18364 +27181 +11211 +43 +27182 +27183 +345 +11321 +27184 +7991 +17206 +27185 +1604 +16024 +1502 +43 +21031 +6812 +27186 +9 +27187 +18503 +21947 +3546 +27188 +27189 +9 +27190 +365 +11283 +21947 +27191 +4414 +27192 +27193 +24340 +27194 +27195 +9460 +18695 +2449 +27196 +196 +27197 +27198 +21947 +4550 +27199 +24050 +27200 +15589 +17151 +25683 +9 +712 +27201 +43 +23770 +1605 +27202 +21947 +27203 +26403 +27204 +8280 +43 +10848 +27205 +21947 +27206 +1765 +21947 +1470 +14 +27207 +27208 +27209 +21689 +25584 +24864 +20161 +23890 +27210 +694 +27211 +21947 +27212 +27213 +24864 +3732 +2769 +14 +19655 +25140 +27214 +27215 +27216 +1384 +57 +43 +14 +14477 +164 +27217 +5780 +27218 +27219 +13841 +11822 +1021 +27220 +11792 +27221 +764 +26922 +5780 +3239 +12203 +399 +1013 +27222 +446 +1615 +692 +9 +26493 +27223 +27224 +1513 +27225 +5577 +2489 +15 +2260 +27088 +1310 +19618 +27226 +9617 +27227 +2459 +27228 +3601 +15 +1465 +27229 +616 +2791 +2919 +15 +26744 +7288 +22 +1047 +27230 +2882 +27231 +3546 +27232 +20 +27233 +8721 +27234 +20764 +27235 +27236 +7717 +14477 +286 +27237 +286 +35 +24045 +430 +18503 +14 +43 +17136 +17972 +27238 +27239 +27240 +25636 +590 +9194 +590 +1013 +25239 +27241 +14 +2694 +9 +27242 +590 +27243 +27244 +14079 +27245 +377 +11802 +24864 +5297 +26493 +14477 +1320 +27246 +27247 +491 +222 +286 +677 +12 +590 +541 +1291 +2308 +18539 +720 +286 +4075 +4550 +142 +14795 +2287 +345 +14 +22666 +225 +22 +27248 +27249 +9688 +27250 +237 +27251 +27252 +323 +21947 +27253 +25237 +27254 +17151 +21563 +201 +323 +137 +495 +27255 +27256 +5559 +60 +27257 +14369 +19 +910 +27258 +27259 +14369 +3394 +24896 +25237 +43 +15 +5438 +27260 +27261 +27262 +2919 +201 +13721 +770 +14369 +20470 +27263 +27264 +27265 +1222 +15718 +19618 +2941 +27266 +14363 +24303 +66 +27267 +14 +2260 +1107 +27268 +3790 +21947 +25683 +27269 +15718 +27270 +2790 +8566 +14562 +8724 +27271 +1716 +14240 +27272 +720 +16437 +8297 +89 +15824 +21947 +19 +286 +27150 +286 +24303 +27273 +22986 +176 +495 +9688 +27274 +14369 +2577 +27275 +303 +27276 +22 +1090 +1444 +27277 +16206 +27278 +1514 +27279 +13680 +43 +8280 +272 +27280 +201 +915 +10111 +27281 +27282 +201 +27283 +19 +26493 +27284 +25237 +27285 +616 +11 +27286 +14 +19 +14000 +24303 +27287 +27288 +27178 +27289 +43 +27290 +12807 +464 +16305 +27291 +27292 +19797 +19618 +14369 +590 +27293 +27294 +12772 +27295 +27296 +14 +27297 +32 +17872 +6354 +18695 +990 +43 +19 +19852 +25996 +14 +21689 +27298 +27299 +8226 +21947 +27300 +3546 +10621 +590 +14175 +3978 +43 +17663 +27301 +32 +27302 +25683 +228 +23727 +3546 +26493 +27303 +24725 +4550 +27304 +27305 +43 +301 +27306 +4550 +590 +14989 +20 +1021 +736 +43 +1295 +27307 +27308 +9688 +373 +25584 +23406 +27309 +25237 +27310 +3310 +2356 +27311 +14369 +4547 +27312 +27313 +5085 +2412 +43 +24725 +15718 +13721 +1316 +27314 +1710 +222 +7991 +15 +1356 +27315 +345 +13721 +8297 +21669 +21371 +27316 +27317 +27318 +27319 +424 +25140 +27320 +3480 +5075 +648 +533 +1730 +26496 +27321 +43 +27322 +1157 +692 +27323 +27324 +27325 +27326 +11483 +18429 +27327 +92 +27328 +27329 +25683 +17151 +27330 +26647 +27331 +307 +27332 +197 +971 +14131 +27333 +616 +27334 +27335 +2694 +14369 +27336 +27337 +27338 +27339 +27340 +27341 +8098 +24303 +27342 +317 +27343 +2074 +10787 +14 +89 +27344 +19 +586 +25 +27345 +17151 +345 +27346 +15 +26744 +23741 +2124 +57 +849 +10 +27347 +13127 +27348 +6132 +24303 +1382 +251 +21947 +862 +8351 +27349 +27350 +27351 +27352 +1688 +23216 +21947 +18895 +27353 +10 +1965 +13178 +43 +21947 +27354 +27355 +27356 +14477 +27357 +27358 +1352 +27359 +27360 +369 +27361 +7855 +43 +14604 +19618 +27362 +683 +25683 +533 +272 +27363 +25683 +27364 +14369 +27365 +1779 +3828 +27366 +27367 +27368 +27369 +27370 +24303 +3 +89 +27371 +736 +27372 +14369 +27373 +3546 +27374 +14477 +27178 +25237 +17151 +27375 +98 +5085 +323 +27376 +2356 +16818 +668 +27377 +11762 +7053 +5798 +10156 +14 +286 +27378 +27120 +17 +9994 +19386 +495 +6439 +6468 +27379 +24303 +27380 +27381 +1160 +27382 +5085 +519 +1169 +27383 +27384 +7795 +1517 +27385 +5085 +27386 +16437 +27387 +43 +27388 +18914 +4055 +27389 +14363 +12426 +27390 +14 +27391 +27392 +14369 +27393 +1615 +12346 +12307 +24303 +32 +12916 +14369 +21947 +27394 +27395 +15718 +18928 +27396 +7053 +27397 +27398 +43 +2694 +27399 +24725 +19618 +27400 +14 +21337 +14 +27401 +1364 +27402 +57 +27403 +25871 +3752 +10356 +27404 +27405 +27406 +27407 +27408 +22 +442 +26744 +25683 +8188 +26493 +25683 +27409 +27410 +272 +27411 +3546 +27412 +736 +27413 +27414 +590 +27415 +27416 +27417 +1047 +21689 +27418 +13905 +1674 +20 +2121 +27419 +20 +27420 +27263 +43 +25237 +27421 +27422 +3732 +27423 +24896 +14369 +27424 +27425 +349 +25382 +21689 +19618 +1046 +21947 +27426 +15718 +27427 +7835 +25237 +23103 +590 +27428 +21947 +27429 +4518 +12005 +24303 +21947 +27430 +20616 +25140 +27431 +43 +27432 +155 +27433 +27434 +27435 +9837 +8073 +13721 +1012 +27436 +590 +27437 +25237 +27438 +27439 +14 +27440 +21947 +36 +23103 +15308 +27441 +19618 +27442 +27443 +14603 +38 +27444 +27445 +590 +7053 +27446 +27447 +19838 +27448 +27449 +27450 +14369 +412 +5780 +43 +27451 +6130 +27452 +27453 +27454 +15718 +9 +23103 +43 +19404 +14477 +27455 +7053 +44 +27456 +18357 +27457 +5390 +27458 +27459 +13307 +14477 +43 +27460 +27461 +2325 +27462 +27463 +27464 +27465 +19 +27466 +721 +27467 +27468 +4426 +14000 +12351 +27469 +3826 +18988 +14 +1316 +25140 +286 +27470 +14604 +26496 +27471 +13285 +17608 +4896 +27472 +7836 +9 +1529 +27473 +13713 +43 +6950 +27474 +23406 +14 +19450 +27475 +17338 +2865 +27476 +27477 +21947 +23559 +27478 +27479 +27480 +1047 +15824 +24034 +22986 +43 +15971 +14369 +27481 +27482 +2040 +27483 +27484 +7253 +27485 +11822 +27486 +27487 +29 +26157 +19 +27488 +27489 +27490 +19 +15338 +27491 +1991 +8188 +27492 +27493 +27494 +24725 +27495 +27496 +27497 +17136 +9 +27498 +27499 +13905 +26680 +27500 +1493 +27501 +27502 +872 +6110 +14659 +13721 +27503 +286 +43 +27206 +27504 +77 +21947 +14369 +27505 +27506 +27507 +349 +27508 +554 +192 +21045 +20 +1168 +27509 +2 +27510 +2700 +8244 +140 +14477 +27511 +27512 +4516 +590 +27513 +7053 +27514 +21947 +25382 +21030 +27515 +3484 +3310 +98 +2 +43 +24303 +27516 +1013 +519 +14 +1021 +27517 +4388 +2040 +43 +665 +3546 +19618 +16437 +1385 +14 +27518 +1966 +27519 +27520 +201 +24864 +6518 +27521 +16687 +26030 +14 +27522 +14 +590 +12359 +590 +14 +27523 +27524 +13390 +27525 +379 +12055 +27526 +13111 +27527 +25871 +11928 +27528 +3978 +27529 +2694 +178 +21576 +668 +43 +27530 +2998 +15 +27531 +22684 +5085 +345 +24896 +1870 +43 +27532 +27533 +21947 +272 +27534 +27535 +22420 +1011 +13411 +9 +19618 +27536 +699 +27287 +19618 +24303 +5614 +10 +27537 +27538 +27539 +293 +27420 +14947 +80 +2694 +12307 +27540 +25237 +27541 +27542 +274 +12987 +27543 +14477 +5904 +14369 +27544 +27545 +27546 +14369 +22963 +27547 +1051 +26683 +27548 +43 +3546 +1021 +566 +24864 +11404 +707 +19582 +9 +43 +22442 +874 +428 +27287 +3543 +590 +27549 +27550 +104 +339 +590 +27551 +24733 +43 +349 +24896 +736 +27552 +519 +27553 +13307 +27554 +27555 +5085 +57 +27556 +25237 +27557 +2581 +8249 +27558 +13278 +8218 +27559 +43 +650 +6950 +27560 +19 +27561 +6395 +9 +27562 +27563 +590 +3330 +27564 +23727 +27565 +2027 +17749 +25584 +1172 +1012 +24036 +24303 +96 +8994 +13721 +27566 +13721 +25140 +32 +27567 +5297 +27568 +27569 +21947 +27570 +27571 +27572 +27573 +5725 +10003 +6225 +57 +286 +27574 +43 +18048 +21947 +2 +566 +26680 +5780 +590 +4900 +2694 +27575 +27576 +10748 +27577 +57 +25943 +349 +27578 +19618 +14693 +18250 +201 +412 +14909 +27579 +23504 +21669 +27580 +27581 +27582 +19050 +1090 +22 +11593 +27583 +25794 +23754 +46 +11944 +6874 +27584 +25237 +16925 +59 +13374 +1692 +21689 +20 +27585 +27586 +5085 +19217 +2338 +27587 +590 +14 +14369 +1605 +14000 +338 +1860 +14369 +7137 +15718 +398 +5908 +27588 +27589 +15824 +24725 +43 +345 +3105 +27590 +26493 +15 +27591 +286 +27592 +14 +20 +349 +9 +27593 +1559 +984 +345 +27594 +27595 +249 +19618 +411 +1864 +13721 +27596 +270 +27597 +6950 +29 +25382 +89 +26808 +27598 +27599 +24303 +6505 +440 +27600 +24864 +26065 +19 +141 +27601 +14369 +27602 +10706 +27603 +15718 +32 +19618 +25140 +22461 +43 +27604 +15268 +590 +27605 +27606 +18874 +19792 +14079 +590 +21698 +1481 +15 +3768 +179 +3470 +736 +3601 +27607 +237 +27608 +27609 +8367 +25683 +736 +13807 +27610 +14 +1912 +27611 +9 +1300 +2841 +188 +6360 +27612 +8188 +43 +27613 +27614 +27615 +27616 +11593 +27617 +4387 +27618 +27619 +27620 +27621 +20897 +27622 +48 +43 +22963 +43 +26496 +27623 +27624 +228 +27625 +27626 +15718 +7053 +25659 +478 +3 +19 +19 +5049 +10 +19 +683 +1051 +21947 +27495 +27627 +22391 +27628 +10 +18982 +15824 +317 +27629 +27630 +27631 +27632 +1066 +22 +22492 +27633 +27634 +27635 +27636 +27637 +12987 +2694 +43 +9 +27287 +1157 +23530 +284 +6950 +11995 +22963 +27638 +354 +25710 +19618 +24896 +736 +27639 +11321 +27640 +616 +27641 +736 +590 +4521 +4169 +27642 +349 +24896 +27643 +936 +27599 +19618 +14363 +19655 +12778 +201 +14 +1465 +27644 +6595 +3978 +27645 +13721 +7799 +27646 +26724 +32 +646 +27647 +27648 +27649 +27650 +27651 +12987 +25683 +12987 +43 +3003 +628 +416 +9 +27652 +2721 +736 +19 +2939 +14001 +27653 +27654 +590 +14 +20280 +27655 +27656 +57 +14477 +12987 +27657 +1100 +27658 +27659 +694 +568 +15718 +27660 +7152 +213 +27661 +176 +27662 +3003 +23103 +770 +27663 +19618 +27664 +27665 +13703 +27666 +24864 +27667 +27668 +6335 +27669 +2561 +2537 +23834 +15298 +155 +27670 +17 +1332 +25871 +27671 +27672 +14 +43 +25683 +27673 +6285 +43 +736 +43 +24920 +27674 +27675 +32 +27676 +14477 +27677 +10415 +43 +27678 +12588 +27679 +14477 +14878 +9784 +590 +2 +490 +27680 +10961 +14369 +60 +6086 +57 +27681 +2164 +6557 +27682 +76 +43 +27683 +27684 +6171 +590 +27685 +27686 +6765 +8188 +24864 +27687 +21947 +27688 +24303 +27689 +14369 +27690 +14130 +13843 +27691 +27692 +1100 +1153 +3546 +137 +27693 +20 +27694 +358 +27695 +1577 +5080 +624 +15718 +6505 +27696 +188 +27697 +736 +24862 +915 +19618 +590 +21896 +10591 +3546 +27698 +665 +27699 +27700 +27701 +27702 +14 +12987 +6054 +745 +4550 +43 +18946 +817 +34 +27703 +286 +27704 +3546 +19 +27705 +27706 +27707 +15853 +14 +27708 +15718 +2 +89 +27709 +9 +8297 +14102 +9 +27710 +19 +27711 +16290 +27712 +27072 +27713 +736 +18577 +27714 +686 +5477 +27715 +5119 +27716 +25237 +26744 +27717 +345 +317 +5204 +27718 +2197 +6214 +27287 +17151 +1559 +27719 +25140 +25280 +2944 +1688 +15662 +43 +269 +15718 +27720 +26389 +27721 +27722 +5088 +5764 +740 +27723 +282 +24864 +20 +14477 +25237 +16437 +3 +613 +725 +24753 +27724 +27725 +10 +27726 +27727 +27728 +554 +27729 +21947 +1234 +27730 +27731 +27732 +3546 +27733 +4086 +27734 +27735 +27069 +665 +27736 +20 +5438 +43 +27737 +27738 +464 +179 +27739 +27740 +1976 +27741 +225 +20655 +10218 +12987 +23506 +2 +15308 +1012 +15928 +27742 +27743 +27744 +10642 +27745 +317 +4598 +437 +27746 +590 +3053 +27747 +720 +14 +17872 +27748 +27749 +27750 +1885 +14 +22 +43 +14363 +27751 +27752 +18982 +14 +14521 +8668 +25683 +21947 +20329 +3 +13557 +27753 +27754 +14477 +196 +27755 +32 +21776 +27756 +27757 +24303 +533 +11647 +27758 +6263 +25683 +27759 +26361 +648 +27760 +3994 +27761 +15647 +352 +14000 +15718 +18334 +17670 +23741 +27762 +27763 +590 +18742 +24303 +25200 +2197 +590 +12600 +19618 +27764 +9 +14 +27765 +231 +19 +27766 +370 +19 +3119 +8249 +18795 +9 +27767 +286 +6275 +1529 +27768 +27769 +27770 +27771 +4463 +27772 +27773 +27774 +1860 +27775 +2043 +2577 +138 +24327 +27776 +27777 +27778 +1160 +9 +9402 +24864 +27779 +597 +20572 +19405 +15718 +99 +27780 +27781 +14369 +43 +14 +27782 +1563 +9 +972 +19655 +27783 +27784 +590 +27785 +22797 +27786 +27787 +25237 +14 +720 +27788 +14000 +27789 +27790 +43 +17048 +15406 +1021 +14604 +15797 +2072 +2301 +27791 +5383 +27792 +3638 +22895 +15824 +27793 +27794 +272 +15 +8160 +14369 +27260 +12214 +21947 +6877 +590 +27795 +11479 +354 +27796 +27797 +27798 +554 +10 +14 +27799 +57 +15989 +27800 +14175 +14369 +14369 +705 +209 +17635 +14604 +15718 +27801 +27802 +209 +27803 +25140 +26496 +1517 +27804 +27805 +15 +9 +27806 +36 +22552 +598 +8351 +26066 +8392 +547 +19 +77 +27807 +27808 +249 +27809 +832 +286 +27810 +4144 +9979 +25140 +27811 +2058 +27812 +176 +27813 +27814 +27815 +27816 +27817 +14804 +19 +4684 +27818 +4028 +3317 +27819 +1523 +286 +27820 +27821 +2260 +27822 +25683 +27823 +464 +3192 +13361 +17135 +22 +16014 +27824 +27825 +27548 +19 +27826 +7137 +27827 +573 +9 +301 +17151 +9 +1169 +27828 +1870 +27829 +2764 +16024 +2694 +27830 +165 +27831 +27832 +21947 +590 +25683 +26984 +43 +14477 +25140 +27833 +815 +27834 +590 +301 +822 +14369 +14369 +2260 +17136 +3546 +27835 +14369 +27836 +590 +27837 +14369 +24896 +8027 +27838 +1349 +27839 +213 +27840 +1444 +27841 +11 +5665 +27842 +14 +276 +43 +27843 +27844 +13411 +27845 +861 +27846 +345 +1406 +817 +2790 +910 +24303 +27847 +6341 +27848 +27849 +21947 +345 +590 +16763 +213 +303 +27850 +9 +27851 +13721 +27852 +185 +1458 +24303 +27853 +27854 +27855 +27856 +248 +21947 +26496 +284 +1604 +345 +1674 +213 +17151 +24896 +213 +286 +213 +27857 +25871 +7876 +27858 +27859 +5837 +137 +27860 +194 +27861 +27862 +24864 +297 +548 +27863 +14369 +27864 +27865 +19792 +3553 +27866 +27867 +26724 +683 +14363 +27868 +26744 +27869 +27870 +12479 +936 +14 +14 +27871 +9 +11394 +27872 +4550 +284 +27873 +27874 +27875 +683 +19618 +14604 +27876 +27877 +27878 +43 +9 +2769 +57 +27234 +18548 +2 +27879 +16 +27880 +27881 +27882 +17151 +3279 +27883 +27884 +27885 +14604 +554 +13905 +16645 +27886 +1021 +43 +43 +7855 +213 +213 +27887 +14369 +14 +14 +57 +15718 +317 +249 +27888 +27889 +27890 +43 +27891 +24303 +3546 +15 +6285 +936 +27892 +5085 +665 +27893 +27894 +248 +23231 +21187 +25683 +27895 +27896 +337 +337 +27897 +21947 +22 +18522 +27898 +27899 +1765 +27900 +11841 +222 +27901 +17072 +14477 +23103 +12260 +27902 +16014 +21186 +213 +43 +27903 +19 +317 +5780 +1749 +27904 +20803 +3470 +590 +27905 +27906 +23842 +57 +213 +27907 +3994 +43 +27908 +18650 +337 +27909 +4388 +21689 +14473 +27910 +27911 +15356 +337 +248 +43 +1524 +284 +27912 +1551 +27913 +29 +24296 +720 +3546 +464 +14 +3081 +13307 +20161 +5872 +27914 +27915 +27916 +6518 +15989 +16437 +14 +349 +19618 +1116 +2 +1012 +27917 +24896 +27918 +22896 +764 +590 +43 +590 +3546 +659 +70 +442 +27919 +7610 +27920 +3067 +19618 +590 +9 +12814 +27921 +1382 +9692 +14102 +10017 +2476 +14241 +27922 +18695 +27923 +2832 +590 +272 +27924 +19 +2 +27925 +27926 +861 +20260 +736 +1352 +345 +19 +27927 +412 +14 +22 +43 +2550 +14 +27928 +27929 +4701 +27930 +9629 +19160 +13905 +26744 +17151 +13905 +7588 +27931 +222 +27932 +14 +16205 +27933 +22237 +11827 +9266 +27934 +19 +590 +27935 +25584 +5755 +845 +27936 +27937 +27938 +21776 +741 +5467 +22 +365 +12893 +27939 +27940 +590 +10642 +303 +27941 +27942 +27943 +63 +27944 +22901 +21947 +19484 +14369 +27945 +14363 +1655 +464 +165 +19 +4896 +27946 +27069 +25683 +27947 +16437 +17144 +11634 +27948 +14019 +21947 +24614 +25683 +573 +27719 +2406 +1912 +2567 +19 +27949 +27950 +27951 +27952 +27953 +337 +27954 +16413 +7855 +27955 +14 +4856 +27956 +15953 +1508 +27957 +248 +27958 +27959 +862 +24896 +29 +337 +27960 +652 +12621 +21947 +3546 +27961 +21186 +25237 +14369 +1082 +27962 +25159 +7137 +123 +26786 +27963 +1834 +19 +2260 +29 +1384 +27964 +3350 +21689 +27965 +14 +286 +248 +7600 +7117 +15027 +12987 +9 +799 +2865 +14477 +8297 +14 +14 +2877 +14000 +3978 +6850 +89 +24507 +27966 +613 +284 +27967 +27968 +19852 +27969 +57 +345 +370 +349 +17093 +25871 +27970 +15 +32 +21947 +27971 +27972 +16102 +2561 +27973 +15718 +232 +27974 +5188 +27975 +43 +27281 +1112 +27976 +590 +43 +27069 +27977 +5188 +14369 +43 +342 +590 +27978 +27979 +27980 +27981 +19091 +6441 +24862 +6708 +3711 +27982 +27983 +25868 +1382 +590 +16 +3553 +27984 +345 +14 +57 +2334 +21627 +548 +20300 +43 +24303 +27985 +27986 +27987 +519 +27988 +16156 +27989 +24896 +27990 +1249 +16048 +21947 +6628 +9037 +4055 +4550 +32 +5085 +2550 +27991 +27992 +27993 +5188 +345 +887 +27994 +27096 +2561 +2619 +1157 +10470 +16437 +27995 +9 +43 +27996 +27997 +337 +9 +27998 +9 +25584 +22 +1561 +4684 +446 +25140 +23103 +590 +27999 +4550 +342 +15718 +5085 +25683 +1100 +14 +28000 +28001 +1382 +26158 +28002 +9 +20442 +19428 +28003 +12308 +19 +28004 +28005 +19 +28006 +14 +14 +590 +2029 +3994 +19618 +14422 +1066 +213 +28007 +28008 +14369 +8593 +815 +9 +20 +2 +28009 +28010 +26361 +28011 +303 +25237 +20764 +10230 +28012 +21947 +10946 +8668 +372 +28013 +28014 +822 +43 +19618 +23578 +14 +26724 +4824 +15833 +28015 +11483 +14 +28016 +28017 +28018 +28019 +22308 +349 +720 +248 +24896 +22963 +15 +248 +28020 +28021 +28022 +17151 +915 +28023 +9 +1502 +18054 +14369 +568 +284 +28024 +15718 +28025 +14369 +1517 +284 +28026 +28027 +28028 +25237 +14369 +28029 +24951 +647 +28030 +28031 +14 +28032 +284 +337 +28033 +19655 +28034 +345 +3546 +89 +28035 +301 +28036 +20700 +213 +3767 +28037 +3143 +22346 +11925 +28038 +14369 +19618 +14 +7797 +3546 +25140 +790 +14660 +1913 +2537 +6722 +284 +28039 +28040 +28041 +2197 +28042 +28043 +17872 +28044 +14 +19 +115 +28045 +43 +26169 +337 +337 +28046 +28047 +12055 +6885 +17119 +339 +9 +28048 +9 +28049 +337 +720 +23103 +15718 +7137 +28050 +17151 +349 +32 +345 +17668 +354 +248 +28051 +23406 +18045 +67 +24303 +28052 +9 +14 +337 +28053 +554 +26361 +4791 +2694 +23051 +12827 +590 +28054 +1543 +1364 +248 +590 +590 +3457 +19618 +28055 +1927 +39 +6018 +18435 +4387 +6877 +28056 +155 +1956 +9 +28057 +10 +28058 +15718 +303 +17801 +25749 +28059 +25140 +21947 +13905 +323 +43 +28060 +736 +26361 +10727 +28061 +27798 +19091 +28062 +43 +9 +17498 +3546 +11102 +1224 +28063 +28064 +28065 +720 +32 +17761 +28066 +42 +28067 +14 +1920 +28068 +28069 +14 +6533 +28070 +28071 +9 +28072 +21947 +21749 +20 +43 +7071 +23253 +3546 +28073 +3050 +21947 +1249 +15718 +671 +1356 +28074 +28075 +28076 +573 +9 +323 +28077 +28078 +12462 +11321 +2876 +25237 +24019 +590 +3428 +303 +28079 +28080 +590 +21776 +1508 +1655 +28081 +28082 +1655 +201 +14 +43 +17151 +2356 +19965 +21947 +14477 +248 +20 +77 +28083 +19797 +209 +25140 +2707 +28084 +28085 +28086 +745 +213 +28087 +28088 +28089 +32 +590 +14603 +1615 +14369 +1817 +286 +15793 +887 +28090 +28091 +28092 +3546 +14 +28093 +28094 +28095 +3484 +43 +28096 +6341 +4808 +27146 +765 +28097 +28098 +790 +21947 +764 +28099 +1352 +286 +352 +554 +25683 +28100 +28101 +5314 +25683 +19 +28102 +2410 +19 +7208 +352 +10607 +9 +28103 +272 +15718 +9 +14369 +28104 +28105 +137 +28106 +28107 +17151 +14369 +26496 +28108 +28109 +22308 +57 +9 +9 +28110 +4116 +27069 +28111 +28112 +28113 +14477 +915 +28114 +540 +28115 +28116 +213 +28117 +25 +942 +16012 +24896 +28118 +28119 +28120 +5188 +28121 +28122 +8668 +201 +1870 +28123 +25237 +1384 +17687 +28124 +28125 +18064 +28126 +28127 +28128 +28129 +28130 +28131 +14 +19 +14406 +7706 +28132 +7991 +89 +19618 +28133 +6571 +28134 +21458 +28135 +2042 +28136 +28137 +345 +28138 +590 +28139 +272 +28140 +32 +2260 +566 +28141 +25140 +15167 +19 +3546 +43 +28142 +3546 +17151 +43 +28143 +28144 +8208 +142 +28145 +28146 +17151 +1234 +5662 +21947 +2619 +14650 +28147 +28148 +28149 +28150 +28151 +28152 +19 +586 +286 +25584 +379 +58 +28153 +28154 +12005 +3546 +25 +4055 +28155 +1764 +28156 +17267 +25625 +19 +28157 +28158 +10179 +28159 +28160 +66 +14 +32 +28161 +20923 +28162 +28163 +3 +8188 +2762 +10 +2310 +14 +43 +19618 +317 +3994 +28164 +28165 +25943 +7053 +2430 +2841 +5188 +27178 +43 +1612 +21947 +2153 +28166 +1889 +140 +26040 +1991 +2316 +3484 +28167 +27719 +28168 +3546 +9234 +19 +21947 +1743 +25140 +28169 +9 +14660 +28170 +14 +28171 +23674 +5119 +18707 +13347 +28172 +2254 +24896 +568 +28173 +7071 +24698 +9012 +28174 +1514 +4055 +28175 +28176 +2728 +14577 +25172 +28177 +43 +13578 +1442 +4411 +8668 +28178 +1610 +25237 +28179 +18683 +16254 +24896 +28180 +28181 +28182 +28183 +18804 +2537 +590 +1745 +2463 +590 +15 +24303 +18693 +28184 +11217 +554 +24063 +28185 +28186 +43 +1401 +250 +2733 +19 +694 +2197 +43 +4452 +28187 +43 +1021 +28188 +24864 +14369 +13576 +12748 +14 +21833 +590 +4180 +28189 +301 +28190 +3546 +14 +9 +25584 +28191 +315 +573 +20383 +28192 +8188 +373 +28193 +28194 +20038 +14 +28195 +25140 +32 +3546 +28196 +13748 +28197 +3546 +15718 +43 +13721 +28198 +201 +28199 +27514 +43 +28200 +28201 +12768 +28202 +28203 +25683 +43 +28204 +23447 +28205 +5579 +3548 +11335 +4441 +28206 +827 +28207 +14369 +32 +8205 +720 +27069 +8566 +1870 +28208 +28209 +3484 +28210 +19 +28211 +89 +3323 +28212 +1689 +21947 +1765 +9 +28213 +28214 +25196 +19618 +24144 +1203 +3553 +28215 +28216 +13131 +28217 +179 +5297 +24862 +286 +43 +25237 +28218 +28219 +28220 +25943 +1615 +28221 +13721 +57 +17927 +6096 +3828 +18695 +10 +28222 +9123 +248 +28223 +3484 +21947 +28224 +914 +28225 +4897 +17451 +3790 +1345 +22 +14 +28226 +19 +590 +5085 +2058 +19 +22963 +1716 +12936 +28227 +9 +14 +28228 +28229 +6001 +28230 +28231 +11593 +43 +8160 +14175 +4594 +28232 +28233 +80 +25140 +286 +28234 +14369 +137 +205 +43 +19883 +43 +7048 +1131 +28235 +28236 +28237 +28238 +10 +28239 +28240 +213 +28241 +28242 +28243 +43 +286 +28244 +28245 +872 +2694 +4900 +417 +28246 +3353 +15 +28247 +24303 +28248 +25581 +286 +19206 +28249 +28250 +24896 +8297 +411 +19 +28251 +28252 +28253 +28254 +14808 +28255 +9095 +16205 +21689 +21947 +3546 +11535 +23103 +28256 +3546 +20367 +842 +28257 +16437 +28258 +13721 +19974 +28259 +19618 +4028 +28260 +28261 +28262 +315 +213 +446 +32 +21947 +28263 +19618 +554 +57 +32 +6459 +28264 +29 +1817 +28265 +28266 +25615 +28267 +28268 +28269 +28270 +28271 +28272 +3457 +28273 +1889 +3239 +13721 +1912 +67 +1961 +14369 +24303 +28274 +1765 +28275 +13721 +28276 +14 +14947 +28277 +57 +1190 +28278 +28279 +28280 +2061 +9 +28281 +28282 +28283 +15718 +9 +161 +4634 +22963 +28284 +26496 +28285 +26872 +20 +5282 +28286 +28287 +11971 +14369 +3978 +28288 +13375 +213 +26361 +16413 +28289 +21947 +19 +12987 +10745 +10094 +741 +28290 +349 +26744 +28291 +764 +9440 +25237 +28292 +337 +13569 +28293 +1021 +24303 +24207 +286 +3546 +28294 +28295 +29 +25140 +28296 +337 +28297 +5326 +3553 +28298 +24951 +345 +14604 +28299 +1900 +590 +14477 +28300 +28301 +28302 +28303 +28304 +28305 +829 +43 +28306 +12376 +25237 +14369 +284 +9 +1090 +5085 +446 +2 +28307 +28308 +5780 +26484 +14369 +15 +379 +28309 +28310 +9739 +28311 +554 +28312 +24015 +28313 +194 +14369 +284 +43 +28314 +24303 +1169 +32 +14363 +28315 +590 +6364 +590 +1090 +3601 +337 +28316 +28317 +28318 +28319 +7014 +21947 +345 +28320 +28321 +25382 +213 +16826 +590 +14363 +19705 +27146 +14369 +7492 +43 +9 +2570 +533 +274 +28322 +32 +345 +21947 +590 +21689 +28323 +248 +15718 +19618 +28324 +10510 +57 +28325 +16 +8994 +32 +27656 +14 +28326 +2064 +15654 +57 +442 +34 +22308 +2550 +28327 +286 +28328 +20773 +28329 +24303 +3655 +28330 +28331 +28332 +2331 +4918 +5780 +19 +43 +28333 +21947 +26001 +28334 +1502 +2865 +738 +28335 +28336 +3959 +22512 +23103 +28337 +28338 +28339 +28340 +6156 +14369 +28341 +6006 +2762 +28342 +28343 +28344 +43 +28345 +248 +25140 +28346 +5634 +323 +1172 +28347 +22 +22420 +13721 +24896 +28348 +24303 +28349 +28350 +24303 +43 +25683 +19 +8392 +1562 +4806 +736 +155 +16698 +9 +28351 +32 +1011 +590 +13323 +23418 +28352 +1234 +184 +3172 +1291 +8256 +2029 +20 +28353 +20108 +32 +18670 +23770 +21689 +114 +28354 +153 +303 +339 +26361 +28355 +8501 +21947 +1956 +303 +140 +28356 +28357 +179 +28358 +28359 +28360 +14477 +21947 +249 +292 +112 +6156 +960 +5438 +2314 +25481 +18951 +23951 +21947 +28361 +43 +15718 +28362 +19 +28363 +24896 +25140 +28364 +28365 +12864 +28366 +12722 +28367 +20340 +28368 +8297 +13721 +28369 +28370 +22815 +613 +28371 +12120 +28372 +28373 +13343 +28374 +13150 +10961 +28375 +28376 +13479 +28377 +28378 +14369 +28379 +272 +14369 +22 +349 +19 +25237 +1578 +7855 +28380 +43 +2040 +2 +28381 +736 +26962 +16 +28382 +28383 +28384 +28385 +28386 +2 +399 +28387 +28388 +28389 +213 +28390 +28391 +8594 +250 +2744 +70 +28392 +936 +25584 +2356 +28393 +15718 +18045 +829 +21947 +28394 +26912 +337 +468 +5271 +28395 +22075 +28396 +20265 +345 +28397 +446 +28398 +13721 +28399 +28400 +2960 +2764 +2260 +15473 +3814 +28401 +28402 +22587 +4682 +28403 +14369 +28404 +28405 +28406 +21947 +28407 +28408 +27087 +43 +43 +28409 +28410 +13721 +26496 +28411 +28412 +98 +28413 +379 +1385 +28414 +358 +751 +1559 +590 +14 +28415 +5188 +15718 +21947 +16121 +28416 +28417 +19 +28418 +72 +3546 +6741 +28419 +25683 +2 +792 +8668 +17730 +25683 +28420 +28421 +138 +25683 +1425 +28422 +28423 +28424 +28425 +28426 +28427 +1907 +14 +28428 +3075 +541 +28429 +2694 +28430 +7154 +28431 +683 +28432 +14 +14604 +2019 +201 +28433 +248 +21947 +28237 +28434 +554 +4403 +345 +590 +590 +28435 +19618 +28436 +8297 +11483 +27069 +14658 +28437 +5780 +14 +28438 +720 +43 +28439 +590 +28440 +354 +42 +13150 +28441 +25140 +18928 +4411 +20 +28442 +23103 +14369 +28443 +648 +16 +188 +14 +28444 +22030 +28445 +28446 +249 +4141 +2688 +586 +6877 +14 +28447 +237 +28448 +18982 +22236 +3316 +14 +28449 +14 +28450 +19 +349 +24303 +9490 +5648 +1605 +25584 +16338 +28451 +14369 +28452 +155 +27170 +28453 +28454 +1559 +28455 +28456 +103 +27748 +14330 +28457 +14330 +28458 +28459 +28460 +1481 +17151 +15824 +43 +12987 +23226 +28461 +28462 +713 +14 +28463 +28464 +28465 +164 +827 +28466 +21947 +28467 +3546 +3546 +28468 +13706 +27726 +1502 +509 +707 +14369 +18364 +8297 +28469 +5085 +28470 +28471 +28472 +4278 +5820 +80 +32 +165 +14 +28473 +28474 +16707 +14 +29 +10145 +28475 +28476 +4550 +27043 +28477 +57 +43 +28478 +28479 +28480 +14 +286 +28481 +14330 +28482 +3546 +19852 +474 +28483 +10505 +28484 +19927 +28485 +28486 +28487 +554 +20 +590 +21947 +28488 +28489 +349 +26744 +28490 +6907 +43 +28491 +28492 +28493 +509 +849 +28494 +28495 +3601 +28496 +5188 +28497 +548 +28498 +590 +28499 +28500 +28501 +20276 +27069 +915 +1157 +14369 +28502 +791 +28503 +14 +1021 +28504 +1578 +12067 +43 +19618 +345 +379 +27069 +28505 +14 +28506 +28507 +24303 +141 +3546 +373 +28508 +4002 +5649 +28509 +28510 +27146 +28511 +25237 +9 +28512 +17635 +736 +3297 +16126 +28513 +14369 +14369 +197 +8668 +28514 +60 +28515 +14330 +707 +11702 +484 +2197 +26119 +286 +13721 +28516 +28517 +9118 +1082 +2117 +28518 +28519 +14001 +14001 +28520 +14604 +20679 +28521 +19618 +21947 +28522 +141 +28523 +28524 +209 +28525 +21947 +15461 +28526 +20125 +43 +5659 +28527 +13721 +5773 +28528 +14 +22 +8351 +25943 +28529 +28530 +225 +28531 +1021 +28532 +43 +29 +14 +14369 +1765 +28533 +28534 +7543 +28535 +22121 +19655 +14 +28536 +3546 +482 +28537 +28538 +28317 +3546 +26666 +32 +1320 +23322 +28539 +21689 +12404 +28540 +38 +28541 +28542 +27719 +19 +10849 +21947 +16206 +19618 +28543 +13848 +28441 +2577 +15623 +28544 +25237 +2009 +1364 +4411 +28545 +28546 +282 +15 +10583 +331 +28547 +28548 +1502 +28549 +28550 +14477 +43 +1524 +28551 +28552 +26705 +28553 +495 +28554 +28555 +32 +590 +98 +28556 +28557 +18503 +590 +28558 +26786 +19 +18061 +28559 +2 +28560 +19 +28561 +28562 +57 +28563 +28564 +28565 +2540 +28566 +43 +28567 +248 +25683 +28568 +892 +1066 +1048 +28569 +7053 +25683 +533 +209 +1013 +28570 +1710 +16466 +14 +12344 +201 +8188 +28571 +43 +28572 +9060 +19 +77 +9 +345 +1524 +28573 +14 +20514 +4028 +28574 +8392 +19 +590 +3030 +28575 +21947 +11754 +10 +28576 +11514 +28577 +1765 +17151 +9 +536 +21947 +24896 +137 +96 +28578 +4285 +9 +242 +14 +5188 +1082 +60 +19965 +14 +28579 +18951 +8392 +28580 +28581 +28582 +14330 +28583 +28584 +27153 +28585 +1011 +28586 +28587 +28588 +5088 +5363 +1765 +6625 +5039 +3375 +28589 +28590 +28591 +28592 +104 +28593 +3546 +16437 +25584 +1234 +28594 +590 +16437 +28595 +28596 +3959 +28597 +5426 +17151 +1018 +27954 +28598 +19948 +28599 +28600 +1710 +590 +6518 +28601 +14369 +23438 +43 +10245 +5967 +5853 +28602 +21947 +28603 +138 +28604 +28605 +3598 +28606 +2338 +28607 +1947 +28608 +24207 +43 +28609 +5653 +12376 +9 +26452 +3872 +28610 +28611 +286 +57 +936 +24864 +989 +14369 +5204 +9705 +2314 +13150 +28612 +25943 +915 +28613 +10 +20175 +10 +43 +19618 +28614 +19 +28615 +28616 +43 +832 +28617 +345 +4144 +9 +28618 +590 +28428 +14 +28619 +28620 +28621 +57 +24896 +28622 +28623 +28624 +15718 +28625 +28626 +249 +2314 +167 +43 +14369 +2707 +28627 +28628 +28629 +15718 +1992 +15718 +14477 +28630 +19 +12902 +20 +446 +28631 +28632 +28633 +28634 +28635 +15476 +38 +590 +28636 +21698 +28637 +14369 +28638 +28639 +28640 +12479 +18683 +1234 +21031 +9 +92 +2314 +28641 +165 +43 +3422 +24303 +590 +28642 +736 +28643 +14369 +590 +14369 +28644 +201 +28645 +9095 +699 +28646 +397 +8566 +28647 +15446 +14214 +28648 +6364 +21947 +9 +28649 +17151 +21947 +28650 +28651 +28652 +28653 +28317 +9 +28654 +21947 +707 +2739 +18640 +57 +2117 +5204 +5188 +19713 +791 +48 +345 +2260 +28655 +3317 +2733 +25683 +2 +21947 +514 +8367 +24303 +169 +4518 +12936 +28656 +19618 +28657 +9922 +3353 +17264 +28658 +16866 +3546 +19 +11754 +1612 +28659 +28660 +1905 +5188 +114 +28661 +28662 +345 +398 +28663 +24725 +28664 +24896 +11966 +274 +28665 +28666 +28667 +21947 +28668 +9617 +28669 +1912 +28670 +2136 +19 +228 +28671 +19 +28672 +399 +238 +259 +10 +28673 +28674 +17151 +345 +28675 +25343 +590 +24227 +24864 +21268 +2029 +3179 +28676 +170 +43 +11192 +24864 +6122 +16178 +25683 +19624 +415 +5431 +28677 +26158 +28678 +28679 +2944 +28680 +28681 +28682 +13721 +27178 +5780 +28683 +28684 +28685 +13179 +28686 +28687 +25237 +28688 +25584 +1090 +5297 +23103 +28689 +28690 +19 +16375 +28691 +20 +19655 +28692 +590 +14477 +1021 +533 +24303 +201 +28693 +28694 +2314 +3546 +3546 +1961 +28695 +21698 +2446 +28696 +4230 +11185 +647 +21689 +7240 +14477 +586 +764 +28697 +28698 +18695 +28699 +14947 +140 +677 +28700 +14363 +446 +5976 +28317 +28701 +15261 +14 +345 +25237 +2577 +16102 +28702 +1765 +25140 +26506 +3546 +28703 +4088 +28704 +28705 +2135 +3543 +28706 +7753 +23343 +15914 +28707 +349 +28708 +155 +28709 +14477 +28710 +590 +24303 +24864 +28711 +13119 +19 +24896 +16205 +1234 +1425 +1051 +14330 +28712 +590 +21745 +28713 +17098 +28714 +3553 +28715 +28517 +24725 +5188 +10003 +28339 +249 +28549 +25140 +671 +28716 +28717 +28718 +28719 +16915 +28720 +28721 +19918 +3528 +13721 +509 +15186 +3546 +5820 +28722 +28723 +28724 +5085 +28725 +28726 +19 +6766 +28727 +1529 +286 +28728 +2764 +67 +24896 +14 +28729 +3317 +402 +560 +25683 +2316 +14 +3994 +28730 +14868 +1112 +349 +28731 +43 +28732 +28733 +43 +28734 +24725 +28735 +10963 +28736 +12987 +25237 +25921 +28737 +28738 +533 +28739 +19287 +1013 +9 +18982 +138 +15 +28740 +28741 +8465 +28742 +303 +28743 +16707 +5071 +647 +1927 +19 +25237 +4364 +14369 +21889 +15 +831 +43 +14369 +155 +28317 +21939 +10640 +13570 +16 +28744 +32 +28745 +20 +28746 +11552 +28747 +5438 +28748 +14 +3421 +28749 +28750 +19491 +28751 +26361 +28752 +1559 +10875 +5431 +11754 +17670 +28753 +28754 +10895 +21947 +19124 +25584 +9 +28755 +14 +590 +24725 +2 +12285 +28756 +1154 +27069 +349 +573 +43 +28757 +28758 +28759 +597 +28760 +357 +5691 +28761 +590 +20 +2733 +28762 +491 +77 +915 +491 +16826 +28763 +28764 +28765 +17466 +26496 +9 +43 +21947 +28766 +28767 +16883 +1443 +3601 +14369 +13150 +28768 +25 +552 +28769 +21947 +26496 +15718 +44 +14363 +28770 +1637 +28771 +25140 +28772 +28773 +24896 +5080 +28774 +590 +14369 +2330 +28549 +20 +19 +16067 +1425 +25683 +43 +28775 +28776 +28777 +533 +28778 +2668 +1047 +249 +2657 +28779 +10638 +28780 +14369 +9784 +1991 +80 +28781 +28782 +5803 +14816 +14846 +22986 +28783 +26744 +28784 +28785 +16437 +24303 +23603 +28786 +20694 +14965 +28787 +28788 +19 +22963 +28789 +18094 +28790 +28791 +1991 +19 +28792 +9497 +7379 +495 +24896 +28793 +590 +28794 +155 +8566 +24896 +28795 +19618 +317 +2762 +13721 +25140 +822 +14061 +2550 +28796 +3365 +12936 +14 +28797 +14604 +23103 +28798 +9 +28799 +354 +397 +28800 +9 +13307 +28801 +345 +28802 +15718 +19618 +590 +16437 +694 +8746 +872 +28803 +5547 +397 +28804 +4056 +4634 +1425 +7107 +28805 +21689 +9 +20952 +28806 +27069 +568 +14369 +845 +24864 +9 +28807 +3546 +28808 +683 +590 +7855 +104 +4364 +28809 +19618 +3546 +28810 +11907 +4001 +28811 +2243 +24725 +28812 +1314 +28813 +28814 +24864 +25683 +28815 +338 +28816 +26496 +28817 +25683 +3601 +28818 +28819 +8668 +28820 +28821 +14000 +28822 +28823 +28824 +14 +28825 +713 +4088 +24725 +15 +378 +22461 +13086 +14 +14 +14330 +3213 +3764 +2609 +155 +43 +2567 +28826 +738 +28078 +28827 +28828 +28829 +25237 +25140 +590 +57 +28830 +14477 +16437 +1481 +1066 +28317 +22236 +28831 +28832 +17385 +13111 +13848 +14369 +9688 +28833 +25140 +28834 +14 +28835 +19797 +112 +14 +1082 +12402 +378 +28549 +28317 +5481 +23806 +13150 +28836 +3476 +7154 +28837 +9410 +28838 +1605 +14868 +201 +7741 +26724 +379 +28839 +8210 +28840 +15183 +14369 +3408 +14369 +14369 +28841 +28842 +28843 +27669 +13566 +19 +28844 +1300 +28845 +28317 +16102 +28846 +28847 +10232 +2865 +28848 +24896 +1122 +14 +28849 +349 +57 +28850 +4 +28851 +25871 +14369 +28852 +21947 +28853 +14369 +15647 +23578 +16240 +3546 +24725 +28854 +20339 +19618 +28855 +720 +22850 +24862 +28856 +28857 +28858 +14 +4634 +28859 +1203 +815 +14 +19 +28860 +19618 +904 +28861 +2 +28862 +3067 +28863 +8418 +15683 +28864 +1465 +28865 +12746 +28866 +14369 +28867 +14345 +19 +19618 +28868 +245 +2065 +178 +3353 +13721 +28869 +28870 +28871 +1870 +14369 +28872 +1444 +28873 +43 +28874 +28875 +272 +24864 +14343 +990 +28876 +28877 +28878 +28879 +3598 +28880 +7176 +2 +194 +647 +827 +28881 +11308 +17326 +196 +5175 +28882 +3601 +15718 +9287 +28883 +11762 +22420 +32 +28884 +24862 +1300 +23139 +1228 +24864 +28885 +345 +590 +28886 +27726 +26069 +2286 +28887 +28888 +484 +4032 +1232 +28889 +28890 +89 +28317 +9343 +20952 +1100 +14 +24864 +16437 +28891 +28892 +28588 +57 +18695 +683 +28893 +28894 +24896 +245 +16826 +590 +28895 +28896 +9 +28897 +2744 +16883 +590 +25871 +17 +28898 +28899 +28900 +28901 +1112 +28902 +590 +16437 +22308 +9 +15442 +27669 +11733 +19618 +6156 +2476 +249 +26361 +19655 +28903 +590 +28904 +28905 +28906 +2 +18651 +14330 +28907 +25144 +27669 +28908 +13361 +28909 +9 +286 +28910 +28911 +15718 +1021 +1870 +17151 +15663 +28912 +14 +28913 +9 +28317 +28914 +20390 +278 +28915 +21947 +23853 +28916 +2550 +28917 +28918 +28919 +28920 +590 +21947 +28921 +28922 +4820 +24303 +349 +971 +28923 +28924 +28925 +28926 +89 +28927 +15718 +5188 +43 +28928 +28929 +9 +28930 +19304 +28931 +345 +24928 +28317 +28932 +28933 +1612 +28934 +19655 +4050 +4463 +28935 +28936 +26357 +46 +26724 +43 +28937 +15511 +2734 +43 +28938 +28939 +1559 +259 +9 +28940 +197 +14 +536 +25904 +14 +28941 +197 +28942 +28943 +19900 +28944 +32 +28945 +355 +43 +377 +19618 +14 +2 +32 +28946 +14369 +21947 +19091 +5780 +28947 +43 +28948 +9 +14 +28949 +28950 +1090 +28951 +1112 +28952 +28953 +28954 +28955 +827 +27167 +17920 +25237 +28956 +14 +1648 +28957 +5579 +28958 +28959 +286 +2577 +28960 +19618 +14330 +18443 +20952 +9738 +3601 +28961 +5144 +28962 +28963 +19618 +27172 +11803 +3546 +28964 +28965 +28966 +28967 +24864 +14363 +1082 +5085 +27279 +28968 +4463 +21689 +2415 +43 +15718 +28549 +22986 +345 +28969 +28951 +12344 +936 +28970 +28971 +345 +28972 +13179 +28973 +19 +1514 +3252 +28974 +1542 +28975 +4168 +9136 +21031 +1310 +28976 +24864 +28977 +24751 +28978 +22963 +14871 +9367 +19 +23103 +26431 +9039 +28979 +5099 +14369 +19618 +286 +28460 +14909 +11754 +2042 +18334 +28980 +24725 +28317 +15045 +7137 +28981 +14301 +2976 +2999 +28982 +15 +22099 +28317 +5629 +18951 +14330 +28451 +4441 +379 +28983 +1961 +28984 +19 +4963 +720 +21947 +28985 +25584 +558 +590 +590 +3546 +1425 +28986 +15718 +14186 +28987 +284 +28988 +28989 +19618 +28990 +18473 +1300 +24864 +28991 +18376 +28992 +28993 +19502 +7328 +28441 +25449 +284 +10 +213 +4264 +5757 +14369 +17136 +25140 +28994 +8427 +18951 +2029 +28995 +13721 +19797 +8653 +7440 +28996 +15718 +28997 +590 +25237 +28998 +27719 +8549 +213 +345 +12299 +28999 +14604 +29000 +29001 +11899 +286 +29002 +21689 +29003 +2415 +29004 +20 +720 +29005 +29006 +25749 +2762 +29007 +7537 +4651 +29008 +24640 +66 +337 +29009 +29010 +24725 +29011 +303 +27798 +15718 +14330 +29012 +29013 +29014 +10748 +29015 +43 +209 +29016 +29017 +209 +1154 +19618 +6095 +2316 +6407 +29018 +14363 +29019 +24864 +29020 +15 +213 +29021 +24303 +3546 +14369 +29022 +809 +213 +14604 +9 +8297 +3095 +248 +29023 +1442 +284 +29024 +29025 +23559 +1100 +29026 +2650 +1966 +19 +27798 +817 +12560 +20700 +29027 +7053 +29028 +20 +17151 +23226 +590 +7260 +43 +29029 +2197 +29030 +29031 +29032 +29033 +411 +337 +1517 +349 +43 +15810 +29034 +11966 +15539 +29035 +14330 +29036 +4518 +345 +18479 +43 +11429 +29037 +24725 +14 +303 +590 +648 +2793 +11966 +576 +24864 +2577 +14 +303 +1470 +29038 +43 +25683 +21947 +29039 +29040 +25661 +21371 +6305 +29041 +43 +16437 +15718 +29042 +24896 +29043 +29044 +43 +284 +14 +137 +19655 +1012 +17033 +4907 +29045 +66 +13721 +2415 +29046 +21947 +15486 +10117 +533 +22 +303 +29047 +590 +29048 +29049 +398 +29050 +25683 +24207 +6087 +345 +213 +29051 +861 +6364 +19 +18798 +495 +29052 +15718 +29053 +3546 +24751 +29054 +18346 +590 +67 +29055 +29056 +3553 +29057 +152 +14369 +29058 +301 +2117 +22 +29059 +590 +29060 +25683 +28299 +29061 +29062 +24896 +3353 +10720 +248 +1817 +2459 +2 +9410 +28295 +28441 +27669 +9 +24144 +248 +66 +590 +29063 +20265 +29064 +284 +17443 +29065 +15718 +29066 +1955 +2694 +13976 +29067 +14369 +590 +861 +6335 +17454 +4677 +29068 +29069 +2550 +29070 +8280 +590 +43 +286 +29071 +24303 +15718 +179 +590 +29072 +3546 +5188 +354 +3546 +29073 +14369 +29074 +29075 +15718 +29076 +137 +17670 +5641 +7053 +29077 +29078 +13721 +29079 +29080 +2902 +590 +1961 +3119 +29081 +16437 +29082 +15718 +29083 +1291 +28441 +357 +21947 +18493 +4422 +5820 +4414 +29084 +19852 +1716 +213 +9617 +29085 +25942 +11754 +2681 +16148 +29086 +29087 +43 +989 +242 +213 +29088 +21689 +2672 +2764 +5582 +29089 +1765 +29090 +22 +3553 +29091 +248 +29092 +22986 +23817 +446 +2971 +43 +28549 +43 +3546 +5561 +26484 +20681 +29093 +11312 +28991 +29094 +7053 +43 +345 +1987 +29095 +13721 +29096 +29097 +7137 +43 +29098 +10 +1896 +3417 +29099 +29100 +29101 +248 +29102 +345 +22292 +10049 +27719 +29103 +29104 +29105 +29106 +29107 +43 +29108 +15718 +29109 +29110 +29111 +1790 +19 +440 +1169 +3330 +17230 +3908 +14369 +29112 +29113 +809 +29114 +19852 +22142 +29115 +29116 +43 +20 +538 +17151 +590 +14 +29117 +736 +5904 +399 +29118 +3555 +21947 +19 +9 +1508 +590 +8686 +123 +16334 +29119 +671 +14 +9 +16437 +29120 +597 +29121 +5649 +21947 +14477 +29122 +29123 +25683 +6950 +5007 +18120 +29124 +29125 +29126 +29127 +209 +32 +14477 +14660 +29128 +98 +16116 +29129 +5780 +270 +24303 +249 +2314 +19 +597 +24725 +21947 +29130 +736 +29131 +29132 +29133 +27798 +14 +1013 +29134 +7912 +29135 +24 +10470 +29136 +155 +5780 +19618 +2032 +248 +29137 +1605 +19 +590 +24896 +6364 +24458 +22829 +29138 +6197 +29139 +822 +590 +19618 +663 +23770 +590 +29140 +1612 +29141 +21947 +29142 +1139 +43 +345 +14 +43 +14369 +583 +29143 +736 +28549 +15835 +19197 +29144 +21563 +24774 +29145 +18695 +5188 +29146 +29147 +15483 +3719 +29148 +29149 +13397 +1920 +29150 +25395 +29151 +29152 +29153 +27096 +29154 +10 +25683 +15 +29155 +29156 +29157 +5188 +11498 +3999 +29158 +284 +14363 +25943 +21947 +22823 +29159 +14369 +19797 +29160 +1626 +20700 +274 +29161 +29162 +1249 +29163 +5659 +27514 +10222 +21947 +736 +29164 +19618 +29165 +590 +8747 +43 +209 +4547 +29166 +29167 +29168 +29169 +29170 +201 +248 +852 +16079 +89 +29171 +27669 +29172 +590 +24303 +29173 +4518 +29174 +12307 +1013 +24811 +27836 +29175 +57 +9688 +27669 +16437 +29176 +720 +590 +590 +29177 +29178 +29179 +27719 +29180 +29181 +3187 +9 +178 +29182 +29183 +8744 +7053 +29184 +213 +24303 +865 +29185 +1234 +28877 +845 +3546 +509 +3745 +29186 +21947 +24303 +29187 +43 +14 +13721 +29188 +23226 +5780 +29189 +21947 +15398 +29190 +29191 +1382 +29192 +6068 +12987 +5773 +1605 +29193 +29194 +29195 +28317 +29196 +16798 +284 +3745 +15718 +337 +19868 +28317 +29197 +29198 +3546 +25140 +29199 +4055 +28317 +345 +19404 +7208 +19 +21730 +1763 +770 +29200 +1082 +29201 +21947 +1688 +29202 +14477 +5204 +730 +29203 +2260 +21003 +25293 +24045 +19404 +286 +583 +20 +536 +573 +29204 +29205 +19404 +29206 +15718 +14369 +28199 +13905 +694 +24207 +29207 +541 +29208 +3003 +284 +2 +29209 +29210 +29211 +29212 +6505 +29213 +590 +24303 +213 +57 +15 +4364 +14 +17 +29214 +29215 +19330 +14 +12497 +19951 +3553 +3601 +209 +43 +19 +18120 +29216 +29217 +284 +2577 +23103 +1169 +21394 +519 +18916 +2560 +5083 +2537 +337 +250 +29218 +29219 +29220 +29221 +1562 +7167 +29222 +29223 +8460 +23103 +29224 +6011 +5650 +29225 +21947 +24207 +29226 +989 +17151 +15517 +15718 +29227 +18995 +958 +39 +104 +29228 +13721 +2314 +137 +14957 +29229 +4055 +29230 +720 +29231 +13721 +248 +21947 +1247 +29232 +29233 +10364 +19 +16826 +15718 +349 +29234 +29235 +647 +11321 +8668 +28951 +29236 +8156 +590 +303 +225 +15718 +28951 +303 +26724 +272 +18684 +28317 +358 +29237 +29238 +15718 +29239 +24725 +14369 +2324 +21310 +2802 +29240 +213 +5188 +1011 +19655 +29241 +29242 +89 +29243 +2476 +14 +26361 +590 +286 +14 +1090 +8864 +29244 +1775 +2006 +19 +19618 +29245 +29246 +15718 +2287 +29247 +29248 +4269 +29249 +3317 +6263 +14369 +29250 +27153 +14477 +29251 +29252 +29253 +16967 +2000 +43 +5075 +15292 +213 +29254 +213 +29255 +14 +29256 +1765 +9 +18798 +3470 +17136 +29257 +19618 +14369 +317 +29258 +1604 +284 +19122 +6203 +14 +249 +29259 +345 +13279 +29260 +5629 +29261 +29262 +2314 +25237 +272 +4547 +14477 +29263 +554 +21947 +338 +590 +337 +29264 +29265 +29266 +538 +12402 +25683 +29267 +736 +1021 +43 +29268 +23990 +3007 +590 +29269 +861 +24896 +28549 +7537 +16154 +7379 +13848 +29270 +345 +14 +248 +27669 +29271 +12202 +26496 +29272 +14330 +29200 +29273 +21399 +29274 +29275 +29276 +3839 +4907 +8392 +8297 +14810 +29277 +29278 +29279 +29280 +14 +694 +29281 +24207 +28549 +4 +20 +3546 +29282 +142 +27669 +29283 +29284 +21947 +16180 +114 +2 +29285 +19 +554 +791 +936 +24864 +29286 +14369 +29287 +17151 +11762 +29288 +4196 +29289 +14369 +590 +12987 +590 +29290 +29291 +29292 +20199 +8392 +32 +337 +35 +14330 +13721 +1765 +18064 +14 +29293 +29294 +349 +29295 +29296 +15718 +14 +29297 +19 +736 +29298 +29299 +18951 +1779 +29300 +29301 +29302 +21947 +284 +29303 +730 +3353 +21947 +29304 +19 +28317 +29305 +15586 +25382 +12886 +29306 +3546 +26508 +4821 +29307 +29308 +29309 +15360 +29310 +15 +1529 +29311 +29312 +29313 +29314 +1606 +27669 +29315 +1720 +13721 +7381 +29316 +14 +7815 +29317 +3095 +25683 +349 +29318 +29319 +21947 +29320 +6766 +29321 +29322 +29323 +7996 +1245 +29324 +265 +29325 +29326 +27669 +29327 +29328 +590 +583 +190 +648 +720 +43 +43 +27798 +14604 +1749 +13265 +57 +5080 +59 +32 +26361 +28317 +29329 +19 +14 +43 +43 +1444 +671 +19 +29330 +936 +20 +29331 +3 +24896 +29332 +43 +25683 +15 +18914 +29333 +790 +2694 +18045 +29334 +590 +590 +29335 +1961 +29336 +29337 +14330 +29338 +1091 +970 +9 +57 +2832 +29339 +19 +29340 +590 +29341 +29342 +32 +14001 +9 +26496 +815 +12987 +22403 +29343 +2677 +29344 +25584 +19618 +19 +720 +14363 +345 +27669 +14330 +1090 +286 +29345 +9 +14604 +3353 +8668 +29346 +29347 +29348 +3994 +19 +3546 +10108 +165 +21947 +14604 +8566 +29349 +6087 +29350 +5085 +29351 +21947 +23363 +21947 +29352 +19965 +29353 +29354 +29355 +2540 +29356 +24303 +3540 +5929 +29204 +9 +15 +32 +377 +16375 +10 +18568 +16437 +26027 +14604 +15 +29357 +29358 +19618 +29359 +14330 +29360 +19 +817 +29361 +29362 +29363 +20442 +2512 +9102 +5188 +10777 +1434 +29364 +15718 +12005 +20984 +29365 +1051 +495 +29366 +29367 +590 +29368 +209 +29369 +29370 +14001 +3546 +10004 +15616 +2540 +14947 +19797 +1812 +25154 +1038 +2550 +21765 +29371 +21947 +9024 +5188 +29372 +29373 +29374 +43 +29375 +872 +29376 +21261 +564 +29377 +1356 +29378 +25237 +3428 +4230 +27069 +1870 +6950 +29379 +29380 +27024 +12989 +29381 +3546 +29382 +14369 +23313 +357 +225 +19404 +29383 +43 +16695 +29384 +11945 +29385 +20215 +22337 +29386 +29387 +1153 +736 +27415 +9364 +446 +15718 +29388 +28951 +24864 +14477 +4684 +24864 +29389 +279 +457 +29390 +25260 +11413 +15718 +23212 +29391 +29392 +1316 +345 +29393 +323 +22065 +448 +29394 +29395 +29396 +446 +89 +29397 +648 +19 +17048 +12404 +16258 +5623 +15824 +1634 +736 +25683 +29398 +99 +13765 +29399 +29400 +29401 +29402 +43 +29403 +3480 +29404 +16826 +2253 +18306 +29405 +21947 +29406 +24303 +1224 +1021 +29407 +28472 +4293 +29007 +9 +29408 +2206 +14947 +590 +495 +29409 +448 +29410 +20785 +9 +29411 +29412 +29413 +248 +2694 +15718 +58 +29414 +27669 +32 +19122 +24303 +9 +1765 +29415 +11 +10028 +29416 +345 +20 +665 +25140 +27669 +3655 +29417 +25140 +19237 +29418 +32 +13576 +16557 +13721 +29419 +24864 +29420 +7053 +2211 +5119 +12987 +29421 +28317 +28056 +12254 +28317 +43 +25172 +29422 +29423 +29424 +14 +29425 +15194 +8787 +29426 +13688 +29427 +28317 +22308 +397 +317 +19655 +29428 +29429 +345 +29241 +14369 +13140 +15 +28961 +514 +15718 +29430 +484 +29431 +7053 +29432 +21947 +29433 +29434 +9343 +14369 +29435 +99 +24725 +9560 +29436 +2804 +19 +14 +29437 +345 +138 +10 +2 +1051 +9 +7053 +29438 +29439 +29440 +554 +6363 +338 +16840 +18695 +27604 +29441 +25 +14369 +25829 +29442 +272 +286 +1222 +29443 +14 +365 +15479 +28606 +29444 +272 +19 +42 +29445 +2577 +2316 +24896 +29446 +29447 +495 +29448 +29200 +1198 +142 +14477 +29449 +28317 +14603 +29382 +29450 +28463 +19798 +349 +464 +17670 +29439 +29451 +17151 +29452 +25140 +25 +1425 +29453 +29454 +446 +23103 +19852 +190 +38 +29455 +43 +29456 +115 +29457 +29458 +29459 +29460 +29461 +6617 +11176 +29462 +29463 +671 +112 +736 +32 +22463 +29464 +19597 +416 +1100 +29465 +19 +20 +554 +2349 +349 +4803 +379 +29466 +13149 +270 +18310 +155 +29467 +29468 +3 +29469 +25237 +19794 +29470 +27669 +25237 +29471 +24896 +29472 +29381 +8249 +3546 +736 +29381 +5780 +29473 +29474 +29475 +2347 +25943 +29476 +29477 +29478 +29479 +18951 +554 +14 +29480 +29481 +29482 +29483 +17920 +9 +590 +7799 +53 +29484 +29485 +28951 +29486 +3349 +14947 +18869 +29487 +1356 +6011 +29488 +971 +29489 +29490 +29491 +25140 +1090 +15483 +15718 +9 +57 +29492 +29493 +590 +2733 +29494 +1244 +29495 +29496 +5780 +3546 +29497 +19 +8566 +15718 +590 +14477 +1798 +29498 +5588 +43 +25683 +29499 +29500 +13279 +379 +28317 +412 +29501 +3 +188 +29502 +349 +3994 +19 +29503 +1743 +6612 +446 +29504 +29505 +29506 +29507 +20992 +15718 +29508 +29509 +28317 +29510 +29511 +14369 +15 +7835 +345 +29512 +9 +29513 +29514 +21947 +29515 +5817 +590 +29516 +12696 +2577 +4028 +1799 +931 +89 +29517 +29204 +23208 +345 +29518 +29519 +29520 +495 +12893 +5773 +14 +15718 +19618 +15718 +29521 +28441 +22 +9 +29522 +29523 +1021 +590 +8668 +9 +43 +29524 +29525 +29526 +1273 +29527 +29528 +6068 +29529 +29530 +9 +29531 +3546 +21698 +29532 +21947 +29533 +9 +29534 +1852 +34 +12120 +28317 +43 +29535 +12158 +29536 +19404 +21947 +26127 +29537 +9 +29538 +29539 +29540 +32 +2649 +29541 +29542 +24896 +29543 +29544 +1300 +6251 +155 +29545 +14 +18064 +29275 +29546 +1812 +29547 +29548 +21689 +28951 +29549 +1018 +21947 +29550 +18199 +21689 +317 +536 +9 +29551 +29552 +43 +25943 +29553 +19 +2694 +43 +29554 +29555 +29556 +22 +29557 +104 +23226 +533 +24207 +19618 +20 +7385 +315 +29558 +2009 +29559 +12987 +27669 +25237 +21947 +29560 +484 +29561 +18503 +1907 +29562 +1559 +29563 +24161 +590 +1208 +29564 +249 +29565 +29566 +25 +3546 +27619 +15718 +29567 +8208 +6275 +29568 +29569 +29570 +590 +29571 +29572 +29573 +12988 +24896 +29574 +29575 +29576 +22963 +29577 +25683 +17813 +24896 +29578 +13721 +1401 +27420 +29579 +10 +29580 +9 +25624 +29581 +29582 +286 +25140 +29583 +12647 +29584 +29585 +10511 +16571 +29586 +29587 +155 +29588 +2260 +29589 +29590 +29591 +29592 +29593 +29594 +29595 +29381 +29596 +28549 +29597 +29598 +6505 +29599 +6468 +25683 +349 +29600 +8814 +19618 +28036 +4496 +29601 +1580 +14947 +29602 +29603 +43 +345 +27669 +29604 +29605 +707 +27087 +29606 +29607 +6766 +29608 +29609 +16254 +2694 +80 +29610 +22963 +15 +1517 +1384 +22919 +26501 +437 +29611 +9 +1768 +29612 +29613 +3575 +104 +15453 +2251 +112 +13566 +29614 +29381 +25659 +29615 +26040 +4055 +24725 +29616 +24303 +60 +15718 +21889 +115 +446 +7053 +1295 +5842 +43 +29617 +29618 +29619 +29620 +791 +29621 +29622 +2833 +24232 +1100 +2764 +6504 +9 +18736 +7253 +2744 +29623 +3743 +14415 +29624 +20694 +29625 +29626 +10094 +3553 +29627 +323 +20838 +21947 +358 +29628 +5923 +29629 +2029 +2117 +29630 +29631 +29632 +1524 +22963 +272 +29633 +6480 +29634 +1045 +29635 +29636 +29637 +11321 +23764 +89 +5188 +29638 +5188 +29639 +29640 +1212 +5188 +713 +29641 +29642 +43 +29643 +5780 +21373 +29644 +29645 +24303 +2988 +29646 +720 +20238 +29647 +12120 +29648 +1531 +14330 +29649 +29650 +2694 +21947 +29381 +29651 +29652 +29653 +138 +29654 +29655 +19 +29656 +104 +29657 +29658 +18695 +566 +19 +29659 +514 +1742 +29660 +29661 +14 +27117 +43 +24219 +936 +15853 +29662 +29663 +29664 +29204 +27739 +1870 +29665 +21947 +29666 +3790 +13961 +104 +15718 +29667 +7053 +27669 +323 +13721 +16437 +32 +19618 +20514 +21947 +6950 +115 +1011 +14560 +16979 +491 +5629 +29668 +29669 +564 +15718 +22 +29670 +13570 +4422 +3976 +29671 +24896 +29672 +29673 +43 +11787 +29674 +23103 +15540 +29675 +29200 +29676 +9 +29677 +1013 +29678 +29679 +29680 +29681 +29381 +29682 +9 +915 +16437 +17151 +29683 +861 +24178 +29684 +29685 +24896 +12893 +29686 +26031 +19091 +3551 +29687 +29688 +16826 +1961 +7053 +2042 +21689 +15718 +9749 +24896 +29689 +1870 +29690 +677 +10406 +24864 +29691 +29692 +14 +29693 +1680 +349 +29694 +24303 +25683 +29695 +2121 +27231 +12067 +12983 +29696 +29697 +43 +19091 +21947 +29381 +14369 +15718 +29698 +29381 +14947 +22 +29699 +29700 +29701 +29702 +5467 +2680 +439 +28317 +29483 +6364 +6950 +29703 +25237 +5806 +29704 +2686 +13943 +21031 +29705 +25625 +20518 +29706 +29707 +590 +1154 +29708 +29709 +29710 +29711 +43 +1168 +1090 +590 +28317 +8668 +11176 +20859 +245 +8218 +4934 +3345 +19928 +22461 +29712 +29713 +18668 +10910 +29714 +29715 +20 +197 +27669 +3119 +29716 +7835 +14 +29717 +2734 +14369 +9 +24864 +791 +22 +14481 +26710 +590 +29718 +29719 +27096 +1154 +13807 +29720 +43 +2117 +9 +29721 +590 +29722 +3055 +1425 +1514 +25659 +13823 +11436 +3626 +14477 +29723 +29724 +14369 +29725 +4357 +590 +2733 +259 +4461 +29726 +15914 +14 +28549 +29727 +1018 +39 +22 +14330 +15 +14369 +43 +25318 +5188 +29728 +29729 +29730 +2356 +3598 +4380 +650 +3601 +4502 +14477 +23828 +22236 +27669 +345 +29731 +4144 +5188 +21947 +29732 +57 +112 +18695 +29733 +43 +29734 +590 +29735 +21947 +5629 +29736 +14477 +5204 +24896 +109 +29737 +597 +15442 +3239 +19618 +29738 +29739 +24725 +278 +29740 +29741 +29742 +29743 +2117 +29744 +29745 +29746 +12582 +29747 +29748 +29749 +29750 +27669 +19404 +32 +14369 +17281 +26361 +29381 +12987 +9 +286 +29751 +17903 +14369 +29381 +13904 +3077 +16826 +201 +29752 +590 +10028 +29010 +29753 +29754 +29755 +590 +1637 +3994 +3719 +29381 +21563 +248 +4153 +201 +10117 +536 +303 +15 +936 +483 +248 +25683 +590 +15718 +29381 +185 +29756 +43 +25991 +5188 +24195 +29757 +272 +29758 +26496 +16121 +3655 +4677 +29759 +29760 +3546 +26286 +27096 +29761 +29762 +28317 +317 +18919 +29763 +10 +1011 +22986 +21947 +865 +209 +590 +29764 +28441 +29765 +436 +3376 +284 +13279 +43 +29766 +29767 +29768 +29769 +11471 +19 +5780 +373 +29770 +590 +29771 +791 +21947 +29772 +3546 +15718 +29773 +14477 +303 +14 +248 +29774 +14477 +436 +29775 +14604 +1425 +29776 +29777 +19618 +303 +826 +29778 +3 +29779 +20595 +4760 +279 +11995 +19928 +29780 +140 +5904 +29781 +29782 +29783 +14369 +2356 +15718 +1051 +554 +22986 +29784 +29785 +337 +13721 +590 +2302 +9 +14 +736 +29786 +43 +337 +12351 +43 +38 +28312 +1808 +29787 +24896 +21947 +29788 +1300 +2476 +29789 +14369 +26178 +1224 +15 +29790 +4452 +25943 +14 +29791 +20 +590 +29483 +15 +29792 +9 +9 +29793 +29381 +29794 +29795 +29796 +24144 +29797 +1090 +15718 +286 +345 +3559 +27669 +2588 +13721 +19318 +19618 +5085 +8683 +1442 +29798 +28317 +707 +3999 +19618 +1810 +590 +28441 +3904 +29381 +9617 +337 +20443 +29799 +3546 +28317 +29800 +860 +20952 +25237 +29801 +29802 +2787 +209 +19618 +29803 +286 +13566 +345 +1942 +29804 +29805 +21031 +29806 +1442 +248 +29807 +14 +248 +21947 +14 +7795 +2 +3546 +5438 +29808 +29381 +21698 +16180 +21869 +815 +29809 +29810 +1716 +109 +24864 +249 +21947 +29811 +303 +6071 +1168 +2769 +13307 +43 +3746 +14086 +14 +23323 +29812 +17871 +590 +29813 +29814 +3239 +29815 +590 +14161 +1047 +2026 +43 +21947 +373 +57 +196 +29816 +284 +590 +29817 +29818 +14 +43 +29819 +19 +15718 +29820 +21947 +20468 +43 +13957 +29821 +22 +29381 +20499 +3297 +24144 +21947 +29822 +80 +29823 +29824 +29825 +25584 +29826 +14079 +337 +29827 +29828 +9 +590 +2561 +2476 +29829 +28317 +10 +15989 +14330 +29830 +19618 +29381 +29831 +736 +303 +3484 +3546 +1502 +29832 +4862 +29833 +10 +29834 +29835 +25237 +337 +21111 +248 +14 +707 +18191 +590 +24864 +345 +29836 +29837 +3251 +29838 +4438 +1364 +1749 +2577 +19 +2593 +21947 +29839 +17467 +29840 +29841 +696 +3828 +6067 +29628 +820 +29842 +25237 +29843 +872 +43 +29844 +8367 +14369 +20339 +27331 +29845 +29846 +28549 +29847 +29848 +4634 +24896 +29849 +29850 +29851 +29852 +29853 +29854 +29855 +29856 +26744 +18479 +14369 +21947 +14369 +29381 +29381 +13721 +29857 +29858 +29859 +26672 +32 +43 +27414 +4441 +22204 +19618 +27669 +13957 +25 +29860 +519 +29861 +29862 +29863 +96 +10917 +29864 +9 +21947 +29865 +14560 +29866 +27669 +66 +13721 +12247 +14 +5134 +29867 +19618 +1513 +22230 +24403 +15 +713 +29868 +1415 +6341 +365 +29869 +29870 +18310 +9913 +1021 +6487 +2260 +28951 +29871 +29032 +344 +14604 +29872 +29873 +790 +17151 +213 +9 +3546 +29483 +29874 +29875 +5119 +2392 +29876 +29877 +29878 +29628 +25659 +17608 +29879 +29880 +9410 +19404 +29881 +89 +4278 +20883 +17749 +43 +29882 +10717 +15611 +29883 +5837 +16461 +8849 +20182 +15718 +29884 +791 +24920 +29885 +29886 +21947 +25945 +25530 +10 +29887 +15718 +286 +18234 +29888 +29889 +24303 +736 +1425 +14597 +24045 +29890 +29891 +2 +15789 +736 +21468 +29892 +9 +70 +21947 +736 +18234 +29893 +24144 +29894 +590 +28549 +25140 +25237 +29895 +29896 +3023 +29897 +1154 +57 +303 +21947 +29898 +24864 +29899 +43 +17412 +29900 +57 +7935 +1743 +43 +29901 +43 +14 +213 +19009 +15718 +29902 +29903 +16437 +29904 +16107 +29905 +29906 +14369 +3546 +29907 +29908 +29909 +29910 +29911 +19618 +4124 +27836 +4463 +21689 +29912 +29913 +1517 +14369 +8295 +1169 +29914 +29915 +29916 +29917 +29918 +915 +3353 +3252 +21947 +14 +28317 +6225 +694 +9774 +29919 +21931 +44 +29920 +16826 +14477 +9 +590 +27669 +29921 +10117 +345 +1812 +248 +6161 +43 +29922 +29923 +29924 +19618 +1051 +29925 +284 +15855 +29926 +24844 +57 +24896 +12956 +27669 +2342 +12067 +29927 +29928 +29929 +21947 +23867 +14 +14079 +4055 +12560 +179 +29930 +138 +29931 +29932 +21602 +137 +29933 +15158 +1612 +14276 +7799 +9 +1314 +2694 +21947 +248 +213 +7835 +14909 +29934 +5188 +29935 +25316 +12267 +20614 +2577 +29936 +19 +1109 +408 +77 +303 +24896 +29937 +29938 +29483 +29939 +25140 +29940 +13721 +3422 +2136 +10526 +3546 +29941 +8188 +29942 +29943 +29944 +19387 +358 +29945 +1859 +22989 +29946 +28549 +14079 +7053 +590 +13957 +27669 +19618 +29947 +25683 +29948 +13228 +379 +9 +16028 +29012 +43 +29949 +29950 +29951 +14604 +1090 +29952 +29953 +14369 +14 +15718 +25683 +3546 +29954 +29955 +29956 +29957 +29958 +5539 +15789 +29959 +43 +28441 +29960 +23578 +11995 +29961 +29962 +29963 +971 +1907 +14482 +14 +317 +29964 +1047 +14 +29965 +29966 +29967 +29968 +248 +1961 +6223 +29969 +29970 +5629 +248 +29971 +4463 +345 +14 +29972 +29973 +29974 +345 +6364 +29975 +2197 +29483 +29976 +29977 +21947 +25683 +411 +357 +345 +9 +28951 +10781 +29978 +25140 +13721 +27669 +29979 +558 +554 +5780 +29980 +286 +2135 +9600 +5791 +8668 +21889 +25934 +29981 +20132 +29982 +29983 +2795 +613 +29984 +3247 +29985 +29986 +2415 +3287 +28951 +29987 +590 +25668 +29988 +29989 +24144 +11702 +29990 +345 +29991 +590 +29992 +28441 +20161 +3874 +14 +1112 +197 +29993 +29994 +3081 +7053 +248 +29995 +29996 +713 +15207 +66 +21689 +4221 +29997 +6400 +3546 +9 +5326 +10094 +225 +29998 +28317 +1160 +29999 +30000 +7137 +30001 +14 +25683 +21947 +16515 +30002 +745 +30003 +30004 +30005 +25943 +27669 +30006 +19009 +21947 +30007 +2832 +30008 +30009 +29381 +3655 +24843 +30010 +22187 +5297 +6305 +30011 +1503 +337 +27 +16810 +8712 +2773 +1115 +15718 +24207 +9 +590 +30012 +29204 +303 +14363 +14079 +11238 +7508 +30013 +30014 +30015 +30016 +915 +11764 +29799 +21947 +19122 +5188 +4918 +19618 +30017 +185 +13721 +2035 +30018 +29032 +29720 +30019 +30020 +30021 +57 +590 +7706 +8367 +1010 +28745 +201 +19 +286 +30022 +30023 +873 +30024 +30025 +9060 +4634 +14175 +30026 +1168 +43 +30027 +322 +284 +21030 +30028 +13365 +11261 +30029 +43 +30030 +30031 +30032 +21947 +9636 +30033 +349 +30034 +43 +30035 +3484 +8442 +26475 +1021 +30036 +30037 +22 +9160 +19 +14330 +3491 +17749 +25237 +14369 +30038 +30039 +16066 +26940 +16974 +30040 +32 +30041 +519 +15939 +25943 +14436 +6504 +18020 +28951 +24864 +30042 +53 +590 +32 +30043 +76 +27069 +9 +2027 +30044 +30045 +30046 +19798 +30047 +30048 +14871 +5806 +213 +25237 +10389 +30049 +736 +30050 +30051 +30052 +21947 +27065 +19965 +30053 +30054 +32 +30055 +21947 +30056 +30057 +30058 +586 +677 +30059 +1481 +22 +15018 +10038 +15 +25943 +30060 +30061 +14369 +30062 +15718 +349 +3601 +20 +30063 +30064 +30065 +30066 +19563 +15 +30067 +647 +14330 +554 +30068 +590 +9 +548 +357 +25237 +19 +30069 +30070 +14 +30071 +14330 +28753 +43 +30072 +30073 +30074 +30075 +2836 +30076 +30077 +21947 +1011 +89 +201 +30078 +18640 +284 +30079 +13238 +5629 +30080 +30081 +155 +25140 +30082 +474 +19052 +28441 +30083 +6764 +30084 +43 +6976 +30085 +12832 +13543 +22492 +5780 +178 +30086 +29109 +11607 +29381 +14369 +683 +30087 +30088 +43 +19618 +30089 +29956 +11754 +21947 +2197 +28401 +30090 +12351 +3698 +9 +30091 +3546 +29204 +43 +5582 +26549 +4126 +22042 +28441 +30092 +165 +2694 +30093 +43 +1520 +446 +30094 +17635 +19 +1018 +30095 +15718 +30096 +19618 +3978 +2561 +5820 +18421 +14 +30097 +28441 +201 +30098 +6950 +1090 +3601 +23271 +30099 +30100 +30101 +30102 +228 +2902 +6728 +358 +30103 +1234 +9 +6261 +19 +30104 +27669 +14 +9 +26066 +1021 +2260 +29381 +3546 +1011 +14369 +8160 +43 +2330 +30105 +30106 +30107 +5803 +30108 +30109 +3546 +7259 +30110 +21947 +30111 +4752 +30112 +30113 +30114 +1517 +24725 +10 +2029 +30115 +1912 +30116 +3553 +10 +5791 +3067 +30117 +30118 +29381 +30119 +43 +27733 +29 +30120 +27404 +30121 +30122 +222 +30123 +21947 +1885 +60 +13349 +30124 +19 +19 +736 +18869 +30125 +29628 +13566 +14330 +15718 +23649 +2043 +12157 +30126 +345 +399 +6364 +14 +30127 +104 +1765 +6344 +20144 +17477 +14330 +1245 +30128 +20 +24862 +30129 +736 +30130 +30131 +3790 +30132 +30133 +19319 +286 +590 +30134 +2872 +30135 +18951 +43 +19 +30136 +30137 +8378 +30138 +373 +533 +25267 +30139 +25140 +30140 +590 +30020 +3330 +43 +30141 +18896 +30142 +30143 +1606 +15718 +30144 +30145 +2733 +30146 +24435 +19 +1920 +30147 +1765 +30148 +30149 +30150 +30151 +30152 +30153 +18248 +1332 +27069 +30154 +5188 +30155 +30156 +14102 +30157 +5188 +30158 +5088 +28317 +30159 +19618 +27564 +8455 +30160 +26361 +30161 +1056 +7577 +30162 +272 +30163 +30164 +28333 +24303 +30165 +20374 +30166 +30167 +1817 +30168 +2314 +27011 +30169 +14079 +43 +30170 +22999 +1808 +29381 +15 +30171 +30172 +7494 +30173 +30174 +30175 +14 +29799 +27069 +15 +30176 +21947 +19 +2356 +30177 +30178 +30179 +24303 +30180 +14001 +349 +30181 +26181 +14529 +17586 +30182 +2550 +30183 +7053 +30184 +30185 +30186 +20 +30187 +30188 +1066 +21947 +3059 +30189 +14330 +30190 +17271 +17872 +6924 +790 +17151 +30191 +30192 +30193 +590 +30194 +30195 +30196 +21689 +17529 +1401 +1423 +30197 +30198 +1596 +30199 +30200 +30201 +13807 +30202 +18951 +30203 +30204 +30205 +28923 +193 +1688 +15 +23103 +19618 +25829 +24896 +30206 +24725 +24725 +2476 +2787 +19206 +9210 +3858 +30207 +12397 +59 +30208 +29381 +30209 +17586 +30210 +15 +30211 +30212 +30213 +8686 +14604 +30214 +28549 +7053 +990 +30215 +7838 +21947 +2324 +34 +22963 +30216 +11259 +30217 +24207 +590 +1513 +30218 +8610 +24725 +28549 +29483 +24303 +2 +30219 +10583 +30220 +22986 +872 +7137 +30221 +43 +29799 +30222 +5326 +2254 +15718 +3546 +21947 +30223 +345 +677 +1090 +17691 +29381 +25140 +554 +30224 +5650 +25991 +30225 +13576 +25659 +17791 +24303 +15 +30226 +701 +10 +20 +30227 +4230 +30228 +671 +27875 +14 +1870 +30229 +18429 +22818 +15718 +30230 +30231 +8668 +12896 +27069 +30232 +3059 +30233 +21417 +30234 +26040 +30235 +30236 +554 +15541 +21576 +21947 +30237 +213 +30238 +18695 +15 +303 +30239 +114 +28036 +30240 +30241 +14 +29200 +872 +30242 +30243 +337 +495 +3034 +14477 +30244 +3546 +30245 +22599 +30246 +15398 +11217 +12359 +248 +30247 +37 +28661 +30248 +7749 +12956 +764 +30249 +43 +30250 +25683 +21031 +30251 +21947 +7014 +19404 +12696 +30252 +30253 +23162 +30254 +30255 +30256 +30257 +30258 +30259 +29163 +11321 +9 +16 +1011 +30260 +337 +1513 +30261 +30262 +26962 +1267 +30263 +27213 +2764 +99 +21947 +1710 +30264 +17151 +3994 +3908 +9 +30265 +30266 +14477 +19 +30267 +14 +26292 +30268 +32 +30269 +30270 +30271 +5188 +536 +21947 +30272 +30273 +3598 +57 +26496 +9 +30274 +28317 +286 +30275 +19655 +9266 +1442 +30276 +10729 +345 +23603 +30277 +19618 +30278 +30279 +25683 +284 +30280 +30281 +32 +30282 +30283 +2635 +29483 +3978 +790 +30284 +43 +30285 +248 +30286 +4747 +30287 +30288 +30289 +28317 +303 +248 +15 +2 +24303 +30290 +30291 +3994 +25237 +1234 +30292 +30293 +30294 +30295 +7738 +19118 +30296 +48 +9 +15592 +1217 +24303 +590 +25659 +29483 +29381 +28317 +30297 +26538 +2314 +1710 +3242 +590 +3435 +18798 +21849 +14330 +30298 +1655 +11762 +590 +30299 +25237 +30300 +24144 +30301 +30302 +29381 +30303 +30304 +3866 +30305 +16102 +6728 +30306 +20 +27669 +30307 +5085 +29381 +337 +30308 +6571 +30309 +7137 +9 +30310 +19 +8668 +30311 +30312 +3978 +30313 +185 +30314 +26984 +14369 +6145 +3601 +19095 +2040 +25584 +303 +30315 +27069 +2197 +25683 +30316 +30317 +3546 +333 +30318 +30319 +989 +19404 +13721 +411 +99 +2770 +5006 +1234 +4747 +14704 +29835 +1112 +4028 +5188 +30320 +303 +21947 +80 +30321 +586 +30322 +9 +411 +14369 +19 +1578 +24896 +29628 +3376 +30323 +14 +809 +286 +18064 +4278 +30324 +13848 +30325 +705 +14648 +337 +19404 +15718 +30326 +9 +21947 +30327 +4522 +28481 +5780 +9 +1168 +9110 +29381 +20 +27669 +14603 +30328 +14947 +30329 +30330 +30331 +30332 +30333 +590 +1961 +30334 +30335 +24469 +30336 +30337 +2668 +30338 +27669 +1870 +17808 +30339 +28549 +16437 +30340 +18091 +21947 +30341 +17144 +30342 +597 +30343 +24896 +3908 +7053 +323 +24725 +209 +21188 +7215 +29381 +26348 +30344 +43 +590 +519 +30345 +590 +29381 +25943 +590 +30346 +29381 +10 +19404 +30347 +1385 +8270 +30348 +17871 +30349 +25140 +323 +21947 +286 +28317 +30350 +29434 +10 +30351 +647 +6078 +23670 +30352 +7018 +25683 +1224 +14330 +17277 +30353 +23103 +590 +30354 +15939 +17571 +222 +9705 +9 +17670 +78 +590 +303 +30355 +30356 +18607 +30357 +6873 +30358 +6161 +30359 +338 +4 +7137 +30360 +30361 +19618 +30362 +14369 +2561 +30363 +155 +14233 +2260 +14369 +22689 +77 +24928 +21732 +30364 +14330 +30365 +1688 +30366 +30367 +6833 +11762 +22183 +19603 +392 +13905 +30368 +30369 +2392 +30370 +13405 +13725 +286 +21045 +2728 +3354 +5925 +3328 +30371 +8845 +26744 +17698 +14369 +43 +30372 +1112 +30373 +25683 +30374 +2449 +30375 +30376 +284 +590 +4990 +5107 +201 +29963 +3908 +647 +30377 +9 +6595 +19 +30378 +22317 +21947 +43 +155 +44 +27798 +4538 +337 +201 +30379 +1224 +14 +19 +417 +57 +26096 +11170 +30380 +373 +13905 +9214 +2342 +16031 +634 +390 +30381 +15476 +43 +3601 +3642 +668 +30382 +5267 +30383 +17151 +14604 +30384 +24045 +1051 +248 +12907 +5674 +30385 +30386 +3818 +14369 +3353 +30387 +30388 +7756 +30389 +15513 +13361 +349 +6171 +1112 +30390 +25140 +11754 +16505 +30391 +104 +1502 +9095 +44 +43 +17206 +25683 +21469 +34 +30392 +14477 +1524 +30393 +30394 +18760 +25237 +22473 +30395 +30396 +30397 +30398 +19267 +30399 +1217 +24864 +14 +30400 +554 +30401 +1470 +43 +249 +18780 +15 +30402 +29381 +14152 +10 +14 +30403 +30404 +3626 +3341 +21947 +30405 +8460 +13285 +3369 +30406 +446 +20 +284 +736 +10095 +30407 +30408 +590 +30409 +1889 +114 +140 +30410 +28317 +365 +590 +28549 +822 +2919 +590 +24000 +248 +30411 +30412 +25584 +590 +30413 +30414 +43 +14 +213 +3546 +19 +30415 +29483 +12067 +411 +24725 +4900 +1696 +736 +12987 +15824 +25237 +30416 +44 +30417 +378 +30418 +720 +30224 +30419 +21153 +24896 +337 +832 +43 +590 +2851 +248 +24896 +30420 +30421 +14369 +43 +14947 +3559 +28317 +4414 +30422 +17784 +1157 +30423 +104 +19404 +213 +3875 +17349 +6571 +32 +4808 +23752 +408 +30424 +16850 +30425 +24725 +30426 +19096 +43 +30427 +21689 +138 +26303 +16121 +12600 +25758 +286 +30428 +5134 +9 +30429 +213 +213 +43 +18684 +30430 +8297 +30431 +5119 +10239 +20 +590 +1382 +28317 +70 +29381 +43 +30432 +210 +17589 +30433 +19 +29956 +30434 +1559 +209 +29204 +26361 +19852 +30435 +30436 +28317 +10 +7291 +43 +57 +11482 +10527 +720 +14369 +1112 +30437 +30438 +30439 +30440 +18982 +30441 +18250 +1716 +590 +25140 +495 +30442 +6449 +30443 +30444 +30445 +11754 +30446 +1606 +1559 +43 +29483 +5188 +13484 +10 +303 +1364 +57 +3655 +352 +30447 +30448 +22 +30449 +28549 +21947 +1956 +30450 +213 +30451 +30452 +827 +345 +24864 +30453 +30454 +30455 +7137 +26570 +12254 +29916 +29013 +72 +9 +30456 +30457 +323 +30458 +1316 +2975 +30459 +30460 +3995 +14369 +30461 +18310 +7053 +30462 +222 +30463 +11762 +19 +12798 +9801 +8668 +15 +10527 +303 +590 +30464 +30465 +5007 +1234 +21201 +7053 +30466 +29434 +3208 +15 +30467 +15718 +30468 +38 +15533 +21947 +30469 +8668 +30470 +1574 +25683 +30471 +9402 +4364 +17972 +30472 +30473 +30474 +1593 +3546 +5318 +30475 +284 +683 +30476 +21947 +14947 +30477 +30478 +14330 +337 +19582 +27669 +12987 +30479 +9 +30480 +25237 +18951 +1514 +14369 +2043 +27669 +272 +3601 +30481 +30482 +30483 +15925 +6289 +3546 +8814 +1620 +337 +43 +707 +17749 +30484 +28317 +379 +30485 +30486 +13307 +4693 +13721 +14477 +4028 +30487 +30488 +3897 +25683 +29381 +15442 +30489 +30490 +26508 +30491 +7662 +12661 +345 +5336 +19618 +30492 +30493 +13721 +30494 +142 +6732 +27669 +736 +30495 +2410 +7014 +13538 +337 +2577 +15718 +12661 +337 +2768 +3546 +137 +30496 +28082 +1817 +5627 +21947 +30497 +30498 +30499 +19695 +30500 +590 +1961 +25237 +30501 +11 +30502 +22 +345 +5188 +590 +30503 +30504 +43 +30505 +30506 +30507 +29483 +16226 +1332 +3480 +8668 +30508 +24725 +19386 +4196 +30509 +5188 +3546 +30510 +18695 +30511 +14477 +30512 +30513 +30514 +2772 +30515 +14369 +24218 +20572 +30516 +30517 +2314 +647 +613 +2029 +5293 +14369 +19618 +26496 +21776 +683 +30518 +30519 +19618 +30520 +30521 +43 +30522 +2324 +9 +30523 +30524 +30525 +30209 +5780 +9649 +13721 +30526 +14 +10 +28353 +14825 +228 +349 +19 +5188 +30527 +30528 +1021 +30529 +7855 +30530 +48 +30531 +30532 +29483 +7835 +30533 +1809 +30534 +30535 +10 +104 +22680 +8244 +21947 +590 +29381 +30536 +30537 +2 +30538 +3080 +6505 +30539 +18100 +17094 +22552 +30540 +26132 +29381 +23474 +30224 +248 +831 +30541 +686 +30542 +30543 +11607 +30544 +30545 +30546 +29491 +8724 +647 +30547 +30548 +27669 +3328 +27669 +30549 +30550 +2406 +30551 +28317 +24045 +8610 +29483 +8244 +30552 +30553 +27669 +21698 +2208 +3719 +30554 +14369 +4012 +28317 +2593 +28549 +1082 +30555 +17921 +30556 +5267 +30557 +19435 +29381 +10356 +24864 +30558 +17005 +12431 +30559 +989 +272 +30560 +21947 +19 +21509 +1011 +30561 +14369 +30562 +457 +30563 +30564 +29483 +28317 +24860 +18744 +140 +18045 +24418 +1787 +25237 +29381 +7053 +43 +590 +590 +358 +7328 +9 +30565 +24144 +6341 +30566 +13585 +24864 +30567 +30568 +30569 +14369 +29483 +323 +4055 +8110 +15718 +2015 +27905 +15 +21947 +11762 +30570 +43 +20600 +30571 +16437 +15193 +2234 +30572 +30573 +30574 +30575 +590 +29981 +14369 +59 +4341 +1356 +30576 +1799 +24860 +30577 +3480 +30578 +15718 +18079 +1870 +30579 +21947 +30580 +29381 +24045 +30581 +29483 +14947 +30582 +1542 +5085 +3462 +19 +9060 +349 +379 +29381 +22308 +25943 +30583 +19 +1710 +3546 +590 +12287 +30584 +3546 +13229 +25 +21947 +1648 +349 +12222 +5561 +30585 +18982 +30586 +14215 +30587 +14666 +25276 +19 +30588 +590 +21947 +1442 +24725 +25364 +30589 +30590 +30591 +24864 +30592 +5085 +30593 +12987 +29629 +12479 +30594 +57 +5606 +30595 +30596 +30597 +249 +5085 +30598 +26744 +30599 +43 +17151 +1082 +30600 +30601 +29483 +30602 +27798 +5217 +30603 +30604 +25382 +43 +915 +30605 +2060 +29483 +30606 +30607 +26417 +7053 +25237 +30608 +30609 +24864 +30610 +30611 +1300 +15 +15949 +20816 +21031 +30612 +30613 +29483 +30614 +26361 +30615 +5314 +30616 +30617 +1203 +19 +14079 +10511 +30618 +5629 +24896 +19618 +26508 +590 +30619 +20636 +30620 +140 +30621 +26786 +30622 +21947 +26064 +28317 +30623 +30624 +19 +25316 +30625 +30626 +19 +43 +14 +30627 +3034 +30628 +1870 +1083 +15718 +5614 +373 +2 +30629 +30630 +38 +21947 +30631 +8668 +12404 +30632 +30633 +30634 +12062 +1226 +29381 +136 +140 +30635 +15718 +30636 +3913 +286 +14369 +25088 +30637 +4012 +20 +25237 +30638 +1517 +2975 +30639 +30640 +13721 +42 +23617 +30641 +1245 +3546 +671 +30642 +30643 +12987 +3228 +4364 +30644 +21689 +14330 +5785 +590 +17518 +30645 +2925 +24725 +13721 +30646 +21889 +15054 +30647 +30648 +29992 +713 +43 +155 +30649 +590 +30650 +286 +6060 +30651 +43 +17151 +9 +6766 +11754 +2733 +250 +20656 +242 +397 +30652 +9 +1332 +30653 +30580 +3531 +188 +30654 +30655 +12067 +30656 +30657 +30658 +26496 +24896 +23103 +30659 +30660 +30661 +20 +349 +30662 +30663 +188 +29483 +28147 +586 +29381 +30664 +30665 +14369 +8297 +30666 +30667 +164 +1153 +2342 +20 +21947 +10303 +30668 +259 +43 +1852 +4764 +30669 +13619 +9 +30670 +30671 +201 +10946 +3 +357 +30672 +30673 +9 +30674 +16817 +30675 +286 +358 +30676 +14477 +24896 +1889 +29381 +4138 +910 +3546 +21971 +30677 +11906 +30678 +566 +1295 +188 +3546 +30679 +11073 +8668 +19 +2409 +4765 +2260 +22236 +9 +30051 +412 +25620 +2764 +590 +15923 +736 +30680 +24864 +10117 +30681 +736 +14369 +30682 +1013 +30683 +30684 +30685 +30686 +349 +3601 +2 +25683 +1765 +43 +30687 +6893 +30688 +363 +2410 +11083 +25 +27669 +30689 +27669 +14330 +30690 +30691 +30692 +30693 +764 +30694 +30695 +30696 +13777 +14 +24045 +30697 +30698 +873 +30699 +2314 +2694 +30700 +11810 +28441 +30701 +30702 +1157 +30703 +30704 +30705 +30706 +24725 +30707 +8188 +30708 +30458 +27669 +7053 +30709 +30710 +30711 +30712 +30713 +4550 +26690 +13801 +30714 +30715 +30716 +915 +30717 +536 +60 +11087 +28490 +887 +18283 +590 +25971 +17371 +1716 +30718 +2834 +30719 +30720 +30721 +30722 +29984 +30559 +29381 +30723 +30724 +597 +30725 +30726 +30727 +1621 +19 +30728 +43 +30729 +30730 +30731 +30732 +30733 +19404 +30734 +30735 +1287 +30736 +30737 +19 +30738 +3546 +30739 +30740 +14947 +16437 +89 +23226 +10 +590 +30741 +6764 +18934 +30742 +30743 +26361 +2550 +345 +28317 +30744 +1508 +23752 +1698 +30745 +30746 +30747 +10 +1562 +15718 +21947 +2314 +30748 +3950 +30749 +30750 +25159 +30751 +23102 +286 +8668 +209 +30752 +27669 +2325 +21831 +30753 +18695 +19091 +27669 +30754 +2830 +30755 +30756 +6214 +9 +7855 +28317 +30757 +30758 +30759 +30760 +30761 +2065 +30762 +25237 +30763 +25943 +30764 +22098 +30765 +30766 +30767 +7559 +30768 +12987 +29381 +8249 +30769 +4821 +30770 +10 +345 +2804 +27482 +30771 +99 +20555 +30772 +4806 +30773 +30774 +30775 +30776 +27719 +18019 +43 +19618 +2471 +2459 +27669 +590 +9 +30777 +21947 +30778 +30779 +15 +4982 +3353 +17151 +109 +43 +519 +5074 +28441 +30780 +26040 +30781 +30782 +13841 +30783 +4387 +21947 +30784 +30785 +30786 +399 +30787 +1262 +21947 +7108 +30788 +590 +30789 +12231 +30790 +590 +2577 +2320 +5204 +11754 +25659 +43 +30791 +1824 +13662 +26649 +30792 +24864 +865 +30793 +25140 +14369 +30794 +67 +18605 +417 +30795 +30796 +22963 +1224 +19618 +70 +30797 +3546 +29483 +30798 +4364 +861 +14770 +3908 +30224 +30799 +39 +30800 +2459 +30801 +1612 +339 +30802 +817 +30209 +30803 +9629 +13576 +4278 +14343 +9 +20514 +30804 +17151 +30805 +30806 +25943 +30807 +590 +27669 +1300 +30808 +7053 +5601 +1423 +29483 +3546 +590 +30809 +21947 +845 +30810 +355 +14369 +30811 +24725 +30812 +30813 +30814 +12220 +5188 +30815 +590 +28317 +30816 +30817 +30818 +30819 +18186 +15207 +14604 +21337 +30820 +30821 +6334 +4425 +188 +3546 +1291 +14369 +15718 +30822 +30823 +30824 +272 +24896 +15825 +28317 +590 +19655 +57 +30825 +19 +2342 +12579 +30826 +21947 +30827 +13307 +18695 +28568 +19404 +24774 +9095 +2260 +9842 +20952 +1018 +190 +3764 +43 +2896 +30828 +2764 +25943 +14 +30829 +29381 +2049 +24144 +365 +98 +30830 +29483 +14841 +30831 +1018 +6364 +30832 +30833 +17270 +10430 +30834 +30835 +19 +21947 +30836 +1300 +28317 +30837 +30838 +30839 +14133 +43 +30840 +1220 +21947 +30841 +30842 +16437 +30843 +25172 +30844 +30845 +28317 +22 +17046 +30846 +573 +43 +27669 +30847 +30848 +12684 +20108 +30849 +30850 +15718 +30851 +15311 +19 +30852 +446 +4458 +30853 +345 +1992 +30854 +30855 +14363 +30856 +703 +30857 +30858 +861 +30859 +24333 +345 +30860 +14330 +9 +30861 +30862 +30863 +1012 +713 +15718 +26635 +30864 +3 +10360 +30865 +554 +20700 +590 +155 +30866 +30867 +29483 +28923 +416 +18896 +30868 +345 +30869 +30870 +590 +26011 +14 +24790 +30871 +345 +15 +3104 +17320 +15718 +19618 +14 +2314 +590 +1688 +4634 +30872 +21835 +590 +19064 +30873 +286 +30874 +30875 +30876 +17151 +14 +30877 +3626 +30878 +3551 +30879 +30880 +19 +5188 +3601 +10230 +29483 +1021 +22669 +30881 +29483 +30882 +22989 +14330 +38 +13566 +30883 +30884 +1559 +349 +43 +25172 +827 +43 +29497 +20 +30885 +30886 +30887 +5410 +14 +495 +19 +30888 +15 +30889 +14369 +89 +15942 +3546 +14604 +30890 +66 +43 +30891 +15 +30892 +32 +417 +228 +24131 +30893 +12722 +30224 +21499 +19582 +30894 +25237 +30895 +1961 +30896 +19 +30897 +24896 +30898 +304 +3546 +25666 +26711 +30899 +30900 +30901 +77 +827 +30902 +30903 +30904 +16437 +30905 +14330 +103 +30906 +27069 +25659 +1529 +1559 +5662 +12005 +27669 +14 +4306 +14 +30907 +30908 +30909 +30910 +30911 +58 +30912 +28441 +30913 +1245 +25604 +14477 +677 +29483 +30914 +3598 +4195 +281 +17151 +24045 +66 +14000 +43 +46 +30915 +30916 +29483 +25871 +43 +155 +30917 +30918 +18145 +2038 +2872 +30919 +43 +13279 +16437 +30920 +209 +30921 +25 +19655 +13583 +345 +89 +11174 +14527 +17151 +30922 +30923 +736 +13553 +30924 +24919 +1066 +29381 +89 +506 +533 +2 +14898 +442 +713 +14330 +25659 +6877 +30925 +8602 +29483 +3546 +1716 +30926 +349 +30927 +30928 +4028 +1786 +14330 +22308 +30929 +30930 +17608 +3546 +2 +14102 +6459 +30931 +3546 +21947 +30932 +29381 +57 +30933 +5085 +20952 +3546 +14185 +3546 +1521 +2264 +30934 +30935 +30936 +29153 +713 +245 +590 +21947 +30937 +2525 +2733 +30938 +43 +25140 +4502 +27719 +30939 +24896 +26484 +30940 +3044 +30941 +26484 +19618 +5085 +9 +2764 +30942 +30943 +21186 +484 +1444 +30944 +30945 +30946 +30947 +349 +2309 +842 +4086 +14477 +30948 +43 +30949 +22963 +11389 +303 +24063 +30950 +11995 +24144 +14909 +19404 +30559 +248 +30559 +10407 +12907 +915 +29483 +30951 +248 +1021 +30952 +30953 +829 +30954 +590 +30955 +30956 +25683 +30957 +30958 +9705 +30959 +30960 +26484 +25683 +30961 +915 +284 +19 +15718 +10961 +30962 +30963 +43 +284 +30964 +18568 +20514 +1332 +30965 +30966 +21947 +590 +2834 +30967 +30968 +19618 +7835 +30969 +590 +29483 +7522 +30970 +28317 +3790 +2064 +30971 +29483 +1234 +1710 +30972 +58 +23103 +30973 +249 +358 +21947 +358 +379 +32 +1471 +213 +30974 +30975 +6776 +14604 +8967 +713 +1222 +248 +30976 +817 +8256 +27669 +671 +30977 +15718 +30978 +14477 +16437 +73 +21947 +30979 +24951 +43 +14369 +7977 +24303 +27433 +1745 +14660 +26229 +927 +827 +30980 +30981 +25943 +9604 +43 +554 +30982 +30983 +751 +30984 +590 +248 +286 +30985 +677 +30986 +27446 +18946 +11845 +30987 +30988 +29381 +1562 +21947 +379 +2015 +30989 +15356 +3546 +30990 +30991 +1465 +30992 +590 +30993 +30994 +14369 +6095 +29483 +30995 +29381 +2804 +30996 +15259 +1562 +24144 +89 +3480 +9718 +1026 +19965 +66 +2728 +16853 +30997 +30998 +7137 +30999 +272 +1834 +31000 +590 +9 +12697 +31001 +20339 +31002 +2430 +3 +32 +974 +31003 +1169 +28441 +24896 +15824 +31004 +31005 +31006 +28317 +829 +13615 +179 +11138 +15470 +31007 +30051 +2004 +533 +31008 +24374 +29381 +27669 +590 +14369 +14369 +590 +13375 +27996 +1262 +12871 +31009 +31010 +29381 +15718 +1021 +29483 +14363 +31011 +31012 +31013 +22065 +14477 +29381 +43 +8188 +12563 +12053 +15718 +23464 +31014 +315 +303 +31015 +31016 +43 +4518 +278 +303 +31017 +18064 +17151 +31018 +14369 +31019 +3553 +491 +13721 +31020 +31021 +590 +31022 +31023 +20051 +31024 +9232 +4441 +15763 +103 +140 +3546 +25683 +21975 +31025 +31026 +31027 +29204 +31028 +27669 +30538 +286 +5451 +31029 +17151 +31030 +1300 +327 +31031 +3484 +31032 +31033 +21947 +31034 +31035 +16340 +1458 +27794 +2121 +19618 +31036 +29483 +31037 +590 +345 +31038 +31039 +31040 +1208 +8392 +31041 +2636 +31042 +31043 +736 +237 +31044 +26040 +3546 +25584 +791 +29799 +3251 +5089 +25140 +28317 +21853 +1013 +31045 +349 +915 +20532 +28317 +31046 +345 +31047 +26025 +21947 +16919 +648 +12351 +29483 +31048 +155 +31049 +20 +22420 +31050 +201 +3546 +188 +29434 +613 +31051 +15718 +31052 +24864 +9 +77 +4441 +18120 +22355 +13640 +164 +665 +31053 +140 +31054 +19618 +15718 +31055 +18283 +31056 +2485 +915 +31057 +31058 +872 +822 +19 +31059 +6617 +29381 +27669 +21947 +15068 +11670 +397 +31060 +8668 +31061 +3976 +27069 +31062 +31063 +31064 +1382 +31065 +24144 +22010 +590 +31066 +18045 +20404 +1559 +927 +590 +31067 +9 +26744 +31068 +19618 +31069 +1082 +179 +31070 +15980 +379 +43 +31071 +31072 +31073 +31074 +43 +31075 +16211 +11479 +31076 +3546 +22 +29628 +24896 +31077 +14001 +31078 +31079 +31080 +31081 +15 +31082 +10 +31083 +30559 +11582 +31084 +25904 +28549 +303 +25 +8244 +31085 +31086 +31087 +31088 +5780 +9 +12315 +25 +501 +8005 +284 +833 +411 +26744 +345 +31089 +31090 +31091 +3251 +31092 +43 +2694 +590 +29483 +5806 +31093 +31094 +25683 +2795 +31095 +21837 +9287 +188 +31096 +31097 +15348 +31098 +14871 +665 +19792 +31099 +286 +648 +970 +2197 +31100 +31101 +176 +31102 +20538 +590 +31103 +13086 +31104 +89 +19618 +43 +31105 +31106 +31107 +2975 +14477 +14477 +16826 +201 +16645 +26361 +30224 +736 +31108 +1018 +303 +20 +25943 +1051 +345 +29483 +4002 +8351 +14330 +30580 +21947 +31109 +31110 +153 +31111 +25140 +272 +14330 +18310 +31112 +323 +25237 +15569 +14369 +31113 +31114 +21947 +1543 +358 +30051 +2414 +3601 +25316 +12987 +24207 +31115 +31116 +31117 +31118 +286 +29483 +677 +31119 +20 +31120 +31121 +25237 +31122 +178 +31123 +31124 +43 +31125 +478 +27669 +23805 +43 +25943 +3950 +14520 +114 +18951 +31126 +31127 +1559 +31128 +31129 +29483 +26452 +31130 +32 +31131 +31132 +1502 +31133 +5390 +971 +15718 +14369 +30877 +31134 +31135 +31136 +303 +303 +27260 +6950 +28317 +284 +28179 +25659 +9 +14436 +31137 +303 +31138 +31139 +31140 +1047 +31141 +21947 +14330 +11672 +31142 +31143 +24896 +26158 +29381 +4414 +31144 +31145 +31146 +31147 +568 +31148 +31149 +590 +14363 +31150 +2253 +1082 +28441 +2260 +248 +1051 +31151 +31152 +1961 +15183 +286 +10601 +22371 +10793 +595 +19655 +24725 +24896 +43 +31153 +21947 +337 +31154 +18798 +31155 +25202 +21869 +2728 +22420 +11683 +590 +21947 +30877 +25584 +31156 +12987 +31157 +31158 +19 +548 +402 +31159 +19 +31160 +31161 +14643 +861 +2577 +1606 +98 +590 +31162 +9210 +24725 +31163 +3546 +24864 +12987 +1289 +15 +14477 +31164 +31165 +31166 +31167 +31168 +3546 +590 +31169 +31170 +971 +23666 +31171 +3546 +17920 +96 +31172 +43 +15649 +29381 +31173 +30917 +27548 +89 +446 +590 +536 +31174 +448 +323 +31175 +31176 +13905 +31177 +43 +31178 +31179 +8297 +14734 +31180 +15718 +31181 +373 +509 +31182 +31183 +4055 +31184 +379 +13848 +590 +590 +27798 +43 +31185 +31186 +2043 +213 +27669 +16948 +590 +14 +815 +5188 +31187 +31188 +31189 +13721 +17151 +31190 +23103 +26083 +31191 +179 +7983 +14814 +10111 +31192 +5188 +15 +31193 +284 +9 +17151 +57 +31194 +31195 +12474 +14000 +7810 +10 +31196 +14369 +19 +43 +6054 +2197 +31197 +17151 +31198 +2176 +349 +369 +5188 +31199 +31200 +31201 +31202 +1013 +1287 +25140 +31203 +29 +31204 +4056 +5840 +13840 +23103 +4278 +31205 +1066 +31206 +561 +554 +7053 +29381 +14330 +31207 +31208 +365 +31209 +25140 +31210 +14343 +345 +31211 +14369 +22311 +14947 +3059 +46 +31212 +31213 +31214 +7045 +365 +31215 +24144 +31216 +3553 +3978 +270 +19618 +2733 +8721 +31217 +6058 +24896 +31218 +31219 +21947 +201 +31220 +707 +25237 +43 +31221 +566 +60 +43 +31222 +31223 +2260 +31224 +19618 +2577 +13905 +26040 +31225 +31226 +31227 +12987 +31228 +31229 +26571 +31230 +3553 +31231 +31232 +5757 +9 +31233 +14363 +3598 +356 +22 +6970 +31234 +31235 +28441 +31236 +19618 +822 +31237 +19618 +30877 +15718 +25897 +31238 +1559 +31239 +167 +31240 +19618 +31241 +1870 +28326 +31242 +31243 +590 +30559 +25140 +20 +9 +24303 +32 +19655 +19618 +286 +17698 +265 +19189 +31244 +31245 +31246 +440 +31247 +31248 +29483 +31249 +15793 +31250 +5188 +2619 +3964 +14330 +6275 +29483 +31251 +5679 +31252 +31253 +31254 +9754 +11966 +9 +12 +16 +13539 +1094 +31255 +30224 +31256 +21947 +29799 +24725 +16089 +24864 +89 +5085 +15907 +31257 +7385 +27798 +20098 +554 +9 +3598 +17983 +250 +1011 +6331 +30877 +31258 +31259 +31260 +31261 +8668 +30794 +43 +1976 +1011 +31262 +9 +13721 +31263 +554 +3546 +13721 +31264 +24785 +249 +590 +31265 +349 +29381 +31266 +19618 +2308 +19618 +31267 +21947 +14369 +3601 +13576 +3 +31268 +590 +590 +43 +970 +31269 +24864 +31270 +155 +14369 +590 +19618 +9 +14369 +29002 +800 +2891 +27669 +27669 +590 +970 +5119 +12987 +14240 +31271 +31272 +30877 +14947 +15471 +25683 +30826 +31273 +30877 +31274 +77 +3978 +352 +590 +31275 +31276 +5119 +31277 +19618 +31278 +590 +21676 +31279 +1376 +24303 +21947 +31280 +286 +29483 +3406 +16451 +754 +31281 +31282 +31283 +11259 +25683 +809 +736 +31284 +9 +22 +31285 +9 +57 +1083 +14 +764 +23363 +19 +31286 +21947 +31287 +31288 +16437 +9 +736 +14660 +342 +31289 +31290 +27817 +12832 +590 +16466 +19836 +5976 +21309 +11940 +31291 +31292 +29381 +31293 +1612 +11934 +27669 +24864 +286 +2476 +2499 +31294 +31295 +31296 +7665 +14330 +677 +19209 +6877 +887 +9210 +31297 +12259 +43 +31298 +1521 +1027 +31299 +31300 +31301 +209 +2591 +31302 +31303 +31304 +31305 +3369 +53 +9 +32 +31306 +31307 +272 +31308 +31309 +16437 +31310 +8297 +1047 +3546 +15718 +379 +18683 +30559 +31311 +31312 +17902 +21947 +31313 +9 +21947 +31314 +31315 +31316 +31317 +11522 +29483 +26020 +31318 +43 +19618 +2316 +18896 +31319 +9 +21625 +3546 +31320 +24207 +31321 +27669 +11738 +31322 +31323 +11702 +89 +31324 +31325 +31326 +12987 +185 +14369 +31327 +533 +590 +25237 +31328 +19 +31329 +31330 +590 +16931 +22 +14330 +1920 +43 +15 +209 +31331 +31332 +6741 +30051 +31333 +720 +31334 +30877 +9782 +31335 +31336 +20496 +21947 +31337 +3546 +19618 +3343 +31338 +31339 +10 +4550 +248 +43 +21716 +8297 +19 +31340 +24588 +31341 +849 +31342 +31343 +15 +31344 +31345 +30877 +32 +155 +1013 +736 +15824 +4441 +31346 +887 +3994 +13396 +25943 +24045 +519 +30209 +29884 +10028 +25047 +31347 +31348 +29956 +21947 +31349 +590 +1090 +31350 +10362 +18112 +31351 +915 +31352 +77 +18695 +15853 +6197 +31353 +14603 +31354 +30224 +17834 +31355 +57 +8005 +4285 +31356 +27719 +21947 +17206 +1384 +31357 +31358 +31359 +31360 +31361 +31362 +2121 +30877 +1352 +18928 +18045 +66 +31363 +31364 +30877 +5512 +31365 +17168 +31366 +6395 +28441 +34 +29483 +3950 +31367 +31368 +31369 +29483 +31370 +31371 +27069 +28317 +31372 +13721 +31373 +31374 +31375 +9 +29786 +31376 +11472 +1046 +31377 +665 +19 +28317 +31378 +31379 +31380 +25237 +25584 +756 +13030 +14477 +31381 +14 +201 +31382 +138 +590 +43 +31383 +43 +24725 +98 +25382 +31384 +21045 +286 +29381 +30877 +89 +31385 +25140 +19618 +20897 +31386 +31387 +29483 +5085 +14660 +213 +19 +14369 +701 +29381 +31388 +28339 +24045 +11754 +31389 +30877 +29381 +31390 +31391 +10880 +19 +31392 +31393 +31394 +20536 +31395 +31396 +31397 +31398 +31225 +28317 +2 +1154 +25683 +20 +31399 +284 +31400 +31401 +3353 +2043 +14594 +7053 +16 +213 +24725 +17 +9 +30224 +29381 +590 +248 +31402 +42 +31403 +31404 +3546 +31405 +1847 +315 +248 +27798 +109 +14947 +31406 +1107 +21947 +31407 +31408 +345 +500 +1038 +31409 +19 +31410 +30224 +6179 +31098 +28317 +2264 +31411 +29483 +140 +21681 +10973 +30877 +1013 +31412 +28961 +1352 +31413 +5080 +31414 +21947 +31415 +14599 +31416 +25871 +53 +17 +14 +27798 +31417 +19618 +8668 +31418 +43 +24303 +31419 +8668 +9 +3601 +31420 +31421 +31422 +7835 +26727 +2314 +4609 +31423 +31424 +248 +1090 +470 +15718 +30877 +26496 +3546 +3160 +1992 +303 +31425 +31426 +7137 +31427 +25237 +1784 +20897 +9 +284 +31428 +2913 +31429 +170 +29628 +28317 +554 +31430 +22 +2668 +31431 +412 +43 +13390 +2489 +21776 +10 +19 +26508 +13776 +31432 +1224 +4550 +31433 +109 +1531 +31434 +31435 +284 +4028 +31436 +1924 +31437 +29483 +14001 +15718 +31438 +31439 +31440 +18695 +14369 +30877 +23103 +31441 +15 +31442 +20094 +31443 +20888 +4055 +9451 +31444 +31445 +16865 +303 +17033 +32 +22963 +31446 +43 +17136 +9 +4025 +19126 +29381 +13030 +1716 +685 +31447 +17084 +31448 +31449 +9939 +209 +29381 +31450 +28317 +25140 +590 +169 +18034 +31451 +31452 +19655 +541 +2593 +14369 +31453 +24303 +20 +9 +8721 +31454 +397 +415 +31455 +990 +716 +31456 +1765 +31457 +31458 +4684 +554 +14369 +536 +1131 +22064 +3408 +29381 +26496 +31459 +31460 +21689 +1335 +31461 +31462 +249 +9 +31463 +31464 +17151 +31465 +24675 +20 +13150 +10117 +31466 +43 +28339 +31234 +317 +31467 +31468 +27669 +23103 +14 +31469 +31470 +29381 +26744 +29483 +7253 +337 +1090 +31471 +31472 +411 +554 +15824 +31473 +491 +671 +31474 +31475 +31476 +590 +31477 +31478 +14369 +14 +915 +31479 +31480 +7868 +31481 +9 +29483 +31482 +6090 +31483 +28471 +31484 +31485 +31486 +941 +6877 +31487 +1817 +31488 +22 +720 +915 +31489 +31490 +5498 +24010 +31491 +31492 +19 +31493 +390 +29483 +2577 +31494 +14363 +31495 +29483 +31496 +31497 +249 +9 +16656 +5188 +19817 +28999 +970 +6595 +31498 +11304 +5780 +3546 +27069 +31499 +31500 +3599 +31501 +31502 +31503 +31504 +25683 +284 +9548 +533 +9994 +43 +25683 +14369 +57 +3 +12832 +31505 +2315 +590 +5169 +1332 +31506 +31507 +559 +27669 +15718 +31508 +31509 +31510 +1578 +590 +31511 +28000 +31512 +19 +31513 +31514 +165 +31515 +558 +213 +31225 +1765 +31516 +1927 +1352 +31517 +31518 +5085 +15631 +31519 +27669 +590 +379 +28877 +30650 +10750 +28317 +29483 +31520 +25237 +8961 +19 +18951 +22464 +7233 +31521 +345 +31522 +31523 +30921 +31524 +31525 +31526 +29799 +745 +31527 +31528 +15718 +31529 +24952 +9132 +31530 +14301 +2009 +31531 +8367 +3465 +31532 +30877 +24864 +28317 +31533 +5085 +31534 +31535 +8668 +31536 +24302 +16444 +31537 +446 +31293 +3553 +2259 +31538 +31539 +25237 +590 +30309 +31540 +30877 +491 +2187 +31541 +31542 +31543 +31544 +5659 +27069 +958 +31545 +196 +31546 +31293 +31547 +24207 +13721 +31548 +865 +2117 +18695 +345 +31197 +2515 +24896 +665 +13919 +31549 +1019 +1937 +31550 +15718 +31551 +31552 +22063 +1905 +14369 +9 +820 +15718 +1716 +201 +286 +19883 +16118 +31553 +7053 +31554 +31555 +15718 +31556 +284 +4463 +31557 +31558 +533 +31559 +31560 +26361 +5627 +31561 +31562 +77 +286 +31563 +14330 +31564 +29381 +30224 +7855 +854 +19618 +31565 +31566 +31567 +2728 +936 +29109 +29483 +373 +89 +337 +1831 +4144 +31568 +28317 +30309 +10 +15 +31569 +31570 +6991 +13721 +31571 +970 +25097 +31572 +5780 +9578 +10407 +7053 +358 +43 +213 +15 +31573 +31574 +16640 +31575 +8247 +29032 +12987 +31576 +31577 +25237 +24725 +7053 +43 +31578 +46 +31579 +30551 +31580 +24864 +3546 +213 +11838 +30921 +213 +31581 +31582 +284 +31583 +11607 +11754 +5780 +14477 +27669 +25943 +345 +274 +25943 +31584 +27473 +213 +29381 +31585 +15370 +1458 +16656 +10 +31586 +31587 +30877 +19618 +26647 +31588 +31589 +31590 +43 +2314 +27669 +29200 +31591 +1768 +9 +564 +1021 +286 +5707 +31592 +286 +29483 +4918 +2086 +6557 +31593 +9 +18607 +970 +11571 +337 +1051 +26190 +31594 +31595 +274 +19095 +3546 +21947 +9335 +31596 +284 +2993 +29032 +31597 +155 +21947 +2356 +31598 +31599 +554 +31600 +31601 +10356 +14477 +17 +720 +31602 +30877 +554 +2728 +28317 +6766 +31603 +11210 +31604 +43 +31605 +9 +1559 +18561 +31606 +14 +668 +23806 +3553 +31607 +19655 +31608 +31609 +590 +31610 +31611 +21947 +25140 +31612 +31613 +677 +31614 +1517 +15 +29628 +337 +31615 +31616 +31617 +29483 +66 +31618 +31619 +31620 +31621 +31622 +22 +5188 +22963 +29791 +25097 +337 +31623 +4808 +29483 +31624 +5188 +2694 +25237 +4242 +25109 +31625 +31626 +31627 +22 +13840 +12067 +31628 +2029 +4606 +13349 +19 +24896 +3575 +3457 +21126 +31629 +14477 +31630 +30877 +19372 +17997 +31631 +586 +31632 +12987 +31633 +303 +16472 +43 +31634 +1244 +31635 +32 +4174 +1862 +31636 +31637 +14369 +14330 +31638 +17039 +1745 +15718 +24403 +12987 +31639 +15718 +31640 +6736 +791 +66 +31641 +31642 +31643 +21947 +16437 +29483 +31644 +590 +31645 +30877 +2289 +25140 +43 +31646 +31647 +36 +15718 +9 +590 +29576 +31648 +31649 +24045 +1414 +43 +31650 +3 +18919 +2 +31651 +185 +21947 +31652 +31653 +31654 +31655 +31656 +1047 +31657 +31658 +13150 +31659 +30877 +317 +337 +2 +4055 +31660 +31661 +671 +2694 +28317 +19852 +3546 +31662 +1956 +29483 +1090 +14330 +5976 +25723 +15584 +736 +32 +178 +31663 +377 +3067 +730 +21947 +31664 +17144 +15 +5820 +31665 +2694 +517 +31666 +6459 +43 +25402 +13721 +31667 +12013 +19618 +31381 +11224 +5041 +24864 +882 +31668 +10 +970 +4808 +720 +18418 +31669 +29483 +248 +31670 +25140 +31671 +25943 +345 +3477 +590 +31672 +57 +31673 +4055 +31674 +31675 +24896 +13721 +245 +30224 +19618 +22868 +31676 +31677 +2260 +30458 +29204 +18136 +29483 +21031 +7137 +30877 +142 +14603 +9 +31678 +14369 +1604 +31679 +21947 +31680 +31681 +31682 +31683 +736 +31684 +16413 +14216 +7835 +17907 +18982 +2733 +25140 +5435 +590 +28549 +31685 +31686 +31687 +27939 +379 +31688 +31689 +31690 +31691 +38 +43 +15718 +28013 +31692 +337 +26361 +613 +31693 +6086 +112 +31694 +1384 +31695 +28140 +5780 +9 +13150 +7855 +32 +9 +31696 +31697 +31698 +31699 +10356 +2 +76 +2476 +2577 +249 +1208 +3104 +22075 +1423 +3470 +31700 +349 +15483 +24864 +27681 +13566 +1157 +1765 +31701 +12267 +5344 +20058 +43 +17151 +31702 +21776 +23841 +30877 +32 +590 +1012 +8798 +1224 +345 +31703 +19618 +1011 +3739 +24896 +19618 +611 +12788 +24896 +9 +31704 +31705 +3335 +15504 +2990 +1716 +31706 +14363 +1208 +31707 +4026 +1090 +1090 +179 +1051 +770 +8263 +24896 +286 +30051 +22 +337 +31708 +5085 +31709 +31710 +17151 +31711 +31712 +31713 +1765 +31714 +28500 +31715 +9 +1212 +31716 +31717 +27719 +9 +24144 +3 +31718 +19618 +345 +43 +31719 +31720 +4 +31721 +31722 +24725 +29381 +5387 +28441 +43 +28317 +31723 +18951 +31724 +31725 +14369 +15718 +9 +57 +5007 +31726 +22098 +29381 +16377 +29483 +31727 +345 +19 +22986 +9 +31728 +2769 +24725 +31729 +4028 +27669 +17151 +590 +31730 +29381 +14363 +31731 +24371 +590 +43 +2286 +286 +31732 +19852 +222 +24303 +11321 +590 +1115 +14330 +8967 +533 +17749 +2019 +14 +31733 +3546 +14477 +2 +30655 +20952 +590 +21947 +20792 +30877 +31734 +18951 +25683 +31735 +1514 +31736 +31737 +43 +31738 +14369 +30580 +31739 +6627 +31740 +43 +21947 +31741 +31742 +31743 +2976 +25943 +31744 +104 +19 +31745 +31746 +31747 +31748 +18695 +4124 +31749 +31750 +31751 +31752 +31753 +30877 +22963 +43 +18568 +31754 +31755 +25164 +2064 +1316 +15448 +14477 +13325 +43 +21947 +12987 +29463 +21947 +31756 +31757 +17151 +590 +30877 +9194 +19 +31758 +272 +5601 +31759 +3055 +30877 +42 +31760 +2694 +402 +3546 +30877 +31761 +14363 +31762 +590 +31763 +861 +15989 +554 +31764 +31765 +1224 +31766 +910 +9 +17920 +8668 +155 +31767 +554 +19585 +31768 +26496 +31293 +3406 +31769 +31770 +31293 +31771 +31772 +26779 +27110 +31773 +43 +272 +27279 +9 +379 +164 +19618 +272 +31774 +24864 +861 +566 +590 +31775 +31776 +2764 +8037 +14477 +751 +4028 +349 +23103 +3 +30851 +29483 +31777 +31778 +31779 +5085 +20517 +57 +20785 +31780 +10580 +179 +1100 +24045 +6499 +5438 +31781 +15718 +31782 +29483 +31293 +26744 +16966 +31783 +31784 +970 +31785 +31786 +31787 +770 +24864 +31788 +13721 +19404 +43 +31789 +31790 +31791 +25991 +10 +28441 +31792 +4805 +15481 +43 +31793 +24765 +26361 +31794 +19585 +8249 +3999 +590 +29381 +597 +21947 +31795 +31796 +1090 +31797 +3790 +15183 +23368 +14832 +25140 +31798 +28295 +1870 +31799 +4128 +31800 +25584 +26724 +1382 +738 +196 +31801 +43 +5415 +21947 +27069 +31802 +19 +31803 +31804 +31805 +25140 +31806 +379 +31807 +43 +27669 +1514 +242 +31808 +31809 +3764 +31810 +31811 +31812 +29799 +27069 +29951 +31813 +2260 +31814 +7357 +1356 +19618 +23103 +31815 +31816 +26011 +795 +1465 +21261 +10139 +31817 +31818 +104 +57 +14363 +31819 +31820 +29483 +29289 +21947 +1208 +27069 +1612 +43 +26040 +31821 +27448 +31822 +66 +31823 +29381 +31824 +5908 +21947 +703 +31720 +31825 +138 +4550 +402 +338 +31826 +14 +19655 +31827 +3061 +590 +1262 +484 +28441 +31828 +29849 +13848 +25140 +179 +345 +31829 +4793 +24045 +590 +1961 +21947 +4244 +29483 +10038 +28317 +31830 +3546 +31831 +30224 +27719 +8110 +31832 +8255 +25683 +590 +31833 +19868 +43 +2260 +14477 +19 +31834 +284 +28317 +31835 +9 +2764 +31836 +24896 +9 +31837 +43 +3301 +4468 +29483 +7137 +31838 +31839 +29381 +43 +24951 +31840 +282 +13721 +31841 +31842 +1942 +21095 +1559 +31843 +31844 +21947 +31845 +1562 +4855 +8675 +31846 +1513 +31847 +28000 +284 +14330 +1524 +31848 +43 +31849 +31850 +31851 +3546 +21776 +5629 +284 +14947 +17112 +31852 +1384 +286 +104 +707 +19 +26680 +20700 +21947 +176 +26680 +66 +25237 +31853 +31854 +29628 +31855 +31856 +31857 +13721 +31858 +248 +286 +43 +31859 +576 +16618 +590 +1090 +10717 +16205 +3417 +10578 +5022 +590 +5976 +19618 +8950 +31860 +31861 +25140 +25683 +31862 +31863 +1563 +303 +31864 +4441 +3095 +2314 +18920 +31865 +713 +31866 +13848 +9 +25237 +57 +9 +31867 +31868 +16391 +11762 +16437 +495 +303 +29381 +5085 +337 +19404 +31869 +31870 +1136 +43 +31871 +31872 +6518 +31873 +31874 +29200 +31875 +5627 +31876 +19618 +31877 +31878 +24458 +788 +31879 +5188 +24253 +5119 +7053 +31880 +23103 +31881 +31882 +373 +720 +540 +31883 +31884 +27159 +1907 +31885 +237 +13307 +31886 +24896 +3353 +31887 +597 +3546 +31888 +1224 +31889 +2733 +303 +31890 +248 +595 +31891 +284 +4441 +9707 +66 +21947 +20340 +12159 +31892 +31893 +196 +9351 +31894 +31895 +27798 +23103 +31896 +21947 +17151 +30260 +3044 +31897 +57 +31898 +31899 +31900 +31901 +43 +9 +29483 +31902 +25140 +31903 +970 +31904 +26706 +19918 +89 +43 +4055 +9 +31905 +303 +31906 +20058 +29483 +9 +27843 +53 +31907 +31908 +5852 +25140 +14001 +31909 +2577 +1524 +28804 +31910 +31911 +411 +32 +5614 +31912 +14947 +12573 +30143 +31913 +31914 +2550 +31915 +155 +30650 +791 +15718 +14330 +31916 +31917 +9 +31918 +15428 +31919 +31920 +21947 +31921 +29483 +25237 +4717 +42 +21207 +29483 +31922 +3546 +24026 +13848 +14330 +31923 +337 +31924 +8367 +21947 +31925 +14898 +29770 +26738 +31926 +179 +20616 +31927 +31928 +31929 +5188 +31930 +29381 +31931 +31932 +31933 +1113 +15629 +21947 +31934 +31935 +286 +716 +31936 +31937 +24144 +554 +31938 +31939 +20616 +323 +31940 +1716 +379 +15541 +970 +29381 +31941 +31942 +31943 +31944 +21689 +18394 +8263 +31945 +25159 +29381 +31946 +86 +57 +15718 +31293 +31947 +31948 +31949 +31950 +25659 +31951 +1083 +21776 +31952 +29381 +29483 +13721 +31953 +15718 +9 +27719 +29381 +31954 +9501 +189 +536 +30347 +30209 +29434 +31955 +31956 +31957 +31958 +31959 +31960 +861 +31961 +31962 +590 +11056 +736 +31963 +573 +24063 +31964 +31965 +21947 +213 +209 +31966 +345 +27069 +5083 +3546 +31967 +31968 +31168 +31969 +31970 +8030 +31971 +31972 +21889 +24864 +43 +31973 +31974 +28317 +15718 +31975 +352 +15718 +169 +576 +31976 +31977 +892 +20871 +31293 +31978 +4820 +3745 +14330 +412 +26136 +31168 +21394 +31979 +12956 +28317 +28317 +970 +31980 +31981 +12166 +12907 +14532 +4441 +19939 +31098 +1249 +43 +14369 +31982 +31983 +31984 +31985 +31986 +15718 +18503 +31987 +24896 +5614 +23103 +683 +31988 +31989 +25053 +339 +31990 +31991 +3317 +31992 +31993 +31994 +16205 +31995 +31996 +31997 +345 +31998 +597 +31999 +32000 +9 +19091 +24907 +30877 +32001 +9688 +32002 +25659 +60 +32003 +1224 +6873 +32004 +9 +1823 +5865 +18503 +3546 +32005 +12987 +464 +32006 +32007 +9048 +4 +1615 +32008 +21947 +1090 +30877 +32009 +32010 +138 +32011 +1314 +32008 +1437 +6557 +32012 +32013 +32014 +2136 +32015 +22420 +6171 +22411 +32016 +32017 +32018 +32019 +29798 +13721 +21031 +21947 +1356 +32020 +21947 +32021 +32022 +29381 +32023 +7987 +6382 +317 +21947 +21947 +7977 +1300 +31293 +23111 +32024 +43 +21947 +13484 +590 +32025 +32026 +32027 +32028 +14604 +21504 +32029 +696 +5297 +6595 +14477 +32030 +32031 +32032 +25140 +21863 +25584 +18045 +24896 +32033 +15718 +32034 +3908 +12202 +19 +1112 +1920 +18695 +32035 +19 +43 +21947 +32036 +16571 +7619 +32037 +25584 +1382 +2243 +1444 +32038 +32039 +32040 +16413 +32041 +31603 +43 +331 +31293 +9 +9560 +720 +14369 +915 +32042 +32043 +32044 +32045 +32046 +32047 +791 +32048 +32049 +1332 +32050 +31860 +345 +178 +32051 +14369 +2700 +32052 +32053 +12400 +21698 +32054 +9410 +16 +2697 +25683 +32055 +590 +209 +32056 +1249 +2243 +17151 +16437 +19 +3626 +1226 +32057 +32058 +8297 +32059 +248 +27669 +32060 +13721 +2302 +32061 +32062 +66 +30877 +32063 +32064 +32065 +1442 +213 +19091 +78 +30877 +28317 +1320 +32066 +30224 +32067 +303 +32068 +590 +21947 +28549 +29836 +32069 +32070 +32071 +345 +32072 +2591 +24864 +9 +32073 +338 +22963 +3353 +28317 +32074 +284 +19 +6732 +12798 +1425 +2314 +26724 +6072 +21947 +18792 +337 +30877 +15718 +32075 +590 +745 +32076 +915 +32077 +32078 +32079 +28317 +28549 +14330 +1234 +32080 +32081 +1295 +5188 +32082 +5780 +213 +25683 +14870 +13765 +865 +9160 +38 +32083 +32084 +18112 +10482 +213 +31293 +590 +9 +4441 +4278 +30260 +43 +14000 +32085 +2919 +699 +32086 +713 +32087 +29109 +201 +32088 +32089 +970 +32090 +751 +29483 +32091 +21947 +5791 +30224 +5627 +29387 +303 +29483 +32092 +19 +32093 +43 +3044 +32094 +303 +32095 +15718 +32096 +19009 +32097 +232 +2941 +28549 +32098 +32099 +25683 +14 +15718 +32100 +32101 +32102 +286 +66 +13897 +32103 +32104 +32105 +23706 +5188 +736 +13296 +32106 +32107 +13781 +24864 +32108 +18234 +10500 +1907 +32109 +14369 +20871 +9 +32110 +284 +2577 +590 +201 +109 +590 +32111 +16 +23547 +284 +32112 +25683 +32113 +541 +32114 +25683 +20514 +32115 +32116 +32117 +1454 +32118 +2155 +564 +32119 +30877 +1103 +30877 +4606 +337 +30877 +17151 +536 +9 +26744 +30877 +32120 +27178 +8460 +32121 +32122 +29981 +1226 +138 +590 +7835 +32123 +29483 +21947 +32124 +22 +686 +15718 +21377 +4388 +1018 +31293 +32125 +3546 +32126 +32127 +32128 +20 +590 +28522 +32129 +6122 +32130 +32131 +13279 +5908 +32132 +16121 +233 +32133 +32134 +970 +1384 +138 +17809 +28753 +14660 +30224 +1100 +32135 +32136 +32137 +6110 +32138 +27669 +32139 +19 +3 +29381 +1090 +3546 +9 +6095 +4954 +32140 +32141 +77 +2043 +1838 +491 +2525 +590 +272 +20232 +26736 +13594 +12097 +32142 +3875 +16511 +32143 +5344 +2577 +18503 +756 +16437 +32144 +14330 +1920 +9705 +1444 +32145 +32146 +1637 +29956 +31168 +9 +15481 +32147 +29483 +13260 +32148 +9 +27849 +32149 +14330 +2415 +29483 +21947 +10583 +24725 +10262 +1047 +3994 +32150 +11452 +32151 +31168 +736 +25237 +536 +23519 +25943 +15594 +32152 +32153 +345 +5893 +12005 +970 +21947 +12387 +32154 +357 +14947 +6086 +32155 +18346 +9 +18200 +17151 +26040 +5627 +31364 +24303 +15382 +18307 +1082 +25237 +1090 +3480 +32156 +9 +32157 +32158 +22986 +32159 +32160 +29381 +13675 +671 +29032 +32161 +32162 +21947 +32163 +32164 +11808 +3546 +32165 +32166 +7835 +29200 +32167 +32168 +411 +349 +24303 +19 +29 +32169 +19 +20 +112 +29381 +28490 +590 +32170 +32171 +19 +15804 +25140 +1018 +32172 +32173 +15718 +10933 +4403 +32174 +29661 +32175 +32176 +19618 +18045 +29381 +32177 +32178 +29200 +32179 +3548 +970 +30224 +43 +25140 +1335 +17670 +32180 +32181 +677 +7137 +32182 +30515 +21947 +32183 +13648 +31293 +32184 +115 +22960 +3484 +24332 +32185 +3059 +32186 +514 +18265 +936 +9 +32187 +32188 +1502 +89 +32189 +32190 +32191 +32192 +32193 +15 +31493 +25140 +21947 +3635 +21947 +7855 +20 +14369 +2673 +15167 +3470 +29483 +590 +4055 +22963 +9548 +32194 +32195 +32196 +7855 +24339 +10348 +32197 +1112 +32198 +25683 +25 +32199 +32200 +32201 +30051 +15 +32202 +32203 +15 +576 +32204 +32205 +1508 +5085 +14369 +20315 +21112 +24725 +32206 +32207 +15718 +13721 +32208 +19218 +3546 +32209 +21947 +32210 +32211 +7053 +9402 +554 +19238 +32212 +13721 +32213 +274 +9 +32214 +32215 +32216 +14563 +21947 +10 +24864 +32217 +915 +17144 +28549 +15497 +1824 +32218 +6302 +32219 +16839 +5097 +27669 +6294 +32220 +19624 +32221 +1012 +8188 +1870 +32222 +29483 +28549 +18048 +286 +32223 +30051 +22922 +32224 +32225 +32226 +31053 +29381 +1051 +32227 +32228 +26060 +32229 +59 +32230 +13474 +25778 +15 +29483 +42 +377 +19974 +7746 +32231 +32232 +32233 +590 +5780 +32234 +25683 +3050 +43 +32235 +3543 +32236 +32237 +32238 +7835 +29483 +14604 +3759 +24303 +1332 +32239 +5204 +590 +32240 +23507 +32241 +32242 +32243 +2733 +3081 +15718 +32244 +30577 +32245 +32246 +14120 +32247 +32248 +24725 +32249 +15718 +14477 +23226 +10818 +32250 +29483 +32251 +32252 +4684 +43 +29483 +32253 +32254 +3421 +32255 +1356 +32256 +3119 +32257 +32258 +26361 +32259 +57 +32260 +27798 +3484 +590 +32261 +32262 +31293 +3553 +32263 +590 +32264 +25140 +32265 +21698 +11702 +323 +27669 +28317 +4196 +1727 +1743 +237 +1927 +30877 +26355 +5188 +32266 +30877 +357 +892 +32267 +32268 +10 +32269 +32270 +32271 +3543 +32272 +8036 +32273 +17151 +349 +32274 +32275 +32276 +8668 +665 +14 +155 +3030 +4055 +32277 +29984 +19 +3484 +15245 +32278 +31225 +15718 +1720 +32279 +28549 +1012 +32280 +12479 +19995 +32281 +32282 +323 +32283 +24303 +27918 +30877 +27669 +24907 +14330 +26952 +11286 +32284 +32285 +10 +32286 +32287 +14369 +27260 +4550 +24050 +21371 +99 +30877 +1992 +26119 +1458 +32288 +32289 +89 +249 +6741 +32290 +1562 +32291 +155 +32292 +32293 +43 +4242 +25943 +32294 +14369 +32295 +32296 +39 +971 +590 +1090 +3995 +30051 +32297 +32298 +32299 +1208 +10791 +32300 +3635 +15356 +27669 +32301 +2562 +32302 +32303 +265 +32304 +357 +3546 +32305 +32306 +32307 +9 +720 +5601 +27260 +1437 +29007 +32308 +32309 +31293 +1090 +32310 +5627 +32311 +10869 +9139 +9573 +32312 +25943 +3406 +1817 +30877 +14369 +9210 +32313 +32314 +32315 +32316 +4820 +25659 +16102 +32317 +5577 +32318 +28549 +19927 +590 +11027 +32319 +1612 +32320 +32321 +32322 +5764 +21947 +22793 +20315 +1531 +9900 +13457 +32323 +32324 +27669 +1090 +14363 +4245 +1044 +32325 +279 +11995 +176 +32326 +16763 +5908 +32327 +13566 +9 +379 +43 +6217 +32 +32328 +970 +14648 +32329 +8188 +25140 +32330 +349 +13129 +32331 +13405 +6086 +25829 +1502 +32332 +9 +448 +19618 +1716 +18695 +23603 +32333 +32334 +20185 +24896 +30877 +1790 +8668 +32335 +19 +14343 +14477 +67 +6620 +573 +32336 +32337 +9 +32338 +32339 +24864 +32275 +32340 +32341 +32342 +1352 +9396 +25683 +1090 +2064 +2832 +19 +9 +24864 +24253 +11762 +249 +1011 +89 +20599 +32343 +28549 +25140 +28490 +31293 +286 +590 +3546 +43 +28317 +31293 +89 +323 +32344 +43 +15 +32345 +32346 +15914 +29483 +19618 +32347 +32348 +32349 +25237 +32350 +32351 +6116 +18982 +1208 +32352 +28549 +23103 +2806 +25683 +17082 +32353 +27669 +18914 +32354 +29483 +2243 +32355 +32356 +32357 +32358 +2 +4230 +28441 +5780 +272 +210 +2410 +32359 +32360 +32361 +27669 +4765 +30224 +31691 +43 +15 +32362 +32363 +32364 +590 +13848 +26047 +32365 +3546 +32366 +25237 +32367 +15481 +32368 +26060 +32369 +13150 +32370 +7208 +1047 +32371 +1356 +4055 +32372 +32373 +32374 +30551 +3546 +19 +16437 +32375 +6441 +1710 +2035 +720 +4436 +30388 +32376 +32377 +29956 +27669 +1503 +23103 +32378 +32379 +222 +25659 +32380 +24303 +15398 +648 +3604 +671 +29047 +32381 +30580 +6072 +3546 +14330 +32382 +33 +18695 +819 +4651 +19 +43 +32383 +32384 +43 +30877 +29483 +32385 +29483 +32386 +32387 +1090 +1245 +25624 +21090 +1817 +32388 +32389 +14604 +27719 +927 +32390 +15718 +30877 +32391 +32392 +32393 +32394 +19 +32395 +32396 +14 +1559 +27669 +32397 +29032 +8905 +9 +4055 +32398 +736 +32399 +32400 +2427 +31637 +19 +27669 +32401 +32402 +32403 +32404 +32405 +25683 +2029 +32406 +31293 +32407 +4055 +4055 +43 +416 +24725 +201 +32408 +344 +24303 +14001 +3376 +32409 +103 +32410 +9 +32411 +176 +7014 +43 +32412 +32413 +5773 +32414 +14647 +104 +10727 +43 +21689 +32415 +29483 +17402 +21947 +32416 +32417 +9 +5188 +43 +32418 +31098 +31637 +25683 +3480 +24403 +2093 +28549 +32419 +590 +9 +27669 +26496 +32420 +3546 +32421 +22963 +32422 +32423 +32424 +32425 +32426 +24864 +4028 +286 +18429 +3994 +14369 +14330 +32427 +43 +18045 +3546 +31668 +21576 +11056 +26744 +3857 +4682 +31434 +849 +32428 +2009 +27069 +4055 +26496 +21947 +15765 +31637 +25683 +533 +32429 +31637 +32430 +24154 +586 +32431 +5326 +29381 +15 +1198 +32432 +28000 +32433 +1812 +32434 +32435 +6122 +30877 +1688 +32436 +25140 +13430 +32437 +32438 +27669 +32439 +32440 +7137 +1090 +345 +32441 +32442 +2944 +32443 +138 +32444 +15 +32445 +228 +32446 +28901 +23103 +13721 +3546 +32447 +28317 +22236 +32448 +14424 +32449 +32450 +32451 +32452 +2 +11762 +15342 +3553 +32453 +24303 +12053 +32454 +3994 +2259 +92 +9 +32455 +29799 +27069 +9497 +21947 +27669 +32456 +5188 +32 +32457 +13317 +25237 +590 +31995 +4055 +4547 +4023 +7855 +14477 +14 +1310 +9 +32458 +32459 +323 +12987 +6341 +30877 +25316 +1425 +32460 +23103 +13829 +910 +32461 +32462 +32463 +10280 +21776 +32464 +15018 +7253 +25683 +43 +32465 +3239 +32466 +32467 +1961 +23103 +32468 +32469 +32470 +18695 +379 +32471 +32472 +32473 +6968 +25237 +6621 +32474 +272 +30877 +32475 +11930 +970 +12340 +1596 +1812 +26496 +32476 +13943 +29483 +8849 +32477 +23216 +32478 +32479 +7694 +671 +9 +4765 +14603 +1316 +1615 +31293 +25237 +32480 +32481 +533 +2944 +8465 +32482 +4387 +32483 +30224 +32484 +9 +12916 +32485 +32486 +2035 +590 +32487 +26361 +10 +32488 +32489 +4242 +32490 +201 +32491 +30877 +1524 +590 +32492 +24919 +32493 +178 +8188 +21947 +25683 +19 +18364 +32494 +16437 +32495 +32496 +590 +32497 +32498 +53 +26361 +3546 +29381 +32499 +14909 +9 +358 +28317 +32500 +32501 +3666 +30877 +29204 +32360 +30877 +24864 +32502 +43 +7900 +2764 +12304 +4055 +32503 +21947 +30309 +32504 +3553 +32505 +590 +32506 +3559 +32507 +28665 +32 +8721 +10601 +14369 +21947 +3416 +28301 +18568 +9 +32508 +1961 +32509 +9259 +32510 +2692 +32511 +32512 +519 +7855 +595 +32513 +17082 +9 +4441 +155 +14330 +3546 +32514 +9705 +10 +2101 +25237 +7835 +284 +21947 +2550 +19618 +32515 +32516 +43 +3067 +11482 +32517 +25140 +1559 +32518 +23688 +1316 +32519 +1011 +2577 +1517 +20 +32520 +32521 +3119 +20952 +32522 +8465 +32523 +32524 +29200 +370 +1562 +32525 +1382 +30877 +32526 +5393 +9 +14001 +397 +9 +32527 +3546 +32528 +31293 +32529 +25683 +2769 +24864 +491 +31293 +3242 +32530 +30516 +32531 +583 +9 +13721 +5022 +14330 +14369 +303 +286 +29503 +213 +25943 +25683 +12304 +32532 +32533 +284 +32534 +32535 +32536 +971 +32537 +6595 +11273 +284 +15758 +213 +32538 +1244 +32539 +5806 +32540 +671 +4055 +29483 +248 +43 +14369 +284 +27669 +554 +32541 +1090 +18763 +1090 +25683 +9 +29822 +14330 +13317 +284 +32542 +1539 +32 +349 +32543 +32544 +2457 +28644 +19347 +3544 +32545 +31293 +21957 +14477 +17151 +14330 +213 +32546 +32547 +32449 +3601 +32548 +11762 +96 +3381 +32549 +6496 +19655 +12916 +533 +2410 +5125 +19 +1090 +14855 +23103 +3553 +32550 +32551 +27378 +286 +337 +17767 +32552 +248 +32553 +32554 +32555 +57 +32556 +1529 +32557 +155 +32558 +26020 +14369 +43 +25140 +32559 +30877 +32560 +104 +32561 +188 +32562 +19618 +1112 +30877 +28317 +30051 +7053 +9 +14 +32563 +29434 +14887 +337 +27514 +25584 +21031 +26744 +32564 +1224 +32565 +14369 +32566 +32567 +1168 +5780 +43 +32568 +32569 +15718 +27669 +32570 +32571 +9 +1090 +19 +19646 +21536 +32572 +12907 +21089 +3994 +352 +29381 +15240 +25584 +21947 +32573 +29679 +19655 +32574 +536 +213 +8540 +23103 +1415 +32575 +32576 +4055 +1090 +19478 +14856 +4055 +32577 +6571 +27669 +32 +30051 +337 +32578 +32579 +32580 +25237 +89 +32581 +5085 +15824 +213 +2649 +32582 +32583 +14 +32584 +14369 +303 +3330 +32585 +19655 +17635 +32586 +4055 +12 +12907 +77 +10748 +590 +30877 +3908 +14 +21947 +365 +141 +286 +24303 +31293 +32587 +9863 +32588 +1637 +19335 +32589 +178 +32590 +32591 +32592 +32593 +36 +25683 +19 +6171 +6656 +30877 +30224 +32594 +32595 +22989 +20666 +32596 +99 +738 +9 +5299 +32 +19 +21947 +30877 +31293 +21947 +32597 +32598 +14369 +32599 +2733 +32600 +32601 +2577 +27427 +2787 +20339 +18684 +14947 +1517 +32602 +4055 +10 +32603 +4463 +176 +32604 +32605 +43 +9 +27069 +25683 +1301 +15235 +43 +24303 +30877 +32606 +639 +1051 +971 +9497 +1870 +25237 +3484 +9 +32607 +32608 +32609 +29628 +1013 +32610 +13528 +9445 +32611 +5650 +25868 +32612 +3959 +17151 +2035 +32613 +32614 +9 +2694 +32615 +24628 +27096 +32616 +21835 +14477 +32617 +12095 +29381 +1100 +22 +30854 +6095 +32618 +13956 +3128 +42 +15331 +32619 +14947 +13875 +31293 +3610 +32620 +10482 +32621 +222 +665 +32622 +28317 +3978 +22 +9 +31733 +32623 +24423 +32624 +484 +8188 +32625 +3976 +32626 +32627 +1364 +15897 +32628 +373 +32629 +32630 +21947 +4944 +1870 +26496 +32631 +32632 +31098 +30877 +14369 +29483 +17151 +13961 +17670 +849 +32 +8015 +11873 +28494 +3994 +1524 +24862 +829 +32633 +32634 +32635 +32636 +248 +15718 +694 +26787 +32637 +32638 +15845 +32639 +32640 +32641 +19618 +32642 +31637 +2694 +5662 +32643 +15718 +2314 +13721 +286 +11341 +22986 +24303 +415 +2733 +25683 +23037 +32644 +25 +554 +31637 +32645 +32646 +43 +32647 +1524 +14369 +32648 +32649 +248 +32650 +32651 +32652 +14066 +21947 +14869 +616 +32653 +25140 +8150 +29483 +15718 +32654 +32655 +24743 +32656 +32657 +20600 +32658 +29275 +32659 +1066 +22621 +32660 +704 +32661 +32662 +22455 +30170 +5614 +15510 +32663 +30224 +9894 +32664 +32665 +3743 +590 +32666 +284 +32667 +32668 +32669 +13012 +25683 +32670 +9254 +27069 +3553 +1090 +3743 +9784 +25683 +24303 +32671 +32672 +32673 +32674 +554 +3746 +1090 +9 +32675 +32676 +32677 +32261 +21947 +590 +32678 +19489 +32679 +250 +1090 +29200 +134 +1082 +971 +32680 +5212 +32681 +19 +25683 +19618 +32682 +32683 +29483 +32684 +9 +30458 +2132 +736 +26361 +32685 +4278 +19 +193 +32686 +43 +14363 +16656 +21689 +32687 +32688 +14330 +11762 +21031 +32689 +32690 +2764 +2035 +32691 +32692 +14485 +971 +53 +32693 +32694 +11907 +14330 +3546 +2136 +32695 +32696 +31234 +416 +32697 +14660 +10775 +7960 +32698 +17064 +32699 +6877 +17951 +32700 +822 +10880 +32701 +5801 +32702 +32703 +5188 +32704 +32705 +20952 +5204 +26328 +32706 +19478 +2668 +27669 +32707 +32708 +20551 +28845 +590 +32709 +24154 +1131 +10789 +284 +25960 +29204 +21947 +32710 +24952 +21947 +196 +1808 +4441 +15537 +46 +15718 +32711 +32712 +379 +32713 +32714 +15493 +21753 +32715 +43 +19 +1153 +104 +32716 +32717 +32718 +590 +32719 +22901 +373 +29032 +32720 +32721 +32722 +32723 +15718 +2865 +25364 +30877 +31293 +21947 +1513 +32724 +7855 +32725 +15718 +32726 +17058 +24303 +28441 +32727 +29986 +32728 +32729 +590 +32730 +6190 +303 +30877 +9 +32731 +32732 +15370 +16640 +21947 +32733 +32734 +23103 +32563 +9 +15 +14000 +303 +32735 +32736 +99 +29483 +16571 +32737 +28961 +12401 +29483 +32738 +25991 +24464 +17897 +20617 +32739 +2 +16102 +23103 +32740 +201 +32741 +20512 +29483 +21947 +21947 +32742 +32743 +22922 +32744 +3546 +29483 +19 +32745 +12236 +32746 +259 +26496 +29483 +32747 +31293 +32748 +5438 +32749 +590 +32750 +9573 +155 +15718 +32751 +29483 +1090 +14330 +30051 +22922 +5188 +6161 +15 +29200 +13721 +10642 +32752 +36 +32753 +213 +19797 +31293 +317 +989 +31042 +14369 +1710 +1765 +104 +32754 +21947 +9928 +17136 +44 +31098 +32755 +32756 +28036 +30650 +32757 +1109 +32758 +7291 +32759 +2318 +1316 +32760 +17151 +20 +32761 +14814 +32762 +32763 +398 +30224 +32764 +6086 +32765 +32766 +32767 +24435 +4195 +14369 +14771 +303 +1090 +27669 +29483 +32768 +9 +31098 +20942 +4055 +21947 +213 +1090 +2019 +19618 +43 +1051 +573 +5085 +32769 +5067 +541 +32770 +303 +411 +43 +30877 +32771 +32772 +28219 +1300 +32773 +26496 +32774 +31293 +32775 +43 +24615 +32776 +3546 +32777 +213 +1774 +971 +3 +213 +303 +19 +24864 +648 +30853 +971 +616 +30551 +32778 +29007 +32779 +32780 +20645 +1382 +26626 +19618 +178 +9 +24864 +15718 +28845 +8210 +32781 +20952 +1234 +32782 +2132 +484 +12871 +249 +3546 +5925 +32783 +32784 +2836 +32785 +24303 +31406 +32786 +13721 +377 +32787 +284 +14477 +32788 +32789 +32790 +7276 +5827 +32791 +533 +5694 +2239 +32792 +32793 +20276 +25140 +2260 +19 +14369 +872 +14477 +358 +22 +32794 +32795 +32796 +32797 +43 +32798 +43 +14 +209 +32799 +32800 +32801 +14001 +28317 +43 +66 +613 +21689 +21947 +8849 +15536 +31293 +32802 +42 +32803 +317 +32804 +32805 +32806 +3546 +13721 +32807 +23913 +20984 +32808 +32809 +4764 +21947 +32810 +14871 +32811 +32812 +1617 +1012 +30458 +10470 +32813 +32814 +14477 +23103 +30877 +5780 +32815 +32816 +25943 +29483 +8386 +29483 +32817 +2406 +32818 +31896 +32819 +32820 +3757 +15718 +11811 +32821 +270 +32822 +14477 +8188 +11762 +795 +29483 +17151 +25943 +32823 +1021 +1090 +13375 +1224 +19 +2832 +32523 +1217 +32824 +3601 +32825 +14369 +18969 +14 +29840 +21947 +14025 +19 +32826 +19 +24864 +32827 +32828 +14369 +32829 +32830 +19618 +24807 +32831 +29651 +9 +32832 +46 +590 +19618 +1090 +32833 +2117 +43 +18469 +32834 +32835 +3353 +32836 +32837 +32838 +5169 +349 +15 +155 +4747 +32839 +32840 +32841 +2560 +32842 +32843 +566 +32844 +57 +27767 +32845 +32846 +20719 +14369 +12987 +32847 +13652 +2243 +19 +590 +32848 +43 +12579 +32849 +10245 +32850 +196 +15810 +1382 +3546 +32851 +32852 +9 +155 +19 +32853 +32854 +32855 +32856 +573 +104 +2459 +358 +104 +32857 +29170 +32858 +284 +190 +566 +6994 +6499 +32859 +32860 +21947 +19 +32861 +3251 +2314 +25683 +25943 +9160 +27798 +32862 +57 +9 +872 +13897 +188 +24864 +8668 +17083 +1090 +491 +24864 +32863 +7119 +2427 +32864 +32636 +1018 +32865 +32866 +32867 +2721 +1853 +590 +32868 +14869 +25237 +32869 +32870 +14330 +209 +32871 +32872 +14477 +31293 +32873 +701 +19478 +32874 +32875 +2 +882 +4055 +24864 +29200 +4055 +30877 +32876 +18503 +21031 +32877 +590 +13963 +28893 +32878 +42 +720 +32879 +32880 +5601 +26992 +32881 +28317 +32882 +6877 +16437 +32883 +23603 +1655 +1437 +32884 +32885 +1091 +1520 +32886 +32887 +4775 +10111 +32888 +30224 +9 +32889 +23103 +32890 +29204 +25943 +27619 +279 +21947 +10450 +32891 +25140 +22963 +16584 +397 +12987 +32892 +32893 +20 +694 +2804 +32894 +32895 +43 +32896 +19 +1318 +31293 +17716 +14330 +32897 +32 +31293 +1559 +25140 +19618 +32898 +9 +3491 +25530 +32899 +32900 +31293 +3599 +32901 +2577 +43 +3546 +32902 +32903 +590 +14369 +448 +24725 +32904 +23785 +32905 +32906 +13721 +4055 +11321 +32907 +29381 +354 +12013 +24725 +43 +32908 +14369 +24961 +32909 +32910 +32911 +32912 +19618 +32913 +436 +6528 +3484 +20617 +2832 +27669 +14477 +32914 +536 +683 +13721 +178 +590 +720 +32915 +32916 +32917 +32918 +32919 +89 +32920 +15718 +14330 +21689 +7014 +1823 +30051 +29381 +26484 +89 +32921 +1604 +32922 +1262 +20096 +1817 +21947 +32923 +14 +1698 +32924 +32925 +1838 +14330 +9 +19582 +32926 +9713 +573 +1615 +595 +13129 +32927 +7137 +32 +13721 +936 +23103 +3546 +25316 +32928 +32929 +887 +32930 +29 +27748 +24725 +27599 +9 +19618 +43 +32931 +32642 +32932 +7835 +32933 +32934 +32935 +694 +2132 +16437 +6161 +32936 +3317 +32937 +1082 +32938 +15356 +19858 +25140 +32939 +32940 +22473 +10 +32941 +16527 +3546 +590 +32942 +188 +15975 +491 +32943 +26161 +27708 +1090 +24775 +32944 +14 +32945 +32946 +6110 +32386 +3231 +19318 +21689 +32449 +32947 +30224 +32948 +188 +32949 +32950 +9125 +32951 +345 +32952 +32953 +32954 +32955 +237 +31293 +19 +32956 +19618 +2971 +15718 +32957 +17151 +3599 +5659 +7835 +32958 +43 +32959 +1154 +14477 +4856 +32960 +7835 +30877 +28239 +11191 +14369 +32961 +31293 +11568 +32962 +872 +21835 +32963 +17830 +27096 +30215 +32964 +32965 +32966 +32967 +32 +22307 +4547 +20941 +24303 +32968 +9 +10320 +7292 +8787 +3553 +827 +9 +21947 +3026 +32969 +32970 +29979 +32971 +12462 +32972 +32973 +9 +4550 +6764 +28549 +32974 +57 +2260 +24303 +32975 +32976 +2832 +15536 +32977 +20462 +3 +29381 +2953 +25237 +564 +32978 +32979 +7835 +32980 +31293 +27069 +1046 +1517 +436 +4487 +7835 +32261 +22552 +323 +32981 +1011 +4055 +598 +411 +1234 +32982 +788 +32983 +32984 +14147 +12063 +3553 +745 +32985 +32986 +1244 +32987 +274 +32988 +21947 +19852 +4550 +4055 +1051 +25584 +14330 +32989 +15535 +32990 +32991 +19 +14343 +286 +11321 +10792 +24045 +6939 +590 +32992 +32993 +21045 +1688 +1749 +32994 +23103 +14 +9 +971 +32995 +32996 +31168 +32997 +32998 +349 +43 +665 +32999 +1765 +33000 +25237 +31293 +1765 +2694 +272 +33001 +33002 +33003 +30835 +6612 +33004 +21165 +790 +9 +4918 +33005 +33006 +12956 +27669 +671 +1300 +827 +33007 +970 +33008 +33009 +10 +1090 +23103 +590 +33010 +3546 +33011 +9 +33012 +33013 +33014 +57 +16121 +153 +32 +24725 +33015 +270 +33016 +7053 +15 +25710 +33017 +33018 +33019 +33020 +9 +17412 +43 +33021 +33022 +24303 +9 +21834 +33023 +16391 +11762 +31098 +7137 +33024 +33025 +14369 +3546 +24698 +57 +33026 +30877 +33027 +33028 +1961 +4606 +19655 +1470 +2324 +13721 +30224 +970 +1090 +16437 +33029 +4055 +33030 +26158 +5627 +14 +5041 +33031 +104 +21689 +33032 +3272 +19 +18982 +7345 +590 +14369 +2 +24045 +3959 +33033 +18684 +24 +33034 +270 +21947 +33035 +1710 +1688 +30224 +33036 +349 +26152 +33037 +19618 +20842 +31293 +33038 +24523 +3353 +155 +590 +25943 +24303 +1716 +209 +18107 +29434 +1310 +14369 +17911 +33039 +23103 +3122 +13517 +590 +33040 +33041 +33042 +33043 +7835 +21947 +33044 +33045 +33046 +33047 +13265 +1377 +33048 +29483 +9 +18695 +590 +6423 +15718 +33049 +33050 +33051 +27818 +29483 +25683 +33052 +349 +33053 +7835 +21947 +14079 +33054 +671 +17119 +33055 +8137 +11 +2004 +16102 +33056 +25382 +14477 +60 +33057 +33058 +33059 +33060 +317 +2132 +590 +13977 +14477 +24725 +33061 +970 +9 +720 +24862 +33062 +3546 +16640 +33063 +33064 +317 +21947 +33065 +694 +4441 +1364 +33066 +19 +21577 +9 +33067 +33068 +19618 +23103 +6275 +31293 +1090 +33069 +7855 +33070 +33071 +153 +9688 +357 +17151 +33072 +23454 +770 +1364 +1674 +19618 +33073 +24864 +33074 +33075 +33076 +3407 +27719 +19 +3 +33077 +12055 +21947 +33078 +5877 +22 +4884 +33079 +3601 +21947 +33080 +30051 +33081 +590 +21245 +33082 +33083 +590 +11341 +33084 +29381 +33085 +33086 +28036 +7053 +1051 +25943 +23103 +33087 +17151 +25316 +33088 +7479 +12005 +2040 +22420 +6095 +30139 +33089 +30224 +1234 +43 +1090 +15 +33090 +1920 +33091 +20886 +270 +33092 +24144 +720 +1100 +14000 +3844 +11341 +164 +25237 +2132 +15517 +27816 +27719 +33093 +33094 +19655 +29381 +33095 +19655 +1559 +4041 +33096 +9688 +686 +249 +14369 +33097 +249 +15 +14588 +20 +32636 +15718 +9 +33098 +19318 +43 +15 +9649 +21689 +33099 +4367 +6122 +21947 +21947 +33100 +29720 +30877 +66 +33101 +5904 +16466 +29483 +43 +12005 +33102 +1090 +33103 +5188 +14666 +18695 +11762 +286 +33104 +43 +30877 +33105 +25140 +14330 +33106 +590 +14553 +33107 +3353 +1154 +33108 +29381 +43 +30877 +33109 +861 +711 +20 +345 +14 +5188 +23103 +1013 +33110 +849 +21874 +14369 +33111 +21968 +33112 +8961 +25140 +13897 +25683 +28441 +19 +24725 +4055 +33113 +24725 +13777 +29628 +155 +19 +13150 +7369 +377 +20383 +14001 +33114 +33115 +590 +8038 +3546 +33116 +590 +33117 +33118 +14942 +20507 +32 +1090 +24303 +33119 +8465 +33120 +2919 +32575 +15718 +33121 +31728 +15541 +33122 +33123 +33124 +1208 +703 +33125 +25140 +33126 +32386 +33127 +15 +354 +33128 +17215 +27954 +1090 +33129 +15 +2006 +164 +19 +33130 +25237 +43 +10990 +6054 +33131 +514 +270 +12281 +33132 +9 +3337 +19655 +43 +33133 +9 +30877 +6627 +21835 +12430 +26158 +11469 +29483 +21 +33134 +342 +22065 +1001 +378 +14477 +31293 +33135 +19 +19 +31225 +28745 +33136 +5662 +27276 +2733 +33137 +17139 +970 +33138 +33139 +33140 +12185 +33141 +14216 +23103 +2733 +1524 +1208 +15718 +5085 +7053 +33142 +14330 +14369 +14477 +33143 +33144 +32642 +14 +1316 +19624 +15718 +28317 +10531 +14369 +3546 +33145 +123 +2035 +4055 +27719 +15 +76 +1937 +1013 +22573 +15318 +33146 +2410 +24449 +33147 +9 +33148 +13045 +33149 +16437 +33150 +32 +25316 +33151 +19091 +25 +13528 +1083 +33152 +33153 +2694 +33154 +21003 +33155 +33156 +33157 +33158 +33159 +33160 +60 +33161 +1251 +33162 +30224 +3546 +33163 +13566 +33164 +4055 +33165 +14330 +2243 +24045 +17151 +3353 +24303 +33166 +1045 +12684 +33167 +33168 +1870 +25237 +590 +155 +33169 +970 +99 +33170 +15 +32919 +1181 +22703 +5080 +33171 +57 +4055 +31098 +179 +32410 +6914 +11321 +14330 +25382 +989 +7381 +33172 +33173 +33174 +20 +3994 +12120 +27669 +32787 +33175 +33176 +10364 +32254 +30710 +19618 +33177 +43 +33178 +9 +18695 +32813 +2832 +519 +20 +14477 +33179 +9 +17790 +33180 +586 +33181 +33182 +25140 +9245 +29483 +33183 +33184 +31293 +33185 +25237 +33186 +33187 +33188 +14 +590 +15718 +590 +33189 +30877 +33190 +9 +29204 +1181 +3981 +379 +2356 +13307 +20510 +33191 +270 +491 +11283 +4701 +33192 +352 +27669 +20 +3601 +165 +597 +33193 +6328 +33194 +33195 +1612 +33196 +33197 +38 +16437 +33198 +33199 +519 +25683 +31293 +28317 +31978 +33200 +12120 +28441 +15718 +26127 +28482 +19918 +1224 +491 +165 +33201 +33202 +14330 +4979 +237 +43 +23394 +33203 +21947 +9 +30209 +1332 +33204 +33205 +18798 +27874 +286 +33206 +13807 +31719 +17631 +9 +14604 +43 +9845 +1517 +22669 +33207 +8256 +28036 +25281 +590 +4055 +60 +16272 +30794 +16152 +15419 +57 +24303 +33208 +1090 +14330 +33209 +33210 +19618 +33211 +9 +1683 +5316 +21947 +16437 +33212 +33213 +57 +548 +33214 +25904 +4855 +33215 +1157 +33216 +15758 +345 +1224 +33217 +33218 +6275 +33219 +19 +30877 +1236 +28317 +4274 +33220 +18372 +33221 +21689 +533 +2919 +17687 +24303 +33222 +33223 +99 +21947 +9 +14369 +28242 +33224 +33225 +32919 +9 +24864 +3359 +33226 +9 +28295 +13857 +33227 +33228 +33229 +417 +25140 +14477 +33230 +554 +9144 +4055 +12325 +99 +33231 +1047 +6877 +33232 +24864 +21947 +33233 +9 +2161 +568 +33234 +970 +647 +26040 +22918 +11683 +8668 +33235 +1961 +43 +43 +21031 +11762 +3330 +33236 +33237 +18695 +4544 +21947 +8668 +33238 +33239 +15 +23103 +31042 +25943 +33240 +33241 +971 +17151 +8407 +33242 +25237 +23226 +26496 +33243 +33244 +32 +33245 +14369 +20514 +1382 +21187 +29483 +33246 +201 +1356 +6039 +873 +228 +31098 +15511 +4185 +2561 +33247 +21507 +33248 +33249 +33250 +1066 +33251 +33252 +33253 +349 +3030 +16437 +33254 +33255 +648 +33256 +425 +19 +12 +27798 +827 +33257 +8171 +11571 +66 +8297 +33258 +8249 +33259 +1765 +21947 +590 +33260 +9 +14369 +25943 +9 +33261 +57 +12005 +665 +43 +19 +28549 +20258 +22752 +33262 +30877 +4550 +3491 +33263 +33264 +15718 +29163 +33265 +5085 +14947 +39 +2117 +17848 +29 +4006 +33266 +349 +28317 +399 +683 +970 +13754 +4055 +2804 +33267 +32 +286 +33268 +33269 +8864 +15718 +33270 +162 +33271 +590 +19478 +33272 +21627 +33273 +21947 +4414 +3546 +33274 +8967 +33275 +17730 +29381 +249 +5904 +14477 +1234 +29956 +25140 +33276 +33277 +683 +15961 +33278 +379 +33279 +6294 +33280 +17151 +33281 +33282 +33283 +18695 +19730 +43 +33284 +29381 +19618 +1612 +32 +1688 +1425 +31520 +3994 +4055 +33285 +9396 +33286 +33287 +13566 +33288 +43 +17670 +43 +1089 +19 +3055 +33289 +9 +1300 +3075 +5792 +4634 +3973 +19 +8297 +558 +36 +25237 +1529 +33290 +115 +14947 +33291 +25237 +17602 +28317 +1222 +19153 +33292 +7532 +1100 +24864 +6294 +7014 +23770 +1559 +23742 +19 +1561 +671 +1612 +43 +2733 +33293 +12203 +33294 +19618 +25316 +28036 +17749 +519 +19 +33295 +141 +14477 +33120 +24725 +14330 +33296 +33297 +33298 +30877 +31293 +33299 +17911 +33300 +1870 +33301 +33302 +33303 +354 +33304 +1090 +10356 +19655 +33305 +6161 +33306 +22023 +4805 +33307 +39 +1454 +3546 +21689 +33308 +19 +33309 +30589 +21689 +19318 +2764 +33310 +3842 +33311 +33312 +33313 +33314 +33315 +33316 +13448 +9 +2009 +33317 +809 +33318 +2804 +9 +7053 +33319 +1090 +33155 +3908 +33320 +33321 +112 +33322 +11111 +30224 +33323 +541 +30551 +1157 +22884 +33324 +3546 +6505 +1090 +6035 +33325 +286 +33326 +33327 +1520 +33328 +27669 +873 +16066 +19344 +1107 +17698 +33329 +33330 +28317 +1021 +33331 +6258 +14477 +19 +33332 +586 +16371 +478 +33333 +27669 +33334 +24969 +15683 +53 +14369 +24303 +9 +33335 +2459 +33336 +33337 +1154 +14597 +9 +53 +4411 +19491 +33338 +43 +1716 +33339 +33340 +286 +30224 +27669 +33341 +33342 +33343 +17821 +10350 +33344 +33345 +2649 +2061 +33346 +29513 +9 +683 +33347 +33348 +33349 +33350 +33351 +17151 +9 +590 +33352 +33353 +25316 +872 +25683 +286 +590 +43 +21947 +14330 +33354 +33355 +24303 +33356 +26066 +30877 +25736 +6072 +14131 +3353 +26361 +9 +23103 +1224 +3553 +14378 +33357 +2600 +33358 +1018 +31293 +33359 +1384 +15720 +564 +33360 +31098 +147 +28036 +29381 +9 +20616 +11762 +33361 +1300 +6285 +33362 +30466 +33363 +13863 +28755 +1090 +33364 +33365 +14369 +4055 +33366 +18989 +25904 +345 +33367 +29483 +30224 +33368 +32 +3546 +541 +4414 +4961 +683 +21186 +32953 +33369 +4028 +22986 +33370 +33371 +33372 +14574 +21126 +111 +966 +14604 +2449 +9 +1364 +33373 +33374 +20514 +14001 +1738 +33375 +26142 +30224 +349 +33376 +33377 +33378 +1571 +2733 +33379 +2836 +15985 +12260 +33380 +14369 +30051 +33381 +11808 +24725 +17406 +33382 +19618 +33383 +9 +25683 +590 +213 +33384 +33385 +9963 +19 +33386 +28474 +57 +15740 +33387 +33388 +9144 +3416 +33389 +33390 +30051 +21947 +590 +14017 +1090 +2550 +19095 +6364 +248 +33391 +484 +720 +15 +33392 +33393 +188 +941 +33394 +33395 +33396 +33397 +3239 +33398 +7600 +33399 +33400 +4432 +28746 +33401 +5022 +303 +4028 +1684 +1415 +14477 +25316 +19 +5582 +32421 +165 +33402 +1562 +372 +12315 +33403 +33404 +242 +19545 +17217 +19 +2356 +1961 +19 +15718 +248 +358 +33405 +33406 +317 +19 +701 +9064 +970 +337 +33407 +33408 +16579 +14102 +2517 +33409 +209 +1437 +3546 +22099 +33410 +25316 +17277 +33411 +25237 +13721 +17872 +1765 +3067 +33412 +33413 +15654 +33414 +27178 +21947 +303 +43 +33415 +1090 +30224 +33416 +12 +15718 +33417 +32 +33418 +33419 +1090 +1217 +20374 +33420 +22114 +248 +970 +33421 +31168 +665 +21689 +46 +197 +3546 +3546 +5119 +33422 +33423 +16149 +27669 +15541 +533 +28036 +33424 +27748 +30747 +22922 +21426 +29716 +33120 +4824 +22063 +1021 +9 +213 +21947 +19 +14603 +33425 +33426 +29483 +197 +9 +155 +33427 +30949 +33428 +29483 +5780 +33429 +25237 +5634 +33430 +19 +33431 +33432 +2132 +33433 +33434 +33435 +9 +538 +648 +33436 +323 +30877 +33437 +2415 +3546 +1090 +33438 +33439 +284 +2132 +2197 +33440 +30650 +33441 +33442 +3546 +33368 +969 +33443 +33444 +29597 +29172 +20952 +2325 +12228 +33445 +6086 +43 +30877 +33446 +21947 +10617 +369 +2029 +15384 +33447 +12479 +33448 +33449 +33450 +33451 +29483 +2561 +4055 +2604 +3655 +12603 +1112 +19 +24896 +303 +23351 +317 +7053 +16515 +7786 +272 +446 +43 +33452 +33453 +15718 +5088 +590 +2577 +2668 +27719 +27669 +33454 +248 +33455 +18869 +33456 +303 +4526 +13524 +9 +1090 +29859 +33457 +33458 +20 +213 +33459 +209 +3407 +1817 +33460 +4028 +971 +33461 +892 +29260 +43 +24896 +25683 +14604 +15989 +29066 +4055 +16139 +24873 +1090 +5625 +15286 +140 +665 +19 +14369 +33462 +33463 +3994 +29483 +33464 +33465 +25620 +6614 +33466 +12203 +13964 +33467 +33468 +29381 +33469 +1560 +33470 +33471 +33472 +6439 +1716 +33473 +26361 +265 +29209 +13710 +28036 +33474 +31225 +249 +33475 +1063 +33476 +33477 +33478 +5923 +33479 +33480 +209 +8668 +284 +33481 +33482 +33483 +33484 +2132 +15778 +23103 +31293 +33485 +9 +33486 +248 +33487 +554 +4055 +33488 +5188 +7014 +19 +2260 +33489 +15824 +2572 +4717 +9 +6950 +18683 +13360 +21365 +5780 +33490 +491 +6344 +4 +2410 +33491 +33492 +27669 +33493 +29981 +33494 +33495 +12013 +1444 +33496 +33497 +33498 +43 +21947 +1656 +590 +33499 +57 +33500 +33501 +12560 +25612 +1090 +33502 +14369 +1559 +33503 +29200 +33504 +1817 +33505 +323 +25316 +1817 +24982 +33506 +14 +3188 +342 +29381 +590 +21630 +33225 +1090 +2733 +519 +33507 +2459 +33508 +2 +14385 +4 +9 +165 +33509 +33510 +2457 +1332 +349 +33511 +4463 +16905 +590 +19618 +14947 +33512 +33513 +24988 +514 +720 +31098 +33514 +33515 +9 +9410 +31293 +33516 +33517 +2289 +33518 +2132 +1066 +43 +5464 +28402 +6505 +2577 +19 +1429 +21947 +15718 +3546 +9 +26104 +33519 +33520 +15718 +33521 +2121 +12987 +33522 +595 +5188 +33523 +18418 +33524 +32636 +17151 +21947 +33525 +17112 +13721 +9 +33526 +533 +7053 +33527 +31293 +590 +29483 +1513 +25351 +33528 +31098 +2577 +33529 +249 +33530 +5130 +248 +33531 +30224 +33532 +1812 +33533 +33534 +33535 +14947 +5340 +15540 +15 +33536 +33537 +33538 +13721 +9 +4055 +33539 +317 +33540 +24303 +33541 +33542 +33543 +887 +33544 +683 +28036 +345 +248 +10727 +13484 +31873 +33545 +33546 +33547 +27069 +3546 +33548 +1090 +15718 +14825 +33549 +19618 +14957 +31293 +9 +25683 +222 +33550 +1090 +33551 +491 +33552 +33553 +33554 +19 +647 +6595 +33555 +31293 +15 +9433 +265 +33556 +197 +33557 +33558 +33559 +3553 +2318 +1578 +2537 +590 +15718 +25316 +29483 +30589 +33560 +16981 +43 +2 +42 +33561 +28248 +303 +17911 +33562 +33563 +4471 +303 +33564 +21708 +7987 +33565 +33566 +13721 +32 +4990 +15718 +213 +33567 +33568 +14415 +213 +668 +33569 +9986 +30877 +9 +33570 +185 +22787 +33571 +13848 +590 +25683 +27069 +33572 +14330 +33573 +16925 +15054 +9 +1012 +33574 +9 +20 +15 +33575 +24045 +33576 +33577 +17151 +6571 +5627 +33578 +33579 +18989 +9 +2744 +33580 +30589 +222 +33581 +33582 +1013 +15 +33583 +14719 +1230 +33584 +213 +8332 +43 +6465 +25991 +33585 +768 +23464 +33586 +25683 +1090 +19304 +3369 +33587 +1123 +14282 +12 +33588 +265 +4055 +33589 +1710 +33590 +32 +33591 +33592 +11336 +14574 +43 +284 +4055 +33593 +165 +33594 +33595 +337 +2958 +33596 +2694 +33597 +33598 +29483 +11210 +284 +103 +21689 +248 +245 +33599 +28031 +3601 +33600 +8566 +736 +10230 +33601 +671 +29200 +1090 +9 +25237 +20442 +13279 +26496 +9 +33602 +25943 +2733 +33603 +8367 +33604 +2314 +21947 +18982 +27599 +11185 +1175 +33605 +33606 +21947 +29573 +398 +590 +9400 +33607 +590 +24725 +284 +8360 +33608 +33609 +25140 +24045 +33610 +2122 +30551 +33611 +823 +272 +5188 +5318 +24864 +5169 +33612 +33613 +33614 +33615 +31042 +8668 +21947 +27150 +30877 +33616 +5035 +33617 +10 +2769 +29641 +9 +9 +14527 +27669 +6058 +303 +3553 +33618 +33619 +10947 +33620 +33621 +33622 +2324 +28036 +284 +14369 +11098 +33623 +33624 +33625 +19 +1524 +179 +1542 +13905 +77 +14330 +33626 +43 +284 +33627 +9 +22407 +2568 +33628 +25584 +31293 +2310 +26544 +138 +342 +25683 +2132 +14369 +33629 +33630 +349 +7855 +28295 +7964 +18045 +20952 +33631 +16025 +2540 +446 +213 +286 +248 +14477 +1559 +590 +2694 +27669 +33632 +18312 +379 +28549 +3546 +24045 +33633 +337 +33634 +12896 +30835 +25316 +33635 +33636 +9410 +33637 +590 +33638 +284 +33639 +677 +33640 +1716 +43 +286 +24303 +33641 +15 +33642 +33643 +33644 +4550 +303 +33645 +28317 +16014 +248 +33646 +770 +10381 +33647 +345 +24460 +33648 +33649 +13129 +32609 +11754 +33650 +2719 +5188 +9 +1605 +33651 +25140 +33652 +141 +1559 +33653 +3546 +989 +33654 +33655 +33656 +25683 +3548 +33657 +27069 +33658 +33659 +373 +33660 +9 +14871 +33661 +33662 +33663 +31293 +2419 +28549 +33664 +23867 +13621 +1090 +15 +66 +26680 +8392 +536 +140 +7375 +33665 +20810 +53 +15645 +33666 +201 +33667 +1920 +33668 +303 +19618 +24303 +29483 +33669 +33670 +33671 +185 +9132 +30224 +33672 +33673 +27335 +19618 +9 +33674 +33675 +33676 +303 +936 +33677 +509 +428 +33678 +13307 +3546 +10 +33679 +33680 +33681 +33682 +33683 +185 +11754 +21947 +33684 +33685 +33686 +33687 +33688 +33689 +33690 +33691 +33692 +5798 +33693 +30877 +33694 +14369 +478 +28036 +5803 +19618 +33695 +213 +33226 +30877 +439 +2117 +33696 +33697 +38 +155 +33698 +9233 +33699 +20803 +33700 +1705 +671 +2459 +140 +20952 +14604 +33701 +770 +33702 +478 +677 +23231 +23103 +33703 +1090 +18553 +33704 +19218 +554 +33705 +33706 +33707 +33708 +1181 +286 +33709 +33710 +1169 +31293 +14947 +30877 +33711 +33712 +23226 +10 +10624 +27669 +33713 +5169 +18798 +33714 +3546 +33715 +590 +3369 +11675 +554 +2550 +33716 +412 +700 +24426 +9 +7049 +13503 +33627 +33717 +33718 +19 +26484 +33719 +33720 +248 +21947 +22 +14369 +26157 +15718 +29628 +29209 +25140 +194 +30877 +33721 +33722 +14330 +33723 +30458 +28317 +33724 +25683 +249 +22605 +33725 +2655 +14330 +33726 +33727 +411 +23675 +24045 +33728 +29997 +33729 +33730 +10678 +33731 +33732 +33733 +33734 +3546 +4055 +3546 +16145 +20435 +33735 +14330 +33736 +33737 +33738 +1090 +33739 +33740 +25659 +28151 +19050 +7945 +98 +751 +11207 +1230 +751 +14947 +590 +33120 +57 +23103 +33741 +33742 +270 +2694 +25140 +27669 +13956 +33743 +15718 +33744 +694 +17920 +19009 +222 +590 +33745 +1090 +33746 +9688 +33747 +33748 +15384 +12005 +33749 +22 +18815 +33750 +1870 +33751 +25140 +286 +24896 +18821 +2009 +13465 +33752 +6086 +33753 +23481 +33754 +33755 +970 +6161 +28441 +3546 +19 +209 +5561 +15907 +33756 +10 +16437 +4088 +33757 +13721 +345 +28549 +33758 +27669 +33759 +19 +33760 +16437 +33761 +33762 +33763 +3 +354 +18434 +7891 +33764 +18896 +33765 +33766 +541 +5326 +19618 +33767 +19 +18045 +9898 +6595 +33768 +33769 +4055 +284 +5780 +22 +22 +66 +33770 +33771 +19618 +33772 +33773 +2577 +33577 +16979 +33758 +33774 +4055 +1559 +33775 +33776 +4055 +33777 +33778 +892 +322 +29483 +33779 +2410 +14330 +720 +28441 +99 +213 +26320 +33780 +345 +398 +20822 +24339 +21947 +19 +337 +232 +27669 +13956 +33781 +29381 +28317 +13570 +33782 +33783 +33784 +1332 +11762 +349 +33061 +9 +33785 +33786 +14 +15971 +9573 +25683 +33787 +33788 +566 +14369 +43 +33789 +7291 +33790 +720 +14161 +33791 +33792 +14369 +33793 +33794 +30224 +14079 +12936 +1991 +33795 +4055 +14369 +52 +1157 +18434 +3994 +33796 +213 +33797 +1352 +33798 +22963 +29483 +7823 +66 +33799 +33800 +33801 +26943 +21947 +33802 +33803 +33804 +1384 +2129 +25584 +1013 +439 +33805 +15718 +33806 +33393 +33807 +33808 +33809 +5700 +24144 +354 +33388 +21947 +30877 +33810 +33811 +6095 +14369 +1090 +1077 +736 +4124 +11762 +286 +337 +31434 +16437 +33812 +29981 +19 +19655 +33813 +736 +3755 +25237 +8946 +33814 +33815 +590 +33816 +33817 +33818 +514 +14840 +21416 +33819 +33820 +33821 +284 +33822 +33823 +19618 +3019 +3546 +25683 +2668 +27748 +33824 +248 +3026 +21947 +115 +33825 +31293 +33826 +25237 +28036 +3601 +3546 +1812 +694 +21248 +303 +33827 +30224 +303 +33828 +345 +248 +21689 +32 +12552 +26361 +17093 +33829 +33830 +250 +345 +33831 +13985 +33832 +17029 +284 +33833 +33834 +31577 +33835 +178 +24725 +337 +1749 +27069 +32 +33836 +9 +30224 +5188 +822 +9 +337 +33837 +25683 +27113 +3546 +33838 +33839 +590 +33840 +24864 +5085 +33841 +590 +33842 +29 +286 +9024 +6095 +19 +33843 +248 +33198 +1051 +8454 +33844 +915 +33845 +33846 +33847 +1044 +33848 +4002 +1961 +33849 +33850 +33851 +1047 +33852 +13721 +30877 +337 +10757 +1920 +33853 +43 +33854 +3317 +33855 +18946 +46 +33177 +583 +14059 +33856 +22098 +24 +1090 +303 +21681 +2135 +33650 +33857 +248 +677 +15718 +2260 +5085 +28036 +33858 +24864 +5085 +25584 +33859 +33860 +5208 +6006 +590 +1870 +2015 +25 +337 +1605 +248 +31906 +5085 +33861 +13721 +284 +33862 +25683 +13848 +29880 +33863 +33864 +349 +2577 +33865 +16413 +4151 +179 +123 +33866 +1531 +22986 +250 +25237 +683 +33867 +123 +10 +24864 +33868 +33869 +1562 +3160 +33368 +5808 +25584 +33870 +30224 +29204 +9 +1605 +2338 +3684 +33871 +23103 +33872 +25140 +33650 +15 +27669 +30224 +292 +464 +23871 +33873 +33874 +272 +590 +33875 +33876 +33877 +33141 +3546 +137 +33878 +30084 +590 +17972 +2372 +33879 +30051 +19 +8367 +2764 +33880 +105 +1090 +33881 +33882 +15718 +3668 +31293 +2314 +2264 +33883 +26744 +1316 +16332 +33627 +1559 +6537 +33884 +19974 +33885 +33886 +22308 +4075 +33887 +14909 +590 +8239 +21947 +239 +18250 +33888 +33889 +14330 +33890 +20 +14001 +33891 +19048 +15 +248 +1562 +9 +286 +33892 +3904 +1716 +7601 +2485 +33893 +7801 +736 +2537 +17151 +861 +33894 +33895 +33896 +19618 +22922 +33897 +2577 +595 +33898 +9 +4055 +279 +33899 +7532 +33900 +33901 +26361 +4502 +33902 +14330 +24630 +33903 +33904 +1502 +33307 +11639 +12987 +6187 +89 +14604 +33650 +6122 +25140 +33905 +16798 +3546 +25683 +18283 +936 +7816 +3660 +33906 +9210 +345 +31346 +12919 +25140 +1765 +33907 +286 +14 +33908 +17749 +21947 +19618 +43 +872 +29483 +33627 +33909 +33910 +25237 +1870 +464 +345 +14604 +14369 +1090 +29 +12120 +33911 +22823 +33912 +736 +33913 +13721 +18897 +6441 +14523 +14814 +33914 +33915 +33916 +33917 +115 +13721 +707 +12916 +284 +13976 +31293 +33918 +53 +590 +33919 +9 +25996 +13905 +10946 +43 +32642 +33920 +30224 +33921 +89 +13943 +887 +19 +18869 +33922 +12431 +1051 +29483 +20063 +1090 +7522 +21947 +194 +33923 +33650 +33924 +14330 +33925 +33926 +10 +33927 +21947 +194 +30051 +43 +2677 +9 +30224 +33928 +27669 +873 +1513 +33929 +33930 +33931 +18815 +4028 +26081 +33932 +21947 +33933 +43 +20745 +33934 +33935 +25539 +22269 +1870 +25316 +9 +31293 +2865 +1169 +33936 +736 +28317 +14577 +23394 +29502 +13813 +11321 +26712 +33120 +99 +33937 +30877 +38 +33938 +43 +33939 +5085 +25237 +379 +32938 +33940 +38 +1605 +10230 +736 +590 +33941 +8849 +15718 +15 +20563 +2865 +751 +29381 +24144 +33942 +33943 +33944 +590 +14 +1090 +12407 +357 +14000 +538 +3491 +349 +30877 +43 +20426 +33945 +33946 +533 +9210 +1289 +1765 +2018 +14369 +1364 +32566 +19 +32 +33947 +33948 +19 +33949 +7128 +33950 +33951 +16437 +25316 +9 +9 +31098 +19618 +33952 +323 +33953 +25140 +25683 +33954 +33955 +33956 +23231 +33957 +29926 +1090 +33958 +721 +2601 +33959 +33643 +33960 +495 +33961 +17635 +228 +1234 +1300 +13375 +24303 +33962 +33963 +25584 +33964 +33965 +28609 +19 +33966 +33967 +25659 +33968 +21371 +10117 +33969 +38 +590 +12075 +2197 +31249 +33970 +22922 +665 +29172 +20776 +33971 +33972 +30224 +33973 +15 +2459 +1224 +29483 +33974 +66 +665 +33975 +33976 +28317 +33977 +14707 +5780 +29381 +1090 +33978 +31375 +33979 +57 +33980 +33981 +22986 +28317 +43 +590 +4624 +33982 +19996 +6618 +9 +33963 +1090 +21947 +33983 +33984 +66 +30224 +9074 +6054 +98 +17749 +28549 +861 +29 +29032 +33985 +12120 +33986 +5085 +43 +12203 +1011 +17670 +33987 +33988 +736 +274 +24303 +33989 +6701 +33990 +33211 +33991 +33992 +29483 +10239 +33120 +25316 +33993 +19 +3353 +1824 +3999 +12214 +33994 +33995 +21922 +4055 +33996 +25683 +670 +33997 +2577 +30051 +33627 +33650 +25140 +43 +33998 +8188 +33999 +1716 +18357 +34000 +34001 +30224 +34002 +15483 +4028 +379 +34003 +32640 +1090 +31098 +15718 +15511 +34004 +1384 +34005 +21947 +34006 +34007 +21947 +5629 +13375 +34008 +1446 +31098 +15356 +415 +4603 +34009 +34010 +7291 +34011 +27387 +15 +26361 +38 +18695 +34012 +1011 +34013 +14369 +77 +60 +34014 +14079 +66 +32 +34015 +3546 +34016 +7835 +137 +398 +1013 +34017 +2832 +34018 +1992 +34019 +34020 +9 +34021 +34022 +24907 +29716 +357 +34023 +34024 +43 +34025 +34026 +14330 +34027 +15541 +13897 +1720 +25237 +31293 +34028 +7610 +13150 +1090 +1961 +34029 +34030 +538 +27069 +26361 +2 +34031 +21947 +1543 +21486 +3601 +34032 +34033 +24948 +25140 +26582 +43 +3349 +34034 +34035 +34036 +8188 +25 +1817 +377 +34037 +27669 +2769 +12987 +32332 +34038 +21947 +34039 +590 +736 +34040 +8037 +34041 +14363 +1134 +34042 +25237 +590 +14604 +34043 +34044 +1157 +12555 +34045 +43 +4533 +5085 +1559 +26434 +3601 +736 +26744 +21947 +34046 +482 +34047 +34048 +32 +34049 +34050 +4123 +31293 +34051 +34052 +14909 +9 +34053 +28441 +34054 +13807 +33650 +34055 +193 +34056 +1090 +6439 +19007 +16102 +34057 +590 +17730 +34058 +7855 +613 +4124 +21947 +34059 +34060 +14330 +4677 +25859 +34061 +34062 +28638 +842 +34063 +12480 +34064 +32 +1224 +11762 +21947 +34065 +34066 +12987 +2694 +34067 +17872 +8186 +109 +34068 +25683 +34069 +1508 +12987 +26666 +34070 +32 +424 +34071 +33650 +16116 +34072 +26040 +34073 +3546 +1090 +9024 +34074 +34075 +34076 +34077 +33650 +24144 +30458 +34078 +34079 +30877 +1112 +33758 +2971 +29483 +34080 +5080 +31293 +16375 +33650 +8005 +34081 +34082 +34083 +5627 +30877 +34084 +1961 +34085 +209 +8668 +33650 +9 +34086 +1082 +3553 +201 +34087 +26496 +34088 +25584 +1470 +34089 +1612 +34090 +34091 +34092 +34093 +43 +1870 +17698 +34094 +34095 +34096 +2064 +34097 +34098 +30877 +15 +2 +694 +30877 +13030 +34099 +4055 +5780 +1157 +19655 +15718 +16875 +34100 +9 +34101 +21947 +590 +34102 +34103 +111 +9560 +31293 +232 +34104 +34105 +34106 +9 +3067 +43 +29381 +4055 +13566 +34107 +178 +27669 +576 +34108 +491 +1090 +15718 +9 +533 +34109 +14330 +34110 +6354 +34111 +34112 +1382 +1810 +34113 +20 +9 +4055 +5408 +590 +3946 +8994 +34114 +15018 +34115 +2581 +5683 +14369 +9 +10 +19 +1107 +34116 +24303 +19 +3546 +345 +25316 +7835 +35 +28441 +9 +4367 +15 +33650 +19 +34117 +34118 +20850 +14001 +34119 +34120 +20 +18798 +30877 +34121 +29483 +22587 +31293 +30877 +1668 +3546 +34122 +9 +2733 +373 +720 +30877 +24303 +3546 +34123 +34124 +34125 +43 +28116 +34126 +8668 +34127 +20443 +34128 +345 +1529 +34129 +33650 +34130 +1310 +1870 +10 +33650 +590 +8593 +34131 +19918 +201 +43 +34132 +34133 +9 +713 +849 +43 +27669 +57 +34134 +34135 +32 +34136 +43 +12987 +34137 +18874 +34138 +736 +34139 +21947 +595 +22592 +30877 +34140 +28549 +196 +31293 +33963 +16264 +8766 +14102 +4388 +9 +34141 +34142 +34143 +971 +2872 +24458 +25237 +18421 +533 +27249 +9904 +34144 +23368 +29204 +208 +3746 +34145 +19 +2 +26127 +34146 +14588 +9 +31503 +4055 +34147 +34148 +22236 +34149 +34150 +9 +1374 +8357 +43 +8249 +2988 +34151 +26946 +12987 +703 +4055 +10 +573 +1514 +2356 +34152 +282 +2 +1961 +11754 +648 +25050 +7835 +13474 +541 +34153 +34154 +2325 +1648 +34155 +24725 +34156 +34157 +25871 +98 +14330 +98 +21947 +28549 +33650 +34158 +34159 +34160 +19 +102 +9 +2064 +34161 +43 +43 +25140 +34162 +15 +34163 +20586 +34164 +14776 +43 +34165 +12302 +34166 +10199 +20666 +3999 +34167 +66 +14759 +29800 +27096 +30224 +19618 +590 +14343 +34168 +209 +34169 +34170 +590 +13721 +5629 +34171 +1524 +43 +34172 +30051 +34173 +34174 +9 +32537 +34175 +24939 +14 +5192 +34176 +3484 +34177 +278 +34178 +14947 +14477 +34179 +34 +34180 +31293 +16437 +34181 +32900 +34182 +34183 +17698 +9 +34184 +3546 +34185 +25237 +34186 +21947 +17272 +349 +15718 +34187 +34188 +34189 +5803 +17151 +34190 +34191 +34192 +34193 +4026 +10256 +34194 +43 +14369 +25237 +179 +377 +14216 +21494 +3546 +34195 +25160 +720 +21947 +19855 +9 +43 +21947 +98 +5085 +1529 +5817 +34196 +19 +34197 +34198 +34199 +33650 +34200 +1382 +8351 +57 +19 +647 +6499 +31603 +31293 +34201 +2550 +18045 +38 +9 +29381 +34202 +34203 +286 +2577 +10031 +1961 +34204 +34205 +590 +17675 +12005 +9402 +4055 +770 +2071 +34206 +936 +237 +7053 +1385 +25237 +3546 +21947 +11697 +201 +34207 +34208 +34209 +15463 +14 +3959 +34210 +34211 +828 +5188 +34212 +21947 +34213 +590 +34214 +34215 +43 +21689 +19655 +713 +34216 +790 +34217 +21835 +34218 +736 +34219 +9 +34220 +176 +28295 +21947 +34221 +34222 +34223 +11966 +32642 +34224 +34225 +590 +34226 +1090 +34227 +2260 +30551 +14369 +34228 +34229 +1529 +590 +34230 +416 +34231 +28317 +15671 +14 +34232 +34233 +19 +34234 +3871 +34235 +4791 +34236 +34237 +34238 +3959 +17281 +34239 +34240 +31500 +196 +15216 +34241 +736 +3143 +519 +34242 +19 +34243 +34244 +34245 +13721 +34246 +42 +34247 +34248 +554 +1524 +16447 +10003 +34249 +1765 +34250 +9 +34251 +24 +34252 +43 +18043 +6294 +33650 +27669 +14477 +34253 +34254 +30051 +14594 +2926 +104 +2314 +34255 +33445 +17784 +738 +1208 +15718 +34256 +250 +9 +34257 +34258 +34259 +14369 +568 +34260 +34261 +34262 +34263 +34264 +15718 +34265 +34266 +3584 +34267 +29204 +1066 +34268 +26744 +34269 +23990 +19523 +30877 +34270 +317 +34271 +29483 +29715 +34272 +18283 +21689 +34273 +31585 +34274 +34275 +28471 +34276 +26040 +358 +5085 +1716 +14369 +34277 +34278 +29658 +19618 +30224 +286 +23675 +34279 +34280 +2009 +27117 +34281 +34282 +34283 +19 +1090 +34284 +34285 +34286 +34287 +34288 +3546 +25584 +34289 +23313 +34290 +77 +4752 +1291 +1364 +12 +34291 +34292 +155 +14660 +10 +19 +34293 +31293 +1169 +29628 +34294 +15 +34295 +34296 +1992 +32636 +9 +34297 +155 +29381 +28549 +31293 +34298 +13638 +43 +34299 +34300 +286 +34301 +21947 +34302 +1684 +34303 +14330 +25140 +936 +34304 +342 +77 +19 +352 +140 +21758 +32863 +15514 +3994 +2042 +22963 +34305 +24303 +8418 +4055 +20443 +34306 +3978 +34307 +34308 +19 +34309 +27669 +25943 +21947 +2919 +39 +14079 +590 +9460 +34310 +4808 +21904 +34311 +6725 +34312 +34313 +34314 +21889 +33963 +34315 +34316 +10 +34317 +20952 +590 +34318 +21947 +3790 +34319 +34320 +9 +31293 +21947 +590 +9 +5839 +33818 +34321 +15718 +14369 +34322 +34323 +31467 +176 +34324 +34325 +30877 +22986 +590 +34326 +4055 +43 +43 +34327 +34328 +491 +34329 +554 +21947 +34330 +34331 +1090 +8746 +21187 +6335 +29483 +554 +4364 +1513 +342 +1508 +34332 +11423 +18283 +34333 +32805 +179 +671 +15 +18045 +11362 +6883 +34334 +34335 +25943 +286 +34336 +27669 +34337 +21499 +349 +14 +30224 +34338 +1157 +34339 +25237 +590 +19 +34340 +34341 +19 +25316 +34342 +34343 +34344 +10049 +34345 +8996 +34346 +286 +30551 +34347 +34348 +34349 +7836 +34350 +533 +25683 +43 +34351 +590 +22464 +34352 +1021 +34353 +17151 +24864 +7855 +34354 +16014 +6142 +1655 +349 +30224 +10717 +28317 +887 +43 +176 +30051 +29483 +34355 +14604 +34356 +2129 +20700 +7835 +484 +34357 +22922 +34358 +28036 +27669 +14477 +34359 +9 +2286 +30712 +7053 +34360 +27669 +1234 +3546 +15320 +34361 +1425 +33963 +31293 +4951 +34362 +16883 +34363 +34364 +5188 +352 +2253 +34365 +1018 +1688 +34366 +34367 +3601 +411 +34368 +379 +1716 +1529 +179 +1157 +34369 +19618 +24725 +26040 +5119 +33021 +31293 +25683 +558 +34370 +21947 +1364 +34371 +14369 +13068 +3369 +2570 +34372 +20 +34373 +478 +27669 +19 +11653 +770 +27074 +222 +13566 +17136 +30877 +27669 +34374 +34375 +345 +34376 +25237 +34377 +33368 +34378 +849 +34379 +34380 +9 +34381 +19 +32 +34382 +34383 +7154 +25943 +34384 +736 +34385 +34386 +694 +1090 +34387 +34388 +970 +34389 +713 +590 +34390 +933 +4 +14174 +15718 +19852 +34391 +34392 +9 +19 +14369 +34393 +349 +1765 +34394 +27886 +25140 +703 +34395 +14410 +34396 +33445 +34397 +34398 +43 +34399 +34400 +720 +3044 +5741 +28317 +34401 +4 +34402 +1442 +43 +24864 +2093 +34403 +31293 +15 +5990 +18995 +43 +397 +4055 +19618 +16780 +34404 +34405 +286 +34406 +34407 +1566 +17535 +34408 +19939 +31293 +34409 +27864 +33278 +26178 +6945 +34410 +25237 +32646 +34411 +34412 +29381 +29483 +373 +8476 +1090 +34413 +12346 +5085 +34414 +188 +363 +43 +28745 +29483 +331 +34415 +20 +22 +5489 +24864 +12987 +27719 +19618 +34416 +14330 +22666 +34417 +34418 +11341 +7835 +11966 +1578 +115 +590 +36 +34419 +10173 +2318 +32538 +648 +3546 +25683 +34420 +34421 +32782 +34422 +6054 +18695 +34423 +34424 +1779 +892 +34425 +22986 +34426 +683 +34427 +34428 +34429 +34430 +34431 +30877 +34432 +66 +10781 +379 +4055 +970 +30877 +590 +533 +14369 +31293 +3589 +19582 +2799 +34433 +11282 +249 +17121 +915 +34434 +5085 +43 +910 +25 +29200 +34435 +34017 +5169 +19 +2356 +34436 +730 +34437 +34438 +3 +2015 +30551 +19618 +34439 +188 +7108 +25683 +28219 +7379 +34440 +18045 +25683 +34441 +19 +349 +34442 +34443 +590 +9 +34444 +34445 +19838 +19335 +34446 +15039 +34447 +34448 +7835 +24864 +34449 +25140 +23239 +14 +13566 +21947 +17151 +12005 +24864 +14603 +34450 +970 +34451 +34452 +34453 +34454 +34455 +21947 +34456 +6287 +20 +14763 +34457 +34458 +29200 +22453 +1870 +12916 +27669 +34459 +5792 +4550 +31293 +34460 +34461 +34462 +34463 +1234 +8855 +34464 +29720 +34465 +21947 +1090 +34466 +736 +22922 +33758 +34467 +89 +27669 +34468 +66 +34469 +21835 +34079 +34470 +736 +14369 +24864 +34471 +34472 +48 +34473 +34474 +33963 +536 +27153 +34475 +5188 +3546 +34476 +20 +14604 +14369 +34477 +57 +9204 +34478 +34479 +13721 +9 +19655 +34480 +34481 +7522 +34482 +29483 +5908 +352 +823 +34483 +286 +3343 +34484 +22315 +1131 +21947 +179 +707 +598 +25584 +25943 +34485 +1425 +34486 +11672 +34487 +23406 +29981 +1710 +34488 +5085 +8210 +9 +29381 +249 +28036 +43 +34489 +34490 +31168 +692 +13794 +43 +1230 +22 +43 +25237 +9 +14369 +1107 +34491 +34492 +34493 +34494 +43 +34495 +478 +34496 +971 +34497 +11321 +349 +590 +34498 +21947 +33650 +14369 +22236 +34499 +34500 +34501 +28348 +34502 +34503 +5188 +278 +34504 +2260 +399 +34505 +34506 +36 +29204 +34507 +34508 +34509 +34510 +34511 +34512 +34513 +34514 +915 +5316 +590 +24896 +4028 +3100 +29483 +683 +34515 +1090 +29483 +197 +9 +18145 +2314 +34516 +34517 +14369 +34518 +5559 +34519 +31293 +34520 +34521 +14369 +34522 +28295 +31406 +34523 +34524 +34525 +349 +2619 +4055 +34526 +849 +13797 +7291 +34527 +9660 +34528 +14330 +15845 +34529 +34181 +7053 +21947 +20386 +25237 +34530 +345 +3546 +249 +254 +34531 +34532 +34533 +25140 +34534 +34535 +13510 +19 +4055 +23752 +9 +22198 +14604 +34536 +26361 +24725 +1817 +1090 +24864 +33697 +3330 +24951 +7835 +16437 +23603 +25683 +29884 +9 +43 +32359 +24303 +345 +379 +34537 +9 +34538 +3546 +34539 +1090 +18503 +14188 +34540 +15 +25237 +2762 +16121 +34541 +1157 +34542 +57 +34543 +188 +286 +1090 +34544 +1286 +2197 +415 +33963 +34545 +16437 +2694 +34546 +28317 +42 +416 +32 +7053 +29204 +34547 +15135 +34548 +34549 +34550 +14369 +165 +209 +345 +182 +34551 +43 +33141 +34552 +4441 +5188 +1090 +14216 +9 +25683 +34553 +34554 +2 +34555 +34556 +34557 +9 +25237 +33627 +248 +34558 +7835 +196 +26561 +21947 +25683 +286 +34559 +11762 +25140 +1320 +34560 +337 +43 +19 +2117 +34561 +586 +25683 +1122 +34562 +34563 +34564 +34565 +19688 +36 +31293 +89 +33627 +34566 +34567 +21947 +284 +1220 +19 +34568 +4979 +5188 +34569 +1742 +10 +31293 +29204 +250 +30224 +4055 +17267 +2347 +34570 +21947 +17972 +89 +4650 +34571 +8367 +284 +28317 +4116 +2410 +29032 +30917 +337 +16440 +19 +34572 +19 +4055 +1696 +34573 +19 +248 +1481 +590 +25659 +34574 +2289 +34575 +34576 +34577 +34 +34578 +700 +34579 +4278 +248 +6617 +34580 +248 +397 +2540 +707 +345 +1090 +34581 +34582 +21689 +915 +25237 +665 +337 +736 +3119 +6294 +34583 +34584 +43 +25584 +20 +14759 +34585 +17060 +213 +34586 +34587 +19 +2550 +34588 +3546 +43 +17151 +23506 +178 +34589 +21947 +5188 +34590 +248 +3077 +34591 +6962 +721 +21947 +34592 +402 +34593 +34594 +9 +9396 +25683 +25991 +34595 +13721 +34596 +1090 +18982 +34597 +9 +99 +28317 +34598 +4227 +519 +31293 +10642 +703 +34599 +3546 +34600 +30051 +10 +34601 +1863 +9 +931 +34602 +34603 +23103 +711 +34604 +248 +34605 +2289 +25943 +34606 +317 +34607 +10544 +34608 +1120 +10 +33627 +7137 +29483 +590 +11925 +828 +15718 +3484 +15 +34609 +11719 +29 +26355 +25298 +14330 +34610 +19 +337 +936 +1817 +51 +34611 +15 +14 +25683 +34612 +34613 +34614 +891 +2260 +15 +34531 +1559 +5188 +9939 +9 +1384 +12987 +34615 +12425 +872 +34616 +14369 +12153 +34617 +25140 +354 +3391 +34618 +34619 +34620 +9497 +33963 +15 +22922 +123 +23103 +34621 +9 +34622 +34623 +34624 +114 +1247 +34625 +13721 +29688 +28549 +14884 +34626 +34627 +12987 +24423 +34628 +19 +21429 +25943 +33963 +34629 +25584 +22269 +34630 +2577 +34631 +16239 +25683 +34632 +19 +373 +33977 +34633 +14 +34634 +14369 +34635 +33683 +8593 +17281 +21394 +34636 +3553 +213 +34637 +14477 +590 +34433 +4055 +201 +105 +34638 +24303 +34639 +34640 +27719 +18684 +34641 +14369 +869 +27238 +442 +8460 +24725 +590 +1219 +11970 +57 +25683 +19618 +13361 +9808 +34642 +411 +21689 +32 +21947 +21947 +1696 +15018 +4368 +2446 +24725 +34643 +25316 +30877 +30650 +178 +303 +34644 +34645 +34646 +30209 +1090 +57 +317 +34647 +34648 +597 +34649 +43 +19 +20 +31293 +33445 +34650 +25316 +2342 +1382 +823 +5904 +196 +34651 +46 +34652 +15881 +590 +533 +22868 +24896 +21947 +248 +27669 +28317 +24864 +7362 +34653 +12013 +21947 +4306 +12178 +179 +32161 +1090 +590 +34654 +34655 +30224 +34656 +15354 +1716 +34657 +4055 +349 +24129 +19 +185 +20 +286 +28294 +1013 +34658 +23547 +9 +19618 +14369 +1920 +16826 +179 +24864 +586 +358 +15881 +4631 +34659 +19 +22787 +27669 +22864 +23103 +34660 +15384 +34661 +34662 +4055 +3476 +670 +9 +736 +34663 +176 +30877 +31293 +31293 +34664 +34665 +34666 +43 +2197 +358 +34667 +5731 +4856 +32920 +8218 +209 +29172 +815 +213 +1112 +14504 +27669 +3061 +8668 +3 +9 +354 +20328 +25683 +12479 +2769 +8670 +19618 +34668 +155 +34669 +17698 +24058 +34670 +34671 +34672 +34673 +29381 +2 +31293 +10 +17238 +14769 +701 +27178 +20722 +34674 +34675 +713 +34676 +2009 +554 +21563 +7835 +984 +10 +34677 +34678 +21947 +34679 +3005 +34680 +15331 +33650 +34681 +34682 +6364 +2197 +34683 +13247 +34684 +19 +19655 +590 +358 +34685 +3546 +495 +34686 +34687 +34688 +33963 +34689 +30224 +5376 +34690 +11983 +34438 +16102 +99 +19618 +213 +12987 +34691 +1090 +34692 +34693 +284 +24725 +2577 +34694 +1109 +34695 +24045 +15 +34696 +34697 +2764 +34698 +155 +34699 +19655 +34700 +1508 +15718 +34701 +34702 +19042 +80 +34703 +32 +34704 +20 +33650 +34705 +2949 +213 +34706 +34707 +34708 +9682 +9 +2463 +15597 +9 +3055 +377 +31098 +34709 +33 +34710 +46 +345 +33963 +34711 +14774 +484 +3655 +303 +8849 +34712 +123 +23271 +15718 +14025 +34713 +13279 +34714 +1018 +671 +349 +25140 +3601 +27669 +9 +34715 +21510 +322 +34716 +34717 +34718 +11762 +1465 +34719 +1861 +213 +29204 +30877 +284 +29733 +16401 +2998 +22 +34720 +34721 +27669 +34722 +15718 +43 +5665 +286 +19 +34723 +284 +9 +283 +590 +34724 +34725 +3546 +34726 +34727 +22922 +34728 +19618 +1425 +4055 +1364 +12157 +2721 +21553 +299 +34729 +17404 +10961 +33650 +34730 +201 +30877 +23150 +14485 +379 +25237 +19 +34731 +34732 +7048 +540 +3247 +25316 +7259 +11483 +43 +19618 +284 +34733 +1141 +34734 +4055 +34735 +4055 +34736 +34737 +89 +19 +34738 +4961 +23103 +34739 +21689 +34740 +352 +34741 +31293 +34742 +17571 +3981 +590 +7717 +34743 +25625 +34744 +15718 +5780 +14369 +21689 +18953 +77 +2550 +34745 +34746 +33427 +30775 +16437 +9617 +34747 +21647 +228 +34748 +4 +9160 +16 +18811 +19874 +3546 +25382 +43 +19928 +19523 +34749 +34750 +89 +4055 +27669 +2 +14330 +12722 +30210 +34751 +12299 +3546 +33693 +1503 +20 +34752 +34753 +17698 +9 +5188 +7053 +27669 +42 +34754 +32642 +27669 +18571 +15718 +34755 +15 +33627 +1011 +34756 +464 +34757 +29483 +34758 +34759 +23103 +2560 +34760 +337 +22292 +31293 +25683 +34761 +3182 +19321 +25584 +34762 +1502 +4425 +13390 +2040 +9 +34763 +1559 +155 +34764 +14001 +34765 +34766 +3546 +13721 +57 +3908 +26815 +18479 +28441 +9 +66 +15 +1529 +34767 +34768 +7418 +29109 +34769 +66 +33650 +28961 +15718 +34770 +34771 +14520 +3546 +13566 +1224 +2260 +34772 +5908 +15 +18896 +26176 +43 +668 +3659 +15088 +44 +12988 +970 +34773 +12987 +1524 +645 +33650 +9 +3739 +7292 +2694 +27669 +34774 +4055 +25237 +13228 +6595 +34775 +1090 +32871 +1090 +1829 +14 +7053 +4055 +30051 +21089 +34776 +31293 +28845 +32269 +22963 +4463 +815 +23103 +15194 +2600 +25164 +10780 +34777 +10318 +30877 +1116 +34778 +34779 +3337 +30051 +3361 +34780 +60 +34781 +30051 +34782 +34783 +98 +337 +34784 +1089 +286 +1295 +10 +34785 +1021 +3 +19 +34786 +34787 +43 +34788 +6732 +27669 +12013 +29483 +34789 +34790 +34791 +5659 +736 +1149 +33627 +137 +28317 +34792 +25316 +34793 +25683 +1513 +2009 +1013 +33650 +25140 +8297 +861 +590 +24725 +43 +33650 +34794 +34795 +9 +849 +31437 +34796 +34797 +34798 +25237 +33650 +24144 +34799 +245 +34800 +345 +14369 +34801 +9 +19852 +22290 +12005 +6782 +3908 +34802 +3484 +34803 +34804 +23926 +358 +176 +4693 +3546 +2197 +32604 +33113 +5433 +8188 +34805 +34806 +14 +416 +34807 +34808 +34809 +29381 +98 +19618 +6617 +34810 +16334 +11754 +43 +34811 +1817 +34812 +30877 +43 +2372 +259 +34813 +34814 +379 +34815 +104 +464 +13721 +43 +25140 +34816 +3369 +809 +3876 +590 +1090 +34817 +25140 +72 +13754 +34818 +33113 +29200 +6741 +34819 +9410 +3476 +31315 +19 +43 +14947 +358 +34820 +34821 +15 +554 +34822 +24303 +43 +34823 +22144 +21776 +25237 +416 +34824 +34825 +436 +33963 +19618 +17320 +2764 +11057 +9 +1244 +179 +1090 +554 +34826 +590 +123 +28639 +19618 +34827 +3976 +33758 +34828 +378 +34829 +12093 +14369 +34830 +3559 +250 +19 +34831 +16264 +34832 +14330 +1090 +29483 +34833 +19 +34834 +6999 +34835 +34836 +17281 +34837 +14399 +29549 +3546 +31098 +677 +34838 +34839 +34840 +34841 +15504 +16371 +2260 +6463 +21947 +15768 +15718 +34394 +33120 +25683 +4055 +1765 +34842 +338 +34843 +3546 +25316 +28317 +34844 +34845 +2593 +415 +34846 +209 +27860 +1236 +34847 +15718 +43 +34848 +26724 +27069 +19618 +16413 +16146 +3553 +29381 +4487 +19289 +1508 +43 +34849 +34181 +34850 +7072 +43 +1090 +34 +33650 +201 +25683 +34851 +34852 +2975 +34853 +345 +34854 +59 +34855 +34856 +1559 +25280 +9 +12 +1765 +590 +845 +34857 +20600 +345 +15914 +34858 +19852 +1870 +27669 +11321 +34859 +3202 +34860 +20482 +622 +34861 +32137 +16109 +140 +34862 +323 +554 +806 +98 +720 +34863 +9 +4326 +21689 +34864 +34865 +34583 +34866 +1090 +2058 +5995 +1026 +34867 +34868 +1461 +34869 +3252 +1870 +34870 +19276 +34871 +19618 +34872 +13375 +19618 +2694 +22 +34873 +3484 +5217 +43 +34874 +14369 +34875 +1090 +2043 +34876 +1453 +34402 +30877 +1817 +3790 +34877 +34878 +25943 +15 +26496 +34879 +34880 +19 +34881 +20785 +25659 +34882 +12348 +9 +18045 +34883 +501 +34884 +7105 +6463 +5080 +1051 +21947 +3546 +22963 +24 +15583 +34885 +2406 +34886 +34887 +1612 +34888 +915 +15718 +30500 +15649 +34889 +34890 +34891 +34892 +6310 +2537 +9460 +31936 +22463 +31098 +34893 +25943 +34894 +331 +9 +34895 +2049 +2 +5188 +2410 +2812 +9 +34896 +34897 +25683 +533 +21947 +1090 +66 +19618 +20340 +29483 +3599 +34898 +1710 +3170 +8418 +1090 +34899 +14477 +34900 +13721 +4806 +34901 +25316 +43 +1013 +43 +34902 +19 +34903 +1992 +32886 +26419 +21553 +34904 +1912 +34905 +3655 +398 +738 +19618 +34906 +6883 +1090 +34907 +3546 +16 +590 +16437 +8188 +19618 +66 +345 +34908 +9 +490 +377 +14013 +33113 +14369 +34909 +15 +3239 +34910 +31735 +1090 +23226 +24864 +34 +15483 +34911 +43 +66 +25140 +29381 +30877 +33120 +19 +34912 +25904 +1655 +24144 +34913 +34914 +34915 +34916 +34917 +34918 +34919 +15718 +19344 +18479 +34920 +357 +34921 +34833 +5389 +21947 +137 +25237 +554 +415 +14458 +7834 +736 +33650 +43 +31293 +34922 +34923 +2260 +2537 +31293 +34924 +33758 +34925 +31293 +1090 +34926 +34927 +32 +16102 +1090 +34928 +34402 +7053 +32 +15572 +34929 +3923 +34930 +25237 +5188 +34931 +34932 +178 +19618 +358 +14 +34933 +19355 +34934 +34935 +32517 +5601 +12642 +2 +541 +958 +19852 +970 +112 +2027 +34936 +6214 +15718 +34937 +32680 +21947 +34938 +533 +34939 +19 +34940 +971 +34941 +9 +377 +349 +34942 +590 +34943 +28317 +10642 +34402 +5649 +34944 +25036 +28923 +34945 +34946 +14693 +34947 +34948 +34949 +14079 +34950 +34951 +1212 +34952 +34953 +9 +34954 +30224 +6214 +34955 +34956 +736 +34957 +34958 +34959 +5080 +590 +32922 +34960 +34961 +18503 +14330 +19655 +2260 +34962 +286 +15 +887 +43 +34963 +4441 +842 +694 +590 +34964 +34965 +14 +43 +6095 +29200 +15718 +34966 +34967 +19 +28845 +6116 +941 +9 +31293 +872 +9 +34968 +29746 +19 +34402 +34969 +7176 +861 +345 +1051 +34970 +1090 +10600 +34971 +1090 +34972 +28295 +1716 +13721 +3553 +34973 +14 +27355 +34974 +9 +57 +29628 +13656 +34975 +34976 +590 +16437 +887 +26358 +2724 +19787 +7376 +155 +34977 +10199 +24303 +34 +201 +34978 +34979 +7176 +34980 +209 +34981 +31873 +25237 +14330 +34982 +34983 +34984 +34985 +34986 +34987 +34988 +1157 +34989 +34990 +34991 +34992 +29815 +12987 +12987 +34993 +317 +57 +28317 +301 +1090 +10510 +33650 +21947 +1100 +27161 +9 +12701 +34994 +34995 +34996 +34997 +829 +228 +9 +34998 +25316 +2410 +34999 +354 +25943 +35000 +6095 +25943 +24144 +9 +15068 +17400 +286 +43 +317 +4764 +21822 +9 +14240 +26560 +29855 +35001 +35002 +1513 +35003 +24864 +6217 +35004 +13178 +43 +35005 +3994 +765 +26496 +57 +6950 +35006 +137 +34641 +1047 +5370 +21947 +35007 +35008 +11754 +590 +4055 +35009 +648 +35010 +14434 +104 +28317 +35011 +14330 +31293 +27669 +10031 +35012 +30451 +35013 +33627 +35014 +15718 +35015 +3546 +14369 +30458 +57 +35016 +915 +25140 +11471 +35017 +1090 +6766 +27669 +14693 +24864 +4055 +209 +35018 +1680 +35019 +35020 +28549 +30301 +9 +736 +484 +35021 +43 +5188 +694 +9 +35022 +345 +249 +35023 +27719 +5925 +18120 +35024 +29381 +4518 +20 +35025 +35026 +29628 +33508 +30877 +970 +31293 +35027 +4411 +35028 +590 +140 +15647 +25140 +21947 +35029 +317 +27669 +2314 +35030 +35031 +425 +20841 +19839 +2 +25382 +4528 +35032 +2769 +35033 +35034 +554 +34804 +35035 +31501 +35036 +21261 +15514 +14369 +33203 +35037 +822 +6525 +32153 +24632 +35038 +35039 +35040 +8668 +30224 +35041 +35042 +23103 +398 +1637 +3546 +35043 +14947 +23958 +2988 +35044 +15683 +35045 +249 +35046 +35047 +33650 +13566 +35048 +694 +26861 +35049 +590 +35050 +19 +35051 +5314 +30224 +35052 +25683 +35053 +43 +33693 +25172 +3095 +10 +2782 +28549 +1090 +18869 +29381 +2314 +1716 +4414 +140 +109 +2446 +35054 +17206 +2625 +43 +35055 +18956 +27669 +6142 +10990 +2349 +35056 +35057 +15730 +35058 +14369 +1559 +345 +1829 +1090 +1927 +1732 +7835 +5188 +12987 +3351 +35059 +4388 +35060 +34 +28745 +15699 +4502 +15718 +35061 +35062 +3977 +35063 +19026 +1710 +31293 +35064 +10535 +12005 +35065 +35066 +34402 +28474 +15 +177 +5085 +1394 +14330 +9 +35067 +5659 +16102 +16422 +16818 +35068 +29574 +34402 +34402 +2260 +35069 +1442 +43 +35070 +35071 +19 +1100 +35072 +35073 +12916 +11135 +35074 +28441 +6532 +1517 +35075 +26361 +1371 +35076 +791 +8160 +3842 +35077 +18394 +35078 +464 +35079 +301 +35080 +25683 +35081 +33650 +970 +35082 +35083 +4055 +35084 +386 +35085 +35086 +29483 +28036 +1291 +35087 +26361 +5780 +2082 +25140 +2 +3369 +1295 +15718 +590 +14363 +4 +35088 +1019 +25943 +8465 +29434 +19 +7776 +4055 +30177 +3546 +35089 +35090 +533 +35091 +34436 +29800 +32523 +2744 +35092 +9 +176 +5642 +35093 +35094 +323 +3777 +33650 +29200 +26559 +35095 +21947 +35096 +27843 +30224 +16 +3452 +2764 +34534 +1520 +1674 +13360 +42 +18284 +35097 +35098 +3575 +35099 +25237 +35100 +8668 +201 +35101 +103 +35102 +5188 +14369 +3385 +16 +9 +15 +35103 +19172 +35104 +35105 +665 +35106 +9020 +14369 +9 +34795 +9 +35107 +3460 +35108 +98 +35109 +29459 +25683 +35110 +24727 +35111 +14689 +4907 +35112 +1332 +11554 +25316 +1090 +3376 +35113 +31346 +35114 +7811 +4055 +1021 +15718 +15 +11727 +33606 +464 +25 +2694 +8297 +35115 +35116 +2550 +13578 +736 +35117 +35118 +6950 +31293 +33650 +32001 +25382 +15231 +9 +18250 +2406 +590 +35119 +35120 +5923 +14 +25683 +34 +2593 +3997 +4 +1743 +3287 +23764 +35121 +35122 +1382 +35123 +12987 +7835 +35124 +12851 +677 +30051 +35125 +19 +14369 +35126 +35127 +21947 +25316 +35128 +14330 +5085 +286 +35129 +12309 +33120 +613 +35130 +35131 +1051 +28295 +35132 +35133 +586 +15 +11341 +35134 +26704 +8668 +35135 +10544 +590 +21947 +4055 +35136 +9 +35137 +3958 +35138 +6915 +24258 +1160 +19655 +354 +32 +16437 +9 +43 +19 +286 +18045 +14369 +736 +1090 +43 +17151 +10298 +237 +1914 +17698 +4055 +28036 +22787 +3330 +35139 +14886 +736 +15718 +2316 +35140 +19 +2636 +35141 +6751 +35142 +35143 +35144 +35145 +35146 +29981 +36 +35147 +13484 +35148 +22697 +35149 +32 +2314 +12307 +22208 +35150 +19655 +33125 +24864 +35151 +35152 +694 +2117 +35153 +57 +35154 +35155 +2287 +29381 +4083 +18045 +29483 +228 +35156 +3601 +14 +33821 +23867 +345 +14001 +19 +35157 +6048 +14369 +8362 +1648 +282 +872 +35158 +11515 +1870 +2260 +29200 +6617 +1300 +35159 +14369 +5579 +137 +35160 +35161 +35162 +35163 +35164 +828 +590 +694 +9941 +17 +35165 +2733 +14947 +1091 +35166 +31293 +491 +1481 +284 +2 +28339 +4055 +35123 +8670 +3353 +35167 +2061 +28803 +533 +33445 +8895 +35168 +26361 +35099 +16206 +35169 +7276 +3546 +284 +19 +33120 +1141 +35170 +22213 +1520 +35171 +14604 +349 +1090 +35172 +35173 +1889 +35174 +1224 +337 +3546 +213 +1090 +29981 +35175 +8668 +33758 +2694 +861 +27669 +27069 +35176 +31293 +27069 +23958 +3553 +595 +35177 +14193 +4848 +29628 +1139 +17911 +35178 +35179 +35180 +9 +35181 +849 +590 +21689 +15511 +24303 +33120 +2310 +25943 +35182 +35183 +57 +284 +20187 +2117 +76 +35184 +35185 +104 +35186 +5503 +31293 +213 +8338 +31603 +736 +35187 +7053 +8021 +35188 +303 +19 +12684 +11321 +5080 +1090 +303 +14102 +303 +35189 +35190 +301 +35191 +33650 +27850 +354 +13391 +3787 +35192 +19 +1090 +43 +828 +3711 +35193 +34 +35194 +245 +2764 +35195 +35196 +25140 +35197 +1021 +15 +14576 +35198 +3 +35199 +16205 +35200 +1019 +35201 +18695 +35202 +2769 +337 +31293 +188 +303 +35203 +19 +25683 +35204 +248 +33758 +34 +25 +35205 +21227 +35206 +24303 +30051 +11552 +35207 +6658 +28908 +3764 +19852 +1090 +33627 +284 +35208 +17088 +2140 +18706 +597 +5326 +303 +1169 +2828 +27293 +284 +33494 +24303 +337 +35209 +19218 +18869 +9 +43 +35210 +1542 +399 +178 +35211 +30458 +15 +35212 +9 +8668 +4055 +35213 +35214 +3365 +2308 +5085 +34402 +35215 +10094 +2837 +16437 +35216 +373 +35217 +35218 +379 +337 +5188 +25129 +9 +284 +35219 +11851 +35220 +35221 +9 +14369 +31293 +98 +35222 +35223 +9 +20 +35224 +1090 +849 +31246 +694 +303 +228 +9 +345 +29381 +35225 +11647 +17834 +590 +4764 +2040 +35226 +57 +35227 +28036 +35228 +30877 +35229 +337 +26496 +35230 +35231 +43 +35232 +3994 +1027 +35233 +2157 +33650 +597 +53 +9384 +43 +286 +3546 +25237 +35234 +28441 +613 +30393 +4055 +35235 +597 +936 +1470 +24207 +35236 +35237 +3067 +586 +35238 +713 +35239 +43 +35240 +27669 +15718 +35241 +1290 +648 +16121 +19618 +35242 +89 +4055 +35243 +43 +35244 +24302 +3546 +8297 +35245 +16826 +35246 +1900 +17920 +35247 +5188 +9 +15261 +19486 +1295 +33627 +2804 +3553 +35248 +20291 +43 +35249 +20443 +35250 +35251 +21947 +29483 +31293 +35252 +35253 +303 +22552 +14947 +2038 +35254 +104 +9941 +28036 +43 +286 +533 +35255 +14369 +4055 +35256 +25865 +26724 +25307 +34402 +15 +6616 +24978 +28757 +337 +25793 +35257 +3814 +790 +20514 +17151 +9 +1090 +35258 +35259 +35260 +872 +35261 +8408 +35262 +27669 +9 +402 +43 +590 +35263 +32858 +31293 +25683 +24303 +35264 +10356 +19 +12178 +30877 +2430 +1047 +915 +35265 +35266 +35267 +4278 +1870 +24972 +430 +35268 +35269 +35270 +8512 +19 +18798 +35271 +35272 +8685 +11754 +31293 +32449 +18310 +13721 +1976 +25316 +586 +19618 +35273 +1203 +35274 +35275 +22666 +35276 +35277 +5908 +16102 +989 +35278 +21758 +248 +2694 +35279 +10264 +35280 +35281 +3546 +15 +22922 +11683 +19 +3546 +1612 +35282 +57 +35283 +21027 +3814 +4116 +3828 +142 +25584 +35284 +18659 +9 +1186 +5119 +35285 +29483 +590 +33120 +21527 +34402 +21947 +1401 +861 +35286 +29483 +35287 +2525 +23691 +14025 +35288 +1529 +27719 +35289 +1716 +35290 +35291 +2029 +1481 +35292 +35293 +32523 +57 +35294 +35295 +7053 +24864 +4547 +12120 +35296 +13905 +286 +22752 +1208 +35297 +35298 +30224 +2832 +1314 +26209 +155 +19 +25584 +9 +2501 +35299 +24864 +32 +35300 +21509 +165 +24021 +248 +19 +35301 +22666 +35302 +35303 +35304 +35305 +35306 +27669 +14562 +1021 +745 +1698 +20 +21947 +31168 +9560 +16437 +1011 +35307 +35308 +24864 +35309 +809 +35310 +89 +35311 +861 +9 +25683 +35312 +35313 +213 +35314 +303 +33120 +35315 +915 +29483 +590 +3546 +21689 +15951 +1870 +590 +2577 +153 +12202 +17422 +35316 +35317 +12432 +4055 +35318 +1090 +21426 +35319 +21947 +35320 +35321 +18654 +17020 +35322 +35323 +20130 +19618 +35324 +665 +1864 +21031 +286 +4055 +9 +35325 +25316 +33120 +2577 +1082 +35326 +4001 +34264 +25237 +19618 +33650 +2318 +35327 +35328 +3546 +35329 +25316 +345 +16437 +24144 +15533 +35330 +13721 +13390 +35331 +35332 +35333 +17497 +2 +14369 +35334 +35335 +35336 +27669 +736 +26861 +1584 +248 +9 +35337 +1924 +8460 +1154 +5925 +14935 +3010 +14 +1112 +35338 +19 +9 +21947 +3376 +35339 +53 +28036 +35340 +35341 +1612 +14888 +35342 +4055 +188 +5075 +3926 +35343 +35344 +1716 +19 +2289 +24144 +35320 +35345 +210 +188 +849 +35346 +1082 +35347 +35348 +17956 +970 +60 +28441 +35349 +35350 +16826 +35351 +14330 +590 +301 +66 +12936 +29483 +27669 +35352 +14477 +3546 +4 +19907 +5431 +345 +284 +35353 +17151 +17714 +19 +77 +213 +323 +32538 +1013 +35354 +3330 +35355 +1090 +26683 +27708 +1090 +35356 +35357 +16437 +6658 +32 +21689 +57 +35358 +337 +35359 +15 +23776 +35360 +7034 +16677 +35361 +4055 +35362 +35363 +209 +337 +140 +234 +34531 +303 +28317 +35364 +284 +4565 +35365 +495 +248 +15517 +3104 +33120 +35366 +35367 +35368 +35369 +35370 +35371 +17349 +7991 +284 +20700 +35372 +22922 +35373 +14369 +35374 +35375 +35376 +4055 +6294 +4765 +14477 +35377 +35378 +35379 +35380 +66 +613 +35381 +35382 +27669 +35383 +9 +43 +103 +35384 +971 +89 +19 +8670 +815 +57 +15 +33120 +35385 +35386 +16389 +34402 +19 +5780 +155 +35387 +35388 +19 +24864 +35389 +13829 +4698 +19 +27954 +3815 +19 +303 +35368 +35390 +25316 +1604 +35391 +25237 +5839 +590 +35392 +13279 +10028 +694 +18154 +713 +35393 +35394 +35395 +30877 +533 +35396 +17635 +35397 +5217 +35398 +7817 +35399 +1991 +31293 +14369 +303 +35400 +35401 +15669 +22989 +35402 +317 +32 +720 +25943 +35403 +15718 +3546 +35404 +35405 +35406 +533 +4634 +35407 +34 +5192 +35408 +14369 +35409 +35410 +4055 +24303 +30917 +25237 +3553 +21947 +35411 +35412 +29200 +35413 +35414 +35415 +21836 +35416 +3202 +15 +16258 +25239 +35417 +19 +19 +331 +2135 +21947 +35418 +8392 +357 +9 +12751 +14856 +6344 +2197 +35419 +21689 +554 +35420 +12987 +35421 +18310 +8372 +35422 +35423 +35424 +3316 +35425 +19 +30877 +35426 +373 +34402 +35427 +35428 +35429 +35430 +33113 +2770 +303 +35431 +21031 +484 +20218 +23442 +35432 +2724 +17571 +35433 +35434 +2310 +19 +142 +345 +35435 +21947 +33963 +30877 +30051 +4634 +19335 +7998 +35436 +31098 +35437 +35438 +25683 +337 +4055 +24666 +35439 +35440 +35441 +35442 +35443 +1300 +24864 +34402 +1867 +284 +35444 +9 +3137 +29 +24725 +28490 +24967 +598 +822 +14369 +43 +35445 +35446 +35447 +10028 +24864 +1021 +495 +35448 +5085 +33434 +284 +29381 +35449 +665 +27669 +349 +35450 +35451 +590 +35452 +35453 +35454 +15718 +19618 +35455 +1330 +464 +24864 +2577 +27669 +35456 +43 +14330 +286 +15989 +32 +2694 +8769 +29434 +35457 +17472 +15718 +2117 +35458 +35459 +35460 +20 +35461 +1091 +9410 +1090 +15367 +28317 +31293 +345 +19 +35462 +683 +9 +28028 +24303 +21573 +35320 +5806 +25237 +35463 +43 +24896 +35464 +35318 +35465 +35466 +35467 +15 +24303 +13721 +35468 +35469 +57 +4055 +35470 +14363 +2 +35471 +35472 +99 +2577 +35473 +1316 +35474 +35475 +35476 +4311 +19 +35477 +13638 +24263 +35478 +35479 +19205 +35480 +574 +1090 +14369 +35481 +16887 +2260 +4944 +35482 +35483 +694 +9 +20 +29381 +3743 +345 +57 +25237 +35484 +1107 +34656 +16443 +35485 +18896 +1376 +35486 +35487 +9 +35488 +2274 +25683 +35489 +14369 +342 +35490 +35491 +35492 +25281 +28753 +4055 +9 +25584 +35493 +30317 +590 +8525 +35494 +495 +29636 +35495 +35496 +35497 +26702 +20290 +35498 +35499 +1010 +736 +1234 +35500 +11471 +33128 +9738 +35501 +21947 +18951 +35502 +35503 +11822 +2733 +590 +12158 +2 +35504 +24303 +25683 +35505 +35506 +345 +66 +35507 +533 +35508 +11003 +35509 +2315 +28247 +35510 +15 +35511 +274 +35512 +736 +21947 +5318 +9 +573 +1208 +35513 +35514 +35515 +35516 +21947 +21947 +35517 +35518 +14330 +8670 +31293 +595 +19 +4055 +35519 +19618 +21031 +595 +509 +19 +7053 +35520 +35521 +35522 +35523 +15718 +35524 +33120 +35525 +3546 +35526 +19655 +249 +29483 +14102 +9 +31488 +5629 +35527 +35528 +35529 +3976 +6505 +19852 +24864 +2853 +25140 +33627 +1107 +25943 +32920 +35530 +363 +32359 +35531 +35532 +35533 +14369 +9 +21791 +1090 +2561 +19579 +14 +35534 +14369 +35535 +1090 +1208 +1090 +89 +4921 +35536 +22308 +971 +35537 +21947 +35538 +57 +35539 +12005 +1310 +35540 +6533 +35541 +25943 +9 +16437 +590 +35542 +35543 +35544 +35545 +35546 +35547 +35548 +29483 +4116 +35549 +18479 +32 +32 +35550 +4247 +809 +34619 +14947 +35551 +6071 +21678 +39 +1157 +33693 +35552 +13913 +201 +24426 +10247 +9 +35553 +35554 +251 +138 +20572 +14712 +5188 +35555 +35556 +35557 +14604 +35558 +12926 +179 +35559 +21947 +8316 +14369 +1604 +566 +197 +9 +373 +21947 +10212 +5773 +1524 +35560 +35561 +35562 +35563 +35564 +27669 +15718 +20471 +30877 +677 +35565 +24045 +590 +736 +43 +15718 +35566 +35567 +19 +35568 +35569 +35570 +25683 +35571 +9 +35572 +29483 +3200 +590 +34402 +35573 +14369 +16 +43 +424 +19091 +35574 +16102 +35575 +35576 +35577 +178 +30224 +887 +35578 +25683 +35579 +33 +176 +35580 +21947 +18503 +21947 +35581 +11469 +35582 +25237 +231 +24303 +17093 +1090 +25242 +14175 +35583 +33278 +770 +3119 +8249 +43 +5780 +1073 +21947 +43 +35584 +694 +209 +35585 +21947 +9 +33650 +35586 +35587 +35588 +35589 +98 +35590 +30877 +35591 +4055 +30877 +13424 +34402 +33627 +29007 +3601 +12 +29 +3119 +35592 +20952 +35593 +35594 +35595 +251 +2 +3442 +35596 +35597 +28494 +2260 +4634 +35598 +4055 +25316 +18695 +96 +5393 +5188 +29956 +35599 +23103 +34212 +5780 +694 +35600 +35601 +1612 +21947 +15 +16375 +33758 +13848 +35602 +35603 +931 +14871 +188 +5394 +14001 +1689 +34804 +21947 +35604 +32816 +28230 +35605 +8053 +9 +43 +31293 +28672 +4364 +19646 +30877 +590 +12552 +35606 +14 +100 +2919 +35607 +9 +20616 +1047 +35608 +1090 +15583 +28199 +1655 +20805 +8967 +1090 +35609 +35610 +4055 +3767 +179 +590 +2694 +16102 +2410 +242 +15718 +35611 +35612 +35613 +8053 +28441 +26945 +33650 +35614 +15206 +35615 +22738 +5004 +13963 +60 +30209 +35616 +35617 +35618 +35619 +3553 +11428 +936 +590 +43 +3984 +15524 +35620 +35621 +33693 +35622 +14340 +2314 +31424 +35623 +27514 +286 +286 +279 +590 +35624 +35625 +35626 +35627 +35628 +35629 +5601 +35630 +140 +21947 +12055 +35631 +35632 +35633 +590 +1563 +27669 +16437 +590 +22552 +31293 +19 +35634 +1529 +76 +19091 +14477 +35635 +736 +4 +671 +35636 +7817 +35637 +1517 +30877 +27669 +35638 +35639 +28036 +35640 +35641 +35642 +43 +1889 +28490 +77 +33674 +7015 +27069 +35643 +20218 +5629 +19 +35644 +10591 +35645 +1090 +35646 +5119 +21309 +35647 +29483 +1715 +14947 +3407 +31293 +35648 +1812 +21947 +1112 +66 +35649 +590 +35650 +35651 +35652 +2314 +397 +1605 +27178 +28441 +20260 +34433 +19655 +31168 +35653 +9953 +35654 +15718 +35655 +2769 +35656 +31293 +35657 +35658 +176 +25683 +6950 +19294 +1157 +27453 +1090 +21689 +35659 +35660 +35661 +35662 +21689 +35663 +3546 +2502 +21885 +730 +35664 +35665 +35666 +43 +35667 +43 +35668 +35669 +2514 +35670 +35671 +22898 +677 +4116 +188 +26638 +35672 +349 +9163 +89 +33650 +2811 +1918 +35673 +35320 +446 +1924 +35674 +5400 +35675 +4795 +43 +35676 +35677 +14186 +15 +35678 +14 +33650 +35679 +5420 +34204 +35680 +590 +25316 +29483 +28441 +35681 +35682 +25943 +35683 +35684 +30551 +43 +19 +9095 +35685 +590 +43 +33627 +35686 +35687 +30307 +35688 +35689 +13666 +5188 +2446 +25316 +27669 +590 +35690 +2561 +24303 +15054 +9 +17165 +35691 +35692 +26159 +35693 +17698 +21698 +35694 +25140 +14630 +9 +35695 +7912 +31873 +35696 +9 +24303 +16803 +5415 +590 +21689 +14482 +101 +35697 +35698 +2872 +2342 +35699 +35700 +4155 +35701 +20 +35702 +39 +20161 +3828 +29032 +9 +1465 +96 +590 +8910 +745 +15081 +3408 +35703 +1013 +10271 +35704 +1817 +2310 +31098 +153 +2694 +33137 +14482 +20825 +24192 +9 +14369 +35705 +3480 +14369 +416 +25943 +35706 +3908 +24896 +554 +25943 +178 +14825 +15471 +178 +57 +35707 +30877 +3104 +35708 +35709 +35710 +11483 +35711 +18553 +2019 +35712 +35713 +11762 +590 +35714 +25584 +17891 +1060 +595 +25237 +4502 +18951 +30580 +209 +25140 +5400 +11966 +249 +77 +16024 +35715 +17897 +345 +35716 +31873 +57 +12371 +35717 +24864 +35718 +27069 +590 +35719 +35720 +30877 +35721 +123 +34433 +14161 +9 +35722 +35723 +35320 +35724 +35725 +24803 +89 +31293 +5085 +10961 +43 +29065 +25683 +4820 +590 +14369 +35726 +7835 +35727 +43 +7891 +28036 +31293 +32438 +21947 +2537 +35728 +35729 +25140 +16437 +9 +32725 +19 +35730 +21698 +7480 +20 +35731 +35732 +43 +9 +4598 +1743 +19 +4028 +5780 +5409 +29527 +60 +35733 +3251 +32410 +18064 +35734 +35735 +5832 +35736 +21947 +286 +35737 +35738 +34402 +35739 +35740 +9 +586 +34964 +21947 +35741 +36 +970 +35742 +7328 +6294 +35743 +15 +12661 +11073 +35744 +2253 +4885 +16466 +35745 +29981 +25683 +736 +19 +33258 +7053 +9 +16975 +21947 +24247 +35746 +35747 +35748 +2023 +35749 +1423 +694 +14604 +35750 +222 +35751 +1090 +35752 +27069 +1738 +18130 +25316 +9 +910 +6029 +25069 +14369 +590 +8392 +35753 +1434 +8967 +35754 +19383 +28961 +15718 +33659 +17670 +35507 +27355 +43 +286 +21102 +7553 +35755 +35756 +14343 +27507 +35757 +25943 +707 +34402 +915 +35758 +21947 +34 +694 +26150 +43 +2625 +16102 +1716 +35759 +6595 +35760 +35761 +35762 +35763 +16085 +35764 +34402 +24303 +35765 +270 +33627 +35766 +590 +35767 +9 +795 +43 +286 +446 +35768 +827 +35769 +1090 +200 +30209 +35770 +35771 +18503 +12417 +24751 +35772 +35773 +18951 +35774 +29483 +13287 +31293 +4055 +1489 +35 +29200 +3908 +35775 +2655 +590 +35776 +35777 +35778 +9 +9941 +33627 +15535 +35779 +32 +35780 +35781 +25316 +25683 +15655 +15 +1920 +35782 +590 +317 +707 +3492 +958 +19 +14330 +646 +554 +22 +18350 +349 +31796 +35783 +35784 +35785 +25 +35786 +16102 +35787 +7855 +35320 +22963 +66 +35788 +15718 +2324 +31293 +8418 +28480 +14330 +19655 +4055 +4398 +35789 +35790 +35791 +21947 +7045 +21027 +342 +35792 +34402 +9561 +35793 +5409 +554 +35794 +8668 +23271 +3598 +27581 +25237 +201 +19 +35795 +10239 +14369 +35796 +112 +14330 +35797 +35798 +5755 +3481 +665 +35799 +250 +3287 +1224 +286 +2006 +185 +301 +5065 +176 +27719 +18331 +155 +43 +35800 +3829 +27669 +33278 +12013 +30877 +1478 +14992 +5188 +1437 +25316 +43 +43 +4055 +35801 +35802 +379 +35803 +5627 +35804 +35805 +33120 +286 +12987 +14604 +9 +178 +35806 +240 +35807 +34 +2 +23651 +31293 +2 +35808 +1415 +7537 +35809 +35810 +3484 +24864 +27669 +2919 +35811 +33368 +677 +35812 +14 +77 +590 +35813 +66 +17058 +590 +35814 +34908 +12987 +35320 +35815 +3842 +19 +35816 +35817 +323 +694 +357 +35481 +35818 +35819 +32782 +14240 +30051 +590 +35820 +24303 +179 +2 +29381 +28549 +8393 +35821 +970 +35822 +10111 +35823 +2253 +35824 +24864 +35825 +15718 +35826 +43 +137 +26724 +35827 +573 +9 +35828 +35829 +13721 +1515 +5780 +19 +15718 +970 +2537 +2619 +30877 +28194 +13721 +10230 +1502 +27140 +35830 +24045 +861 +19 +35831 +13721 +35832 +31293 +35833 +43 +9 +176 +35834 +35829 +30877 +34402 +5085 +1559 +21947 +14688 +14840 +24303 +21027 +18079 +8357 +43 +5075 +31293 +35835 +35836 +35837 +1157 +35838 +25129 +19983 +35839 +27705 +35840 +35841 +35842 +345 +514 +14001 +35843 +9 +590 +35844 +99 +35845 +35846 +15384 +35847 +13570 +28082 +35848 +35849 +34402 +35850 +11593 +24253 +35851 +17553 +35852 +683 +286 +35853 +33120 +2537 +35854 +29483 +35855 +115 +169 +46 +25237 +16511 +27954 +17151 +5085 +35856 +5197 +35857 +342 +35858 +14962 +33553 +27329 +1415 +9 +35859 +32518 +98 +30051 +590 +24864 +9460 +35860 +35861 +35862 +15428 +16102 +14827 +28441 +3553 +15 +35863 +352 +26496 +1139 +35864 +35865 +2476 +35866 +8798 +33758 +446 +590 +35867 +1056 +35868 +16437 +9 +327 +27669 +35869 +35870 +35871 +13538 +1100 +35872 +35873 +17864 +35874 +9 +1870 +57 +26323 +14 +12404 +35875 +14 +1524 +35876 +971 +35877 +35878 +29483 +43 +35879 +15 +35880 +35881 +286 +207 +15 +35882 +21947 +35883 +823 +671 +35884 +936 +27798 +4752 +27069 +1924 +25683 +1533 +352 +43 +155 +23103 +18982 +1300 +35885 +15989 +19 +35886 +8717 +35887 +10601 +35888 +25237 +35889 +2804 +26787 +30969 +6161 +9 +15 +7019 +8756 +13721 +35890 +35891 +35892 +14 +35893 +3 +35894 +209 +12916 +35895 +989 +2694 +35896 +35897 +815 +1189 +590 +6251 +35898 +2310 +27669 +576 +35899 +24864 +616 +17911 +4693 +35900 +1249 +35901 +24862 +15718 +19 +17911 +3546 +29200 +4055 +188 +15666 +35902 +970 +9871 +29483 +16618 +35903 +590 +35904 +1172 +35905 +35906 +12936 +21947 +35907 +35908 +26946 +2064 +25237 +12240 +35909 +28317 +286 +19091 +2410 +43 +19 +35910 +21031 +27669 +52 +20 +4803 +21947 +514 +35911 +201 +671 +25140 +7835 +35912 +5085 +29381 +35913 +1364 +35914 +35915 +2243 +4055 +35916 +35917 +21006 +26361 +22963 +33693 +10643 +25133 +35918 +29424 +31293 +5780 +10979 +23103 +35919 +9 +5021 +6766 +29721 +32805 +35920 +377 +8756 +35921 +35922 +35923 +1090 +25683 +22109 +35844 +1566 +3213 +341 +24303 +35924 +33650 +9 +35925 +14435 +399 +34402 +35926 +29483 +26666 +33113 +14909 +35927 +35928 +1442 +35929 +3055 +9 +29483 +4055 +14477 +35930 +25140 +16437 +35931 +35932 +17151 +10239 +35933 +35934 +31293 +31293 +35935 +703 +13365 +35936 +35937 +14369 +548 +32 +35938 +35939 +4908 +554 +35940 +35320 +18695 +3353 +677 +8961 +2694 +29629 +30877 +35941 +31293 +35942 +43 +2769 +823 +259 +28116 +35943 +35944 +35945 +26744 +35946 +35947 +35948 +35949 +14001 +35950 +9210 +35951 +270 +1090 +35952 +209 +5908 +35953 +11593 +35954 +416 +10601 +35955 +35956 +590 +35957 +35958 +5085 +970 +1710 +35959 +7813 +573 +29483 +1090 +35960 +9953 +1234 +19 +35961 +590 +24303 +32449 +35962 +35963 +34433 +22607 +14477 +35964 +43 +35965 +14669 +9 +209 +14942 +137 +27525 +24045 +21729 +6095 +14477 +35966 +35967 +30877 +35968 +35969 +1976 +2561 +495 +9 +32 +35970 +35773 +35971 +20442 +1316 +7912 +35972 +35973 +35974 +3 +15718 +26069 +25659 +35975 +29687 +35976 +27024 +35977 +25061 +12555 +35978 +19 +35979 +43 +1100 +19 +35980 +7480 +35981 +35982 +30877 +2314 +35983 +3407 +317 +35984 +272 +35985 +35986 +35987 +35988 +21947 +19 +8849 +869 +35989 +9 +1808 +35990 +14103 +20138 +1834 +28490 +35991 +4055 +35992 +35993 +35994 +1604 +27262 +25237 +29628 +2356 +3003 +35995 +35996 +1531 +25316 +613 +13304 +2136 +35997 +35998 +4658 +35999 +19618 +1575 +15298 +43 +15718 +36000 +36001 +36002 +21947 +36003 +19 +2619 +36004 +29204 +28186 +379 +36005 +11176 +36006 +36007 +36008 +1425 +36009 +15035 +36010 +9 +36011 +36012 +1013 +13721 +22963 +36013 +25300 +36014 +42 +36015 +36016 +20952 +16328 +30224 +36017 +10 +19372 +14299 +29483 +36018 +16437 +4775 +36019 +36020 +36021 +33627 +19618 +36022 +24678 +7191 +36023 +9258 +19009 +31293 +32564 +10853 +14369 +28307 +1790 +36024 +36025 +36026 +36027 +2537 +36028 +36029 +3755 +5780 +12827 +36030 +36031 +9 +2463 +36032 +26496 +29800 +576 +5188 +36033 +24303 +36034 +36035 +36036 +36037 +16 +25528 +33444 +36038 +29597 +36039 +317 +1090 +36040 +36041 +36042 +1082 +21947 +27669 +36043 +14369 +12185 +338 +686 +36044 +36045 +36046 +36047 +43 +22 +861 +5344 +4367 +36048 +36049 +36050 +25316 +21947 +36051 +31873 +24303 +943 +24303 +29145 +3976 +15 +1090 +36052 +14477 +17549 +13529 +4938 +12198 +13680 +36053 +9561 +1615 +1013 +29938 +32 +36054 +36055 +36056 +36057 +248 +32402 +970 +286 +36058 +36059 +36060 +36061 +36062 +25140 +34346 +36063 +201 +4624 +1021 +141 +17356 +36064 +36065 +248 +1745 +27669 +337 +43 +17956 +317 +43 +13317 +14477 +14477 +28036 +36066 +30877 +1812 +33368 +19 +34641 +36067 +36068 +1013 +2814 +19 +31346 +36069 +25237 +3994 +18350 +27669 +36070 +15989 +35427 +21027 +8297 +21689 +36071 +98 +36072 +36073 +36074 +115 +36075 +13905 +32402 +36076 +14342 +36077 +14369 +36078 +1090 +36079 +1116 +248 +14369 +36080 +495 +2019 +36081 +4502 +398 +36082 +18844 +36083 +2324 +1710 +36084 +36085 +36086 +6116 +3546 +337 +5085 +178 +9163 +21947 +16798 +36087 +36088 +36089 +36090 +36091 +4463 +1090 +36092 +349 +303 +77 +2410 +14553 +36093 +27387 +1637 +12371 +36094 +34957 +19 +20 +30877 +373 +736 +6627 +36095 +17151 +36096 +36097 +30224 +831 +7176 +36098 +36099 +2577 +36100 +77 +36101 +11483 +29 +1562 +36102 +14947 +213 +36103 +337 +31474 +345 +337 +36104 +21947 +24303 +590 +30040 +8282 +3964 +736 +36105 +338 +36106 +43 +5085 +164 +9 +30877 +33627 +15 +43 +554 +1090 +36107 +36108 +590 +14369 +284 +303 +36109 +36110 +36111 +20 +13207 +533 +24864 +1090 +36112 +9 +43 +1090 +3657 +36113 +11171 +36114 +6571 +28441 +29381 +1605 +14330 +57 +26577 +568 +89 +36115 +36116 +36117 +36118 +36119 +3186 +32642 +36120 +36121 +303 +34181 +1090 +31293 +36122 +31603 +36123 +2525 +36124 +36125 +19318 +27719 +36126 +25237 +36127 +4885 +14369 +1224 +25237 +3569 +213 +9 +270 +7615 +36128 +31098 +2694 +9396 +36129 +27599 +342 +1090 +27669 +36130 +14079 +36131 +34402 +36132 +25 +5229 +33120 +36133 +28441 +20 +31225 +14369 +36134 +36135 +17730 +22412 +2616 +915 +36136 +345 +3335 +17151 +1710 +29402 +114 +213 +36137 +9 +36138 +12597 +60 +554 +2195 +36139 +22986 +36140 +21088 +36141 +3994 +9 +6505 +19907 +887 +36142 +3978 +1361 +13721 +36143 +24303 +36144 +377 +36145 +15718 +36146 +2619 +30917 +36147 +36148 +36149 +1090 +36150 +36151 +36152 +590 +4 +36153 +24154 +29544 +7053 +11026 +2525 +23103 +36154 +19 +3546 +5780 +36155 +36156 +14013 +13539 +57 +3546 +36157 +3546 +14369 +36158 +24864 +6054 +1637 +36159 +2206 +36160 +35568 +36161 +3601 +36162 +16466 +9543 +16242 +36163 +19 +358 +28441 +36164 +201 +1090 +491 +1508 +36165 +8668 +13807 +2577 +17151 +36166 +24303 +1089 +36167 +36168 +1090 +36169 +15705 +1090 +872 +19 +31668 +1712 +36170 +1688 +36171 +15718 +3435 +36172 +36173 +43 +5904 +1867 +25316 +1157 +36174 +27719 +4002 +36175 +24864 +36176 +1157 +29561 +36177 +35320 +20768 +43 +17136 +36178 +15226 +201 +19618 +98 +2567 +57 +809 +36179 +30224 +36180 +36181 +27954 +9629 +28036 +27538 +13359 +590 +36182 +590 +17151 +36183 +31293 +36184 +9 +1364 +33627 +43 +7053 +36185 +5188 +9 +3546 +13908 +30877 +345 +23103 +36186 +66 +36187 +36188 +26613 +36189 +36190 +36191 +36192 +36193 +34402 +519 +5833 +36194 +317 +25 +9 +14369 +554 +15 +25455 +19618 +28923 +14330 +2882 +36195 +29381 +19 +30877 +15938 +36196 +3484 +197 +36197 +519 +323 +36198 +43 +2406 +17151 +566 +36199 +21746 +137 +36200 +11008 +14947 +36201 +36202 +1429 +36203 +36204 +77 +36205 +25382 +1229 +15 +1870 +36206 +36207 +8249 +36208 +19 +15 +36209 +21947 +21689 +386 +8042 +6595 +43 +19 +597 +58 +29981 +13996 +23190 +1524 +736 +43 +15718 +317 +36210 +36211 +36212 +20510 +33099 +18707 +36213 +17151 +9934 +36214 +36215 +36216 +36217 +3067 +36218 +16560 +14887 +9 +2694 +436 +26357 +795 +18107 +59 +656 +178 +16 +1090 +34402 +36219 +36220 +303 +36221 +9 +36222 +19 +43 +36223 +43 +242 +971 +36224 +990 +1562 +21261 +646 +15718 +36225 +21698 +36226 +464 +17151 +201 +123 +36227 +36228 +2865 +123 +10349 +36229 +36230 +36231 +36232 +20600 +13465 +36233 +20571 +33838 +25097 +36234 +598 +36235 +10156 +36236 +15597 +2865 +36237 +3867 +36238 +25683 +36239 +23103 +15 +34337 +3764 +24864 +3317 +60 +4166 +597 +36240 +36241 +1090 +915 +14369 +1384 +590 +446 +36242 +31293 +36243 +18940 +43 +6214 +36244 +36245 +1870 +27355 +1612 +36246 +34402 +14369 +677 +27069 +31346 +36247 +36248 +9 +34 +43 +33120 +33330 +36249 +36250 +15718 +14 +15718 +27669 +36251 +36252 +25659 +36253 +14102 +15718 +31168 +29204 +4521 +36254 +201 +841 +24303 +2314 +36255 +36256 +1018 +19 +26414 +36257 +36258 +36259 +36260 +89 +19209 +14369 +29483 +21863 +36261 +43 +36262 +36263 +36264 +36265 +36266 +21045 +845 +1112 +32 +43 +36267 +36268 +1842 +30650 +24896 +533 +36269 +115 +12180 +22963 +5780 +36270 +658 +16121 +36271 +14369 +3369 +34650 +1829 +736 +36272 +720 +2694 +25659 +179 +36273 +36274 +32 +36275 +36276 +26209 +18242 +3598 +36277 +536 +36278 +36279 +4502 +36280 +1605 +9 +36281 +22256 +9 +3553 +17382 +887 +3567 +36282 +36283 +24725 +36284 +36285 +36286 +19 +36287 +736 +9 +3081 +35320 +36288 +590 +265 +43 +1885 +36289 +19918 +3484 +339 +14330 +36290 +36291 +4 +13748 +36292 +36293 +17228 +1920 +21947 +34402 +36294 +30224 +25237 +36295 +36296 +36297 +36298 +827 +19 +36299 +30224 +36300 +36301 +24144 +36302 +14001 +18896 +14001 +849 +3978 +36303 +115 +24862 +36304 +9 +36305 +736 +2619 +736 +36306 +554 +36307 +3330 +19 +36308 +9 +36309 +15718 +1901 +36310 +24045 +36311 +32984 +76 +43 +36312 +16826 +57 +36313 +43 +1011 +36314 +15718 +36315 +32 +1454 +14204 +15 +768 +36316 +29716 +36317 +15 +58 +36318 +188 +24144 +43 +2 +35458 +14363 +736 +14 +14342 +17326 +31293 +36319 +7835 +36320 +36321 +14369 +36322 +24864 +15298 +13140 +28317 +36323 +36324 +25943 +36325 +24144 +36326 +5963 +172 +36327 +36328 +31293 +19618 +209 +36329 +36330 +1169 +2260 +9 +22 +140 +8896 +345 +4 +30877 +24725 +36331 +17911 +36332 +345 +25316 +36333 +5539 +14061 +1090 +5117 +36334 +35409 +2728 +34375 +19750 +21947 +21251 +36335 +10505 +1222 +590 +25 +22818 +36336 +2576 +27669 +43 +30051 +33627 +8986 +21689 +36337 +19858 +36338 +36339 +36340 +6519 +36341 +36342 +19 +7601 +36343 +32871 +5253 +30051 +35104 +6263 +29483 +5014 +1716 +36344 +21947 +36345 +36346 +36347 +20745 +19852 +25943 +11966 +32 +1107 +1870 +9 +14477 +14260 +5780 +36348 +18830 +5431 +369 +36349 +36350 +53 +36351 +10791 +4364 +30373 +36352 +4531 +36353 +34402 +18782 +141 +16429 +2733 +4055 +26361 +2314 +342 +3546 +21791 +36354 +36355 +6624 +19 +590 +2406 +57 +36356 +415 +36357 +36358 +179 +33627 +36359 +43 +4055 +201 +36360 +10789 +14330 +286 +915 +29 +27669 +36361 +13721 +36362 +25140 +36363 +14369 +36364 +36365 +15718 +19218 +14814 +36366 +3958 +31098 +36367 +8342 +342 +9 +36368 +36369 +36370 +36371 +36372 +36373 +26559 +28441 +20443 +23588 +1870 +265 +36374 +19 +176 +109 +24864 +25316 +9 +36375 +36376 +137 +3061 +1172 +9 +36377 +36378 +23103 +17698 +12989 +36379 +36380 +10 +36381 +36382 +8896 +1680 +1234 +1514 +34650 +36383 +36384 +671 +36385 +590 +29628 +36386 +15 +13843 +9 +67 +15 +23103 +20187 +178 +14001 +16798 +676 +36387 +14 +36388 +36389 +34850 +36390 +17151 +9 +43 +33627 +36391 +751 +36392 +1116 +2733 +27599 +36393 +5169 +28923 +14363 +25776 +36394 +3050 +1604 +36395 +12480 +9 +845 +36396 +36397 +36398 +32 +21947 +57 +354 +36399 +34402 +15 +36400 +21647 +1716 +36401 +415 +17151 +57 +36402 +36403 +7157 +36404 +43 +104 +12180 +2561 +12343 +15 +17941 +26484 +36405 +2164 +32253 +9481 +15718 +36406 +4528 +9 +6710 +9 +36407 +29381 +36408 +9941 +25140 +36409 +379 +36410 +11469 +936 +736 +36411 +36412 +13943 +36413 +1566 +8110 +14369 +33120 +1310 +3743 +228 +7835 +36414 +36415 +36416 +15437 +36417 +24303 +7053 +4055 +36418 +2936 +36419 +36420 +36421 +415 +9 +30650 +14369 +28502 +36422 +36423 +2694 +36424 +7 +36425 +25584 +36426 +11321 +345 +23103 +586 +29981 +11571 +33627 +36427 +815 +7471 +26125 +3553 +9 +13721 +1090 +36428 +36429 +36430 +7208 +4055 +43 +7107 +34 +26559 +349 +3104 +36431 +345 +36432 +36433 +345 +36434 +12518 +18588 +36435 +31293 +36436 +349 +29381 +104 +2902 +1508 +36437 +1021 +30224 +12987 +3546 +36438 +286 +36439 +5394 +57 +3317 +24864 +36440 +33501 +36441 +24303 +19 +36442 +36443 +16056 +14369 +19 +36444 +36445 +32410 +24207 +14363 +14343 +72 +15 +36446 +8351 +25683 +10910 +491 +27669 +36447 +541 +23176 +2356 +27508 +36448 +36449 +36450 +279 +2197 +43 +21947 +365 +701 +36451 +23921 +4055 +36452 +35352 +36453 +27669 +36454 +36455 +3842 +176 +36456 +36457 +31873 +36458 +2476 +36459 +36460 +399 +36461 +36462 +36463 +36464 +141 +25237 +17602 +43 +17149 +9 +705 +845 +36465 +18787 +27669 +36466 +345 +36467 +33 +31346 +36468 +27669 +36469 +23970 +36470 +20 +36471 +9 +36472 +17150 +6571 +25632 +36473 +19618 +3546 +3236 +16 +36474 +15718 +484 +3059 +6317 +43 +15718 +533 +36475 +14571 +36476 +25237 +1870 +36477 +36478 +31293 +590 +671 +25683 +491 +36479 +36480 +910 +36481 +36482 +30458 +33494 +36483 +21829 +36484 +28549 +36485 +36486 +11273 +15718 +36487 +43 +23322 +36488 +15 +98 +36489 +14604 +7107 +11774 +34264 +33627 +713 +194 +1810 +36490 +36491 +5780 +13566 +17151 +36492 +1384 +36493 +11822 +25943 +491 +4033 +36494 +33650 +14330 +36495 +286 +25316 +25 +3059 +590 +36496 +36497 +36498 +36499 +6829 +1107 +590 +349 +36500 +36501 +8774 +36502 +36503 +34181 +357 +27069 +36504 +36505 +29284 +14369 +317 +17670 +36506 +36507 +12166 +19618 +30224 +36508 +554 +36509 +21280 +590 +15718 +36510 +25053 +36511 +22 +3484 +15718 +19 +36512 +27669 +36513 +27798 +1116 +286 +12987 +15 +36514 +15 +36515 +12299 +89 +4441 +9 +7725 +36516 +33120 +33508 +36517 +7991 +28392 +872 +21947 +1508 +1090 +36518 +1100 +1696 +745 +36519 +36520 +5415 +31041 +21958 +36521 +21947 +566 +36522 +16325 +58 +28402 +34628 +30051 +57 +36424 +36523 +3148 +14679 +9 +3 +36524 +27669 +36525 +36526 +17670 +36527 +3546 +6595 +597 +699 +10123 +9 +36528 +8821 +36529 +34181 +20514 +3196 +484 +12646 +15718 +11321 +36530 +36531 +36532 +4982 +36533 +36534 +9410 +2061 +30877 +36535 +36536 +138 +32 +36537 +19 +3599 +36251 +34402 +33278 +5344 +36538 +27835 +19 +5409 +15718 +89 +27954 +36539 +7154 +36540 +9 +25237 +36541 +16866 +36542 +3994 +11593 +36543 +8096 +1090 +17151 +536 +5791 +915 +15718 +1688 +745 +970 +29483 +861 +1100 +36177 +1465 +32 +19579 +2367 +36544 +36545 +28219 +3553 +36546 +36547 +14369 +15 +14000 +36548 +1720 +4307 +3553 +1547 +36549 +33758 +1920 +12621 +36550 +17911 +13907 +30068 +586 +43 +36551 +6096 +745 +14 +32538 +57 +809 +16121 +36552 +36553 +3546 +31293 +11960 +936 +36554 +3491 +30224 +30224 +36555 +36556 +36557 +36558 +22752 +24 +22963 +14604 +26040 +30877 +36559 +66 +43 +9 +36560 +1524 +2206 +27277 +27684 +36561 +36562 +14616 +35546 +761 +60 +4897 +4468 +36563 +10147 +36564 +1615 +18311 +8146 +23442 +242 +36565 +228 +21188 +4279 +20 +18479 +2561 +6996 +20339 +358 +36566 +33890 +36567 +36568 +6505 +16589 +5316 +36569 +27141 +36570 +736 +36571 +970 +36572 +19655 +1605 +22082 +36573 +36574 +57 +32359 +36575 +16798 +36576 +19 +36577 +36578 +30877 +25140 +3296 +33120 +36579 +1013 +36580 +28961 +9 +36581 +36582 +23103 +590 +2476 +694 +1364 +36583 +4364 +573 +14001 +77 +31441 +36584 +222 +1502 +36585 +6950 +36586 +282 +36587 +36588 +21947 +20798 +27205 +197 +9 +24144 +36589 +2694 +33494 +1464 +36590 +31293 +590 +36591 +4055 +822 +249 +36592 +13452 +26484 +36593 +8668 +3553 +9 +36594 +21947 +20 +1444 +36595 +18077 +36596 +16678 +33278 +36597 +536 +4344 +5313 +36598 +533 +36599 +1384 +3886 +14369 +34402 +349 +1307 +36600 +30650 +14001 +4650 +19903 +541 +36601 +36602 +30177 +17151 +1291 +29844 +36603 +23103 +28317 +1056 +815 +36604 +590 +36605 +36606 +5145 +15647 +24864 +5627 +11966 +36607 +26604 +36608 +46 +36609 +2136 +36610 +36611 +15718 +21027 +474 +36612 +442 +3546 +36613 +33627 +815 +36614 +22922 +19 +26295 +25102 +19 +36615 +36616 +36617 +2926 +7964 +201 +30209 +39 +18045 +30877 +188 +7451 +36618 +27669 +16826 +19 +554 +30877 +36619 +5780 +1559 +36620 +31293 +33650 +36621 +36622 +33494 +13905 +36623 +345 +36624 +915 +36625 +179 +66 +36626 +36627 +9 +1090 +36628 +19 +66 +15718 +14363 +27669 +23603 +4055 +21947 +197 +36629 +36630 +36631 +36177 +25659 +8188 +29381 +21947 +484 +16096 +36632 +25316 +34532 +36633 +33061 +1107 +36634 +36635 +1262 +77 +36636 +15718 +9 +36637 +36638 +36639 +1682 +30458 +36640 +36641 +3546 +21947 +36642 +1082 +36643 +32 +36644 +11762 +19 +10 +36645 +8137 +4116 +19 +30051 +3999 +36646 +27669 +36647 +616 +2040 +36648 +36649 +6054 +613 +36650 +13566 +13721 +14363 +36651 +36652 +36653 +36654 +57 +411 +6116 +7053 +15536 +1920 +43 +1316 +36655 +15 +10356 +24864 +20745 +24303 +34402 +1559 +4055 +28961 +36656 +36657 +822 +27669 +286 +16437 +36658 +339 +185 +9 +5780 +31234 +36659 +827 +36660 +23103 +29381 +36661 +60 +36662 +36663 +33650 +19 +201 +24864 +18553 +140 +142 +36664 +36665 +155 +36666 +745 +21947 +20 +3059 +12 +36667 +36668 +7154 +15718 +5188 +36669 +36670 +201 +29200 +16 +4 +21947 +16290 +1745 +36671 +19 +24303 +4982 +11995 +971 +36672 +286 +24864 +9 +1228 +36673 +1720 +671 +19852 +31293 +36674 +19 +20514 +28961 +415 +250 +25584 +21689 +14330 +7600 +2 +2694 +23103 +36675 +665 +15 +36676 +20 +14751 +17670 +590 +36677 +286 +19 +9999 +2164 +17259 +36678 +11624 +323 +36679 +36680 +36681 +36682 +36683 +338 +20005 +5188 +32 +865 +14856 +36684 +590 +9 +43 +36685 +36686 +36687 +19907 +33061 +36688 +36689 +36690 +36691 +24864 +66 +18951 +1563 +4 +2500 +13323 +36692 +36693 +32449 +9 +21947 +474 +32 +1230 +53 +36694 +2561 +24864 +1090 +1870 +30877 +9 +36695 +77 +36696 +16437 +19 +3546 +3546 +3385 +30877 +17151 +23743 +554 +36697 +5188 +345 +613 +1112 +31293 +554 +415 +22963 +15 +30877 +736 +36698 +36699 +19794 +5966 +11966 +5623 +13323 +36700 +31433 +36701 +57 +23103 +36702 +25943 +36703 +25584 +29381 +36704 +1423 +301 +21226 +36705 +36706 +36707 +30877 +6518 +36708 +1961 +1244 +12124 +36709 +36710 +24725 +33650 +8967 +14947 +2865 +1384 +35427 +201 +12956 +5297 +694 +36711 +4452 +411 +36712 +36713 +197 +590 +21947 +36714 +2015 +35052 +1115 +4055 +18503 +21791 +8392 +36715 +32523 +25 +936 +5188 +14001 +9 +36716 +36717 +28317 +19 +5085 +9 +2694 +16466 +30877 +27117 +1524 +29527 +21947 +36718 +36719 +30877 +36720 +2476 +36721 +12987 +29483 +36722 +7379 +36723 +768 +6010 +8249 +9 +36724 +36725 +33494 +30877 +590 +19797 +590 +936 +586 +36726 +13279 +21266 +36727 +20 +1596 +36728 +1369 +278 +36729 +36730 +2254 +36731 +4441 +43 +7071 +15718 +36732 +43 +20 +27669 +36733 +31293 +16422 +31691 +36734 +16826 +36735 +76 +22 +15914 +21028 +35547 +1716 +1444 +942 +36736 +36737 +19852 +36738 +484 +286 +2655 +677 +36739 +13943 +14 +349 +36740 +586 +21947 +36741 +13260 +3546 +36742 +2330 +7154 +30877 +31139 +36743 +33627 +14369 +36744 +2764 +17151 +36745 +36746 +14477 +590 +25584 +66 +11624 +286 +1961 +36747 +1942 +36748 +36749 +36750 +36751 +1090 +36752 +43 +2460 +36753 +17144 +12987 +16329 +36754 +7399 +29981 +53 +36755 +2694 +33061 +36756 +36757 +15718 +286 +20933 +22 +8554 +861 +286 +114 +36758 +36759 +2314 +36760 +17151 +24303 +9246 +1961 +36761 +4820 +24303 +14 +3601 +36762 +15 +36763 +15 +5188 +1169 +12987 +36764 +36765 +2561 +25364 +16121 +25584 +23103 +590 +6950 +19655 +36766 +861 +4502 +36218 +36767 +2009 +33673 +14369 +5886 +21947 +36768 +14604 +2762 +36769 +5409 +4238 +36770 +36771 +36772 +76 +910 +303 +36773 +26361 +33627 +9 +26744 +3477 +99 +352 +7053 +36774 +36775 +1738 +331 +703 +13721 +1051 +36776 +9573 +5188 +35400 +213 +11341 +495 +2254 +30877 +495 +16466 +57 +3858 +15718 +28317 +178 +15824 +33650 +377 +4002 +31293 +20058 +1244 +9 +14369 +36777 +248 +12055 +36778 +1295 +415 +21947 +28317 +36779 +36780 +3976 +36781 +31225 +19618 +36782 +36783 +1606 +36784 +36785 +36786 +36787 +373 +36788 +36789 +21681 +36790 +15 +36791 +36792 +36793 +337 +19209 +29483 +30650 +4634 +36794 +36795 +1090 +36796 +827 +12 +36797 +27669 +11321 +36798 +36799 +3912 +36800 +36674 +5188 +36801 +28559 +19653 +30877 +36802 +5316 +2064 +36803 +43 +16437 +25316 +25237 +24864 +25140 +751 +36804 +36805 +36806 +15 +554 +20 +1021 +15718 +9 +19 +36807 +36808 +33890 +36809 +248 +23103 +12819 +4055 +14369 +36810 +32642 +248 +3491 +1425 +1300 +7364 +16820 +36811 +31225 +22963 +16443 +43 +4055 +36812 +8208 +7658 +36813 +43 +1531 +34402 +36814 +36815 +13535 +36816 +36817 +36818 +36819 +2356 +36820 +57 +36821 +3553 +19 +43 +36822 +1090 +646 +1502 +43 +36823 +36824 +35389 +491 +27669 +1907 +303 +13904 +36825 +9 +34233 +2581 +1090 +4155 +36826 +36827 +11754 +27669 +36828 +28272 +36829 +514 +3546 +713 +1195 +3353 +36830 +1882 +5773 +32880 +19 +3543 +36831 +36832 +4055 +36833 +15331 +19618 +30051 +36834 +30051 +57 +34264 +3546 +32 +30051 +36835 +36836 +1558 +23103 +1224 +36837 +36735 +24303 +36838 +36839 +31293 +27079 +36840 +283 +33890 +36841 +4055 +36842 +34402 +1090 +36843 +1011 +337 +9 +736 +12987 +24303 +36844 +30224 +23495 +1257 +337 +36845 +7053 +590 +36846 +36847 +19 +36848 +18439 +6051 +1310 +36849 +36850 +36851 +10262 +31160 +36852 +4502 +31691 +2561 +2694 +36424 +27669 +43 +36853 +736 +36854 +36855 +36856 +36857 +28317 +5650 +77 +30224 +33 +57 +36858 +36639 +30747 +27117 +36859 +29200 +1013 +19 +2957 +36860 +1051 +31576 +590 +19 +36861 +3 +25584 +36862 +5582 +1539 +24998 +1208 +26142 +861 +36863 +31168 +36864 +590 +2166 +1107 +13375 +36865 +15 +12194 +57 +27669 +27095 +2694 +533 +736 +5780 +115 +30983 +1091 +36866 +36867 +15718 +736 +4055 +354 +36868 +36869 +36870 +21947 +33280 +36871 +60 +29791 +6840 +36872 +36873 +36874 +53 +31109 +21947 +36875 +36876 +19 +25140 +736 +36877 +5045 +36878 +36879 +398 +1870 +66 +9976 +16466 +36328 +36880 +36881 +16066 +14340 +14369 +36882 +36883 +14947 +1090 +845 +11762 +6627 +26361 +14909 +33650 +12020 +28317 +554 +36884 +7855 +36885 +1349 +32 +36886 +36887 +36888 +25 +4055 +492 +248 +25237 +43 +495 +27669 +36889 +36890 +415 +43 +1090 +19 +36891 +29483 +28441 +665 +9497 +36892 +24725 +4787 +358 +25316 +20514 +43 +36893 +19 +36894 +14330 +1100 +36895 +1018 +27669 +43 +29200 +869 +354 +36896 +36897 +36898 +21947 +19 +36899 +36900 +439 +3546 +19 +36901 +14731 +536 +36902 +36903 +1920 +3842 +31098 +1349 +36904 +36905 +303 +3546 +20329 +15413 +2728 +8146 +36906 +887 +36907 +27117 +210 +17151 +36908 +12987 +15 +3546 +1090 +36909 +36910 +36911 +464 +36912 +36913 +36914 +590 +31225 +1090 +36915 +1100 +646 +3546 +705 +31098 +36916 +14001 +36917 +36918 +21089 +2782 +43 +16375 +36919 +36920 +1090 +36921 +248 +2865 +3484 +6306 +12096 +66 +29628 +1090 +590 +30051 +179 +36922 +3546 +36923 +46 +1011 +1508 +2561 +345 +25395 +16 +4 +958 +36924 +5409 +36925 +22556 +36926 +6785 +590 +2577 +104 +17151 +25281 +36927 +3994 +30051 +2769 +36928 +4236 +2913 +36929 +210 +4806 +648 +1524 +484 +15647 +36930 +495 +272 +20339 +21027 +1967 +36931 +36932 +19111 +32 +13829 +958 +31293 +36933 +29931 +19549 +36934 +34402 +24303 +1855 +10280 +5041 +4055 +720 +20853 +586 +36935 +19 +665 +286 +19618 +16466 +66 +13566 +43 +34602 +36936 +35888 +4028 +36937 +36938 +2 +44 +36939 +2593 +18517 +29483 +2324 +20443 +33650 +11715 +36940 +36941 +9460 +32496 +7666 +36942 +17151 +3353 +36943 +36944 +36945 +6595 +36946 +4055 +2349 +57 +4388 +25584 +16437 +17687 +36947 +4702 +98 +1154 +29204 +36735 +28317 +36948 +36949 +21947 +1245 +18982 +15498 +16 +36950 +36951 +36952 +36953 +514 +274 +7923 +36954 +9 +29483 +23302 +13517 +1716 +57 +9 +9 +36955 +8465 +36956 +36957 +179 +36958 +2274 +36959 +36960 +7053 +36735 +36961 +14001 +14 +43 +36962 +36963 +9 +5287 +36964 +43 +14369 +5849 +730 +36965 +36966 +16024 +36967 +11770 +303 +29381 +528 +19 +36968 +36969 +36970 +16437 +33650 +1082 +89 +14369 +286 +5409 +36971 +349 +1090 +8171 +36972 +36973 +30877 +29628 +36974 +3686 +36975 +2709 +19 +36976 +12005 +2728 +36977 +19 +14369 +36978 +9 +36979 +36980 +57 +2427 +1295 +36981 +21045 +3764 +36982 +19 +2260 +509 +24864 +1090 +36983 +43 +18695 +21781 +36424 +17092 +36984 +21689 +28549 +36985 +19 +30051 +29628 +23322 +26040 +48 +36986 +13113 +720 +35624 +32984 +6439 +36987 +27708 +36988 +36989 +1817 +36990 +36991 +1018 +345 +1090 +36992 +36993 +2197 +31293 +36994 +24765 +6067 +828 +14019 +36995 +16826 +17529 +36996 +19 +248 +29109 +14102 +24864 +36997 +33494 +31293 +18896 +15 +36998 +2314 +36999 +37000 +1765 +31382 +37001 +18345 +43 +590 +36424 +24045 +27669 +761 +33627 +2309 +37002 +37003 +31293 +3599 +43 +16292 +37004 +558 +5582 +491 +19 +4461 +1615 +37005 +37006 +37007 +736 +1870 +33445 +16239 +33615 +37008 +1224 +32 +21947 +15194 +37009 +5188 +2187 +337 +46 +37010 +37011 +12020 +26895 +26599 +14330 +37012 +7987 +9440 +19287 +37013 +22684 +37014 +30230 +29204 +815 +3858 +25829 +2865 +31098 +37015 +37016 +37017 +37018 +23352 +37019 +3546 +37020 +5085 +27069 +683 +337 +416 +37021 +37022 +19618 +28000 +1559 +27875 +37023 +2059 +37024 +34583 +337 +286 +342 +37025 +2325 +2410 +720 +19091 +37026 +31293 +37027 +7053 +37028 +7123 +37029 +671 +4055 +20700 +5780 +238 +37030 +37031 +37032 +11424 +354 +37033 +37034 +1716 +1090 +37035 +89 +1481 +21947 +21947 +34113 +491 +37036 +37037 +37038 +13150 +5313 +37039 +30877 +37040 +958 +2694 +2488 +14 +613 +33650 +29381 +37041 +37042 +284 +37043 +24864 +18448 +278 +30794 +2581 +37044 +33758 +37045 +15 +533 +29204 +3546 +4581 +37046 +37047 +342 +98 +37048 +37049 +1688 +538 +10174 +37050 +665 +36424 +25316 +13566 +37051 +37052 +4055 +37053 +37054 +8967 +2281 +37055 +37056 +28317 +37057 +34342 +20113 +37058 +1090 +37059 +37060 +536 +37061 +37062 +201 +37063 +3543 +936 +37064 +349 +37065 +1559 +3999 +30877 +29204 +37066 +185 +365 +37067 +37068 +37069 +29540 +37070 +37071 +34627 +31293 +17480 +17121 +37072 +2804 +1090 +37073 +37074 +14553 +57 +37075 +24864 +1765 +37076 +9 +37077 +349 +3597 +10356 +6364 +37078 +7619 +823 +625 +24144 +5827 +37079 +12684 +590 +13463 +19 +37080 +1824 +26361 +541 +32 +37081 +37082 +13145 +9 +43 +37083 +37084 +19618 +37085 +17880 +37086 +9210 +33494 +30224 +37087 +1090 +37088 +495 +1562 +37089 +31293 +21947 +30877 +590 +37090 +15718 +13205 +37091 +3406 +37092 +43 +1575 +2537 +7442 +37093 +37094 +24725 +37095 +15718 +22922 +8668 +17911 +36483 +89 +14330 +37096 +26815 +4808 +590 +736 +590 +37097 +37098 +89 +2802 +3875 +33185 +19 +15718 +1169 +28013 +34402 +19 +736 +37099 +5080 +2043 +29561 +16560 +36735 +37100 +1169 +24038 +37101 +37102 +590 +286 +31293 +26040 +37103 +37104 +1097 +37105 +30458 +19 +31293 +27117 +590 +478 +5780 +16879 +25237 +19618 +37106 +590 +37107 +37108 +22114 +12498 +597 +188 +37109 +43 +5371 +37110 +1047 +37111 +77 +1090 +37112 +23290 +1870 +345 +495 +37113 +2006 +1224 +13150 +37114 +4153 +37115 +25237 +377 +37116 +29628 +37117 +237 +14479 +37118 +30224 +1157 +1295 +13961 +14 +30051 +3409 +19 +37119 +37120 +37121 +37122 +892 +6104 +57 +19 +36819 +646 +3546 +1710 +22587 +4055 +10729 +37123 +37124 +9 +37125 +37126 +37127 +10 +464 +28317 +46 +1295 +694 +35427 +37128 +33650 +37129 +37130 +2770 +37131 +37132 +37133 +4766 +20710 +3994 +1090 +1862 +37134 +43 +25237 +842 +4055 +8668 +590 +37135 +37136 +23103 +4699 +19 +37137 +34 +3508 +17698 +36156 +6171 +37138 +15 +265 +37139 +3330 +37140 +28317 +31293 +15718 +11087 +33120 +22337 +19 +19 +37141 +30877 +176 +37142 +19 +26323 +36391 +1410 +37143 +19 +4808 +25943 +37144 +37088 +4245 +37145 +33113 +19 +37146 +5780 +37147 +37148 +43 +37149 +37150 +36424 +2 +33627 +14369 +29483 +142 +1082 +27069 +8668 +20572 +60 +37151 +345 +8338 +3546 +15572 +37152 +14330 +37153 +37154 +11312 +37155 +11822 +37156 +892 +3 +17151 +37025 +17151 +37157 +37158 +19 +3743 +29381 +7553 +37159 +37160 +2841 +37161 +14369 +16798 +37162 +22587 +29204 +37163 +37164 +286 +37165 +915 +28549 +27173 +23487 +1913 +3828 +37166 +37167 +20 +37168 +18951 +1503 +37169 +37170 +5188 +3790 +14553 +349 +2368 +37171 +33211 +8668 +31346 +416 +3484 +12751 +37172 +31293 +29483 +3660 +24864 +12005 +345 +28170 +37173 +18695 +12155 +7276 +37174 +37175 +28339 +37176 +30309 +37177 +37178 +37179 +286 +37180 +37181 +736 +13474 +25021 +37182 +22752 +9649 +4116 +35076 +1716 +30877 +2577 +19 +19 +37183 +1269 +15 +5080 +345 +37184 +37185 +4056 +27719 +16437 +185 +699 +495 +37186 +4463 +60 +37187 +828 +18780 +9 +37188 +37189 +1090 +37190 +20700 +8668 +2310 +37191 +37192 +9 +590 +30650 +2314 +43 +14369 +37193 +22788 +188 +14340 +30458 +736 +11620 +9 +37194 +590 +4055 +26496 +37195 +43 +3546 +104 +37196 +2175 +20 +14001 +1090 +15718 +2243 +25943 +37197 +720 +37198 +9649 +3559 +37199 +37200 +21947 +4302 +5780 +22420 +33916 +37201 +25260 +34402 +8668 +17911 +2919 +13566 +37202 +9560 +15718 +37203 +11754 +33120 +28666 +14369 +37204 +37205 +7015 +28549 +37206 +37207 +2694 +37208 +915 +37209 +37210 +37211 +37212 +37213 +25316 +3406 +37214 +43 +595 +36761 +37215 +26550 +24303 +9738 +37216 +23219 +37217 +37218 +14340 +24864 +37219 +29465 +24864 +34999 +30224 +37220 +43 +20700 +77 +37221 +27669 +37222 +21947 +37223 +43 +27669 +15172 +25316 +1384 +37224 +36527 +386 +37225 +554 +7987 +27669 +9 +37226 +25871 +1251 +37227 +4230 +2308 +399 +37228 +3950 +15446 +37229 +37230 +43 +2356 +37231 +14330 +19825 +18930 +1961 +18695 +37232 +3543 +37233 +16375 +37234 +910 +37235 +22963 +37236 +13493 +21669 +9 +9433 +19 +8100 +37237 +1481 +24864 +35068 +2577 +27669 +4747 +33494 +37238 +19 +9 +36424 +20329 +37239 +37240 +43 +11841 +9 +8668 +25237 +25316 +37241 +37242 +37243 +590 +30877 +8724 +37244 +37245 +415 +37246 +37247 +2410 +7341 +25683 +37248 +34703 +4278 +4461 +37249 +345 +4 +764 +33496 +37250 +37251 +22273 +9560 +33524 +37252 +34402 +37253 +12825 +24678 +22473 +15 +31098 +37254 +9 +29483 +18045 +37255 +27387 +3546 +37256 +43 +915 +3948 +7014 +21149 +11321 +14216 +6877 +37257 +37258 +19655 +15718 +37259 +37260 +57 +1115 +37261 +519 +37262 +37263 +6771 +9560 +37264 +37265 +37266 +28044 +6441 +823 +12590 +5188 +1090 +3978 +13361 +37267 +37268 +33650 +37269 +37270 +37271 +6950 +37272 +299 +16280 +19 +37273 +31098 +8967 +37274 +37275 +24303 +29483 +22922 +33650 +2593 +30224 +37276 +16798 +16102 +19582 +37277 +37278 +345 +37279 +37280 +33457 +37281 +37282 +37283 +37284 +43 +6364 +809 +37285 +37286 +4247 +37287 +37288 +1524 +37289 +16118 +2287 +37290 +29204 +37291 +37292 +3 +27669 +30224 +19 +2197 +27798 +3553 +19 +37293 +37294 +37295 +25902 +2406 +1082 +46 +31293 +36282 +37296 +554 +19655 +22922 +15 +37297 +37298 +43 +37299 +590 +6776 +37300 +349 +37301 +164 +484 +1566 +4463 +21947 +14 +415 +24303 +24919 +3976 +15705 +37302 +33113 +19852 +179 +12845 +13566 +37257 +35883 +2325 +19 +26755 +37303 +26006 +24725 +17911 +14330 +37304 +1870 +37305 +28317 +37306 +22 +37307 +19939 +57 +19 +66 +14369 +37308 +36486 +21947 +26496 +29483 +37309 +14330 +2514 +12987 +37310 +27669 +37311 +34402 +8545 +10244 +37312 +3005 +31293 +590 +35580 +37313 +13760 +1812 +10634 +37314 +8249 +19974 +37315 +37316 +77 +14001 +37317 +495 +176 +37318 +28961 +37319 +37320 +185 +7922 +4055 +3484 +21947 +14477 +14 +15 +36019 +35337 +37321 +590 +29687 +25316 +30073 +6095 +19618 +586 +349 +37322 +28494 +32 +37323 +720 +5088 +15 +37324 +7944 +5169 +37325 +37326 +37327 +37328 +27669 +3 +18045 +23841 +8301 +25316 +19 +37329 +30224 +37330 +37331 +1300 +89 +3553 +3601 +23303 +37332 +1743 +37333 +34779 +12987 +1051 +22963 +37334 +9497 +37335 +270 +671 +19 +740 +1310 +1090 +2260 +37336 +14369 +3829 +37337 +590 +33524 +60 +37338 +37339 +590 +30224 +197 +89 +17151 +43 +15718 +37340 +1961 +9273 +26804 +990 +23406 +46 +2318 +37341 +4530 +37342 +27669 +165 +27669 +37343 +35352 +3598 +5601 +37344 +4461 +9 +3372 +19618 +36157 +357 +37345 +43 +37346 +15718 +37347 +17151 +791 +6439 +8996 +2406 +677 +37348 +37349 +338 +1090 +1716 +37350 +37351 +1090 +37352 +37353 +34944 +37354 +32574 +7835 +37355 +18394 +19 +37356 +1937 +24457 +37357 +19852 +201 +9 +415 +24144 +21947 +9 +37358 +15486 +694 +29628 +1829 +17997 +37359 +98 +37360 +4055 +16422 +25584 +12934 +1428 +354 +19 +178 +28219 +6869 +736 +37361 +37362 +37363 +22963 +37364 +37365 +1109 +37366 +1749 +179 +5387 +28317 +33627 +1090 +37367 +872 +25140 +29 +590 +720 +37368 +663 +19 +37369 +4055 +37370 +37371 +5837 +37372 +179 +18100 +37373 +12005 +2342 +18369 +12 +15928 +3764 +5301 +37374 +37375 +33627 +37376 +37377 +317 +37378 +37379 +37380 +37381 +590 +37382 +37383 +37384 +8297 +2117 +24154 +24303 +37385 +37386 +37387 +196 +32944 +37388 +21947 +19 +5117 +37389 +29381 +677 +30877 +37390 +37391 +12152 +19618 +23103 +27118 +17911 +37392 +1790 +37393 +14369 +11213 +11717 +3546 +176 +1090 +33627 +33758 +16437 +37394 +22014 +37395 +4055 +13905 +37396 +37397 +23103 +736 +8668 +349 +1154 +37398 +436 +21027 +37399 +37400 +36333 +28441 +478 +29381 +4055 +5052 +1090 +2347 +13807 +27669 +37401 +37402 +43 +37403 +37404 +1992 +24324 +37405 +7053 +16437 +6122 +29483 +24864 +37406 +13311 +1090 +37407 +37408 +222 +23103 +9 +536 +37409 +14797 +303 +31293 +11188 +22827 +2015 +37410 +15203 +21686 +4364 +1870 +37411 +1120 +14477 +15718 +37412 +590 +37413 +37414 +1924 +19 +6171 +590 +6935 +5409 +37415 +37416 +26580 +37417 +36424 +24 +37418 +32 +19 +1768 +15718 +590 +17374 +34602 +3601 +1637 +6153 +37419 +37420 +37421 +24303 +29204 +25943 +1508 +21689 +37422 +37423 +764 +28518 +15 +37424 +33494 +15 +37425 +35409 +8668 +37426 +1356 +23103 +554 +14369 +37427 +37428 +11754 +20142 +9 +33650 +24864 +30580 +1090 +1900 +37429 +15718 +37430 +1912 +33758 +37431 +21947 +37432 +37433 +37434 +34 +22986 +3546 +31098 +37435 +1774 +411 +36727 +37436 +1559 +140 +14634 +32646 +17927 +37437 +21947 +5188 +37438 +37439 +37440 +37441 +37442 +15718 +21127 +164 +6004 +36251 +25 +27791 +21689 +15654 +37443 +15491 +37444 +33650 +541 +37223 +37445 +10 +37446 +37446 +1021 +37447 +33890 +89 +37448 +37449 +16466 +1749 +37450 +2577 +29032 +37451 +170 +13855 +36735 +2577 +37452 +24303 +25237 +19 +37453 +33627 +20677 +2009 +822 +2993 +37454 +590 +272 +29204 +250 +15718 +6054 +37455 +20337 +37456 +464 +9567 +29483 +23150 +21947 +37457 +24195 +665 +24972 +2043 +37458 +32275 +9 +28317 +554 +37459 +13150 +37460 +27069 +27669 +37461 +2 +98 +73 +37462 +1012 +5904 +37463 +37464 +4278 +24621 +13566 +43 +15 +37465 +37466 +15718 +30877 +37467 +5601 +37468 +33494 +15018 +30724 +29483 +16732 +37469 +37470 +23218 +1481 +37471 +25140 +12013 +37472 +1107 +29483 +178 +5085 +345 +37473 +1364 +37474 +11749 +19 +37475 +37476 +3204 +27669 +37477 +745 +566 +1230 +16375 +31336 +20700 +37478 +2314 +671 +16866 +15 +286 +15718 +3806 +37479 +37480 +20745 +37481 +37482 +5204 +28069 +21947 +42 +37483 +11341 +37484 +37485 +720 +29483 +37486 +345 +5770 +37487 +37488 +30877 +14 +1508 +2525 +966 +138 +12893 +1559 +37489 +25237 +24 +37490 +209 +1157 +1765 +25683 +32 +34 +5188 +8210 +5027 +1716 +43 +19285 +4124 +6571 +37491 +29204 +971 +27701 +5188 +5119 +37492 +5502 +28441 +32 +1203 +37493 +30877 +37494 +37495 +37496 +37497 +685 +7117 +16440 +29026 +37498 +15643 +30877 +10 +16375 +16327 +37499 +3353 +34402 +37500 +37501 +37502 +677 +27357 +21947 +18597 +31698 +3546 +36127 +37503 +37504 +37505 +30986 +26431 +30844 +37506 +37507 +9 +665 +37508 +248 +533 +26040 +37509 +37510 +21947 +43 +21689 +3546 +33278 +37511 +37512 +37513 +43 +37514 +37515 +5161 +36177 +18283 +37174 +25 +37516 +5912 +37517 +21689 +35265 +37518 +37519 +7835 +57 +8167 +21947 +37520 +21947 +337 +4364 +15 +24864 +37521 +16437 +14001 +11832 +21947 +3421 +14947 +303 +37522 +29483 +21947 +37523 +17911 +3137 +21776 +303 +9 +37524 +5223 +37525 +20315 +37526 +37527 +19618 +37528 +37529 +123 +827 +37530 +19318 +37531 +27669 +30877 +37532 +1226 +2058 +37533 +509 +37534 +25970 +8356 +10965 +21947 +19 +14477 +35296 +140 +9 +14477 +37535 +8685 +284 +37536 +9 +1157 +37537 +37538 +248 +37539 +37540 +28661 +37541 +1090 +10028 +25237 +37542 +37543 +15718 +37544 +6617 +1559 +34630 +13566 +37545 +36424 +170 +25316 +37546 +24725 +377 +11907 +15718 +26804 +15 +286 +36874 +37547 +37548 +9 +17320 +849 +24303 +37549 +1542 +30051 +29855 +9 +3391 +30877 +20 +33494 +37550 +1765 +1090 +15718 +37551 +30051 +29381 +10828 +34641 +1198 +37552 +12522 +37553 +37554 +17920 +33494 +7379 +4055 +28490 +16 +31575 +5218 +377 +30051 +1364 +590 +4055 +1090 +37555 +37556 +2476 +377 +37557 +37558 +37559 +37560 +37561 +14369 +24144 +37562 +11762 +21947 +13508 +36424 +37563 +9 +37564 +36735 +597 +20 +1578 +283 +36736 +155 +1090 +37565 +37566 +32 +37567 +137 +14982 +43 +37568 +9212 +10621 +37569 +4602 +5153 +1520 +8668 +1203 +6183 +37570 +37571 +37572 +15 +37573 +37574 +27415 +11966 +337 +27669 +37575 +27669 +303 +37576 +33650 +6962 +337 +25129 +15998 +2040 +27092 +37577 +303 +37578 +37579 +11537 +213 +3484 +37580 +1090 +18386 +9 +30029 +20700 +37581 +8297 +37582 +37583 +2260 +37584 +284 +37585 +37586 +22236 +7053 +37587 +20916 +13919 +37588 +36218 +1082 +1384 +7053 +176 +33494 +37589 +3546 +3546 +37590 +3944 +37591 +8392 +37592 +37593 +590 +989 +19 +37594 +7053 +338 +38 +33758 +19 +37595 +30650 +17945 +16235 +37596 +37597 +37598 +25683 +29483 +14864 +1533 +15 +37599 +37600 +16437 +37601 +21776 +37602 +29381 +707 +114 +22963 +14477 +2347 +105 +43 +2316 +377 +31293 +483 +4598 +213 +1710 +37603 +37604 +37605 +2769 +37606 +686 +28549 +12474 +1524 +37607 +37608 +14330 +19576 +25316 +16443 +8351 +37609 +37610 +646 +554 +32 +37611 +32449 +14 +32 +18139 +2694 +37612 +37556 +337 +24896 +37613 +2537 +34402 +27388 +197 +13801 +33690 +37614 +554 +32642 +37615 +14 +270 +15702 +18369 +37616 +37617 +18156 +37618 +9402 +1090 +19 +37619 +37620 +37621 +9262 +21698 +36492 +37622 +30224 +25316 +36735 +37623 +2372 +15104 +37624 +30877 +14279 +37625 +5318 +37626 +36735 +37627 +13943 +179 +446 +21947 +3844 +43 +37628 +5188 +5119 +13377 +222 +37629 +123 +15718 +37630 +15718 +1090 +11762 +769 +17151 +590 +303 +590 +37631 +337 +4450 +37632 +14603 +43 +37633 +37634 +32426 +37635 +1710 +536 +18695 +9 +1090 +936 +37636 +590 +2040 +31362 +9 +37637 +2577 +43 +25237 +33445 +31293 +2804 +34 +37638 +176 +21947 +14 +37639 +248 +1605 +28085 +12987 +590 +19 +37640 +23103 +37641 +37642 +20572 +337 +31293 +37643 +37644 +37645 +13714 +1139 +1090 +16437 +37646 +1090 +30877 +2550 +30877 +14369 +22075 +1745 +10853 +37647 +4026 +21003 +1824 +1100 +37648 +31293 +1749 +37649 +12987 +645 +1208 +31098 +18912 +8351 +14369 +37650 +36452 +33120 +25140 +37651 +430 +34957 +37652 +37653 +30224 +665 +568 +354 +140 +1228 +5188 +213 +37654 +14477 +176 +37655 +18079 +33650 +37656 +37657 +37658 +37659 +37660 +179 +669 +37661 +1090 +15498 +792 +33650 +37662 +19655 +18919 +560 +37663 +37664 +1680 +37665 +37666 +4055 +1384 +3546 +37667 +2746 +37668 +536 +37669 +37670 +4055 +9 +14 +17897 +37671 +37672 +37673 +3559 +37674 +11762 +37675 +37676 +12402 +37677 +15683 +37678 +14001 +37556 +37679 +28197 +31293 +37680 +2043 +43 +37681 +1710 +37682 +37683 +37684 +37685 +554 +197 +37686 +37687 +27669 +33120 +21947 +25307 +284 +323 +30877 +15683 +25237 +9 +686 +12546 +37688 +12013 +37689 +303 +37690 +1529 +137 +849 +37691 +37692 +37693 +18109 +115 +9 +37694 +6660 +37695 +19 +37696 +2260 +37697 +484 +25237 +37698 +21947 +37699 +37700 +37701 +37702 +17151 +37703 +23418 +31168 +19 +3976 +37704 +22505 +37705 +33758 +828 +37706 +37707 +213 +15 +22717 +37708 +213 +213 +2325 +37709 +590 +37710 +2832 +37711 +25021 +4285 +37712 +37713 +2308 +37714 +28494 +37715 +27669 +35805 +1090 +29720 +1529 +15718 +3546 +337 +13296 +1295 +19 +11966 +37716 +37717 +1131 +745 +37718 +372 +337 +37719 +60 +3546 +37720 +237 +37556 +284 +178 +1090 +37721 +12302 +12185 +3480 +25316 +37722 +22963 +37723 +25162 +25316 +495 +1574 +31293 +14660 +37724 +337 +37725 +29381 +284 +2314 +37726 +248 +37727 +2581 +19 +37728 +37729 +616 +28361 +11321 +37730 +3546 +37731 +9 +37732 +37733 +28317 +58 +37734 +2618 +15 +337 +1563 +9955 +5409 +37735 +15718 +37736 +37737 +37738 +37739 +37740 +399 +3 +37741 +37742 +590 +9460 +37650 +112 +20083 +37743 +9082 +4055 +37744 +37745 +22 +37746 +37747 +6950 +37748 +16437 +3546 +14363 +37749 +1011 +9 +15096 +740 +213 +37750 +9465 +37751 +19795 +27599 +140 +436 +29032 +25140 +446 +37752 +284 +37753 +37754 +37755 +8367 +1870 +5004 +37756 +9 +284 +37757 +284 +872 +37758 +24303 +1508 +37759 +21947 +37760 +37761 +303 +23867 +37762 +303 +14871 +37763 +35552 +37764 +8668 +4116 +17911 +2865 +37765 +7357 +404 +37766 +188 +33508 +4055 +2561 +57 +349 +25943 +21947 +37767 +25683 +2 +37768 +37769 +34402 +1181 +37770 +37771 +590 +10628 +37772 +24972 +36853 +822 +35695 +34433 +33494 +1247 +20770 +7363 +16437 +25237 +14107 +37773 +37774 +11840 +2325 +37775 +1513 +15718 +2762 +303 +37776 +8668 +15481 +2465 +37777 +14385 +16437 +10933 +37778 +37779 +19655 +37780 +9 +25237 +11211 +29 +37781 +10642 +37782 +28389 +37783 +30224 +31293 +1230 +37556 +21535 +286 +37784 +14770 +17911 +99 +37785 +37786 +1109 +37787 +815 +18695 +24725 +37788 +37789 +5085 +14152 +15718 +37790 +15 +1442 +30877 +37791 +18503 +33192 +15320 +37792 +29129 +34842 +37793 +37794 +15718 +19057 +464 +4032 +60 +37795 +37796 +37797 +30209 +31036 +37798 +37556 +21947 +3755 +26417 +2859 +33650 +37799 +34402 +5619 +2356 +286 +37800 +34902 +37801 +24864 +37802 +20 +1236 +13905 +354 +21689 +7658 +9 +915 +31168 +797 +6950 +1357 +5780 +6110 +18822 +27904 +1503 +25683 +37803 +4055 +37804 +37805 +37806 +30877 +37807 +11762 +25140 +11 +37808 +27283 +1961 +32 +15 +19837 +809 +57 +37809 +887 +14369 +37810 +1090 +37811 +37812 +7053 +37813 +43 +9649 +43 +25965 +37814 +29483 +1710 +37815 +8724 +7855 +6950 +19 +25683 +5110 +35167 +10 +32410 +286 +26585 +15718 +37816 +24045 +32960 +37817 +14330 +155 +21947 +17136 +1357 +37818 +37819 +683 +29621 +37820 +37556 +3546 +1226 +28389 +21947 +37821 +19618 +43 +33494 +16494 +11420 +9 +2356 +37822 +37823 +37824 +1208 +8367 +37825 +43 +37826 +1559 +24864 +30458 +3598 +590 +29483 +16158 +17698 +31168 +284 +590 +17911 +5188 +37827 +33627 +29483 +29381 +30051 +37828 +43 +31293 +37829 +37830 +491 +7330 +37831 +6883 +989 +66 +37832 +2197 +9600 +1812 +37833 +16773 +37834 +57 +7977 +34081 +33316 +586 +14193 +4907 +597 +27178 +37835 +464 +29025 +43 +37836 +37837 +17144 +37838 +440 +1049 +645 +37839 +34402 +1562 +1732 +286 +36884 +37840 +1991 +337 +37841 +37842 +15 +32 +43 +3353 +27669 +37843 +19057 +37844 +37845 +1090 +16443 +14369 +665 +27669 +26186 +21045 +24864 +21947 +14477 +33479 +37846 +31873 +20700 +1090 +37847 +36 +37848 +284 +590 +2289 +2733 +37849 +97 +5188 +37850 +16698 +1867 +37851 +36219 +37852 +1920 +37853 +43 +77 +29977 +377 +3559 +37854 +37855 +2117 +37856 +970 +2152 +5188 +21947 +37857 +17911 +736 +12431 +4055 +1503 +21947 +37858 +720 +37859 +24725 +8716 +5780 +37860 +14007 +1109 +26626 +31098 +197 +25 +9 +43 +16826 +14 +5085 +37861 +19714 +37862 +16413 +37863 +23226 +15 +12955 +14102 +21371 +16480 +27522 +37864 +37865 +21947 +31273 +32382 +323 +36 +28298 +19218 +1090 +21947 +14795 +37866 +20 +1212 +37867 +37868 +37869 +37870 +286 +14369 +4055 +27619 +10791 +29483 +37871 +43 +17151 +57 +37872 +37873 +185 +28199 +27669 +37874 +14369 +44 +37875 +34317 +6028 +37876 +9433 +21387 +37877 +37878 +37879 +37880 +30051 +11762 +20 +13566 +24725 +996 +137 +5780 +369 +24303 +43 +32 +4055 +8316 +1536 +99 +185 +27669 +590 +37881 +37882 +4598 +37883 +14477 +37884 +12573 +4468 +683 +5188 +8301 +2593 +37885 +30877 +1224 +30224 +37886 +36735 +37887 +5188 +3598 +37888 +33061 +33113 +37889 +37890 +37891 +37892 +5085 +37893 +9543 +2919 +37894 +37895 +2591 +37896 +882 +37897 +196 +13150 +4055 +970 +30551 +892 +1112 +34264 +37898 +37899 +37900 +32 +28251 +32 +2159 +36907 +4518 +34 +37901 +27669 +37556 +19 +5007 +37902 +27430 +736 +3 +19 +37903 +4463 +37904 +34402 +5188 +19 +37905 +398 +533 +27669 +37906 +7069 +24774 +8919 +30877 +11483 +37907 +37908 +20700 +7053 +4028 +12987 +5188 +3008 +15592 +317 +6776 +33650 +10598 +28441 +37909 +2121 +286 +37910 +32 +2694 +16437 +2476 +37911 +37912 +15718 +32751 +1082 +13721 +37913 +37556 +37914 +25 +412 +37915 +1090 +3239 +37916 +1503 +501 +37917 +1011 +357 +28317 +104 +11471 +37918 +19655 +22315 +37919 +1234 +37920 +2356 +29483 +37921 +597 +671 +415 +19 +58 +6261 +14369 +3395 +20 +24864 +9 +342 +1012 +2139 +37922 +2733 +1425 +31293 +17 +37923 +7817 +37924 +37925 +19 +37926 +286 +37927 +37928 +1716 +1189 +26361 +37929 +37930 +19974 +3 +21045 +37931 +37932 +37933 +7597 +33627 +13150 +37934 +352 +37935 +822 +37936 +16375 +9 +915 +37937 +37025 +19655 +4293 +31293 +37938 +528 +37556 +25943 +19489 +4730 +554 +29381 +37939 +37940 +21947 +14369 +7226 +33650 +1442 +9 +5197 +37941 +37942 +35214 +770 +1091 +2 +377 +19742 +89 +57 +1082 +37943 +31867 +377 +37944 +14527 +37945 +42 +21947 +20 +14 +9 +19 +6883 +27669 +37946 +19294 +37947 +790 +9118 +35823 +5403 +37948 +37949 +10111 +6251 +29381 +37950 +37951 +37952 +37953 +155 +9 +28490 +21947 +37954 +37955 +12647 +37956 +31225 +5627 +13867 +37957 +2117 +6881 +33758 +37958 +209 +20141 +15354 +29381 +57 +37959 +2308 +37960 +37961 +37962 +27669 +1021 +33650 +37556 +37963 +37964 +4518 +25237 +57 +37965 +29381 +17151 +14814 +17151 +13566 +19381 +19 +10706 +5299 +1578 +14369 +17911 +37966 +16422 +43 +2919 +2449 +31293 +37967 +37968 +37969 +19486 +33950 +14666 +37970 +37971 +377 +7053 +15 +37972 +37973 +37974 +37975 +590 +12296 +16787 +37976 +15718 +514 +25140 +37977 +30917 +202 +37978 +37556 +37979 +25140 +4292 +19849 +590 +3546 +21947 +37980 +37981 +3994 +4461 +19 +37982 +15220 +15 +21947 +1021 +32 +184 +37983 +23544 +19713 +34601 +6248 +28277 +37556 +37984 +15718 +37985 +27669 +4502 +37986 +37987 +342 +28317 +37988 +32449 +14477 +4855 +9 +349 +37989 +11330 +37990 +1745 +20677 +25215 +37991 +613 +16437 +15718 +249 +262 +37992 +19 +37993 +37556 +37994 +1749 +14330 +2410 +37556 +37768 +24864 +15 +3546 +15511 +37995 +33650 +4364 +37996 +15 +1090 +15 +8668 +37997 +37998 +764 +1295 +683 +613 +15395 +16 +37999 +11585 +23150 +38000 +1021 +1100 +37830 +4461 +38001 +12 +38002 +209 +736 +9 +6363 +38003 +104 +19792 +38004 +29381 +1604 +38005 +10840 +1090 +6505 +38006 +1090 +590 +38007 +9183 +38008 +37556 +36218 +16437 +4414 +38009 +29152 +29483 +26060 +23103 +22552 +33061 +21689 +27669 +4055 +28206 +66 +17670 +38010 +34433 +21947 +4472 +14 +533 +38011 +6625 +34650 +38012 +11013 +3599 +38013 +1013 +34985 +2998 +38014 +38015 +3546 +736 +38016 +38017 +491 +38018 +14363 +671 +20573 +12711 +35224 +18045 +38019 +736 +38020 +31293 +34402 +21175 +1967 +38021 +38022 +38023 +17151 +2694 +15705 +38024 +590 +20189 +38025 +38026 +38027 +25140 +15718 +30051 +2 +19 +416 +38028 +6439 +8362 +554 +19 +37556 +6001 +15 +46 +38029 +15 +38030 +1021 +38031 +804 +9 +15 +379 +5908 +38032 +25316 +38033 +38034 +3544 +37530 +659 +201 +38035 +6658 +37556 +8322 +137 +21115 +98 +16375 +38036 +19 +28036 +1244 +4028 +9257 +20 +29381 +7829 +38037 +38038 +179 +38039 +1920 +24864 +19655 +9 +38040 +1870 +29192 +9784 +38041 +1090 +16437 +22922 +10828 +7431 +20113 +6439 +31234 +590 +38042 +38043 +696 +31168 +38044 +2419 +1090 +38045 +38046 +24864 +38047 +37556 +38048 +38049 +15 +38050 +14369 +43 +936 +38051 +1224 +24303 +38052 +21947 +9 +6122 +16466 +736 +37949 +12009 +2064 +1442 +1090 +38053 +29204 +3601 +38054 +9 +37556 +115 +35300 +38055 +38056 +28549 +19 +38057 +20339 +286 +23103 +38058 +21947 +38059 +14279 +1316 +12684 +19852 +38003 +6095 +27669 +37741 +665 +21776 +36888 +38060 +1082 +17911 +197 +27291 +38061 +38062 +354 +19 +43 +33494 +317 +38063 +12907 +2577 +1710 +6877 +5666 +317 +13396 +2865 +21729 +22564 +27669 +38064 +2489 +38065 +33120 +38066 +597 +30877 +286 +339 +3030 +12907 +6187 +38067 +25237 +38068 +38069 +30877 +1612 +38070 +9577 +20113 +2561 +3317 +677 +19 +22922 +38071 +28474 +2136 +6736 +36957 +323 +30166 +43 +20785 +38072 +20005 +38073 +2164 +38074 +43 +7964 +2338 +38075 +1870 +1107 +33650 +38076 +6617 +228 +38077 +43 +671 +31293 +38078 +7419 +12397 +3546 +38079 +38080 +31293 +38081 +38082 +16437 +8668 +19 +38083 +33650 +15718 +21031 +7912 +519 +38084 +3553 +345 +9 +613 +38085 +38086 +971 +2762 +19 +19 +1817 +38087 +38088 +398 +9939 +153 +43 +38089 +14693 +38090 +38091 +38092 +3481 +38093 +38094 +286 +3343 +176 +12696 +38095 +14369 +3546 +554 +9 +1082 +3959 +77 +10574 +38096 +38097 +38098 +17911 +12474 +2668 +38099 +286 +29200 +31098 +38100 +38101 +30794 +38102 +19655 +194 +478 +16323 +33693 +14369 +38103 +1633 +38104 +37185 +38105 +140 +845 +16818 +4055 +11432 +25584 +24045 +21689 +1566 +33352 +38003 +7053 +25 +576 +683 +317 +19618 +24144 +586 +560 +16466 +30742 +38106 +21947 +14420 +21947 +38107 +26040 +3790 +5990 +33758 +1116 +317 +25871 +20 +38108 +28148 +38109 +38110 +1531 +26048 +24864 +37556 +16447 +14363 +1927 +15 +9948 +32805 +38111 +7053 +936 +33496 +9 +38112 +25 +33188 +23150 +77 +20 +38113 +38114 +33627 +17596 +36735 +57 +38115 +38116 +38117 +27669 +38118 +3729 +4055 +38119 +38120 +38121 +3430 +10299 +27178 +8668 +38122 +242 +861 +38123 +33910 +31758 +2733 +38124 +4055 +9497 +15 +15718 +533 +15718 +38125 +590 +38126 +1481 +402 +43 +38127 +4055 +4056 +34306 +1542 +38128 +2 +815 +38129 +38130 +13150 +1524 +15 +38131 +16437 +3055 +11762 +1920 +9 +12120 +33693 +38132 +2308 +3644 +3015 +7406 +21045 +38133 +34 +770 +34999 +38134 +38135 +38136 +15718 +46 +270 +38137 +28206 +15718 +28317 +34433 +398 +43 +38138 +38139 +31381 +17267 +2924 +38140 +20 +38141 +18956 +14369 +20531 +38142 +15824 +38143 +38144 +38145 +38146 +38147 +38148 +21947 +14603 +3343 +38149 +28317 +21689 +1090 +15 +1090 +446 +399 +1765 +3034 +33650 +38150 +38151 +4242 +38152 +25 +19 +8668 +14369 +38085 +36853 +134 +887 +38153 +8367 +38154 +8279 +15 +4907 +36157 +25237 +21947 +25683 +14216 +38155 +43 +38156 +38157 +38158 +20 +38159 +14369 +10028 +38160 +2414 +25 +19 +1112 +33627 +3251 +155 +25914 +2308 +38161 +26496 +38162 +38163 +24864 +20750 +38164 +38165 +33494 +11822 +38166 +38167 +16772 +38168 +38169 +2049 +1011 +38170 +3546 +38171 +34480 +38172 +23102 +38173 +22 +38174 +430 +6263 +140 +38175 +369 +38176 +694 +19941 +46 +89 +25316 +35624 +30401 +38177 +338 +6736 +38178 +412 +38179 +38180 +38181 +29200 +14330 +2274 +5976 +1364 +13317 +4055 +38182 +887 +38183 +28961 +2577 +38184 +2121 +38185 +533 +38186 +38187 +21947 +15718 +201 +38188 +32426 +38189 +38190 +38191 +398 +38192 +38193 +38194 +14477 +140 +38195 +809 +38196 +201 +38197 +38198 +590 +8110 +12661 +9 +938 +13959 +1314 +29597 +19220 +9658 +15718 +2064 +38199 +23640 +15718 +5689 +37556 +30877 +2006 +38200 +9 +38201 +23103 +415 +38202 +38203 +30877 +38204 +34650 +21947 +3252 +33634 +349 +18895 +7815 +38205 +38206 +18120 +3546 +30224 +19 +31293 +33421 +14369 +8188 +9 +11948 +38207 +2356 +27669 +38208 +4634 +30877 +38209 +1364 +32640 +18798 +27719 +23103 +15718 +33278 +38210 +38211 +16184 +38212 +5313 +77 +1051 +38213 +15718 +38214 +210 +33120 +20280 +38215 +2706 +38216 +32 +30917 +23100 +2561 +38217 +16466 +971 +4714 +38218 +38219 +38220 +4055 +38221 +37556 +9 +5561 +22504 +38222 +36219 +38223 +5340 +27766 +38224 +38225 +647 +1743 +1371 +9129 +38226 +38227 +37556 +38228 +38229 +31293 +33650 +38230 +17911 +18695 +22 +415 +736 +3361 +33627 +27150 +38231 +38232 +2960 +1924 +38233 +201 +38234 +415 +9 +43 +38235 +31873 +14 +38236 +19 +31293 +1710 +817 +43 +25683 +30235 +21627 +209 +910 +279 +349 +554 +43 +33650 +57 +910 +38237 +379 +16981 +29204 +14679 +38238 +8110 +21947 +37128 +38239 +6287 +57 +38240 +38241 +6632 +3994 +2197 +9 +892 +38242 +23103 +21669 +9097 +20 +29056 +13814 +28044 +8115 +16826 +8787 +24303 +38243 +38244 +38245 +38246 +38247 +11754 +17151 +24303 +10935 +30080 +34402 +27178 +24864 +9 +38248 +14846 +15718 +38249 +22 +38250 +21419 +34402 +25 +9543 +1090 +1038 +32 +38251 +38 +28500 +31041 +2694 +38252 +3546 +70 +33 +38253 +590 +18045 +38254 +6232 +349 +7658 +415 +28728 +38255 +27260 +38256 +5317 +1245 +22352 +24303 +25237 +38257 +30877 +24725 +38258 +38259 +24864 +865 +1021 +1493 +38260 +38261 +38262 +9 +720 +38263 +4729 +1425 +15 +30857 +5438 +873 +38264 +16443 +815 +10470 +38265 +286 +38266 +37556 +34180 +38267 +1094 +1578 +38268 +38269 +38270 +38271 +57 +19 +38272 +30877 +1116 +38273 +14369 +11966 +1559 +38274 +15718 +389 +38275 +576 +21031 +38276 +21620 +38277 +1090 +38278 +15718 +7610 +20942 +21947 +931 +17972 +19618 +590 +38279 +16698 +1300 +17058 +31674 +17698 +43 +38280 +43 +32915 +15572 +4116 +38281 +10028 +22 +28317 +23853 +15809 +17151 +188 +10274 +36751 +19618 +38282 +8668 +1168 +17151 +20339 +590 +38283 +1615 +1018 +21947 +2231 +28441 +38284 +13476 +15 +931 +38285 +38286 +3601 +10168 +33650 +38287 +1244 +25140 +35318 +38288 +9497 +21031 +36424 +10 +46 +34066 +29483 +38289 +8549 +1559 +38290 +196 +30877 +30877 +647 +33627 +43 +33120 +16437 +38291 +3978 +1529 +286 +15592 +31873 +25316 +14330 +13361 +15 +38292 +3484 +38293 +19618 +24506 +38294 +27719 +5080 +21947 +25140 +31293 +155 +38295 +37556 +38296 +7553 +38297 +24864 +19573 +38298 +38299 +29204 +2061 +19 +9 +5837 +38300 +38301 +541 +1859 +38302 +38303 +272 +20853 +25943 +30877 +38304 +43 +9 +10936 +38305 +9 +38306 +38307 +37391 +1066 +36735 +38308 +46 +604 +38309 +2064 +24864 +38310 +10553 +9 +38311 +14330 +7260 +3655 +37556 +1090 +827 +15 +25140 +38312 +14852 +1056 +11537 +33120 +15 +38313 +140 +38314 +13623 +31293 +3105 +21947 +38315 +301 +38316 +24725 +1415 +19 +15541 +21947 +38317 +38318 +484 +345 +38319 +1090 +1817 +43 +38320 +720 +27084 +5217 +28480 +28923 +36192 +1090 +33650 +862 +37556 +2694 +38321 +89 +24303 +38322 +915 +1617 +14369 +38323 +38324 +8693 +33627 +38325 +38326 +590 +2859 +31293 +25624 +3976 +1090 +30552 +424 +12308 +38327 +104 +12302 +43 +19 +19 +46 +19 +38328 +1082 +21947 +1217 +38329 +5188 +2640 +27719 +19655 +29204 +17670 +38330 +38331 +38332 +910 +15718 +19918 +19 +3232 +38333 +33177 +21261 +14477 +38334 +38335 +331 +34402 +703 +38336 +38337 +38338 +13150 +14369 +9396 +13721 +14 +38339 +2174 +8297 +3408 +36456 +33730 +38340 +3620 +683 +38341 +738 +7053 +38342 +590 +35224 +34402 +14369 +1870 +38343 +38344 +1090 +38345 +34402 +38346 +1578 +38347 +278 +38348 +15597 +38349 +34 +4055 +14 +38350 +14292 +19 +38351 +38352 +1047 +37588 +12497 +38353 +38354 +342 +19655 +446 +43 +37556 +38 +38355 +179 +7053 +9445 +30877 +38356 +38357 +38358 +671 +38359 +2446 +38360 +14 +38361 +38362 +19231 +43 +34402 +3743 +349 +8249 +10774 +21947 +37556 +2117 +38363 +2325 +19 +38364 +17232 +9 +736 +38365 +38366 +43 +4055 +3508 +38367 +12 +16 +43 +104 +1415 +17911 +35633 +24864 +828 +38368 +38369 +35427 +1082 +9 +33650 +21947 +26854 +38370 +38371 +32410 +202 +38372 +13807 +38373 +1920 +554 +35042 +30794 +21031 +38374 +38375 +26361 +7113 +38376 +2 +38377 +38378 +21947 +5085 +29381 +32 +17340 +34641 +6075 +17144 +20941 +33693 +2260 +38379 +57 +57 +25316 +15718 +38380 +22049 +4055 +377 +2463 +20164 +26361 +38381 +845 +43 +38382 +26355 +1720 +27669 +33120 +38383 +38384 +10356 +12005 +38385 +38386 +22815 +13721 +34402 +9 +96 +32332 +38387 +12552 +9 +971 +484 +38388 +37556 +379 +33650 +242 +15491 +18409 +89 +1090 +38389 +38390 +10482 +67 +38391 +317 +16 +323 +38392 +38393 +25237 +38394 +28317 +9 +38395 +38396 +415 +25683 +38397 +1605 +38398 +2728 +16437 +38399 +38400 +1018 +5415 +23103 +745 +2015 +38401 +19 +46 +38402 +25943 +2492 +38403 +478 +14 +1090 +1251 +4028 +11759 +18013 +38404 +29483 +1300 +25140 +38405 +18548 +12987 +17635 +286 +9897 +33552 +38406 +38407 +16763 +46 +38408 +13179 +286 +25659 +349 +19 +14 +590 +18951 +38409 +2764 +2809 +37556 +19618 +38410 +14 +28502 +31293 +38411 +736 +24045 +31293 +3504 +495 +18440 +19 +33120 +38412 +38413 +27669 +1912 +38414 +5803 +38415 +6341 +38416 +16986 +38417 +5956 +38418 +34433 +5601 +14 +38419 +590 +38420 +19838 +1021 +416 +10028 +28441 +38421 +38422 +12 +23103 +33514 +38423 +38424 +38425 +1291 +2 +38426 +33650 +213 +58 +16183 +43 +24862 +38427 +379 +38428 +38429 +1300 +337 +13721 +1513 +185 +38430 +19 +33693 +38431 +14 +9 +38432 +38433 +5082 +38434 +20555 +13721 +38435 +8766 +337 +28176 +179 +38436 +16 +38437 +19 +33693 +284 +533 +284 +38438 +5188 +2643 +38439 +29483 +18139 +4055 +38440 +32 +15251 +213 +586 +196 +348 +15476 +4055 +18242 +3546 +38441 +3764 +1090 +284 +446 +104 +248 +38442 +703 +38443 +43 +576 +25316 +1090 +1295 +77 +19655 +38444 +13746 +38445 +38446 +38447 +284 +38448 +38449 +36735 +37556 +303 +38450 +7117 +31293 +3105 +38451 +6874 +9 +176 +377 +38452 +77 +13835 +248 +38453 +9 +21947 +16437 +213 +1749 +284 +2694 +9 +21947 +38454 +38455 +8849 +26651 +38456 +248 +22788 +19 +38457 +38458 +37920 +38459 +22922 +38460 +213 +38461 +38462 +2942 +5351 +38463 +14216 +25140 +33650 +33494 +2577 +16830 +38464 +337 +278 +1716 +10973 +19143 +37556 +9 +38465 +20600 +19 +272 +872 +201 +1716 +2029 +38466 +30224 +38467 +35832 +15718 +22963 +352 +176 +21947 +9 +2306 +17537 +25316 +38468 +3 +38469 +33120 +38470 +286 +38471 +38472 +13957 +38473 +16064 +31691 +19 +7084 +38474 +31293 +31098 +27669 +38475 +14363 +15 +248 +37556 +43 +38476 +2410 +4908 +38477 +38478 +30877 +38479 +6052 +38480 +8351 +3981 +31514 +7835 +179 +1531 +38481 +3 +5582 +38482 +9 +14604 +337 +38483 +24864 +43 +22398 +38484 +3353 +38485 +5085 +38486 +533 +38487 +379 +284 +14603 +24896 +38488 +4793 +11754 +38489 +2733 +38490 +2029 +28755 +21947 +14369 +248 +1316 +25316 +3999 +6595 +9 +1234 +38491 +1716 +25316 +270 +38492 +38493 +3559 +38494 +38495 +29381 +5865 +12625 +38496 +38497 +16466 +23477 +38498 +3546 +12013 +38499 +2260 +38500 +38501 +98 +38502 +33627 +38503 +38504 +38505 +590 +10946 +28961 +31575 +33445 +31226 +38506 +2243 +38507 +21947 +38508 +32911 +12254 +43 +464 +38509 +9402 +43 +5188 +37556 +38510 +24896 +2287 +38511 +17911 +2 +29200 +3 +38512 +3541 +5336 +37556 +3317 +28603 +24303 +33061 +4055 +38513 +38514 +38515 +43 +38516 +38517 +2195 +25237 +32 +37556 +38518 +38519 +345 +38520 +1222 +2388 +33627 +720 +38521 +358 +284 +358 +27719 +122 +26361 +9 +248 +10369 +66 +39 +16437 +38522 +14523 +57 +38523 +36735 +38524 +1066 +38525 +17207 +38526 +36019 +478 +14 +38527 +38528 +34402 +3964 +25316 +38529 +38530 +38531 +38532 +554 +25140 +38533 +19 +15718 +2197 +379 +143 +30051 +38534 +38535 +3395 +823 +25237 +29628 +33693 +19 +19144 +7053 +38536 +3546 +19 +248 +38537 +38538 +38539 +177 +77 +26161 +2694 +21698 +536 +16846 +2733 +12987 +38540 +5315 +13801 +15718 +1090 +28494 +2764 +283 +906 +170 +29134 +590 +9 +1082 +38541 +2770 +17872 +19618 +32 +38542 +77 +18045 +38543 +519 +14369 +38544 +440 +38545 +20556 +5117 +22302 +38546 +17 +38547 +1090 +17029 +22797 +11073 +9 +19995 +43 +38548 +411 +38549 +66 +1716 +4055 +4411 +19565 +89 +34433 +265 +14604 +38550 +38551 +590 +38552 +38553 +27719 +38554 +8668 +43 +38555 +38556 +38557 +99 +38558 +12013 +4033 +38559 +38560 +910 +25420 +590 +7053 +1090 +38561 +519 +10946 +38562 +30877 +38563 +1605 +10068 +13786 +10946 +38564 +22552 +19 +37556 +38565 +15718 +17467 +38566 +38567 +178 +10946 +3546 +25943 +38568 +22 +7208 +2635 +38569 +38570 +27669 +38571 +345 +5627 +21947 +9 +37556 +37556 +38572 +38573 +38574 +21947 +38575 +1425 +18503 +22986 +9144 +3330 +38576 +694 +14048 +38577 +38578 +10946 +16981 +38579 +25316 +27669 +17151 +38580 +36037 +9 +19 +23103 +38581 +38582 +38583 +1100 +38584 +14477 +66 +38585 +24207 +33061 +9 +20941 +38586 +38587 +24972 +1181 +1042 +179 +38588 +34402 +12684 +2117 +568 +19 +26519 +31041 +398 +38589 +38590 +28317 +15344 +38591 +29381 +38592 +38593 +31634 +13569 +1401 +31168 +38594 +38595 +4367 +4547 +22420 +38596 +35090 +38597 +5119 +8668 +38598 +9 +213 +36639 +38599 +3030 +10946 +38600 +38601 +1090 +671 +7836 +14369 +24375 +213 +1818 +590 +5784 +36735 +57 +11754 +38602 +14404 +25584 +38603 +213 +57 +6121 +349 +15511 +43 +38604 +38605 +15718 +1502 +7516 +38606 +1426 +4461 +23103 +18616 +38607 +25 +19220 +1082 +38608 +38609 +33650 +815 +36070 +38610 +38611 +671 +5578 +21208 +415 +29540 +5316 +38612 +16574 +12466 +38613 +34181 +37556 +736 +25904 +16 +4452 +38614 +37556 +9 +25316 +19 +31541 +4055 +19702 +37556 +3075 +25316 +38615 +22903 +19 +861 +989 +38616 +38617 +19 +38618 +38619 +22464 +19618 +1090 +38620 +36638 +4124 +25316 +10818 +337 +15718 +31293 +43 +15718 +38621 +16096 +720 +14001 +3543 +38622 +38623 +1090 +38624 +10511 +317 +27669 +590 +38625 +38626 +17 +38627 +38628 +60 +16177 +8716 +5816 +1870 +17911 +971 +809 +7511 +38629 +38630 +736 +284 +6943 +28199 +284 +1224 +651 +248 +38631 +3553 +28666 +12044 +26040 +38632 +38633 +2410 +38634 +5085 +209 +2410 +7053 +15718 +38635 +730 +1090 +31168 +14693 +1606 +736 +590 +21947 +13754 +13848 +31098 +4055 +38636 +21947 +38637 +20700 +8392 +19587 +16511 +38638 +3119 +3546 +213 +4061 +23799 +284 +1817 +38639 +38640 +26142 +5318 +303 +213 +19792 +38641 +14477 +2430 +13721 +16466 +7053 +18061 +28441 +415 +37770 +3943 +38642 +38643 +38644 +13361 +8392 +38645 +286 +14330 +4055 +27575 +1847 +38646 +14795 +38478 +27669 +66 +284 +12911 +284 +38647 +19618 +26475 +38648 +971 +33974 +38649 +201 +38650 +38651 +38652 +20 +38653 +33552 +31293 +12063 +4684 +38654 +284 +38655 +671 +10946 +25129 +21947 +57 +33447 +34641 +38656 +887 +38465 +770 +24860 +38657 +4055 +38658 +809 +21947 +30532 +33494 +13721 +18815 +22556 +5188 +31293 +37556 +38659 +38660 +4647 +7154 +57 +38661 +31787 +17448 +20326 +19 +1779 +1356 +15718 +3391 +9 +38662 +1529 +38663 +38664 +38665 +6364 +38666 +38667 +21947 +31293 +337 +16466 +38668 +30877 +38669 +38670 +10 +18159 +2769 +38671 +2043 +26030 +415 +30877 +38672 +38673 +1090 +30464 +38674 +38675 +1689 +38676 +25140 +38677 +77 +12402 +5614 +14 +284 +201 +38678 +32650 +38679 +38680 +3743 +43 +19 +3147 +30097 +38681 +31293 +32349 +38682 +25943 +9 +28549 +38003 +14001 +17229 +205 +1090 +38683 +20514 +19655 +10718 +19 +23103 +43 +26060 +38684 +19 +342 +32402 +38685 +28302 +31150 +19 +38686 +12741 +284 +8668 +38687 +9 +28199 +3353 +38688 +38689 +37556 +38690 +301 +38691 +38692 +38693 +38694 +24862 +38695 +22809 +15083 +89 +38696 +38697 +2465 +18345 +554 +736 +38698 +11762 +27669 +18019 +38699 +38700 +1710 +345 +5582 +11957 +11158 +37289 +30877 +38701 +38702 +38703 +38704 +57 +4055 +590 +38705 +38706 +23404 +38707 +38708 +38709 +1889 +24862 +31168 +38710 +10624 +3369 +809 +38711 +337 +104 +38712 +21947 +399 +21947 +15718 +33650 +38713 +5089 +3978 +9 +736 +7053 +14935 +22 +38714 +38715 +28423 +19 +38716 +38717 +38718 +1066 +38719 +3994 +27669 +38366 +30917 +43 +365 +38720 +38721 +248 +16466 +9 +28036 +365 +38722 +1109 +38723 +23103 +38724 +38725 +18369 +57 +38726 +12095 +38727 +345 +38728 +554 +17136 +38729 +6514 +38730 +37556 +4055 +27669 +14477 +38731 +38732 +1566 +38733 +9 +32 +27566 +1018 +24864 +29483 +16944 +29381 +38734 +38735 +38736 +38737 +1047 +38738 +38739 +37556 +38740 +38741 +19 +38742 +1655 +32856 +32410 +37556 +28036 +38743 +38744 +590 +38745 +16024 +14597 +21947 +11762 +30933 +38746 +24303 +89 +29629 +30224 +492 +38747 +31047 +15683 +492 +22236 +3546 +38748 +38749 +9 +15 +7629 +23150 +38750 +89 +38751 +19 +745 +1082 +38752 +15 +1082 +21947 +2622 +38499 +38753 +38754 +38755 +4488 +1090 +38756 +270 +38757 +38758 +38759 +19 +38760 +38761 +38762 +4414 +38763 +12722 +1100 +2158 +38764 +155 +4116 +37770 +19 +38765 +286 +14616 +32379 +38766 +21947 +37556 +37556 +29381 +17228 +57 +286 +43 +1847 +3599 +15718 +416 +38767 +28317 +38768 +2567 +5340 +10946 +15 +21947 +9 +272 +1090 +21947 +38769 +38770 +201 +11647 +38771 +38772 +21947 +38773 +573 +14477 +18283 +4701 +323 +37976 +18896 +38774 +9 +38775 +136 +38776 +38777 +38778 +20005 +317 +2694 +1090 +6732 +29628 +38779 +38780 +38781 +25584 +1559 +21045 +1091 +5188 +28649 +18695 +38782 +98 +25 +2762 +38783 +6953 +30117 +17602 +536 +38784 +28893 +10172 +1300 +720 +17144 +2260 +22677 +9870 +33650 +38785 +2770 +38786 +8392 +1514 +15 +38787 +19 +15 +38067 +19694 +677 +4166 +18503 +24458 +16 +7123 +828 +30551 +736 +172 +38788 +43 +14185 +21698 +38789 +38790 +38791 +25 +9 +15718 +558 +349 +43 +38792 +38793 +21336 +24896 +38794 +38795 +17911 +1011 +4441 +38796 +16935 +38797 +33222 +38798 +15824 +9628 +2260 +7053 +38799 +18589 +37204 +35969 +18695 +30051 +29204 +57 +16437 +590 +31293 +38800 +38801 +21947 +37881 +38802 +1710 +38803 +38804 +38805 +484 +16886 +1764 +887 +38806 +25668 +32 +17338 +15649 +4441 +27669 +24864 +21681 +43 +25 +2561 +7835 +43 +373 +38807 +31041 +12417 +99 +19355 +38808 +5803 +22607 +38809 +9 +14604 +3546 +17158 +9 +38810 +38811 +38812 +26389 +38813 +14369 +37959 +70 +8318 +19 +38814 +66 +28219 +38815 +8244 +89 +38816 +38817 +32 +1090 +16447 +43 +38818 +38819 +2061 +38820 +31293 +10946 +38821 +15146 +38822 +38823 +20943 +5627 +38824 +38825 +38826 +15718 +4230 +10946 +11966 +38827 +416 +10583 +38828 +13307 +3546 +99 +34999 +38829 +28474 +5700 +8639 +19 +17338 +38033 +10946 +38830 +3999 +2926 +38831 +736 +57 +21694 +20280 +38832 +17151 +25237 +349 +1716 +38833 +9178 +38834 +16121 +8160 +17151 +38835 +25316 +2982 +188 +38836 +38837 +645 +30051 +38838 +38839 +153 +29483 +19 +38840 +15718 +1716 +397 +38841 +38842 +415 +38843 +2038 +18982 +38844 +31293 +4125 +3492 +38845 +25316 +38846 +31401 +38847 +533 +38848 +18695 +1090 +38849 +35318 +57 +14330 +9 +26320 +38850 +590 +38851 +70 +38852 +38853 +38854 +22 +12200 +38855 +399 +38856 +43 +38857 +38858 +2766 +38859 +38860 +38861 +373 +15718 +2259 +38862 +37556 +25237 +38863 +11461 +14660 +38760 +38864 +38760 +164 +38865 +17033 +22 +18895 +38866 +17054 +1310 +38867 +590 +43 +38868 +38869 +38870 +38871 +38872 +4055 +7745 +27669 +30224 +38873 +1090 +38874 +2197 +27369 +1961 +8727 +1384 +38875 +46 +1513 +38876 +25316 +1531 +21947 +1425 +38877 +1316 +7320 +36492 +17449 +38878 +11539 +4024 +201 +21045 +1797 +9 +38879 +16 +32 +38880 +349 +21874 +1090 +38881 +1716 +1434 +15 +16443 +13721 +38882 +1749 +16648 +38883 +38884 +14363 +38885 +2770 +1169 +11754 +38886 +354 +1415 +384 +140 +20515 +18283 +30877 +18951 +12344 +38887 +38888 +31293 +15951 +2733 +38889 +38890 +38891 +1792 +19618 +38892 +38893 +1562 +38894 +38895 +590 +3767 +32245 +6620 +33494 +19 +38896 +38897 +2197 +25237 +1637 +2318 +22099 +33316 +28625 +38898 +38899 +38900 +24457 +76 +745 +23603 +38901 +3989 +28116 +349 +38902 +2827 +1517 +16 +15699 +7835 +25584 +2561 +20952 +38903 +38774 +38904 +19 +15718 +16327 +197 +707 +38905 +3553 +38906 +3994 +38907 +20898 +720 +38908 +38909 +283 +14520 +29992 +38910 +9 +38911 +30877 +228 +38912 +9 +38913 +13570 +38914 +23418 +2769 +38915 +379 +1382 +13696 +38916 +21947 +3964 +44 +114 +38917 +2988 +16436 +38918 +7939 +379 +6264 +15 +1605 +36735 +26048 +9 +38919 +30877 +1011 +38920 +3509 +10946 +38921 +936 +38922 +554 +15871 +11822 +29278 +1300 +38923 +17872 +38924 +1066 +38925 +38926 +24774 +38927 +38928 +38929 +9 +8367 +3546 +1514 +573 +33494 +38930 +19 +736 +8961 +201 +38931 +34402 +8110 +38932 +66 +5244 +16413 +6321 +1779 +43 +15572 +24144 +38933 +38934 +38935 +6067 +586 +590 +38936 +317 +38937 +38938 +24864 +538 +7516 +2314 +736 +11926 +9 +14477 +16466 +1502 +3376 +21947 +11 +38939 +38940 +19 +37556 +38941 +1048 +970 +519 +23103 +14079 +25237 +1415 +25316 +16060 +38942 +38943 +770 +3976 +30224 +43 +19160 +38944 +38945 +155 +27178 +188 +4055 +646 +5188 +33650 +38946 +38947 +4677 +38948 +25316 +176 +38949 +38950 +377 +24303 +30209 +38951 +14909 +31576 +764 +33650 +38952 +8685 +19542 +209 +4055 +915 +25316 +18283 +38953 +21268 +38954 +38955 +14363 +38956 +4547 +20340 +11639 +38957 +27669 +19 +38958 +34438 +1090 +38959 +24896 +38960 +31346 +38961 +38962 +1471 +30056 +590 +38963 +590 +4012 +38964 +7516 +568 +38965 +38966 +9 +38967 +38968 +38969 +2410 +38970 +15718 +568 +30877 +30877 +38971 +1681 +12987 +38972 +14 +38973 +21947 +38974 +38975 +22 +9210 +155 +286 +31234 +19 +34402 +43 +38976 +21947 +16327 +4682 +38977 +37556 +495 +46 +145 +38978 +22091 +21947 +3376 +23874 +15718 +9 +38979 +38980 +1617 +24972 +25 +1437 +38981 +411 +34889 +38982 +38117 +38983 +36328 +19 +25526 +1575 +3251 +33650 +5085 +196 +286 +38984 +24303 +6877 +14369 +1617 +4055 +8297 +38985 +155 +16234 +38986 +30927 +4461 +7721 +19918 +38987 +7743 +1047 +22798 +38988 +37556 +38989 +2577 +38990 +38991 +1051 +7706 +20 +38992 +1090 +38993 +30051 +20 +12584 +7419 +16437 +38994 +2035 +38995 +155 +38996 +765 +43 +590 +3964 +38997 +38998 +2260 +38999 +39000 +39001 +24303 +39002 +24864 +38465 +15722 +39003 +24303 +27260 +39004 +590 +514 +39005 +39006 +32518 +39007 +39008 +33909 +30224 +35357 +1578 +31293 +7516 +39009 +39010 +43 +39011 +38465 +39012 +32856 +39013 +34402 +39014 +2367 +1617 +19 +39015 +536 +9 +39016 +29204 +448 +17144 +3421 +282 +1768 +39017 +8249 +39018 +1224 +730 +15718 +24725 +31225 +30877 +37556 +8982 +21947 +39019 +57 +35496 +13620 +39020 +32 +39021 +1920 +36735 +17151 +7379 +2764 +21268 +33693 +39022 +39023 +39024 +29483 +37920 +39025 +369 +21947 +18951 +2635 +18045 +6997 +39026 +39027 +24302 +1157 +34171 +28441 +30877 +39028 +9 +39029 +39030 +26496 +21947 +140 +665 +20489 +10946 +21689 +39031 +39032 +19 +33650 +35948 +1961 +39033 +38667 +39034 +36268 +39035 +9 +15718 +958 +590 +38465 +39036 +39037 +39038 +349 +39039 +194 +39040 +8668 +39041 +1989 +39042 +3599 +39043 +39044 +31576 +14327 +2593 +37556 +21947 +7053 +39045 +30224 +17217 +10791 +590 +60 +17040 +39046 +39047 +3542 +228 +22464 +39048 +1364 +6439 +14770 +5582 +30877 +6364 +10946 +30051 +36721 +892 +30417 +39049 +36735 +39050 +2457 +2561 +1732 +1246 +39051 +2040 +21031 +10946 +53 +39052 +286 +1364 +554 +201 +15718 +17151 +2919 +16853 +1090 +14650 +34890 +39053 +39054 +283 +39055 +4028 +39056 +39057 +39058 +39059 +15096 +915 +10147 +39060 +39061 +21732 +10946 +33650 +9 +8334 +39062 +15295 +39063 +43 +33650 +27669 +37556 +27669 +17602 +13375 +39064 +39065 +8639 +9 +27669 +5891 +39066 +1563 +39067 +14477 +39068 +39069 +14477 +6001 +43 +7835 +35318 +286 +39070 +12579 +24896 +7835 +19 +21337 +5344 +28036 +153 +590 +29483 +39071 +39072 +16327 +140 +39073 +18627 +15718 +16466 +39074 +317 +39075 +365 +16437 +46 +590 +8668 +2260 +43 +39076 +142 +1508 +7835 +39077 +16437 +39078 +31293 +16437 +1107 +39079 +39080 +590 +39081 +179 +2550 +30224 +39082 +39083 +27669 +25943 +29483 +39084 +21776 +9 +39085 +39086 +9 +25140 +39087 +16919 +9939 +37588 +39088 +8297 +11096 +19618 +57 +15718 +568 +14271 +16466 +345 +1090 +39089 +13323 +39090 +39091 +3546 +164 +39092 +32763 +1688 +2040 +39093 +39094 +430 +10946 +30877 +7053 +9 +500 +39095 +34204 +39096 +9 +1090 +39097 +39098 +39099 +39100 +39101 +39102 +4055 +736 +14369 +39103 +17151 +37764 +39104 +19 +707 +10946 +16160 +39105 +39106 +39107 +14001 +25983 +39108 +238 +33921 +17151 +736 +39109 +5963 +3959 +9118 +37556 +39110 +39111 +14 +39112 +39113 +39114 +11762 +11013 +29082 +39115 +39116 +1540 +39117 +30794 +9 +32 +21947 +24113 +22 +22197 +39118 +4899 +39119 +5188 +5344 +19 +15 +33438 +4055 +554 +590 +16 +17911 +14604 +379 +27521 +21627 +33650 +17232 +39120 +89 +19797 +36638 +39121 +39122 +39123 +10028 +43 +703 +34944 +39124 +554 +19 +590 +29687 +1920 +30224 +39125 +4055 +533 +39126 +39127 +39128 +99 +39129 +19 +7544 +10 +39130 +15539 +2532 +5188 +39131 +39132 +39133 +19 +178 +39134 +43 +39135 +1013 +30224 +14660 +22799 +1563 +39136 +554 +39137 +57 +39138 +19 +4055 +284 +29381 +1082 +7855 +122 +33447 +67 +9595 +39139 +590 +39140 +104 +39141 +39142 +457 +52 +46 +39143 +39144 +32782 +39145 +39146 +25589 +37556 +39147 +14648 +29204 +5209 +31168 +34 +19178 +1688 +284 +14369 +29483 +39148 +39149 +39150 +39151 +349 +140 +5188 +20677 +3546 +8501 +39152 +39153 +39154 +12202 +10946 +1425 +25316 +39155 +209 +12348 +9 +1090 +39156 +39157 +39158 +7583 +39159 +39160 +39161 +39162 +39163 +57 +28316 +9 +4328 +39164 +39165 +15647 +16447 +39166 +39167 +20442 +303 +590 +15 +10501 +35 +2694 +4765 +19 +35284 +590 +39168 +39169 +12 +19 +15311 +971 +39170 +10147 +12987 +34706 +12969 +39171 +590 +4518 +284 +284 +39172 +9 +21947 +37556 +39173 +39174 +5085 +39175 +30568 +48 +6261 +13905 +7276 +39176 +242 +19 +39177 +28441 +18503 +519 +30224 +2314 +2414 +14 +39178 +17151 +39179 +39180 +3546 +39181 +39182 +30877 +39183 +1090 +6701 +915 +16562 +34402 +39184 +703 +677 +27362 +39185 +1912 +20355 +365 +29172 +24180 +5780 +286 +5784 +11762 +248 +39186 +39187 +46 +22963 +39188 +1710 +9 +14 +43 +39189 +2147 +140 +46 +2281 +14001 +39190 +5499 +9 +21947 +39191 +30051 +39192 +39193 +39194 +39195 +415 +29483 +21947 +1107 +887 +89 +15 +25237 +4116 +39196 +39197 +39198 +39199 +38465 +21947 +286 +10946 +39200 +39201 +358 +43 +43 +14947 +20005 +14914 +30051 +39202 +586 +99 +37556 +38465 +6011 +872 +33650 +248 +39203 +14 +39204 +39205 +39206 +39207 +33650 +39208 +19 +12121 +595 +209 +19 +29130 +39209 +39210 +39211 +39212 +12777 +2419 +33293 +19 +736 +590 +349 +17635 +39213 +24988 +2446 +34402 +155 +1011 +27669 +3759 +2 +1604 +4124 +17911 +24864 +29859 +33627 +24303 +15 +14477 +323 +248 +25237 +379 +39214 +18257 +38760 +5188 +721 +8249 +39215 +39216 +14909 +15710 +3242 +2944 +19 +17911 +15718 +1090 +21268 +39217 +43 +5188 +18954 +4055 +5007 +39218 +5650 +39219 +703 +12005 +1559 +30877 +2804 +39220 +39221 +1244 +1503 +303 +39222 +30877 +8208 +2865 +1090 +3546 +77 +37556 +39223 +33494 +18798 +9 +39224 +21689 +19355 +213 +43 +30223 +39225 +23226 +37556 +30877 +495 +31293 +4055 +4195 +887 +399 +248 +39226 +39227 +4055 +12299 +39228 +37556 +39229 +39230 +39231 +30232 +3655 +24862 +35220 +43 +303 +9 +39232 +39233 +1710 +31852 +39234 +37556 +18951 +39235 +39236 +568 +176 +30877 +39237 +19 +39238 +43 +39239 +140 +9 +39240 +33494 +3858 +4055 +11763 +39241 +21947 +12867 +1716 +5649 +337 +14604 +5904 +20700 +28317 +39242 +10946 +39243 +17 +39244 +31234 +43 +39245 +39246 +39247 +1300 +39248 +12267 +286 +3248 +14079 +39249 +2832 +6344 +27069 +1090 +39250 +1571 +37556 +21947 +39251 +25683 +1090 +33627 +39252 +43 +34719 +17215 +14909 +354 +29483 +39253 +4667 +1291 +703 +19 +9 +19 +89 +15718 +1524 +39254 +39255 +39256 +33120 +1018 +30224 +33758 +27719 +39257 +19 +9 +9 +39258 +10094 +222 +8602 +2197 +38893 +284 +2537 +38381 +31293 +590 +36735 +39259 +29483 +39260 +39261 +75 +43 +357 +39262 +39263 +39264 +39265 +2476 +25316 +39266 +39267 +39268 +768 +815 +32 +201 +38933 +1230 +34433 +31098 +39269 +19 +4463 +35792 +39270 +13848 +39271 +30051 +3440 +179 +21200 +39272 +57 +1961 +3858 +24725 +647 +39273 +337 +99 +39274 +39275 +284 +33650 +39276 +39277 +30230 +39278 +39279 +39280 +46 +1961 +242 +39281 +613 +74 +30005 +845 +28441 +439 +39282 +15216 +8171 +39283 +39284 +643 +817 +39285 +2349 +39286 +39287 +7226 +25237 +6161 +39288 +57 +15324 +21089 +345 +9185 +29381 +39289 +11224 +165 +10946 +39290 +138 +39291 +39292 +337 +39293 +19797 +39294 +39295 +31293 +1090 +39296 +9526 +39297 +8367 +39298 +30877 +39299 +1961 +32 +4907 +11822 +15935 +1139 +1291 +12987 +39300 +33693 +39301 +19965 +554 +2 +25140 +39302 +19318 +936 +39303 +27719 +21947 +38003 +2764 +8668 +15819 +39304 +1223 +464 +31453 +39305 +442 +39306 +39307 +39308 +24896 +39309 +720 +39310 +2733 +39311 +39312 +39313 +11073 +14843 +20 +38760 +1107 +33650 +39314 +677 +39315 +8668 +43 +39316 +39317 +19 +17670 +39318 +19009 +15718 +2804 +26320 +14816 +39319 +11321 +27798 +39320 +39321 +713 +35214 +20102 +39322 +39323 +21947 +27433 +30877 +4055 +2187 +39324 +39325 +39326 +39327 +26789 +25 +39328 +12005 +23935 +25140 +39329 +35427 +39330 +24864 +39331 +39332 +14 +5908 +39333 +25943 +927 +14330 +8787 +16773 +39334 +39335 +39336 +39337 +323 +39338 +379 +16466 +39339 +39340 +34641 +24318 +39341 +39342 +4227 +10246 +1385 +286 +6418 +379 +15718 +2406 +39343 +39344 +213 +39345 +36735 +14369 +5188 +3182 +43 +27719 +39346 +20941 +228 +33650 +39347 +9016 +25 +39348 +9410 +4907 +39349 +1300 +590 +155 +770 +39350 +21947 +39351 +77 +3679 +39352 +19618 +19 +39353 +284 +4518 +39354 +1688 +19048 +39355 +4032 +9096 +20555 +39356 +39357 +19 +39358 +248 +39359 +20 +38893 +14888 +39360 +19030 +39361 +34402 +22 +5923 +39362 +37556 +137 +25237 +6533 +286 +34444 +39363 +24864 +284 +11762 +39364 +39365 +1533 +43 +39366 +39367 +20845 +566 +39368 +1536 +15797 +1066 +39369 +30224 +209 +35155 +39370 +2832 +39371 +39372 +43 +1012 +39373 +30551 +379 +39374 +39375 +2577 +31873 +977 +18064 +39376 +31168 +39377 +286 +15370 +39378 +671 +13375 +39379 +5007 +188 +3480 +39380 +736 +25 +514 +39381 +39382 +19 +1817 +32 +865 +33061 +303 +29483 +39383 +586 +27669 +39384 +15541 +15050 +38760 +4452 +1307 +39385 +1637 +27669 +38465 +39386 +39387 +39388 +26040 +39389 +39390 +39391 +5446 +39392 +21947 +8297 +23103 +39393 +590 +39394 +39395 +39396 +12936 +39397 +39398 +19 +34402 +39399 +98 +39400 +31293 +39401 +13168 +39402 +213 +720 +19 +24051 +373 +1230 +29483 +14693 +16539 +30877 +936 +39403 +22 +39404 +770 +39405 +37556 +39406 +39407 +15341 +31370 +39408 +39409 +19 +101 +39410 +39411 +213 +29483 +39412 +30877 +8210 +248 +9 +31098 +39413 +514 +13648 +39414 +337 +29434 +14477 +495 +337 +415 +7923 +303 +39415 +1157 +39416 +33627 +3317 +39417 +284 +29007 +39418 +30224 +39419 +590 +33627 +345 +1169 +43 +22 +19852 +39420 +13361 +2694 +21947 +8380 +22598 +37556 +29711 +39421 +4055 +5188 +39422 +4055 +14369 +6598 +9948 +1172 +323 +39423 +30224 +35922 +2694 +1082 +31293 +9 +13813 +17348 +33650 +39424 +24307 +19 +4230 +14001 +25140 +14369 +4634 +11321 +39425 +26724 +826 +38465 +39426 +39427 +39428 +5351 +4153 +30224 +39429 +36734 +39430 +3759 +13113 +37556 +865 +36146 +38465 +22842 +590 +39431 +39432 +39433 +14330 +33494 +11312 +21947 +4042 +16466 +31234 +39434 +15718 +15 +39435 +440 +155 +19618 +27669 +6238 +39436 +39437 +30494 +25501 +1442 +28490 +248 +14992 +1384 +43 +36515 +3381 +11484 +39438 +4055 +2804 +37556 +22922 +3546 +39439 +11321 +17385 +39440 +586 +694 +21089 +39441 +14330 +1056 +33951 +5085 +39442 +39443 +39444 +39445 +27669 +21947 +39446 +20700 +39447 +39448 +34752 +19 +39449 +13777 +39450 +12454 +15718 +39451 +36208 +720 +39452 +39453 +13905 +24423 +57 +39454 +19 +14369 +2709 +39455 +671 +39456 +39457 +613 +39458 +25943 +915 +39459 +36218 +39460 +34 +19 +303 +115 +19029 +30224 +25943 +37127 +39461 +39462 +24405 +15 +21947 +39463 +32915 +19 +345 +24862 +39464 +39465 +39466 +19489 +1426 +39467 +39468 +2197 +317 +39469 +29483 +8727 +39470 +19 +14604 +12987 +35214 +27043 +30877 +7471 +103 +32 +23727 +1090 +21776 +39471 +1384 +39472 +39473 +39474 +29406 +39475 +25316 +736 +31041 +17412 +39476 +21947 +9 +31168 +39477 +915 +4330 +15906 +1112 +4808 +39059 +595 +39478 +30877 +39479 +590 +10 +33650 +17670 +33120 +29381 +39480 +22815 +39481 +286 +39482 +201 +39483 +39484 +38523 +24332 +24303 +31575 +17691 +16826 +19655 +1090 +822 +39485 +21947 +38008 +2009 +5071 +39486 +30224 +13424 +1090 +39487 +39488 +39489 +25624 +1513 +554 +25140 +33494 +301 +39490 +323 +39491 +4518 +15 +1083 +39492 +39493 +7810 +21187 +8053 +39494 +1164 +30224 +39495 +57 +39496 +31098 +39497 +11593 +39498 +24725 +736 +1710 +39499 +1212 +39500 +39501 +26361 +39502 +39503 +33758 +31346 +33278 +373 +39504 +39505 +38003 +25683 +14477 +39506 +39507 +415 +272 +39508 +1749 +1765 +39509 +39510 +39511 +2314 +1680 +13988 +39512 +8378 +29204 +35591 +17615 +18695 +31873 +39513 +17385 +22986 +484 +1112 +39514 +16826 +16511 +39515 +30309 +57 +39516 +14369 +43 +590 +39517 +39518 +21269 +28036 +39519 +29483 +18904 +39520 +39521 +7027 +57 +176 +10177 +9 +39522 +39523 +29483 +286 +14586 +10500 +1011 +27719 +21947 +8392 +26928 +39524 +568 +22314 +43 +284 +14330 +9 +10946 +440 +19 +39525 +39526 +39527 +39528 +573 +39529 +25140 +19 +53 +2577 +3260 +665 +31881 +36638 +23112 +39530 +36481 +39531 +3637 +39532 +1428 +201 +39533 +8670 +53 +39534 +25904 +14 +7053 +228 +1082 +1153 +35633 +4124 +15249 +39535 +43 +9 +17295 +14001 +39536 +491 +39537 +39538 +14066 +39539 +39323 +39540 +34 +39541 +590 +39542 +25316 +8890 +13721 +1051 +33116 +39543 +39544 +14369 +27069 +24303 +19209 +39545 +39546 +2764 +24144 +6471 +2 +19 +31225 +554 +9 +24725 +39547 +19618 +1090 +39548 +352 +37388 +14369 +39549 +25237 +21947 +31042 +7053 +39550 +34402 +89 +646 +39551 +39552 +286 +15 +39553 +104 +613 +29204 +21627 +17911 +209 +19 +39554 +57 +7053 +39555 +39556 +16782 +15537 +39557 +22800 +14152 +2739 +15 +21742 +10 +30877 +1141 +34317 +19918 +278 +39558 +39559 +39560 +30449 +33627 +39561 +2733 +2975 +14369 +38523 +28549 +19 +39562 +15718 +39563 +1352 +286 +39564 +39565 +16398 +1172 +18695 +317 +4339 +2009 +21947 +28317 +24303 +24862 +15 +193 +1011 +14840 +39566 +25316 +31293 +39567 +39568 +815 +590 +30051 +209 +1870 +24864 +4650 +4055 +39569 +39570 +15718 +21947 +39571 +5327 +39572 +14001 +39573 +98 +39574 +31098 +349 +1181 +411 +7774 +39575 +39576 +39577 +25683 +17077 +34402 +15671 +39578 +11600 +6883 +576 +910 +24864 +2694 +5188 +1090 +39579 +39580 +39581 +8357 +39582 +39583 +19618 +21947 +19724 +36268 +20677 +1090 +11797 +8356 +39584 +37556 +39585 +39586 +30224 +39587 +38595 +28317 +5231 +10846 +43 +31293 +36783 +39588 +39589 +33627 +31293 +37920 +16 +30224 +12067 +15 +39590 +30221 +39591 +19 +1563 +39592 +39593 +590 +37556 +39594 +4352 +39595 +39596 +18345 +2243 +1562 +17396 +70 +32566 +36268 +29153 +44 +39597 +22 +19 +15547 +2919 +29434 +39598 +39599 +358 +39600 +15370 +1157 +349 +11249 +30458 +39601 +34 +39602 +30877 +39603 +1517 +39604 +16437 +1920 +10677 +3598 +39605 +6122 +19 +16 +317 +1571 +33385 +18283 +11429 +14 +39606 +33709 +24036 +39607 +19 +1212 +39608 +39609 +32 +1090 +20496 +39590 +39610 +39611 +39612 +26922 +13721 +39613 +39614 +32 +354 +590 +39615 +1157 +5627 +30877 +265 +33494 +707 +38760 +15718 +2310 +14856 +286 +23741 +2372 +39616 +39617 +12251 +39618 +57 +39619 +6531 +19655 +39620 +26361 +4055 +7661 +39621 +39622 +30877 +25140 +1011 +39623 +39590 +70 +1011 +53 +39624 +1224 +39625 +39626 +4684 +590 +2031 +39627 +39628 +24864 +1090 +39629 +23103 +19 +25048 +11072 +18045 +33627 +9 +39630 +27669 +13179 +21729 +8297 +9 +411 +39631 +27147 +39632 +861 +30877 +345 +1442 +31172 +39633 +34264 +39634 +2865 +14330 +1013 +33650 +3904 +3601 +33650 +30481 +39635 +43 +39636 +28317 +5065 +39637 +39638 +19 +27224 +39639 +39640 +39641 +39642 +25 +865 +31168 +20158 +4056 +39643 +39644 +8668 +11670 +22844 +3546 +39645 +39646 +39647 +990 +29875 +566 +39648 +37525 +37819 +39649 +37556 +30449 +2755 +39650 +39651 +39652 +3182 +14127 +39653 +66 +4002 +27043 +29483 +39654 +34402 +1107 +39655 +46 +39656 +1870 +19 +39657 +39658 +9440 +5085 +39659 +39660 +33627 +39661 +38527 +32581 +20288 +66 +30580 +17151 +11421 +6571 +13721 +39662 +2187 +39663 +1115 +37556 +39664 +140 +39665 +1384 +5409 +39666 +39667 +39668 +9771 +15718 +3743 +39669 +590 +1410 +39670 +16542 +4808 +32022 +1961 +37556 +9 +43 +39671 +15 +39672 +39673 +30650 +63 +28316 +5293 +39674 +22757 +39675 +1531 +38478 +972 +17267 +19 +36218 +39676 +43 +16 +39677 +6531 +14660 +39678 +39679 +19 +668 +39680 +19 +2804 +39681 +37920 +15698 +33553 +39682 +39683 +39684 +38033 +795 +23103 +39685 +8685 +379 +21521 +7835 +13143 +12589 +1051 +21947 +39686 +209 +39687 +645 +10 +25481 +39688 +19283 +39689 +32520 +39690 +33278 +36268 +39609 +11312 +24303 +39691 +554 +39692 +24889 +1470 +225 +39693 +39694 +39695 +16609 +39696 +39697 +31293 +590 +9 +39698 +533 +13399 +14679 +37290 +39699 +39700 +43 +39701 +8437 +39702 +39703 +39704 +23497 +35948 +16121 +15718 +39705 +2195 +3553 +2604 +4055 +39706 +15718 +849 +892 +558 +14340 +21689 +1454 +39707 +19 +39708 +39709 +39710 +590 +19 +4525 +140 +4274 +39711 +39712 +15 +32190 +39713 +137 +39714 +349 +39715 +5204 +38760 +33650 +554 +24896 +1011 +2694 +39716 +12661 +115 +9573 +25237 +14369 +29381 +36755 +99 +23264 +39717 +30877 +39718 +10 +349 +16826 +43 +29381 +39719 +39720 +23103 +3104 +39721 +39722 +29483 +66 +6294 +39723 +2471 +1765 +2300 +845 +39724 +26496 +6766 +31873 +15718 +16331 +14330 +21338 +10 +12555 +415 +39725 +16437 +30877 +31906 +34402 +31293 +22 +1870 +5877 +39726 +39727 +39728 +13943 +137 +21947 +176 +15718 +24332 +3546 +2795 +39729 +323 +1107 +39730 +13721 +39731 +34402 +29483 +1562 +36268 +36638 +6499 +29483 +37556 +39732 +39733 +31098 +6110 +15 +39734 +19178 +39735 +30224 +317 +5679 +39736 +1577 +32332 +4306 +2577 +39737 +39738 +39739 +39740 +21947 +1090 +39741 +1471 +7960 +31139 +349 +19 +39742 +2325 +39743 +586 +39744 +39745 +39746 +36268 +39747 +39748 +32410 +39749 +39709 +39750 +10946 +365 +554 +43 +39751 +2135 +39752 +39753 +29483 +13905 +701 +345 +22949 +39754 +519 +26657 +33295 +39755 +39756 +33627 +590 +43 +3172 +39757 +39758 +21947 +39759 +28186 +703 +1047 +28965 +19655 +648 +3915 +9 +8727 +17151 +39760 +39761 +39762 +736 +15718 +6072 +31293 +4518 +1018 +19 +1442 +38523 +14025 +17 +37556 +1120 +19995 +39763 +39764 +14909 +43 +357 +39765 +955 +188 +18310 +39766 +39767 +39768 +19994 +39769 +4779 +225 +21672 +36268 +19 +13396 +21947 +39770 +37770 +39771 +39772 +7855 +28317 +7053 +25 +1090 +15 +39773 +19 +39211 +39774 +21947 +34433 +590 +19852 +14477 +39775 +37556 +2764 +57 +39776 +39777 +39778 +39779 +39780 +26496 +38465 +4808 +3553 +39781 +39782 +39783 +39784 +39785 +39786 +20058 +2264 +590 +2804 +39787 +23231 +39788 +32275 +15823 +39789 +970 +3491 +1090 +39790 +21947 +39791 +9 +89 +6499 +39792 +14369 +36268 +5314 +349 +39793 +39794 +1090 +179 +39795 +39796 +3100 +1066 +13474 +109 +27669 +13803 +19058 +39797 +39798 +2097 +399 +4124 +14 +39799 +2532 +24725 +39800 +1090 +36394 +39801 +15461 +736 +31293 +26049 +9 +18310 +24864 +21947 +1090 +317 +31293 +39802 +37504 +39803 +1021 +39804 +39805 +19 +4472 +14689 +39806 +3546 +32410 +43 +4055 +17149 +36218 +39807 +17151 +39808 +25140 +31293 +39809 +736 +39810 +28036 +37556 +286 +37556 +736 +19 +21947 +1051 +12185 +2324 +4441 +37556 +39811 +5642 +1531 +39812 +12005 +30877 +541 +34337 +13349 +19 +9 +39813 +720 +533 +24458 +39814 +18418 +1822 +36218 +1090 +32 +6468 +590 +3764 +13448 +37556 +14330 +11762 +39815 +39816 +39817 +36268 +31098 +39818 +19 +29945 +24303 +533 +20514 +20718 +15718 +43 +39819 +30650 +39820 +39821 +39822 +24896 +14477 +3127 +39823 +15 +23103 +1090 +39824 +33627 +14369 +15718 +39825 +14363 +4461 +39826 +38523 +3296 +21947 +9922 +23103 +5780 +12590 +39827 +16466 +2197 +39828 +1090 +18136 +39829 +10791 +15718 +5153 +39830 +39831 +24725 +39832 +6364 +1559 +39833 +1647 +43 +39834 +713 +31293 +590 +286 +25140 +373 +18310 +39835 +9 +17170 +18896 +2567 +25237 +1481 +9 +17571 +35832 +15718 +26210 +30551 +16239 +1425 +9 +14369 +39836 +39837 +10769 +32332 +30580 +39838 +30224 +39839 +1100 +39840 +7835 +24840 +179 +39841 +22912 +26320 +176 +590 +39842 +34537 +3407 +21949 +2581 +39843 +39844 +38595 +7835 +15068 +39845 +39846 +39847 +39848 +39849 +1116 +14369 +39850 +345 +21776 +16612 +5912 +31041 +1018 +7053 +528 +32 +9 +17602 +39851 +39852 +21947 +39853 +827 +39854 +35076 +39855 +39856 +39857 +26496 +31293 +4439 +39858 +31293 +43 +411 +27669 +379 +39859 +26611 +39860 +29204 +21947 +286 +39861 +39862 +19655 +39863 +21738 +9 +484 +16450 +7732 +29798 +39864 +22176 +39865 +39866 +39867 +5314 +12919 +484 +39868 +140 +29381 +43 +138 +39869 +89 +1280 +8214 +24766 +14477 +4056 +14477 +39870 +1224 +15654 +39871 +39872 +39873 +39874 +39875 +4820 +19284 +19 +29204 +39876 +39877 +19 +43 +29200 +1108 +39878 +39879 +39880 +9 +39881 +39882 +590 +17635 +30877 +36483 +11754 +24322 +28961 +14825 +39883 +14330 +39884 +24324 +1169 +4502 +3994 +29204 +31293 +3904 +6718 +39885 +17151 +39536 +39886 +39887 +1606 +2187 +28317 +745 +19 +9 +39888 +39889 +43 +514 +39890 +1011 +533 +7237 +861 +17897 +16437 +8160 +30224 +39891 +2 +31293 +36268 +39892 +20825 +104 +7835 +590 +19 +1090 +39893 +39894 +39895 +12231 +39896 +39897 +17033 +39898 +30877 +39899 +5737 +554 +586 +142 +528 +18695 +39900 +7855 +13409 +2919 +37556 +39901 +39902 +36218 +9 +457 +39903 +39904 +16443 +566 +39905 +39906 +27122 +34204 +43 +39907 +39908 +24864 +1749 +3030 +39909 +39910 +14 +39911 +373 +26361 +238 +19 +39912 +19618 +32 +39913 +39914 +39915 +616 +19 +4916 +39916 +39917 +39918 +14369 +39919 +2953 +39920 +38465 +39921 +39922 +7027 +25683 +39923 +2865 +21947 +14343 +323 +39924 +6833 +286 +14001 +8282 +31512 +39925 +536 +39926 +15320 +39927 +25943 +9 +832 +39928 +39929 +39930 +19 +39931 +31346 +39932 +21947 +30650 +11430 +16925 +14369 +4521 +14161 +39933 +39934 +18774 +37556 +43 +38303 +39935 +14363 +590 +36457 +39936 +39937 +39938 +39939 +30877 +9 +39940 +58 +39941 +31293 +19 +39942 +3406 +39943 +30650 +222 +1992 +11202 +1852 +2694 +39944 +26724 +39945 +29209 +2314 +39946 +8528 +14102 +28339 +39947 +1082 +24864 +14369 +39948 +21198 +509 +5780 +1720 +43 +14079 +57 +15 +7478 +39949 +3406 +39950 +39951 +39952 +478 +4760 +4055 +185 +39953 +13539 +39954 +3790 +1531 +39955 +514 +24303 +15164 +1716 +21947 +1234 +1310 +31936 +27069 +399 +31293 +5409 +17997 +39956 +31381 +32523 +98 +29483 +31098 +15 +31225 +38729 +34402 +16466 +37556 +2872 +25943 +24864 +1696 +39957 +22823 +31293 +39958 +39959 +7159 +39960 +31002 +43 +1456 +29483 +39961 +39962 +39963 +39964 +39965 +25584 +1090 +12934 +115 +39966 +39967 +39968 +39969 +2356 +15497 +17412 +37556 +31293 +39970 +7053 +31293 +39971 +21947 +9 +28036 +6115 +39972 +7904 +39973 +15 +4463 +3839 +35423 +7302 +39974 +29483 +586 +39975 +7471 +286 +39976 +1013 +880 +39977 +39978 +39979 +29483 +10946 +39980 +16826 +21947 +39981 +30535 +9 +13304 +37556 +39982 +9 +19655 +21973 +2591 +39983 +39984 +5431 +2314 +39985 +18120 +4 +528 +736 +595 +39986 +19 +446 +39987 +39988 +39989 +20851 +4441 +10 +15718 +43 +415 +39990 +11321 +39991 +39992 +39993 +39994 +39995 +357 +39996 +39997 +39998 +30877 +35086 +38003 +43 +881 +39999 +2064 +10 +40000 +1090 +1021 +2315 +30877 +40001 +15718 +40002 +40003 +40004 +19 +36268 +30877 +17911 +14363 +40005 +1508 +40006 +40007 +43 +40008 +40009 +40010 +40011 +7835 +17151 +30877 +40012 +14363 +40013 +12307 +33494 +40014 +30224 +9 +19618 +40015 +40016 +40017 +28384 +30877 +40018 +40019 +33508 +2779 +40020 +1115 +533 +40021 +40022 +5949 +31225 +862 +14 +28317 +30877 +15718 +5780 +40023 +38760 +11607 +7658 +40024 +40025 +19 +27669 +27069 +1956 +40026 +40027 +19618 +40028 +40029 +40030 +40031 +4100 +26020 +558 +40032 +10616 +20423 +29047 +40033 +19 +40034 +40035 +14947 +40036 +40037 +40038 +40039 +34957 +40040 +29172 +40041 +20442 +36735 +34602 +34402 +40042 +19632 +1710 +583 +13405 +4 +7260 +18939 +37631 +416 +40043 +40044 +15398 +37511 +1912 +4425 +25 +15 +564 +140 +43 +66 +33120 +37556 +40045 +4055 +915 +19406 +39983 +40046 +9 +15718 +29628 +1415 +736 +7123 +40047 +40048 +29483 +3148 +30650 +1013 +155 +104 +21269 +32410 +40049 +40050 +27794 +40051 +2117 +40052 +40053 +40054 +2 +34402 +40055 +137 +18695 +40056 +2349 +40057 +40058 +25316 +19 +14369 +40059 +40060 +8362 +29109 +4116 +40061 +14363 +40062 +40063 +882 +2865 +43 +286 +274 +40064 +40065 +31293 +720 +14515 +936 +29914 +14477 +28295 +38987 +40066 +31293 +40067 +40068 +5725 +736 +3050 +5659 +788 +40069 +10 +40070 +2260 +40071 +201 +21947 +40072 +40073 +3119 +590 +1090 +40074 +40075 +1513 +40076 +40077 +40078 +40079 +37556 +1021 +28961 +415 +38523 +8076 +4313 +4735 +25316 +3345 +40080 +3546 +28295 +40081 +37684 +80 +22 +40082 +39709 +19 +40083 +15 +14898 +25943 +40084 +349 +40085 +7624 +18695 +33306 +6950 +11106 +40086 +16437 +597 +15178 +31293 +17273 +14947 +40087 +40088 +40089 +11 +15718 +915 +40090 +1529 +2314 +1503 +21947 +250 +2764 +40091 +14909 +40092 +40093 +13026 +713 +24045 +40094 +36735 +9633 +119 +40095 +40096 +40097 +15 +30224 +31873 +40098 +23855 +40099 +15497 +43 +27719 +155 +31882 +9 +3484 +31293 +33494 +665 +31293 +40100 +1090 +1464 +40101 +27776 +40102 +25140 +40103 +4055 +40104 +37576 +11263 +40105 +15 +40106 +10946 +19 +40107 +40108 +5188 +40109 +1961 +40110 +38705 +17848 +491 +40111 +25245 +34 +21689 +40112 +1710 +590 +40113 +28317 +18684 +32317 +4820 +40114 +597 +40115 +9 +25140 +18684 +29483 +33010 +40116 +46 +40117 +32 +25316 +40118 +32642 +28441 +4055 +3546 +21947 +40119 +14007 +345 +14981 +3842 +10946 +40120 +484 +31098 +19 +29483 +40121 +590 +2410 +915 +365 +40122 +40123 +8186 +40124 +21947 +33627 +5188 +2577 +26027 +19918 +57 +22864 +2257 +25140 +24403 +32920 +1716 +40125 +16 +18045 +19 +411 +40126 +590 +27669 +1612 +736 +40127 +14330 +40128 +625 +40129 +40130 +14398 +2769 +1011 +1021 +989 +9 +31293 +36268 +25237 +1444 +7987 +40131 +3546 +40132 +30051 +331 +30224 +590 +14369 +10946 +38523 +25316 +40133 +19 +37556 +40134 +43 +40135 +31293 +37556 +9 +40136 +14604 +32 +25395 +868 +30144 +32532 +286 +40137 +13108 +15718 +1716 +40138 +31225 +40139 +2342 +28034 +40140 +40141 +33758 +36268 +18862 +2476 +9452 +3553 +40142 +484 +20 +40143 +40144 +36735 +4820 +30051 +39158 +40145 +2410 +31293 +11508 +1090 +18045 +40146 +19963 +33957 +533 +533 +40147 +40148 +40149 +14909 +40150 +36268 +23504 +989 +40151 +14562 +495 +9 +8367 +40152 +40153 +40154 +12936 +4055 +89 +24260 +38180 +1112 +29007 +213 +5014 +43 +20161 +40155 +415 +40156 +23103 +40157 +284 +19264 +18364 +16879 +40158 +40159 +11158 +1352 +25683 +40160 +40161 +1502 +14369 +26987 +40162 +40163 +40164 +2318 +40165 +19 +28317 +377 +284 +13663 +40166 +22963 +32 +40167 +40168 +40169 +40170 +8220 +21261 +10946 +40171 +37556 +845 +40172 +40173 +586 +40174 +1615 +1316 +40175 +43 +1208 +1961 +31293 +40176 +40177 +9 +28491 +40178 +33508 +590 +40179 +25316 +5071 +40180 +40181 +613 +14363 +4547 +1870 +248 +40182 +17799 +16327 +1531 +3601 +15598 +583 +21947 +284 +357 +40183 +40184 +30877 +40185 +720 +35551 +2264 +5780 +8029 +40186 +26361 +40187 +40188 +26496 +14369 +337 +40189 +6439 +40190 +40191 +31293 +337 +18354 +6225 +40192 +40193 +16731 +1799 +7516 +40194 +40195 +3546 +19 +14603 +14022 +26040 +31293 +4055 +40196 +19 +4026 +31168 +1951 +38465 +18684 +40197 +40198 +40199 +31293 +37556 +40200 +40201 +248 +379 +40202 +40203 +40204 +2281 +40205 +40206 +30877 +736 +2314 +40207 +43 +19 +40208 +40209 +1961 +40210 +201 +1082 +15718 +26361 +24862 +25140 +31293 +25965 +40211 +40212 +40213 +17698 +492 +33325 +40214 +554 +3421 +40215 +248 +40216 +845 +29209 +284 +28549 +10946 +286 +40217 +16063 +25943 +9 +17872 +282 +40218 +31293 +337 +20442 +822 +40219 +303 +1966 +29381 +40220 +13752 +27669 +5833 +114 +40221 +213 +40222 +40223 +554 +1300 +158 +20386 +40224 +17635 +40225 +40226 +17911 +155 +40227 +7835 +15 +2260 +34402 +34 +40228 +2804 +32 +40229 +40230 +4606 +2065 +12987 +40231 +40232 +36268 +303 +40233 +248 +40234 +40235 +43 +40236 +338 +7835 +19 +40237 +178 +40238 +40239 +40240 +13390 +40241 +40242 +12304 +40243 +3 +24864 +1364 +1889 +40244 +17603 +34584 +30224 +40245 +9573 +213 +9 +23103 +23925 +140 +31293 +40246 +4414 +40247 +40248 +590 +40249 +18300 +29945 +18807 +40250 +35992 +23166 +40251 +242 +15718 +34342 +3950 +40252 +40253 +21689 +4720 +29317 +19 +25943 +18744 +17 +38241 +568 +6364 +9573 +40254 +40255 +39983 +40256 +10318 +32714 +686 +40257 +5217 +1743 +248 +21417 +21947 +345 +36638 +5067 +40258 +40259 +40260 +1018 +165 +14369 +248 +40261 +29483 +1364 +37556 +40262 +484 +40263 +28494 +3553 +7658 +1502 +11762 +43 +40264 +40265 +40266 +9 +1696 +23103 +25683 +14477 +770 +40267 +31168 +40268 +1090 +40269 +19 +33061 +317 +1765 +590 +40270 +20442 +11522 +4 +14001 +13361 +284 +37556 +19 +16181 +31293 +40271 +21947 +40272 +26496 +14102 +8249 +33650 +677 +19 +40273 +25056 +548 +29483 +1542 +37808 +40274 +4827 +40275 +10880 +590 +40276 +25904 +40277 +37556 +15951 +40278 +37556 +1090 +671 +14369 +40279 +19618 +40280 +349 +40281 +1090 +40282 +40283 +40284 +40285 +9 +40286 +40287 +9 +40288 +4702 +40289 +10930 +40290 +16466 +3251 +40291 +6086 +40292 +14369 +14477 +712 +5409 +213 +213 +40293 +40294 +736 +19 +17151 +40295 +15914 +416 +140 +36639 +213 +40296 +38523 +40297 +377 +32332 +34641 +38042 +40298 +19354 +37556 +40086 +40299 +40300 +38523 +5344 +11664 +9 +24324 +705 +40301 +40302 +40303 +34319 +40304 +40305 +17269 +6060 +22922 +378 +21947 +6341 +17911 +40306 +15511 +40307 +176 +33627 +40308 +349 +1889 +13224 +40309 +40310 +40311 +2140 +446 +1090 +40277 +28745 +15880 +40312 +40313 +1090 +40314 +27069 +1382 +40315 +40316 +8501 +3239 +18369 +24207 +573 +40317 +1382 +1157 +21947 +10600 +40318 +21045 +19618 +37556 +40319 +31293 +643 +15718 +40320 +40321 +2314 +40322 +40323 +40324 +4055 +40325 +25140 +27719 +40326 +14369 +25904 +7053 +646 +28317 +28036 +40327 +40328 +40329 +40330 +7703 +24144 +40331 +37556 +209 +10946 +40332 +5409 +25996 +10791 +12287 +40333 +40334 +40335 +13390 +40336 +1870 +31293 +8392 +9 +29483 +3470 +12674 +2775 +16063 +137 +12989 +40337 +21269 +194 +15027 +40338 +19 +9 +15 +40339 +24303 +228 +1824 +40340 +39926 +40341 +37556 +1765 +13721 +31234 +10960 +38760 +3844 +40342 +15 +40343 +40344 +43 +1234 +40345 +40346 +176 +32 +11762 +1090 +16798 +19095 +576 +40347 +36736 +491 +15683 +7458 +12590 +40348 +18750 +39709 +1010 +34 +705 +29427 +27669 +40349 +11762 +9 +8780 +31293 +40350 +40351 +15718 +24421 +303 +29483 +40352 +586 +1563 +12987 +40353 +40354 +590 +15 +2383 +15 +4055 +40355 +40356 +8670 +19 +1444 +26708 +1090 +40357 +115 +40358 +35224 +21947 +40359 +20340 +40360 +12080 +1710 +1364 +19042 +29483 +1870 +40361 +590 +19797 +40362 +140 +40363 +30230 +25996 +40364 +40365 +14369 +9629 +40366 +40367 +40368 +38465 +15718 +40369 +317 +16472 +40370 +40371 +20984 +40372 +4278 +35244 +40373 +736 +3994 +36268 +176 +37556 +345 +3243 +40374 +373 +27669 +815 +11273 +590 +40375 +197 +31293 +37385 +30877 +40376 +39709 +9 +40377 +40378 +4055 +40379 +40380 +5188 +40381 +3 +6075 +40382 +2476 +14369 +14363 +30224 +416 +40383 +222 +40384 +910 +27669 +23103 +36736 +19 +19 +4055 +31168 +14025 +40385 +40386 +10 +40387 +1291 +18717 +21832 +28549 +40388 +20700 +40389 +19500 +14604 +39838 +8386 +40390 +2064 +36268 +28317 +4242 +14369 +5650 +40391 +40392 +7964 +40393 +20223 +40394 +43 +14947 +40395 +14079 +40396 +3055 +30051 +11762 +7516 +31679 +40397 +40398 +349 +15 +40399 +1332 +43 +40400 +37556 +40401 +26744 +28206 +40402 +40403 +21947 +566 +677 +40404 +5188 +38944 +2314 +34402 +19 +22 +40405 +37556 +21947 +2243 +20258 +29483 +9389 +13315 +11483 +40406 +40407 +40408 +40409 +66 +40410 +915 +40411 +16323 +14369 +21689 +5313 +39709 +1502 +30051 +2259 +1090 +21133 +40412 +790 +15 +40413 +4713 +5662 +40414 +2039 +1090 +1700 +40415 +12013 +39709 +12402 +40416 +8297 +5803 +2694 +3353 +1054 +2260 +43 +40417 +24303 +1680 +4 +40418 +1169 +30224 +1808 +40419 +40420 +352 +40421 +31346 +40422 +38523 +26157 +40423 +40424 +40425 +3 +164 +25316 +40426 +40427 +40428 +21947 +10 +40429 +1710 +40430 +77 +6095 +1677 +8249 +40431 +829 +1109 +20600 +40432 +17632 +40433 +30458 +29483 +4752 +40434 +40435 +590 +40436 +373 +30051 +3543 +40437 +40438 +349 +40439 +5188 +40440 +31293 +21947 +40441 +37556 +30224 +286 +590 +3546 +3976 +43 +20 +14369 +21947 +40442 +1090 +40443 +33758 +713 +1021 +30917 +3020 +7817 +9607 +25611 +11551 +40444 +40445 +40446 +46 +40447 +6123 +40448 +1090 +5119 +40449 +34402 +9 +40450 +40451 +34712 +19618 +2 +259 +14 +8867 +40452 +40453 +10004 +40454 +40455 +827 +1100 +40456 +19618 +15 +15718 +40457 +249 +40458 +40459 +40460 +21947 +40461 +89 +37556 +8513 +40462 +2038 +40463 +36735 +40464 +2315 +18045 +40465 +590 +40466 +3417 +3950 +28333 +40467 +1774 +40468 +40469 +40470 +34454 +40471 +40472 +21947 +40473 +40474 +823 +5582 +5085 +2 +4230 +40475 +7053 +30877 +98 +12821 +36761 +31293 +40298 +5773 +7053 +31293 +19 +34433 +40476 +24412 +40477 +40478 +40479 +31293 +1684 +13131 +40480 +1870 +270 +33120 +31718 +33650 +14604 +2043 +26779 +40481 +19 +7908 +40482 +22412 +40483 +822 +36279 +43 +28441 +33490 +21947 +40484 +345 +40485 +16978 +865 +40486 +1991 +40487 +1442 +40488 +40489 +18045 +286 +317 +30877 +40490 +27669 +5075 +11541 +39709 +21796 +40491 +40492 +40493 +24482 +590 +40494 +33138 +2619 +14369 +2593 +29179 +40495 +46 +15 +13874 +7521 +14914 +40496 +40497 +10946 +30081 +354 +40498 +7154 +32 +19 +17093 +27669 +40499 +30209 +5188 +40500 +19 +40501 +40502 +40503 +40504 +1716 +24864 +345 +19 +590 +40505 +40506 +540 +15718 +40507 +1907 +29956 +40508 +1566 +40509 +7095 +40510 +153 +38732 +40511 +29639 +140 +40512 +22990 +40513 +590 +40514 +40515 +40516 +29172 +25316 +32275 +43 +736 +14869 +40517 +14369 +40518 +40519 +40520 +7658 +13390 +40521 +40522 +40523 +36218 +6883 +40524 +28219 +40525 +15 +40526 +40527 +36268 +24896 +14020 +40528 +29483 +40529 +31541 +31168 +43 +21947 +29381 +40530 +5092 +2836 +1508 +24864 +23493 +15595 +26040 +2578 +9 +40531 +46 +40532 +40533 +40534 +12827 +37556 +915 +18982 +36683 +40535 +6123 +40536 +39983 +12479 +16437 +9 +31293 +40537 +40538 +3546 +4634 +89 +21947 +25140 +31041 +20 +40539 +40540 +37920 +40541 +2537 +40542 +40543 +30877 +29483 +33627 +1090 +1870 +1090 +40544 +40545 +31293 +14369 +40546 +4055 +345 +1090 +29483 +18310 +36268 +1385 +40547 +14369 +4634 +2 +4684 +25316 +60 +40548 +19 +20600 +40549 +1090 +40550 +40551 +40552 +4411 +40553 +40554 +40555 +115 +31098 +18394 +9 +40556 +4765 +43 +15476 +4028 +40557 +15451 +40558 +40559 +40560 +34402 +104 +4086 +40561 +5649 +30877 +24864 +1454 +342 +30051 +40562 +11822 +8110 +24144 +14369 +40563 +416 +15718 +29483 +36307 +8171 +9 +40564 +16466 +18695 +155 +155 +40565 +31293 +1013 +40566 +77 +28036 +2243 +20161 +5314 +40567 +40568 +2694 +37556 +15718 +3546 +19 +40569 +1384 +21947 +40570 +89 +30139 +40570 +30877 +15718 +3559 +31293 +533 +6275 +21947 +33061 +43 +40571 +736 +155 +14546 +30224 +536 +11822 +590 +491 +4634 +40572 +40573 +40574 +40575 +2779 +31906 +40576 +40577 +2514 +20 +31293 +4123 +16 +14369 +16375 +15718 +10727 +40578 +15474 +18310 +8249 +40579 +40580 +40581 +40582 +36218 +40583 +40584 +25943 +155 +40585 +40586 +269 +1021 +28549 +39980 +40587 +40588 +40589 +40590 +1517 +40591 +40592 +1090 +179 +17151 +317 +2882 +40593 +37556 +564 +40594 +57 +40595 +40596 +286 +40597 +14604 +40598 +21947 +15718 +22 +40599 +24953 +40600 +40601 +590 +40602 +1612 +40603 +33758 +12987 +14477 +11034 +40604 +4055 +40605 +11964 +1961 +9 +1745 +39927 +40606 +5007 +40607 +11402 +40608 +2577 +402 +14532 +5665 +21947 +14909 +27069 +40609 +9 +8280 +18176 +11315 +40610 +39036 +21947 +40611 +43 +33693 +27669 +37556 +40612 +3061 +36736 +40613 +28549 +40614 +40615 +40616 +40617 +10699 +11906 +40618 +13390 +17749 +40570 +40619 +40620 +31139 +40621 +40622 +1415 +40623 +40624 +14369 +14330 +12800 +40625 +40626 +14666 +19 +40627 +40628 +40629 +17340 +40630 +28036 +4745 +40631 +379 +14330 +2 +2593 +40632 +23401 +286 +115 +35665 +40633 +40634 +40635 +713 +40636 +37556 +19 +40570 +40637 +2158 +26387 +3287 +2260 +40638 +6304 +317 +30224 +15592 +40639 +37411 +566 +40640 +31293 +37556 +6616 +23591 +7830 +6335 +40641 +140 +14330 +11907 +13390 +3343 +7053 +16 +9 +33120 +32449 +21947 +155 +38465 +40642 +32603 +114 +29 +40643 +39998 +32 +8994 +35672 +24303 +40570 +590 +17031 +40644 +770 +317 +5188 +155 +533 +30877 +40645 +872 +40646 +40570 +40647 +40648 +40649 +24129 +40650 +590 +1383 +1072 +40651 +13390 +31225 +40652 +40653 +22537 +345 +7658 +19 +40654 +40655 +14369 +5704 +791 +40570 +2043 +40656 +237 +19 +40657 +17810 +40658 +40659 +40660 +38465 +40570 +40661 +40570 +40662 +25140 +19095 +31293 +1637 +20442 +40663 +14330 +33627 +40664 +40665 +27669 +32041 +13807 +40666 +21947 +28339 +4227 +1090 +1228 +31041 +39709 +21947 +40667 +484 +5791 +1300 +29639 +20442 +4055 +22496 +32253 +40668 +40570 +15096 +1867 +40669 +29204 +19 +40570 +40670 +9 +102 +915 +342 +40671 +14369 +40570 +40672 +31293 +35551 +40673 +232 +3546 +40674 +40675 +9 +12281 +40676 +25683 +13829 +27719 +286 +40677 +377 +354 +15718 +40678 +1513 +4441 +2988 +40679 +9 +491 +1674 +40680 +36683 +8297 +40681 +40570 +590 +40682 +29204 +9210 +40683 +827 +21031 +449 +40684 +21947 +1425 +2721 +28345 +2029 +40685 +5627 +36485 +40686 +10574 +179 +14887 +536 +4544 +2446 +21947 +40570 +2537 +5071 +9 +40687 +40688 +7418 +40689 +155 +915 +416 +40690 +40691 +26496 +40692 +60 +27669 +4634 +4230 +15718 +7553 +31516 +15718 +31364 +3546 +40693 +7904 +6048 +40694 +536 +21031 +39552 +22 +40695 +178 +30877 +21045 +40696 +590 +24421 +38667 +9 +5559 +14225 +33650 +25316 +9 +23103 +40697 +140 +40570 +15718 +4 +18394 +34107 +33120 +170 +40698 +40699 +1090 +60 +43 +22963 +37556 +31293 +19 +40700 +40701 +40702 +29628 +155 +40703 +19 +1090 +25316 +33120 +8668 +30051 +3553 +40704 +15 +15718 +155 +40705 +25316 +4963 +768 +37556 +22898 +29483 +40706 +4055 +40707 +16258 +5188 +9402 +40708 +40570 +40709 +34410 +40710 +586 +15 +19 +43 +43 +14330 +19 +35425 +9 +24303 +1011 +4518 +3406 +40711 +40712 +9 +40570 +40713 +40570 +828 +8244 +35318 +201 +31293 +10946 +12095 +40714 +15 +21031 +3296 +15718 +40715 +40716 +590 +176 +1012 +13390 +24303 +3546 +28316 +32438 +915 +40717 +15 +27069 +19 +19 +40718 +40719 +25237 +1508 +2315 +30224 +40570 +13390 +33650 +1710 +6070 +40720 +590 +13207 +25683 +24200 +40721 +30877 +39746 +31293 +18448 +39709 +20700 +40722 +40723 +43 +40724 +349 +9 +40725 +21947 +1716 +28441 +9 +40726 +155 +1385 +40727 +12397 +40728 +40729 +40730 +40731 +30877 +40732 +40733 +32616 +141 +43 +31098 +1011 +18553 +7208 +7516 +861 +519 +16375 +77 +15718 +2882 +89 +17151 +19 +416 +19 +40734 +15718 +16772 +18951 +40735 +19653 +2680 +15951 +40736 +188 +4055 +39983 +379 +155 +40737 +40738 +25316 +31293 +736 +37556 +3 +6364 +3546 +1047 +40739 +155 +155 +533 +1091 +25 +38117 +2537 +4055 +28317 +9573 +20914 +40740 +40741 +286 +33494 +590 +40570 +872 +40742 +25237 +40743 +37556 +40744 +1604 +21947 +8483 +40745 +16586 +1879 +40746 +15 +25140 +19 +29200 +40747 +725 +25316 +46 +19 +19 +24309 +815 +4055 +189 +36268 +40748 +25315 +40749 +40750 +40751 +28317 +9449 +40752 +40753 +26744 +26779 +1013 +1503 +2318 +1382 +38 +43 +40754 +20162 +39709 +40755 +29483 +40756 +40757 +40758 +12152 +2347 +36442 +29733 +358 +40759 +19 +3546 +21947 +7860 +10583 +15504 +40760 +34433 +40761 +40762 +209 +12832 +809 +14369 +34864 +10946 +155 +40763 +14363 +40764 +43 +1529 +1901 +6468 +14 +10946 +40765 +40766 +15 +24864 +33120 +40143 +9460 +9012 +16 +31293 +40570 +40767 +7379 +671 +14330 +193 +936 +15718 +17911 +40768 +822 +155 +31293 +40769 +32438 +24811 +40770 +40771 +40772 +17385 +40773 +40774 +40775 +5808 +40776 +27669 +31293 +40777 +613 +286 +40778 +20340 +40779 +22141 +40780 +40781 +40570 +40782 +40570 +8813 +10 +33113 +15970 +36268 +1107 +26199 +40783 +15718 +27669 +40784 +43 +15220 +31375 +43 +12434 +155 +28036 +24192 +40785 +1571 +40570 +705 +6732 +14369 +457 +4055 +712 +40570 +155 +40786 +3839 +36638 +3119 +1529 +32 +37476 +8569 +76 +40787 +590 +9 +25943 +958 +7786 +5773 +1604 +7123 +30877 +31293 +37556 +40788 +40789 +21947 +29200 +20757 +736 +40790 +19852 +28441 +40791 +40792 +9 +37556 +34602 +138 +13390 +40793 +40794 +40795 +30877 +40796 +19 +21947 +40797 +40798 +40799 +40800 +40801 +31293 +32 +7564 +40802 +1090 +1382 +29200 +40803 +33445 +14330 +1656 +9894 +40804 +30307 +1508 +40570 +357 +40805 +31852 +7276 +31168 +30877 +40806 +9941 +40807 +14369 +1251 +4055 +14240 +40808 +40570 +16437 +21947 +40809 +21947 +40810 +40811 +7260 +12534 +15384 +2006 +15411 +40812 +3978 +16535 +14369 +40813 +40814 +40815 +19 +18577 +8392 +40816 +19318 +29381 +40817 +970 +30877 +40818 +16437 +16 +40819 +40820 +9 +24303 +31293 +37556 +40570 +43 +40821 +590 +40822 +12800 +9 +40823 +9 +2577 +286 +21796 +31293 +345 +24339 +40824 +40825 +301 +861 +32299 +40570 +40826 +2372 +15718 +5188 +40827 +5629 +155 +40828 +40829 +3976 +40830 +4 +721 +25281 +29 +40417 +1961 +30846 +8967 +1961 +19618 +40591 +40831 +590 +40832 +17 +40833 +40834 +19618 +40835 +40836 +40837 +40838 +40839 +323 +24864 +8846 +17911 +40840 +43 +10662 +40841 +40842 +40843 +21947 +590 +40844 +3351 +40845 +40846 +18811 +35224 +286 +36268 +37920 +317 +5119 +40847 +40848 +19095 +40849 +9934 +4115 +31293 +30877 +14102 +40850 +38944 +40851 +40852 +40853 +40854 +37556 +40855 +18744 +26496 +40856 +43 +40857 +17872 +40858 +7860 +40859 +827 +538 +286 +19 +104 +40860 +595 +155 +89 +155 +40861 +5344 +2540 +25164 +249 +19 +40862 +40863 +35692 +40864 +36483 +352 +2694 +16571 +19 +1272 +40865 +21629 +40866 +40867 +16017 +40868 +9 +40869 +1385 +31293 +155 +1090 +17911 +30877 +25316 +5448 +155 +29639 +17635 +40870 +13390 +40871 +554 +915 +2694 +1710 +40872 +15 +694 +40873 +17385 +31293 +7835 +40874 +3061 +30917 +30877 +14369 +40875 +36858 +40570 +40876 +1090 +33627 +4263 +2561 +1847 +155 +40877 +40878 +15 +40570 +15 +6627 +3601 +19 +40879 +40880 +25871 +40570 +15572 +32896 +165 +40881 +19618 +40882 +2635 +5662 +155 +40883 +40884 +30650 +40885 +2865 +540 +855 +178 +40570 +27669 +40886 +27069 +40887 +1790 +40888 +89 +40889 +40890 +31293 +26744 +19 +1681 +40891 +33061 +30877 +33116 +46 +40892 +872 +9 +40893 +155 +31293 +40894 +40895 +17810 +40896 +14369 +33120 +446 +38465 +892 +8668 +40897 +40898 +197 +27447 +40899 +40900 +28036 +10946 +19 +448 +104 +21657 +40901 +40902 +39563 +40903 +155 +40904 +29483 +25943 +4550 +40339 +40905 +40906 +4075 +2694 +40907 +36928 +40908 +40570 +155 +9 +20514 +1224 +590 +39344 +40909 +40910 +40911 +19618 +40912 +30542 +33469 +28295 +28549 +21027 +35656 +11697 +40913 +40914 +2022 +19 +40915 +53 +40916 +286 +40570 +40917 +15718 +16437 +18473 +5601 +43 +13905 +399 +31995 +13807 +40918 +491 +18300 +2694 +40919 +40920 +9 +40921 +40922 +40923 +12987 +536 +21259 +33627 +20443 +40924 +30051 +17730 +301 +40925 +31225 +13307 +19 +40926 +1536 +27861 +40570 +317 +19 +14369 +820 +2254 +40927 +40928 +40929 +6595 +155 +40930 +40931 +40932 +20560 +736 +1115 +155 +40933 +284 +40934 +40935 +31293 +1907 +2195 +40936 +40937 +337 +40938 +1157 +140 +14001 +8483 +40570 +40939 +40940 +18516 +15718 +22673 +24303 +40941 +31293 +7585 +31293 +40942 +303 +1013 +270 +354 +155 +40943 +27669 +40944 +40945 +40946 +40947 +10841 +40948 +2877 +6505 +2015 +40949 +40950 +284 +40951 +12696 +43 +155 +40952 +40953 +3 +40954 +40955 +40956 +3976 +40957 +8560 +303 +14477 +5700 +14330 +40958 +40959 +15364 +40960 +10847 +40961 +28441 +597 +342 +213 +40962 +1710 +823 +37556 +40963 +6294 +1765 +40964 +201 +40965 +40966 +3601 +9 +40967 +19 +34488 +17 +40968 +14369 +40969 +40970 +40971 +590 +29381 +6095 +40972 +2314 +4414 +37556 +40973 +40974 +1787 +6728 +40975 +822 +10946 +303 +40976 +40977 +40570 +25237 +31293 +19655 +39709 +5399 +40978 +22 +40979 +40980 +33758 +40981 +8297 +5188 +40570 +40982 +40983 +3601 +613 +248 +3171 +25140 +40984 +736 +303 +213 +40985 +103 +6341 +3826 +40986 +736 +19 +23103 +40570 +40987 +40988 +40989 +1082 +40990 +40570 +26452 +12005 +14369 +40991 +9 +40992 +1469 +40993 +40994 +40995 +209 +40996 +40997 +40998 +19 +40570 +6468 +11321 +415 +228 +281 +66 +155 +40999 +17385 +41000 +13474 +39709 +41001 +1090 +6054 +30877 +9988 +33758 +41002 +1090 +41003 +9 +40570 +31873 +21947 +41004 +41005 +41006 +209 +66 +22 +751 +31293 +337 +41007 +2234 +31293 +29483 +41008 +39709 +2372 +30224 +21947 +701 +22963 +57 +345 +25871 +6316 +41009 +33650 +30224 +41010 +41011 +41012 +4317 +345 +21729 +28317 +40570 +34402 +28549 +41013 +21089 +41014 +533 +286 +4055 +41015 +28317 +41016 +41017 +41018 +15 +41019 +41020 +13390 +41021 +2998 +323 +590 +1222 +17151 +3546 +15718 +41022 +554 +41023 +185 +19 +37556 +14477 +137 +41024 +7855 +41025 +1291 +41026 +6054 +958 +21947 +155 +31293 +41027 +31293 +809 +41028 +27669 +225 +140 +8297 +3546 +209 +40570 +41029 +337 +155 +41030 +41031 +3182 +399 +736 +25868 +2471 +9 +41032 +41033 +5188 +249 +41034 +41035 +41036 +41037 +4425 +41038 +24725 +39536 +491 +28629 +8367 +1090 +15718 +14369 +1710 +1013 +10230 +41039 +1867 +5791 +4518 +41040 +41041 +19 +14369 +41042 +26127 +19 +28490 +20442 +24864 +248 +41043 +41044 +41045 +14477 +41046 +36735 +41047 +3546 +16798 +8668 +41048 +2728 +14477 +41049 +40570 +5085 +41050 +41051 +57 +15718 +76 +590 +40570 +904 +40394 +19 +41052 +41053 +38536 +29483 +41054 +41055 +19 +1208 +41056 +41057 +21776 +41058 +40570 +19 +19 +41059 +2686 +41060 +21947 +41061 +590 +19109 +41062 +33627 +1090 +29251 +41063 +41064 +13675 +9 +40570 +155 +41065 +15718 +10946 +8282 +26355 +31168 +24896 +2550 +36483 +1112 +14216 +38003 +12800 +248 +41066 +41067 +41068 +41069 +40570 +41070 +13390 +41071 +43 +3317 +41072 +33650 +15914 +41073 +11522 +40570 +14001 +41074 +15102 +2038 +1090 +30458 +99 +18418 +303 +31293 +41075 +29483 +41076 +5297 +41077 +21947 +590 +41078 +41079 +41080 +694 +6306 +9440 +842 +41081 +33496 +4518 +2830 +31293 +41082 +1047 +2728 +13528 +41083 +41084 +337 +11192 +265 +18569 +284 +31661 +31293 +40570 +32897 +41085 +19 +1090 +33693 +2577 +6006 +4637 +34402 +28317 +39250 +41086 +25382 +41087 +36946 +9 +43 +36268 +213 +15718 +590 +21947 +41088 +669 +1716 +21269 +1090 +648 +248 +112 +15718 +1456 +25316 +17691 +1969 +41089 +104 +18283 +37556 +301 +9 +2064 +1386 +2254 +4502 +40570 +38760 +41090 +10 +41091 +164 +35870 +21131 +41092 +3553 +41093 +30209 +41094 +43 +11 +3417 +39709 +24896 +352 +32856 +40570 +736 +6893 +18631 +19 +31293 +37556 +41095 +7276 +30814 +19 +60 +590 +41096 +41097 +345 +41098 +155 +9 +9 +9 +15 +7658 +41099 +20223 +41100 +8763 +1234 +41101 +29483 +41102 +20413 +213 +12067 +41103 +13143 +2833 +28237 +41104 +41105 +6341 +9713 +6287 +1961 +265 +13390 +41106 +40570 +9 +41107 +32087 +89 +41108 +770 +590 +41109 +41110 +41111 +8772 +77 +41112 +31293 +4463 +41113 +16772 +23103 +31293 +28490 +41114 +38760 +28035 +43 +21669 +8961 +33650 +213 +41115 +213 +41116 +19 +36076 +5410 +13390 +41117 +14369 +15718 +155 +20280 +590 +37556 +41118 +8668 +41119 +14330 +39709 +37556 +41120 +41121 +25584 +40570 +41122 +4055 +495 +41123 +32 +28490 +24864 +41124 +11824 +412 +41125 +33141 +89 +41126 +38687 +33650 +25859 +13721 +41127 +137 +41128 +37556 +33650 +1870 +16826 +2410 +41129 +2314 +24725 +41130 +9 +590 +2917 +43 +17687 +41131 +41132 +9 +41133 +1615 +31293 +1208 +21027 +21947 +137 +7516 +40570 +284 +213 +337 +41134 +41135 +41136 +337 +1716 +41137 +20445 +31293 +19 +33627 +40570 +1514 +21947 +30877 +17602 +301 +491 +41138 +13045 +32871 +17382 +201 +3601 +41139 +31575 +41140 +41141 +30877 +40570 +13721 +303 +20774 +41142 +29483 +21262 +26416 +39709 +32871 +248 +31249 +284 +41143 +41144 +9 +9 +41145 +3546 +19405 +16437 +41146 +43 +41147 +4055 +286 +590 +4116 +15718 +140 +16437 +41148 +1823 +337 +41149 +41150 +34752 +41151 +41152 +337 +213 +1228 +41153 +41154 +9 +40029 +41155 +21729 +41156 +29153 +613 +40472 +41157 +1090 +213 +248 +15655 +5025 +915 +41158 +7516 +36268 +123 +41159 +9 +40570 +15498 +41160 +14330 +31293 +284 +41161 +9 +41162 +41163 +20555 +10946 +41164 +10946 +41165 +38595 +9 +38760 +9 +31703 +15718 +12987 +20 +41166 +17042 +14534 +15718 +22337 +18258 +3790 +590 +31098 +40483 +31383 +38465 +31189 +41167 +40570 +568 +9 +41168 +19 +37556 +6518 +1090 +11801 +41169 +41170 +671 +41171 +41172 +41173 +41174 +112 +41175 +14330 +37556 +10601 +8210 +18145 +36452 +20 +19 +19 +41176 +1531 +37211 +40570 +33278 +1330 +29483 +1224 +41177 +1529 +155 +248 +40570 +27669 +41178 +15718 +38421 +41179 +3030 +14330 +41180 +5415 +37556 +228 +155 +15718 +1766 +41181 +15718 +27619 +29381 +37920 +41182 +30580 +1010 +46 +19 +176 +213 +37556 +40712 +155 +17144 +30877 +8717 +2 +23322 +5204 +40570 +27178 +4055 +31293 +11087 +1186 +8297 +25316 +41183 +25237 +9410 +19095 +1047 +19 +43 +40570 +411 +33863 +41184 +41185 +24864 +17151 +33624 +317 +41186 +41187 +19 +41188 +30877 +9 +27954 +29483 +41189 +77 +5071 +16466 +40570 +41190 +33627 +5409 +29381 +533 +16798 +41191 +41192 +41193 +286 +43 +40570 +43 +30291 +41194 +41195 +39709 +14369 +20 +416 +2410 +31293 +3597 +8210 +317 +57 +30650 +1502 +36268 +155 +40570 +26022 +27669 +24725 +24864 +40570 +37556 +41196 +11010 +1716 +28745 +33650 +24303 +36268 +15718 +17144 +13390 +41197 +155 +6950 +24045 +303 +41198 +41199 +141 +2410 +1870 +1090 +41200 +665 +164 +15718 +2121 +41201 +5080 +16539 +33650 +40570 +41202 +10659 +4026 +1090 +31293 +12800 +36735 +34402 +33061 +41203 +41204 +24300 +41205 +2476 +3978 +345 +41206 +30224 +8668 +7516 +21689 +11620 +14477 +41207 +533 +41208 +2764 +41209 +155 +41210 +41211 +27669 +4627 +14477 +41212 +41213 +35883 +8670 +10356 +39709 +3100 +41214 +31603 +24864 +5169 +31293 +14693 +21947 +30877 +9 +14477 +41215 +21947 +41216 +41217 +736 +554 +32 +41218 +41219 +41220 +41221 +209 +15718 +41222 +40591 +32022 +41223 +1090 +9 +6468 +40570 +26043 +19 +19 +18310 +41224 +33627 +21791 +36268 +19 +19 +284 +23150 +590 +2061 +37556 +40570 +25 +1157 +43 +12788 +1244 +41225 +21791 +36492 +345 +26040 +1559 +41226 +41227 +41228 +142 +440 +41229 +41230 +33445 +21791 +41231 +3732 +31293 +41232 +27669 +398 +33120 +3546 +21968 +41233 +17872 +893 +176 +38760 +590 +6038 +41234 +7324 +41235 +37556 +31293 +14017 +13721 +29172 +41236 +10946 +30224 +41237 +21089 +89 +2493 +19792 +40591 +5577 +349 +41238 +41239 +41240 +41241 +34 +9410 +1295 +31995 +6496 +41242 +41243 +41244 +31293 +1795 +31293 +33758 +37556 +31293 +21698 +12404 +15645 +43 +19 +41245 +25164 +36268 +41246 +5085 +2591 +5188 +41247 +9 +41248 +155 +41249 +38760 +155 +17937 +22 +41250 +32 +38893 +41251 +2 +41252 +15 +42 +17872 +57 +3958 +36268 +9 +41253 +989 +41254 +1090 +41255 +303 +791 +41256 +18045 +4722 +22468 +12582 +2577 +41257 +17911 +25316 +41258 +15718 +41259 +40570 +41260 +12959 +8668 +34242 +3553 +185 +887 +24324 +41261 +155 +41262 +37556 +822 +40570 +41263 +40591 +41264 +5065 +5130 +40861 +43 +41265 +13390 +3375 +41266 +19 +41267 +41268 +24303 +413 +9558 +41269 +25237 +1107 +11026 +3814 +40570 +29483 +1090 +40570 +2264 +20247 +1051 +19109 +201 +21947 +41270 +23103 +41271 +21947 +29381 +41272 +9 +40570 +7053 +39 +28317 +15718 +41273 +7852 +28490 +43 +671 +41274 +29200 +41275 +41276 +41277 +19 +41278 +115 +41279 +33330 +34402 +30650 +40570 +41280 +14510 +155 +478 +2410 +41281 +41282 +41283 +478 +1169 +24864 +345 +18233 +31995 +1224 +46 +41284 +41285 +40570 +1224 +31293 +32410 +41286 +43 +41287 +41288 +43 +41289 +41290 +5071 +25140 +19 +46 +41291 +41292 +17151 +30551 +2136 +13390 +1374 +39 +29620 +6038 +41293 +16258 +13390 +37556 +41294 +41295 +26027 +41296 +19 +41297 +9 +41298 +31691 +41299 +16640 +17174 +15148 +1513 +41300 +21947 +43 +43 +3008 +41301 +179 +41302 +41303 +41304 +209 +19 +323 +40591 +201 +14330 +4053 +19852 +37556 +33818 +21947 +3546 +41305 +41306 +41307 +41308 +5188 +7419 +33038 +32 +14330 +41309 +21947 +41310 +41311 +15 +41312 +41313 +10846 +27522 +27117 +41314 +6115 +25316 +1090 +14330 +41315 +40570 +15797 +6499 +41316 +6935 +6571 +19 +1870 +41317 +41318 +6011 +19 +37202 +36218 +41319 +27669 +1688 +14102 +1863 +41320 +41321 +1251 +38760 +15718 +41322 +30877 +21947 +17508 +57 +165 +155 +16790 +736 +1912 +31873 +614 +41323 +9 +29628 +4028 +14001 +205 +29434 +41324 +1763 +38315 +1013 +40570 +18956 +4441 +41325 +4151 +21947 +20161 +155 +41326 +26361 +1116 +41327 +989 +15810 +10 +30877 +41328 +8424 +19 +9 +345 +15 +41329 +18208 +14369 +39709 +17151 +33650 +541 +2356 +2446 +36683 +22552 +41330 +14001 +2060 +411 +41331 +23150 +32449 +33061 +20785 +1244 +41332 +41333 +41334 +41335 +41336 +41337 +1208 +41338 +41339 +862 +41340 +201 +41341 +915 +19 +18045 +12987 +29381 +31293 +41342 +37556 +7014 +26470 +33120 +41343 +155 +41344 +41345 +3546 +958 +1018 +2121 +10418 +155 +41346 +43 +1529 +41347 +66 +155 +33650 +41348 +41349 +29483 +30794 +8304 +18045 +8845 +514 +25316 +25996 +345 +25528 +40570 +41350 +17911 +31293 +41351 +41352 +33123 +41353 +14962 +19 +10265 +21269 +41354 +10482 +41355 +43 +41356 +3601 +41357 +40570 +41358 +1154 +41359 +5204 +24303 +36054 +18683 +29981 +6441 +41360 +1870 +13721 +13290 +33693 +648 +41361 +33786 +11158 +41362 +9 +24862 +15 +41363 +14477 +37556 +41364 +31293 +583 +23727 +41365 +13390 +16375 +1956 +1090 +41366 +10 +7835 +41367 +31293 +823 +30877 +34283 +41368 +33141 +2287 +2828 +41369 +3067 +13390 +41370 +155 +31293 +41371 +41372 +872 +790 +41373 +4055 +15541 +41374 +41375 +5438 +40570 +41376 +4808 +29815 +1716 +377 +28961 +416 +41377 +41378 +33627 +155 +1520 +21689 +30051 +35339 +349 +10727 +19618 +4053 +29483 +1307 +41379 +2764 +36736 +1502 +155 +495 +41380 +23226 +41381 +41382 +5075 +41383 +22355 +37556 +41384 +41385 +41386 +41387 +41388 +1444 +7835 +15718 +27669 +41389 +3981 +41390 +41391 +41392 +155 +24725 +41393 +21947 +4028 +41394 +155 +7183 +25316 +41395 +41396 +590 +43 +6341 +41397 +5627 +32275 +1090 +41398 +25 +21947 +41399 +40570 +15718 +17911 +30224 +2260 +41400 +5326 +6284 +15718 +15 +31293 +41401 +341 +14369 +30877 +41402 +41403 +41404 +37556 +123 +29483 +17356 +9 +41405 +31422 +41406 +1812 +41407 +595 +2015 +25316 +178 +37556 +554 +4055 +14369 +415 +349 +17982 +861 +41408 +15718 +9 +14604 +41409 +20941 +33650 +30877 +41410 +1224 +37573 +41411 +41412 +40570 +40570 +37556 +30877 +14 +41413 +29200 +720 +33120 +13390 +20329 +19 +41414 +5659 +590 +14330 +41415 +40570 +1536 +19 +2101 +1172 +12800 +345 +270 +41416 +21947 +4028 +41417 +2043 +8188 +14330 +936 +9 +18683 +13390 +17277 +15914 +41418 +590 +41419 +28194 +33436 +7521 +33627 +2197 +1364 +41420 +6728 +41421 +40877 +43 +1160 +15768 +823 +31293 +1668 +41422 +41423 +40570 +707 +24811 +31293 +352 +286 +6341 +7413 +29483 +849 +41424 +554 +41425 +36735 +41426 +20 +19 +9410 +41427 +32386 +41428 +41429 +3598 +25237 +19 +15342 +36268 +41430 +1992 +41431 +5629 +19 +17911 +14000 +41432 +41433 +41434 +41435 +5790 +34517 +345 +41436 +40570 +41437 +43 +915 +3546 +33438 +19 +41438 +19618 +41439 +41440 +2121 +176 +17911 +13390 +40570 +9 +250 +41441 +37990 +41442 +40570 +590 +40570 +2859 +345 +39783 +6627 +41443 +41444 +41445 +643 +201 +27669 +29716 +2694 +43 +41446 +495 +21947 +12479 +43 +18045 +1765 +1228 +41447 +21027 +176 +1870 +1578 +41448 +286 +41449 +29483 +37556 +21947 +137 +514 +13740 +19406 +1905 +43 +842 +41450 +41451 +464 +169 +19 +29483 +397 +41452 +40570 +8772 +10115 +1082 +31293 +5908 +7835 +41117 +37556 +8545 +35788 +3950 +41453 +41454 +41455 +41456 +33693 +28036 +41457 +34165 +41458 +41459 +20700 +41460 +40591 +41461 +41462 +272 +41463 +14660 +21776 +14477 +41464 +41465 +15718 +14330 +41466 +41467 +41468 +41469 +2410 +671 +1051 +41470 +41471 +38275 +416 +41472 +41473 +41474 +41475 +32410 +412 +41476 +11763 +4821 +41477 +25140 +34710 +30051 +31293 +665 +554 +41478 +284 +4293 +43 +29483 +240 +37556 +1765 +41479 +1710 +25316 +41480 +41481 +16437 +41482 +57 +10642 +19634 +41483 +33508 +41484 +37556 +34752 +40570 +1920 +1513 +370 +21947 +115 +41485 +30877 +41486 +41487 +41488 +41489 +89 +4055 +24303 +41490 +40570 +14330 +24864 +37139 +1987 +4461 +41491 +40570 +15 +31019 +41492 +46 +317 +249 +14369 +41493 +41494 +26361 +41495 +10028 +41496 +38374 +14369 +377 +8297 +13905 +5252 +19168 +22507 +14363 +286 +21947 +41497 +11176 +23150 +37556 +41498 +10984 +4824 +24303 +41499 +41500 +41501 +19 +10946 +41502 +41503 +41504 +41505 +12976 +41506 +41507 +11459 +9 +278 +41508 +19 +41509 +40570 +115 +41510 +24725 +1559 +13390 +39593 +41511 +40570 +1090 +19618 +41512 +41513 +155 +317 +1045 +41514 +6571 +9 +590 +41515 +8946 +4631 +41516 +28208 +28755 +77 +27719 +31639 +21947 +36282 +32 +41517 +6294 +40570 +41518 +15718 +40570 +6086 +28317 +3546 +14369 +6214 +590 +5629 +4518 +41519 +14477 +1090 +14477 +25943 +41520 +15439 +26361 +1131 +31293 +41521 +8392 +11754 +41522 +8053 +37556 +6038 +10946 +35107 +1765 +41523 +9 +96 +2859 +286 +26496 +5085 +41524 +827 +7053 +27669 +14 +41525 +19655 +41526 +178 +1369 +11362 +13528 +1300 +41527 +9 +28935 +7697 +30224 +3964 +6015 +34402 +41528 +24144 +21947 +6010 +1090 +41529 +12995 +286 +41530 +41531 +5071 +2649 +8188 +41532 +41533 +12479 +41534 +38760 +1978 +6499 +30051 +2038 +41535 +29483 +38760 +43 +41536 +22901 +41537 +41538 +14369 +31293 +41539 +33128 +36735 +11321 +33650 +16466 +41540 +41541 +13207 +39709 +41542 +2561 +613 +40570 +189 +41543 +41544 +34804 +41545 +2308 +67 +40570 +32332 +23303 +40570 +41546 +29483 +31293 +188 +37556 +4364 +25402 +41547 +32563 +36054 +21947 +4502 +17901 +19618 +36253 +21947 +5923 +4461 +24864 +29275 +41548 +491 +1090 +6869 +9 +35784 +910 +572 +665 +41549 +5085 +1090 +41550 +41551 +41552 +33627 +155 +1425 +32 +41553 +41554 +590 +2577 +41555 +26277 +19 +1604 +40570 +29200 +41556 +201 +28845 +11428 +41557 +41558 +25237 +40570 +36 +36268 +38760 +19318 +9 +2537 +29032 +9 +41559 +1374 +598 +770 +41560 +41561 +41562 +43 +28845 +41563 +2577 +7835 +33650 +41564 +16102 +155 +30051 +971 +41565 +35120 +41566 +415 +14369 +9 +16124 +40570 +13765 +14477 +25683 +38760 +41567 +165 +41568 +13390 +14527 +119 +41569 +5650 +24154 +4364 +41570 +4677 +9 +115 +41571 +19 +832 +4461 +677 +40472 +790 +31293 +22 +2841 +1606 +19 +29204 +209 +41572 +25237 +28845 +41573 +155 +23343 +29244 +30650 +2064 +19 +1875 +12722 +32 +41574 +41575 +27669 +28845 +415 +849 +14330 +958 +1991 +34650 +3330 +5803 +155 +12987 +25237 +41576 +41577 +41578 +41579 +24864 +8351 +15718 +30051 +41580 +39536 +411 +2610 +3553 +18896 +28672 +41581 +24144 +41582 +40570 +27669 +41583 +41584 +1090 +30056 +209 +36268 +21713 +41585 +41586 +18077 +28295 +4760 +7835 +34160 +27615 +20700 +41587 +18815 +41588 +41589 +1364 +4124 +41590 +10 +13721 +41591 +5204 +9 +99 +786 +41592 +5085 +41593 +41594 +31293 +41595 +25140 +41596 +9 +4055 +41597 +41598 +4388 +29967 +17151 +33758 +14420 +40570 +34351 +10 +15 +40570 +41599 +40570 +41600 +2811 +40570 +17345 +41601 +104 +28317 +5791 +317 +40570 +41602 +15718 +41603 +39211 +31257 +713 +28317 +41604 +41605 +196 +33650 +2308 +38653 +21669 +4075 +38465 +15471 +41606 +28036 +26158 +32538 +41607 +41608 +32885 +9543 +495 +29951 +41609 +41610 +8367 +41611 +1018 +41612 +21947 +2314 +41613 +155 +41614 +32 +41615 +155 +41616 +41617 +37411 +36736 +3480 +41618 +37556 +19 +41619 +19 +29483 +7253 +25943 +34047 +41620 +13959 +79 +41621 +16178 +22735 +3842 +2700 +20339 +19618 +41622 +41623 +31824 +41624 +41625 +30551 +24460 +40570 +26142 +19 +377 +9913 +4821 +37556 +41626 +1224 +14369 +41627 +28845 +3509 +15718 +13390 +15989 +41628 +19618 +736 +41629 +41630 +17281 +2832 +30051 +41631 +7516 +13943 +2764 +41632 +1517 +28845 +3842 +31293 +41633 +41634 +41635 +41636 +41637 +41638 +17385 +1562 +41639 +41640 +41641 +19 +20518 +41642 +31603 +28845 +16371 +43 +13578 +41643 +41644 +41645 +24666 +14369 +41646 +13390 +41647 +14369 +5737 +19 +2560 +30191 +10470 +41648 +41649 +26724 +43 +41650 +32019 +40570 +20974 +9 +41651 +41652 +28251 +39111 +38465 +41653 +6595 +30051 +77 +41654 +28317 +1502 +37588 +30589 +40176 +41655 +41656 +41657 +3964 +21947 +41658 +155 +590 +1860 +40570 +43 +41659 +41660 +155 +41661 +43 +17698 +25316 +41662 +586 +2694 +41663 +29483 +40570 +3417 +41664 +1090 +41665 +41666 +32455 +27669 +41667 +24864 +19 +41668 +1688 +16443 +179 +41669 +41670 +12987 +21947 +379 +179 +7977 +2 +41671 +40570 +11702 +484 +2314 +1090 +16102 +5085 +34408 +41672 +41673 +25943 +12907 +33627 +41674 +5803 +41675 +40911 +9 +590 +30051 +4055 +16443 +28845 +286 +21030 +2577 +1863 +41676 +41677 +9400 +41678 +41679 +41680 +8338 +41681 +1172 +19 +41682 +590 +25943 +41683 +15718 +31293 +21947 +31293 +30877 +7835 +590 +2314 +736 +27954 +38419 +16826 +2040 +155 +6928 +415 +155 +37476 +5085 +745 +37808 +25316 +6261 +34402 +1536 +9 +32 +41684 +40570 +13801 +29483 +13283 +4028 +41685 +22815 +3528 +41686 +5075 +30224 +41687 +13390 +9 +40841 +5908 +41688 +155 +27669 +32275 +41689 +43 +40570 +41690 +41691 +41692 +41693 +31293 +828 +31293 +15718 +284 +40570 +317 +41694 +36594 +35497 +37556 +3546 +21947 +38667 +18045 +7658 +26641 +41695 +41696 +7835 +41681 +41697 +41698 +41699 +41700 +7835 +209 +19494 +2254 +19 +31293 +40570 +303 +41701 +16437 +41702 +2971 +6305 +303 +1870 +19 +17670 +41703 +28845 +4803 +40570 +9548 +41704 +43 +29483 +41705 +31293 +43 +491 +37808 +13848 +41706 +9 +248 +38033 +41707 +484 +41708 +41709 +41710 +20700 +41711 +33120 +15718 +40570 +41712 +41713 +337 +41714 +2061 +6952 +16437 +29597 +345 +57 +30974 +41715 +40570 +4 +41716 +9 +1100 +41717 +41718 +41719 +41720 +790 +736 +41721 +41722 +41723 +23487 +9 +4001 +40226 +590 +33709 +41724 +41725 +4055 +1262 +40570 +14604 +23277 +41726 +7379 +41727 +25 +41728 +41729 +915 +32953 +25237 +3546 +41687 +41730 +1765 +41731 +41732 +35613 +2040 +41733 +41734 +250 +4028 +915 +41735 +41736 +1090 +352 +99 +33758 +40067 +22587 +33627 +41737 +41738 +41739 +41740 +8994 +31225 +37556 +41741 +7835 +14477 +15514 +21947 +19 +590 +41742 +2117 +19618 +15906 +19 +41743 +41744 +41745 +4761 +349 +41746 +484 +41747 +17386 +873 +2733 +41748 +14947 +29956 +533 +165 +16102 +41749 +415 +41750 +20 +41751 +41752 +41753 +29628 +15718 +41754 +43 +16798 +6612 +20 +41755 +36686 +6935 +1223 +28929 +11601 +3994 +41756 +5601 +37556 +495 +41757 +12869 +41758 +1112 +1444 +645 +12013 +41759 +41760 +41761 +20442 +41762 +13721 +40570 +41763 +21276 +25129 +303 +41764 +41765 +38760 +41766 +8367 +613 +817 +33726 +43 +24332 +40570 +41767 +1011 +21398 +41695 +40570 +33627 +33758 +19792 +41768 +7123 +41769 +41770 +41771 +5409 +21941 +41772 +41773 +28194 +30051 +41774 +22 +41775 +43 +40570 +765 +1018 +590 +284 +349 +41776 +21669 +41777 +213 +19 +41778 +2029 +4364 +41779 +41780 +14448 +41781 +41782 +41783 +41784 +41785 +24896 +179 +286 +313 +41786 +30650 +6744 +1870 +41787 +41788 +1536 +29591 +12055 +13570 +31041 +24045 +41789 +40570 +41790 +337 +16413 +41791 +38944 +41792 +24864 +41793 +38760 +8110 +34936 +41794 +41795 +19 +437 +37556 +43 +1262 +14330 +155 +15718 +19057 +41796 +616 +31293 +1481 +41797 +11966 +41798 +41799 +412 +18919 +713 +11940 +17412 +16140 +4502 +19237 +323 +4441 +41800 +225 +41801 +3330 +3353 +31073 +41802 +155 +827 +14477 +25237 +8668 +41803 +41804 +533 +41805 +33650 +19618 +8668 +29007 +41806 +282 +41807 +19618 +41808 +18242 +39346 +24864 +40570 +707 +377 +41809 +533 +21947 +1961 +872 +284 +1090 +201 +41810 +41811 +41812 +590 +41813 +15942 +41814 +41815 +41816 +19 +41817 +21947 +41818 +32909 +41819 +41820 +5409 +5916 +31293 +713 +4055 +28845 +34402 +9 +41821 +41822 +1812 +36735 +21947 +41823 +37556 +31293 +32150 +30917 +28845 +29204 +41824 +1090 +13131 +41825 +33141 +155 +23103 +77 +41826 +40570 +37920 +35316 +37556 +41827 +41828 +41829 +24896 +27669 +269 +41830 +736 +155 +40570 +14369 +6275 +34402 +927 +41831 +41832 +41833 +5650 +41834 +28317 +41835 +29483 +40570 +41836 +15320 +4855 +910 +41837 +286 +41838 +2187 +41839 +41840 +28234 +989 +41841 +10736 +41842 +6171 +179 +14330 +13693 +590 +590 +15183 +24045 +41843 +155 +590 +9 +41844 +40570 +27900 +41845 +41846 +18695 +20616 +9925 +8611 +19 +9 +31873 +12987 +1157 +41847 +29483 +41687 +41848 +41849 +41850 +29628 +20 +597 +25 +41851 +15718 +41852 +259 +1090 +21373 +25129 +25 +1749 +41853 +2043 +16413 +24207 +176 +13943 +1310 +16687 +3790 +41854 +2694 +31293 +41855 +24862 +590 +41856 +14369 +1090 +41857 +41858 +41859 +31896 +25241 +15 +41860 +14330 +1208 +590 +19618 +936 +41861 +2944 +26209 +2314 +41862 +41863 +2770 +41864 +2 +1542 +2253 +41865 +31225 +6384 +155 +2694 +13390 +12987 +31225 +284 +37154 +43 +201 +31773 +284 +5780 +3838 +31168 +590 +41866 +41867 +101 +16102 +41868 +40570 +28317 +41869 +41870 +37808 +28923 +41871 +41872 +41873 +41874 +57 +155 +41875 +41876 +248 +41877 +31691 +43 +41878 +12005 +17385 +21669 +41879 +60 +14369 +41880 +31293 +41881 +41882 +18024 +41883 +1764 +15 +41884 +12532 +590 +28317 +41885 +2561 +114 +41886 +19 +9210 +40570 +40570 +27669 +40570 +28490 +28036 +43 +301 +34650 +248 +345 +41887 +32 +16618 +41888 +13039 +41622 +337 +32 +41889 +41890 +284 +694 +22098 +3100 +590 +416 +41891 +13848 +337 +6210 +4820 +284 +41892 +34681 +41893 +29381 +590 +4028 +41894 +249 +286 +33278 +41895 +17083 +31168 +8508 +284 +41896 +41897 +39709 +40570 +13390 +1965 +8864 +41898 +15763 +17228 +4028 +686 +41899 +25140 +41900 +13721 +41901 +17338 +14203 +41902 +15 +3841 +15 +43 +2 +354 +46 +41903 +248 +41904 +590 +514 +33120 +41905 +14 +32 +337 +272 +22 +19 +41906 +41907 +1817 +249 +41908 +41909 +213 +1745 +3330 +41910 +10720 +41911 +41912 +15718 +12916 +1524 +41913 +3 +303 +6341 +41914 +53 +41915 +27719 +8297 +248 +41916 +1513 +41917 +17228 +30224 +248 +590 +1112 +41918 +13905 +16 +41919 +40570 +1090 +28845 +25140 +41695 +41920 +705 +1134 +2593 +21689 +209 +41921 +30224 +16524 +41922 +41923 +872 +14369 +14369 +41924 +15993 +26892 +14604 +19 +41925 +41926 +41927 +3480 +21669 +41928 +41929 +21669 +16437 +25237 +17635 +270 +140 +41930 +41931 +41932 +37881 +41933 +8156 +21947 +34681 +40570 +36932 +13377 +8668 +17911 +201 +5204 +3553 +41595 +41934 +6354 +10355 +13582 +41935 +77 +41936 +41937 +21669 +970 +41938 +31225 +377 +1681 +2410 +40570 +41939 +41940 +41941 +31293 +38465 +41942 +41943 +228 +5438 +41944 +5188 +5409 +663 +41945 +9 +41946 +9 +21200 +41947 +12555 +9 +5780 +25943 +15718 +38760 +41948 +31293 +2834 +77 +41949 +15718 +41950 +29483 +26229 +41951 +5343 +21031 +41952 +41953 +21576 +34944 +41954 +41955 +31293 +16258 +12807 +16375 +30224 +41956 +41957 +19 +7137 +339 +41958 +9 +4179 +36735 +10677 +1369 +178 +21947 +41959 +41960 +41961 +41962 +322 +1090 +248 +40570 +415 +28317 +484 +41963 +41964 +17920 +20 +155 +36483 +41965 +377 +41966 +213 +31168 +41967 +4055 +270 +29639 +4055 +41968 +2388 +24225 +540 +424 +10946 +8036 +14369 +41969 +41970 +33650 +590 +41971 +41972 +19304 +41973 +41974 +140 +17972 +2064 +18128 +33061 +16466 +155 +28845 +41975 +21947 +41976 +31293 +34 +41977 +41978 +40570 +213 +29628 +37556 +41979 +41980 +31293 +1987 +23495 +41981 +41982 +17151 +41983 +2694 +3743 +155 +15 +41984 +21947 +13390 +21947 +41985 +40658 +155 +41986 +5318 +41987 +29483 +41988 +20514 +21947 +40570 +12828 +41989 +3978 +40589 +1765 +38760 +123 +155 +31356 +21947 +19 +43 +41990 +41991 +19 +24683 +1051 +41181 +31873 +2476 +41992 +31293 +30051 +41993 +28845 +36268 +6430 +41994 +41995 +590 +15018 +41996 +40570 +5780 +36212 +41997 +41998 +7743 +19 +9 +29483 +2787 +41999 +42000 +18780 +15476 +42001 +30051 +28845 +40570 +46 +10505 +37556 +892 +19655 +18503 +19 +42002 +26666 +42003 +40893 +1090 +942 +42004 +42005 +24144 +42006 +42007 +337 +15 +42008 +28845 +40570 +19 +155 +42009 +284 +42010 +10274 +42011 +31139 +28845 +42012 +12299 +2274 +2356 +42013 +77 +42014 +19655 +42015 +32402 +9 +42016 +31293 +2015 +2260 +286 +9 +2537 +2427 +26835 +42017 +42018 +590 +42019 +12050 +25316 +370 +70 +14369 +42020 +42021 +176 +42022 +20 +25 +37411 +14666 +15511 +9 +21947 +29850 +651 +40570 +42023 +22 +42024 +141 +57 +1090 +43 +42025 +20700 +42026 +8668 +42027 +34602 +42028 +590 +11321 +827 +155 +24021 +40570 +31293 +42029 +42030 +42031 +42032 +19 +19956 +286 +42033 +42034 +42035 +28490 +42036 +590 +42037 +42038 +24144 +28036 +736 +2029 +40570 +4502 +42039 +42040 +725 +42041 +42042 +27069 +15718 +42043 +15718 +13566 +30051 +40570 +42044 +29483 +42045 +269 +42046 +42047 +42048 +692 +16527 +14502 +42049 +42050 +11925 +1470 +42051 +1870 +27719 +28845 +345 +42 +42052 +16798 +6171 +10960 +42053 +37556 +22 +33729 +27884 +42054 +24864 +6121 +40067 +42055 +42056 +29483 +140 +590 +18707 +38760 +15384 +21947 +42057 +3867 +3866 +41919 +3353 +42058 +9954 +155 +19 +4502 +21947 +42059 +42060 +41695 +42061 +40570 +42062 +42063 +42064 +519 +21947 +42065 +42066 +42067 +42068 +2341 +42069 +29483 +21689 +42070 +872 +42071 +201 +37168 +33914 +42072 +4155 +35967 +41664 +398 +42073 +19 +2005 +4855 +42074 +42075 +8297 +3406 +42076 +42077 +42078 +98 +554 +9389 +18314 +18999 +301 +1991 +15353 +30877 +42079 +33560 +24727 +30877 +42080 +42081 +40570 +42082 +9934 +14909 +831 +33141 +349 +37556 +7053 +39536 +42083 +42084 +42085 +36735 +17911 +28845 +42086 +42087 +28845 +42088 +554 +20161 +5990 +42089 +155 +39489 +27669 +333 +31234 +42090 +42091 +8053 +1310 +2593 +42092 +11312 +1082 +42093 +31293 +36478 +11482 +29483 +42094 +4116 +42095 +42096 +9 +4422 +736 +20340 +24896 +960 +39865 +31270 +33627 +2577 +42097 +1870 +29926 +42098 +3976 +7717 +2728 +42099 +377 +19160 +42100 +42101 +42102 +481 +1090 +471 +165 +5316 +42103 +34181 +42104 +25237 +4055 +21947 +7923 +6877 +42105 +25030 +822 +4 +6660 +27669 +4982 +42106 +42107 +17828 +42108 +42109 +14625 +15683 +18364 +40570 +590 +9 +21669 +42110 +42111 +349 +31293 +12987 +24140 +42112 +28845 +41234 +2040 +42113 +4055 +15 +40143 +20384 +39709 +4155 +21669 +36452 +27069 +13049 +42114 +25237 +37556 +42115 +42116 +15 +31293 +42117 +165 +3038 +42118 +18045 +37556 +42119 +33627 +5409 +12013 +19684 +1090 +4055 +8297 +27669 +41919 +42120 +16019 +42121 +38893 +39709 +15 +29483 +4463 +42122 +42123 +15539 +29483 +20 +2649 +42124 +42125 +1621 +2064 +42126 +27117 +10 +398 +42127 +42128 +42129 +42130 +29483 +155 +42131 +1688 +590 +17 +41919 +42132 +42133 +286 +42134 +2410 +1385 +8297 +5188 +42135 +5188 +4020 +19618 +5627 +7516 +31293 +2465 +42136 +19618 +1912 +9 +9 +31041 +42137 +694 +27843 +42138 +41695 +42139 +40696 +42140 +42141 +42142 +1870 +42143 +42144 +8668 +5627 +590 +42145 +42146 +57 +33650 +966 +42147 +286 +7790 +2 +15 +42148 +26096 +21669 +23103 +28480 +19 +10367 +28845 +24144 +29730 +7835 +42149 +42150 +33226 +42151 +42152 +29483 +14369 +42153 +42154 +42155 +24864 +41396 +42156 +2181 +42157 +7835 +30224 +42158 +42159 +42160 +5409 +11374 +16466 +11660 +19 +24725 +15398 +345 +1273 +35104 +41919 +42161 +42162 +1251 +42163 +42164 +8701 +42165 +42166 +77 +916 +42167 +9144 +42168 +42169 +42170 +42171 +27669 +9 +23931 +2202 +40570 +32401 +42172 +42173 +349 +14520 +42174 +2349 +42175 +4055 +155 +31293 +42176 +5071 +42177 +42178 +9 +89 +1927 +41695 +42179 +26559 +8593 +2410 +12871 +42180 +32 +317 +4531 +14590 +17772 +42181 +43 +42182 +2988 +41881 +662 +42183 +4461 +41567 +41043 +9095 +22270 +42184 +21669 +1808 +301 +42185 +5806 +42186 +872 +42187 +3743 +590 +42188 +15 +42189 +42190 +3072 +42191 +42192 +7253 +8668 +19 +1817 +42193 +42194 +8994 +42195 +3601 +1082 +6260 +9095 +32871 +40570 +19 +42196 +15824 +22 +42197 +42198 +42199 +41919 +21669 +6928 +42200 +7838 +40208 +41904 +42201 +42202 +3104 +19 +98 +28036 +16437 +990 +7987 +1011 +42203 +16865 +155 +713 +42204 +42205 +28696 +15 +24321 +36735 +5119 +41684 +42206 +42207 +31995 +155 +42208 +19 +42209 +849 +5318 +42210 +19 +42211 +43 +42212 +40570 +32965 +37556 +57 +6463 +42064 +590 +40570 +140 +23322 +34602 +32 +29483 +43 +277 +590 +8198 +3999 +36 +42213 +25387 +31293 +23103 +41919 +40570 +36268 +42214 +31326 +42215 +42216 +15 +155 +29483 +338 +42217 +42218 +3030 +21669 +18314 +590 +42219 +590 +1090 +28845 +22898 +178 +536 +42220 +42221 +40570 +42222 +21669 +2043 +42223 +14363 +42224 +42225 +1090 +43 +573 +38893 +42226 +42227 +1716 +286 +1688 +19 +42228 +42229 +34944 +30551 +42230 +28845 +8849 +26081 +8483 +179 +491 +41687 +1896 +42231 +28845 +9 +42232 +35153 +155 +1157 +42233 +31293 +25309 +28317 +41273 +42234 +713 +809 +26161 +25683 +89 +9232 +2049 +41581 +6068 +3601 +26657 +19 +4684 +8867 +42235 +42236 +28845 +411 +2944 +27669 +43 +12063 +5188 +13721 +19111 +14477 +38760 +3406 +2006 +40570 +18045 +41858 +42237 +42238 +38499 +10846 +21947 +42239 +44 +42240 +713 +17698 +13721 +155 +16315 +20679 +42241 +42242 +31873 +736 +37510 +42243 +42244 +42245 +15718 +2039 +915 +15718 +1559 +16375 +19 +595 +42246 +286 +25316 +1047 +38900 +13116 +42247 +31293 +42248 +31423 +42249 +155 +17042 +42250 +20315 +3055 +42251 +42252 +42253 +25 +19655 +33650 +42254 +736 +21689 +42255 +19 +46 +7053 +9 +16 +18683 +42256 +31293 +5085 +42257 +42258 +42259 +31293 +7379 +8367 +590 +42260 +37404 +790 +42261 +31293 +3981 +42262 +42263 +155 +21310 +43 +42264 +29200 +6341 +301 +42265 +21947 +21669 +28845 +14909 +140 +31293 +42266 +1047 +12 +2318 +18045 +42267 +4055 +42268 +42269 +21947 +28845 +16375 +40591 +19 +17353 +40570 +36735 +24725 +34804 +42270 +34402 +209 +42271 +3030 +31293 +155 +23103 +6726 +17670 +42272 +40570 +1234 +42273 +16085 +40570 +33627 +42274 +40570 +27011 +12987 +7065 +155 +89 +42275 +42276 +21669 +42277 +29381 +29483 +42278 +42279 +42280 +22065 +13579 +20487 +36268 +42281 +42282 +19 +30650 +42283 +42284 +40570 +153 +40570 +17151 +42285 +16437 +13390 +19618 +13826 +24725 +21669 +39434 +5297 +1051 +42286 +398 +46 +6508 +42287 +40570 +42288 +15506 +26498 +19 +18589 +42289 +3546 +19797 +29628 +21947 +155 +23121 +19655 +165 +42290 +42291 +29200 +42292 +30458 +13760 +42293 +42294 +42295 +1823 +40570 +736 +9 +13390 +42296 +42297 +24074 +57 +42298 +19 +1090 +42299 +42300 +42301 +33650 +590 +2561 +40570 +42302 +155 +5409 +42303 +28339 +42304 +42305 +12093 +5080 +42306 +869 +29204 +42307 +42308 +21689 +21947 +1169 +23103 +5088 +20 +27669 +38465 +27147 +9 +671 +1090 +2000 +5409 +42309 +42310 +4047 +32332 +42311 +16316 +43 +13615 +345 +10699 +42312 +18045 +42313 +42314 +40570 +20839 +21947 +554 +40570 +43 +40570 +19 +29483 +42205 +42315 +16121 +1244 +42316 +24161 +6582 +19 +12628 +42317 +1169 +42318 +42319 +42320 +28845 +9 +5041 +155 +699 +19223 +42321 +42322 +19 +42323 +2944 +155 +590 +42324 +42325 +30051 +9095 +32 +20442 +42326 +28317 +42327 +42328 +42329 +40570 +12366 +29483 +14856 +1481 +2197 +989 +42330 +28755 +13895 +42331 +42332 +416 +155 +77 +25237 +29483 +31168 +28219 +40707 +42333 +41944 +42334 +42335 +19 +14369 +14330 +20442 +4055 +27669 +1559 +736 +42336 +27798 +586 +15718 +155 +42337 +42338 +25683 +42339 +42340 +18334 +6935 +42341 +42342 +42343 +140 +42344 +671 +34518 +21947 +3601 +42345 +5773 +42346 +209 +6054 +37556 +590 +6627 +42347 +1559 +29434 +915 +25 +29483 +19618 +22476 +18780 +13323 +6441 +42348 +18310 +42349 +28643 +8483 +42350 +42351 +42352 +4245 +42353 +43 +42354 +21947 +57 +42355 +40570 +10117 +42356 +41919 +42357 +43 +29381 +9 +38033 +29483 +42358 +10320 +42359 +24303 +15718 +42360 +286 +30814 +42361 +40570 +37556 +40570 +21689 +15820 +14477 +37154 +28490 +19618 +424 +42362 +8849 +19 +40570 +42363 +931 +46 +10782 +872 +16413 +155 +14604 +42364 +1364 +42365 +43 +42366 +42367 +19795 +9 +27669 +342 +42368 +590 +42369 +42370 +13390 +42371 +42372 +430 +42373 +5925 +29483 +42374 +586 +41695 +19 +41919 +9 +1384 +249 +38760 +38760 +42375 +42376 +590 +42377 +42275 +31293 +205 +4230 +31293 +42378 +554 +41919 +29483 +20507 +11328 +1134 +29628 +42379 +42380 +21947 +7379 +15 +12005 +25237 +15718 +590 +22717 +7276 +42381 +42382 +5022 +28845 +573 +7276 +42383 +42384 +42385 +30224 +3743 +42386 +42387 +34402 +40570 +37790 +31293 +9 +1090 +31293 +4963 +31098 +3546 +27794 +1054 +42388 +1465 +42389 +533 +9 +40570 +24144 +21947 +42390 +2841 +1571 +33650 +23103 +36 +40570 +42391 +42392 +42393 +23103 +24864 +12684 +24303 +1615 +42394 +42395 +42396 +30917 +590 +42397 +10946 +40570 +25260 +42398 +4363 +242 +30877 +16437 +42399 +42400 +29483 +42401 +42402 +42403 +42404 +42405 +1384 +10464 +3944 +27905 +42406 +12500 +3978 +21947 +31293 +1090 +736 +42407 +42408 +32 +958 +31293 +301 +42409 +19852 +1154 +42410 +28317 +590 +34402 +4055 +590 +42411 +42412 +42413 +6839 +19523 +42414 +42415 +42416 +42417 +42418 +42419 +31293 +14369 +42420 +42421 +4028 +42422 +24864 +155 +1384 +42423 +34227 +1524 +2310 +42424 +872 +42425 +33469 +36735 +42228 +1082 +9148 +19030 +42426 +42427 +28845 +22 +39520 +19 +42428 +155 +9384 +42429 +41919 +42430 +18045 +323 +42431 +42432 +42433 +21089 +188 +32410 +42434 +31293 +1090 +42435 +1045 +2604 +22986 +25683 +4502 +42436 +590 +13365 +43 +25943 +14330 +42437 +3528 +1157 +14369 +42438 +42439 +29981 +43 +42440 +42441 +989 +225 +27117 +48 +17653 +42442 +42443 +42444 +27025 +15354 +5231 +590 +14369 +9254 +7617 +1026 +43 +15498 +42445 +16443 +27310 +67 +42446 +40570 +11702 +40570 +42246 +30224 +19287 +42447 +27669 +42448 +42449 +25106 +40570 +1531 +42450 +42451 +42452 +19618 +37556 +1021 +42453 +21947 +42454 +41919 +33650 +15533 +42455 +1404 +21045 +25683 +1169 +10262 +15 +10052 +42456 +42457 +19655 +42458 +42459 +14369 +349 +442 +40570 +27843 +1847 +38465 +4116 +349 +28490 +1870 +17472 +14369 +42460 +19 +164 +42461 +874 +28845 +42462 +155 +4055 +42463 +7855 +590 +21730 +21947 +30705 +42464 +4055 +42465 +18991 +15718 +33061 +46 +9 +28845 +42466 +23150 +42467 +43 +9 +27857 +42468 +33758 +42469 +27069 +42470 +41695 +25140 +5858 +3 +19 +42471 +42472 +13390 +8249 +42473 +176 +42474 +514 +23518 +42475 +42476 +26361 +42477 +25047 +720 +43 +66 +19 +2762 +42478 +42479 +89 +42480 +1203 +29483 +1870 +30051 +1021 +677 +42481 +259 +4528 +5188 +42482 +11273 +18684 +42483 +42484 +21089 +42485 +349 +42486 +32410 +66 +349 +16 +30224 +24864 +42487 +22787 +7362 +28845 +21947 +2009 +31293 +5344 +823 +323 +42488 +42489 +42490 +1090 +31293 +8668 +590 +42491 +25237 +15718 +7698 +7799 +42492 +39434 +15 +42493 +29204 +42494 +1222 +42495 +21689 +7419 +42496 +2727 +41919 +40570 +3452 +16466 +42497 +13390 +19167 +20673 +60 +17151 +42498 +286 +936 +42499 +893 +15718 +42500 +736 +42501 +533 +2260 +42502 +42503 +20514 +8668 +28036 +13390 +42504 +40570 +42505 +92 +42506 +583 +155 +19618 +25316 +720 +114 +736 +8849 +5188 +40570 +42507 +185 +42508 +15718 +42509 +14330 +42510 +31293 +24303 +20175 +42511 +12307 +42512 +35489 +24896 +9 +28317 +415 +14 +42513 +595 +8668 +38465 +31522 +155 +30794 +38760 +42514 +42515 +8787 +14369 +42516 +40570 +42517 +10846 +33650 +42518 +42519 +42520 +9 +27669 +15054 +42521 +40570 +35316 +29483 +5085 +140 +25 +33627 +32 +209 +42522 +2854 +43 +34402 +42523 +42524 +19655 +209 +155 +34944 +13721 +42525 +42526 +196 +42527 +10 +27669 +14363 +23111 +41919 +42528 +24410 +19 +815 +31293 +42529 +27669 +1543 +13390 +7658 +42530 +865 +5085 +42531 +519 +19655 +42532 +8668 +42533 +42534 +14108 +30224 +4598 +9 +28845 +2164 +15914 +14369 +42535 +42536 +38033 +590 +2015 +228 +42537 +29157 +1120 +89 +42538 +31293 +24709 +42539 +31293 +9 +42540 +5188 +590 +39363 +15 +42541 +12987 +42542 +15845 +15720 +1157 +42543 +2476 +11369 +1924 +33627 +29483 +36736 +42544 +42545 +2372 +17385 +4055 +42546 +42547 +41603 +18695 +16466 +46 +40570 +33627 +42548 +9396 +19 +42549 +155 +27669 +34402 +77 +43 +3764 +15398 +42550 +42551 +24303 +915 +8367 +32790 +42552 +42553 +23005 +37556 +42554 +9 +10935 +42555 +1710 +42556 +1378 +22963 +514 +42557 +28036 +22808 +42558 +40570 +42559 +38893 +22986 +42560 +14381 +40097 +7253 +42561 +24144 +40570 +42562 +42563 +37556 +590 +42564 +42565 +41117 +42566 +42567 +25316 +9097 +16440 +42568 +42569 +22898 +42570 +8668 +887 +42571 +38465 +1517 +3875 +42572 +19167 +42573 +11389 +42574 +40570 +1991 +34 +35224 +23547 +36268 +42575 +495 +42576 +5085 +37958 +39713 +25584 +42577 +42578 +27829 +43 +42579 +43 +13824 +30051 +21947 +42483 +42580 +41117 +42581 +38760 +12158 +6004 +42582 +42583 +6335 +42584 +37556 +42585 +32 +42586 +32 +13390 +33650 +28845 +34454 +42587 +42588 +57 +42589 +21669 +1224 +27669 +42590 +21689 +42316 +42591 +42592 +29483 +2064 +15718 +8427 +23103 +23103 +958 +40570 +42593 +597 +323 +42594 +42595 +42596 +41117 +2289 +27104 +15718 +42597 +41687 +4403 +19 +42598 +1562 +18045 +15718 +42599 +13390 +33650 +345 +42600 +15718 +1444 +1234 +19 +5874 +28936 +1090 +17951 +265 +15 +41273 +533 +9 +572 +41941 +42601 +9452 +34402 +14887 +3369 +43 +155 +42602 +817 +42603 +514 +222 +13390 +42604 +26815 +17911 +42605 +32467 +26496 +42606 +554 +42607 +42608 +42609 +11328 +1425 +17911 +42610 +37411 +19167 +24303 +42611 +21521 +745 +155 +27669 +46 +42612 +4116 +35624 +6669 +29483 +42613 +42614 +42615 +38527 +40570 +41919 +42616 +42617 +36436 +155 +694 +42618 +32 +8103 +42619 +19 +42620 +42621 +42622 +21791 +42623 +179 +13721 +671 +21947 +42624 +42625 +3 +13129 +29483 +736 +7276 +42626 +28845 +42627 +17698 +21947 +42628 +42629 +1559 +40570 +751 +32 +40570 +6122 +4124 +42630 +42631 +28845 +19655 +42632 +42633 +9 +21947 +2427 +42634 +1961 +40570 +7944 +36674 +24324 +155 +19618 +42635 +1090 +10946 +42636 +16798 +26496 +11733 +42637 +12013 +42638 +33061 +42639 +41567 +736 +25921 +42640 +28168 +42641 +32642 +560 +17151 +4808 +42642 +14079 +42643 +42644 +849 +42645 +5391 +42646 +10642 +42647 +1566 +155 +7835 +36735 +30209 +1889 +42648 +33627 +31293 +13528 +1531 +42649 +18846 +14668 +42650 +694 +42651 +28845 +28036 +42652 +42653 +42654 +40570 +42655 +32477 +42656 +42657 +42658 +155 +42659 +1082 +42660 +19 +37556 +42661 +42662 +42663 +42664 +5041 +42665 +42666 +13390 +590 +42667 +23103 +9441 +4806 +33330 +42668 +42669 +42670 +24864 +21126 +32190 +10 +2015 +43 +42671 +155 +1961 +42672 +21947 +9688 +34758 +19 +42673 +590 +42674 +43 +2325 +21947 +42675 +42676 +42677 +19 +201 +42678 +38760 +42679 +1090 +1090 +42680 +1224 +26959 +40570 +42681 +40570 +42682 +18695 +28845 +9024 +40570 +36727 +19 +42683 +1335 +342 +155 +2694 +208 +37556 +42684 +17911 +2476 +26157 +42685 +42686 +66 +1502 +42687 +33627 +1444 +42688 +21602 +560 +42689 +317 +42690 +28845 +7053 +40570 +42691 +42692 +26496 +42693 +28845 +33650 +6744 +32449 +2314 +12120 +42694 +1090 +2896 +9 +13905 +286 +736 +11822 +7835 +5601 +24864 +41919 +178 +15802 +11683 +25237 +29424 +16437 +18561 +53 +41919 +28219 +18176 +26389 +19 +791 +40570 +42695 +18553 +42696 +21669 +2314 +10859 +14369 +9 +42697 +491 +42542 +36735 +815 +1090 +448 +415 +29200 +42698 +42699 +2243 +19 +1920 +42700 +15 +14330 +29770 +284 +1112 +9234 +31293 +26705 +42701 +25 +15824 +42702 +17911 +5080 +29483 +42703 +21947 +213 +42704 +590 +10527 +23103 +21175 +35594 +42705 +42706 +42707 +40570 +42708 +2372 +29 +42709 +12203 +8727 +378 +42710 +284 +23821 +1511 +5499 +31098 +6985 +42711 +42712 +713 +29381 +43 +29675 +40570 +284 +42713 +42714 +5409 +17749 +42715 +349 +28317 +1090 +42716 +156 +31293 +21669 +40570 +823 +42717 +29483 +42718 +5780 +248 +19 +36943 +42719 +42720 +42721 +590 +18951 +42722 +40570 +42723 +13390 +155 +28845 +31293 +42724 +42725 +284 +24207 +140 +1090 +42726 +34650 +42727 +21947 +590 +390 +2653 +42728 +42729 +17385 +30224 +284 +38358 +8668 +19167 +42730 +38064 +39053 +213 +42731 +15 +29483 +284 +40591 +42732 +31293 +42733 +32332 +21947 +248 +42734 +27669 +42735 +7053 +791 +31293 +42736 +28845 +5285 +15718 +36639 +34641 +21947 +42737 +42738 +42739 +1168 +24045 +18488 +43 +33302 +40591 +114 +14 +21269 +42740 +42741 +40570 +1090 +3698 +39709 +21689 +42742 +303 +42743 +155 +248 +42744 +5952 +6008 +25140 +36851 +40570 +39926 +43 +1200 +25943 +42745 +41266 +38465 +303 +21669 +6877 +42746 +19 +213 +17894 +31293 +1688 +1091 +3544 +4226 +42012 +14369 +37556 +42747 +9396 +42748 +19655 +7907 +14477 +213 +42749 +484 +14604 +671 +42750 +16693 +19 +42751 +303 +41342 +31293 +12302 +21669 +27669 +248 +41919 +42752 +42753 +21669 +21947 +42754 +42755 +573 +155 +210 +15712 +33650 +822 +590 +37556 +10973 +42756 +41622 +31293 +42757 +248 +13576 +196 +42758 +30816 +42759 +2476 +495 +303 +42760 +1652 +20785 +28845 +42761 +29483 +1224 +349 +42762 +24458 +8668 +42763 +37556 +16121 +42764 +18037 +42765 +28845 +25316 +42766 +21669 +3908 +27669 +42767 +42768 +284 +38465 +554 +29381 +9 +16966 +28845 +28845 +13905 +18503 +41695 +40570 +590 +14947 +213 +31225 +506 +1090 +36322 +1112 +42769 +40570 +42770 +42771 +849 +41880 +42772 +213 +4855 +37556 +42773 +36546 +38234 +155 +21669 +31885 +33650 +590 +42774 +42775 +41919 +25683 +19 +38607 +42776 +42777 +9422 +12118 +179 +42778 +42779 +10475 +42780 +3238 +42781 +57 +42782 +15718 +29483 +28490 +683 +42012 +40570 +42783 +21947 +19 +303 +22962 +648 +46 +24864 +22 +21279 +42784 +19 +42785 +42786 +590 +21398 +99 +541 +41919 +40570 +42787 +99 +42788 +14 +533 +42789 +27895 +46 +20514 +42790 +42791 +28459 +713 +364 +30551 +9 +42792 +42793 +42794 +40570 +30246 +19142 +6439 +19 +32 +25237 +42795 +21598 +1847 +1907 +4765 +42796 +19 +9898 +46 +42797 +42798 +25237 +40570 +201 +915 +42799 +43 +42800 +42801 +42802 +21669 +33714 +31293 +8338 +21669 +31098 +14369 +57 +9112 +13390 +3155 +17754 +41622 +3790 +3950 +377 +28845 +42803 +42804 +42805 +25683 +42806 +31293 +42807 +209 +42808 +42809 +13721 +4226 +1107 +5579 +35272 +28845 +337 +12987 +40570 +12936 +1384 +2649 +17911 +19 +1543 +5499 +39709 +284 +42810 +155 +9 +24081 +42811 +40939 +42812 +42813 +42814 +1559 +4985 +9 +3055 +713 +42815 +104 +4847 +3196 +28845 +23103 +42816 +248 +41397 +3863 +26549 +30209 +495 +20600 +13390 +42817 +40570 +42818 +14192 +436 +42819 +155 +415 +19 +32896 +21947 +14603 +15275 +42820 +15 +42821 +38760 +16 +42822 +42823 +1021 +42824 +16941 +42825 +936 +177 +42826 +21669 +354 +22 +42827 +42828 +42829 +16609 +40570 +554 +31293 +28317 +38003 +42830 +21947 +25943 +28845 +42831 +43 +14330 +3546 +40570 +42832 +42833 +12152 +42834 +155 +12479 +2694 +34327 +35592 +42835 +42836 +39709 +21947 +42837 +398 +345 +31293 +10 +42838 +42839 +36403 +42840 +21947 +42841 +16 +42842 +155 +12020 +42843 +42844 +42845 +34506 +28577 +37770 +250 +42846 +29687 +28799 +21947 +21669 +446 +10298 +42847 +18045 +27719 +30580 +42848 +42849 +2769 +24896 +42850 +37556 +2310 +35085 +12987 +42851 +303 +1169 +42852 +42853 +40570 +16413 +52 +5065 +29483 +42854 +41919 +337 +33937 +42855 +1090 +34103 +42856 +43 +42857 +27455 +42858 +42859 +43 +19218 +2164 +18477 +165 +18683 +7488 +42860 +11808 +21947 +5188 +140 +26496 +9 +35224 +28845 +31603 +42861 +35158 +42862 +16443 +41919 +112 +42863 +42864 +822 +42865 +37556 +38465 +42866 +39593 +31346 +38465 +213 +155 +21791 +19 +2581 +6364 +16826 +936 +42867 +30224 +21947 +18317 +42868 +42869 +17698 +29716 +40570 +42870 +30224 +42871 +42872 +8070 +42873 +40570 +42874 +42875 +43 +19618 +21947 +4699 +554 +42876 +576 +213 +155 +155 +5188 +39709 +19167 +42877 +155 +42878 +5409 +3241 +25140 +24144 +10946 +1090 +656 +42879 +2694 +42880 +42881 +42882 +554 +42883 +590 +40570 +42884 +10946 +42885 +42886 +42887 +22380 +25584 +42888 +249 +42889 +492 +28845 +42890 +9 +554 +42891 +28212 +43 +317 +955 +8867 +41919 +2052 +2514 +2415 +42892 +98 +27819 +736 +19582 +26943 +31293 +8919 +19 +30580 +42893 +14369 +32931 +16828 +12281 +42894 +42895 +15477 +32 +21027 +42896 +16089 +40570 +7385 +2919 +42897 +21947 +42898 +33445 +42899 +1090 +26496 +40570 +3644 +13390 +2488 +43 +19 +42900 +42901 +42902 +616 +37556 +590 +41890 +31293 +42903 +21947 +42904 +23103 +42905 +42906 +416 +248 +19 +2457 +37556 +28317 +18045 +15718 +213 +42907 +42908 +37770 +42909 +42910 +11966 +40570 +24862 +30224 +20700 +6096 +42911 +15718 +33650 +42912 +42913 +42914 +509 +736 +29483 +19 +42915 +21179 +26361 +25683 +42916 +42917 +713 +155 +31873 +1013 +8541 +42918 +42919 +250 +573 +40570 +590 +2692 +178 +213 +155 +34264 +42920 +41687 +14330 +42921 +720 +4908 +345 +42922 +24303 +14871 +40022 +15810 +42923 +42924 +1442 +42925 +9 +590 +31437 +248 +42926 +17911 +43 +6785 +5791 +16375 +788 +42927 +15718 +19618 +42928 +42929 +179 +32920 +42930 +42931 +3252 +9005 +41890 +42932 +337 +40928 +597 +699 +17670 +2260 +25683 +7486 +32920 +42933 +21698 +1051 +2260 +155 +42934 +11321 +1291 +19852 +303 +33650 +14824 +7117 +1774 +303 +337 +4028 +11754 +24458 +21049 +590 +155 +42935 +286 +35624 +40570 +42936 +42937 +4538 +1559 +17228 +284 +34402 +303 +19 +33650 +42938 +42939 +17635 +1012 +25316 +29381 +42940 +26361 +303 +42941 +40570 +4471 +501 +178 +42942 +25316 +317 +46 +26669 +34402 +42943 +590 +42192 +38284 +30580 +24496 +4441 +37556 +33349 +29483 +103 +533 +42944 +5065 +40570 +42945 +2672 +42946 +21947 +12020 +41695 +2672 +40928 +4155 +42947 +37556 +248 +42948 +41919 +9902 +41890 +41890 +15 +31293 +955 +13036 +42949 +590 +18988 +13390 +41687 +6121 +15718 +284 +42950 +294 +42951 +4463 +342 +42952 +57 +42953 +1291 +28845 +5188 +2672 +9 +42954 +12351 +554 +971 +23103 +42955 +15718 +42956 +41919 +34613 +21947 +7451 +1716 +42957 +42958 +42959 +26361 +21947 +42960 +30221 +29381 +42421 +345 +12722 +1465 +41890 +42961 +42962 +42963 +42964 +42965 +41890 +42966 +42967 +33627 +29874 +155 +42968 +30224 +42969 +20443 +42970 +27669 +815 +28845 +42971 +34448 +18740 +9 +42972 +31246 +42973 +4055 +42974 +42975 +77 +24864 +46 +736 +10946 +42976 +46 +8367 +12642 +3599 +248 +25 +24045 +21689 +10932 +16891 +28845 +42977 +14477 +40570 +554 +42978 +42979 +43 +42980 +41890 +3034 +41890 +37556 +41890 +155 +41890 +42981 +29 +42982 +31454 +31964 +42983 +42984 +42985 +42986 +42987 +29483 +4123 +4313 +16 +16443 +4463 +41919 +2287 +19 +345 +16205 +14001 +25142 +14079 +42988 +17911 +33002 +478 +42989 +4055 +41890 +41890 +29484 +317 +1961 +42990 +3318 +155 +41890 +1716 +9194 +303 +34402 +2779 +42991 +42992 +42993 +42994 +42995 +15683 +43 +21089 +41890 +42996 +26040 +1109 +25624 +40570 +42997 +8668 +72 +19091 +42998 +42999 +43000 +43001 +43002 +4264 +43003 +155 +11869 +13390 +3034 +19918 +41890 +43004 +43005 +43006 +36268 +25316 +34613 +40570 +41890 +41890 +29483 +43 +43007 +36483 +24038 +3601 +9 +21947 +43008 +791 +43009 +43010 +29687 +18276 +41890 +43011 +41890 +30051 +43012 +41890 +41890 +41890 +14133 +43013 +43014 +378 +7231 +411 +8807 +8248 +33627 +41890 +15 +43015 +22922 +9 +37077 +917 +43 +19 +41890 +28845 +43016 +861 +77 +19 +3598 +14369 +41890 +41890 +43017 +19 +43018 +30224 +31293 +24144 +5963 +34496 +41890 +39080 +42962 +20514 +25237 +35926 +4288 +2043 +29483 +43019 +43020 +43021 +29381 +554 +43022 +41890 +41890 +2315 +19 +40570 +40570 +21947 +41890 +1157 +43023 +1961 +1774 +43024 +39371 +5065 +7014 +15 +41890 +18746 +3551 +41919 +41890 +19 +24303 +590 +43025 +24303 +28845 +41890 +597 +2121 +104 +41890 +4263 +27669 +26040 +41890 +28597 +43026 +43027 +41890 +43028 +43029 +28845 +155 +1605 +29483 +13390 +40570 +43030 +25683 +40570 +43031 +41890 +41890 +43032 +46 +41890 +20514 +43033 +40570 +7987 +6245 +43034 +43035 +43036 +41890 +25 +1444 +23103 +4518 +43037 +2029 +1543 +43038 +193 +41890 +43039 +28845 +43040 +43 +4808 +37556 +33693 +43041 +43042 +30209 +42421 +43043 +43044 +43045 +57 +590 +33627 +40570 +41890 +40570 +43046 +41890 +23752 +41890 +14869 +27669 +31293 +37556 +15718 +26158 +21947 +20340 +21105 +15 +43047 +43048 +43049 +15718 +21031 +37556 +7912 +41890 +31098 +15193 +558 +43050 +32456 +23271 +43051 +43052 +2577 +15718 +13405 +43053 +22 +21947 +331 +36639 +27669 +2029 +41890 +28845 +155 +29381 +40570 +43054 +1817 +43055 +590 +222 +43056 +4028 +16437 +43 +35769 +43 +155 +25683 +845 +3546 +349 +29707 +41890 +41890 +41890 +155 +43057 +1051 +342 +4603 +43058 +6571 +41890 +43059 +43060 +43061 +16466 +43062 +40570 +2463 +3669 +14962 +7978 +21947 +41890 +40570 +43063 +41890 +41890 +9918 +40570 +41890 +43064 +40570 +1442 +1090 +43065 +30224 +15718 +41890 +339 +43066 +41919 +155 +5409 +43067 +22552 +554 +1870 +43068 +43069 +13721 +28441 +43070 +43071 +43072 +43073 +19918 +33758 +1066 +43074 +24454 +41890 +495 +41890 +43075 +43076 +41890 +41890 +1824 +1090 +41890 +31503 +33444 +3252 +19 +43077 +43078 +40570 +41890 +33650 +41890 +41890 +19655 +43079 +17911 +43080 +29483 +43081 +40570 +2064 +19655 +43082 +9 +41890 +43083 +41890 +2465 +6571 +40062 +33141 +19 +31139 +41890 +25316 +41890 +41890 +415 +41890 +43084 +155 +165 +41890 +155 +155 +43085 +16375 +41890 +720 +41687 +1038 +41890 +43086 +43087 +43088 +13361 +41890 +41890 +43089 +41890 +41890 +43090 +40570 +43091 +736 +9228 +5188 +2733 +12828 +43092 +41890 +43093 +41919 +10482 +60 +34402 +590 +26946 +43094 +41890 +43095 +11315 +1364 +317 +30877 +43096 +43097 +2314 +15718 +646 +19 +43098 +43099 +41919 +41890 +41890 +43100 +21669 +37556 +40570 +43101 +43102 +41890 +28845 +41890 +43103 +32 +41890 +20356 +41890 +41890 +14369 +21261 +43104 +9772 +6086 +43105 +365 +25140 +41890 +41890 +478 +15483 +43106 +43107 +43108 +41890 +43109 +41890 +43110 +41890 +14909 +10745 +43111 +43112 +41890 +43113 +43114 +41890 +33650 +43115 +34264 +179 +41890 +43116 +31293 +41890 +34 +2791 +43117 +33627 +41890 +77 +41890 +209 +19618 +1018 +43118 +41890 +533 +41890 +41890 +43119 +43120 +41890 +41890 +1090 +38465 +4055 +700 +43121 +43122 +3239 +43123 +713 +40264 +41890 +514 +43124 +41890 +41890 +40570 +2197 +43125 +38003 +43126 +43127 +43128 +354 +21669 +15018 +43129 +43130 +43131 +41890 +19655 +41890 +41919 +41890 +19355 +41890 +21669 +27069 +33494 +43132 +323 +41890 +46 +26744 +12479 +43133 +9 +43134 +4441 +3553 +41890 +5188 +42000 +43135 +41890 +41890 +24303 +41890 +17911 +28845 +28845 +41890 +43136 +43 +2872 +19 +19 +41890 +43137 +28845 +43138 +43139 +41890 +41890 +43140 +176 +43141 +25316 +43142 +43143 +43144 +41890 +9 +8833 +26900 +41890 +41890 +155 +46 +43145 +41890 +36823 +4 +43146 +43147 +43148 +41890 +20700 +568 +8668 +40570 +19 +41890 +5780 +41890 +41890 +43149 +43150 +43151 +39709 +112 +43152 +41890 +43153 +19 +43154 +1090 +43155 +1090 +21669 +41890 +19655 +41155 +39536 +887 +40570 +155 +43156 +155 +36735 +1234 +1471 +40570 +3311 +42711 +43157 +43158 +43159 +21669 +41890 +41890 +349 +41890 +41890 +46 +43160 +980 +43161 +11907 +416 +43162 +41890 +910 +31293 +36268 +41890 +41890 +41890 +43163 +3484 +1870 +39709 +26361 +736 +1907 +590 +21947 +43164 +43165 +1384 +1961 +41890 +41890 +41890 +29639 +586 +41890 +9 +43166 +41890 +41890 +41890 +491 +17 +43167 +43168 +43169 +10909 +43170 +43171 +43172 +21089 +41890 +43173 +590 +43174 +36736 +17472 +25 +43175 +155 +41890 +41890 +43176 +41890 +41890 +13390 +1829 +43177 +15216 +41890 +41890 +38789 +2254 +43 +2260 +11757 +36268 +41890 +43178 +43179 +43180 +41890 +15552 +41890 +41890 +9 +41890 +41890 +41890 +15 +14369 +43181 +43182 +19792 +31293 +41890 +29483 +14176 +14077 +41890 +43183 +41890 +41890 +872 +6077 +41890 +41890 +43184 +43185 +2727 +41890 +43186 +590 +43187 +41890 +43188 +29733 +43189 +43190 +43191 +43192 +41890 +43193 +155 +8864 +33765 +43194 +43195 +43196 +41080 +43197 +34488 +3369 +34579 +15718 +43198 +43199 +42259 +5188 +21669 +13528 +2804 +18061 +40570 +41890 +27178 +43200 +457 +6617 +41890 +412 +43201 +41890 +43202 +43203 +43204 +41890 +41890 +809 +5627 +1112 +30877 +31168 +20167 +43205 +357 +13390 +43206 +43207 +43208 +22901 +41890 +25237 +43209 +33916 +43210 +43211 +43212 +40570 +40143 +3994 +1090 +1307 +25237 +41499 +29254 +21669 +9 +78 +7191 +43213 +43214 +41890 +41890 +43215 +21669 +43216 +41890 +43217 +13360 +43218 +861 +43219 +34641 +66 +27291 +43220 +43221 +43222 +41890 +791 +43223 +41890 +112 +40570 +43224 +41890 +20340 +36268 +43225 +165 +8297 +43226 +3559 +1310 +35536 +43227 +24864 +43228 +21947 +1765 +5791 +43 +43229 +43230 +43231 +43232 +43233 +22986 +9 +43234 +9 +671 +41890 +41890 +43235 +14369 +33024 +21669 +22963 +43212 +713 +554 +41890 +20593 +33120 +41890 +41890 +31293 +57 +43236 +25683 +14810 +43237 +1153 +43238 +31293 +43239 +43240 +14467 +1011 +41890 +43241 +590 +41890 +41175 +43242 +19 +33524 +43243 +43244 +30650 +43245 +43246 +29483 +38758 +15718 +30551 +21947 +43247 +43248 +43249 +28295 +18283 +41890 +15718 +155 +41890 +32915 +21669 +41890 +41890 +9573 +12013 +41567 +41890 +43250 +41890 +7631 +15 +43251 +32 +155 +5780 +33650 +1112 +564 +598 +41890 +12231 +43252 +43253 +41890 +41890 +43254 +41890 +41890 +43255 +40591 +6543 +8128 +41890 +8668 +41890 +43256 +21669 +2356 +43257 +41890 +43258 +41890 +41890 +37556 +3553 +5293 +38529 +5188 +4637 +4055 +21732 +42290 +5409 +5860 +43168 +28846 +41890 +13270 +43259 +20078 +28740 +41890 +2314 +41890 +43260 +43261 +43262 +41890 +41890 +7658 +43263 +2859 +43264 +43265 +43266 +24603 +43267 +31293 +43249 +43268 +25848 +43269 +41890 +30109 +21669 +1013 +5764 +15 +43099 +43270 +43271 +36483 +1090 +30650 +540 +32 +43272 +30224 +41890 +43273 +41890 +43274 +41890 +41890 +5582 +7762 +6996 +43275 +5601 +43276 +41890 +39709 +43277 +43278 +41890 +12518 +57 +43279 +25237 +3844 +43280 +19 +43281 +14330 +43282 +41890 +1797 +103 +43283 +43284 +40861 +38465 +4278 +41890 +33627 +1920 +12020 +41890 +21689 +43 +60 +43285 +8668 +41890 +21947 +6086 +2865 +43286 +41890 +13390 +201 +8501 +41890 +24762 +10987 +43 +43287 +1090 +40570 +43288 +41890 +155 +41890 +8160 +43289 +43290 +40570 +36735 +26953 +43291 +12178 +43292 +43293 +23528 +43249 +41890 +43294 +43295 +41890 +43296 +41890 +1172 +43297 +18695 +40570 +10946 +41890 +41890 +43298 +43299 +41890 +16437 +41707 +40067 +21089 +98 +43300 +41890 +41890 +31293 +8896 +43301 +41890 +41890 +41890 +24045 +43302 +283 +41890 +8668 +16798 +43303 +590 +43 +43304 +43305 +43306 +43307 +41890 +33120 +41890 +41890 +43308 +43309 +31139 +29204 +14017 +29836 +43310 +33627 +16466 +19655 +43311 +43312 +41890 +43313 +1186 +12 +29483 +43314 +19655 +21669 +24324 +39709 +41890 +14399 +43315 +31098 +43316 +543 +14604 +43317 +41890 +23479 +43318 +41890 +43319 +43320 +37556 +41890 +4441 +41890 +21947 +31293 +21627 +19618 +43321 +46 +41890 +43322 +317 +40570 +40570 +43323 +13390 +43324 +14947 +14719 +29483 +6505 +41890 +43325 +2427 +590 +265 +43326 +21312 +4196 +19655 +2015 +43327 +43328 +43329 +41890 +43330 +590 +5489 +34402 +26738 +5916 +791 +41890 +43331 +43332 +28000 +43333 +41890 +43334 +18045 +9 +43335 +20876 +43336 +89 +43337 +27798 +43338 +43339 +745 +37768 +31293 +43340 +745 +43341 +41890 +15 +41890 +20700 +416 +43342 +43 +43343 +16437 +2410 +7930 +41890 +40570 +43344 +19 +2236 +41890 +3598 +1533 +43345 +24864 +41890 +43346 +43347 +43348 +41890 +43349 +43350 +41890 +41890 +21669 +41890 +16437 +41890 +46 +41890 +41890 +3994 +15914 +3949 +40591 +13998 +2161 +43351 +34435 +43352 +12254 +1524 +39709 +43353 +43354 +43355 +25144 +43356 +41890 +21669 +41890 +43357 +36143 +43358 +36027 +16966 +43359 +24303 +43360 +43361 +707 +736 +41890 +155 +17151 +4258 +41890 +15718 +23833 +21947 +30224 +41890 +249 +41890 +40570 +40570 +43362 +15718 +43363 +13566 +249 +43364 +15718 +43365 +4245 +41890 +9 +14330 +41890 +11966 +1992 +41890 +41890 +249 +46 +29483 +43366 +299 +41890 +5344 +1559 +140 +41890 +9356 +43367 +43368 +6225 +29434 +7658 +210 +41890 +574 +41890 +43369 +20984 +43347 +40570 +2243 +19 +41890 +155 +554 +41890 +201 +43370 +597 +1688 +286 +43371 +15971 +323 +41890 +31293 +41890 +41890 +518 +41890 +14087 +41890 +2318 +6217 +8668 +33185 +31225 +2410 +16618 +41890 +24864 +43372 +40570 +34435 +41890 +12450 +43373 +15718 +24303 +43374 +5085 +5773 +41890 +41890 +43375 +37556 +17947 +37291 +43376 +43347 +12987 +43377 +41890 +14 +41890 +41890 +41890 +18869 +590 +43378 +41890 +41890 +6364 +41890 +41890 +38381 +16443 +2744 +41890 +41919 +42349 +17698 +34 +37556 +3 +43379 +23103 +43380 +2330 +16375 +41687 +19792 +19 +11855 +1425 +41567 +8357 +1090 +411 +41890 +6441 +43381 +43382 +43383 +564 +19713 +43384 +43385 +32 +1961 +43386 +590 +41890 +43387 +43388 +43389 +5647 +4411 +333 +41890 +41890 +5612 +43390 +43391 +43392 +286 +43393 +18561 +43394 +43395 +6058 +19 +31098 +21131 +44 +5071 +1559 +43396 +43397 +41890 +15718 +21669 +43398 +43399 +46 +43400 +43401 +671 +1013 +590 +43402 +41890 +17911 +43403 +142 +5780 +36665 +43404 +1961 +1524 +41890 +43405 +41890 +43406 +41890 +41890 +17385 +12081 +41890 +43 +40570 +32920 +43407 +43408 +43409 +43410 +43411 +15824 +41890 +19 +21947 +30224 +415 +1615 +14369 +41890 +2577 +42483 +43412 +17894 +19655 +28845 +8668 +41890 +41890 +17523 +43413 +43414 +43415 +9 +349 +41890 +43416 +31293 +31293 +33524 +1021 +43417 +43418 +41890 +30551 +20 +2476 +41890 +41890 +15026 +17119 +21669 +21947 +43419 +20 +573 +155 +40570 +446 +43420 +13361 +43421 +38219 +9 +37881 +4518 +43422 +1090 +464 +41890 +736 +590 +41890 +9245 +9217 +43423 +43424 +16905 +43425 +41890 +43426 +31293 +41919 +37576 +8407 +43427 +43428 +43429 +41890 +22327 +43430 +30481 +43431 +41890 +40570 +43432 +40570 +41890 +29962 +736 +43433 +41890 +43434 +4455 +41890 +43435 +590 +20700 +43436 +43437 +43438 +41890 +41890 +41890 +683 +43439 +23103 +40570 +2694 +32 +41890 +6284 +41890 +29200 +13307 +887 +41890 +41890 +41890 +11449 +1716 +41890 +19 +345 +1495 +43440 +1502 +41890 +9 +3 +43441 +43442 +43443 +2228 +43444 +43445 +43446 +25584 +3415 +155 +42483 +30179 +41890 +41890 +43447 +43448 +41890 +13390 +21669 +26342 +43449 +41890 +43450 +43451 +19 +19852 +358 +9497 +20677 +41890 +41890 +15718 +41890 +19 +41890 +590 +32229 +41567 +43452 +40570 +43453 +19 +43454 +41919 +43455 +43456 +41890 +43457 +41796 +21522 +43458 +3908 +43 +41890 +41890 +155 +43459 +20 +5188 +43 +41419 +43460 +41890 +17571 +43 +27669 +26040 +31293 +43461 +41890 +14369 +41890 +43462 +683 +1112 +2566 +43463 +19 +41890 +31603 +41890 +590 +28923 +1051 +30576 +8160 +41890 +12445 +41890 +43464 +89 +1085 +41639 +25281 +13907 +43465 +43466 +7107 +1090 +36268 +43467 +43468 +27185 +41890 +5188 +590 +23103 +4242 +43469 +41890 +43470 +6874 +989 +43471 +28317 +5409 +43472 +25584 +43473 +736 +43474 +43475 +43476 +590 +27669 +651 +28845 +41890 +41890 +16466 +43477 +1090 +18045 +43478 +27719 +41890 +41890 +19 +41890 +573 +3317 +2434 +34706 +41890 +1021 +20700 +41890 +7553 +9 +43479 +16375 +41890 +942 +43480 +41890 +43481 +24303 +26040 +1090 +41890 +30762 +43482 +29483 +43483 +40570 +16640 +20941 +41890 +58 +41890 +43484 +397 +14330 +43485 +9 +41890 +19 +41890 +43486 +28845 +41890 +43487 +491 +19545 +41890 +43488 +41890 +30805 +41890 +15718 +43489 +1742 +41890 +25943 +40893 +41890 +36366 +1529 +43490 +23975 +43491 +3601 +41890 +39709 +19091 +21947 +41890 +43492 +41890 +43493 +43494 +3 +8670 +41890 +137 +705 +43495 +43496 +43497 +41890 +43498 +10 +34402 +20677 +137 +43499 +43500 +5243 +613 +41890 +43501 +41890 +43502 +43503 +32188 +30051 +41890 +9160 +41890 +43504 +20677 +15718 +41890 +39746 +590 +1049 +41890 +43505 +43506 +140 +41890 +40570 +43507 +43 +43508 +25943 +41890 +14369 +43509 +41890 +43510 +41890 +33442 +41890 +15718 +43511 +20442 +43512 +4 +30580 +16974 +41890 +43513 +43514 +43515 +29483 +43516 +519 +19095 +590 +11572 +41890 +43517 +15700 +13390 +5045 +43518 +40570 +43519 +43520 +464 +29483 +28897 +41890 +1107 +2289 +43521 +7048 +41890 +43522 +5679 +41890 +10360 +33541 +40605 +33510 +1224 +3 +40939 +43249 +28845 +827 +554 +590 +31293 +8919 +1316 +590 +43523 +19618 +43524 +43525 +4055 +43526 +3484 +41890 +43527 +16375 +43528 +38465 +377 +213 +1384 +21947 +29483 +41890 +213 +29381 +590 +43 +213 +13279 +8338 +14369 +43 +34433 +41890 +16 +155 +26229 +41919 +21669 +1566 +29200 +6595 +26496 +2694 +43529 +23805 +18863 +7854 +34641 +43530 +284 +28036 +43531 +41890 +41890 +43532 +43533 +43534 +43 +284 +25237 +43535 +38758 +43536 +155 +590 +23469 +41890 +8668 +5071 +41890 +303 +21947 +43537 +21053 +41890 +15718 +40570 +43538 +41890 +19 +43539 +41890 +1011 +41890 +1870 +2561 +8668 +1112 +41890 +6732 +707 +41890 +41890 +8392 +43540 +19 +248 +43541 +43542 +43543 +41904 +826 +14330 +3323 +43544 +10030 +416 +2040 +303 +43545 +41890 +76 +43546 +99 +5075 +19 +30224 +5650 +736 +4116 +41890 +40570 +43547 +213 +43548 +10869 +43549 +4196 +19 +99 +43550 +13390 +337 +1224 +41890 +213 +9446 +2406 +164 +590 +284 +89 +16707 +303 +140 +43551 +41890 +38 +43552 +43347 +13959 +10176 +16798 +1870 +41890 +10306 +21803 +15718 +9 +317 +19 +41890 +43553 +3 +41890 +24303 +43554 +21947 +464 +43555 +28441 +41890 +41890 +41890 +284 +43556 +250 +19 +213 +41890 +43557 +43486 +43558 +21947 +41890 +43559 +41890 +31293 +29483 +43560 +1812 +31168 +2655 +43561 +43562 +43 +2550 +22 +41890 +9 +27798 +43563 +43 +41890 +30877 +43564 +43565 +41890 +41117 +337 +303 +284 +1648 +284 +40570 +40570 +29483 +1592 +41890 +41890 +43566 +736 +43567 +41890 +15720 +43568 +248 +248 +491 +43108 +38310 +43569 +43570 +46 +15 +41890 +20 +14957 +1517 +337 +43571 +43572 +213 +28845 +25140 +41890 +9 +43573 +41890 +14420 +43574 +43575 +43576 +43577 +15720 +41890 +40570 +41890 +41890 +15831 +7053 +26496 +736 +284 +41890 +213 +27669 +38465 +41890 +43578 +41890 +41890 +225 +41890 +41890 +43256 +27656 +43579 +41890 +37790 +43580 +36218 +41890 +43581 +37961 +14369 +43582 +43583 +17869 +43584 +209 +39709 +213 +213 +29483 +40570 +43585 +43586 +7868 +43587 +36452 +29483 +16466 +41890 +259 +43588 +303 +284 +21947 +41890 +15718 +15718 +43 +1364 +41890 +11273 +9696 +21947 +33650 +10946 +31168 +43589 +43590 +3033 +57 +29204 +43591 +284 +41890 +4414 +140 +41622 +14330 +576 +43580 +7855 +19 +402 +1514 +5409 +43592 +43593 +43594 +213 +13807 +14603 +41890 +43595 +5085 +43596 +43597 +43598 +43599 +188 +43600 +43601 +35351 +40825 +43602 +28845 +29483 +713 +41890 +41890 +25605 +1524 +31293 +14102 +849 +43347 +41890 +43603 +13307 +41890 +3172 +827 +2919 +66 +41890 +43604 +38072 +40570 +42511 +9 +349 +317 +39709 +41890 +19695 +43605 +41890 +24303 +43606 +533 +41890 +1338 +41919 +43607 +5119 +43608 +43609 +41890 +40570 +16437 +18045 +1224 +41890 +40570 +25316 +41890 +6499 +57 +43610 +29483 +43611 +21947 +41890 +15718 +31293 +41919 +827 +43612 +4441 +36639 +13703 +43613 +155 +10389 +43614 +138 +140 +33650 +43615 +37338 +20340 +43 +43616 +4055 +1090 +178 +14693 +42290 +43617 +14603 +3 +3994 +140 +21669 +1991 +2728 +43618 +58 +43619 +30877 +9305 +2988 +43620 +1522 +2471 +43621 +43622 +43623 +1082 +41890 +7716 +29381 +15 +25316 +13150 +43624 +43625 +1018 +2008 +590 +38141 +41890 +21947 +18816 +43626 +8210 +4055 +40570 +34264 +323 +43627 +28549 +14330 +248 +43628 +41890 +43629 +41890 +41890 +41890 +34402 +40570 +1139 +28845 +41890 +43630 +41890 +43574 +2733 +18856 +41890 +41919 +155 +43631 +43632 +24725 +33569 +6441 +28845 +43633 +15 +861 +41890 +25237 +41890 +30209 +24662 +248 +349 +17385 +40570 +43634 +720 +15 +41890 +354 +43 +872 +13390 +41890 +43635 +1107 +6335 +10946 +213 +20087 +43636 +10946 +43637 +2804 +248 +43638 +43639 +22900 +43640 +43641 +13390 +43642 +43643 +2314 +41890 +13721 +10946 +43644 +28845 +2310 +8208 +43645 +11321 +43646 +43647 +5614 +8868 +21947 +1606 +12987 +43648 +43649 +41890 +15 +28845 +40570 +43650 +33650 +9 +43651 +7486 +14477 +43652 +14342 +24045 +43653 +6874 +43654 +4631 +43655 +248 +24864 +41890 +16367 +1584 +650 +14604 +41890 +5409 +27447 +43656 +43657 +3055 +43658 +19 +43 +15572 +27836 +41890 +41890 +8460 +41890 +43659 +14330 +21947 +284 +21669 +25237 +40570 +179 +1042 +33627 +34339 +21089 +41890 +41890 +33024 +43660 +354 +43661 +1870 +40591 +22 +41890 +43662 +43663 +38789 +738 +41919 +1905 +37556 +41890 +14369 +337 +590 +43664 +43665 +43666 +43667 +915 +43668 +9 +18956 +28845 +19046 +4344 +43669 +25 +39709 +43670 +9 +1157 +5780 +41890 +228 +14369 +43671 +25 +2310 +43672 +24908 +41890 +43673 +41890 +590 +5188 +915 +43674 +337 +43675 +41890 +41890 +1090 +43676 +31293 +590 +43 +4055 +33627 +36072 +337 +43677 +43678 +3078 +43679 +15 +43680 +41890 +43681 +337 +41890 +43 +41890 +7912 +40570 +40570 +36218 +29172 +43 +40570 +736 +24144 +4055 +41890 +19740 +590 +7360 +337 +554 +213 +865 +33109 +13390 +43682 +27719 +19 +4658 +9 +43683 +694 +23395 +43684 +14102 +7501 +31293 +43685 +41890 +43686 +10946 +41890 +43687 +4518 +43688 +43689 +41890 +41471 +7881 +43690 +15718 +1090 +43691 +41890 +11822 +14921 +43692 +14369 +11471 +43693 +43694 +43695 +41890 +43696 +337 +43697 +41890 +43698 +43699 +13215 +19 +41890 +41890 +41890 +41890 +41890 +43700 +13390 +43701 +19 +43702 +41890 +278 +1010 +6341 +5392 +213 +16437 +176 +26503 +34402 +24338 +43703 +677 +43704 +43705 +40570 +1765 +19918 +43706 +41890 +43707 +32332 +2415 +43708 +43709 +43108 +43710 +16437 +40570 +416 +43711 +9741 +41890 +43712 +28441 +43713 +43714 +43715 +7914 +41890 +43716 +43717 +4764 +15 +24303 +43718 +43719 +43720 +40570 +19 +12 +9233 +3 +1774 +43721 +41890 +41890 +19 +19 +43722 +5601 +19 +43723 +43724 +40591 +14086 +5119 +43725 +43726 +43727 +41890 +1090 +43728 +1716 +598 +19 +23103 +43729 +29381 +41890 +484 +4055 +41890 +43730 +41890 +2135 +30835 +43731 +533 +14330 +41890 +41890 +41890 +31293 +43732 +43733 +24144 +41890 +29381 +40570 +43734 +25683 +43 +6341 +4684 +14369 +32429 +30479 +194 +7516 +1090 +41890 +41890 +43735 +41890 +43736 +43737 +43738 +3709 +31168 +671 +25316 +958 +31603 +303 +38595 +41890 +43739 +40881 +3601 +20941 +21947 +491 +1524 +43740 +43741 +43742 +8668 +4364 +14266 +43743 +9 +43744 +155 +3858 +14620 +872 +25426 +41890 +590 +21669 +14477 +416 +19167 +15718 +12118 +14330 +30209 +4808 +43745 +24144 +1720 +33469 +22294 +37556 +43746 +43747 +398 +43 +41890 +43748 +19 +3772 +398 +29483 +5877 +8367 +43749 +36177 +43750 +43751 +28549 +15 +21903 +41890 +43752 +28036 +41305 +10946 +30224 +9 +42421 +2764 +41890 +41687 +21947 +41890 +41890 +28199 +20514 +41890 +25140 +43753 +33650 +5188 +1330 +3978 +37556 +29483 +790 +21026 +34402 +29483 +43754 +2085 +36333 +1090 +41890 +21669 +32642 +34402 +32925 +40570 +43755 +21669 +40570 +12 +43756 +43757 +2697 +43758 +286 +155 +35838 +19 +5085 +43759 +43760 +39709 +41890 +9688 +33496 +40570 +3 +4075 +41890 +43761 +43762 +19 +201 +21947 +15 +41890 +1090 +9696 +16443 +25140 +43763 +36328 +21947 +9 +41890 +43120 +21669 +1090 +43764 +103 +29483 +17943 +41890 +41890 +31041 +4764 +41890 +43765 +98 +41890 +8994 +41890 +33650 +1451 +713 +26744 +41890 +5582 +43766 +23518 +43767 +43768 +43769 +43770 +35224 +1172 +28845 +41890 +43771 +43772 +8512 +590 +19618 +43773 +43774 +24678 +352 +155 +26496 +35246 +19 +43775 +41890 +140 +6877 +1090 +5438 +43776 +46 +1615 +14330 +42000 +41890 +43777 +66 +155 +43 +43778 +43779 +43780 +37556 +354 +19472 +39709 +43781 +28845 +20497 +43782 +41890 +16443 +155 +15 +43783 +9460 +43 +43784 +41890 +21947 +43785 +43786 +25627 +10946 +590 +43787 +43788 +43 +43789 +14369 +43790 +24303 +249 +32410 +28845 +43791 +25 +43792 +28441 +43793 +713 +19 +26320 +43794 +30877 +37556 +43795 +28599 +43796 +20600 +43797 +20442 +92 +1905 +43798 +17338 +41890 +3553 +36921 +43799 +1481 +35224 +28441 +8392 +41890 +14604 +43800 +1768 +15718 +43801 +4245 +112 +41890 +11420 +32402 +41890 +43802 +43803 +43804 +30902 +2882 +14102 +43805 +43806 +43807 +32410 +19579 +43808 +155 +43809 +1907 +19 +25683 +14025 +43810 +9 +43811 +40570 +41890 +43812 +43338 +323 +41890 +41890 +43 +28845 +14562 +41890 +9364 +43813 +40570 +12629 +43814 +21251 +43815 +41567 +989 +43816 +19 +4050 +37364 +15718 +43817 +42741 +43818 +25407 +43819 +43820 +43821 +40570 +41890 +40570 +3546 +736 +590 +41890 +43822 +36735 +17911 +43823 +40570 +155 +40591 +34402 +31098 +14330 +33650 +41890 +1961 +826 +2 +259 +18334 +41890 +33278 +43486 +41890 +41890 +43824 +17675 +21669 +345 +43825 +1109 +41890 +43826 +43827 +14961 +43828 +43829 +43830 +31293 +35624 +31833 +43 +17898 +10946 +41890 +21947 +43831 +16618 +43832 +910 +43833 +43834 +9011 +13528 +43835 +345 +43836 +40439 +43837 +303 +34402 +4897 +303 +43838 +43839 +1051 +1853 +36268 +10946 +18045 +43840 +21947 +32 +29126 +41919 +43841 +9696 +43 +43842 +41890 +41890 +36218 +43843 +30224 +43844 +43845 +15 +43846 +27669 +43847 +43 +41890 +43848 +41890 +2971 +43849 +41890 +349 +42000 +41890 +36054 +41890 +41890 +41890 +43850 +1356 +342 +13482 +29483 +43851 +9 +823 +26361 +554 +5188 +43852 +41890 +41919 +41890 +590 +37888 +41890 +40570 +11683 +43853 +43854 +17670 +21947 +41890 +25624 +35025 +34181 +15766 +41890 +43855 +34 +19 +41890 +43856 +41890 +43857 +21027 +5409 +3994 +155 +4144 +43858 +16 +28845 +11754 +43859 +43860 +41890 +40570 +6165 +29483 +6766 +4108 +43861 +349 +43862 +576 +43863 +37556 +41890 +41890 +41890 +41890 +43 +41890 +15718 +43864 +5904 +342 +15158 +43865 +43866 +9 +43867 +33650 +27157 +41890 +155 +14369 +16437 +29381 +1011 +41890 +41890 +22620 +43868 +41890 +29483 +40570 +4055 +43869 +6400 +34402 +373 +41890 +41890 +43870 +27848 +43871 +40570 +43872 +41890 +41890 +155 +1100 +43873 +43874 +41890 +16466 +21669 +43875 +323 +43876 +43 +4683 +41890 +41890 +2164 +41890 +249 +910 +43877 +37790 +40570 +19 +349 +155 +43878 +43879 +26404 +19 +1385 +155 +15718 +43880 +29483 +41890 +5085 +31041 +590 +41890 +43881 +22065 +46 +41890 +43882 +23603 +41890 +43883 +19655 +43884 +4439 +43885 +43886 +43887 +40570 +43888 +41890 +43889 +36131 +43890 +41890 +14240 +1245 +41890 +1051 +43891 +43892 +43893 +417 +20308 +41890 +24896 +41890 +188 +29483 +43894 +43895 +43896 +1870 +3944 +43108 +155 +6439 +29628 +41890 +41890 +38 +21027 +33445 +19618 +155 +43897 +43347 +43898 +554 +23815 +41890 +19 +43899 +41890 +17151 +707 +43900 +43901 +43902 +1502 +18846 +43903 +43904 +28549 +43905 +115 +43906 +98 +3317 +1406 +37556 +40570 +1168 +16205 +43907 +42252 +43908 +41890 +533 +2919 +43909 +590 +13390 +43910 +41890 +41890 +43911 +26361 +41890 +19847 +89 +43912 +17911 +1364 +19 +43913 +43914 +3601 +13390 +46 +43915 +39709 +43916 +41890 +31168 +43917 +43918 +28317 +809 +57 +25943 +43919 +1453 +29381 +1011 +9 +43920 +1847 +354 +41890 +41890 +43921 +41890 +40570 +19206 +140 +2197 +43922 +5045 +16277 +43923 +19 +14962 +43924 +41919 +32646 +43362 +43925 +16413 +822 +4124 +19 +43926 +41890 +19 +1562 +2129 +25088 +41890 +10031 +43927 +2919 +43928 +43929 +41890 +10946 +33650 +41890 +176 +43550 +29204 +41890 +43930 +43931 +43932 +43933 +43934 +19 +41890 +155 +39588 +41890 +43935 +9 +41890 +9 +19582 +15824 +43936 +43937 +43938 +14477 +41890 +43939 +41890 +1502 +13228 +1172 +37556 +43940 +41919 +19 +43941 +43942 +730 +43 +43943 +1382 +20215 +28317 +25237 +6496 +43944 +40570 +43 +43945 +43946 +13721 +43947 +4288 +43948 +43949 +43950 +595 +6096 +41890 +41890 +42624 +43951 +41890 +554 +43952 +28845 +3432 +5188 +43338 +40570 +43953 +34402 +43954 +1090 +590 +958 +43955 +43956 +34903 +43957 +43958 +7658 +41890 +43959 +43960 +43961 +8685 +21973 +14477 +43962 +2787 +43963 +1615 +43964 +8668 +39709 +3601 +40570 +887 +24725 +41890 +3908 +43965 +31293 +4 +43 +315 +28845 +42483 +29381 +528 +15 +9497 +43966 +43967 +14660 +43968 +41890 +46 +43969 +43970 +1082 +4550 +24864 +41890 +554 +24864 +34402 +613 +16991 +41890 +40570 +20 +17151 +43971 +398 +25237 +1112 +40570 +1870 +31293 +590 +43972 +43973 +3491 +25973 +20677 +22804 +34402 +41890 +7522 +11751 +597 +43974 +40903 +2287 +31873 +19 +19655 +7379 +43975 +41890 +19 +14947 +19995 +43976 +5949 +15718 +37556 +40570 +185 +89 +43977 +24303 +43978 +2998 +43 +12553 +736 +23103 +12013 +43979 +42067 +4941 +41890 +20677 +30224 +43980 +1310 +1716 +14330 +43981 +43982 +29977 +31293 +34444 +18804 +29200 +43983 +2136 +41890 +2944 +41890 +736 +40591 +41890 +15718 +30224 +41890 +155 +41890 +41890 +43984 +41890 +21947 +43108 +43985 +736 +41890 +33627 +178 +41890 +5970 +43986 +43987 +15629 +41890 +43988 +540 +29483 +19 +43989 +43 +43990 +16437 +24324 +41890 +41890 +43991 +7053 +30972 +28845 +4301 +14887 +6272 +66 +43550 +43992 +28845 +29483 +43993 +358 +34 +4055 +7407 +41890 +179 +13405 +43994 +41919 +43995 +43996 +25 +43997 +43998 +43999 +31293 +28845 +44000 +377 +40570 +15 +44001 +44002 +2181 +37556 +2591 +4055 +44003 +41890 +24324 +41890 +44004 +13959 +22290 +41890 +41890 +17257 +677 +1680 +44005 +19 +5409 +40498 +1364 +22 +44006 +590 +4413 +44007 +28845 +44008 +29483 +2694 +44009 +20700 +41890 +43 +19 +44010 +28845 +41890 +44011 +44012 +46 +44013 +44014 +2770 +41890 +41687 +14527 +1820 +29387 +155 +41890 +554 +13390 +14504 +15461 +41890 +14869 +44015 +44016 +19579 +41890 +41890 +2728 +1605 +44017 +590 +4055 +40570 +1090 +43 +44018 +2577 +44019 +41919 +823 +44020 +44021 +1090 +2314 +41890 +6121 +21972 +40027 +155 +4174 +4055 +33141 +44022 +44023 +153 +43 +44024 +30224 +32696 +44025 +28772 +44026 +12875 +7379 +6480 +44027 +43550 +398 +44028 +28845 +12560 +14330 +10727 +12588 +44029 +33061 +28845 +44030 +11762 +590 +10614 +44031 +41890 +10946 +44032 +2029 +554 +44033 +24195 +20700 +41890 +44034 +44035 +44036 +44037 +9 +155 +9 +495 +44038 +34264 +30224 +40591 +20105 +3655 +46 +44039 +44040 +21947 +41919 +20304 +44041 +44042 +43442 +44043 +58 +12067 +1745 +104 +44044 +41890 +2804 +21947 +30224 +44045 +41890 +44046 +16 +155 +8357 +19020 +21669 +40570 +41890 +14369 +31150 +827 +44047 +44048 +41890 +44049 +44050 +495 +44051 +1021 +44052 +28845 +6612 +42000 +44053 +41890 +155 +40591 +6058 +44054 +8226 +25 +439 +12987 +41890 +44055 +41890 +228 +25624 +41890 +44056 +4055 +44057 +67 +41890 +7208 +44058 +10961 +43 +44059 +41890 +41890 +13897 +31168 +44060 +44061 +41890 +44062 +41890 +44063 +44064 +43990 +44065 +38033 +25237 +4364 +3844 +38235 +43 +10642 +1384 +44066 +21669 +2762 +44067 +44068 +19 +4426 +28295 +1688 +44069 +279 +751 +44070 +44071 +354 +25237 +5601 +44072 +33650 +38113 +42421 +37556 +140 +41890 +586 +41890 +44073 +24303 +44074 +13570 +5085 +44075 +1870 +44076 +41890 +44077 +1716 +4124 +1961 +44078 +30051 +19 +44079 +44080 +6726 +2577 +197 +41890 +44081 +9 +44082 +44083 +41890 +41890 +18327 +44084 +43 +721 +10147 +44085 +44086 +32 +44087 +13154 +2724 +44088 +10407 +955 +41890 +17143 +19 +41890 +1684 +35498 +44089 +286 +43 +44090 +41890 +590 +18742 +40570 +32 +274 +44091 +19 +44092 +9 +44093 +44094 +44095 +41890 +274 +22 +345 +44096 +590 +41890 +31293 +6728 +44097 +21947 +1011 +286 +40570 +41890 +34402 +44098 +44099 +40570 +42483 +1172 +44100 +44101 +44102 +155 +19 +44103 +35260 +44104 +44105 +9674 +41890 +14404 +30724 +42406 +13721 +40570 +29204 +25237 +2043 +20374 +13539 +41890 +44106 +17 +29381 +21947 +41890 +44107 +9 +28845 +1779 +44108 +44109 +44110 +41687 +41890 +44111 +590 +613 +43 +31293 +41890 +25237 +30580 +44112 +44113 +13390 +20941 +43347 +41890 +13721 +41890 +66 +44114 +20339 +34025 +44115 +37556 +41890 +35832 +39911 +44116 +24864 +41890 +9 +3050 +41890 +25316 +2009 +44117 +44118 +40658 +22512 +104 +15 +41890 +40570 +446 +44119 +34402 +44120 +14369 +44121 +6251 +44122 +3553 +1189 +44123 +34402 +2314 +44124 +915 +39536 +44125 +10946 +4 +44126 +41890 +19398 +43651 +10313 +46 +41890 +15104 +19618 +1817 +44127 +44128 +57 +40570 +21669 +13390 +703 +20 +24324 +44129 +57 +590 +42416 +41890 +15914 +30224 +44130 +44131 +2999 +31852 +44132 +23814 +44133 +590 +349 +9163 +209 +887 +44134 +795 +44135 +3546 +155 +1224 +44136 +44137 +1364 +4547 +317 +399 +14477 +40570 +1090 +5085 +41890 +44138 +44139 +149 +24410 +44140 +2764 +13390 +30224 +44141 +44142 +44143 +14013 +21947 +16 +16413 +14342 +31293 +44144 +9 +44145 +44146 +44147 +15718 +20443 +57 +44148 +43 +2029 +44149 +21947 +9 +44150 +20600 +44151 +44152 +34402 +1508 +29483 +21947 +29381 +44153 +17320 +1011 +590 +23150 +377 +155 +1090 +33650 +44154 +1562 +595 +40570 +44155 +24324 +44156 +590 +24454 +24664 +176 +44157 +665 +44158 +11647 +872 +8721 +1743 +590 +41890 +41890 +736 +44159 +44160 +989 +2253 +19618 +41890 +44161 +44162 +2488 +671 +10 +44163 +16437 +17911 +12214 +590 +4387 +43550 +31293 +60 +44164 +3323 +21947 +155 +41919 +590 +44165 +1508 +44166 +25237 +155 +44167 +44168 +1956 +13390 +44169 +41890 +823 +20 +41890 +44170 +43 +44171 +14 +19576 +770 +44172 +21947 +1716 +44173 +44174 +44175 +32 +44176 +3417 +44177 +6095 +4403 +185 +14369 +590 +41890 +9922 +1648 +44178 +5925 +358 +16024 +552 +41890 +44179 +44180 +352 +28845 +43550 +5990 +2410 +44181 +18982 +349 +44182 +845 +1013 +25140 +41890 +44183 +44184 +4 +21227 +2410 +44185 +15718 +1716 +44186 +44187 +44188 +11263 +44189 +41890 +10482 +44190 +44191 +155 +40591 +27719 +41890 +1710 +44192 +44193 +43 +44194 +41890 +13721 +10946 +14947 +541 +6218 +41728 +20 +44195 +44196 +44197 +416 +44198 +41890 +44199 +25316 +43365 +31873 +4293 +46 +24102 +16437 +44200 +41890 +29628 +142 +44201 +40570 +24058 +44202 +29483 +44203 +14869 +44204 +41890 +44205 +44206 +40996 +590 +44207 +40570 +44208 +41890 +2649 +5662 +155 +46 +140 +44209 +43005 +19451 +43 +44210 +910 +44211 +44212 +2804 +15 +42421 +28845 +9435 +1606 +9 +25316 +44213 +18176 +44214 +28480 +44215 +821 +5865 +9 +44216 +5627 +138 +14477 +21947 +35318 +20823 +363 +37556 +44217 +40570 +9 +707 +3422 +9 +39295 +44218 +66 +44219 +28845 +44220 +22124 +21947 +6847 +19 +44221 +44222 +44223 +1090 +18711 +44224 +155 +40570 +179 +44225 +44226 +12 +15993 +44227 +44228 +590 +22 +4965 +44229 +44230 +44231 +44232 +44233 +590 +5169 +21947 +12000 +44234 +23103 +665 +44235 +44236 +41890 +44237 +29007 +1559 +1051 +6207 +2476 +44238 +1090 +2260 +7553 +12321 +44239 +44240 +41890 +16437 +44241 +18798 +44242 +43550 +3844 +40570 +41075 +283 +7896 +1991 +44243 +9682 +115 +19 +44244 +44245 +2728 +887 +1889 +3484 +44246 +44247 +44248 +44249 +44250 +44251 +15 +44252 +31293 +44253 +11192 +19 +576 +44254 +25943 +44255 +44256 +14477 +44257 +40570 +590 +46 +317 +13150 +44258 +1786 +17635 +30224 +25555 +19794 +44259 +44260 +44261 +44262 +44263 +77 +44264 +9 +2672 +44265 +44266 +38461 +44267 +15997 +44268 +2591 +28549 +44269 +14660 +40012 +3626 +44270 +31098 +40570 +15989 +1090 +40570 +41434 +31293 +915 +44271 +44272 +554 +44273 +155 +19 +3291 +44274 +44275 +43 +44276 +44277 +36736 +44278 +42746 +44279 +8826 +9967 +41660 +44280 +861 +5803 +5601 +44281 +1090 +40570 +357 +30224 +17932 +19 +44282 +41890 +27293 +44283 +7048 +44284 +25237 +11963 +44285 +21669 +590 +44286 +44211 +484 +25237 +44287 +99 +40570 +155 +24725 +1364 +30551 +28031 +17048 +44288 +44289 +44290 +44291 +21669 +44292 +18045 +22850 +31293 +38021 +44293 +40591 +40570 +44294 +38308 +38033 +19 +28845 +155 +25 +590 +44295 +44296 +9 +44297 +27855 +44298 +43290 +44299 +25943 +40570 +27669 +44300 +228 +40570 +1090 +590 +286 +4055 +44301 +4033 +44302 +495 +14477 +44303 +12377 +16437 +42483 +28845 +8548 +345 +36735 +16281 +10960 +40570 +1090 +590 +345 +44304 +32105 +28845 +44305 +12255 +43550 +18627 +25237 +57 +827 +29483 +44306 +44307 +1295 +40570 +1090 +5780 +40570 +44308 +32 +44309 +15718 +44249 +155 +22317 +24144 +13803 +29204 +44310 +25683 +19 +823 +44311 +34602 +14369 +30051 +41890 +19167 +41890 +44312 +44313 +44314 +44315 +1991 +9 +44316 +44317 +44318 +44319 +155 +29424 +19 +3252 +44320 +259 +44321 +41890 +24303 +44322 +41890 +4432 +40570 +25584 +44323 +14852 +155 +44324 +44325 +43848 +29483 +21947 +30877 +4299 +1812 +32 +1316 +155 +22234 +8616 +89 +31400 +34337 +25683 +36218 +15 +38758 +44326 +155 +44327 +44328 +44329 +44330 +4856 +41890 +40893 +770 +155 +36268 +44331 +519 +26744 +590 +27669 +44332 +37556 +15 +44333 +41890 +44334 +1385 +40570 +41890 +44335 +286 +23585 +41890 +46 +32 +44336 +44337 +36735 +2136 +1310 +44338 +873 +2514 +29628 +21669 +44339 +44340 +89 +22065 +44341 +1559 +44342 +44343 +1247 +3343 +15498 +11472 +720 +19 +44344 +44345 +38465 +5780 +2043 +41890 +9 +14330 +8670 +44346 +25683 +22463 +44347 +15 +44348 +44349 +10117 +1514 +2410 +4693 +44350 +20514 +44351 +3484 +11762 +15 +5071 +24207 +44352 +7835 +29956 +1224 +29629 +23853 +44353 +44354 +21947 +5409 +11321 +514 +40570 +28961 +44355 +4684 +1100 +590 +18054 +12722 +44356 +18310 +446 +20781 +44357 +2694 +37556 +3328 +42483 +18310 +44358 +25943 +31293 +40570 +18453 +29628 +44359 +15718 +2865 +33295 +44360 +19 +66 +33380 +44361 +9 +415 +1559 +43 +99 +43550 +40570 +37556 +44362 +44363 +1385 +12987 +41890 +40990 +44364 +44342 +44365 +43 +42746 +46 +44366 +44367 +34402 +21689 +44368 +15 +279 +590 +23593 +18120 +14001 +9 +40570 +12151 +44369 +44370 +28845 +155 +155 +28295 +44371 +41890 +19 +15 +19837 +597 +13361 +58 +705 +44372 +44373 +41890 +34402 +31168 +415 +15718 +590 +936 +44374 +29483 +20280 +17911 +1520 +44375 +8668 +379 +40251 +44376 +34951 +33627 +44377 +9337 +23368 +3638 +33693 +34944 +9900 +16437 +590 +30224 +44378 +29483 +9 +5627 +44379 +41890 +44380 +44381 +2622 +34364 +44382 +2260 +44383 +24864 +44384 +17782 +44385 +3858 +764 +20052 +40073 +24207 +7353 +41890 +14660 +44386 +22570 +2804 +2724 +41919 +44387 +44388 +9095 +32275 +19 +77 +574 +15471 +44389 +7743 +185 +8668 +44390 +44391 +15718 +2865 +44392 +155 +44393 +13390 +31293 +20 +44394 +533 +14276 +44395 +44396 +44397 +12047 +44398 +44399 +44400 +44401 +42390 +15018 +2449 +44402 +1536 +36461 +44403 +15718 +44404 +40570 +44405 +1011 +33141 +44406 +24864 +44407 +30650 +44408 +23103 +44409 +44249 +44410 +22154 +13139 +12191 +44411 +40143 +41890 +44412 +44413 +43939 +41890 +31293 +1330 +44414 +155 +155 +33693 +44415 +44249 +38179 +41890 +2015 +44416 +19 +44417 +2832 +1720 +44418 +5769 +44419 +5409 +9662 +5780 +3317 +44420 +29400 +44421 +41890 +25584 +44422 +44423 +155 +178 +19 +339 +44424 +44425 +155 +6766 +39709 +44426 +44427 +44428 +39 +590 +6364 +37355 +44429 +44430 +40570 +30224 +1961 +44431 +736 +44432 +27798 +89 +1961 +514 +412 +3330 +31293 +5601 +44433 +8005 +44434 +21947 +590 +44435 +17507 +32410 +736 +33627 +44436 +44437 +28845 +44438 +2832 +19 +44439 +44440 +13570 +21947 +14477 +43 +155 +44441 +14017 +16074 +9 +44442 +44443 +25 +44444 +44445 +40570 +44446 +9567 +15384 +44447 +26585 +8668 +19 +44448 +44449 +21045 +42483 +42421 +155 +2601 +17 +44450 +9440 +19 +44451 +831 +40570 +17790 +40570 +16437 +12987 +28845 +44452 +44453 +44454 +495 +39783 +20113 +42962 +37556 +9 +44455 +480 +14369 +44456 +19 +19655 +677 +29483 +2314 +15824 +44457 +736 +44458 +19 +44459 +30224 +44460 +35656 +16466 +4518 +21276 +25829 +4502 +44461 +44462 +6620 +44463 +44464 +44465 +14770 +165 +44466 +19 +736 +142 +23670 +590 +554 +41567 +28845 +41919 +892 +44467 +44468 +34319 +44469 +44470 +9 +2287 +12987 +28212 +140 +40570 +24864 +44471 +44472 +701 +694 +1021 +43998 +35224 +1208 +14369 +23477 +44473 +41265 +44474 +44475 +44476 +38937 +12987 +2287 +41567 +3509 +19618 +41890 +17247 +31293 +19 +31098 +44477 +44478 +9 +4055 +286 +4055 +44479 +4463 +713 +44480 +16839 +44481 +44482 +20 +17 +6217 +10946 +11995 +24303 +44483 +44484 +21947 +1716 +44485 +21947 +1364 +4055 +14102 +790 +736 +44486 +44487 +317 +44488 +9 +17911 +155 +44489 +44490 +1901 +44491 +44492 +44493 +7313 +31293 +25983 +44494 +44495 +21089 +38465 +5085 +1561 +2410 +11621 +31293 +44496 +44497 +3759 +44358 +31168 +44498 +44328 +402 +20 +31293 +44499 +44500 +40472 +23103 +28845 +36737 +44501 +597 +42237 +44502 +44503 +44504 +43280 +4055 +44505 +7522 +40570 +28961 +25237 +349 +317 +7964 +34181 +44506 +44507 +373 +2537 +9543 +17691 +31293 +21947 +39593 +415 +5912 +197 +44508 +554 +40570 +352 +22990 +29200 +25683 +9020 +28317 +14330 +590 +44509 +377 +2009 +3874 +36735 +541 +5963 +18751 +13390 +650 +19655 +38033 +345 +44510 +37232 +1710 +37588 +19 +44511 +3598 +44512 +155 +44513 +44514 +41890 +17911 +28845 +44515 +44516 +44517 +44518 +9060 +24324 +21689 +43 +44519 +18169 +44520 +44521 +2537 +99 +44522 +44523 +703 +44524 +140 +25 +2347 +1442 +14477 +4055 +44525 +22684 +39520 +13390 +44526 +44527 +31293 +1047 +15718 +25620 +19618 +36735 +40570 +37808 +40289 +18919 +2460 +44528 +26081 +40311 +44529 +1157 +29047 +44530 +44531 +1900 +44532 +41919 +66 +14477 +44533 +44534 +15718 +44535 +39410 +345 +19 +14660 +44536 +44537 +38550 +44538 +44539 +19655 +568 +13255 +209 +44540 +1090 +44541 +43 +89 +41919 +17911 +272 +10982 +9 +24896 +44542 +16707 +2314 +9 +44543 +30209 +15718 +43 +43 +23103 +44544 +13848 +14369 +44545 +28845 +44546 +354 +40570 +14477 +31293 +262 +58 +1684 +41919 +14369 +19 +44547 +6130 +3105 +21563 +26544 +7835 +10639 +44548 +44549 +44550 +3514 +40605 +3119 +44551 +18310 +44552 +12548 +25237 +155 +41117 +19 +44553 +44554 +44555 +43 +44556 +43108 +43550 +44557 +44558 +44559 +44560 +3995 +2356 +155 +44249 +18553 +590 +21045 +3732 +43651 +44561 +24896 +24303 +29381 +44562 +44563 +44564 +2476 +26680 +44565 +44566 +43 +9 +574 +12671 +36218 +30224 +44567 +44568 +14660 +34 +14079 +44569 +284 +303 +34032 +44570 +7516 +736 +37556 +1090 +20533 +751 +44571 +44572 +40570 +44573 +38596 +40570 +44574 +9460 +19618 +284 +25316 +44575 +40570 +3353 +5660 +44576 +24303 +44176 +28036 +7455 +40570 +213 +43 +46 +44577 +44578 +44579 +284 +3759 +5188 +28845 +34703 +44580 +44581 +44582 +30041 +44583 +44584 +28845 +89 +27669 +44585 +32644 +7053 +303 +44586 +44587 +20110 +43 +32 +28845 +25237 +595 +225 +5601 +337 +41919 +286 +27754 +1011 +7516 +823 +20458 +616 +6877 +28036 +213 +19 +213 +44588 +1912 +11286 +23528 +41868 +33650 +58 +43347 +2591 +44589 +12402 +44590 +213 +284 +248 +349 +44591 +201 +213 +44592 +19 +248 +31293 +303 +337 +286 +893 +18310 +14174 +15718 +694 +29483 +379 +303 +44593 +40570 +44594 +28845 +44595 +337 +284 +44596 +44597 +29757 +44598 +411 +44599 +19947 +44600 +18045 +44601 +4002 +44602 +44603 +8683 +44604 +337 +18951 +25237 +89 +284 +30230 +33650 +44605 +44606 +44607 +44608 +248 +44609 +44610 +18934 +16798 +14216 +955 +44611 +44612 +13576 +43550 +17872 +44613 +40570 +303 +44614 +11754 +2 +29483 +337 +44249 +713 +14660 +44615 +31650 +13543 +44616 +2356 +415 +44617 +25316 +19 +213 +12397 +44618 +9367 +31293 +44619 +6595 +23103 +9 +21947 +44620 +44621 +8362 +2762 +5085 +37556 +155 +44622 +20401 +21947 +27719 +43 +142 +44623 +28845 +44624 +1443 +1090 +16166 +36019 +19 +26452 +669 +44625 +44626 +736 +44627 +1021 +17810 +25316 +44537 +44628 +1247 +9217 +25935 +44629 +317 +77 +43 +22922 +259 +44630 +248 +15718 +7835 +44631 +30224 +44632 +44633 +43 +44634 +19 +16826 +44635 +44636 +44637 +31293 +2117 +736 +43 +37556 +40570 +40570 +44638 +303 +44639 +44640 +44641 +2577 +14363 +8849 +44642 +44643 +44644 +44645 +44646 +24864 +1481 +317 +14342 +736 +8732 +44647 +44648 +44649 +44650 +105 +44651 +41890 +397 +28845 +40570 +44652 +9 +155 +154 From ae784ebff963cb41ad1b7cdfc20630a30531bc6d Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 7 Oct 2016 10:09:54 -0400 Subject: [PATCH 272/412] [maven-release-plugin] prepare release JavaFastPFOR-0.1.10 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 65d6754..26b41dc 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.1.10-SNAPSHOT + 0.1.10 jar 1.6 From 044cd07d46f41e90747e687a90677aa19ec8aea3 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 7 Oct 2016 10:09:57 -0400 Subject: [PATCH 273/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 26b41dc..1ac9188 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.1.10 + 0.1.11-SNAPSHOT jar 1.6 From d8579079b1e38e46324e88b19cdae5336fa8a5a6 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 7 Oct 2016 10:14:17 -0400 Subject: [PATCH 274/412] Trimming imports. --- .../me/lemire/integercompression/ResourcedTest.java | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/test/java/me/lemire/integercompression/ResourcedTest.java b/src/test/java/me/lemire/integercompression/ResourcedTest.java index b4cb5aa..61b8e58 100644 --- a/src/test/java/me/lemire/integercompression/ResourcedTest.java +++ b/src/test/java/me/lemire/integercompression/ResourcedTest.java @@ -1,25 +1,14 @@ package me.lemire.integercompression; import java.util.ArrayList; -import java.util.Arrays; - -import me.lemire.integercompression.differential.Delta; -import me.lemire.integercompression.differential.IntegratedBinaryPacking; -import me.lemire.integercompression.differential.IntegratedByteIntegerCODEC; -import me.lemire.integercompression.differential.IntegratedComposition; import me.lemire.integercompression.differential.IntegratedIntCompressor; -import me.lemire.integercompression.differential.IntegratedIntegerCODEC; -import me.lemire.integercompression.differential.IntegratedVariableByte; import me.lemire.integercompression.differential.SkippableIntegratedIntegerCODEC; -import me.lemire.integercompression.differential.XorBinaryPacking; import java.io.BufferedReader; import java.io.File; import org.junit.Assert; import java.io.FileReader; import java.io.IOException; -import java.nio.file.*; -import java.util.stream.Stream; import org.junit.Test; From 8daf7e73b170d6af560a0cd00b18938d54eb8a93 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 25 Oct 2016 17:11:53 -0400 Subject: [PATCH 275/412] minor update --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index bc7a4aa..1f9c2e7 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,8 @@ Really simple usage: For more examples, see example.java or the examples folder. +JavaFastPFOR supports compressing and uncompressing data in chunks (e.g., see ``advancedExample`` in [https://github.com/lemire/JavaFastPFOR/blob/master/example.java#L185-L190](example.java)). + Some CODECs ("integrated codecs") assume that the integers are in sorted orders and use differential coding (they compress deltas). They can be found in the package me.lemire.integercompression.differential. From 1f00b8028b6bb022cde3a8720e7ba503b03d764f Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 25 Oct 2016 17:13:52 -0400 Subject: [PATCH 276/412] removing line marker --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1f9c2e7..98b5a0d 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ Really simple usage: For more examples, see example.java or the examples folder. -JavaFastPFOR supports compressing and uncompressing data in chunks (e.g., see ``advancedExample`` in [https://github.com/lemire/JavaFastPFOR/blob/master/example.java#L185-L190](example.java)). +JavaFastPFOR supports compressing and uncompressing data in chunks (e.g., see ``advancedExample`` in [https://github.com/lemire/JavaFastPFOR/blob/master/example.java](example.java)). Some CODECs ("integrated codecs") assume that the integers are in sorted orders and use differential coding (they compress deltas). From 80d95b4413c88f41c4365505c6b8eaddc682692d Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 19 Dec 2016 09:09:04 -0500 Subject: [PATCH 277/412] Upgrading jacoco --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1ac9188..7177854 100644 --- a/pom.xml +++ b/pom.xml @@ -129,7 +129,7 @@ org.jacoco jacoco-maven-plugin - 0.7.6.201602180812 + 0.7.8 com/kamikaze/pfordelta/* From 5846d86f72b1fb6bb97b7f8e405892e13095c497 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 21 Dec 2016 14:06:34 -0500 Subject: [PATCH 278/412] https://github.com/lemire/JavaFastPFOR/issues/38#issuecomment-268606648 --- src/main/java/me/lemire/integercompression/FastPFOR.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index bc9cbec..d31a4da 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -14,7 +14,7 @@ * This is a patching scheme designed for speed. * It encodes integers in blocks of integers within pages of * up to 65536 integers. Note that it is important, to get good - * compression and good performance, to use sizeable blocks (greater than 1024 integers). + * compression and good performance, to use sizeable arrays (greater than 1024 integers). * For arrays containing a number of integers that is not divisible by BLOCK_SIZE, you should use * it in conjunction with another CODEC: * From 32cb776ee66b13f0ee5f7a1cec1f3118875dd917 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 25 Jan 2017 16:54:11 -0500 Subject: [PATCH 279/412] Link to Pinot --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 98b5a0d..02b0fb8 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ This library can decompress integers at a rate of over 1.2 billions per second (4.5 GB/s). It is significantly faster than generic codecs (such as Snappy, LZ4 and so on) when compressing arrays of integers. +The library is used in [LinkedIn Pinot](https://github.com/linkedin/pinot), a realtime distributed OLAP datastore. Part of this library has been integrated in Parquet (http://parquet.io/). A modified version of the library is included in the search engine Terrier (http://terrier.org/). This libary is used by ClueWeb From 35fdd7249648ecae32140276fc73bd6ac33fe6ec Mon Sep 17 00:00:00 2001 From: Balz Date: Sun, 2 Apr 2017 16:44:27 -0700 Subject: [PATCH 280/412] Make direct buffer allocation optional This is a minor refactoring of all codecs that directly allocate Java `ByteBuffers`: instead of making a direct call to `ByteBuffer#allocate()`, the codec invokes a protected method `makeBuffer(size)`. This allows a user to subclass the codec and override the method to customize the buffer allocation. In particular, this enables users to use heap-buffers and/or buffer pooling. The latter is essential for reducing memory churn. In a JVM benchmark (not included) on some real-world data, this refactoring did not decrease performance. (Notice that dropping `final` from some classes does not stop the JVM from inlining, such as in [monomorphic callsites](https://shipilev.net/blog/2015/black-magic-method-dispatch/).) --- .../DeltaZigzagVariableByte.java | 15 +++++++++++++-- .../me/lemire/integercompression/FastPFOR.java | 15 +++++++++++++-- .../me/lemire/integercompression/FastPFOR128.java | 15 +++++++++++++-- .../lemire/integercompression/VariableByte.java | 12 +++++++++++- .../differential/IntegratedVariableByte.java | 14 ++++++++++++-- 5 files changed, 62 insertions(+), 9 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/DeltaZigzagVariableByte.java b/src/main/java/me/lemire/integercompression/DeltaZigzagVariableByte.java index 1988d47..4b2f896 100644 --- a/src/main/java/me/lemire/integercompression/DeltaZigzagVariableByte.java +++ b/src/main/java/me/lemire/integercompression/DeltaZigzagVariableByte.java @@ -13,7 +13,7 @@ * * @author MURAOKA Taro http://github.com/koron */ -public final class DeltaZigzagVariableByte implements IntegerCODEC { +public class DeltaZigzagVariableByte implements IntegerCODEC { @Override public String toString() { @@ -27,7 +27,7 @@ public void compress(int[] inBuf, IntWrapper inPos, int inLen, return; } - ByteBuffer byteBuf = ByteBuffer.allocateDirect(inLen * 5 + 3); + ByteBuffer byteBuf = makeBuffer(inLen * 5 + 3); DeltaZigzagEncoding.Encoder ctx = new DeltaZigzagEncoding.Encoder(0); // Delta+Zigzag+VariableByte encoding. @@ -127,4 +127,15 @@ public void uncompress(int[] inBuf, IntWrapper inPos, int inLen, outPos.set(op); inPos.set(inPosLast); } + + /** + * Creates a new buffer of the requested size. + * + * In case you need a different way to allocate buffers, you can override this method + * with a custom behavior. The default implementation allocates a new Java direct + * {@link ByteBuffer} on each invocation. + */ + protected ByteBuffer makeBuffer(int sizeInBytes) { + return ByteBuffer.allocateDirect(sizeInBytes); + } } diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index d31a4da..36226c0 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -38,7 +38,7 @@ * * @author Daniel Lemire */ -public final class FastPFOR implements IntegerCODEC,SkippableIntegerCODEC { +public class FastPFOR implements IntegerCODEC,SkippableIntegerCODEC { final static int OVERHEAD_OF_EACH_EXCEPT = 8; /** * @@ -68,7 +68,7 @@ public final class FastPFOR implements IntegerCODEC,SkippableIntegerCODEC { private FastPFOR(int pagesize) { pageSize = pagesize; // Initiate arrrays. - byteContainer = ByteBuffer.allocateDirect(3 * pageSize + byteContainer = makeBuffer(3 * pageSize / BLOCK_SIZE + pageSize); byteContainer.order(ByteOrder.LITTLE_ENDIAN); for (int k = 1; k < dataTobePacked.length; ++k) @@ -329,4 +329,15 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, public String toString() { return this.getClass().getSimpleName(); } + + /** + * Creates a new buffer of the requested size. + * + * In case you need a different way to allocate buffers, you can override this method + * with a custom behavior. The default implementation allocates a new Java direct + * {@link ByteBuffer} on each invocation. + */ + protected ByteBuffer makeBuffer(int sizeInBytes) { + return ByteBuffer.allocateDirect(sizeInBytes); + } } diff --git a/src/main/java/me/lemire/integercompression/FastPFOR128.java b/src/main/java/me/lemire/integercompression/FastPFOR128.java index c1efa94..b124072 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR128.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR128.java @@ -21,7 +21,7 @@ * * @author Daniel Lemire */ -public final class FastPFOR128 implements IntegerCODEC,SkippableIntegerCODEC { +public class FastPFOR128 implements IntegerCODEC,SkippableIntegerCODEC { final static int OVERHEAD_OF_EACH_EXCEPT = 8; /** * @@ -50,7 +50,7 @@ public final class FastPFOR128 implements IntegerCODEC,SkippableIntegerCODEC { public FastPFOR128(int pagesize) { pageSize = pagesize; // Initiate arrrays. - byteContainer = ByteBuffer.allocateDirect(3 * pageSize + byteContainer = makeBuffer(3 * pageSize / BLOCK_SIZE + pageSize); byteContainer.order(ByteOrder.LITTLE_ENDIAN); for (int k = 1; k < dataTobePacked.length; ++k) @@ -310,4 +310,15 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, public String toString() { return this.getClass().getSimpleName(); } + + /** + * Creates a new buffer of the requested size. + * + * In case you need a different way to allocate buffers, you can override this method + * with a custom behavior. The default implementation allocates a new Java direct + * {@link ByteBuffer} on each invocation. + */ + protected ByteBuffer makeBuffer(int sizeInBytes) { + return ByteBuffer.allocateDirect(sizeInBytes); + } } diff --git a/src/main/java/me/lemire/integercompression/VariableByte.java b/src/main/java/me/lemire/integercompression/VariableByte.java index 8e3ce12..5b25c43 100644 --- a/src/main/java/me/lemire/integercompression/VariableByte.java +++ b/src/main/java/me/lemire/integercompression/VariableByte.java @@ -39,7 +39,7 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out IntWrapper outpos) { if (inlength == 0) return; - ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); + ByteBuffer buf = makeBuffer(inlength * 8); buf.order(ByteOrder.LITTLE_ENDIAN); for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { final long val = in[k] & 0xFFFFFFFFL; // To be consistent with @@ -202,4 +202,14 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] o inpos.set(p + (s!=0 ? 1 : 0)); } + /** + * Creates a new buffer of the requested size. + * + * In case you need a different way to allocate buffers, you can override this method + * with a custom behavior. The default implementation allocates a new Java direct + * {@link ByteBuffer} on each invocation. + */ + protected ByteBuffer makeBuffer(int sizeInBytes) { + return ByteBuffer.allocateDirect(sizeInBytes); + } } diff --git a/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java b/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java index 4352ebb..626954c 100644 --- a/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java @@ -38,7 +38,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, if (inlength == 0) return; int initoffset = 0; - ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); + ByteBuffer buf = makeBuffer(inlength * 8); buf.order(ByteOrder.LITTLE_ENDIAN); for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { final long val = (in[k] - initoffset) & 0xFFFFFFFFL; // To be consistent with unsigned integers in C/C++ @@ -187,7 +187,7 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, return; int initoffset = initvalue.get(); initvalue.set(in[inpos.get()+inlength -1]); - ByteBuffer buf = ByteBuffer.allocateDirect(inlength * 8); + ByteBuffer buf = makeBuffer(inlength * 8); buf.order(ByteOrder.LITTLE_ENDIAN); for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { final long val = (in[k] - initoffset) & 0xFFFFFFFFL; // To be consistent with unsigned integers in C/C++ @@ -253,4 +253,14 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, inpos.set(p + (s!=0 ? 1 : 0)); } + /** + * Creates a new buffer of the requested size. + * + * In case you need a different way to allocate buffers, you can override this method + * with a custom behavior. The default implementation allocates a new Java direct + * {@link ByteBuffer} on each invocation. + */ + protected ByteBuffer makeBuffer(int sizeInBytes) { + return ByteBuffer.allocateDirect(sizeInBytes); + } } From d5bb308849f4d4bcd2f2a3860bc37c552e2573bc Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 3 Apr 2017 10:57:33 -0400 Subject: [PATCH 281/412] Excluding kamikaze from coverage --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 7177854..8a7e83f 100644 --- a/pom.xml +++ b/pom.xml @@ -132,6 +132,7 @@ 0.7.8 + me/lemire/integercompression/Kamikaze com/kamikaze/pfordelta/* me/lemire/integercompression/benchmarktools/* From 1bee071241ba89684555840ab248ff2b50054604 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 3 Apr 2017 11:10:28 -0400 Subject: [PATCH 282/412] Adding GroupSimple9 to tests. --- src/test/java/me/lemire/integercompression/BasicTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index cbdb60e..e88293e 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -27,6 +27,7 @@ public class BasicTest { new IntegratedVariableByte()), new JustCopy(), new VariableByte(), + new GroupSimple9(), new IntegratedVariableByte(), new Composition(new BinaryPacking(), new VariableByte()), new Composition(new NewPFD(), new VariableByte()), From 8b60b5d0ac6e8a75e2f727e03e198649273f79aa Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 3 Apr 2017 11:14:50 -0400 Subject: [PATCH 283/412] [maven-release-plugin] prepare release JavaFastPFOR-0.1.11 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8a7e83f..1734447 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.1.11-SNAPSHOT + 0.1.11 jar 1.6 From 3d46796f4eecaa984e66e05b13b327193e99e575 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 3 Apr 2017 11:14:55 -0400 Subject: [PATCH 284/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1734447..52dc4ca 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.1.11 + 0.1.12-SNAPSHOT jar 1.6 From 41b06d84995c1eb508b28ec27e56f7ce321fc51b Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 14 Aug 2017 16:13:57 -0400 Subject: [PATCH 285/412] Removing Oracle JDK 7 --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 49ed971..cdccaf3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,6 @@ language: java jdk: - - oraclejdk7 - oraclejdk8 install: true From 403cb6344ea6a112c814980beba04d6659d34bf7 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 22 Aug 2017 20:18:53 -0400 Subject: [PATCH 286/412] adding ref --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 02b0fb8..58adcd1 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ A modified version of the library is included in the search engine Terrier (http://terrier.org/). This libary is used by ClueWeb Tools (https://github.com/lintool/clueweb). -This library inspired a compression scheme used by Apache Lucene (e.g., see +This library inspired a compression scheme used by Apache Lucene and Apache Lucene.NET (e.g., see http://lucene.apache.org/core/4_6_1/core/org/apache/lucene/util/PForDeltaDocIdSet.html ). It is a java port of the fastpfor C++ library (https://github.com/lemire/FastPFor). From 0710f3a1f9ed7509eddd752878e272e7bfca4345 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 22 Aug 2017 20:26:51 -0400 Subject: [PATCH 287/412] adding ref --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 58adcd1..90ec5ce 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ The library is used in [LinkedIn Pinot](https://github.com/linkedin/pinot), a re Part of this library has been integrated in Parquet (http://parquet.io/). A modified version of the library is included in the search engine Terrier (http://terrier.org/). This libary is used by ClueWeb -Tools (https://github.com/lintool/clueweb). +Tools (https://github.com/lintool/clueweb). It is also used by [Apache NiFi](https://nifi.apache.org). This library inspired a compression scheme used by Apache Lucene and Apache Lucene.NET (e.g., see http://lucene.apache.org/core/4_6_1/core/org/apache/lucene/util/PForDeltaDocIdSet.html ). From b8fabb548a640e87e5841dd1bb1d1be84aaafc35 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 27 Sep 2017 12:04:42 -0400 Subject: [PATCH 288/412] ref --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 90ec5ce..b0d4f8e 100644 --- a/README.md +++ b/README.md @@ -190,7 +190,8 @@ http://dx.doi.org/10.1007/978-3-319-06028-6_30 We wrote several research papers documenting many of the CODECs implemented here: -* Daniel Lemire, Leonid Boytsov, Nathan Kurz, SIMD Compression and the Intersection of Sorted Integers, Software Practice & Experience (to appear) http://arxiv.org/abs/1401.6399 +* Daniel Lemire, Nathan Kurz, Christoph Rupp, Stream VByte: Faster Byte-Oriented Integer Compression, Information Processing Letters (to appear) https://arxiv.org/abs/1709.08990 +* Daniel Lemire, Leonid Boytsov, Nathan Kurz, SIMD Compression and the Intersection of Sorted Integers, Software Practice & Experience Volume 46, Issue 6, pages 723-749, June 2016 http://arxiv.org/abs/1401.6399 * Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second through vectorization, Software Practice & Experience 45 (1), 2015. http://arxiv.org/abs/1209.2137 http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract * Jeff Plaisance, Nathan Kurz, Daniel Lemire, Vectorized VByte Decoding, International Symposium on Web Algorithms 2015, 2015. http://arxiv.org/abs/1503.07387 * Wayne Xin Zhao, Xudong Zhang, Daniel Lemire, Dongdong Shan, Jian-Yun Nie, Hongfei Yan, Ji-Rong Wen, A General SIMD-based Approach to Accelerating Compression Algorithms, ACM Transactions on Information Systems 33 (3), 2015. http://arxiv.org/abs/1502.01916 From 65d968259bdb1ef67069731dbc1ec77e2b171819 Mon Sep 17 00:00:00 2001 From: Bright Fulton Date: Sun, 12 Nov 2017 15:58:58 -0500 Subject: [PATCH 289/412] fix typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b0d4f8e..acaaf83 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ We found no library that implemented state-of-the-art integer coding techniques such as Binary Packing, NewPFD, OptPFD, Variable Byte, Simple 9 and so on in Java. We wrote one. -Thread safery +Thread safety ---- Some codecs are thread-safe while others are not. From 2f28fc110cf9cc3de01710aa4550d3fa905f9c6d Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 13 Dec 2017 10:22:08 -0500 Subject: [PATCH 290/412] Adding jdk9... --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index cdccaf3..427b879 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,7 @@ language: java jdk: - oraclejdk8 + - oraclejdk9 install: true From 9492f7d77970a96663180a4cb1dcadfc13f7c094 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 9 Apr 2018 11:23:48 -0400 Subject: [PATCH 291/412] Fix for https://github.com/lemire/JavaFastPFOR/issues/41 --- .../SkippableComposition.java | 8 ++ .../differential/IntegratedBinaryPacking.java | 2 + .../differential/IntegratedVariableByte.java | 6 +- .../SkippableIntegratedComposition.java | 10 ++- .../lemire/integercompression/AdhocTest.java | 79 ++++++++++++++++++- 5 files changed, 100 insertions(+), 5 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/SkippableComposition.java b/src/main/java/me/lemire/integercompression/SkippableComposition.java index ed0f0de..a235c47 100644 --- a/src/main/java/me/lemire/integercompression/SkippableComposition.java +++ b/src/main/java/me/lemire/integercompression/SkippableComposition.java @@ -38,7 +38,12 @@ public SkippableComposition(SkippableIntegerCODEC f1, public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { int init = inpos.get(); + int outposInit = outpos.get(); F1.headlessCompress(in, inpos, inlength, out, outpos); + if (outpos.get() == outposInit) { + out[outposInit] = 0; + outpos.increment(); + } inlength -= inpos.get() - init; F2.headlessCompress(in, inpos, inlength, out, outpos); } @@ -48,6 +53,9 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] o IntWrapper outpos, int num) { int init = inpos.get(); F1.headlessUncompress(in, inpos, inlength, out, outpos, num); + if (inpos.get() == init) { + inpos.increment(); + } inlength -= inpos.get() - init; num -= outpos.get(); F2.headlessUncompress(in, inpos, inlength, out, outpos, num); diff --git a/src/main/java/me/lemire/integercompression/differential/IntegratedBinaryPacking.java b/src/main/java/me/lemire/integercompression/differential/IntegratedBinaryPacking.java index 0dd2a96..7e1c161 100644 --- a/src/main/java/me/lemire/integercompression/differential/IntegratedBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedBinaryPacking.java @@ -7,6 +7,7 @@ package me.lemire.integercompression.differential; +import me.lemire.integercompression.BitPacking; import me.lemire.integercompression.IntWrapper; import me.lemire.integercompression.Util; @@ -83,6 +84,7 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, if (inlength == 0) return; int tmpoutpos = outpos.get(); + int initoffset = initvalue.get(); initvalue.set(in[inpos.get()+inlength -1]); int s = inpos.get(); diff --git a/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java b/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java index 626954c..918a900 100644 --- a/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java @@ -229,18 +229,22 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num, IntWrapper initvalue) { int s = 0; int val = 0; + int p = inpos.get(); int initoffset = initvalue.get(); int tmpoutpos = outpos.get(); int finaloutpos = num + tmpoutpos; for (int v = 0, shift = 0; tmpoutpos < finaloutpos;) { + val = in[p]; - int c = val >>> s; + int c = (byte) (val >>> s); s += 8; p += s>>5; s = s & 31; v += ((c & 127) << shift); + if ((c & 128) == 128) { + out[tmpoutpos++] = (initoffset = initoffset + v); v = 0; shift = 0; diff --git a/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedComposition.java b/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedComposition.java index 2dd79a4..09c4dd8 100644 --- a/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedComposition.java +++ b/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedComposition.java @@ -49,9 +49,11 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, if (inlength == 0) return; final int init = inpos.get(); + int outposInit = outpos.get(); + F1.headlessCompress(in, inpos, inlength, out, outpos, initvalue); - if (outpos.get() == 0) { - out[0] = 0; + if (outpos.get() == outposInit) { + out[outposInit] = 0; outpos.increment(); } inlength -= inpos.get() - init; @@ -65,7 +67,11 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, return; int init = inpos.get(); F1.headlessUncompress(in, inpos, inlength, out, outpos,num,initvalue); + if (inpos.get() == init) { + inpos.increment(); + } inlength -= inpos.get() - init; + num -= outpos.get(); F2.headlessUncompress(in, inpos, inlength, out, outpos,num,initvalue); } diff --git a/src/test/java/me/lemire/integercompression/AdhocTest.java b/src/test/java/me/lemire/integercompression/AdhocTest.java index 5195fef..bced6c0 100644 --- a/src/test/java/me/lemire/integercompression/AdhocTest.java +++ b/src/test/java/me/lemire/integercompression/AdhocTest.java @@ -1,15 +1,90 @@ package me.lemire.integercompression; +import org.junit.Assert; import org.junit.Test; + +import me.lemire.integercompression.differential.*; + import static me.lemire.integercompression.TestUtils.*; +import java.util.Arrays; + /** * Collection of adhoc tests. */ @SuppressWarnings({ "static-method" }) -public class AdhocTest -{ +public class AdhocTest { + + + /** + * + */ + @Test + public void testIssue29() { + for(int x = 0; x < 64; x++) { + int[] a = {2, 3, 4, 5}; + int[] b = new int[90]; + int[] c = new int[a.length]; + IntegerCODEC codec = new Composition(new BinaryPacking(), new VariableByte()); + + IntWrapper aOffset = new IntWrapper(0); + IntWrapper bOffset = new IntWrapper(x); + codec.compress(a, aOffset, a.length, b, bOffset); + int len = bOffset.get() - x; + bOffset.set(x); + IntWrapper cOffset = new IntWrapper(0); + codec.uncompress(b, bOffset, len, c, cOffset); + Assert.assertArrayEquals(a,c); + } + } + + /** + * + */ + @Test + public void testIssue29b() { + for(int x = 0; x < 64; x++) { + int[] a = {2, 3, 4, 5}; + int[] b = new int[90]; + int[] c = new int[a.length]; + SkippableIntegerCODEC codec = new SkippableComposition(new BinaryPacking(), new VariableByte()); + IntWrapper aOffset = new IntWrapper(0); + IntWrapper bOffset = new IntWrapper(x); + codec.headlessCompress(a, aOffset, a.length, b, bOffset); + int len = bOffset.get() - x; + bOffset.set(x); + IntWrapper cOffset = new IntWrapper(0); + codec.headlessUncompress(b, bOffset, len, c, cOffset, a.length); + Assert.assertArrayEquals(a,c); + } + } + + /** + * + */ + @Test + public void testIssue41() { + for (int x = 0; x < 64; x++) { + int[] a = { 2, 3, 4, 5 }; + int[] b = new int[90]; + int[] c = new int[a.length]; + SkippableIntegratedIntegerCODEC codec = new SkippableIntegratedComposition(new IntegratedBinaryPacking(), + new IntegratedVariableByte()); + IntWrapper aOffset = new IntWrapper(0); + IntWrapper bOffset = new IntWrapper(x); + IntWrapper initValue = new IntWrapper(0); + + codec.headlessCompress(a, aOffset, a.length, b, bOffset, initValue); + int len = bOffset.get() - x; + bOffset.set(x); + IntWrapper cOffset = new IntWrapper(0); + initValue = new IntWrapper(0); + codec.headlessUncompress(b, bOffset, len, c, cOffset, a.length, initValue); + Assert.assertArrayEquals(a, c); + } + } + /** * a test */ From 2d510d9b7b16adc71f8603afd99bf515817a901d Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 9 Apr 2018 11:26:28 -0400 Subject: [PATCH 292/412] [maven-release-plugin] prepare release JavaFastPFOR-0.1.12 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 52dc4ca..e00649f 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.1.12-SNAPSHOT + 0.1.12 jar 1.6 From ffeea61ab2fdb3854da7b0a557f8d22d674477f4 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 9 Apr 2018 11:26:34 -0400 Subject: [PATCH 293/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e00649f..7a36b12 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.1.12 + 0.1.13-SNAPSHOT jar 1.6 From 1d650e40f6ce3052042871161488971052c9fd32 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Thu, 4 Jul 2019 21:27:34 -0400 Subject: [PATCH 294/412] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index acaaf83..0fea928 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,9 @@ JavaFastPFOR: A simple integer compression library in Java [![Build Status](https://travis-ci.org/lemire/JavaFastPFOR.png)](https://travis-ci.org/lemire/JavaFastPFOR) [![][maven img]][maven] [![][license img]][license] [![docs-badge][]][docs] [![Coverage Status](https://coveralls.io/repos/github/lemire/JavaFastPFOR/badge.svg?branch=master)](https://coveralls.io/github/lemire/JavaFastPFOR?branch=master) +[![Code Quality: Cpp](https://img.shields.io/lgtm/grade/java/g/lemire/JavaFastPFOR.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/lemire/JavaFastPFOR/context:java) + + License ------- From 34e39a54d78e281f3ee713ee01b46303b23e2cd9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Oct 2020 20:51:30 +0000 Subject: [PATCH 295/412] Bump junit from 4.10 to 4.13.1 Bumps [junit](https://github.com/junit-team/junit4) from 4.10 to 4.13.1. - [Release notes](https://github.com/junit-team/junit4/releases) - [Changelog](https://github.com/junit-team/junit4/blob/main/doc/ReleaseNotes4.10.md) - [Commits](https://github.com/junit-team/junit4/compare/r4.10...r4.13.1) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7a36b12..cc309d9 100644 --- a/pom.xml +++ b/pom.xml @@ -45,7 +45,7 @@ junit junit - 4.10 + 4.13.1 test From 522ed5a716c09458d4dfd23e30b9a953eea4e8e9 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Tue, 21 Jun 2022 09:27:12 -0400 Subject: [PATCH 296/412] Update README.md --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 0fea928..000695c 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,6 @@ JavaFastPFOR: A simple integer compression library in Java ========================================================== - -[![Build Status](https://travis-ci.org/lemire/JavaFastPFOR.png)](https://travis-ci.org/lemire/JavaFastPFOR) [![][maven img]][maven] [![][license img]][license] [![docs-badge][]][docs] -[![Coverage Status](https://coveralls.io/repos/github/lemire/JavaFastPFOR/badge.svg?branch=master)](https://coveralls.io/github/lemire/JavaFastPFOR?branch=master) + [![][maven img]][maven] [![][license img]][license] [![docs-badge][]][docs] [![Code Quality: Cpp](https://img.shields.io/lgtm/grade/java/g/lemire/JavaFastPFOR.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/lemire/JavaFastPFOR/context:java) @@ -53,7 +51,7 @@ Usage Really simple usage: -``` +```java IntegratedIntCompressor iic = new IntegratedIntCompressor(); int[] data = ... ; // to be compressed int[] compressed = iic.compress(data); // compressed array @@ -76,7 +74,7 @@ Maven central repository Using this code in your own project is easy with maven, just add the following code in your pom.xml file: - +```xml me.lemire.integercompression @@ -84,6 +82,7 @@ the following code in your pom.xml file: [0.1,) +``` Naturally, you should replace "version" by the version you desire. From 94190a3c06f9ea457680c68043588de54d916711 Mon Sep 17 00:00:00 2001 From: Mulugeta Mammo Date: Thu, 6 Oct 2022 20:04:32 +0000 Subject: [PATCH 297/412] Add a vector implementation for FastPFOR. This patch: - adds a vector implementation for FastPFOR and provides an example of usage. - modifies pom.xml and build.xml files to conditionally support Java Vector API use. - upgrades a few dependencies for compatibility with latest JDK versions. - adds an explanation on how to build JavaFastPFOR with vector support. Signed-off-by: Mulugeta Mammo --- README.md | 15 + build.xml | 10 + examples/vector/Example.java | 67 + examples/vector/README.md | 12 + pom.xml | 41 +- .../vector/VectorBitPacker.java | 12790 ++++++++++++++++ .../vector/VectorBitPackerTerse.java | 963 ++ .../vector/VectorFastPFOR.java | 361 + src/main/java/module-info.java | 8 + 9 files changed, 14260 insertions(+), 7 deletions(-) create mode 100644 examples/vector/Example.java create mode 100644 examples/vector/README.md create mode 100644 src/main/java/me/lemire/integercompression/vector/VectorBitPacker.java create mode 100644 src/main/java/me/lemire/integercompression/vector/VectorBitPackerTerse.java create mode 100644 src/main/java/me/lemire/integercompression/vector/VectorFastPFOR.java create mode 100644 src/main/java/module-info.java diff --git a/README.md b/README.md index 000695c..46f771d 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,10 @@ in sorted orders and use differential coding (they compress deltas). They can be found in the package me.lemire.integercompression.differential. Most others do not. +The Java Team at Intel (R) introduced the vector implementation for FastPFOR +based on the Java Vector API that showed significant gains over the +non-vectorized implementation. For an example usage, see +examples/vector/Example.java. The feature requires JDK 19+. Maven central repository ------------------------ @@ -123,6 +127,7 @@ with contributions by * Di Wu, http://www.facebook.com/diwu1989 * Stefan Ackermann, https://github.com/Stivo * Samit Roy, https://github.com/roysamit +* Mulugeta Mammo, https://github.com/mulugetam (for VectorFastPFOR) How does it compare to the Kamikaze PForDelta library? ------------------------------------------------------ @@ -161,7 +166,17 @@ Speed is always reported in millions of integers per second. For Maven users --------------- +If you are running JDK 19+ + +``` mvn compile +``` + +If you are running earlier versions of JDK + +``` +mvn compiler:compile@default-compile +``` mvn exec:java diff --git a/build.xml b/build.xml index 974a14c..d02cddd 100644 --- a/build.xml +++ b/build.xml @@ -8,6 +8,16 @@ + + + + + + + + + + diff --git a/examples/vector/Example.java b/examples/vector/Example.java new file mode 100644 index 0000000..e8d2455 --- /dev/null +++ b/examples/vector/Example.java @@ -0,0 +1,67 @@ +// Copyright (C) 2022 Intel Corporation + +// SPDX-License-Identifier: Apache-2.0 + +import java.util.Arrays; +import me.lemire.integercompression.FastPFOR; +import me.lemire.integercompression.IntWrapper; +import me.lemire.integercompression.Composition; +import me.lemire.integercompression.IntegerCODEC; +import me.lemire.integercompression.VariableByte; +import me.lemire.integercompression.vector.VectorFastPFOR; + +public class Example { + public static void main(String[] args) { + if (args.length == 0) + throw new IllegalArgumentException(); + + // pass 0 for Vector compressor , non-zero for default compressor + int compressorToUse = Integer.parseInt(args[0]); + + final int N = 1310720; + int[] data = new int[N]; + + // 2-bit data + for (int k = 0; k < N; k += 1) + data[k] = 3; + + // a few large values + for (int k = 0; k < N; k += 5) + data[k] = 100; + for (int k = 0; k < N; k += 533) + data[k] = 10000; + + int[] compressed = new int[N + 1024]; + + IntegerCODEC codec = new Composition( + compressorToUse == 0 ? new VectorFastPFOR() : new FastPFOR(), + new VariableByte()); + + IntWrapper inputoffset = new IntWrapper(0); + IntWrapper outputoffset = new IntWrapper(0); + + codec.compress(data, inputoffset, data.length, compressed, outputoffset); + + System.out.println("compressed unsorted integers from " + + data.length * 4 / 1024 + "KB to " + + outputoffset.intValue() * 4 / 1024 + "KB"); + + compressed = Arrays.copyOf(compressed, outputoffset.intValue()); + + int[] recovered = new int[N]; + IntWrapper recoffset = new IntWrapper(0); + + codec.uncompress(compressed, new IntWrapper(0), compressed.length, + recovered, recoffset); + + System.out.println("compressed length = " + compressed.length + + ", uncompressed length = " + recoffset.intValue()); + + if (Arrays.equals(data, recovered)) + System.out.println("data is recovered without loss"); + else + throw new RuntimeException("bug"); // could use assert + + System.out.println(); + } +} diff --git a/examples/vector/README.md b/examples/vector/README.md new file mode 100644 index 0000000..cbcbfeb --- /dev/null +++ b/examples/vector/README.md @@ -0,0 +1,12 @@ +Compile +------- +``` +javac -cp Example.java +``` + +Run +--- +``` +java --add-modules jdk.incubator.vector -cp Example 0 +``` + diff --git a/pom.xml b/pom.xml index 7a36b12..551e508 100644 --- a/pom.xml +++ b/pom.xml @@ -5,8 +5,8 @@ 0.1.13-SNAPSHOT jar - 1.6 - 1.6 + 1.7 + 1.7 UTF-8 @@ -60,6 +60,36 @@ + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + + default-compile + compile + + compile + + + + me/lemire/integercompression/vector/* + module-info.java + + + + + vector-fastpfor + compile + + compile + + + 19 + + + + org.apache.felix maven-bundle-plugin @@ -78,9 +108,6 @@ 1.1 me.lemire.integercompression.benchmarktools.Benchmark - @@ -100,7 +127,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 2.8 + 3.0.0 com.kamikaze.pfordelta:me.lemire.integercompression.benchmarktools @@ -129,7 +156,7 @@ org.jacoco jacoco-maven-plugin - 0.7.8 + 0.8.8 me/lemire/integercompression/Kamikaze diff --git a/src/main/java/me/lemire/integercompression/vector/VectorBitPacker.java b/src/main/java/me/lemire/integercompression/vector/VectorBitPacker.java new file mode 100644 index 0000000..9b2e1ca --- /dev/null +++ b/src/main/java/me/lemire/integercompression/vector/VectorBitPacker.java @@ -0,0 +1,12790 @@ +// Copyright (C) 2022 Intel Corporation + +// SPDX-License-Identifier: Apache-2.0 + +package me.lemire.integercompression.vector; + +import java.util.Arrays; +import jdk.incubator.vector.*; + +/** + * Vectorized bitpacking routines. This class is a version of the + * VectorBitPackerTerse class that with less branch instructions. + * + * The code is machine generated from VectorBitPackerTerse.java using helper + * classes. + * + */ +public class VectorBitPacker { + private static final VectorSpecies SPECIES_512 = + IntVector.SPECIES_512; + private static final VectorSpecies SPECIES_256 = + IntVector.SPECIES_256; + private static final int VLEN_512 = 16; + private static final int VLEN_256 = 8; + private static final int BLOCK_SIZE = 256; + + private static final IntVector MASK_1 = + IntVector.broadcast(SPECIES_256, (1 << 1) - 1); + private static final IntVector MASK_2 = + IntVector.broadcast(SPECIES_512, (1 << 2) - 1); + private static final IntVector MASK_3 = + IntVector.broadcast(SPECIES_256, (1 << 3) - 1); + private static final IntVector MASK_4 = + IntVector.broadcast(SPECIES_512, (1 << 4) - 1); + private static final IntVector MASK_5 = + IntVector.broadcast(SPECIES_256, (1 << 5) - 1); + private static final IntVector MASK_6 = + IntVector.broadcast(SPECIES_512, (1 << 6) - 1); + private static final IntVector MASK_7 = + IntVector.broadcast(SPECIES_256, (1 << 7) - 1); + private static final IntVector MASK_8 = + IntVector.broadcast(SPECIES_512, (1 << 8) - 1); + private static final IntVector MASK_9 = + IntVector.broadcast(SPECIES_256, (1 << 9) - 1); + private static final IntVector MASK_10 = + IntVector.broadcast(SPECIES_512, (1 << 10) - 1); + private static final IntVector MASK_11 = + IntVector.broadcast(SPECIES_256, (1 << 11) - 1); + private static final IntVector MASK_12 = + IntVector.broadcast(SPECIES_512, (1 << 12) - 1); + private static final IntVector MASK_13 = + IntVector.broadcast(SPECIES_256, (1 << 13) - 1); + private static final IntVector MASK_14 = + IntVector.broadcast(SPECIES_512, (1 << 14) - 1); + private static final IntVector MASK_15 = + IntVector.broadcast(SPECIES_256, (1 << 15) - 1); + private static final IntVector MASK_16 = + IntVector.broadcast(SPECIES_512, (1 << 16) - 1); + private static final IntVector MASK_17 = + IntVector.broadcast(SPECIES_256, (1 << 17) - 1); + private static final IntVector MASK_18 = + IntVector.broadcast(SPECIES_512, (1 << 18) - 1); + private static final IntVector MASK_19 = + IntVector.broadcast(SPECIES_256, (1 << 19) - 1); + private static final IntVector MASK_20 = + IntVector.broadcast(SPECIES_512, (1 << 20) - 1); + private static final IntVector MASK_21 = + IntVector.broadcast(SPECIES_256, (1 << 21) - 1); + private static final IntVector MASK_22 = + IntVector.broadcast(SPECIES_512, (1 << 22) - 1); + private static final IntVector MASK_23 = + IntVector.broadcast(SPECIES_256, (1 << 23) - 1); + private static final IntVector MASK_24 = + IntVector.broadcast(SPECIES_512, (1 << 24) - 1); + private static final IntVector MASK_25 = + IntVector.broadcast(SPECIES_256, (1 << 25) - 1); + private static final IntVector MASK_26 = + IntVector.broadcast(SPECIES_512, (1 << 26) - 1); + private static final IntVector MASK_27 = + IntVector.broadcast(SPECIES_256, (1 << 27) - 1); + private static final IntVector MASK_28 = + IntVector.broadcast(SPECIES_512, (1 << 28) - 1); + private static final IntVector MASK_29 = + IntVector.broadcast(SPECIES_256, (1 << 29) - 1); + private static final IntVector MASK_30 = + IntVector.broadcast(SPECIES_512, (1 << 30) - 1); + private static final IntVector MASK_31 = + IntVector.broadcast(SPECIES_256, (1 << 31) - 1); + + /** + * Pack 32 integers + * + * @param in + * source array + * @param inpos + * position in source array + * @param out + * output array + * @param outpos + * position in output array + * @param b + * number of bits to use per integer + */ + public static void fastpack(final int[] in, int inpos, final int[] out, + int outpos, int b) { + switch (b) { + case 0: + break; + case 1: + fastpack1(in, inpos, out, outpos); + break; + case 2: + fastpack2(in, inpos, out, outpos); + break; + case 3: + fastpack3(in, inpos, out, outpos); + break; + case 4: + fastpack4(in, inpos, out, outpos); + break; + case 5: + fastpack5(in, inpos, out, outpos); + break; + case 6: + fastpack6(in, inpos, out, outpos); + break; + case 7: + fastpack7(in, inpos, out, outpos); + break; + case 8: + fastpack8(in, inpos, out, outpos); + break; + case 9: + fastpack9(in, inpos, out, outpos); + break; + case 10: + fastpack10(in, inpos, out, outpos); + break; + case 11: + fastpack11(in, inpos, out, outpos); + break; + case 12: + fastpack12(in, inpos, out, outpos); + break; + case 13: + fastpack13(in, inpos, out, outpos); + break; + case 14: + fastpack14(in, inpos, out, outpos); + break; + case 15: + fastpack15(in, inpos, out, outpos); + break; + case 16: + fastpack16(in, inpos, out, outpos); + break; + case 17: + fastpack17(in, inpos, out, outpos); + break; + case 18: + fastpack18(in, inpos, out, outpos); + break; + case 19: + fastpack19(in, inpos, out, outpos); + break; + case 20: + fastpack20(in, inpos, out, outpos); + break; + case 21: + fastpack21(in, inpos, out, outpos); + break; + case 22: + fastpack22(in, inpos, out, outpos); + break; + case 23: + fastpack23(in, inpos, out, outpos); + break; + case 24: + fastpack24(in, inpos, out, outpos); + break; + case 25: + fastpack25(in, inpos, out, outpos); + break; + case 26: + fastpack26(in, inpos, out, outpos); + break; + case 27: + fastpack27(in, inpos, out, outpos); + break; + case 28: + fastpack28(in, inpos, out, outpos); + break; + case 29: + fastpack29(in, inpos, out, outpos); + break; + case 30: + fastpack30(in, inpos, out, outpos); + break; + case 31: + fastpack31(in, inpos, out, outpos); + break; + case 32: + System.arraycopy(in, inpos, out, outpos, BLOCK_SIZE); + break; + } + } + + static void fastpackNoMask(final int[] in, int inpos, final int[] out, + int outpos, int b) { + switch (b) { + case 0: + break; + case 1: + fastpackNoMask1(in, inpos, out, outpos); + break; + case 2: + fastpackNoMask2(in, inpos, out, outpos); + break; + case 3: + fastpackNoMask3(in, inpos, out, outpos); + break; + case 4: + fastpackNoMask4(in, inpos, out, outpos); + break; + case 5: + fastpackNoMask5(in, inpos, out, outpos); + break; + case 6: + fastpackNoMask6(in, inpos, out, outpos); + break; + case 7: + fastpackNoMask7(in, inpos, out, outpos); + break; + case 8: + fastpackNoMask8(in, inpos, out, outpos); + break; + case 9: + fastpackNoMask9(in, inpos, out, outpos); + break; + case 10: + fastpackNoMask10(in, inpos, out, outpos); + break; + case 11: + fastpackNoMask11(in, inpos, out, outpos); + break; + case 12: + fastpackNoMask12(in, inpos, out, outpos); + break; + case 13: + fastpackNoMask13(in, inpos, out, outpos); + break; + case 14: + fastpackNoMask14(in, inpos, out, outpos); + break; + case 15: + fastpackNoMask15(in, inpos, out, outpos); + break; + case 16: + fastpackNoMask16(in, inpos, out, outpos); + break; + case 17: + fastpackNoMask17(in, inpos, out, outpos); + break; + case 18: + fastpackNoMask18(in, inpos, out, outpos); + break; + case 19: + fastpackNoMask19(in, inpos, out, outpos); + break; + case 20: + fastpackNoMask20(in, inpos, out, outpos); + break; + case 21: + fastpackNoMask21(in, inpos, out, outpos); + break; + case 22: + fastpackNoMask22(in, inpos, out, outpos); + break; + case 23: + fastpackNoMask23(in, inpos, out, outpos); + break; + case 24: + fastpackNoMask24(in, inpos, out, outpos); + break; + case 25: + fastpackNoMask25(in, inpos, out, outpos); + break; + case 26: + fastpackNoMask26(in, inpos, out, outpos); + break; + case 27: + fastpackNoMask27(in, inpos, out, outpos); + break; + case 28: + fastpackNoMask28(in, inpos, out, outpos); + break; + case 29: + fastpackNoMask29(in, inpos, out, outpos); + break; + case 30: + fastpackNoMask30(in, inpos, out, outpos); + break; + case 31: + fastpackNoMask31(in, inpos, out, outpos); + break; + case 32: + System.arraycopy(in, inpos, out, outpos, BLOCK_SIZE); + break; + } + } + + /** + * Unpack 32 integers + * + * @param in + * source array + * @param inpos + * position in source array + * @param out + * output array + * @param outpos + * position in output array + * @param b + * number of bits to use per integer + */ + public static void fastunpack(final int[] in, int inpos, final int[] out, + int outpos, int b) { + switch (b) { + case 0: + Arrays.fill(out, outpos, outpos + 256, 0); + break; + case 1: + fastunpack1(in, inpos, out, outpos); + break; + case 2: + fastunpack2(in, inpos, out, outpos); + break; + case 3: + fastunpack3(in, inpos, out, outpos); + break; + case 4: + fastunpack4(in, inpos, out, outpos); + break; + case 5: + fastunpack5(in, inpos, out, outpos); + break; + case 6: + fastunpack6(in, inpos, out, outpos); + break; + case 7: + fastunpack7(in, inpos, out, outpos); + break; + case 8: + fastunpack8(in, inpos, out, outpos); + break; + case 9: + fastunpack9(in, inpos, out, outpos); + break; + case 10: + fastunpack10(in, inpos, out, outpos); + break; + case 11: + fastunpack11(in, inpos, out, outpos); + break; + case 12: + fastunpack12(in, inpos, out, outpos); + break; + case 13: + fastunpack13(in, inpos, out, outpos); + break; + case 14: + fastunpack14(in, inpos, out, outpos); + break; + case 15: + fastunpack15(in, inpos, out, outpos); + break; + case 16: + fastunpack16(in, inpos, out, outpos); + break; + case 17: + fastunpack17(in, inpos, out, outpos); + break; + case 18: + fastunpack18(in, inpos, out, outpos); + break; + case 19: + fastunpack19(in, inpos, out, outpos); + break; + case 20: + fastunpack20(in, inpos, out, outpos); + break; + case 21: + fastunpack21(in, inpos, out, outpos); + break; + case 22: + fastunpack22(in, inpos, out, outpos); + break; + case 23: + fastunpack23(in, inpos, out, outpos); + break; + case 24: + fastunpack24(in, inpos, out, outpos); + break; + case 25: + fastunpack25(in, inpos, out, outpos); + break; + case 26: + fastunpack26(in, inpos, out, outpos); + break; + case 27: + fastunpack27(in, inpos, out, outpos); + break; + case 28: + fastunpack28(in, inpos, out, outpos); + break; + case 29: + fastunpack29(in, inpos, out, outpos); + break; + case 30: + fastunpack30(in, inpos, out, outpos); + break; + case 31: + fastunpack31(in, inpos, out, outpos); + break; + case 32: + System.arraycopy(in, inpos, out, outpos, BLOCK_SIZE); + break; + } + } + + public static int slowpack(final int[] in, int inpos, int inlen, + final int[] out, int outpos, int b) { + if (inlen == 0) + return outpos; + if (b == 32) { + System.arraycopy(in, inpos, out, outpos, inlen); + return outpos + inlen; + } + int mask = (1 << b) - 1; + int c = 0; + int l = 0; + int r = 0; + int val = 0; + for (int i = 0; i < inlen; i++) { + val = in[inpos + i] & mask; + out[outpos] |= val << (c + r); + c += b; + l = (32 - r) % b; + if (c + r >= 32) { + if (i < inlen - 1 || l != 0) + outpos++; + r = l == 0 ? 0 : b - l; + if (l != 0) + out[outpos] = val >> (b - r); + c = 0; + } + } + return outpos; + } + + public static int slowunpack(final int[] in, int inpos, final int[] out, + int outpos, int outlen, int b) { + if (outlen == 0) { + return inpos; + } + if (b == 32) { + System.arraycopy(in, inpos, out, outpos, outlen); + return inpos + outlen; + } + int mask = (1 << b) - 1; + int limit = outpos + outlen; + int r = 0; + int val = 0; + int i = 0; + for (; outpos < limit; i++) { + if (r > 0) + out[outpos++] = + (val >>> (32 - (b - r))) | ((in[inpos + i] << (b - r)) & mask); + val = in[inpos + i]; + int j = 0; + int l = 32 - r; + int ll = l % b == 0 ? l : l - b; + while (j < ll && outpos < limit) { + out[outpos++] = (val >> (j + r)) & mask; + j += b; + } + r = l % b == 0 ? 0 : b - (l % b); + } + return inpos + i; + } + + public static int numCompressedInts(int n, int b) { + int width = b % 2 == 0 ? VLEN_512 : VLEN_256; + if (n <= width) + return n; + int intsPerVec = (32 / b) * width; + int q = (n + intsPerVec - 1) / intsPerVec; + return q * width; + } + + private static void fastpack1(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV.and(MASK_1); + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 3).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 5).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 7).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 9).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 11).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 13).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 14).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 15).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 17).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 18).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 19).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 20).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 21).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 22).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 23).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 24).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 25).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 26).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 27).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 28).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 29).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 30).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.and(MASK_1).lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack2(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV.and(MASK_2); + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(MASK_2).lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.and(MASK_2).lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.and(MASK_2).lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.and(MASK_2).lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.and(MASK_2).lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.and(MASK_2).lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.and(MASK_2).lanewise(VectorOperators.LSHL, 14).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.and(MASK_2).lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.and(MASK_2).lanewise(VectorOperators.LSHL, 18).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.and(MASK_2).lanewise(VectorOperators.LSHL, 20).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.and(MASK_2).lanewise(VectorOperators.LSHL, 22).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.and(MASK_2).lanewise(VectorOperators.LSHL, 24).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.and(MASK_2).lanewise(VectorOperators.LSHL, 26).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.and(MASK_2).lanewise(VectorOperators.LSHL, 28).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.and(MASK_2).lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack3(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV.and(MASK_3); + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 3).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 9).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 15).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 18).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 21).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 24).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 27).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 7).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 13).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 19).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 22).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 25).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 28).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 5).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 11).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 14).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 17).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 20).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 23).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 26).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.and(MASK_3).lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack4(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV.and(MASK_4); + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(MASK_4).lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.and(MASK_4).lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.and(MASK_4).lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.and(MASK_4).lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.and(MASK_4).lanewise(VectorOperators.LSHL, 20).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.and(MASK_4).lanewise(VectorOperators.LSHL, 24).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.and(MASK_4).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.and(MASK_4).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.and(MASK_4).lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.and(MASK_4).lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.and(MASK_4).lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.and(MASK_4).lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.and(MASK_4).lanewise(VectorOperators.LSHL, 20).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.and(MASK_4).lanewise(VectorOperators.LSHL, 24).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.and(MASK_4).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack5(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV.and(MASK_5); + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 5).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 15).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 20).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 25).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 3).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 13).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 18).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 23).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 11).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 21).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 26).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 9).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 14).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 19).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 24).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHR, 3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 7).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 17).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 22).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.and(MASK_5).lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack6(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV.and(MASK_6); + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(MASK_6).lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.and(MASK_6).lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.and(MASK_6).lanewise(VectorOperators.LSHL, 18).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.and(MASK_6).lanewise(VectorOperators.LSHL, 24).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.and(MASK_6).lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + oV = iV.and(MASK_6).lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.and(MASK_6).lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.and(MASK_6).lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.and(MASK_6).lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.and(MASK_6).lanewise(VectorOperators.LSHL, 22).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.and(MASK_6).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_6).lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.and(MASK_6).lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.and(MASK_6).lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.and(MASK_6).lanewise(VectorOperators.LSHL, 14).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.and(MASK_6).lanewise(VectorOperators.LSHL, 20).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.and(MASK_6).lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack7(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV.and(MASK_7); + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 7).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 14).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 21).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 3).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 17).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 24).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 13).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 20).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHR, 5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 9).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 23).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 5).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 19).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 15).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 22).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHR, 3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 11).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 18).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.and(MASK_7).lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack8(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV.and(MASK_8); + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(MASK_8).lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.and(MASK_8).lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.and(MASK_8).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.and(MASK_8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.and(MASK_8).lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.and(MASK_8).lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.and(MASK_8).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.and(MASK_8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.and(MASK_8).lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.and(MASK_8).lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.and(MASK_8).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.and(MASK_8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.and(MASK_8).lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.and(MASK_8).lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.and(MASK_8).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack9(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV.and(MASK_9); + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 9).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 18).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHR, 5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 13).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 22).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 17).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 3).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 21).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 7).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHR, 7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 11).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 20).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHR, 3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 15).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 19).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 5).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 14).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.and(MASK_9).lanewise(VectorOperators.LSHL, 23).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack10(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV.and(MASK_10); + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(MASK_10).lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.and(MASK_10).lanewise(VectorOperators.LSHL, 20).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.and(MASK_10).lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + oV = iV.and(MASK_10).lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.and(MASK_10).lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.and(MASK_10).lanewise(VectorOperators.LSHL, 18).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.and(MASK_10).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_10).lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.and(MASK_10).lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.and(MASK_10).lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.and(MASK_10).lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_10).lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.and(MASK_10).lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.and(MASK_10).lanewise(VectorOperators.LSHL, 14).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.and(MASK_10).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_10).lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.and(MASK_10).lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.and(MASK_10).lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.and(MASK_10).lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack11(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV.and(MASK_11); + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 11).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 23).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHR, 9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 13).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 3).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 14).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHR, 7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 15).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 5).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHR, 5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 17).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 7).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 18).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHR, 3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 19).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 9).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 20).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.and(MASK_11).lanewise(VectorOperators.LSHL, 21).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack12(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV.and(MASK_12); + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(MASK_12).lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.and(MASK_12).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + oV = iV.and(MASK_12).lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.and(MASK_12).lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.and(MASK_12).lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.and(MASK_12).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_12).lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.and(MASK_12).lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.and(MASK_12).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.and(MASK_12).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.and(MASK_12).lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.and(MASK_12).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_12).lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.and(MASK_12).lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.and(MASK_12).lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.and(MASK_12).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_12).lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.and(MASK_12).lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.and(MASK_12).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack13(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV.and(MASK_13); + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 13).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 7).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 14).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHR, 5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 21).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHR, 11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 15).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 9).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 3).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHR, 3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 23).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHR, 9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 17).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 11).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 5).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 18).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHR, 7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.and(MASK_13).lanewise(VectorOperators.LSHL, 19).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack14(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV.and(MASK_14); + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(MASK_14).lanewise(VectorOperators.LSHL, 14).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.and(MASK_14).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + oV = iV.and(MASK_14).lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.and(MASK_14).lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.and(MASK_14).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_14).lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.and(MASK_14).lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.and(MASK_14).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_14).lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.and(MASK_14).lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.and(MASK_14).lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.and(MASK_14).lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_14).lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.and(MASK_14).lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.and(MASK_14).lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_14).lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.and(MASK_14).lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.and(MASK_14).lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_14).lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.and(MASK_14).lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.and(MASK_14).lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack15(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV.and(MASK_15); + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 15).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 13).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 11).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 9).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 7).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 5).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 3).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHR, 14); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 14).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHR, 3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHR, 5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHR, 7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 23).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHR, 9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 21).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHR, 11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 19).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHR, 13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.and(MASK_15).lanewise(VectorOperators.LSHL, 17).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack16(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV.and(MASK_16); + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(MASK_16).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.and(MASK_16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.and(MASK_16).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.and(MASK_16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.and(MASK_16).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.and(MASK_16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.and(MASK_16).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.and(MASK_16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.and(MASK_16).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.and(MASK_16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.and(MASK_16).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.and(MASK_16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.and(MASK_16).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.and(MASK_16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.and(MASK_16).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack17(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV.and(MASK_17); + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 17).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHR, 15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 19).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHR, 13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 21).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHR, 11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 23).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHR, 9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHR, 7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHR, 5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHR, 3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 14).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHR, 14); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 3).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 5).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 7).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 9).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 11).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 13).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.and(MASK_17).lanewise(VectorOperators.LSHL, 15).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack18(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV.and(MASK_18); + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(MASK_18).lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + oV = iV.and(MASK_18).lanewise(VectorOperators.LSHR, 14); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.and(MASK_18).lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.and(MASK_18).lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_18).lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.and(MASK_18).lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.and(MASK_18).lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_18).lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.and(MASK_18).lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.and(MASK_18).lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_18).lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.and(MASK_18).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_18).lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.and(MASK_18).lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.and(MASK_18).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_18).lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.and(MASK_18).lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.and(MASK_18).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_18).lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.and(MASK_18).lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.and(MASK_18).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_18).lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.and(MASK_18).lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack19(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV.and(MASK_19); + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 19).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHR, 13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHR, 7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHR, 14); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 5).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 11).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 17).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHR, 15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 23).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHR, 9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHR, 3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 3).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 9).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 15).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHR, 17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 21).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHR, 11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHR, 5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHR, 18); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 7).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.and(MASK_19).lanewise(VectorOperators.LSHL, 13).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack20(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV.and(MASK_20); + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(MASK_20).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + oV = iV.and(MASK_20).lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.and(MASK_20).lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.and(MASK_20).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_20).lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.and(MASK_20).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_20).lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.and(MASK_20).lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.and(MASK_20).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_20).lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.and(MASK_20).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.and(MASK_20).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.and(MASK_20).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_20).lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.and(MASK_20).lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.and(MASK_20).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_20).lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.and(MASK_20).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_20).lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.and(MASK_20).lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.and(MASK_20).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_20).lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.and(MASK_20).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack21(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV.and(MASK_21); + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 21).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHR, 11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 9).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 19).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHR, 13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHR, 3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHR, 14); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 7).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 17).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHR, 15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHR, 5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 5).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 15).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHR, 17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHR, 7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHR, 18); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 3).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 13).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHR, 19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 23).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHR, 9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHR, 20); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.and(MASK_21).lanewise(VectorOperators.LSHL, 11).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack22(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV.and(MASK_22); + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(MASK_22).lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + oV = iV.and(MASK_22).lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.and(MASK_22).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_22).lanewise(VectorOperators.LSHR, 20); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.and(MASK_22).lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.and(MASK_22).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_22).lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.and(MASK_22).lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_22).lanewise(VectorOperators.LSHR, 18); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.and(MASK_22).lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.and(MASK_22).lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_22).lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.and(MASK_22).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_22).lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.and(MASK_22).lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.and(MASK_22).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_22).lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.and(MASK_22).lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_22).lanewise(VectorOperators.LSHR, 14); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.and(MASK_22).lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.and(MASK_22).lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_22).lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.and(MASK_22).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_22).lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.and(MASK_22).lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack23(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV.and(MASK_23); + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 23).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHR, 9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHR, 18); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 5).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 19).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHR, 13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHR, 22); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 15).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHR, 17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHR, 3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 11).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHR, 21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHR, 7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 7).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 21).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHR, 11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHR, 20); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 3).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 17).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHR, 15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 13).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHR, 19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHR, 5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHR, 14); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.and(MASK_23).lanewise(VectorOperators.LSHL, 9).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack24(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV.and(MASK_24); + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(MASK_24).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + oV = iV.and(MASK_24).lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.and(MASK_24).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_24).lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.and(MASK_24).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.and(MASK_24).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.and(MASK_24).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_24).lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.and(MASK_24).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_24).lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.and(MASK_24).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.and(MASK_24).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.and(MASK_24).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_24).lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.and(MASK_24).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_24).lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.and(MASK_24).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.and(MASK_24).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.and(MASK_24).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_24).lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.and(MASK_24).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_24).lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.and(MASK_24).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack25(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV.and(MASK_25); + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHR, 7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHR, 14); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 11).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHR, 21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHR, 3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 15).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHR, 17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHR, 24); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 19).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHR, 13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHR, 20); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 5).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 23).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHR, 9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 9).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHR, 23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHR, 5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 13).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHR, 19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 17).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHR, 15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHR, 22); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 3).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 21).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHR, 11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHR, 18); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.and(MASK_25).lanewise(VectorOperators.LSHL, 7).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack26(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV.and(MASK_26); + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(MASK_26).lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + oV = iV.and(MASK_26).lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.and(MASK_26).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_26).lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.and(MASK_26).lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_26).lanewise(VectorOperators.LSHR, 18); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.and(MASK_26).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_26).lanewise(VectorOperators.LSHR, 24); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.and(MASK_26).lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.and(MASK_26).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_26).lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.and(MASK_26).lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_26).lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.and(MASK_26).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_26).lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.and(MASK_26).lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_26).lanewise(VectorOperators.LSHR, 22); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.and(MASK_26).lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.and(MASK_26).lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_26).lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.and(MASK_26).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_26).lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.and(MASK_26).lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_26).lanewise(VectorOperators.LSHR, 14); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.and(MASK_26).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_26).lanewise(VectorOperators.LSHR, 20); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.and(MASK_26).lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack27(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV.and(MASK_27); + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHR, 5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 17).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHR, 15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHR, 20); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 7).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHR, 25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHR, 3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 19).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHR, 13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHR, 18); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 9).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHR, 23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 21).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHR, 11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 11).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHR, 21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHR, 26); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 23).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHR, 9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHR, 14); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 13).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHR, 19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHR, 24); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 3).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHR, 7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 15).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHR, 17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHR, 22); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.and(MASK_27).lanewise(VectorOperators.LSHL, 5).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack28(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV.and(MASK_28); + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(MASK_28).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + oV = iV.and(MASK_28).lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.and(MASK_28).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_28).lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.and(MASK_28).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_28).lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.and(MASK_28).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_28).lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.and(MASK_28).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_28).lanewise(VectorOperators.LSHR, 20); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.and(MASK_28).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_28).lanewise(VectorOperators.LSHR, 24); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.and(MASK_28).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.and(MASK_28).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.and(MASK_28).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_28).lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.and(MASK_28).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_28).lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.and(MASK_28).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_28).lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.and(MASK_28).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_28).lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.and(MASK_28).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_28).lanewise(VectorOperators.LSHR, 20); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.and(MASK_28).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_28).lanewise(VectorOperators.LSHR, 24); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.and(MASK_28).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack29(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV.and(MASK_29); + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHR, 3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 23).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHR, 9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 17).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHR, 15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHR, 18); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 11).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHR, 21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHR, 24); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 5).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHR, 27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHR, 7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 19).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHR, 13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 13).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHR, 19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHR, 22); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 7).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHR, 25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHR, 28); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHR, 5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 21).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHR, 11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHR, 14); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 15).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHR, 17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHR, 20); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 9).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHR, 23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHR, 26); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.and(MASK_29).lanewise(VectorOperators.LSHL, 3).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack30(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV.and(MASK_30); + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHR, 14); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHR, 18); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHR, 20); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHR, 22); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHR, 24); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHR, 26); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHR, 28); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.and(MASK_30).lanewise(VectorOperators.LSHL, 2).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpack31(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV.and(MASK_31); + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 23).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 21).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 19).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 14); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 17).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 15).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 18); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 13).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 20); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 11).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 22); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 9).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 24); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 7).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 26); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 5).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 28); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 3).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 2).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHR, 30); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.and(MASK_31).lanewise(VectorOperators.LSHL, 1).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask1(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.lanewise(VectorOperators.LSHL, 3).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.lanewise(VectorOperators.LSHL, 5).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.lanewise(VectorOperators.LSHL, 7).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.lanewise(VectorOperators.LSHL, 9).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.lanewise(VectorOperators.LSHL, 11).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.lanewise(VectorOperators.LSHL, 13).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 14).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.lanewise(VectorOperators.LSHL, 15).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.lanewise(VectorOperators.LSHL, 17).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 18).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.lanewise(VectorOperators.LSHL, 19).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.lanewise(VectorOperators.LSHL, 21).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 22).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.lanewise(VectorOperators.LSHL, 23).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.lanewise(VectorOperators.LSHL, 25).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 26).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.lanewise(VectorOperators.LSHL, 27).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.lanewise(VectorOperators.LSHL, 29).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 30).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask2(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 14).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 18).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 22).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 26).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask3(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.lanewise(VectorOperators.LSHL, 3).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.lanewise(VectorOperators.LSHL, 9).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.lanewise(VectorOperators.LSHL, 15).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 18).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.lanewise(VectorOperators.LSHL, 21).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.lanewise(VectorOperators.LSHL, 27).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.lanewise(VectorOperators.LSHL, 7).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.lanewise(VectorOperators.LSHL, 13).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.lanewise(VectorOperators.LSHL, 19).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 22).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.lanewise(VectorOperators.LSHL, 25).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.lanewise(VectorOperators.LSHL, 5).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.lanewise(VectorOperators.LSHL, 11).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 14).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.lanewise(VectorOperators.LSHL, 17).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.lanewise(VectorOperators.LSHL, 23).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 26).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask4(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask5(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.lanewise(VectorOperators.LSHL, 5).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.lanewise(VectorOperators.LSHL, 15).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.lanewise(VectorOperators.LSHL, 25).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.lanewise(VectorOperators.LSHL, 3).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.lanewise(VectorOperators.LSHL, 13).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 18).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.lanewise(VectorOperators.LSHL, 23).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.lanewise(VectorOperators.LSHL, 11).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.lanewise(VectorOperators.LSHL, 21).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 26).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.lanewise(VectorOperators.LSHL, 9).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 14).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.lanewise(VectorOperators.LSHL, 19).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.lanewise(VectorOperators.LSHL, 7).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.lanewise(VectorOperators.LSHL, 17).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 22).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask6(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 18).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + oV = iV.lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 22).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 14).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask7(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.lanewise(VectorOperators.LSHL, 7).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 14).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.lanewise(VectorOperators.LSHL, 21).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.lanewise(VectorOperators.LSHL, 3).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.lanewise(VectorOperators.LSHL, 17).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.lanewise(VectorOperators.LSHL, 13).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.lanewise(VectorOperators.LSHL, 9).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.lanewise(VectorOperators.LSHL, 23).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.lanewise(VectorOperators.LSHL, 5).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.lanewise(VectorOperators.LSHL, 19).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.lanewise(VectorOperators.LSHL, 15).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 22).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.lanewise(VectorOperators.LSHL, 11).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 18).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask8(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask9(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.lanewise(VectorOperators.LSHL, 9).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 18).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.lanewise(VectorOperators.LSHL, 13).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 22).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.lanewise(VectorOperators.LSHL, 17).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.lanewise(VectorOperators.LSHL, 3).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.lanewise(VectorOperators.LSHL, 21).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.lanewise(VectorOperators.LSHL, 7).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.lanewise(VectorOperators.LSHL, 11).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.lanewise(VectorOperators.LSHL, 15).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.lanewise(VectorOperators.LSHL, 19).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.lanewise(VectorOperators.LSHL, 5).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 14).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.lanewise(VectorOperators.LSHL, 23).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask10(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + oV = iV.lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 18).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 14).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask11(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.lanewise(VectorOperators.LSHL, 11).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.lanewise(VectorOperators.LSHL, 23).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.lanewise(VectorOperators.LSHL, 13).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.lanewise(VectorOperators.LSHL, 3).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 14).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.lanewise(VectorOperators.LSHL, 15).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.lanewise(VectorOperators.LSHL, 5).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.lanewise(VectorOperators.LSHL, 17).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.lanewise(VectorOperators.LSHL, 7).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 18).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.lanewise(VectorOperators.LSHL, 19).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.lanewise(VectorOperators.LSHL, 9).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.lanewise(VectorOperators.LSHL, 21).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask12(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + oV = iV.lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask13(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.lanewise(VectorOperators.LSHL, 13).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.lanewise(VectorOperators.LSHL, 7).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 14).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.lanewise(VectorOperators.LSHL, 21).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.lanewise(VectorOperators.LSHL, 15).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.lanewise(VectorOperators.LSHL, 9).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.lanewise(VectorOperators.LSHL, 3).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.lanewise(VectorOperators.LSHL, 23).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.lanewise(VectorOperators.LSHL, 17).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.lanewise(VectorOperators.LSHL, 11).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.lanewise(VectorOperators.LSHL, 5).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 18).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.lanewise(VectorOperators.LSHL, 19).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask14(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 14).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + oV = iV.lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask15(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.lanewise(VectorOperators.LSHL, 15).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.lanewise(VectorOperators.LSHL, 13).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.lanewise(VectorOperators.LSHL, 11).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.lanewise(VectorOperators.LSHL, 9).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.lanewise(VectorOperators.LSHL, 7).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.lanewise(VectorOperators.LSHL, 5).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.lanewise(VectorOperators.LSHL, 3).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 14); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 14).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.lanewise(VectorOperators.LSHL, 23).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.lanewise(VectorOperators.LSHL, 21).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.lanewise(VectorOperators.LSHL, 19).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.lanewise(VectorOperators.LSHL, 17).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask16(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask17(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.lanewise(VectorOperators.LSHL, 17).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.lanewise(VectorOperators.LSHL, 19).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.lanewise(VectorOperators.LSHL, 21).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.lanewise(VectorOperators.LSHL, 23).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 14).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 14); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.lanewise(VectorOperators.LSHL, 3).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.lanewise(VectorOperators.LSHL, 5).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.lanewise(VectorOperators.LSHL, 7).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.lanewise(VectorOperators.LSHL, 9).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.lanewise(VectorOperators.LSHL, 11).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.lanewise(VectorOperators.LSHL, 13).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.lanewise(VectorOperators.LSHL, 15).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask18(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + oV = iV.lanewise(VectorOperators.LSHR, 14); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask19(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.lanewise(VectorOperators.LSHL, 19).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 14); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.lanewise(VectorOperators.LSHL, 5).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.lanewise(VectorOperators.LSHL, 11).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.lanewise(VectorOperators.LSHL, 17).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.lanewise(VectorOperators.LSHL, 23).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.lanewise(VectorOperators.LSHL, 3).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.lanewise(VectorOperators.LSHL, 9).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.lanewise(VectorOperators.LSHL, 15).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.lanewise(VectorOperators.LSHL, 21).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 18); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.lanewise(VectorOperators.LSHL, 7).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.lanewise(VectorOperators.LSHL, 13).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask20(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + oV = iV.lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask21(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.lanewise(VectorOperators.LSHL, 21).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 10).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.lanewise(VectorOperators.LSHL, 9).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.lanewise(VectorOperators.LSHL, 19).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 14); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.lanewise(VectorOperators.LSHL, 7).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.lanewise(VectorOperators.LSHL, 17).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.lanewise(VectorOperators.LSHL, 5).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.lanewise(VectorOperators.LSHL, 15).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 18); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.lanewise(VectorOperators.LSHL, 3).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.lanewise(VectorOperators.LSHL, 13).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.lanewise(VectorOperators.LSHL, 23).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 20); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.lanewise(VectorOperators.LSHL, 11).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask22(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + oV = iV.lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 20); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 18); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 14); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask23(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.lanewise(VectorOperators.LSHL, 23).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 18); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.lanewise(VectorOperators.LSHL, 5).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.lanewise(VectorOperators.LSHL, 19).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 22); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.lanewise(VectorOperators.LSHL, 15).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.lanewise(VectorOperators.LSHL, 11).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.lanewise(VectorOperators.LSHL, 7).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.lanewise(VectorOperators.LSHL, 21).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 20); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.lanewise(VectorOperators.LSHL, 3).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.lanewise(VectorOperators.LSHL, 17).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.lanewise(VectorOperators.LSHL, 13).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 14); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.lanewise(VectorOperators.LSHL, 9).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask24(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + oV = iV.lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask25(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 14); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.lanewise(VectorOperators.LSHL, 11).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.lanewise(VectorOperators.LSHL, 15).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 24); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.lanewise(VectorOperators.LSHL, 19).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 20); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.lanewise(VectorOperators.LSHL, 5).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.lanewise(VectorOperators.LSHL, 23).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.lanewise(VectorOperators.LSHL, 9).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.lanewise(VectorOperators.LSHL, 13).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 6).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.lanewise(VectorOperators.LSHL, 17).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 22); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.lanewise(VectorOperators.LSHL, 3).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.lanewise(VectorOperators.LSHL, 21).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 18); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.lanewise(VectorOperators.LSHL, 7).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask26(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + oV = iV.lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 18); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 24); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 22); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 14); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 20); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask27(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.lanewise(VectorOperators.LSHL, 17).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 20); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.lanewise(VectorOperators.LSHL, 7).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.lanewise(VectorOperators.LSHL, 19).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 18); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.lanewise(VectorOperators.LSHL, 9).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.lanewise(VectorOperators.LSHL, 21).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.lanewise(VectorOperators.LSHL, 11).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 26); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.lanewise(VectorOperators.LSHL, 23).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 14); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.lanewise(VectorOperators.LSHL, 13).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 24); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.lanewise(VectorOperators.LSHL, 3).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.lanewise(VectorOperators.LSHL, 15).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 22); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.lanewise(VectorOperators.LSHL, 5).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask28(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + oV = iV.lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 20); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 24); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.or(oV); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 20); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 24); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask29(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.lanewise(VectorOperators.LSHL, 23).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.lanewise(VectorOperators.LSHL, 17).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 18); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.lanewise(VectorOperators.LSHL, 11).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 24); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.lanewise(VectorOperators.LSHL, 5).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 2).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.lanewise(VectorOperators.LSHL, 19).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.lanewise(VectorOperators.LSHL, 13).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 22); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.lanewise(VectorOperators.LSHL, 7).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 28); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.lanewise(VectorOperators.LSHL, 1).or(oV); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.lanewise(VectorOperators.LSHL, 21).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 14); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.lanewise(VectorOperators.LSHL, 15).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 20); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.lanewise(VectorOperators.LSHL, 9).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 26); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.lanewise(VectorOperators.LSHL, 3).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask30(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + oV = iV.lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 14); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 18); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 20); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 22); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 24); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 26); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 28); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 2).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastpackNoMask31(final int[] in, int inpos, + final int[] out, int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV; + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.lanewise(VectorOperators.LSHL, 31).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 1); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 2); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 4); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 6); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 8); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.lanewise(VectorOperators.LSHL, 23).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 10); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.lanewise(VectorOperators.LSHL, 21).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 12); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.lanewise(VectorOperators.LSHL, 19).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 14); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.lanewise(VectorOperators.LSHL, 17).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 16); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.lanewise(VectorOperators.LSHL, 15).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 18); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.lanewise(VectorOperators.LSHL, 13).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 20); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.lanewise(VectorOperators.LSHL, 11).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 22); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.lanewise(VectorOperators.LSHL, 9).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 24); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.lanewise(VectorOperators.LSHL, 7).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 26); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.lanewise(VectorOperators.LSHL, 5).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 28); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.lanewise(VectorOperators.LSHL, 3).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.lanewise(VectorOperators.LSHL, 2).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 30); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 248); + oV = iV.lanewise(VectorOperators.LSHL, 1).or(oV); + + oV.intoArray(out, outpos); + } + + private static void fastunpack1(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + iV.and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 1).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 2).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 3).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 5).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 6).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 7).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 9).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 10).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 11).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 12).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 13).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 14).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 15).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 16).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 17).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 18).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 19).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 20).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 21).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 22).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 23).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 24).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 25).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 26).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 27).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 28).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 29).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 30).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 31).and(MASK_1).intoArray(out, outpos); + outpos += VLEN_256; + } + + private static void fastunpack2(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + iV.and(MASK_2).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 2).and(MASK_2).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_2).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 6).and(MASK_2).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_2).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 10).and(MASK_2).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 12).and(MASK_2).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 14).and(MASK_2).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 16).and(MASK_2).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 18).and(MASK_2).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 20).and(MASK_2).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 22).and(MASK_2).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 24).and(MASK_2).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 26).and(MASK_2).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 28).and(MASK_2).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 30).and(MASK_2).intoArray(out, outpos); + outpos += VLEN_512; + } + + private static void fastunpack3(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + iV.and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 3).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 6).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 9).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 12).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 15).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 18).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 21).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 24).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 27).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + var oV = iV.lanewise(VectorOperators.LSHR, 30).and(MASK_3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(1).lanewise(VectorOperators.LSHL, 2).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 1).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 7).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 10).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 13).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 16).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 19).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 22).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 25).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 28).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 31).and(MASK_3); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(3).lanewise(VectorOperators.LSHL, 1).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 2).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 5).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 11).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 14).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 17).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 20).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 23).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 26).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 29).and(MASK_3).intoArray(out, outpos); + outpos += VLEN_256; + } + + private static void fastunpack4(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + iV.and(MASK_4).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_4).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_4).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 12).and(MASK_4).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 16).and(MASK_4).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 20).and(MASK_4).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 24).and(MASK_4).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 28).and(MASK_4).intoArray(out, outpos); + outpos += VLEN_512; + + var oV = iV.and(MASK_4); + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(0xf).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_4).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_4).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 12).and(MASK_4).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 16).and(MASK_4).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 20).and(MASK_4).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 24).and(MASK_4).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 28).and(MASK_4).intoArray(out, outpos); + outpos += VLEN_512; + } + + private static void fastunpack5(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + iV.and(MASK_5).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 5).and(MASK_5).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 10).and(MASK_5).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 15).and(MASK_5).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 20).and(MASK_5).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 25).and(MASK_5).intoArray(out, outpos); + outpos += VLEN_256; + + var oV = iV.lanewise(VectorOperators.LSHR, 30).and(MASK_5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(7).lanewise(VectorOperators.LSHL, 2).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 3).and(MASK_5).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_5).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 13).and(MASK_5).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 18).and(MASK_5).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 23).and(MASK_5).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 28).and(MASK_5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(1).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 1).and(MASK_5).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 6).and(MASK_5).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 11).and(MASK_5).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 16).and(MASK_5).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 21).and(MASK_5).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 26).and(MASK_5).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 31).and(MASK_5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(0xf).lanewise(VectorOperators.LSHL, 1).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_5).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 9).and(MASK_5).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 14).and(MASK_5).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 19).and(MASK_5).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 24).and(MASK_5).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 29).and(MASK_5); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(3).lanewise(VectorOperators.LSHL, 3).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 2).and(MASK_5).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 7).and(MASK_5).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 12).and(MASK_5).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 17).and(MASK_5).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 22).and(MASK_5).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 27).and(MASK_5).intoArray(out, outpos); + outpos += VLEN_256; + } + + private static void fastunpack6(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + iV.and(MASK_6).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 6).and(MASK_6).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 12).and(MASK_6).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 18).and(MASK_6).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 24).and(MASK_6).intoArray(out, outpos); + outpos += VLEN_512; + + var oV = iV.lanewise(VectorOperators.LSHR, 30).and(MASK_6); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(0xf).lanewise(VectorOperators.LSHL, 2).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_6).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 10).and(MASK_6).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 16).and(MASK_6).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 22).and(MASK_6).intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 28).and(MASK_6); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.and(3).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 2).and(MASK_6).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_6).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 14).and(MASK_6).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 20).and(MASK_6).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 26).and(MASK_6).intoArray(out, outpos); + outpos += VLEN_512; + } + + private static void fastunpack7(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + iV.and(MASK_7).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 7).and(MASK_7).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 14).and(MASK_7).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 21).and(MASK_7).intoArray(out, outpos); + outpos += VLEN_256; + + var oV = iV.lanewise(VectorOperators.LSHR, 28).and(MASK_7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(7).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 3).and(MASK_7).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 10).and(MASK_7).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 17).and(MASK_7).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 24).and(MASK_7).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 31).and(MASK_7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(0x3f).lanewise(VectorOperators.LSHL, 1).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 6).and(MASK_7).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 13).and(MASK_7).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 20).and(MASK_7).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 27).and(MASK_7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(3).lanewise(VectorOperators.LSHL, 5).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 2).and(MASK_7).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 9).and(MASK_7).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 16).and(MASK_7).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 23).and(MASK_7).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 30).and(MASK_7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(0x1f).lanewise(VectorOperators.LSHL, 2).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 5).and(MASK_7).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 12).and(MASK_7).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 19).and(MASK_7).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 26).and(MASK_7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(1).lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 1).and(MASK_7).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_7).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 15).and(MASK_7).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 22).and(MASK_7).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 29).and(MASK_7); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(0xf).lanewise(VectorOperators.LSHL, 3).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_7).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 11).and(MASK_7).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 18).and(MASK_7).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 25).and(MASK_7).intoArray(out, outpos); + outpos += VLEN_256; + } + + private static void fastunpack8(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + iV.and(MASK_8).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_8).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 16).and(MASK_8).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 24).and(MASK_8).intoArray(out, outpos); + outpos += VLEN_512; + + var oV = iV.and(MASK_8); + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(0xff).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_8).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 16).and(MASK_8).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 24).and(MASK_8).intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.and(0xff).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_8).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 16).and(MASK_8).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 24).and(MASK_8).intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.and(0xff).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_8).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 16).and(MASK_8).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 24).and(MASK_8).intoArray(out, outpos); + outpos += VLEN_512; + } + + private static void fastunpack9(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + iV.and(MASK_9).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 9).and(MASK_9).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 18).and(MASK_9).intoArray(out, outpos); + outpos += VLEN_256; + + var oV = iV.lanewise(VectorOperators.LSHR, 27).and(MASK_9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(0xf).lanewise(VectorOperators.LSHL, 5).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_9).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 13).and(MASK_9).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 22).and(MASK_9).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 31).and(MASK_9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(0xff).lanewise(VectorOperators.LSHL, 1).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_9).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 17).and(MASK_9).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 26).and(MASK_9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(7).lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 3).and(MASK_9).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 12).and(MASK_9).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 21).and(MASK_9).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 30).and(MASK_9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(0x7f).lanewise(VectorOperators.LSHL, 2).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 7).and(MASK_9).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 16).and(MASK_9).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 25).and(MASK_9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(3).lanewise(VectorOperators.LSHL, 7).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 2).and(MASK_9).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 11).and(MASK_9).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 20).and(MASK_9).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 29).and(MASK_9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(0x3f).lanewise(VectorOperators.LSHL, 3).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 6).and(MASK_9).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 15).and(MASK_9).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 24).and(MASK_9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.and(1).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 1).and(MASK_9).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 10).and(MASK_9).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 19).and(MASK_9).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 28).and(MASK_9); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.and(0x1f).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 5).and(MASK_9).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 14).and(MASK_9).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 23).and(MASK_9).intoArray(out, outpos); + outpos += VLEN_256; + } + + private static void fastunpack10(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + iV.and(MASK_10).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 10).and(MASK_10).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 20).and(MASK_10).intoArray(out, outpos); + outpos += VLEN_512; + + var oV = iV.lanewise(VectorOperators.LSHR, 30).and(MASK_10); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(0xff).lanewise(VectorOperators.LSHL, 2).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_10).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 18).and(MASK_10).intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 28).and(MASK_10); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.and(0x3f).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 6).and(MASK_10).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 16).and(MASK_10).intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 26).and(MASK_10); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.and(0xf).lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_10).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 14).and(MASK_10).intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 24).and(MASK_10); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.and(3).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 2).and(MASK_10).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 12).and(MASK_10).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 22).and(MASK_10).intoArray(out, outpos); + outpos += VLEN_512; + } + + private static void fastunpack11(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + iV.and(MASK_11).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 11).and(MASK_11).intoArray(out, outpos); + outpos += VLEN_256; + + var oV = iV.lanewise(VectorOperators.LSHR, 22).and(MASK_11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(1).lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 1).and(MASK_11).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 12).and(MASK_11).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 23).and(MASK_11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(3).lanewise(VectorOperators.LSHL, 9).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 2).and(MASK_11).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 13).and(MASK_11).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 24).and(MASK_11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(7).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 3).and(MASK_11).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 14).and(MASK_11).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 25).and(MASK_11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(0xf).lanewise(VectorOperators.LSHL, 7).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_11).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 15).and(MASK_11).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 26).and(MASK_11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(0x1f).lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 5).and(MASK_11).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 16).and(MASK_11).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 27).and(MASK_11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(0x3f).lanewise(VectorOperators.LSHL, 5).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 6).and(MASK_11).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 17).and(MASK_11).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 28).and(MASK_11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.and(0x7f).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 7).and(MASK_11).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 18).and(MASK_11).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 29).and(MASK_11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.and(0xff).lanewise(VectorOperators.LSHL, 3).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_11).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 19).and(MASK_11).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 30).and(MASK_11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.and(0x1ff).lanewise(VectorOperators.LSHL, 2).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 9).and(MASK_11).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 20).and(MASK_11).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 31).and(MASK_11); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.and(0x3ff).lanewise(VectorOperators.LSHL, 1).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 10).and(MASK_11).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 21).and(MASK_11).intoArray(out, outpos); + outpos += VLEN_256; + } + + private static void fastunpack12(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + iV.and(MASK_12).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 12).and(MASK_12).intoArray(out, outpos); + outpos += VLEN_512; + + var oV = iV.lanewise(VectorOperators.LSHR, 24).and(MASK_12); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(0xf).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_12).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 16).and(MASK_12).intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 28).and(MASK_12); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.and(0xff).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_12).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 20).and(MASK_12).intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.and(0xfff).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 12).and(MASK_12).intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 24).and(MASK_12); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.and(0xf).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_12).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 16).and(MASK_12).intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 28).and(MASK_12); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.and(0xff).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_12).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 20).and(MASK_12).intoArray(out, outpos); + outpos += VLEN_512; + } + + private static void fastunpack13(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + iV.and(MASK_13).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 13).and(MASK_13).intoArray(out, outpos); + outpos += VLEN_256; + + var oV = iV.lanewise(VectorOperators.LSHR, 26).and(MASK_13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(0x7f).lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 7).and(MASK_13).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 20).and(MASK_13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(1).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 1).and(MASK_13).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 14).and(MASK_13).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 27).and(MASK_13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(0xff).lanewise(VectorOperators.LSHL, 5).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_13).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 21).and(MASK_13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(3).lanewise(VectorOperators.LSHL, 11).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 2).and(MASK_13).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 15).and(MASK_13).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 28).and(MASK_13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(0x1ff).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 9).and(MASK_13).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 22).and(MASK_13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(7).lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 3).and(MASK_13).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 16).and(MASK_13).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 29).and(MASK_13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.and(0x3ff).lanewise(VectorOperators.LSHL, 3).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 10).and(MASK_13).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 23).and(MASK_13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.and(0xf).lanewise(VectorOperators.LSHL, 9).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_13).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 17).and(MASK_13).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 30).and(MASK_13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.and(0x7ff).lanewise(VectorOperators.LSHL, 2).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 11).and(MASK_13).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 24).and(MASK_13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.and(0x1f).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 5).and(MASK_13).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 18).and(MASK_13).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 31).and(MASK_13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.and(0xfff).lanewise(VectorOperators.LSHL, 1).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 12).and(MASK_13).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 25).and(MASK_13); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.and(0x3f).lanewise(VectorOperators.LSHL, 7).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 6).and(MASK_13).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 19).and(MASK_13).intoArray(out, outpos); + outpos += VLEN_256; + } + + private static void fastunpack14(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + iV.and(MASK_14).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 14).and(MASK_14).intoArray(out, outpos); + outpos += VLEN_512; + + var oV = iV.lanewise(VectorOperators.LSHR, 28).and(MASK_14); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(0x3ff).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 10).and(MASK_14).intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 24).and(MASK_14); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.and(0x3f).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 6).and(MASK_14).intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 20).and(MASK_14); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.and(3).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 2).and(MASK_14).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 16).and(MASK_14).intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 30).and(MASK_14); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.and(0xfff).lanewise(VectorOperators.LSHL, 2).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 12).and(MASK_14).intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 26).and(MASK_14); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.and(0xff).lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_14).intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 22).and(MASK_14); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.and(0xf).lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_14).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 18).and(MASK_14).intoArray(out, outpos); + outpos += VLEN_512; + } + + private static void fastunpack15(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + iV.and(MASK_15).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 15).and(MASK_15).intoArray(out, outpos); + outpos += VLEN_256; + + var oV = iV.lanewise(VectorOperators.LSHR, 30).and(MASK_15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(0x1fff).lanewise(VectorOperators.LSHL, 2).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 13).and(MASK_15).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 28).and(MASK_15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(0x7ff).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 11).and(MASK_15).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 26).and(MASK_15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(0x1ff).lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 9).and(MASK_15).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 24).and(MASK_15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(0x7f).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 7).and(MASK_15).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 22).and(MASK_15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(0x1f).lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 5).and(MASK_15).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 20).and(MASK_15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(7).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 3).and(MASK_15).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 18).and(MASK_15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.and(1).lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 1).and(MASK_15).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 16).and(MASK_15).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 31).and(MASK_15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.and(0x3fff).lanewise(VectorOperators.LSHL, 1).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 14).and(MASK_15).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 29).and(MASK_15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.and(0xfff).lanewise(VectorOperators.LSHL, 3).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 12).and(MASK_15).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 27).and(MASK_15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.and(0x3ff).lanewise(VectorOperators.LSHL, 5).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 10).and(MASK_15).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 25).and(MASK_15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.and(0xff).lanewise(VectorOperators.LSHL, 7).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_15).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 23).and(MASK_15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.and(0x3f).lanewise(VectorOperators.LSHL, 9).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 6).and(MASK_15).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 21).and(MASK_15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.and(0xf).lanewise(VectorOperators.LSHL, 11).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_15).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 19).and(MASK_15); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.and(3).lanewise(VectorOperators.LSHL, 13).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 2).and(MASK_15).intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 17).and(MASK_15).intoArray(out, outpos); + outpos += VLEN_256; + } + + private static void fastunpack16(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + iV.and(MASK_16).intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 16).and(MASK_16).intoArray(out, outpos); + outpos += VLEN_512; + + var oV = iV.and(MASK_16); + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(0xffff).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 16).and(MASK_16).intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.and(0xffff).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 16).and(MASK_16).intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.and(0xffff).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 16).and(MASK_16).intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.and(0xffff).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 16).and(MASK_16).intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.and(0xffff).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 16).and(MASK_16).intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.and(0xffff).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 16).and(MASK_16).intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.and(0xffff).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 16).and(MASK_16).intoArray(out, outpos); + outpos += VLEN_512; + } + + private static void fastunpack17(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + iV.and(MASK_17).intoArray(out, outpos); + outpos += VLEN_256; + + var oV = iV.lanewise(VectorOperators.LSHR, 17).and(MASK_17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(3).lanewise(VectorOperators.LSHL, 15).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 2).and(MASK_17).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 19).and(MASK_17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(0xf).lanewise(VectorOperators.LSHL, 13).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_17).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 21).and(MASK_17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(0x3f).lanewise(VectorOperators.LSHL, 11).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 6).and(MASK_17).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 23).and(MASK_17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(0xff).lanewise(VectorOperators.LSHL, 9).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_17).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 25).and(MASK_17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(0x3ff).lanewise(VectorOperators.LSHL, 7).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 10).and(MASK_17).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 27).and(MASK_17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(0xfff).lanewise(VectorOperators.LSHL, 5).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 12).and(MASK_17).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 29).and(MASK_17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.and(0x3fff).lanewise(VectorOperators.LSHL, 3).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 14).and(MASK_17).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 31).and(MASK_17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.and(0xffff).lanewise(VectorOperators.LSHL, 1).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 16).and(MASK_17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.and(1).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 1).and(MASK_17).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 18).and(MASK_17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.and(7).lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 3).and(MASK_17).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 20).and(MASK_17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.and(0x1f).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 5).and(MASK_17).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 22).and(MASK_17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.and(0x7f).lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 7).and(MASK_17).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 24).and(MASK_17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.and(0x1ff).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 9).and(MASK_17).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 26).and(MASK_17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.and(0x7ff).lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 11).and(MASK_17).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 28).and(MASK_17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.and(0x1fff).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 13).and(MASK_17).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 30).and(MASK_17); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.and(0x7fff).lanewise(VectorOperators.LSHL, 2).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 15).and(MASK_17).intoArray(out, outpos); + outpos += VLEN_256; + } + + private static void fastunpack18(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + iV.and(MASK_18).intoArray(out, outpos); + outpos += VLEN_512; + + var oV = iV.lanewise(VectorOperators.LSHR, 18).and(MASK_18); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(0xf).lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_18).intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 22).and(MASK_18); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.and(0xff).lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_18).intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 26).and(MASK_18); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.and(0xfff).lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 12).and(MASK_18).intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 30).and(MASK_18); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.and(0xffff).lanewise(VectorOperators.LSHL, 2).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 16).and(MASK_18); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.and(3).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 2).and(MASK_18).intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 20).and(MASK_18); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.and(0x3f).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 6).and(MASK_18).intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 24).and(MASK_18); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.and(0x3ff).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 10).and(MASK_18).intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 28).and(MASK_18); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.and(0x3fff).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 14).and(MASK_18).intoArray(out, outpos); + outpos += VLEN_512; + } + + private static void fastunpack19(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + iV.and(MASK_19).intoArray(out, outpos); + outpos += VLEN_256; + + var oV = iV.lanewise(VectorOperators.LSHR, 19).and(MASK_19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(0x3f).lanewise(VectorOperators.LSHL, 13).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 6).and(MASK_19).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 25).and(MASK_19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(0xfff).lanewise(VectorOperators.LSHL, 7).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 12).and(MASK_19).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 31).and(MASK_19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(0x3ffff).lanewise(VectorOperators.LSHL, 1).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 18).and(MASK_19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(0x1f).lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 5).and(MASK_19).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 24).and(MASK_19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(0x7ff).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 11).and(MASK_19).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 30).and(MASK_19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(0x1ffff).lanewise(VectorOperators.LSHL, 2).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 17).and(MASK_19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.and(0xf).lanewise(VectorOperators.LSHL, 15).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_19).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 23).and(MASK_19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.and(0x3ff).lanewise(VectorOperators.LSHL, 9).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 10).and(MASK_19).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 29).and(MASK_19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.and(0xffff).lanewise(VectorOperators.LSHL, 3).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 16).and(MASK_19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.and(7).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 3).and(MASK_19).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 22).and(MASK_19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.and(0x1ff).lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 9).and(MASK_19).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 28).and(MASK_19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.and(0x7fff).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 15).and(MASK_19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.and(3).lanewise(VectorOperators.LSHL, 17).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 2).and(MASK_19).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 21).and(MASK_19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.and(0xff).lanewise(VectorOperators.LSHL, 11).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_19).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 27).and(MASK_19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.and(0x3fff).lanewise(VectorOperators.LSHL, 5).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 14).and(MASK_19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.and(1).lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 1).and(MASK_19).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 20).and(MASK_19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.and(0x7f).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 7).and(MASK_19).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 26).and(MASK_19); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.and(0x1fff).lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 13).and(MASK_19).intoArray(out, outpos); + outpos += VLEN_256; + } + + private static void fastunpack20(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + iV.and(MASK_20).intoArray(out, outpos); + outpos += VLEN_512; + + var oV = iV.lanewise(VectorOperators.LSHR, 20).and(MASK_20); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(0xff).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_20).intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 28).and(MASK_20); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.and(0xffff).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 16).and(MASK_20); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.and(0xf).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_20).intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 24).and(MASK_20); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.and(0xfff).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 12).and(MASK_20).intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.and(0xfffff).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 20).and(MASK_20); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.and(0xff).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_20).intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 28).and(MASK_20); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.and(0xffff).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 16).and(MASK_20); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.and(0xf).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_20).intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 24).and(MASK_20); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.and(0xfff).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 12).and(MASK_20).intoArray(out, outpos); + outpos += VLEN_512; + } + + private static void fastunpack21(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + iV.and(MASK_21).intoArray(out, outpos); + outpos += VLEN_256; + + var oV = iV.lanewise(VectorOperators.LSHR, 21).and(MASK_21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(0x3ff).lanewise(VectorOperators.LSHL, 11).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 10).and(MASK_21).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 31).and(MASK_21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(0xfffff).lanewise(VectorOperators.LSHL, 1).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 20).and(MASK_21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(0x1ff).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 9).and(MASK_21).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 30).and(MASK_21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(0x7ffff).lanewise(VectorOperators.LSHL, 2).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 19).and(MASK_21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(0xff).lanewise(VectorOperators.LSHL, 13).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_21).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 29).and(MASK_21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(0x3ffff).lanewise(VectorOperators.LSHL, 3).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 18).and(MASK_21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.and(0x7f).lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 7).and(MASK_21).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 28).and(MASK_21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.and(0x1ffff).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 17).and(MASK_21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.and(0x3f).lanewise(VectorOperators.LSHL, 15).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 6).and(MASK_21).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 27).and(MASK_21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.and(0xffff).lanewise(VectorOperators.LSHL, 5).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 16).and(MASK_21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.and(0x1f).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 5).and(MASK_21).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 26).and(MASK_21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.and(0x7fff).lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 15).and(MASK_21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.and(0xf).lanewise(VectorOperators.LSHL, 17).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_21).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 25).and(MASK_21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.and(0x3fff).lanewise(VectorOperators.LSHL, 7).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 14).and(MASK_21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.and(7).lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 3).and(MASK_21).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 24).and(MASK_21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.and(0x1fff).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 13).and(MASK_21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.and(3).lanewise(VectorOperators.LSHL, 19).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 2).and(MASK_21).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 23).and(MASK_21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.and(0xfff).lanewise(VectorOperators.LSHL, 9).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 12).and(MASK_21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.and(1).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 1).and(MASK_21).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 22).and(MASK_21); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.and(0x7ff).lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 11).and(MASK_21).intoArray(out, outpos); + outpos += VLEN_256; + } + + private static void fastunpack22(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + iV.and(MASK_22).intoArray(out, outpos); + outpos += VLEN_512; + + var oV = iV.lanewise(VectorOperators.LSHR, 22).and(MASK_22); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(0xfff).lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 12).and(MASK_22); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.and(3).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 2).and(MASK_22).intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 24).and(MASK_22); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.and(0x3fff).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 14).and(MASK_22); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.and(0xf).lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_22).intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 26).and(MASK_22); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.and(0xffff).lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 16).and(MASK_22); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.and(0x3f).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 6).and(MASK_22).intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 28).and(MASK_22); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.and(0x3ffff).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 18).and(MASK_22); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.and(0xff).lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_22).intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 30).and(MASK_22); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.and(0xfffff).lanewise(VectorOperators.LSHL, 2).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 20).and(MASK_22); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.and(0x3ff).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 10).and(MASK_22).intoArray(out, outpos); + outpos += VLEN_512; + } + + private static void fastunpack23(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + iV.and(MASK_23).intoArray(out, outpos); + outpos += VLEN_256; + + var oV = iV.lanewise(VectorOperators.LSHR, 23).and(MASK_23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(0x3fff).lanewise(VectorOperators.LSHL, 9).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 14).and(MASK_23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(0x1f).lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 5).and(MASK_23).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 28).and(MASK_23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(0x7ffff).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 19).and(MASK_23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(0x3ff).lanewise(VectorOperators.LSHL, 13).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 10).and(MASK_23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(1).lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 1).and(MASK_23).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 24).and(MASK_23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(0x7fff).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 15).and(MASK_23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.and(0x3f).lanewise(VectorOperators.LSHL, 17).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 6).and(MASK_23).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 29).and(MASK_23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.and(0xfffff).lanewise(VectorOperators.LSHL, 3).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 20).and(MASK_23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.and(0x7ff).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 11).and(MASK_23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.and(3).lanewise(VectorOperators.LSHL, 21).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 2).and(MASK_23).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 25).and(MASK_23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.and(0xffff).lanewise(VectorOperators.LSHL, 7).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 16).and(MASK_23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.and(0x7f).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 7).and(MASK_23).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 30).and(MASK_23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.and(0x1fffff).lanewise(VectorOperators.LSHL, 2).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 21).and(MASK_23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.and(0xfff).lanewise(VectorOperators.LSHL, 11).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 12).and(MASK_23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.and(7).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 3).and(MASK_23).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 26).and(MASK_23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.and(0x1ffff).lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 17).and(MASK_23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.and(0xff).lanewise(VectorOperators.LSHL, 15).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_23).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 31).and(MASK_23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.and(0x3fffff).lanewise(VectorOperators.LSHL, 1).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 22).and(MASK_23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.and(0x1fff).lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 13).and(MASK_23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.and(0xf).lanewise(VectorOperators.LSHL, 19).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_23).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 27).and(MASK_23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.and(0x3ffff).lanewise(VectorOperators.LSHL, 5).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 18).and(MASK_23); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.and(0x1ff).lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 9).and(MASK_23).intoArray(out, outpos); + outpos += VLEN_256; + } + + private static void fastunpack24(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + iV.and(MASK_24).intoArray(out, outpos); + outpos += VLEN_512; + + var oV = iV.lanewise(VectorOperators.LSHR, 24).and(MASK_24); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(0xffff).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 16).and(MASK_24); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.and(0xff).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_24).intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.and(0xffffff).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 24).and(MASK_24); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.and(0xffff).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 16).and(MASK_24); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.and(0xff).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_24).intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.and(0xffffff).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 24).and(MASK_24); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.and(0xffff).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 16).and(MASK_24); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.and(0xff).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_24).intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.and(0xffffff).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 24).and(MASK_24); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.and(0xffff).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 16).and(MASK_24); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.and(0xff).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 8).and(MASK_24).intoArray(out, outpos); + outpos += VLEN_512; + } + + private static void fastunpack25(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + iV.and(MASK_25).intoArray(out, outpos); + outpos += VLEN_256; + + var oV = iV.lanewise(VectorOperators.LSHR, 25).and(MASK_25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(0x3ffff).lanewise(VectorOperators.LSHL, 7).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 18).and(MASK_25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(0x7ff).lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 11).and(MASK_25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(0xf).lanewise(VectorOperators.LSHL, 21).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_25).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 29).and(MASK_25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(0x3fffff).lanewise(VectorOperators.LSHL, 3).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 22).and(MASK_25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(0x7fff).lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 15).and(MASK_25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(0xff).lanewise(VectorOperators.LSHL, 17).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 8).and(MASK_25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.and(1).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 1).and(MASK_25).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 26).and(MASK_25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.and(0x7ffff).lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 19).and(MASK_25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.and(0xfff).lanewise(VectorOperators.LSHL, 13).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 12).and(MASK_25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.and(0x1f).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 5).and(MASK_25).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 30).and(MASK_25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.and(0x7fffff).lanewise(VectorOperators.LSHL, 2).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 23).and(MASK_25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.and(0xffff).lanewise(VectorOperators.LSHL, 9).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 16).and(MASK_25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.and(0x1ff).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 9).and(MASK_25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.and(3).lanewise(VectorOperators.LSHL, 23).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 2).and(MASK_25).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 27).and(MASK_25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.and(0xfffff).lanewise(VectorOperators.LSHL, 5).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 20).and(MASK_25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.and(0x1fff).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 13).and(MASK_25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.and(0x3f).lanewise(VectorOperators.LSHL, 19).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 6).and(MASK_25).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 31).and(MASK_25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.and(0xffffff).lanewise(VectorOperators.LSHL, 1).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 24).and(MASK_25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.and(0x1ffff).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 17).and(MASK_25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.and(0x3ff).lanewise(VectorOperators.LSHL, 15).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 10).and(MASK_25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.and(7).lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 3).and(MASK_25).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 28).and(MASK_25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.and(0x1fffff).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 21).and(MASK_25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.and(0x3fff).lanewise(VectorOperators.LSHL, 11).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 14).and(MASK_25); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.and(0x7f).lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 7).and(MASK_25).intoArray(out, outpos); + outpos += VLEN_256; + } + + private static void fastunpack26(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + iV.and(MASK_26).intoArray(out, outpos); + outpos += VLEN_512; + + var oV = iV.lanewise(VectorOperators.LSHR, 26).and(MASK_26); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(0xfffff).lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 20).and(MASK_26); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.and(0x3fff).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 14).and(MASK_26); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.and(0xff).lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 8).and(MASK_26); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.and(3).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 2).and(MASK_26).intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 28).and(MASK_26); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.and(0x3fffff).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 22).and(MASK_26); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.and(0xffff).lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 16).and(MASK_26); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.and(0x3ff).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 10).and(MASK_26); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.and(0xf).lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_26).intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 30).and(MASK_26); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.and(0xffffff).lanewise(VectorOperators.LSHL, 2).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 24).and(MASK_26); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.and(0x3ffff).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 18).and(MASK_26); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.and(0xfff).lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 12).and(MASK_26); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.and(0x3f).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 6).and(MASK_26).intoArray(out, outpos); + outpos += VLEN_512; + } + + private static void fastunpack27(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + iV.and(MASK_27).intoArray(out, outpos); + outpos += VLEN_256; + + var oV = iV.lanewise(VectorOperators.LSHR, 27).and(MASK_27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(0x3fffff).lanewise(VectorOperators.LSHL, 5).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 22).and(MASK_27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(0x1ffff).lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 17).and(MASK_27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(0xfff).lanewise(VectorOperators.LSHL, 15).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 12).and(MASK_27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(0x7f).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 7).and(MASK_27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(3).lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 2).and(MASK_27).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 29).and(MASK_27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(0xffffff).lanewise(VectorOperators.LSHL, 3).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 24).and(MASK_27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.and(0x7ffff).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 19).and(MASK_27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.and(0x3fff).lanewise(VectorOperators.LSHL, 13).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 14).and(MASK_27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.and(0x1ff).lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 9).and(MASK_27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.and(0xf).lanewise(VectorOperators.LSHL, 23).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_27).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 31).and(MASK_27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.and(0x3ffffff).lanewise(VectorOperators.LSHL, 1).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 26).and(MASK_27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.and(0x1fffff).lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 21).and(MASK_27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.and(0xffff).lanewise(VectorOperators.LSHL, 11).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 16).and(MASK_27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.and(0x7ff).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 11).and(MASK_27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.and(0x3f).lanewise(VectorOperators.LSHL, 21).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 6).and(MASK_27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.and(1).lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 1).and(MASK_27).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 28).and(MASK_27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.and(0x7fffff).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 23).and(MASK_27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.and(0x3ffff).lanewise(VectorOperators.LSHL, 9).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 18).and(MASK_27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.and(0x1fff).lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 13).and(MASK_27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.and(0xff).lanewise(VectorOperators.LSHL, 19).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 8).and(MASK_27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.and(7).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 3).and(MASK_27).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 30).and(MASK_27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.and(0x1ffffff).lanewise(VectorOperators.LSHL, 2).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 25).and(MASK_27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.and(0xfffff).lanewise(VectorOperators.LSHL, 7).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 20).and(MASK_27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.and(0x7fff).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 15).and(MASK_27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.and(0x3ff).lanewise(VectorOperators.LSHL, 17).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 10).and(MASK_27); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.and(0x1f).lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 5).and(MASK_27).intoArray(out, outpos); + outpos += VLEN_256; + } + + private static void fastunpack28(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + iV.and(MASK_28).intoArray(out, outpos); + outpos += VLEN_512; + + var oV = iV.lanewise(VectorOperators.LSHR, 28).and(MASK_28); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(0xffffff).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 24).and(MASK_28); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.and(0xfffff).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 20).and(MASK_28); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.and(0xffff).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 16).and(MASK_28); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.and(0xfff).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 12).and(MASK_28); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.and(0xff).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 8).and(MASK_28); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.and(0xf).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_28).intoArray(out, outpos); + outpos += VLEN_512; + + oV = oV.zero(SPECIES_512); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.and(0xfffffff).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 28).and(MASK_28); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.and(0xffffff).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 24).and(MASK_28); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.and(0xfffff).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 20).and(MASK_28); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.and(0xffff).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 16).and(MASK_28); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.and(0xfff).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 12).and(MASK_28); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.and(0xff).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 8).and(MASK_28); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.and(0xf).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 4).and(MASK_28).intoArray(out, outpos); + outpos += VLEN_512; + } + + private static void fastunpack29(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + iV.and(MASK_29).intoArray(out, outpos); + outpos += VLEN_256; + + var oV = iV.lanewise(VectorOperators.LSHR, 29).and(MASK_29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(0x3ffffff).lanewise(VectorOperators.LSHL, 3).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 26).and(MASK_29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(0x7fffff).lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 23).and(MASK_29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(0xfffff).lanewise(VectorOperators.LSHL, 9).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 20).and(MASK_29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(0x1ffff).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 17).and(MASK_29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(0x3fff).lanewise(VectorOperators.LSHL, 15).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 14).and(MASK_29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(0x7ff).lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 11).and(MASK_29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.and(0xff).lanewise(VectorOperators.LSHL, 21).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 8).and(MASK_29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.and(0x1f).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 5).and(MASK_29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.and(3).lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 2).and(MASK_29).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 31).and(MASK_29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.and(0xfffffff).lanewise(VectorOperators.LSHL, 1).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 28).and(MASK_29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.and(0x1ffffff).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 25).and(MASK_29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.and(0x3fffff).lanewise(VectorOperators.LSHL, 7).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 22).and(MASK_29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.and(0x7ffff).lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 19).and(MASK_29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.and(0xffff).lanewise(VectorOperators.LSHL, 13).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 16).and(MASK_29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.and(0x1fff).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 13).and(MASK_29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.and(0x3ff).lanewise(VectorOperators.LSHL, 19).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 10).and(MASK_29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.and(0x7f).lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 7).and(MASK_29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.and(0xf).lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 4).and(MASK_29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.and(1).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 1).and(MASK_29).intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 30).and(MASK_29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.and(0x7ffffff).lanewise(VectorOperators.LSHL, 2).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 27).and(MASK_29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.and(0xffffff).lanewise(VectorOperators.LSHL, 5).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 24).and(MASK_29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.and(0x1fffff).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 21).and(MASK_29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.and(0x3ffff).lanewise(VectorOperators.LSHL, 11).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 18).and(MASK_29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.and(0x7fff).lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 15).and(MASK_29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.and(0xfff).lanewise(VectorOperators.LSHL, 17).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 12).and(MASK_29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.and(0x1ff).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 9).and(MASK_29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.and(0x3f).lanewise(VectorOperators.LSHL, 23).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 6).and(MASK_29); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.and(7).lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 3).and(MASK_29).intoArray(out, outpos); + outpos += VLEN_256; + } + + private static void fastunpack30(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + iV.and(MASK_30).intoArray(out, outpos); + outpos += VLEN_512; + + var oV = iV.lanewise(VectorOperators.LSHR, 30).and(MASK_30); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 16); + oV = iV.and(0xfffffff).lanewise(VectorOperators.LSHL, 2).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 28).and(MASK_30); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 32); + oV = iV.and(0x3ffffff).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 26).and(MASK_30); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 48); + oV = iV.and(0xffffff).lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 24).and(MASK_30); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 64); + oV = iV.and(0x3fffff).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 22).and(MASK_30); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 80); + oV = iV.and(0xfffff).lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 20).and(MASK_30); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 96); + oV = iV.and(0x3ffff).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 18).and(MASK_30); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 112); + oV = iV.and(0xffff).lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 16).and(MASK_30); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 128); + oV = iV.and(0x3fff).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 14).and(MASK_30); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 144); + oV = iV.and(0xfff).lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 12).and(MASK_30); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 160); + oV = iV.and(0x3ff).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 10).and(MASK_30); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 176); + oV = iV.and(0xff).lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 8).and(MASK_30); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 192); + oV = iV.and(0x3f).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 6).and(MASK_30); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 208); + oV = iV.and(0xf).lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + oV = iV.lanewise(VectorOperators.LSHR, 4).and(MASK_30); + + iV = IntVector.fromArray(SPECIES_512, in, inpos + 224); + oV = iV.and(3).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_512; + + iV.lanewise(VectorOperators.LSHR, 2).and(MASK_30).intoArray(out, outpos); + outpos += VLEN_512; + } + + private static void fastunpack31(final int[] in, int inpos, final int[] out, + int outpos) { + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + iV.and(MASK_31).intoArray(out, outpos); + outpos += VLEN_256; + + var oV = iV.lanewise(VectorOperators.LSHR, 31).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 8); + oV = iV.and(0x3fffffff).lanewise(VectorOperators.LSHL, 1).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 30).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 16); + oV = iV.and(0x1fffffff).lanewise(VectorOperators.LSHL, 2).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 29).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 24); + oV = iV.and(0xfffffff).lanewise(VectorOperators.LSHL, 3).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 28).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 32); + oV = iV.and(0x7ffffff).lanewise(VectorOperators.LSHL, 4).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 27).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 40); + oV = iV.and(0x3ffffff).lanewise(VectorOperators.LSHL, 5).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 26).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 48); + oV = iV.and(0x1ffffff).lanewise(VectorOperators.LSHL, 6).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 25).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 56); + oV = iV.and(0xffffff).lanewise(VectorOperators.LSHL, 7).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 24).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 64); + oV = iV.and(0x7fffff).lanewise(VectorOperators.LSHL, 8).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 23).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 72); + oV = iV.and(0x3fffff).lanewise(VectorOperators.LSHL, 9).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 22).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 80); + oV = iV.and(0x1fffff).lanewise(VectorOperators.LSHL, 10).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 21).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 88); + oV = iV.and(0xfffff).lanewise(VectorOperators.LSHL, 11).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 20).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 96); + oV = iV.and(0x7ffff).lanewise(VectorOperators.LSHL, 12).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 19).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 104); + oV = iV.and(0x3ffff).lanewise(VectorOperators.LSHL, 13).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 18).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 112); + oV = iV.and(0x1ffff).lanewise(VectorOperators.LSHL, 14).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 17).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 120); + oV = iV.and(0xffff).lanewise(VectorOperators.LSHL, 15).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 16).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 128); + oV = iV.and(0x7fff).lanewise(VectorOperators.LSHL, 16).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 15).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 136); + oV = iV.and(0x3fff).lanewise(VectorOperators.LSHL, 17).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 14).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 144); + oV = iV.and(0x1fff).lanewise(VectorOperators.LSHL, 18).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 13).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 152); + oV = iV.and(0xfff).lanewise(VectorOperators.LSHL, 19).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 12).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 160); + oV = iV.and(0x7ff).lanewise(VectorOperators.LSHL, 20).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 11).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 168); + oV = iV.and(0x3ff).lanewise(VectorOperators.LSHL, 21).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 10).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 176); + oV = iV.and(0x1ff).lanewise(VectorOperators.LSHL, 22).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 9).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 184); + oV = iV.and(0xff).lanewise(VectorOperators.LSHL, 23).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 8).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 192); + oV = iV.and(0x7f).lanewise(VectorOperators.LSHL, 24).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 7).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 200); + oV = iV.and(0x3f).lanewise(VectorOperators.LSHL, 25).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 6).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 208); + oV = iV.and(0x1f).lanewise(VectorOperators.LSHL, 26).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 5).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 216); + oV = iV.and(0xf).lanewise(VectorOperators.LSHL, 27).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 4).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 224); + oV = iV.and(7).lanewise(VectorOperators.LSHL, 28).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 3).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 232); + oV = iV.and(3).lanewise(VectorOperators.LSHL, 29).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + oV = iV.lanewise(VectorOperators.LSHR, 2).and(MASK_31); + + iV = IntVector.fromArray(SPECIES_256, in, inpos + 240); + oV = iV.and(1).lanewise(VectorOperators.LSHL, 30).or(oV); + + oV.intoArray(out, outpos); + outpos += VLEN_256; + + iV.lanewise(VectorOperators.LSHR, 1).and(MASK_31).intoArray(out, outpos); + outpos += VLEN_256; + } +} diff --git a/src/main/java/me/lemire/integercompression/vector/VectorBitPackerTerse.java b/src/main/java/me/lemire/integercompression/vector/VectorBitPackerTerse.java new file mode 100644 index 0000000..62a8cc7 --- /dev/null +++ b/src/main/java/me/lemire/integercompression/vector/VectorBitPackerTerse.java @@ -0,0 +1,963 @@ +// Copyright (C) 2022 Intel Corporation + +// SPDX-License-Identifier: Apache-2.0 + +package me.lemire.integercompression.vector; + +import java.util.Arrays; +import jdk.incubator.vector.*; + +/** + * This is a readable but less efficient version of the VectorBitPacker class. + * + */ +public class VectorBitPackerTerse { + static final VectorSpecies SPECIES_512 = IntVector.SPECIES_512; + static final VectorSpecies SPECIES_256 = IntVector.SPECIES_256; + static final int VLEN_512 = 16; + static final int VLEN_256 = 8; + static final int BLOCK_SIZE = 256; + + private static void fastpackOddBit(final int[] in, int inpos, final int[] out, + int outpos, int b, final int[] ho, + final int[] lc) { + final int mask = (1 << b) - 1; + final int N = 31 / b; + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV.and(mask); + int n = 1; + for (; n <= N; n++) { + iV = IntVector.fromArray(SPECIES_256, in, inpos + n * VLEN_256); + oV = iV.and(mask).lanewise(VectorOperators.LSHL, b * n).or(oV); + } + oV.intoArray(out, outpos); + outpos += VLEN_256; + + final int L = b - 1; + for (int i = 0; i < L; i++) { + oV = iV.and(mask).lanewise(VectorOperators.LSHR, ho[i]); + for (int j = 0; j < lc[i]; j++) { + iV = IntVector.fromArray(SPECIES_256, in, inpos + n * VLEN_256); + oV = iV.and(mask) + .lanewise(VectorOperators.LSHL, b * j + (b - ho[i])) + .or(oV); + n++; + } + oV.intoArray(out, outpos); + outpos += VLEN_256; + } + } + + private static void fastpackOddBitNoMask(final int[] in, int inpos, + final int[] out, int outpos, int b, + final int[] ho, final int[] lc) { + final int N = 31 / b; + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + var oV = iV; + int n = 1; + for (; n <= N; n++) { + iV = IntVector.fromArray(SPECIES_256, in, inpos + n * VLEN_256); + oV = iV.lanewise(VectorOperators.LSHL, b * n).or(oV); + } + oV.intoArray(out, outpos); + outpos += VLEN_256; + + final int L = b - 1; + for (int i = 0; i < L; i++) { + oV = iV.lanewise(VectorOperators.LSHR, ho[i]); + for (int j = 0; j < lc[i]; j++) { + iV = IntVector.fromArray(SPECIES_256, in, inpos + n * VLEN_256); + oV = iV.lanewise(VectorOperators.LSHL, b * j + (b - ho[i])).or(oV); + n++; + } + oV.intoArray(out, outpos); + outpos += VLEN_256; + } + } + + private static void fastUnpackOddBit(final int[] in, int inpos, + final int[] out, int outpos, int b, + final int[] lo, int[] masks, int[] lc) { + final int mask = (1 << b) - 1; + final int N = 32 / b; + var iV = IntVector.fromArray(SPECIES_256, in, inpos); + int n = 0; + for (; n < N; n++) { + iV.lanewise(VectorOperators.LSHR, b * n).and(mask).intoArray(out, outpos); + outpos += VLEN_256; + } + var oV = iV.lanewise(VectorOperators.LSHR, b * n).and(mask); + + final int L = b - 1; + for (int i = 0; i < L; i++) { + iV = IntVector.fromArray(SPECIES_256, in, inpos + (i + 1) * VLEN_256); + oV = iV.and(masks[i]).lanewise(VectorOperators.LSHL, b - lo[i]).or(oV); + oV.intoArray(out, outpos); + outpos += VLEN_256; + int j = 0; + for (; j < lc[i]; j++) { + iV.lanewise(VectorOperators.LSHR, b * j + lo[i]) + .and(mask) + .intoArray(out, outpos); + outpos += VLEN_256; + n++; + } + oV = iV.lanewise(VectorOperators.LSHR, b * j + lo[i]).and(mask); + } + } + + private static void fastpackEvenBit(final int[] in, int inpos, + final int[] out, int outpos, int b, + final int[] ho, final int[] lc) { + final int mask = (1 << b) - 1; + final int N = 32 % b == 0 ? (32 / b) - 1 : 32 / b; + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV.and(mask); + int n = 1; + for (; n <= N; n++) { + iV = IntVector.fromArray(SPECIES_512, in, inpos + n * VLEN_512); + oV = iV.and(mask).lanewise(VectorOperators.LSHL, b * n).or(oV); + } + oV.intoArray(out, outpos); + outpos += VLEN_512; + + final int L = (b >>> 1) - 1; + for (int i = 0; i < L; i++) { + if (ho[i] != b) + oV = iV.and(mask).lanewise(VectorOperators.LSHR, ho[i]); + else + oV = oV.zero(SPECIES_512); + for (int j = 0; j < lc[i]; j++) { + iV = IntVector.fromArray(SPECIES_512, in, inpos + n * VLEN_512); + oV = iV.and(mask) + .lanewise(VectorOperators.LSHL, b * j + (b - ho[i])) + .or(oV); + n++; + } + oV.intoArray(out, outpos); + outpos += VLEN_512; + } + } + + private static void fastpackEvenBitNoMask(final int[] in, int inpos, + final int[] out, int outpos, int b, + final int[] ho, final int[] lc) { + final int N = 32 % b == 0 ? (32 / b) - 1 : 32 / b; + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + var oV = iV; + int n = 1; + for (; n <= N; n++) { + iV = IntVector.fromArray(SPECIES_512, in, inpos + n * VLEN_512); + oV = iV.lanewise(VectorOperators.LSHL, b * n).or(oV); + } + oV.intoArray(out, outpos); + outpos += VLEN_512; + + final int L = (b >>> 1) - 1; + for (int i = 0; i < L; i++) { + if (ho[i] != b) + oV = iV.lanewise(VectorOperators.LSHR, ho[i]); + else + oV = oV.zero(SPECIES_512); + for (int j = 0; j < lc[i]; j++) { + iV = IntVector.fromArray(SPECIES_512, in, inpos + n * VLEN_512); + oV = iV.lanewise(VectorOperators.LSHL, b * j + (b - ho[i])).or(oV); + n++; + } + oV.intoArray(out, outpos); + outpos += VLEN_512; + } + } + + private static void fastUnpackEventBit(final int[] in, int inpos, + final int[] out, int outpos, int b, + final int[] lo, int[] masks, + int[] lc) { + final int mask = (1 << b) - 1; + final int N = 32 / b; + var iV = IntVector.fromArray(SPECIES_512, in, inpos); + int n = 0; + for (; n < N; n++) { + iV.lanewise(VectorOperators.LSHR, b * n).and(mask).intoArray(out, outpos); + outpos += VLEN_512; + } + var oV = iV.lanewise(VectorOperators.LSHR, b * n).and(mask); + if ((b & (b - 1)) == 0) + oV = oV.zero(SPECIES_512); + + final int L = (b >>> 1) - 1; + for (int i = 0; i < L; i++) { + iV = IntVector.fromArray(SPECIES_512, in, inpos + (i + 1) * VLEN_512); + oV = iV.and(masks[i]).lanewise(VectorOperators.LSHL, b - lo[i]).or(oV); + oV.intoArray(out, outpos); + outpos += VLEN_512; + int j = 0; + for (; j < lc[i]; j++) { + iV.lanewise(VectorOperators.LSHR, b * j + lo[i]) + .and(mask) + .intoArray(out, outpos); + outpos += VLEN_512; + n++; + } + if ((32 - lo[i]) % b != 0) + oV = iV.lanewise(VectorOperators.LSHR, b * j + lo[i]).and(mask); + else + oV = oV.zero(SPECIES_512); + } + } + + public static int slowpack(final int[] in, int inpos, int inlen, + final int[] out, int outpos, int b) { + if (inlen == 0) + return outpos; + if (b == 32) { + System.arraycopy(in, inpos, out, outpos, inlen); + return outpos + inlen; + } + int mask = (1 << b) - 1; + int c = 0; + int l = 0; + int r = 0; + int val = 0; + for (int i = 0; i < inlen; i++) { + val = in[inpos + i] & mask; + out[outpos] |= val << (c + r); + c += b; + l = (32 - r) % b; + if (c + r >= 32) { + if (i < inlen - 1 || l != 0) + outpos++; + r = l == 0 ? 0 : b - l; + if (l != 0) + out[outpos] = val >> (b - r); + c = 0; + } + } + return outpos; + } + + public static int slowunpack(final int[] in, int inpos, final int[] out, + int outpos, int outlen, int b) { + if (outlen == 0) { + return inpos; + } + if (b == 32) { + System.arraycopy(in, inpos, out, outpos, outlen); + return inpos + outlen; + } + int mask = (1 << b) - 1; + int limit = outpos + outlen; + int r = 0; + int val = 0; + int i = 0; + for (; outpos < limit; i++) { + if (r > 0) + out[outpos++] = + (val >>> (32 - (b - r))) | ((in[inpos + i] << (b - r)) & mask); + val = in[inpos + i]; + int j = 0; + int l = 32 - r; + int ll = l % b == 0 ? l : l - b; + while (j < ll && outpos < limit) { + out[outpos++] = (val >> (j + r)) & mask; + j += b; + } + r = l % b == 0 ? 0 : b - (l % b); + } + return inpos + i; + } + + public static int numCompressedInts(int n, int b) { + int width = b % 2 == 0 ? VLEN_512 : VLEN_256; + if (n <= width) + return n; + int intsPerVec = (32 / b) * width; + int q = (n + intsPerVec - 1) / intsPerVec; + return q * width; + } + + public static void fastpack(final int[] in, int inpos, final int[] out, + int outpos, int b) { + switch (b) { + case 0: + break; + case 1: + fastpackOddBit(in, inpos, out, outpos, 1, new int[] {}, new int[] {}); + break; + case 2: + fastpackEvenBit(in, inpos, out, outpos, 2, new int[] {}, new int[] {}); + break; + case 3: + fastpackOddBit(in, inpos, out, outpos, 3, new int[] {0x2, 0x1}, + new int[] {0xb, 0xa}); + break; + case 4: + fastpackEvenBit(in, inpos, out, outpos, 4, new int[] {0x4}, + new int[] {0x8}); + break; + case 5: + fastpackOddBit(in, inpos, out, outpos, 5, new int[] {0x2, 0x4, 0x1, 0x3}, + new int[] {0x6, 0x7, 0x6, 0x6}); + break; + case 6: + fastpackEvenBit(in, inpos, out, outpos, 6, new int[] {0x2, 0x4}, + new int[] {0x5, 0x5}); + break; + case 7: + fastpackOddBit(in, inpos, out, outpos, 7, + new int[] {0x4, 0x1, 0x5, 0x2, 0x6, 0x3}, + new int[] {0x5, 0x4, 0x5, 0x4, 0x5, 0x4}); + break; + case 8: + fastpackEvenBit(in, inpos, out, outpos, 8, new int[] {0x8, 0x8, 0x8}, + new int[] {0x4, 0x4, 0x4}); + break; + case 9: + fastpackOddBit(in, inpos, out, outpos, 9, + new int[] {0x5, 0x1, 0x6, 0x2, 0x7, 0x3, 0x8, 0x4}, + new int[] {0x4, 0x3, 0x4, 0x3, 0x4, 0x3, 0x4, 0x3}); + break; + case 10: + fastpackEvenBit(in, inpos, out, outpos, 10, + new int[] {0x2, 0x4, 0x6, 0x8}, + new int[] {0x3, 0x3, 0x3, 0x3}); + break; + case 11: + fastpackOddBit( + in, inpos, out, outpos, 11, + new int[] {0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1}, + new int[] {0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x2}); + break; + case 12: + fastpackEvenBit(in, inpos, out, outpos, 12, + new int[] {0x8, 0x4, 0xc, 0x8, 0x4}, + new int[] {0x3, 0x2, 0x3, 0x3, 0x2}); + break; + case 13: + fastpackOddBit(in, inpos, out, outpos, 13, + new int[] {0x6, 0xc, 0x5, 0xb, 0x4, 0xa, 0x3, 0x9, 0x2, + 0x8, 0x1, 0x7}, + new int[] {0x2, 0x3, 0x2, 0x3, 0x2, 0x3, 0x2, 0x3, 0x2, + 0x3, 0x2, 0x2}); + break; + case 14: + fastpackEvenBit(in, inpos, out, outpos, 14, + new int[] {0x4, 0x8, 0xc, 0x2, 0x6, 0xa}, + new int[] {0x2, 0x2, 0x3, 0x2, 0x2, 0x2}); + break; + case 15: + fastpackOddBit(in, inpos, out, outpos, 15, + new int[] {0x2, 0x4, 0x6, 0x8, 0xa, 0xc, 0xe, 0x1, 0x3, + 0x5, 0x7, 0x9, 0xb, 0xd}, + new int[] {0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x3, 0x2, 0x2, + 0x2, 0x2, 0x2, 0x2, 0x2}); + break; + case 16: + fastpackEvenBit(in, inpos, out, outpos, 16, + new int[] {0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10}, + new int[] {0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2}); + break; + case 17: + fastpackOddBit(in, inpos, out, outpos, 17, + new int[] {0xf, 0xd, 0xb, 0x9, 0x7, 0x5, 0x3, 0x1, 0x10, + 0xe, 0xc, 0xa, 0x8, 0x6, 0x4, 0x2}, + new int[] {0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x1, 0x2, + 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x1}); + break; + case 18: + fastpackEvenBit(in, inpos, out, outpos, 18, + new int[] {0xe, 0xa, 0x6, 0x2, 0x10, 0xc, 0x8, 0x4}, + new int[] {0x2, 0x2, 0x2, 0x1, 0x2, 0x2, 0x2, 0x1}); + break; + case 19: + fastpackOddBit(in, inpos, out, outpos, 19, + new int[] {0xd, 0x7, 0x1, 0xe, 0x8, 0x2, 0xf, 0x9, 0x3, + 0x10, 0xa, 0x4, 0x11, 0xb, 0x5, 0x12, 0xc, 0x6}, + new int[] {0x2, 0x2, 0x1, 0x2, 0x2, 0x1, 0x2, 0x2, 0x1, + 0x2, 0x2, 0x1, 0x2, 0x2, 0x1, 0x2, 0x2, 0x1}); + break; + case 20: + fastpackEvenBit( + in, inpos, out, outpos, 20, + new int[] {0xc, 0x4, 0x10, 0x8, 0x14, 0xc, 0x4, 0x10, 0x8}, + new int[] {0x2, 0x1, 0x2, 0x1, 0x2, 0x2, 0x1, 0x2, 0x1}); + break; + case 21: + fastpackOddBit( + in, inpos, out, outpos, 21, + new int[] {0xb, 0x1, 0xc, 0x2, 0xd, 0x3, 0xe, 0x4, 0xf, 0x5, + 0x10, 0x6, 0x11, 0x7, 0x12, 0x8, 0x13, 0x9, 0x14, 0xa}, + new int[] {0x2, 0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x1, + 0x2, 0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x1}); + break; + case 22: + fastpackEvenBit( + in, inpos, out, outpos, 22, + new int[] {0xa, 0x14, 0x8, 0x12, 0x6, 0x10, 0x4, 0xe, 0x2, 0xc}, + new int[] {0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x1, 0x1}); + break; + case 23: + fastpackOddBit(in, inpos, out, outpos, 23, + new int[] {0x9, 0x12, 0x4, 0xd, 0x16, 0x8, 0x11, 0x3, + 0xc, 0x15, 0x7, 0x10, 0x2, 0xb, 0x14, 0x6, + 0xf, 0x1, 0xa, 0x13, 0x5, 0xe}, + new int[] {0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x2, 0x1, + 0x1, 0x2, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, + 0x2, 0x1, 0x1, 0x2, 0x1, 0x1}); + break; + case 24: + fastpackEvenBit( + in, inpos, out, outpos, 24, + new int[] {0x8, 0x10, 0x18, 0x8, 0x10, 0x18, 0x8, 0x10, 0x18, 0x8, + 0x10}, + new int[] {0x1, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1}); + break; + case 25: + fastpackOddBit(in, inpos, out, outpos, 25, + new int[] {0x7, 0xe, 0x15, 0x3, 0xa, 0x11, 0x18, 0x6, + 0xd, 0x14, 0x2, 0x9, 0x10, 0x17, 0x5, 0xc, + 0x13, 0x1, 0x8, 0xf, 0x16, 0x4, 0xb, 0x12}, + new int[] {0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x2, 0x1, + 0x1, 0x2, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, + 0x2, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1}); + break; + case 26: + fastpackEvenBit(in, inpos, out, outpos, 26, + new int[] {0x6, 0xc, 0x12, 0x18, 0x4, 0xa, 0x10, 0x16, + 0x2, 0x8, 0xe, 0x14}, + new int[] {0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x2, 0x1, + 0x1, 0x1, 0x1}); + break; + case 27: + fastpackOddBit(in, inpos, out, outpos, 27, + new int[] {0x5, 0xa, 0xf, 0x14, 0x19, 0x3, 0x8, + 0xd, 0x12, 0x17, 0x1, 0x6, 0xb, 0x10, + 0x15, 0x1a, 0x4, 0x9, 0xe, 0x13, 0x18, + 0x2, 0x7, 0xc, 0x11, 0x16}, + new int[] {0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, + 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, + 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1}); + break; + case 28: + fastpackEvenBit(in, inpos, out, outpos, 28, + new int[] {0x4, 0x8, 0xc, 0x10, 0x14, 0x18, 0x1c, 0x4, + 0x8, 0xc, 0x10, 0x14, 0x18}, + new int[] {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1}); + break; + case 29: + fastpackOddBit( + in, inpos, out, outpos, 29, + new int[] {0x3, 0x6, 0x9, 0xc, 0xf, 0x12, 0x15, 0x18, 0x1b, 0x1, + 0x4, 0x7, 0xa, 0xd, 0x10, 0x13, 0x16, 0x19, 0x1c, 0x2, + 0x5, 0x8, 0xb, 0xe, 0x11, 0x14, 0x17, 0x1a}, + new int[] {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}); + break; + case 30: + fastpackEvenBit(in, inpos, out, outpos, 30, + new int[] {0x2, 0x4, 0x6, 0x8, 0xa, 0xc, 0xe, 0x10, 0x12, + 0x14, 0x16, 0x18, 0x1a, 0x1c}, + new int[] {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1}); + break; + case 31: + fastpackOddBit(in, inpos, out, outpos, 31, + new int[] {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, + 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10, + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e}, + new int[] {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}); + break; + case 32: + System.arraycopy(in, inpos, out, outpos, 256); + break; + } + } + + public static void fastpackNoMask(final int[] in, int inpos, final int[] out, + int outpos, int b) { + switch (b) { + case 0: + break; + case 1: + fastpackOddBitNoMask(in, inpos, out, outpos, 1, new int[] {}, + new int[] {}); + break; + case 2: + fastpackEvenBitNoMask(in, inpos, out, outpos, 2, new int[] {}, + new int[] {}); + break; + case 3: + fastpackOddBitNoMask(in, inpos, out, outpos, 3, new int[] {0x2, 0x1}, + new int[] {0xb, 0xa}); + break; + case 4: + fastpackEvenBitNoMask(in, inpos, out, outpos, 4, new int[] {0x4}, + new int[] {0x8}); + break; + case 5: + fastpackOddBitNoMask(in, inpos, out, outpos, 5, + new int[] {0x2, 0x4, 0x1, 0x3}, + new int[] {0x6, 0x7, 0x6, 0x6}); + break; + case 6: + fastpackEvenBitNoMask(in, inpos, out, outpos, 6, new int[] {0x2, 0x4}, + new int[] {0x5, 0x5}); + break; + case 7: + fastpackOddBitNoMask(in, inpos, out, outpos, 7, + new int[] {0x4, 0x1, 0x5, 0x2, 0x6, 0x3}, + new int[] {0x5, 0x4, 0x5, 0x4, 0x5, 0x4}); + break; + case 8: + fastpackEvenBitNoMask(in, inpos, out, outpos, 8, + new int[] {0x8, 0x8, 0x8}, + new int[] {0x4, 0x4, 0x4}); + break; + case 9: + fastpackOddBitNoMask(in, inpos, out, outpos, 9, + new int[] {0x5, 0x1, 0x6, 0x2, 0x7, 0x3, 0x8, 0x4}, + new int[] {0x4, 0x3, 0x4, 0x3, 0x4, 0x3, 0x4, 0x3}); + break; + case 10: + fastpackEvenBitNoMask(in, inpos, out, outpos, 10, + new int[] {0x2, 0x4, 0x6, 0x8}, + new int[] {0x3, 0x3, 0x3, 0x3}); + break; + case 11: + fastpackOddBitNoMask( + in, inpos, out, outpos, 11, + new int[] {0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1}, + new int[] {0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x2}); + break; + case 12: + fastpackEvenBitNoMask(in, inpos, out, outpos, 12, + new int[] {0x8, 0x4, 0xc, 0x8, 0x4}, + new int[] {0x3, 0x2, 0x3, 0x3, 0x2}); + break; + case 13: + fastpackOddBitNoMask(in, inpos, out, outpos, 13, + new int[] {0x6, 0xc, 0x5, 0xb, 0x4, 0xa, 0x3, 0x9, + 0x2, 0x8, 0x1, 0x7}, + new int[] {0x2, 0x3, 0x2, 0x3, 0x2, 0x3, 0x2, 0x3, + 0x2, 0x3, 0x2, 0x2}); + break; + case 14: + fastpackEvenBitNoMask(in, inpos, out, outpos, 14, + new int[] {0x4, 0x8, 0xc, 0x2, 0x6, 0xa}, + new int[] {0x2, 0x2, 0x3, 0x2, 0x2, 0x2}); + break; + case 15: + fastpackOddBitNoMask(in, inpos, out, outpos, 15, + new int[] {0x2, 0x4, 0x6, 0x8, 0xa, 0xc, 0xe, 0x1, + 0x3, 0x5, 0x7, 0x9, 0xb, 0xd}, + new int[] {0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x3, 0x2, + 0x2, 0x2, 0x2, 0x2, 0x2, 0x2}); + break; + case 16: + fastpackEvenBitNoMask( + in, inpos, out, outpos, 16, + new int[] {0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10}, + new int[] {0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2}); + break; + case 17: + fastpackOddBitNoMask(in, inpos, out, outpos, 17, + new int[] {0xf, 0xd, 0xb, 0x9, 0x7, 0x5, 0x3, 0x1, + 0x10, 0xe, 0xc, 0xa, 0x8, 0x6, 0x4, 0x2}, + new int[] {0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x1, + 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x1}); + break; + case 18: + fastpackEvenBitNoMask(in, inpos, out, outpos, 18, + new int[] {0xe, 0xa, 0x6, 0x2, 0x10, 0xc, 0x8, 0x4}, + new int[] {0x2, 0x2, 0x2, 0x1, 0x2, 0x2, 0x2, 0x1}); + break; + case 19: + fastpackOddBitNoMask( + in, inpos, out, outpos, 19, + new int[] {0xd, 0x7, 0x1, 0xe, 0x8, 0x2, 0xf, 0x9, 0x3, 0x10, 0xa, + 0x4, 0x11, 0xb, 0x5, 0x12, 0xc, 0x6}, + new int[] {0x2, 0x2, 0x1, 0x2, 0x2, 0x1, 0x2, 0x2, 0x1, 0x2, 0x2, 0x1, + 0x2, 0x2, 0x1, 0x2, 0x2, 0x1}); + break; + case 20: + fastpackEvenBitNoMask( + in, inpos, out, outpos, 20, + new int[] {0xc, 0x4, 0x10, 0x8, 0x14, 0xc, 0x4, 0x10, 0x8}, + new int[] {0x2, 0x1, 0x2, 0x1, 0x2, 0x2, 0x1, 0x2, 0x1}); + break; + case 21: + fastpackOddBitNoMask( + in, inpos, out, outpos, 21, + new int[] {0xb, 0x1, 0xc, 0x2, 0xd, 0x3, 0xe, 0x4, 0xf, 0x5, + 0x10, 0x6, 0x11, 0x7, 0x12, 0x8, 0x13, 0x9, 0x14, 0xa}, + new int[] {0x2, 0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x1, + 0x2, 0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x1}); + break; + case 22: + fastpackEvenBitNoMask( + in, inpos, out, outpos, 22, + new int[] {0xa, 0x14, 0x8, 0x12, 0x6, 0x10, 0x4, 0xe, 0x2, 0xc}, + new int[] {0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x1, 0x1}); + break; + case 23: + fastpackOddBitNoMask( + in, inpos, out, outpos, 23, + new int[] {0x9, 0x12, 0x4, 0xd, 0x16, 0x8, 0x11, 0x3, + 0xc, 0x15, 0x7, 0x10, 0x2, 0xb, 0x14, 0x6, + 0xf, 0x1, 0xa, 0x13, 0x5, 0xe}, + new int[] {0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, + 0x2, 0x1, 0x1, 0x2, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1}); + break; + case 24: + fastpackEvenBitNoMask( + in, inpos, out, outpos, 24, + new int[] {0x8, 0x10, 0x18, 0x8, 0x10, 0x18, 0x8, 0x10, 0x18, 0x8, + 0x10}, + new int[] {0x1, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1, 0x2, 0x1, 0x1}); + break; + case 25: + fastpackOddBitNoMask(in, inpos, out, outpos, 25, + new int[] {0x7, 0xe, 0x15, 0x3, 0xa, 0x11, + 0x18, 0x6, 0xd, 0x14, 0x2, 0x9, + 0x10, 0x17, 0x5, 0xc, 0x13, 0x1, + 0x8, 0xf, 0x16, 0x4, 0xb, 0x12}, + new int[] {0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x2, 0x1, + 0x1, 0x2, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, + 0x2, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1}); + break; + case 26: + fastpackEvenBitNoMask(in, inpos, out, outpos, 26, + new int[] {0x6, 0xc, 0x12, 0x18, 0x4, 0xa, 0x10, + 0x16, 0x2, 0x8, 0xe, 0x14}, + new int[] {0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x2, + 0x1, 0x1, 0x1, 0x1}); + break; + case 27: + fastpackOddBitNoMask( + in, inpos, out, outpos, 27, + new int[] {0x5, 0xa, 0xf, 0x14, 0x19, 0x3, 0x8, 0xd, 0x12, + 0x17, 0x1, 0x6, 0xb, 0x10, 0x15, 0x1a, 0x4, 0x9, + 0xe, 0x13, 0x18, 0x2, 0x7, 0xc, 0x11, 0x16}, + new int[] {0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, + 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, + 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1}); + break; + case 28: + fastpackEvenBitNoMask(in, inpos, out, outpos, 28, + new int[] {0x4, 0x8, 0xc, 0x10, 0x14, 0x18, 0x1c, + 0x4, 0x8, 0xc, 0x10, 0x14, 0x18}, + new int[] {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1}); + break; + case 29: + fastpackOddBitNoMask( + in, inpos, out, outpos, 29, + new int[] {0x3, 0x6, 0x9, 0xc, 0xf, 0x12, 0x15, 0x18, 0x1b, 0x1, + 0x4, 0x7, 0xa, 0xd, 0x10, 0x13, 0x16, 0x19, 0x1c, 0x2, + 0x5, 0x8, 0xb, 0xe, 0x11, 0x14, 0x17, 0x1a}, + new int[] {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}); + break; + case 30: + fastpackEvenBitNoMask(in, inpos, out, outpos, 30, + new int[] {0x2, 0x4, 0x6, 0x8, 0xa, 0xc, 0xe, 0x10, + 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c}, + new int[] {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}); + break; + case 31: + fastpackOddBitNoMask( + in, inpos, out, outpos, 31, + new int[] {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, + 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10, + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e}, + new int[] {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}); + break; + case 32: + System.arraycopy(in, inpos, out, outpos, 256); + break; + } + } + + public static void fastunpack(final int[] in, int inpos, final int[] out, + int outpos, int b) { + switch (b) { + case 0: + Arrays.fill(out, outpos, outpos + 256, 0); + break; + case 1: + fastUnpackOddBit(in, inpos, out, outpos, 1, new int[] {}, new int[] {}, + new int[] {}); + break; + case 2: + fastUnpackEventBit(in, inpos, out, outpos, 2, new int[] {}, new int[] {}, + new int[] {}); + break; + case 3: + fastUnpackOddBit(in, inpos, out, outpos, 3, new int[] {0x1, 0x2}, + new int[] {0x1, 0x3}, new int[] {0xa, 0xa}); + break; + case 4: + fastUnpackEventBit(in, inpos, out, outpos, 4, new int[] {0x4}, + new int[] {0xf}, new int[] {0x7}); + break; + case 5: + fastUnpackOddBit( + in, inpos, out, outpos, 5, new int[] {0x3, 0x1, 0x4, 0x2}, + new int[] {0x7, 0x1, 0xf, 0x3}, new int[] {0x5, 0x6, 0x5, 0x6}); + break; + case 6: + fastUnpackEventBit(in, inpos, out, outpos, 6, new int[] {0x4, 0x2}, + new int[] {0xf, 0x3}, new int[] {0x4, 0x5}); + break; + case 7: + fastUnpackOddBit(in, inpos, out, outpos, 7, + new int[] {0x3, 0x6, 0x2, 0x5, 0x1, 0x4}, + new int[] {0x7, 0x3f, 0x3, 0x1f, 0x1, 0xf}, + new int[] {0x4, 0x3, 0x4, 0x3, 0x4, 0x4}); + break; + case 8: + fastUnpackEventBit(in, inpos, out, outpos, 8, new int[] {0x8, 0x8, 0x8}, + new int[] {0xff, 0xff, 0xff}, + new int[] {0x3, 0x3, 0x3}); + break; + case 9: + fastUnpackOddBit(in, inpos, out, outpos, 9, + new int[] {0x4, 0x8, 0x3, 0x7, 0x2, 0x6, 0x1, 0x5}, + new int[] {0xf, 0xff, 0x7, 0x7f, 0x3, 0x3f, 0x1, 0x1f}, + new int[] {0x3, 0x2, 0x3, 0x2, 0x3, 0x2, 0x3, 0x3}); + break; + case 10: + fastUnpackEventBit( + in, inpos, out, outpos, 10, new int[] {0x8, 0x6, 0x4, 0x2}, + new int[] {0xff, 0x3f, 0xf, 0x3}, new int[] {0x2, 0x2, 0x2, 0x3}); + break; + case 11: + fastUnpackOddBit( + in, inpos, out, outpos, 11, + new int[] {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa}, + new int[] {0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff, 0x1ff, 0x3ff}, + new int[] {0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2}); + break; + case 12: + fastUnpackEventBit(in, inpos, out, outpos, 12, + new int[] {0x4, 0x8, 0xc, 0x4, 0x8}, + new int[] {0xf, 0xff, 0xfff, 0xf, 0xff}, + new int[] {0x2, 0x2, 0x1, 0x2, 0x2}); + break; + case 13: + fastUnpackOddBit(in, inpos, out, outpos, 13, + new int[] {0x7, 0x1, 0x8, 0x2, 0x9, 0x3, 0xa, 0x4, 0xb, + 0x5, 0xc, 0x6}, + new int[] {0x7f, 0x1, 0xff, 0x3, 0x1ff, 0x7, 0x3ff, 0xf, + 0x7ff, 0x1f, 0xfff, 0x3f}, + new int[] {0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x1, + 0x2, 0x1, 0x2}); + break; + case 14: + fastUnpackEventBit(in, inpos, out, outpos, 14, + new int[] {0xa, 0x6, 0x2, 0xc, 0x8, 0x4}, + new int[] {0x3ff, 0x3f, 0x3, 0xfff, 0xff, 0xf}, + new int[] {0x1, 0x1, 0x2, 0x1, 0x1, 0x2}); + break; + case 15: + fastUnpackOddBit(in, inpos, out, outpos, 15, + new int[] {0xd, 0xb, 0x9, 0x7, 0x5, 0x3, 0x1, 0xe, 0xc, + 0xa, 0x8, 0x6, 0x4, 0x2}, + new int[] {0x1fff, 0x7ff, 0x1ff, 0x7f, 0x1f, 0x7, 0x1, + 0x3fff, 0xfff, 0x3ff, 0xff, 0x3f, 0xf, 0x3}, + new int[] {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x2}); + break; + case 16: + fastUnpackEventBit( + in, inpos, out, outpos, 16, + new int[] {0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10}, + new int[] {0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}, + new int[] {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}); + break; + case 17: + fastUnpackOddBit(in, inpos, out, outpos, 17, + new int[] {0x2, 0x4, 0x6, 0x8, 0xa, 0xc, 0xe, 0x10, 0x1, + 0x3, 0x5, 0x7, 0x9, 0xb, 0xd, 0xf}, + new int[] {0x3, 0xf, 0x3f, 0xff, 0x3ff, 0xfff, 0x3fff, + 0xffff, 0x1, 0x7, 0x1f, 0x7f, 0x1ff, 0x7ff, + 0x1fff, 0x7fff}, + new int[] {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1}); + break; + case 18: + fastUnpackEventBit( + in, inpos, out, outpos, 18, + new int[] {0x4, 0x8, 0xc, 0x10, 0x2, 0x6, 0xa, 0xe}, + new int[] {0xf, 0xff, 0xfff, 0xffff, 0x3, 0x3f, 0x3ff, 0x3fff}, + new int[] {0x1, 0x1, 0x1, 0x0, 0x1, 0x1, 0x1, 0x1}); + break; + case 19: + fastUnpackOddBit(in, inpos, out, outpos, 19, + new int[] {0x6, 0xc, 0x12, 0x5, 0xb, 0x11, 0x4, 0xa, + 0x10, 0x3, 0x9, 0xf, 0x2, 0x8, 0xe, 0x1, 0x7, + 0xd}, + new int[] {0x3f, 0xfff, 0x3ffff, 0x1f, 0x7ff, 0x1ffff, + 0xf, 0x3ff, 0xffff, 0x7, 0x1ff, 0x7fff, 0x3, + 0xff, 0x3fff, 0x1, 0x7f, 0x1fff}, + new int[] {0x1, 0x1, 0x0, 0x1, 0x1, 0x0, 0x1, 0x1, 0x0, + 0x1, 0x1, 0x0, 0x1, 0x1, 0x0, 0x1, 0x1, 0x1}); + break; + case 20: + fastUnpackEventBit( + in, inpos, out, outpos, 20, + new int[] {0x8, 0x10, 0x4, 0xc, 0x14, 0x8, 0x10, 0x4, 0xc}, + new int[] {0xff, 0xffff, 0xf, 0xfff, 0xfffff, 0xff, 0xffff, 0xf, + 0xfff}, + new int[] {0x1, 0x0, 0x1, 0x1, 0x0, 0x1, 0x0, 0x1, 0x1}); + break; + case 21: + fastUnpackOddBit( + in, inpos, out, outpos, 21, + new int[] {0xa, 0x14, 0x9, 0x13, 0x8, 0x12, 0x7, 0x11, 0x6, 0x10, + 0x5, 0xf, 0x4, 0xe, 0x3, 0xd, 0x2, 0xc, 0x1, 0xb}, + new int[] {0x3ff, 0xfffff, 0x1ff, 0x7ffff, 0xff, 0x3ffff, 0x7f, + 0x1ffff, 0x3f, 0xffff, 0x1f, 0x7fff, 0xf, 0x3fff, + 0x7, 0x1fff, 0x3, 0xfff, 0x1, 0x7ff}, + new int[] {0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, + 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x1}); + break; + case 22: + fastUnpackEventBit( + in, inpos, out, outpos, 22, + new int[] {0xc, 0x2, 0xe, 0x4, 0x10, 0x6, 0x12, 0x8, 0x14, 0xa}, + new int[] {0xfff, 0x3, 0x3fff, 0xf, 0xffff, 0x3f, 0x3ffff, 0xff, + 0xfffff, 0x3ff}, + new int[] {0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1}); + break; + case 23: + fastUnpackOddBit( + in, inpos, out, outpos, 23, + new int[] {0xe, 0x5, 0x13, 0xa, 0x1, 0xf, 0x6, 0x14, + 0xb, 0x2, 0x10, 0x7, 0x15, 0xc, 0x3, 0x11, + 0x8, 0x16, 0xd, 0x4, 0x12, 0x9}, + new int[] {0x3fff, 0x1f, 0x7ffff, 0x3ff, 0x1, 0x7fff, + 0x3f, 0xfffff, 0x7ff, 0x3, 0xffff, 0x7f, + 0x1fffff, 0xfff, 0x7, 0x1ffff, 0xff, 0x3fffff, + 0x1fff, 0xf, 0x3ffff, 0x1ff}, + new int[] {0x0, 0x1, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x1, 0x0, + 0x1, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x1, 0x0, 0x1}); + break; + case 24: + fastUnpackEventBit( + in, inpos, out, outpos, 24, + new int[] {0x10, 0x8, 0x18, 0x10, 0x8, 0x18, 0x10, 0x8, 0x18, 0x10, + 0x8}, + new int[] {0xffff, 0xff, 0xffffff, 0xffff, 0xff, 0xffffff, 0xffff, + 0xff, 0xffffff, 0xffff, 0xff}, + new int[] {0x0, 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x1}); + break; + case 25: + fastUnpackOddBit( + in, inpos, out, outpos, 25, + new int[] {0x12, 0xb, 0x4, 0x16, 0xf, 0x8, 0x1, 0x13, + 0xc, 0x5, 0x17, 0x10, 0x9, 0x2, 0x14, 0xd, + 0x6, 0x18, 0x11, 0xa, 0x3, 0x15, 0xe, 0x7}, + new int[] {0x3ffff, 0x7ff, 0xf, 0x3fffff, 0x7fff, 0xff, + 0x1, 0x7ffff, 0xfff, 0x1f, 0x7fffff, 0xffff, + 0x1ff, 0x3, 0xfffff, 0x1fff, 0x3f, 0xffffff, + 0x1ffff, 0x3ff, 0x7, 0x1fffff, 0x3fff, 0x7f}, + new int[] {0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x1}); + break; + case 26: + fastUnpackEventBit(in, inpos, out, outpos, 26, + new int[] {0x14, 0xe, 0x8, 0x2, 0x16, 0x10, 0xa, 0x4, + 0x18, 0x12, 0xc, 0x6}, + new int[] {0xfffff, 0x3fff, 0xff, 0x3, 0x3fffff, + 0xffff, 0x3ff, 0xf, 0xffffff, 0x3ffff, + 0xfff, 0x3f}, + new int[] {0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x0, 0x1}); + break; + case 27: + fastUnpackOddBit( + in, inpos, out, outpos, 27, + new int[] {0x16, 0x11, 0xc, 0x7, 0x2, 0x18, 0x13, 0xe, 0x9, + 0x4, 0x1a, 0x15, 0x10, 0xb, 0x6, 0x1, 0x17, 0x12, + 0xd, 0x8, 0x3, 0x19, 0x14, 0xf, 0xa, 0x5}, + new int[] {0x3fffff, 0x1ffff, 0xfff, 0x7f, 0x3, 0xffffff, + 0x7ffff, 0x3fff, 0x1ff, 0xf, 0x3ffffff, 0x1fffff, + 0xffff, 0x7ff, 0x3f, 0x1, 0x7fffff, 0x3ffff, + 0x1fff, 0xff, 0x7, 0x1ffffff, 0xfffff, 0x7fff, + 0x3ff, 0x1f}, + new int[] {0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1}); + break; + case 28: + fastUnpackEventBit(in, inpos, out, outpos, 28, + new int[] {0x18, 0x14, 0x10, 0xc, 0x8, 0x4, 0x1c, 0x18, + 0x14, 0x10, 0xc, 0x8, 0x4}, + new int[] {0xffffff, 0xfffff, 0xffff, 0xfff, 0xff, 0xf, + 0xfffffff, 0xffffff, 0xfffff, 0xffff, 0xfff, + 0xff, 0xf}, + new int[] {0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1}); + break; + case 29: + fastUnpackOddBit( + in, inpos, out, outpos, 29, + new int[] {0x1a, 0x17, 0x14, 0x11, 0xe, 0xb, 0x8, 0x5, 0x2, 0x1c, + 0x19, 0x16, 0x13, 0x10, 0xd, 0xa, 0x7, 0x4, 0x1, 0x1b, + 0x18, 0x15, 0x12, 0xf, 0xc, 0x9, 0x6, 0x3}, + new int[] {0x3ffffff, 0x7fffff, 0xfffff, 0x1ffff, 0x3fff, + 0x7ff, 0xff, 0x1f, 0x3, 0xfffffff, + 0x1ffffff, 0x3fffff, 0x7ffff, 0xffff, 0x1fff, + 0x3ff, 0x7f, 0xf, 0x1, 0x7ffffff, + 0xffffff, 0x1fffff, 0x3ffff, 0x7fff, 0xfff, + 0x1ff, 0x3f, 0x7}, + new int[] {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1}); + break; + case 30: + fastUnpackEventBit(in, inpos, out, outpos, 30, + new int[] {0x1c, 0x1a, 0x18, 0x16, 0x14, 0x12, 0x10, + 0xe, 0xc, 0xa, 0x8, 0x6, 0x4, 0x2}, + new int[] {0xfffffff, 0x3ffffff, 0xffffff, 0x3fffff, + 0xfffff, 0x3ffff, 0xffff, 0x3fff, 0xfff, + 0x3ff, 0xff, 0x3f, 0xf, 0x3}, + new int[] {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1}); + break; + case 31: + fastUnpackOddBit( + in, inpos, out, outpos, 31, + new int[] {0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x17, 0x16, 0x15, + 0x14, 0x13, 0x12, 0x11, 0x10, 0xf, 0xe, 0xd, 0xc, 0xb, + 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1}, + new int[] {0x3fffffff, 0x1fffffff, 0xfffffff, 0x7ffffff, 0x3ffffff, + 0x1ffffff, 0xffffff, 0x7fffff, 0x3fffff, 0x1fffff, + 0xfffff, 0x7ffff, 0x3ffff, 0x1ffff, 0xffff, + 0x7fff, 0x3fff, 0x1fff, 0xfff, 0x7ff, + 0x3ff, 0x1ff, 0xff, 0x7f, 0x3f, + 0x1f, 0xf, 0x7, 0x3, 0x1}, + new int[] {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1}); + break; + + case 32: + System.arraycopy(in, inpos, out, outpos, 256); + break; + } + } +} diff --git a/src/main/java/me/lemire/integercompression/vector/VectorFastPFOR.java b/src/main/java/me/lemire/integercompression/vector/VectorFastPFOR.java new file mode 100644 index 0000000..0b6ca17 --- /dev/null +++ b/src/main/java/me/lemire/integercompression/vector/VectorFastPFOR.java @@ -0,0 +1,361 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + * (c) Intel Corp. (for Vector implementation) + */ +package me.lemire.integercompression.vector; + +import java.nio.ByteBuffer; +import java.util.Arrays; +import me.lemire.integercompression.IntegerCODEC; +import me.lemire.integercompression.SkippableIntegerCODEC; +import me.lemire.integercompression.IntWrapper; + +/** + * This is a patching scheme designed for speed. + * It encodes integers in blocks of integers within pages of + * up to 65536 integers. Note that it is important, to get good + * compression and good performance, to use sizeable arrays (greater than 1024 + * integers). For arrays containing a number of integers that is not divisible + * by BLOCK_SIZE, you should use it in conjunction with another CODEC: + * + * IntegerCODEC ic = new Composition(new VectorFastPFOR(), new VariableByte()). + *

    + * For details, please see: + *

    + *

    For sufficiently compressible and long arrays, it is faster and better + * than other PFOR schemes.

    + * + * Note that this does not use differential coding: if you are working on sorted + * lists, you should first compute deltas, @see + * me.lemire.integercompression.differential.Delta#delta. + * + * For multi-threaded applications, each thread should use its own FastPFOR + * object. + * + * @author Daniel Lemire + */ +public class VectorFastPFOR implements IntegerCODEC, SkippableIntegerCODEC { + private final static int OVERHEAD_OF_EACH_EXCEPT = 8; + public final static int DEFAULT_PAGE_SIZE = 64 << 10; + + public final static int BLOCK_SIZE = 256; + private final static int INTS_PER_BLOCK = BLOCK_SIZE >>> 5; + + private final int pageSize; + private final int[][] dataTobePacked = new int[33][]; + private int[] exceptData = null; + + // Working area for compress and uncompress. + private final int[] dataPointers = new int[33]; + private final int[] freqs = new int[33]; + private final byte[] bem; + /** + * Construct the FastPFOR CODEC. + * + * @param pagesize + * the desired page size (recommended value is + * FastPFOR.DEFAULT_PAGE_SIZE) + */ + private VectorFastPFOR(int pagesize) { + pageSize = pagesize; + // Initiate arrrays. + bem = new byte[3 * pageSize / BLOCK_SIZE + pagesize]; + for (int k = 1; k < dataTobePacked.length; ++k) + dataTobePacked[k] = new int[pageSize / 32 * 4]; // heuristic + exceptData = new int[pageSize * 4]; + } + + /** + * Construct the fastPFOR CODEC with default parameters. + */ + public VectorFastPFOR() { this(DEFAULT_PAGE_SIZE); } + + /** + * Compress data in blocks of BLOCK_SIZE integers (if fewer than BLOCK_SIZE + * integers are provided, nothing is done). + * + * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) + */ + @Override + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos) { + inlength = inlength - inlength % BLOCK_SIZE; + // Allocate memory for working area. + + final int finalinpos = inpos.get() + inlength; + while (inpos.get() != finalinpos) { + int thissize = Math.min(pageSize, finalinpos - inpos.get()); + encodePage(in, inpos, thissize, out, outpos); + } + } + + private void getBestBitSize(int[] in, int pos, int index) { + Arrays.fill(freqs, 0); + for (int i = pos, limit = pos + BLOCK_SIZE; i < limit; i++) { + freqs[32 - Integer.numberOfLeadingZeros(in[i])]++; + } + bem[index] = 32; + while (freqs[bem[index]] == 0) + bem[index]--; + bem[index + 2] = bem[index]; + int maxb = bem[index + 2]; + int bestcost = bem[index] * BLOCK_SIZE; + int cexcept = 0; + bem[index + 1] = 0; + for (int b = bem[index] - 1; b >= 0; --b) { + cexcept += freqs[b + 1]; + if (cexcept == BLOCK_SIZE) + break; + // the extra 8 is the cost of storing maxbits + int thiscost = cexcept * OVERHEAD_OF_EACH_EXCEPT + cexcept * (maxb - b) + + b * BLOCK_SIZE + 8; + if (maxb - b == 1) + thiscost -= cexcept; + if (thiscost < bestcost) { + bestcost = thiscost; + bem[index] = (byte)b; + bem[index + 1] = (byte)cexcept; + } + } + } + + private void encodePage(int[] in, IntWrapper inpos, int thissize, int[] out, + IntWrapper outpos) { + final int headerpos = outpos.get(); + outpos.increment(); + int tmpoutpos = outpos.get(); + + // Clear working area. + Arrays.fill(dataPointers, 0); + Arrays.fill(bem, (byte)0); + + int tmpinpos = inpos.get(); + final int finalinpos = tmpinpos + thissize - BLOCK_SIZE; + int bindex = 0; + for (; tmpinpos <= finalinpos; tmpinpos += BLOCK_SIZE) { + getBestBitSize(in, tmpinpos, bindex); + final int tmpexcept = bem[bindex + 1] & 0xFF; + final int tmpbestb = bem[bindex]; + if (tmpexcept > 0) { + final int index = bem[bindex + 2] - tmpbestb; + if (dataPointers[index] + tmpexcept >= dataTobePacked[index].length) { + int newsize = 2 * (dataPointers[index] + tmpexcept); + int val = newsize + BLOCK_SIZE - 1; + newsize = val - val % BLOCK_SIZE; + dataTobePacked[index] = Arrays.copyOf(dataTobePacked[index], newsize); + } + bindex += 3; + for (int k = 0; k < BLOCK_SIZE; ++k) { + if ((in[k + tmpinpos] >>> tmpbestb) != 0) { + // we have an exception + bem[bindex++] = (byte)k; + dataTobePacked[index][dataPointers[index]++] = + in[k + tmpinpos] >>> tmpbestb; + } + } + } else { + bindex += 2; + } + VectorBitPacker.fastpack(in, tmpinpos, out, tmpoutpos, tmpbestb); + tmpoutpos += INTS_PER_BLOCK * tmpbestb; + } + inpos.set(tmpinpos); + out[headerpos] = tmpoutpos - headerpos; + + int bytesize = bindex; + out[tmpoutpos++] = bytesize; + + bytesize = bytesize % 4 == 0 ? bytesize : (bytesize / 4) * 4 + 4; + for (int i = 0; i <= bytesize - 4; i += 4) { + out[tmpoutpos] = bem[i] & 0xFF; + out[tmpoutpos] |= (bem[i + 1] & 0xFF) << 8; + out[tmpoutpos] |= (bem[i + 2] & 0xFF) << 16; + out[tmpoutpos] |= (bem[i + 3] & 0xFF) << 24; + tmpoutpos++; + } + + int bitmap = 0; + for (int k = 2; k <= 32; ++k) { + if (dataPointers[k] != 0) + bitmap |= (1 << (k - 1)); + } + out[tmpoutpos++] = bitmap; + + for (int k = 2; k <= 32; ++k) { + if (dataPointers[k] != 0) { + out[tmpoutpos++] = dataPointers[k]; // size + int j = 0; + int n = (dataPointers[k] / BLOCK_SIZE) * BLOCK_SIZE; + for (; j < n; j += BLOCK_SIZE) { + VectorBitPacker.fastpackNoMask(dataTobePacked[k], j, out, tmpoutpos, + k); + tmpoutpos += INTS_PER_BLOCK * k; + } + int r = dataPointers[k] % BLOCK_SIZE; + if (r != 0) { + tmpoutpos = VectorBitPacker.slowpack(dataTobePacked[k], j, r, out, + tmpoutpos, k); + tmpoutpos++; + } + } + } + outpos.set(tmpoutpos); + } + + /** + * Uncompress data in blocks of integers. In this particular case, + * the inlength parameter is ignored: it is deduced from the compressed + * data. + * + * @see IntegerCODEC#compress(int[], IntWrapper, int, int[], IntWrapper) + */ + @Override + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, + int[] out, IntWrapper outpos, int mynvalue) { + mynvalue = mynvalue - mynvalue % BLOCK_SIZE; + int finalout = outpos.get() + mynvalue; + while (outpos.get() != finalout) { + int thissize = Math.min(pageSize, finalout - outpos.get()); + decodePage(in, inpos, out, outpos, thissize); + } + } + + private void loadMetaData(int[] in, int inexcept, int bytesize) { + // Arrays.fill(bem, (byte)0); + int len = (bytesize + 3) / 4; + int lc = 0; + for (int i = 0; i < len; i++) { + bem[lc++] = (byte)(in[inexcept + i]); + bem[lc++] = (byte)(in[inexcept + i] >>> 8); + bem[lc++] = (byte)(in[inexcept + i] >>> 16); + bem[lc++] = (byte)(in[inexcept + i] >>> 24); + } + } + + private void decodePage(int[] in, IntWrapper inpos, int[] out, + IntWrapper outpos, int thissize) { + final int initpos = inpos.get(); + final int wheremeta = in[inpos.get()]; + inpos.increment(); + int inexcept = initpos + wheremeta; + + final int bytesize = in[inexcept++]; + loadMetaData(in, inexcept, bytesize); + inexcept += (bytesize + 3) / 4; + final int bitmap = in[inexcept++]; + for (int k = 2; k <= 32; ++k) { + if ((bitmap & (1 << (k - 1))) != 0) { + int size = in[inexcept++]; + int val = size + BLOCK_SIZE - 1; + int roundedup = val - val % BLOCK_SIZE; + if (dataTobePacked[k].length < roundedup) + dataTobePacked[k] = new int[roundedup]; + if (inexcept + roundedup / 32 * k <= in.length) { + int j = 0; + int len = (size / BLOCK_SIZE) * BLOCK_SIZE; + for (; j < len; j += BLOCK_SIZE) { + VectorBitPacker.fastunpack(in, inexcept, dataTobePacked[k], j, k); + inexcept += INTS_PER_BLOCK * k; + } + int r = size % BLOCK_SIZE; + inexcept = VectorBitPacker.slowunpack(in, inexcept, dataTobePacked[k], + j, r, k); + } else { + int j = 0; + val = roundedup / 32 * k + BLOCK_SIZE - 1; + int[] buf = new int[val - val % BLOCK_SIZE]; + int initinexcept = inexcept; + System.arraycopy(in, inexcept, buf, 0, in.length - inexcept); + int l = (size / BLOCK_SIZE) * BLOCK_SIZE; + for (; j < l; j += BLOCK_SIZE) { + VectorBitPacker.fastunpack(buf, inexcept - initinexcept, + dataTobePacked[k], j, k); + inexcept += INTS_PER_BLOCK * k; + } + int r = size % BLOCK_SIZE; + inexcept = VectorBitPacker.slowunpack(in, inexcept, dataTobePacked[k], + j, r, k); + } + } + } + Arrays.fill(dataPointers, 0); + int tmpoutpos = outpos.get(); + int tmpinpos = inpos.get(); + int idx = 0; + for (int run = 0, run_end = thissize / BLOCK_SIZE; run < run_end; + ++run, tmpoutpos += BLOCK_SIZE) { + final int b = bem[idx]; // byteContainer.get(); + final int cexcept = bem[idx + 1] & 0xFF; // byteContainer.get() & 0xFF; + VectorBitPacker.fastunpack(in, tmpinpos, out, tmpoutpos, b); + tmpinpos += INTS_PER_BLOCK * b; + if (cexcept > 0) { + final int maxbits = bem[idx + 2]; // byteContainer.get(); + idx += 3; + final int index = maxbits - b; + if (index == 1) { + for (int k = 0; k < cexcept; ++k) { + final int pos = bem[idx++] & 0xFF; // byteContainer.get() & 0xFF; + out[pos + tmpoutpos] |= 1 << b; + } + } else { + for (int k = 0; k < cexcept; ++k) { + final int pos = bem[idx++] & 0xFF; // byteContainer.get() & 0xFF; + final int exceptvalue = + dataTobePacked[index][dataPointers[index]++]; + out[pos + tmpoutpos] |= exceptvalue << b; + } + } + } else { + idx += 2; + } + } + outpos.set(tmpoutpos); + inpos.set(inexcept); + } + + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + inlength = inlength - inlength % BLOCK_SIZE; + if (inlength == 0) + return; + out[outpos.get()] = inlength; + outpos.increment(); + headlessCompress(in, inpos, inlength, out, outpos); + } + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, + IntWrapper outpos) { + if (inlength == 0) + return; + final int outlength = in[inpos.get()]; + inpos.increment(); + headlessUncompress(in, inpos, inlength, out, outpos, outlength); + } + @Override + public String toString() { + return this.getClass().getSimpleName(); + } + + /** + * Creates a new buffer of the requested size. + * + * In case you need a different way to allocate buffers, you can override this + * method with a custom behavior. The default implementation allocates a new + * Java direct + * {@link ByteBuffer} on each invocation. + */ + protected ByteBuffer makeBuffer(int sizeInBytes) { + return ByteBuffer.allocateDirect(sizeInBytes); + } +} diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java new file mode 100644 index 0000000..14e4c1c --- /dev/null +++ b/src/main/java/module-info.java @@ -0,0 +1,8 @@ +// Copyright (C) 2022 Intel Corporation + +// SPDX-License-Identifier: Apache-2.0 +module me.lemire.integercompression { + requires jdk.incubator.vector; + exports me.lemire.integercompression; + exports me.lemire.integercompression.vector; +} From a131d14fbc80192a0e75526f9c1b5bb82ba42e1c Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 16 Nov 2022 08:35:06 -0500 Subject: [PATCH 298/412] Update link to Ikhtear's thesis --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 46f771d..05800b6 100644 --- a/README.md +++ b/README.md @@ -217,7 +217,7 @@ We wrote several research papers documenting many of the CODECs implemented here Ikhtear Sharif wrote his M.Sc. thesis on this library: Ikhtear Sharif, Performance Evaluation of Fast Integer Compression Techniques Over Tables, M.Sc. thesis, UNB 2013. -http://lemire.me/fr/documents/thesis/IkhtearThesis.pdf +https://unbscholar.lib.unb.ca/islandora/object/unbscholar%3A9399/datastream/PDF/view He also posted his slides online: http://www.slideshare.net/ikhtearSharif/ikhtear-defense From 6ecb497531bcf6095f7ff0c02f04834316bb4ed0 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 25 Nov 2022 10:07:53 -0500 Subject: [PATCH 299/412] Adding github actions. --- .github/workflows/basic.yml | 24 ++++++++++++++++++++++++ README.md | 15 +++++---------- example.java | 3 +-- pom.xml | 11 ++++++++--- 4 files changed, 38 insertions(+), 15 deletions(-) create mode 100644 .github/workflows/basic.yml diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml new file mode 100644 index 0000000..c110525 --- /dev/null +++ b/.github/workflows/basic.yml @@ -0,0 +1,24 @@ +name: Java CI + +on: [push, pull_request] + +jobs: + build: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + java: [ 11, 16 ] + steps: + - uses: actions/checkout@v2 + - name: Set up JDK + uses: actions/setup-java@v2.5.0 + with: + java-version: ${{ matrix.java }} + distribution: 'adopt' + - name: Build and test with Maven + run: mvn package + - name: Build example + run: javac -cp target/classes/:. example.java + - name: Run example + run: java -cp target/classes/:. example \ No newline at end of file diff --git a/README.md b/README.md index 05800b6..833014b 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,8 @@ Most others do not. The Java Team at Intel (R) introduced the vector implementation for FastPFOR based on the Java Vector API that showed significant gains over the non-vectorized implementation. For an example usage, see -examples/vector/Example.java. The feature requires JDK 19+. +examples/vector/Example.java. The feature requires JDK 19+ and is currently for +advanced users. Maven central repository ------------------------ @@ -166,21 +167,15 @@ Speed is always reported in millions of integers per second. For Maven users --------------- -If you are running JDK 19+ -``` -mvn compile -``` - -If you are running earlier versions of JDK ``` -mvn compiler:compile@default-compile +mvn compile +mvn exec:java ``` -mvn exec:java -For ant users +For ant users (legacy, currently untested) ------------- If you use Apache ant, please try this: diff --git a/example.java b/example.java index 6569ebd..817e94f 100644 --- a/example.java +++ b/example.java @@ -88,8 +88,7 @@ public static void basicExample() { /** * Like the basicExample, but we store the input array size manually. */ - @Test - public void basicExampleHeadless() { + public static void basicExampleHeadless() { int[] data = new int[2342351]; System.out.println("Compressing " + data.length + " integers in one go using the headless approach"); // data should be sorted for best diff --git a/pom.xml b/pom.xml index 855aa92..c007aa8 100644 --- a/pom.xml +++ b/pom.xml @@ -64,6 +64,10 @@ org.apache.maven.plugins maven-compiler-plugin 3.8.0 + + 11 + 11 + default-compile @@ -84,9 +88,10 @@ compile - + + @@ -127,7 +132,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.0.0 + 3.4.1 com.kamikaze.pfordelta:me.lemire.integercompression.benchmarktools From 3a6c3e41ca37329bdc11a3e6d34e402c360bbf6d Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 25 Nov 2022 10:29:55 -0500 Subject: [PATCH 300/412] We are not going to rely on the vector module by default for now. --- pom.xml | 14 +++++++------- src/main/java/module-info.java | 3 ++- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index c007aa8..f37ef66 100644 --- a/pom.xml +++ b/pom.xml @@ -80,19 +80,19 @@ me/lemire/integercompression/vector/* module-info.java - - - + + + + - - + + --> diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 14e4c1c..d2a749c 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -2,7 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 module me.lemire.integercompression { - requires jdk.incubator.vector; + // This is currently only for advanced users: + // requires jdk.incubator.vector; exports me.lemire.integercompression; exports me.lemire.integercompression.vector; } From 2c28f54b1a1c62b9beb6aef39731db6158821514 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 25 Nov 2022 10:31:29 -0500 Subject: [PATCH 301/412] Adding more documentation. --- .github/workflows/basic.yml | 2 +- README.md | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index c110525..cb3e3e8 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -19,6 +19,6 @@ jobs: - name: Build and test with Maven run: mvn package - name: Build example - run: javac -cp target/classes/:. example.java + run: javac -cp target/classes/:. example.java - name: Run example run: java -cp target/classes/:. example \ No newline at end of file diff --git a/README.md b/README.md index 833014b..c65513a 100644 --- a/README.md +++ b/README.md @@ -174,6 +174,13 @@ mvn compile mvn exec:java ``` +You may run our examples as follows: + +```` +mvn package +javac -cp target/classes/:. example.java +java -cp target/classes/:. example +``` For ant users (legacy, currently untested) ------------- From 25840b455b307073d1b890179494523f1ae9e37e Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 25 Nov 2022 10:44:47 -0500 Subject: [PATCH 302/412] Excluding vector from javadoc --- README.md | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c65513a..c421a00 100644 --- a/README.md +++ b/README.md @@ -167,7 +167,7 @@ Speed is always reported in millions of integers per second. For Maven users --------------- - +The current development versions assume JDK 11 or better. ``` mvn compile diff --git a/pom.xml b/pom.xml index f37ef66..fc6912b 100644 --- a/pom.xml +++ b/pom.xml @@ -134,7 +134,7 @@ maven-javadoc-plugin 3.4.1 - com.kamikaze.pfordelta:me.lemire.integercompression.benchmarktools + me.lemire.integercompression.vector;com.kamikaze.pfordelta:me.lemire.integercompression.benchmarktools From f5f64f1eb736c6909d208fc0d3472038dae29499 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 25 Nov 2022 10:49:21 -0500 Subject: [PATCH 303/412] Fixing documentation. --- README.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index c421a00..19046ad 100644 --- a/README.md +++ b/README.md @@ -147,19 +147,16 @@ Reference: Requirements ------------ -A recent Java compiler. Java 7 or better is recommended. +Releases up to 0.1.12 require Java 7 or better. -Good instructions on installing Java 7 on Linux: +The current development versions assume JDK 11 or better. -http://forums.linuxmint.com/viewtopic.php?f=42&t=93052 How fast is it? --------------- -Compile the code and execute me.lemire.integercompression.benchmarktools.Benchmark. - -I recommend running all the benchmarks with the "-server" flag on a desktop machine. +Compile the code and execute `me.lemire.integercompression.benchmarktools.Benchmark`. Speed is always reported in millions of integers per second. @@ -167,7 +164,6 @@ Speed is always reported in millions of integers per second. For Maven users --------------- -The current development versions assume JDK 11 or better. ``` mvn compile From 0847f6942e9a40b4512c187669d00f8927ed9b72 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 25 Nov 2022 10:53:58 -0500 Subject: [PATCH 304/412] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 19046ad..51d16cf 100644 --- a/README.md +++ b/README.md @@ -172,7 +172,7 @@ mvn exec:java You may run our examples as follows: -```` +``` mvn package javac -cp target/classes/:. example.java java -cp target/classes/:. example From 16a89d759dd5ed80578f1ca7175c8e314e5e9780 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 25 Nov 2022 10:54:51 -0500 Subject: [PATCH 305/412] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 51d16cf..f629b5e 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ JavaFastPFOR: A simple integer compression library in Java ========================================================== [![][maven img]][maven] [![][license img]][license] [![docs-badge][]][docs] [![Code Quality: Cpp](https://img.shields.io/lgtm/grade/java/g/lemire/JavaFastPFOR.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/lemire/JavaFastPFOR/context:java) - +[![Java CI](https://github.com/lemire/JavaFastPFOR/actions/workflows/basic.yml/badge.svg)](https://github.com/lemire/JavaFastPFOR/actions/workflows/basic.yml) License From c628213c23a5b17f78c2ec1ba53f036e9dd8347a Mon Sep 17 00:00:00 2001 From: Benoit Lacelle Date: Sat, 26 Nov 2022 11:19:18 +0400 Subject: [PATCH 306/412] Introduce LongVariableBytex --- .gitignore | 1 + .../integercompression/ByteIntegerCODEC.java | 4 +- .../DeltaZigzagVariableByte.java | 2 +- .../integercompression/IntegerCODEC.java | 4 +- .../SkippableIntegerCODEC.java | 6 +- .../integercompression/VariableByte.java | 14 +- .../lemire/longcompression/ByteLongCODEC.java | 62 ++++ .../me/lemire/longcompression/LongCODEC.java | 62 ++++ .../lemire/longcompression/LongJustCopy.java | 52 +++ .../me/lemire/longcompression/LongUtil.java | 15 + .../longcompression/LongVariableByte.java | 342 ++++++++++++++++++ .../longcompression/SkippableLongCODEC.java | 69 ++++ .../lemire/integercompression/TestUtils.java | 2 +- .../lemire/longcompression/LongTestUtils.java | 126 +++++++ .../longcompression/SkippableBasicTest.java | 138 +++++++ .../longcompression/TestLongVariableByte.java | 68 ++++ 16 files changed, 954 insertions(+), 13 deletions(-) create mode 100644 src/main/java/me/lemire/longcompression/ByteLongCODEC.java create mode 100644 src/main/java/me/lemire/longcompression/LongCODEC.java create mode 100644 src/main/java/me/lemire/longcompression/LongJustCopy.java create mode 100644 src/main/java/me/lemire/longcompression/LongUtil.java create mode 100644 src/main/java/me/lemire/longcompression/LongVariableByte.java create mode 100644 src/main/java/me/lemire/longcompression/SkippableLongCODEC.java create mode 100644 src/test/java/me/lemire/longcompression/LongTestUtils.java create mode 100644 src/test/java/me/lemire/longcompression/SkippableBasicTest.java create mode 100644 src/test/java/me/lemire/longcompression/TestLongVariableByte.java diff --git a/.gitignore b/.gitignore index 53960d2..88b3320 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .classpath +.settings .project *.class *.csv diff --git a/src/main/java/me/lemire/integercompression/ByteIntegerCODEC.java b/src/main/java/me/lemire/integercompression/ByteIntegerCODEC.java index 47d4f57..6e8f903 100644 --- a/src/main/java/me/lemire/integercompression/ByteIntegerCODEC.java +++ b/src/main/java/me/lemire/integercompression/ByteIntegerCODEC.java @@ -18,9 +18,9 @@ public interface ByteIntegerCODEC { * Compress data from an array to another array. * * Both inpos and outpos are modified to represent how much data was - * read and written to if 12 ints (inlength = 12) are compressed to 3 + * read and written to. If 12 ints (inlength = 12) are compressed to 3 * bytes, then inpos will be incremented by 12 while outpos will be - * incremented by 3 we use IntWrapper to pass the values by reference. + * incremented by 3. We use IntWrapper to pass the values by reference. * * @param in * input array diff --git a/src/main/java/me/lemire/integercompression/DeltaZigzagVariableByte.java b/src/main/java/me/lemire/integercompression/DeltaZigzagVariableByte.java index 4b2f896..ca9d0ad 100644 --- a/src/main/java/me/lemire/integercompression/DeltaZigzagVariableByte.java +++ b/src/main/java/me/lemire/integercompression/DeltaZigzagVariableByte.java @@ -105,7 +105,7 @@ public void uncompress(int[] inBuf, IntWrapper inPos, int inLen, int ip = inPos.get(); int op = outPos.get(); - int vbcNum = 0, vbcShift = 24; // Varialbe Byte Context. + int vbcNum = 0, vbcShift = 24; // Variable Byte Context. final int inPosLast = ip + inLen; while (ip < inPosLast) { // Fetch a byte value. diff --git a/src/main/java/me/lemire/integercompression/IntegerCODEC.java b/src/main/java/me/lemire/integercompression/IntegerCODEC.java index 7929e48..f2c9c7a 100644 --- a/src/main/java/me/lemire/integercompression/IntegerCODEC.java +++ b/src/main/java/me/lemire/integercompression/IntegerCODEC.java @@ -18,9 +18,9 @@ public interface IntegerCODEC { * Compress data from an array to another array. * * Both inpos and outpos are modified to represent how much data was - * read and written to if 12 ints (inlength = 12) are compressed to 3 + * read and written to. If 12 ints (inlength = 12) are compressed to 3 * ints, then inpos will be incremented by 12 while outpos will be - * incremented by 3 we use IntWrapper to pass the values by reference. + * incremented by 3. We use IntWrapper to pass the values by reference. * * @param in * input array diff --git a/src/main/java/me/lemire/integercompression/SkippableIntegerCODEC.java b/src/main/java/me/lemire/integercompression/SkippableIntegerCODEC.java index c10d2f0..4568d71 100644 --- a/src/main/java/me/lemire/integercompression/SkippableIntegerCODEC.java +++ b/src/main/java/me/lemire/integercompression/SkippableIntegerCODEC.java @@ -10,7 +10,7 @@ /** * Interface describing a standard CODEC to compress integers. This is a - * variation on the IntegerCODEC interface meant to be used for random access. + * variation on the IntegerCODEC interface meant to be used for head access. * * The main difference is that we must specify the number of integers we wish to * decode. This information should be stored elsewhere. @@ -25,8 +25,8 @@ public interface SkippableIntegerCODEC { * Compress data from an array to another array. * * Both inpos and outpos are modified to represent how much data was read - * and written to if 12 ints (inlength = 12) are compressed to 3 ints, then - * inpos will be incremented by 12 while outpos will be incremented by 3 we + * and written to. If 12 ints (inlength = 12) are compressed to 3 ints, then + * inpos will be incremented by 12 while outpos will be incremented by 3. We * use IntWrapper to pass the values by reference. * * @param in diff --git a/src/main/java/me/lemire/integercompression/VariableByte.java b/src/main/java/me/lemire/integercompression/VariableByte.java index 5b25c43..7854b24 100644 --- a/src/main/java/me/lemire/integercompression/VariableByte.java +++ b/src/main/java/me/lemire/integercompression/VariableByte.java @@ -122,8 +122,11 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, for (int v = 0, shift = 0; p < finalp;) { val = in[p]; int c = (byte) (val >>> s); + // Shift to next byte s += 8; + // Shift to next integer if s==32 p += s>>5; + // cycle from 31 to 0 s = s & 31; v += ((c & 127) << shift); if ((c & 128) == 128) { @@ -186,10 +189,13 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] o int finaloutpos = num + tmpoutpos; for (int v = 0, shift = 0; tmpoutpos < finaloutpos;) { val = in[p]; - int c = val >>> s; - s += 8; - p += s>>5; - s = s & 31; + int c = val >>> s; + // Shift to next byte + s += 8; + // Shift to next integer if s==32 + p += s>>5; + // cycle from 31 to 0 + s = s & 31; v += ((c & 127) << shift); if ((c & 128) == 128) { out[tmpoutpos++] = v; diff --git a/src/main/java/me/lemire/longcompression/ByteLongCODEC.java b/src/main/java/me/lemire/longcompression/ByteLongCODEC.java new file mode 100644 index 0000000..e405370 --- /dev/null +++ b/src/main/java/me/lemire/longcompression/ByteLongCODEC.java @@ -0,0 +1,62 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + +package me.lemire.longcompression; + +import me.lemire.integercompression.IntWrapper; + +/** + * Interface describing a CODEC to compress longs to bytes. + * + * @author Benoit Lacelle + * + */ +public interface ByteLongCODEC { + /** + * Compress data from an array to another array. + * + * Both inpos and outpos are modified to represent how much data was + * read and written to. If 12 longs (inlength = 12) are compressed to 3 + * bytes, then inpos will be incremented by 12 while outpos will be + * incremented by 3. We use IntWrapper to pass the values by reference. + * + * @param in + * input array + * @param inpos + * location in the input array + * @param inlength + * how many longs to compress + * @param out + * output array + * @param outpos + * where to write in the output array + */ + public void compress(long[] in, IntWrapper inpos, int inlength, + byte[] out, IntWrapper outpos); + + /** + * Uncompress data from an array to another array. + * + * Both inpos and outpos parameters are modified to indicate new + * positions after read/write. + * + * @param in + * array containing data in compressed form + * @param inpos + * where to start reading in the array + * @param inlength + * length of the compressed data (ignored by some + * schemes) + * @param out + * array where to write the compressed output + * @param outpos + * where to write the compressed output in out + */ + public void uncompress(byte[] in, IntWrapper inpos, int inlength, + long[] out, IntWrapper outpos); + +} diff --git a/src/main/java/me/lemire/longcompression/LongCODEC.java b/src/main/java/me/lemire/longcompression/LongCODEC.java new file mode 100644 index 0000000..c0f67b2 --- /dev/null +++ b/src/main/java/me/lemire/longcompression/LongCODEC.java @@ -0,0 +1,62 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + +package me.lemire.longcompression; + +import me.lemire.integercompression.IntWrapper; + +/** + * Interface describing a standard CODEC to compress longs. + * + * @author Benoit Lacelle + * + */ +public interface LongCODEC { + /** + * Compress data from an array to another array. + * + * Both inpos and outpos are modified to represent how much data was + * read and written to. If 12 longs (inlength = 12) are compressed to 3 + * longs, then inpos will be incremented by 12 while outpos will be + * incremented by 3. We use IntWrapper to pass the values by reference. + * + * @param in + * input array + * @param inpos + * location in the input array + * @param inlength + * how many longs to compress + * @param out + * output array + * @param outpos + * where to write in the output array + */ + public void compress(long[] in, IntWrapper inpos, int inlength, + long[] out, IntWrapper outpos); + + /** + * Uncompress data from an array to another array. + * + * Both inpos and outpos parameters are modified to indicate new + * positions after read/write. + * + * @param in + * array containing data in compressed form + * @param inpos + * where to start reading in the array + * @param inlength + * length of the compressed data (ignored by some + * schemes) + * @param out + * array where to write the compressed output + * @param outpos + * where to write the compressed output in out + */ + public void uncompress(long[] in, IntWrapper inpos, int inlength, + long[] out, IntWrapper outpos); + +} diff --git a/src/main/java/me/lemire/longcompression/LongJustCopy.java b/src/main/java/me/lemire/longcompression/LongJustCopy.java new file mode 100644 index 0000000..7a5a67a --- /dev/null +++ b/src/main/java/me/lemire/longcompression/LongJustCopy.java @@ -0,0 +1,52 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + +package me.lemire.longcompression; + +import me.lemire.integercompression.IntWrapper; + +/** + * @author Benoit lacelle + * + */ +public final class LongJustCopy implements LongCODEC, SkippableLongCODEC { + + @Override + public void headlessCompress(long[] in, IntWrapper inpos, int inlength, + long[] out, IntWrapper outpos) { + System.arraycopy(in, inpos.get(), out, outpos.get(), inlength); + inpos.add(inlength); + outpos.add(inlength); + } + + @Override + public void uncompress(long[] in, IntWrapper inpos, int inlength, + long[] out, IntWrapper outpos) { + headlessUncompress(in,inpos,inlength,out,outpos,inlength); + } + + @Override + public String toString() { + return this.getClass().getSimpleName(); + } + + @Override + public void headlessUncompress(long[] in, IntWrapper inpos, int inlength, + long[] out, IntWrapper outpos, int num) { + System.arraycopy(in, inpos.get(), out, outpos.get(), num); + inpos.add(num); + outpos.add(num); + + } + + @Override + public void compress(long[] in, IntWrapper inpos, int inlength, + long[] out, IntWrapper outpos) { + headlessCompress(in,inpos,inlength,out,outpos); + } + +} diff --git a/src/main/java/me/lemire/longcompression/LongUtil.java b/src/main/java/me/lemire/longcompression/LongUtil.java new file mode 100644 index 0000000..6ebbfb7 --- /dev/null +++ b/src/main/java/me/lemire/longcompression/LongUtil.java @@ -0,0 +1,15 @@ +package me.lemire.longcompression; + +/** + * These are unofficial helpers related to long compression + * + * @author Benoit Lacelle + * + */ +@Deprecated +public class LongUtil { + + protected static String longToBinaryWithLeading(long l) { + return String.format("%64s", Long.toBinaryString(l)).replace(' ', '0'); + } +} diff --git a/src/main/java/me/lemire/longcompression/LongVariableByte.java b/src/main/java/me/lemire/longcompression/LongVariableByte.java new file mode 100644 index 0000000..a2db990 --- /dev/null +++ b/src/main/java/me/lemire/longcompression/LongVariableByte.java @@ -0,0 +1,342 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ +package me.lemire.longcompression; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.LongBuffer; + +import me.lemire.integercompression.IntWrapper; + +/** + * Implementation of variable-byte. For best performance, use it using the + * ByteLongCODEC interface. + * + * Note that this does not use differential coding: if you are working on sorted + * lists, you must compute the deltas separately. + * + * @author Benoit Lacelle + */ +public class LongVariableByte implements LongCODEC, ByteLongCODEC, SkippableLongCODEC { + + private static byte extract7bits(int i, long val) { + return (byte) ((val >>> (7 * i)) & ((1 << 7) - 1)); + } + + private static byte extract7bitsmaskless(int i, long val) { + return (byte) ((val >>> (7 * i))); + } + @Override + public void compress(long[] in, IntWrapper inpos, int inlength, long[] out, + IntWrapper outpos) { + headlessCompress(in, inpos, inlength, out, outpos); + } + + @Override + public void headlessCompress(long[] in, IntWrapper inpos, int inlength, long[] out, + IntWrapper outpos) { + if (inlength == 0) + return; + ByteBuffer buf = makeBuffer(inlength * 16); + buf.order(ByteOrder.LITTLE_ENDIAN); + for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { + final long val = in[k]; + // System.out.println(LongUtil.longToBinaryWithLeading(val)); + if (val >= 0 && val < (1 << 7)) { + buf.put((byte) (val | (1 << 7))); + } else if (val >= 0 && val < (1 << 14)) { + buf.put((byte) extract7bits(0, val)); + buf.put((byte) (extract7bitsmaskless(1, (val)) | (1 << 7))); + } else if (val >= 0 && val < (1 << 21)) { + buf.put((byte) extract7bits(0, val)); + buf.put((byte) extract7bits(1, val)); + buf.put((byte) (extract7bitsmaskless(2, (val)) | (1 << 7))); + } else if (val >= 0 && val < (1 << 28)) { + buf.put((byte) extract7bits(0, val)); + buf.put((byte) extract7bits(1, val)); + buf.put((byte) extract7bits(2, val)); + buf.put((byte) (extract7bitsmaskless(3, (val)) | (1 << 7))); + } else if (val >= 0 && val < (1 << 35)) { + buf.put((byte) extract7bits(0, val)); + buf.put((byte) extract7bits(1, val)); + buf.put((byte) extract7bits(2, val)); + buf.put((byte) extract7bits(3, val)); + buf.put((byte) (extract7bitsmaskless(4, (val)) | (1 << 7))); + } else if (val >= 0 && val < (1 << 42)) { + buf.put((byte) extract7bits(0, val)); + buf.put((byte) extract7bits(1, val)); + buf.put((byte) extract7bits(2, val)); + buf.put((byte) extract7bits(3, val)); + buf.put((byte) extract7bits(4, val)); + buf.put((byte) (extract7bitsmaskless(5, (val)) | (1 << 7))); + } else if (val >= 0 && val < (1 << 49)) { + buf.put((byte) extract7bits(0, val)); + buf.put((byte) extract7bits(1, val)); + buf.put((byte) extract7bits(2, val)); + buf.put((byte) extract7bits(3, val)); + buf.put((byte) extract7bits(4, val)); + buf.put((byte) extract7bits(5, val)); + buf.put((byte) (extract7bitsmaskless(6, (val)) | (1 << 7))); + } else if (val >= 0 && val < (1 << 56)) { + buf.put((byte) extract7bits(0, val)); + buf.put((byte) extract7bits(1, val)); + buf.put((byte) extract7bits(2, val)); + buf.put((byte) extract7bits(3, val)); + buf.put((byte) extract7bits(4, val)); + buf.put((byte) extract7bits(5, val)); + buf.put((byte) extract7bits(6, val)); + buf.put((byte) (extract7bitsmaskless(7, (val)) | (1 << 7))); + } else if (val >= 0 && val < (1 << 63)) { + buf.put((byte) extract7bits(0, val)); + buf.put((byte) extract7bits(1, val)); + buf.put((byte) extract7bits(2, val)); + buf.put((byte) extract7bits(3, val)); + buf.put((byte) extract7bits(4, val)); + buf.put((byte) extract7bits(5, val)); + buf.put((byte) extract7bits(6, val)); + buf.put((byte) extract7bits(7, val)); + buf.put((byte) (extract7bitsmaskless(8, (val)) | (1 << 7))); + } else { + buf.put((byte) extract7bits(0, val)); + buf.put((byte) extract7bits(1, val)); + buf.put((byte) extract7bits(2, val)); + buf.put((byte) extract7bits(3, val)); + buf.put((byte) extract7bits(4, val)); + buf.put((byte) extract7bits(5, val)); + buf.put((byte) extract7bits(6, val)); + buf.put((byte) extract7bits(7, val)); + buf.put((byte) extract7bits(8, val)); + buf.put((byte) (extract7bitsmaskless(9, (val)) | (1 << 7))); + } + } + while (buf.position() % 8 != 0) + buf.put((byte) 0); + final int length = buf.position(); + buf.flip(); + LongBuffer ibuf = buf.asLongBuffer(); + ibuf.get(out, outpos.get(), length / 8); + outpos.add(length / 8); + inpos.add(inlength); + } + + @Override + public void compress(long[] in, IntWrapper inpos, int inlength, byte[] out, + IntWrapper outpos) { + if (inlength == 0) + return; + int outpostmp = outpos.get(); + for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { + final long val = in[k]; + if (val >= 0 && val < (1 << 7)) { + out[outpostmp++] = (byte) (val | (1 << 7)); + } else if (val >= 0 && val < (1 << 14)) { + out[outpostmp++] = (byte) extract7bits(0, val); + out[outpostmp++] = (byte) (extract7bitsmaskless(1, (val)) | (1 << 7)); + } else if (val >= 0 && val < (1 << 21)) { + out[outpostmp++] = (byte) extract7bits(0, val); + out[outpostmp++] = (byte) extract7bits(1, val); + out[outpostmp++] = (byte) (extract7bitsmaskless(2, (val)) | (1 << 7)); + } else if (val >= 0 && val < (1 << 28)) { + out[outpostmp++] = (byte) extract7bits(0, val); + out[outpostmp++] = (byte) extract7bits(1, val); + out[outpostmp++] = (byte) extract7bits(2, val); + out[outpostmp++] = (byte) (extract7bitsmaskless(3, (val)) | (1 << 7)); + } else if (val >= 0 && val < (1 << 35)) { + out[outpostmp++] = (byte) extract7bits(0, val); + out[outpostmp++] = (byte) extract7bits(1, val); + out[outpostmp++] = (byte) extract7bits(2, val); + out[outpostmp++] = (byte) extract7bits(3, val); + out[outpostmp++] = (byte) (extract7bitsmaskless(4, (val)) | (1 << 7)); + } else if (val >= 0 && val < (1 << 42)) { + out[outpostmp++] = (byte) extract7bits(0, val); + out[outpostmp++] = (byte) extract7bits(1, val); + out[outpostmp++] = (byte) extract7bits(2, val); + out[outpostmp++] = (byte) extract7bits(3, val); + out[outpostmp++] = (byte) extract7bits(4, val); + out[outpostmp++] = (byte) (extract7bitsmaskless(5, (val)) | (1 << 7)); + } else if (val >= 0 && val < (1 << 49)) { + out[outpostmp++] = (byte) extract7bits(0, val); + out[outpostmp++] = (byte) extract7bits(1, val); + out[outpostmp++] = (byte) extract7bits(2, val); + out[outpostmp++] = (byte) extract7bits(3, val); + out[outpostmp++] = (byte) extract7bits(4, val); + out[outpostmp++] = (byte) extract7bits(5, val); + out[outpostmp++] = (byte) (extract7bitsmaskless(6, (val)) | (1 << 7)); + } else if (val >= 0 && val < (1 << 56)) { + out[outpostmp++] = (byte) extract7bits(0, val); + out[outpostmp++] = (byte) extract7bits(1, val); + out[outpostmp++] = (byte) extract7bits(2, val); + out[outpostmp++] = (byte) extract7bits(3, val); + out[outpostmp++] = (byte) extract7bits(4, val); + out[outpostmp++] = (byte) extract7bits(5, val); + out[outpostmp++] = (byte) extract7bits(6, val); + out[outpostmp++] = (byte) (extract7bitsmaskless(7, (val)) | (1 << 7)); + } else if (val >= 0 && val < (1 << 63)) { + out[outpostmp++] = (byte) extract7bits(0, val); + out[outpostmp++] = (byte) extract7bits(1, val); + out[outpostmp++] = (byte) extract7bits(2, val); + out[outpostmp++] = (byte) extract7bits(3, val); + out[outpostmp++] = (byte) extract7bits(4, val); + out[outpostmp++] = (byte) extract7bits(5, val); + out[outpostmp++] = (byte) extract7bits(6, val); + out[outpostmp++] = (byte) extract7bits(7, val); + out[outpostmp++] = (byte) (extract7bitsmaskless(8, (val)) | (1 << 7)); + } else { + // System.out.println(LongUtil.longToBinaryWithLeading(val)); + out[outpostmp++] = (byte) extract7bits(0, val); + out[outpostmp++] = (byte) extract7bits(1, val); + out[outpostmp++] = (byte) extract7bits(2, val); + out[outpostmp++] = (byte) extract7bits(3, val); + out[outpostmp++] = (byte) extract7bits(4, val); + out[outpostmp++] = (byte) extract7bits(5, val); + out[outpostmp++] = (byte) extract7bits(6, val); + out[outpostmp++] = (byte) extract7bits(7, val); + out[outpostmp++] = (byte) extract7bits(8, val); + out[outpostmp++] = (byte) (extract7bitsmaskless(9, (val)) | (1 << 7)); + } + } + outpos.set(outpostmp); + inpos.add(inlength); + } + + @Override + public void uncompress(long[] in, IntWrapper inpos, int inlength, long[] out, + IntWrapper outpos) { + int s = 0; + long val = 0; + int p = inpos.get(); + int finalp = inpos.get() + inlength; + int tmpoutpos = outpos.get(); + for (long v = 0, shift = 0; p < finalp;) { + val = in[p]; + // System.out.println(LongUtil.longToBinaryWithLeading(val)); + long c = (byte) (val >>> s); + // Shift to next byte + s += 8; + // Shift to next long if s==64 + p += s>>6; + // cycle from 63 to 0 + s = s & 63; + v += ((c & 127) << shift); + if ((c & 128) == 128) { + out[tmpoutpos++] = v; + v = 0; + shift = 0; + } else + shift += 7; + assert shift < 64; + } + outpos.set(tmpoutpos); + inpos.add(inlength); + } + + @Override + public void uncompress(byte[] in, IntWrapper inpos, int inlength, + long[] out, IntWrapper outpos) { + int p = inpos.get(); + int finalp = inpos.get() + inlength; + int tmpoutpos = outpos.get(); + for (long v = 0; p < finalp; out[tmpoutpos++] = v) { + v = in[p] & 0x7F; + if (in[p] < 0) { + p += 1; + continue; + } + v = ((in[p + 1] & 0x7F) << 7) | v; + if (in[p + 1] < 0) { + p += 2; + continue; + } + v = ((in[p + 2] & 0x7F) << 14) | v; + if (in[p + 2] < 0 ) { + p += 3; + continue; + } + v = ((in[p + 3] & 0x7F) << 21) | v; + if (in[p + 3] < 0) { + p += 4; + continue; + } + v = (((long) in[p + 4] & 0x7F) << 28) | v; + if (in[p + 4] < 0) { + p += 5; + continue; + } + v = (((long) in[p + 5] & 0x7F) << 35) | v; + if (in[p + 5] < 0) { + p += 6; + continue; + } + v = (((long) in[p + 6] & 0x7F) << 42) | v; + if (in[p + 6] < 0) { + p += 7; + continue; + } + v = (((long) in[p + 7] & 0x7F) << 49) | v; + if (in[p + 7] < 0) { + p += 8; + continue; + } + v = (((long) in[p + 8] & 0x7F) << 56) | v; + if (in[p + 8] < 0) { + p += 9; + continue; + } + v = (((long) in[p + 9] & 0x7F) << 63) | v; + p += 10; + } + outpos.set(tmpoutpos); + inpos.add(p); + } + + @Override + public String toString() { + return this.getClass().getSimpleName(); + } + + @Override + public void headlessUncompress(long[] in, IntWrapper inpos, int inlength, long[] out, + IntWrapper outpos, int num) { + int s = 0; + long val = 0; + int p = inpos.get(); + int tmpoutpos = outpos.get(); + int finaloutpos = num + tmpoutpos; + for (long v = 0, shift = 0; tmpoutpos < finaloutpos;) { + val = in[p]; + // System.out.println(longToBinaryWithLeading(val)); + long c = val >>> s; + // Shift to next byte + s += 8; + // Shift to next long if s == 64 + p += s>>6; + // cycle from 63 to 0 + s = s & 63; + v += ((c & 127) << shift); + if ((c & 128) == 128) { + out[tmpoutpos++] = v; + v = 0; + shift = 0; + } else + shift += 7; + assert shift < 64; + } + outpos.set(tmpoutpos); + inpos.set(p + (s!=0 ? 1 : 0)); + } + + /** + * Creates a new buffer of the requested size. + * + * In case you need a different way to allocate buffers, you can override this method + * with a custom behavior. The default implementation allocates a new Java direct + * {@link ByteBuffer} on each invocation. + */ + protected ByteBuffer makeBuffer(int sizeInBytes) { + return ByteBuffer.allocateDirect(sizeInBytes); + } +} diff --git a/src/main/java/me/lemire/longcompression/SkippableLongCODEC.java b/src/main/java/me/lemire/longcompression/SkippableLongCODEC.java new file mode 100644 index 0000000..e3e7b84 --- /dev/null +++ b/src/main/java/me/lemire/longcompression/SkippableLongCODEC.java @@ -0,0 +1,69 @@ +/** + * This is code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + +package me.lemire.longcompression; + +import me.lemire.integercompression.IntWrapper; + +/** + * Interface describing a standard CODEC to compress longs. This is a + * variation on the LongCODEC interface meant to be used for head access. + * + * The main difference is that we must specify the number of longs we wish to + * decode. This information should be stored elsewhere. + * + * This interface was designed by the Terrier team for their search engine. + * + * @author Benoit Lacelle + * + */ +public interface SkippableLongCODEC { + /** + * Compress data from an array to another array. + * + * Both inpos and outpos are modified to represent how much data was read + * and written to. If 12 longs (inlength = 12) are compressed to 3 longs, then + * inpos will be incremented by 12 while outpos will be incremented by 3. We + * use IntWrapper to pass the values by reference. + * + * @param in + * input array + * @param inpos + * location in the input array + * @param inlength + * how many longs to compress + * @param out + * output array + * @param outpos + * where to write in the output array + */ + public void headlessCompress(long[] in, IntWrapper inpos, int inlength, long[] out, + IntWrapper outpos); + + /** + * Uncompress data from an array to another array. + * + * Both inpos and outpos parameters are modified to indicate new positions + * after read/write. + * + * @param in + * array containing data in compressed form + * @param inpos + * where to start reading in the array + * @param inlength + * length of the compressed data (ignored by some schemes) + * @param out + * array where to write the compressed output + * @param outpos + * where to write the compressed output in out + * @param num + * number of longs we want to decode, the actual number of longs decoded can be less + */ + public void headlessUncompress(long[] in, IntWrapper inpos, int inlength, long[] out, + IntWrapper outpos, int num); + +} diff --git a/src/test/java/me/lemire/integercompression/TestUtils.java b/src/test/java/me/lemire/integercompression/TestUtils.java index a0820ab..7350fb8 100644 --- a/src/test/java/me/lemire/integercompression/TestUtils.java +++ b/src/test/java/me/lemire/integercompression/TestUtils.java @@ -123,7 +123,7 @@ public static void assertSymmetry(IntegerCODEC codec, int... orig) { assertArrayEquals(orig, target); } - protected static int[] compress(IntegerCODEC codec, int[] data) { + public static int[] compress(IntegerCODEC codec, int[] data) { int[] outBuf = new int[data.length * 4]; IntWrapper inPos = new IntWrapper(); IntWrapper outPos = new IntWrapper(); diff --git a/src/test/java/me/lemire/longcompression/LongTestUtils.java b/src/test/java/me/lemire/longcompression/LongTestUtils.java new file mode 100644 index 0000000..f7a6f1b --- /dev/null +++ b/src/test/java/me/lemire/longcompression/LongTestUtils.java @@ -0,0 +1,126 @@ +package me.lemire.longcompression; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertTrue; + +import java.util.Arrays; + +import me.lemire.integercompression.IntWrapper; + +/** + * Static utility methods for test. + */ +public class LongTestUtils { + + protected static void dumpIntArray(long[] data, String label) { + System.out.print(label); + for (int i = 0; i < data.length; ++i) { + if (i % 6 == 0) { + System.out.println(); + } + System.out.format(" %1$11d", data[i]); + } + System.out.println(); + } + + protected static void dumpIntArrayAsHex(long[] data, String label) { + System.out.print(label); + for (int i = 0; i < data.length; ++i) { + if (i % 8 == 0) { + System.out.println(); + } + System.out.format(" %1$08X", data[i]); + } + System.out.println(); + } + + /** + * Check that compress and uncompress keep original array. + * + * @param codec CODEC to test. + * @param orig original integers + */ + public static void assertSymmetry(LongCODEC codec, long... orig) { + // There are some cases that compressed array is bigger than original + // array. So output array for compress must be larger. + // + // Example: + // - VariableByte compresses an array like [ -1 ]. + // - Composition compresses a short array. + final int EXTEND = 1; + + long[] compressed = new long[orig.length + EXTEND]; + IntWrapper c_inpos = new IntWrapper(0); + IntWrapper c_outpos = new IntWrapper(0); + codec.compress(orig, c_inpos, orig.length, compressed, + c_outpos); + + assertTrue(c_outpos.get() <= orig.length + EXTEND); + + // Uncompress an array. + long[] uncompressed = new long[orig.length]; + IntWrapper u_inpos = new IntWrapper(0); + IntWrapper u_outpos = new IntWrapper(0); + codec.uncompress(compressed, u_inpos, c_outpos.get(), + uncompressed, u_outpos); + + // Compare between uncompressed and orig arrays. + long[] target = Arrays.copyOf(uncompressed, u_outpos.get()); + assertArrayEquals(orig, target); + } + + protected static long[] compress(LongCODEC codec, long[] data) { + long[] outBuf = new long[data.length * 4]; + IntWrapper inPos = new IntWrapper(); + IntWrapper outPos = new IntWrapper(); + codec.compress(data, inPos, data.length, outBuf, outPos); + return Arrays.copyOf(outBuf, outPos.get()); + } + + protected static long[] uncompress(LongCODEC codec, long[] data, int len) { + long[] outBuf = new long[len + 1024]; + IntWrapper inPos = new IntWrapper(); + IntWrapper outPos = new IntWrapper(); + codec.uncompress(data, inPos, data.length, outBuf, outPos); + return Arrays.copyOf(outBuf, outPos.get()); + } + + + + protected static byte[] compress(ByteLongCODEC codec, long[] data) { + byte[] outBuf = new byte[data.length * 4 * 4]; + IntWrapper inPos = new IntWrapper(); + IntWrapper outPos = new IntWrapper(); + codec.compress(data, inPos, data.length, outBuf, outPos); + return Arrays.copyOf(outBuf, outPos.get()); + } + + protected static long[] uncompress(ByteLongCODEC codec, byte[] data, int len) { + long[] outBuf = new long[len + 1024]; + IntWrapper inPos = new IntWrapper(); + IntWrapper outPos = new IntWrapper(); + codec.uncompress(data, inPos, data.length, outBuf, outPos); + return Arrays.copyOf(outBuf, outPos.get()); + } + + protected static long[] compressHeadless(SkippableLongCODEC codec, long[] data) { + long[] outBuf = new long[data.length * 4]; + IntWrapper inPos = new IntWrapper(); + IntWrapper outPos = new IntWrapper(); + codec.headlessCompress(data, inPos, data.length, outBuf, outPos); + return Arrays.copyOf(outBuf, outPos.get()); + } + + protected static long[] uncompressHeadless(SkippableLongCODEC codec, long[] data, int len) { + long[] outBuf = new long[len + 1024]; + IntWrapper inPos = new IntWrapper(); + IntWrapper outPos = new IntWrapper(); + codec.headlessUncompress(data, inPos, data.length, outBuf, outPos,len); + if(outPos.get() < len) throw new RuntimeException("Insufficient output."); + return Arrays.copyOf(outBuf, outPos.get()); + } + + public static String longToBinaryWithLeading(long l) { + return String.format("%64s", Long.toBinaryString(l)).replace(' ', '0'); + } +} diff --git a/src/test/java/me/lemire/longcompression/SkippableBasicTest.java b/src/test/java/me/lemire/longcompression/SkippableBasicTest.java new file mode 100644 index 0000000..9f8f1fa --- /dev/null +++ b/src/test/java/me/lemire/longcompression/SkippableBasicTest.java @@ -0,0 +1,138 @@ +package me.lemire.longcompression; + +import java.util.Arrays; + +import org.junit.Test; + +import me.lemire.integercompression.IntWrapper; +import me.lemire.integercompression.TestUtils; +import me.lemire.integercompression.VariableByte; + + +/** + * Just some basic sanity tests. + * + * @author Daniel Lemire + */ +@SuppressWarnings({ "static-method" }) +public class SkippableBasicTest { + SkippableLongCODEC[] codecs = { + new LongJustCopy(), + new LongVariableByte(), }; + + + /** + * + */ + @Test + public void consistentTest() { + int N = 4096; + long[] data = new long[N]; + long[] rev = new long[N]; + for (int k = 0; k < N; ++k) + data[k] = k % 128; + for (SkippableLongCODEC c : codecs) { + System.out.println("[SkippeableBasicTest.consistentTest] codec = " + + c); + long[] outBuf = new long[N + 1024]; + for (int n = 0; n <= N; ++n) { + IntWrapper inPos = new IntWrapper(); + IntWrapper outPos = new IntWrapper(); + c.headlessCompress(data, inPos, n, outBuf, outPos); + + IntWrapper inPoso = new IntWrapper(); + IntWrapper outPoso = new IntWrapper(); + c.headlessUncompress(outBuf, inPoso, outPos.get(), rev, + outPoso, n); + if (outPoso.get() != n) { + throw new RuntimeException("bug "+n); + } + if (inPoso.get() != outPos.get()) { + throw new RuntimeException("bug "+n+" "+inPoso.get()+" "+outPos.get()); + } + for (int j = 0; j < n; ++j) + if (data[j] != rev[j]) { + throw new RuntimeException("bug"); + } + } + } + } + + + /** + * + */ + @Test + public void varyingLengthTest() { + int N = 4096; + long[] data = new long[N]; + for (int k = 0; k < N; ++k) + data[k] = k; + for (SkippableLongCODEC c : codecs) { + System.out.println("[SkippeableBasicTest.varyingLengthTest] codec = "+c); + for (int L = 1; L <= 128; L++) { + long[] comp = LongTestUtils.compressHeadless(c, Arrays.copyOf(data, L)); + long[] answer = LongTestUtils.uncompressHeadless(c, comp, L); + for (int k = 0; k < L; ++k) + if (answer[k] != data[k]) + throw new RuntimeException("bug "+c.toString()+" "+k+" "+answer[k]+" "+data[k]); + } + for (int L = 128; L <= N; L *= 2) { + long[] comp = LongTestUtils.compressHeadless(c, Arrays.copyOf(data, L)); + long[] answer = LongTestUtils.uncompressHeadless(c, comp, L); + for (int k = 0; k < L; ++k) + if (answer[k] != data[k]) + throw new RuntimeException("bug"); + } + + } + } + + /** + * + */ + @Test + public void varyingLengthTest2() { + int N = 128; + long[] data = new long[N]; + data[127] = -1; + for (SkippableLongCODEC c : codecs) { + System.out.println("[SkippeableBasicTest.varyingLengthTest2] codec = "+c); + + try { + // CODEC Simple9 is limited to "small" integers. + if (c.getClass().equals( + Class.forName("me.lemire.integercompression.Simple9"))) + continue; + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + try { + // CODEC Simple16 is limited to "small" integers. + if (c.getClass().equals( + Class.forName("me.lemire.integercompression.Simple16"))) + continue; + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + for (int L = 1; L <= 128; L++) { + long[] comp = LongTestUtils.compressHeadless(c, Arrays.copyOf(data, L)); + long[] answer = LongTestUtils.uncompressHeadless(c, comp, L); + for (int k = 0; k < L; ++k) + if (answer[k] != data[k]) { + throw new RuntimeException("L=" + L + ": bug at k = "+k+" "+answer[k]+" "+data[k]+" for "+c.toString()); + } + } + for (int L = 128; L <= N; L *= 2) { + long[] comp = LongTestUtils.compressHeadless(c, Arrays.copyOf(data, L)); + long[] answer = LongTestUtils.uncompressHeadless(c, comp, L); + for (int k = 0; k < L; ++k) + if (answer[k] != data[k]) + throw new RuntimeException("bug"); + } + + } + } + + +} diff --git a/src/test/java/me/lemire/longcompression/TestLongVariableByte.java b/src/test/java/me/lemire/longcompression/TestLongVariableByte.java new file mode 100644 index 0000000..38cc061 --- /dev/null +++ b/src/test/java/me/lemire/longcompression/TestLongVariableByte.java @@ -0,0 +1,68 @@ +package me.lemire.longcompression; + +import java.util.stream.LongStream; + +import org.junit.Assert; +import org.junit.Test; + +public class TestLongVariableByte { + final LongVariableByte codec = new LongVariableByte(); + + private void checkConsistency(LongCODEC codec, long[] array) { + { + long[] compressed = LongTestUtils.compress(codec, array); + long[] uncompressed = LongTestUtils.uncompress(codec, compressed, array.length); + + Assert.assertArrayEquals(array, uncompressed); + } + + if (codec instanceof SkippableLongCODEC) { + long[] compressed = LongTestUtils.compressHeadless((SkippableLongCODEC) codec, array); + long[] uncompressed = + LongTestUtils.uncompressHeadless((SkippableLongCODEC) codec, compressed, array.length); + + Assert.assertArrayEquals(array, uncompressed); + } + + if (codec instanceof ByteLongCODEC) { + byte[] compressed = LongTestUtils.compress((ByteLongCODEC) codec, array); + long[] uncompressed = LongTestUtils.uncompress((ByteLongCODEC) codec, compressed, array.length); + + Assert.assertArrayEquals(array, uncompressed); + } + } + + @Test + public void testCodec_ZeroMinus1() { + checkConsistency(codec, new long[] { -1 }); + } + + @Test + public void testCodec_ZeroTimes8Minus1() { + checkConsistency(codec, new long[] { 0, 0, 0, 0, 0, 0, 0, 0, -1 }); + } + + @Test + public void testCodec_ZeroTimes127Minus1() { + long[] array = LongStream.concat(LongStream.range(0, 127).map(l -> 0), LongStream.of(-1)).toArray(); + + checkConsistency(codec, array); + } + + @Test + public void testCodec_ZeroTimes128Minus1() { + long[] array = LongStream.concat(LongStream.range(0, 128).map(l -> 0), LongStream.of(-1)).toArray(); + + checkConsistency(codec, array); + } + + @Test + public void testCodec_MinValue() { + checkConsistency(codec, new long[] { Long.MIN_VALUE }); + } + + @Test + public void testCodec_ZeroMinValue() { + checkConsistency(codec, new long[] { 0, Long.MIN_VALUE }); + } +} From 6101e24df17cdda8f0d329a030dd96372187dfc1 Mon Sep 17 00:00:00 2001 From: Benoit Lacelle Date: Sat, 26 Nov 2022 11:23:11 +0400 Subject: [PATCH 307/412] Small adjustments --- .../me/lemire/integercompression/VariableByte.java | 12 ++++++------ .../integercompression/SkippableBasicTest.java | 2 +- ...bleBasicTest.java => SkippableLongBasicTest.java} | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) rename src/test/java/me/lemire/longcompression/{SkippableBasicTest.java => SkippableLongBasicTest.java} (97%) diff --git a/src/main/java/me/lemire/integercompression/VariableByte.java b/src/main/java/me/lemire/integercompression/VariableByte.java index 7854b24..e0e3e25 100644 --- a/src/main/java/me/lemire/integercompression/VariableByte.java +++ b/src/main/java/me/lemire/integercompression/VariableByte.java @@ -190,12 +190,12 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] o for (int v = 0, shift = 0; tmpoutpos < finaloutpos;) { val = in[p]; int c = val >>> s; - // Shift to next byte - s += 8; - // Shift to next integer if s==32 - p += s>>5; - // cycle from 31 to 0 - s = s & 31; + // Shift to next byte + s += 8; + // Shift to next integer if s==32 + p += s>>5; + // cycle from 31 to 0 + s = s & 31; v += ((c & 127) << shift); if ((c & 128) == 128) { out[tmpoutpos++] = v; diff --git a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java index d965992..d2cda12 100644 --- a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java +++ b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java @@ -12,7 +12,7 @@ */ @SuppressWarnings({ "static-method" }) public class SkippableBasicTest { - SkippableIntegerCODEC[] codecs = { + final SkippableIntegerCODEC[] codecs = { new JustCopy(), new VariableByte(), new SkippableComposition(new BinaryPacking(), new VariableByte()), diff --git a/src/test/java/me/lemire/longcompression/SkippableBasicTest.java b/src/test/java/me/lemire/longcompression/SkippableLongBasicTest.java similarity index 97% rename from src/test/java/me/lemire/longcompression/SkippableBasicTest.java rename to src/test/java/me/lemire/longcompression/SkippableLongBasicTest.java index 9f8f1fa..aea7dc8 100644 --- a/src/test/java/me/lemire/longcompression/SkippableBasicTest.java +++ b/src/test/java/me/lemire/longcompression/SkippableLongBasicTest.java @@ -12,11 +12,11 @@ /** * Just some basic sanity tests. * - * @author Daniel Lemire + * @author Benoit Lacelle */ @SuppressWarnings({ "static-method" }) -public class SkippableBasicTest { - SkippableLongCODEC[] codecs = { +public class SkippableLongBasicTest { + final SkippableLongCODEC[] codecs = { new LongJustCopy(), new LongVariableByte(), }; From 924274f51a5b4ed87701d3cf2429da236dfe1630 Mon Sep 17 00:00:00 2001 From: Benoit Lacelle Date: Sat, 26 Nov 2022 11:27:11 +0400 Subject: [PATCH 308/412] Adjust license headers --- .../java/me/lemire/longcompression/LongUtil.java | 7 +++++++ .../java/me/lemire/integercompression/AdhocTest.java | 7 +++++++ .../java/me/lemire/integercompression/BasicTest.java | 7 +++++++ .../me/lemire/integercompression/BoundaryTest.java | 7 +++++++ .../me/lemire/integercompression/ByteBasicTest.java | 7 +++++++ .../integercompression/DeltaZigzagEncodingTest.java | 5 ++++- .../me/lemire/integercompression/ExampleTest.java | 7 +++++++ .../lemire/integercompression/IntCompressorTest.java | 7 +++++++ .../me/lemire/integercompression/ResourcedTest.java | 7 +++++++ .../integercompression/SkippableBasicTest.java | 7 +++++++ .../java/me/lemire/integercompression/TestUtils.java | 7 +++++++ .../integercompression/XorBinaryPackingTest.java | 3 +++ .../me/lemire/longcompression/LongTestUtils.java | 7 +++++++ .../longcompression/SkippableLongBasicTest.java | 7 +++++++ .../lemire/longcompression/TestLongVariableByte.java | 12 ++++++++++++ 15 files changed, 103 insertions(+), 1 deletion(-) diff --git a/src/main/java/me/lemire/longcompression/LongUtil.java b/src/main/java/me/lemire/longcompression/LongUtil.java index 6ebbfb7..c06433f 100644 --- a/src/main/java/me/lemire/longcompression/LongUtil.java +++ b/src/main/java/me/lemire/longcompression/LongUtil.java @@ -1,3 +1,10 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + package me.lemire.longcompression; /** diff --git a/src/test/java/me/lemire/integercompression/AdhocTest.java b/src/test/java/me/lemire/integercompression/AdhocTest.java index bced6c0..8fd4049 100644 --- a/src/test/java/me/lemire/integercompression/AdhocTest.java +++ b/src/test/java/me/lemire/integercompression/AdhocTest.java @@ -1,3 +1,10 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + package me.lemire.integercompression; import org.junit.Assert; diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index e88293e..459fbdd 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -1,3 +1,10 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + package me.lemire.integercompression; import java.util.Arrays; diff --git a/src/test/java/me/lemire/integercompression/BoundaryTest.java b/src/test/java/me/lemire/integercompression/BoundaryTest.java index ede2e9f..128b431 100644 --- a/src/test/java/me/lemire/integercompression/BoundaryTest.java +++ b/src/test/java/me/lemire/integercompression/BoundaryTest.java @@ -1,3 +1,10 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + package me.lemire.integercompression; import java.util.Arrays; diff --git a/src/test/java/me/lemire/integercompression/ByteBasicTest.java b/src/test/java/me/lemire/integercompression/ByteBasicTest.java index c2f5b6f..93112c3 100644 --- a/src/test/java/me/lemire/integercompression/ByteBasicTest.java +++ b/src/test/java/me/lemire/integercompression/ByteBasicTest.java @@ -1,3 +1,10 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + package me.lemire.integercompression; import java.util.Arrays; diff --git a/src/test/java/me/lemire/integercompression/DeltaZigzagEncodingTest.java b/src/test/java/me/lemire/integercompression/DeltaZigzagEncodingTest.java index 5e0923d..ae42c1d 100644 --- a/src/test/java/me/lemire/integercompression/DeltaZigzagEncodingTest.java +++ b/src/test/java/me/lemire/integercompression/DeltaZigzagEncodingTest.java @@ -1,7 +1,10 @@ -/* +/** * This code is released under the * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ */ + package me.lemire.integercompression; import org.junit.Test; diff --git a/src/test/java/me/lemire/integercompression/ExampleTest.java b/src/test/java/me/lemire/integercompression/ExampleTest.java index 300983c..f6038b8 100644 --- a/src/test/java/me/lemire/integercompression/ExampleTest.java +++ b/src/test/java/me/lemire/integercompression/ExampleTest.java @@ -1,3 +1,10 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + package me.lemire.integercompression; import me.lemire.integercompression.differential.*; diff --git a/src/test/java/me/lemire/integercompression/IntCompressorTest.java b/src/test/java/me/lemire/integercompression/IntCompressorTest.java index 34b8946..79e51fc 100644 --- a/src/test/java/me/lemire/integercompression/IntCompressorTest.java +++ b/src/test/java/me/lemire/integercompression/IntCompressorTest.java @@ -1,3 +1,10 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + package me.lemire.integercompression; import java.util.Arrays; diff --git a/src/test/java/me/lemire/integercompression/ResourcedTest.java b/src/test/java/me/lemire/integercompression/ResourcedTest.java index 61b8e58..34f1d05 100644 --- a/src/test/java/me/lemire/integercompression/ResourcedTest.java +++ b/src/test/java/me/lemire/integercompression/ResourcedTest.java @@ -1,3 +1,10 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + package me.lemire.integercompression; import java.util.ArrayList; diff --git a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java index d2cda12..93c1784 100644 --- a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java +++ b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java @@ -1,3 +1,10 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + package me.lemire.integercompression; import java.util.Arrays; diff --git a/src/test/java/me/lemire/integercompression/TestUtils.java b/src/test/java/me/lemire/integercompression/TestUtils.java index 7350fb8..7ce51b3 100644 --- a/src/test/java/me/lemire/integercompression/TestUtils.java +++ b/src/test/java/me/lemire/integercompression/TestUtils.java @@ -1,3 +1,10 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + package me.lemire.integercompression; import java.util.Arrays; diff --git a/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java b/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java index 3201b02..650eb4b 100644 --- a/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java +++ b/src/test/java/me/lemire/integercompression/XorBinaryPackingTest.java @@ -1,7 +1,10 @@ /** * This code is released under the * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ */ + package me.lemire.integercompression; import java.util.Arrays; diff --git a/src/test/java/me/lemire/longcompression/LongTestUtils.java b/src/test/java/me/lemire/longcompression/LongTestUtils.java index f7a6f1b..23baaaf 100644 --- a/src/test/java/me/lemire/longcompression/LongTestUtils.java +++ b/src/test/java/me/lemire/longcompression/LongTestUtils.java @@ -1,3 +1,10 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + package me.lemire.longcompression; import static org.junit.Assert.assertArrayEquals; diff --git a/src/test/java/me/lemire/longcompression/SkippableLongBasicTest.java b/src/test/java/me/lemire/longcompression/SkippableLongBasicTest.java index aea7dc8..e900c9c 100644 --- a/src/test/java/me/lemire/longcompression/SkippableLongBasicTest.java +++ b/src/test/java/me/lemire/longcompression/SkippableLongBasicTest.java @@ -1,3 +1,10 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + package me.lemire.longcompression; import java.util.Arrays; diff --git a/src/test/java/me/lemire/longcompression/TestLongVariableByte.java b/src/test/java/me/lemire/longcompression/TestLongVariableByte.java index 38cc061..eab3c63 100644 --- a/src/test/java/me/lemire/longcompression/TestLongVariableByte.java +++ b/src/test/java/me/lemire/longcompression/TestLongVariableByte.java @@ -1,3 +1,10 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + package me.lemire.longcompression; import java.util.stream.LongStream; @@ -5,6 +12,11 @@ import org.junit.Assert; import org.junit.Test; +/** + * Edge-cases having caused issue specifically with LongVariableByte. + * + * @author Benoit Lacelle + */ public class TestLongVariableByte { final LongVariableByte codec = new LongVariableByte(); From bb82f92a5728ae8e4b25098b3fc0eed7fc9e701c Mon Sep 17 00:00:00 2001 From: Benoit Lacelle Date: Sat, 26 Nov 2022 11:28:19 +0400 Subject: [PATCH 309/412] Fix indentation --- .../me/lemire/integercompression/VariableByte.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/VariableByte.java b/src/main/java/me/lemire/integercompression/VariableByte.java index e0e3e25..09e479b 100644 --- a/src/main/java/me/lemire/integercompression/VariableByte.java +++ b/src/main/java/me/lemire/integercompression/VariableByte.java @@ -189,13 +189,13 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] o int finaloutpos = num + tmpoutpos; for (int v = 0, shift = 0; tmpoutpos < finaloutpos;) { val = in[p]; - int c = val >>> s; - // Shift to next byte - s += 8; - // Shift to next integer if s==32 - p += s>>5; - // cycle from 31 to 0 - s = s & 31; + int c = val >>> s; + // Shift to next byte + s += 8; + // Shift to next integer if s==32 + p += s>>5; + // cycle from 31 to 0 + s = s & 31; v += ((c & 127) << shift); if ((c & 128) == 128) { out[tmpoutpos++] = v; From 416a7d449e7e098226bfa0296cc485bc8c4dec3d Mon Sep 17 00:00:00 2001 From: Benoit Lacelle Date: Sat, 26 Nov 2022 12:19:10 +0400 Subject: [PATCH 310/412] Fix bugs detected by LGTM --- .../longcompression/LongVariableByte.java | 20 +++++----- .../longcompression/TestLongVariableByte.java | 37 +++++++++++++++---- 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/src/main/java/me/lemire/longcompression/LongVariableByte.java b/src/main/java/me/lemire/longcompression/LongVariableByte.java index a2db990..2212e7f 100644 --- a/src/main/java/me/lemire/longcompression/LongVariableByte.java +++ b/src/main/java/me/lemire/longcompression/LongVariableByte.java @@ -60,20 +60,20 @@ public void headlessCompress(long[] in, IntWrapper inpos, int inlength, long[] o buf.put((byte) extract7bits(1, val)); buf.put((byte) extract7bits(2, val)); buf.put((byte) (extract7bitsmaskless(3, (val)) | (1 << 7))); - } else if (val >= 0 && val < (1 << 35)) { + } else if (val >= 0 && val < (1L << 35)) { buf.put((byte) extract7bits(0, val)); buf.put((byte) extract7bits(1, val)); buf.put((byte) extract7bits(2, val)); buf.put((byte) extract7bits(3, val)); buf.put((byte) (extract7bitsmaskless(4, (val)) | (1 << 7))); - } else if (val >= 0 && val < (1 << 42)) { + } else if (val >= 0 && val < (1L << 42)) { buf.put((byte) extract7bits(0, val)); buf.put((byte) extract7bits(1, val)); buf.put((byte) extract7bits(2, val)); buf.put((byte) extract7bits(3, val)); buf.put((byte) extract7bits(4, val)); buf.put((byte) (extract7bitsmaskless(5, (val)) | (1 << 7))); - } else if (val >= 0 && val < (1 << 49)) { + } else if (val >= 0 && val < (1L << 49)) { buf.put((byte) extract7bits(0, val)); buf.put((byte) extract7bits(1, val)); buf.put((byte) extract7bits(2, val)); @@ -81,7 +81,7 @@ public void headlessCompress(long[] in, IntWrapper inpos, int inlength, long[] o buf.put((byte) extract7bits(4, val)); buf.put((byte) extract7bits(5, val)); buf.put((byte) (extract7bitsmaskless(6, (val)) | (1 << 7))); - } else if (val >= 0 && val < (1 << 56)) { + } else if (val >= 0 && val < (1L << 56)) { buf.put((byte) extract7bits(0, val)); buf.put((byte) extract7bits(1, val)); buf.put((byte) extract7bits(2, val)); @@ -90,7 +90,7 @@ public void headlessCompress(long[] in, IntWrapper inpos, int inlength, long[] o buf.put((byte) extract7bits(5, val)); buf.put((byte) extract7bits(6, val)); buf.put((byte) (extract7bitsmaskless(7, (val)) | (1 << 7))); - } else if (val >= 0 && val < (1 << 63)) { + } else if (val >= 0 && val < (1L << 63)) { buf.put((byte) extract7bits(0, val)); buf.put((byte) extract7bits(1, val)); buf.put((byte) extract7bits(2, val)); @@ -145,20 +145,20 @@ public void compress(long[] in, IntWrapper inpos, int inlength, byte[] out, out[outpostmp++] = (byte) extract7bits(1, val); out[outpostmp++] = (byte) extract7bits(2, val); out[outpostmp++] = (byte) (extract7bitsmaskless(3, (val)) | (1 << 7)); - } else if (val >= 0 && val < (1 << 35)) { + } else if (val >= 0 && val < (1L << 35)) { out[outpostmp++] = (byte) extract7bits(0, val); out[outpostmp++] = (byte) extract7bits(1, val); out[outpostmp++] = (byte) extract7bits(2, val); out[outpostmp++] = (byte) extract7bits(3, val); out[outpostmp++] = (byte) (extract7bitsmaskless(4, (val)) | (1 << 7)); - } else if (val >= 0 && val < (1 << 42)) { + } else if (val >= 0 && val < (1L << 42)) { out[outpostmp++] = (byte) extract7bits(0, val); out[outpostmp++] = (byte) extract7bits(1, val); out[outpostmp++] = (byte) extract7bits(2, val); out[outpostmp++] = (byte) extract7bits(3, val); out[outpostmp++] = (byte) extract7bits(4, val); out[outpostmp++] = (byte) (extract7bitsmaskless(5, (val)) | (1 << 7)); - } else if (val >= 0 && val < (1 << 49)) { + } else if (val >= 0 && val < (1L << 49)) { out[outpostmp++] = (byte) extract7bits(0, val); out[outpostmp++] = (byte) extract7bits(1, val); out[outpostmp++] = (byte) extract7bits(2, val); @@ -166,7 +166,7 @@ public void compress(long[] in, IntWrapper inpos, int inlength, byte[] out, out[outpostmp++] = (byte) extract7bits(4, val); out[outpostmp++] = (byte) extract7bits(5, val); out[outpostmp++] = (byte) (extract7bitsmaskless(6, (val)) | (1 << 7)); - } else if (val >= 0 && val < (1 << 56)) { + } else if (val >= 0 && val < (1L << 56)) { out[outpostmp++] = (byte) extract7bits(0, val); out[outpostmp++] = (byte) extract7bits(1, val); out[outpostmp++] = (byte) extract7bits(2, val); @@ -175,7 +175,7 @@ public void compress(long[] in, IntWrapper inpos, int inlength, byte[] out, out[outpostmp++] = (byte) extract7bits(5, val); out[outpostmp++] = (byte) extract7bits(6, val); out[outpostmp++] = (byte) (extract7bitsmaskless(7, (val)) | (1 << 7)); - } else if (val >= 0 && val < (1 << 63)) { + } else if (val >= 0 && val < (1L << 63)) { out[outpostmp++] = (byte) extract7bits(0, val); out[outpostmp++] = (byte) extract7bits(1, val); out[outpostmp++] = (byte) extract7bits(2, val); diff --git a/src/test/java/me/lemire/longcompression/TestLongVariableByte.java b/src/test/java/me/lemire/longcompression/TestLongVariableByte.java index eab3c63..15613f2 100644 --- a/src/test/java/me/lemire/longcompression/TestLongVariableByte.java +++ b/src/test/java/me/lemire/longcompression/TestLongVariableByte.java @@ -28,17 +28,17 @@ private void checkConsistency(LongCODEC codec, long[] array) { Assert.assertArrayEquals(array, uncompressed); } - if (codec instanceof SkippableLongCODEC) { - long[] compressed = LongTestUtils.compressHeadless((SkippableLongCODEC) codec, array); - long[] uncompressed = - LongTestUtils.uncompressHeadless((SkippableLongCODEC) codec, compressed, array.length); + if (codec instanceof ByteLongCODEC) { + byte[] compressed = LongTestUtils.compress((ByteLongCODEC) codec, array); + long[] uncompressed = LongTestUtils.uncompress((ByteLongCODEC) codec, compressed, array.length); Assert.assertArrayEquals(array, uncompressed); } - if (codec instanceof ByteLongCODEC) { - byte[] compressed = LongTestUtils.compress((ByteLongCODEC) codec, array); - long[] uncompressed = LongTestUtils.uncompress((ByteLongCODEC) codec, compressed, array.length); + if (codec instanceof SkippableLongCODEC) { + long[] compressed = LongTestUtils.compressHeadless((SkippableLongCODEC) codec, array); + long[] uncompressed = + LongTestUtils.uncompressHeadless((SkippableLongCODEC) codec, compressed, array.length); Assert.assertArrayEquals(array, uncompressed); } @@ -77,4 +77,27 @@ public void testCodec_MinValue() { public void testCodec_ZeroMinValue() { checkConsistency(codec, new long[] { 0, Long.MIN_VALUE }); } + + @Test + public void testCodec_allPowerOfTwo() { + checkConsistency(codec, new long[] { 1L << 42 }); + for (int i = 0; i < 64; i++) { + checkConsistency(codec, new long[] { 1L << i }); + } + } + + @Test + public void testCodec_ZeroThenAllPowerOfTwo() { + for (int i = 0; i < 64; i++) { + checkConsistency(codec, new long[] { 0, 1L << i }); + } + } + + @Test + public void testCodec_intermediateHighPowerOfTwo() { + Assert.assertEquals(1, LongTestUtils.compress((LongCODEC) codec, new long[] { 1L << 42 }).length); + Assert.assertEquals(7, LongTestUtils.compress((ByteLongCODEC) codec, new long[] { 1L << 42 }).length); + Assert.assertEquals(1, LongTestUtils.compressHeadless((SkippableLongCODEC) codec, new long[] { 1L << 42 }).length); + } + } From 3e1d40b82e724a6a489b50a294ab3c82b6c9680a Mon Sep 17 00:00:00 2001 From: Benoit Lacelle Date: Sat, 26 Nov 2022 18:02:52 +0400 Subject: [PATCH 311/412] Add utility classes (Comnposition, Delta), Introduce LongAs2IntsCodec --- pom.xml | 6 + .../longcompression/IntegratedLongCODEC.java | 11 + .../longcompression/LongAs2IntsCodec.java | 189 +++++++++ .../longcompression/LongComposition.java | 71 ++++ .../longcompression/LongVariableByte.java | 1 + .../longcompression/RoaringIntPacking.java | 108 +++++ .../SkippableLongComposition.java | 70 ++++ .../differential/LongDelta.java | 150 +++++++ .../lemire/integercompression/BasicTest.java | 4 +- .../lemire/longcompression/LongBasicTest.java | 396 ++++++++++++++++++ .../lemire/longcompression/LongTestUtils.java | 2 +- .../longcompression/TestLongAs2IntsCodec.java | 106 +++++ .../synth/LongClusteredDataGenerator.java | 91 ++++ .../synth/LongUniformDataGenerator.java | 125 ++++++ 14 files changed, 1327 insertions(+), 3 deletions(-) create mode 100644 src/main/java/me/lemire/longcompression/IntegratedLongCODEC.java create mode 100644 src/main/java/me/lemire/longcompression/LongAs2IntsCodec.java create mode 100644 src/main/java/me/lemire/longcompression/LongComposition.java create mode 100644 src/main/java/me/lemire/longcompression/RoaringIntPacking.java create mode 100644 src/main/java/me/lemire/longcompression/SkippableLongComposition.java create mode 100644 src/main/java/me/lemire/longcompression/differential/LongDelta.java create mode 100644 src/test/java/me/lemire/longcompression/LongBasicTest.java create mode 100644 src/test/java/me/lemire/longcompression/TestLongAs2IntsCodec.java create mode 100644 src/test/java/me/lemire/longcompression/synth/LongClusteredDataGenerator.java create mode 100644 src/test/java/me/lemire/longcompression/synth/LongUniformDataGenerator.java diff --git a/pom.xml b/pom.xml index fc6912b..a960b2c 100644 --- a/pom.xml +++ b/pom.xml @@ -48,6 +48,12 @@ 4.13.1 test + + org.roaringbitmap + RoaringBitmap + 0.9.35 + test + GitHub Issue Tracking diff --git a/src/main/java/me/lemire/longcompression/IntegratedLongCODEC.java b/src/main/java/me/lemire/longcompression/IntegratedLongCODEC.java new file mode 100644 index 0000000..b21ef68 --- /dev/null +++ b/src/main/java/me/lemire/longcompression/IntegratedLongCODEC.java @@ -0,0 +1,11 @@ +package me.lemire.longcompression; + +/** + * This is just like LongCODEC, except that it indicates that delta coding is + * "integrated", so that you don't need a separate step for delta coding. + * + * @author Benoit Lacelle + */ +public interface IntegratedLongCODEC extends LongCODEC { + +} diff --git a/src/main/java/me/lemire/longcompression/LongAs2IntsCodec.java b/src/main/java/me/lemire/longcompression/LongAs2IntsCodec.java new file mode 100644 index 0000000..3b2bc76 --- /dev/null +++ b/src/main/java/me/lemire/longcompression/LongAs2IntsCodec.java @@ -0,0 +1,189 @@ +package me.lemire.longcompression; + +import java.util.Arrays; + +import me.lemire.integercompression.BinaryPacking; +import me.lemire.integercompression.Composition; +import me.lemire.integercompression.IntCompressor; +import me.lemire.integercompression.IntWrapper; +import me.lemire.integercompression.IntegerCODEC; +import me.lemire.integercompression.VariableByte; + +/** + * A {@link LongCODEC} which split each long in a highpart (32 first bits) and a low part (32 last bits). + * + * @author Benoit Lacelle + * + */ +public class LongAs2IntsCodec implements LongCODEC { + final IntegerCODEC highPartsCodec; + final IntegerCODEC lowPartsCodec; + + public LongAs2IntsCodec(IntegerCODEC highPartsCodec, IntegerCODEC lowPartsCodec) { + this.highPartsCodec = highPartsCodec; + this.lowPartsCodec = lowPartsCodec; + } + + /** + * By default, we expect longs to be slightly above Integer.MAX_VALUE. Hence highParts to be small and positive + * integers. For lowParts, we rely on {@link IntCompressor} default IntegerCODEC + */ + public LongAs2IntsCodec() { + this(new VariableByte(), new Composition(new BinaryPacking(), new VariableByte())); + } + + @Override + public void compress(long[] in, IntWrapper inpos, int inlength, long[] out, IntWrapper outpos) { + if (inlength == 0) { + return; + } + + int[] highParts = new int[inlength]; + int[] lowParts = new int[inlength]; + + for (int i = 0; i < inlength; i++) { + int inPosition = inpos.get() + i; + + highParts[i] = RoaringIntPacking.high(in[inPosition]); + lowParts[i] = RoaringIntPacking.low(in[inPosition]); + } + + // TODO What would be a relevant buffer size? + int[] buffer = new int[inlength * 16]; + + int outPosition = outpos.get(); + + boolean hasLeftover; + { + // The first integer is reserved to hold the number of compressed ints + IntWrapper highPartsOutPosition = new IntWrapper(1); + + highPartsCodec.compress(highParts, new IntWrapper(), inlength, buffer, highPartsOutPosition); + + // Record the compressedHighparts length + buffer[0] = highPartsOutPosition.get() - 1; + + for (int i = 0; i < highPartsOutPosition.get() / 2; i++) { + long pack = RoaringIntPacking.pack(buffer[i * 2], buffer[i * 2 + 1]); + out[outPosition++] = pack; + } + + if (1 == highPartsOutPosition.get() % 2) { + // Shift the trailing integer as first in the buffer + hasLeftover = true; + buffer[0] = buffer[highPartsOutPosition.get() - 1]; + } else { + hasLeftover = false; + } + } + + { + // The first integer is reserved to hold the number of compressed ints + IntWrapper lowPartsOutPosition = new IntWrapper(1); + if (hasLeftover) { + // Keep the trailing int from highParts before the reserved int from lowParts compressed length + lowPartsOutPosition.set(2); + } + + lowPartsCodec.compress(lowParts, new IntWrapper(0), inlength, buffer, lowPartsOutPosition); + + // Record the compressedHighparts length + buffer[hasLeftover ? 1 : 0] = lowPartsOutPosition.get() - (hasLeftover ? 2 : 1); + + for (int i = 0; i < lowPartsOutPosition.get() / 2; i++) { + long pack = RoaringIntPacking.pack(buffer[i * 2], buffer[i * 2 + 1]); + out[outPosition++] = pack; + } + + if (1 == lowPartsOutPosition.get() % 2) { + // The trailing integer is packed with a 0 + long pack = RoaringIntPacking.pack(buffer[lowPartsOutPosition.get() - 1], 0); + out[outPosition++] = pack; + } + } + + inpos.add(inlength); + outpos.set(outPosition); + } + + /** + * inlength is ignored by this codec. We may rely on it instead of storing the compressedLowPart length + */ + @Override + public void uncompress(long[] in, IntWrapper inpos, int inlength, long[] out, IntWrapper outpos) { + if (inlength == 0) { + return; + } + + int longIndex = inpos.get(); + + int nbCompressedHighParts = RoaringIntPacking.high(in[longIndex]); + int[] compressedHighParts = new int[nbCompressedHighParts]; + + // !highPart as we just read the highPart for nbCompressedHighParts + boolean highPart = false; + for (int i = 0; i < nbCompressedHighParts; i++) { + int nextInt; + if (highPart) { + nextInt = RoaringIntPacking.high(in[longIndex + (i + 1) / 2]); + } else { + nextInt = RoaringIntPacking.low(in[longIndex + (i + 1) / 2]); + } + compressedHighParts[i] = nextInt; + + highPart = !highPart; + } + + // TODO What would be a relevant buffer size? + int[] buffer = new int[inlength * 16]; + + IntWrapper highPartsOutPosition = new IntWrapper(); + highPartsCodec.uncompress(compressedHighParts, + new IntWrapper(), + compressedHighParts.length, + buffer, + highPartsOutPosition); + int[] highParts = Arrays.copyOf(buffer, highPartsOutPosition.get()); + + // +1 as we initially read nbCompressedHighParts + int intIndexNbCompressedLowParts = longIndex * 2 + 1 + nbCompressedHighParts; + int nbCompressedLowParts; + if (highPart) { + nbCompressedLowParts = RoaringIntPacking.high(in[intIndexNbCompressedLowParts / 2]); + } else { + nbCompressedLowParts = RoaringIntPacking.low(in[intIndexNbCompressedLowParts / 2]); + } + highPart = !highPart; + + int[] compressedLowParts = new int[nbCompressedLowParts]; + for (int i = 0; i < nbCompressedLowParts; i++) { + int nextInt; + if (highPart) { + nextInt = RoaringIntPacking.high(in[(intIndexNbCompressedLowParts + 1 + i) / 2]); + } else { + nextInt = RoaringIntPacking.low(in[(intIndexNbCompressedLowParts + 1 + i) / 2]); + } + compressedLowParts[i] = nextInt; + + highPart = !highPart; + } + + IntWrapper lowPartsOutPosition = new IntWrapper(); + lowPartsCodec.uncompress(compressedLowParts, + new IntWrapper(), + compressedLowParts.length, + buffer, + lowPartsOutPosition); + int[] lowParts = Arrays.copyOf(buffer, lowPartsOutPosition.get()); + assert highParts.length == lowParts.length; + + int outposition = outpos.get(); + for (int i = 0; i < highParts.length; i++) { + out[outposition++] = RoaringIntPacking.pack(highParts[i], lowParts[i]); + } + + inpos.add(inlength); + outpos.set(outposition); + } + +} diff --git a/src/main/java/me/lemire/longcompression/LongComposition.java b/src/main/java/me/lemire/longcompression/LongComposition.java new file mode 100644 index 0000000..1394a78 --- /dev/null +++ b/src/main/java/me/lemire/longcompression/LongComposition.java @@ -0,0 +1,71 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ +package me.lemire.longcompression; + +import me.lemire.integercompression.IntWrapper; + +/** + * Helper class to compose schemes. + * + * @author Benoit Lacelle + */ +public class LongComposition implements LongCODEC { + LongCODEC F1, F2; + + /** + * Compose a scheme from a first one (f1) and a second one (f2). The + * first one is called first and then the second one tries to compress + * whatever remains from the first run. + * + * By convention, the first scheme should be such that if, during + * decoding, a 32-bit zero is first encountered, then there is no + * output. + * + * @param f1 + * first codec + * @param f2 + * second codec + */ + public LongComposition(LongCODEC f1, LongCODEC f2) { + F1 = f1; + F2 = f2; + } + + @Override + public void compress(long[] in, IntWrapper inpos, int inlength, + long[] out, IntWrapper outpos) { + if (inlength == 0) { + return; + } + int inposInit = inpos.get(); + int outposInit = outpos.get(); + F1.compress(in, inpos, inlength, out, outpos); + if (outpos.get() == outposInit) { + out[outposInit] = 0; + outpos.increment(); + } + inlength -= inpos.get() - inposInit; + F2.compress(in, inpos, inlength, out, outpos); + } + + @Override + public void uncompress(long[] in, IntWrapper inpos, int inlength, + long[] out, IntWrapper outpos) { + if (inlength == 0) + return; + final int init = inpos.get(); + F1.uncompress(in, inpos, inlength, out, outpos); + inlength -= inpos.get() - init; + F2.uncompress(in, inpos, inlength, out, outpos); + } + + @Override + public String toString() { + return F1.toString() + " + " + F2.toString(); + } + +} diff --git a/src/main/java/me/lemire/longcompression/LongVariableByte.java b/src/main/java/me/lemire/longcompression/LongVariableByte.java index 2212e7f..478db20 100644 --- a/src/main/java/me/lemire/longcompression/LongVariableByte.java +++ b/src/main/java/me/lemire/longcompression/LongVariableByte.java @@ -41,6 +41,7 @@ public void headlessCompress(long[] in, IntWrapper inpos, int inlength, long[] o IntWrapper outpos) { if (inlength == 0) return; + // Worst case: we write 10 bytes per long, hence 2 longs for a long, hence 16 bytes per long ByteBuffer buf = makeBuffer(inlength * 16); buf.order(ByteOrder.LITTLE_ENDIAN); for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { diff --git a/src/main/java/me/lemire/longcompression/RoaringIntPacking.java b/src/main/java/me/lemire/longcompression/RoaringIntPacking.java new file mode 100644 index 0000000..f109ab3 --- /dev/null +++ b/src/main/java/me/lemire/longcompression/RoaringIntPacking.java @@ -0,0 +1,108 @@ +/* + * (c) the authors Licensed under the Apache License, Version 2.0. + */ +package me.lemire.longcompression; + +import java.math.BigInteger; +import java.util.Comparator; + +/** + * Used to hold the logic packing 2 integers in a long, and separating a long in two integers. It is + * useful in {@link Roaring64NavigableMap} as the implementation split the input long in two + * integers, one used as key of a NavigableMap while the other is added in a Bitmap + * + * @author Benoit Lacelle + * + */ +// Duplicated from RoaringBitmap +class RoaringIntPacking { + + /** + * + * @param id any long, positive or negative + * @return an int holding the 32 highest order bits of information of the input long + */ + public static int high(long id) { + return (int) (id >> 32); + } + + /** + * + * @param id any long, positive or negative + * @return an int holding the 32 lowest order bits of information of the input long + */ + public static int low(long id) { + return (int) id; + } + + /** + * + * @param high an integer representing the highest order bits of the output long + * @param low an integer representing the lowest order bits of the output long + * @return a long packing together the integers as computed by + * {@link RoaringIntPacking#high(long)} and {@link RoaringIntPacking#low(long)} + */ + // https://stackoverflow.com/questions/12772939/java-storing-two-ints-in-a-long + public static long pack(int high, int low) { + return (((long) high) << 32) | (low & 0xffffffffL); + } + + + /** + * + * @param signedLongs true if long put in a {@link Roaring64NavigableMap} should be considered as + * signed long. + * @return the int representing the highest value which can be set as high value in a + * {@link Roaring64NavigableMap} + */ + public static int highestHigh(boolean signedLongs) { + if (signedLongs) { + return Integer.MAX_VALUE; + } else { + return -1; + } + } + + /** + * @return A comparator for unsigned longs: a negative long is a long greater than Long.MAX_VALUE + */ + public static Comparator unsignedComparator() { + return new Comparator() { + + @Override + public int compare(Integer o1, Integer o2) { + return compareUnsigned(o1, o2); + } + }; + } + + /** + * Compares two {@code int} values numerically treating the values as unsigned. + * + * @param x the first {@code int} to compare + * @param y the second {@code int} to compare + * @return the value {@code 0} if {@code x == y}; a value less than {@code 0} if {@code x < y} as + * unsigned values; and a value greater than {@code 0} if {@code x > y} as unsigned values + * @since 1.8 + */ + // Duplicated from jdk8 Integer.compareUnsigned + public static int compareUnsigned(int x, int y) { + return Integer.compare(x + Integer.MIN_VALUE, y + Integer.MIN_VALUE); + } + + /** the constant 2^64 */ + private static final BigInteger TWO_64 = BigInteger.ONE.shiftLeft(64); + + /** + * JDK8 Long.toUnsignedString was too complex to backport. Go for a slow version relying on + * BigInteger + */ + // https://stackoverflow.com/questions/7031198/java-signed-long-to-unsigned-long-string + static String toUnsignedString(long l) { + BigInteger b = BigInteger.valueOf(l); + if (b.signum() < 0) { + b = b.add(TWO_64); + } + return b.toString(); + } +} diff --git a/src/main/java/me/lemire/longcompression/SkippableLongComposition.java b/src/main/java/me/lemire/longcompression/SkippableLongComposition.java new file mode 100644 index 0000000..5568489 --- /dev/null +++ b/src/main/java/me/lemire/longcompression/SkippableLongComposition.java @@ -0,0 +1,70 @@ +/** + * This is code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ +package me.lemire.longcompression; + +import me.lemire.integercompression.IntWrapper; + +/** + * Helper class to compose schemes. + * + * @author Benoit Lacelle + */ +public class SkippableLongComposition implements SkippableLongCODEC { + SkippableLongCODEC F1, F2; + + /** + * Compose a scheme from a first one (f1) and a second one (f2). The first + * one is called first and then the second one tries to compress whatever + * remains from the first run. + * + * By convention, the first scheme should be such that if, during decoding, + * a 32-bit zero is first encountered, then there is no output. + * + * @param f1 + * first codec + * @param f2 + * second codec + */ + public SkippableLongComposition(SkippableLongCODEC f1, + SkippableLongCODEC f2) { + F1 = f1; + F2 = f2; + } + + @Override + public void headlessCompress(long[] in, IntWrapper inpos, int inlength, long[] out, + IntWrapper outpos) { + int init = inpos.get(); + int outposInit = outpos.get(); + F1.headlessCompress(in, inpos, inlength, out, outpos); + if (outpos.get() == outposInit) { + out[outposInit] = 0; + outpos.increment(); + } + inlength -= inpos.get() - init; + F2.headlessCompress(in, inpos, inlength, out, outpos); + } + + @Override + public void headlessUncompress(long[] in, IntWrapper inpos, int inlength, long[] out, + IntWrapper outpos, int num) { + int init = inpos.get(); + F1.headlessUncompress(in, inpos, inlength, out, outpos, num); + if (inpos.get() == init) { + inpos.increment(); + } + inlength -= inpos.get() - init; + num -= outpos.get(); + F2.headlessUncompress(in, inpos, inlength, out, outpos, num); + } + + @Override + public String toString() { + return F1.toString() + "+" + F2.toString(); + } + +} diff --git a/src/main/java/me/lemire/longcompression/differential/LongDelta.java b/src/main/java/me/lemire/longcompression/differential/LongDelta.java new file mode 100644 index 0000000..2b0e077 --- /dev/null +++ b/src/main/java/me/lemire/longcompression/differential/LongDelta.java @@ -0,0 +1,150 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + +package me.lemire.longcompression.differential; + +/** + * Generic class to compute differential coding. + * + * @author Benoit lacelle + * + */ +public final class LongDelta { + + /** + * Apply differential coding (in-place). + * + * @param data + * data to be modified + */ + public static void delta(long[] data) { + for (int i = data.length - 1; i > 0; --i) { + data[i] -= data[i - 1]; + } + } + + /** + * Apply differential coding (in-place) given an initial value. + * + * @param data + * data to be modified + * @param start + * starting index + * @param length + * number of integers to process + * @param init + * initial value + * @return next initial vale + */ + public static long delta(long[] data, int start, int length, int init) { + final long nextinit = data[start + length - 1]; + for (int i = length - 1; i > 0; --i) { + data[start + i] -= data[start + i - 1]; + } + data[start] -= init; + return nextinit; + } + + /** + * Compute differential coding given an initial value. Output is written + * to a provided array: must have length "length" or better. + * + * @param data + * data to be modified + * @param start + * starting index + * @param length + * number of integers to process + * @param init + * initial value + * @param out + * output array + * @return next initial vale + */ + public static long delta(long[] data, int start, int length, int init, + long[] out) { + for (int i = length - 1; i > 0; --i) { + out[i] = data[start + i] - data[start + i - 1]; + } + out[0] = data[start] - init; + return data[start + length - 1]; + } + + /** + * Undo differential coding (in-place). Effectively computes a prefix + * sum. + * + * @param data + * to be modified. + */ + public static void inverseDelta(long[] data) { + for (int i = 1; i < data.length; ++i) { + data[i] += data[i - 1]; + } + } + + /** + * Undo differential coding (in-place). Effectively computes a prefix + * sum. Like inverseDelta, only faster. + * + * @param data + * to be modified + */ + public static void fastinverseDelta(long[] data) { + int sz0 = data.length / 4 * 4; + int i = 1; + if (sz0 >= 4) { + long a = data[0]; + for (; i < sz0 - 4; i += 4) { + a = data[i] += a; + a = data[i + 1] += a; + a = data[i + 2] += a; + a = data[i + 3] += a; + } + } + + for (; i != data.length; ++i) { + data[i] += data[i - 1]; + } + } + + /** + * Undo differential coding (in-place). Effectively computes a prefix + * sum. Like inverseDelta, only faster. Uses an initial value. + * + * @param data + * to be modified + * @param start + * starting index + * @param length + * number of integers to process + * @param init + * initial value + * @return next initial value + */ + public static long fastinverseDelta(long[] data, int start, int length, + int init) { + data[start] += init; + int sz0 = length / 4 * 4; + int i = 1; + if (sz0 >= 4) { + long a = data[start]; + for (; i < sz0 - 4; i += 4) { + a = data[start + i] += a; + a = data[start + i + 1] += a; + a = data[start + i + 2] += a; + a = data[start + i + 3] += a; + } + } + + for (; i != length; ++i) { + data[start + i] += data[start + i - 1]; + } + return data[start + length - 1]; + } + +} diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 459fbdd..b5f292e 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -29,7 +29,7 @@ */ @SuppressWarnings({ "static-method" }) public class BasicTest { - IntegerCODEC[] codecs = { + final IntegerCODEC[] codecs = { new IntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte()), new JustCopy(), @@ -51,7 +51,7 @@ public class BasicTest { new DeltaZigzagVariableByte()) }; /** - * + * This tests with a compressed array with various offset */ @Test public void saulTest() { diff --git a/src/test/java/me/lemire/longcompression/LongBasicTest.java b/src/test/java/me/lemire/longcompression/LongBasicTest.java new file mode 100644 index 0000000..5aa3551 --- /dev/null +++ b/src/test/java/me/lemire/longcompression/LongBasicTest.java @@ -0,0 +1,396 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + +package me.lemire.longcompression; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; + +import org.junit.Test; + +import me.lemire.integercompression.BinaryPacking; +import me.lemire.integercompression.Composition; +import me.lemire.integercompression.FastPFOR; +import me.lemire.integercompression.FastPFOR128; +import me.lemire.integercompression.IntWrapper; +import me.lemire.integercompression.JustCopy; +import me.lemire.integercompression.NewPFD; +import me.lemire.integercompression.NewPFDS16; +import me.lemire.integercompression.NewPFDS9; +import me.lemire.integercompression.OptPFD; +import me.lemire.integercompression.OptPFDS16; +import me.lemire.integercompression.OptPFDS9; +import me.lemire.integercompression.Simple9; +import me.lemire.integercompression.VariableByte; +import me.lemire.integercompression.differential.Delta; +import me.lemire.integercompression.differential.IntegratedBinaryPacking; +import me.lemire.integercompression.differential.IntegratedComposition; +import me.lemire.integercompression.differential.IntegratedVariableByte; +import me.lemire.longcompression.differential.LongDelta; +import me.lemire.longcompression.synth.LongClusteredDataGenerator; + +/** + * Just some basic sanity tests. + * + * @author Benoit Lacelle + */ +@SuppressWarnings({ "static-method" }) +public class LongBasicTest { + final LongCODEC[] codecs = { + new LongJustCopy(), + new LongVariableByte(), + new LongAs2IntsCodec()}; + + /** + * This tests with a compressed array with various offset + */ + @Test + public void saulTest() { + for (LongCODEC C : codecs) { + for (int x = 0; x < 50; ++x) { + long[] a = { 2, 3, 4, 5 }; + long[] b = new long[90]; + long[] c = new long[a.length]; + + IntWrapper aOffset = new IntWrapper(0); + IntWrapper bOffset = new IntWrapper(x); + C.compress(a, aOffset, a.length, b, bOffset); + int len = bOffset.get() - x; + + bOffset.set(x); + IntWrapper cOffset = new IntWrapper(0); + C.uncompress(b, bOffset, len, c, cOffset); + if(!Arrays.equals(a, c)) { + System.out.println("Problem with "+C); + } + assertArrayEquals(a, c); + + } + } + } + /** + * + */ + @Test + public void varyingLengthTest() { + int N = 4096; + long[] data = new long[N]; + for (int k = 0; k < N; ++k) + data[k] = k; + for (LongCODEC c : codecs) { + System.out.println("[BasicTest.varyingLengthTest] codec = " + c); + for (int L = 1; L <= 128; L++) { + long[] comp = LongTestUtils.compress(c, Arrays.copyOf(data, L)); + long[] answer = LongTestUtils.uncompress(c, comp, L); + for (int k = 0; k < L; ++k) + if (answer[k] != data[k]) + throw new RuntimeException("bug"); + } + for (int L = 128; L <= N; L *= 2) { + long[] comp = LongTestUtils.compress(c, Arrays.copyOf(data, L)); + long[] answer = LongTestUtils.uncompress(c, comp, L); + for (int k = 0; k < L; ++k) + if (answer[k] != data[k]) { + System.out.println(Arrays.toString(Arrays.copyOf( + answer, L))); + System.out.println(Arrays.toString(Arrays.copyOf(data, + L))); + throw new RuntimeException("bug"); + } + } + + } + } + + /** + * + */ + @Test + public void varyingLengthTest2() { + int N = 128; + long[] data = new long[N]; + data[127] = -1; + for (LongCODEC c : codecs) { + System.out.println("[BasicTest.varyingLengthTest2] codec = " + c); + try { + // CODEC Simple9 is limited to "small" integers. + if (c.getClass().equals( + Class.forName("me.lemire.integercompression.Simple9"))) + continue; + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + try { + // CODEC Simple16 is limited to "small" integers. + if (c.getClass().equals( + Class.forName("me.lemire.integercompression.Simple16"))) + continue; + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + try { + // CODEC GroupSimple9 is limited to "small" integers. + if (c.getClass().equals( + Class.forName("me.lemire.integercompression.GroupSimple9"))) + continue; + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + + for (int L = 1; L <= 128; L++) { + long[] comp = LongTestUtils.compress(c, Arrays.copyOf(data, L)); + long[] answer = LongTestUtils.uncompress(c, comp, L); + for (int k = 0; k < L; ++k) + if (answer[k] != data[k]) + throw new RuntimeException("bug"); + } + for (int L = 128; L <= N; L *= 2) { + long[] comp = LongTestUtils.compress(c, Arrays.copyOf(data, L)); + long[] answer = LongTestUtils.uncompress(c, comp, L); + for (int k = 0; k < L; ++k) + if (answer[k] != data[k]) + throw new RuntimeException("bug"); + } + + } + } + + /** + * + */ + @Test + public void checkVariousCases() { + for (LongCODEC c : codecs) { + testZeroInZeroOut(c); + test(c, c, 5, 10); + test(c, c, 5, 14); + test(c, c, 2, 18); + // TODO Unclear which codec should manage an empty output array or not + // Some IntegerCodec does not output anything if the input is smaller than some block size + // testSpurious(c); + testUnsorted(c); + testUnsorted2(c); + testUnsorted3(c); + } + } + + /** + * check that the codecs can be inverted. + */ + @Test + public void basictest() { + for (LongCODEC codec : codecs) { + test(codec, 5, 10); + test(codec, 5, 14); + test(codec, 2, 18); + } + } + + private static void testSpurious(LongCODEC c) { + long[] x = new long[1024]; + long[] y = new long[0]; + IntWrapper i0 = new IntWrapper(0); + IntWrapper i1 = new IntWrapper(0); + for (int inlength = 0; inlength < 32; ++inlength) { + c.compress(x, i0, inlength, y, i1); + assertEquals(0, i1.intValue()); + } + } + + private static void testZeroInZeroOut(LongCODEC c) { + long[] x = new long[0]; + long[] y = new long[0]; + IntWrapper i0 = new IntWrapper(0); + IntWrapper i1 = new IntWrapper(0); + c.compress(x, i0, 0, y, i1); + assertEquals(0, i1.intValue()); + + long[] out = new long[0]; + IntWrapper outpos = new IntWrapper(0); + c.uncompress(y, i1, 0, out, outpos); + assertEquals(0, outpos.intValue()); + } + + private static void test(LongCODEC c, LongCODEC co, int N, int nbr) { + LongClusteredDataGenerator cdg = new LongClusteredDataGenerator(); + for (int sparsity = 1; sparsity < 31 - nbr; sparsity += 4) { + long[][] data = new long[N][]; + int max = (1 << (nbr + sparsity)); + for (int k = 0; k < N; ++k) { + data[k] = cdg.generateClustered((1 << nbr), max); + } + testCodec(c, co, data, max); + } + } + + private static void test(LongCODEC codec, int N, int nbr) { + LongClusteredDataGenerator cdg = new LongClusteredDataGenerator(); + System.out.println("[BasicTest.test] N = " + N + " " + nbr); + for (int sparsity = 1; sparsity < 63 - nbr; sparsity += 4) { + long[][] data = new long[N][]; + long max = (1L << (nbr + sparsity)); + for (int k = 0; k < N; ++k) { + data[k] = cdg.generateClustered((1 << nbr), max); + } + + testCodec(codec, codec, data, max); + } + } + + private static void testCodec(LongCODEC c, LongCODEC co, + long[][] data, long max) { + int N = data.length; + int maxlength = 0; + for (int k = 0; k < N; ++k) { + if (data[k].length > maxlength) + maxlength = data[k].length; + } + long[] buffer = new long[maxlength + 1024]; + long[] dataout = new long[4 * maxlength + 1024]; + // 4x + 1024 to account for the possibility of some negative + // compression. + IntWrapper inpos = new IntWrapper(); + IntWrapper outpos = new IntWrapper(); + for (int k = 0; k < N; ++k) { + long[] backupdata = Arrays.copyOf(data[k], data[k].length); + + inpos.set(1); + outpos.set(0); + if (!(c instanceof IntegratedLongCODEC)) { + LongDelta.delta(backupdata); + } + c.compress(backupdata, inpos, backupdata.length - inpos.get(), + dataout, outpos); + final int thiscompsize = outpos.get() + 1; + inpos.set(0); + outpos.set(1); + buffer[0] = backupdata[0]; + co.uncompress(dataout, inpos, thiscompsize - 1, buffer, outpos); + if (!(c instanceof IntegratedLongCODEC)) + LongDelta.fastinverseDelta(buffer); + + // Check assertions. + assertEquals("length is not match", outpos.get(), data[k].length); + long[] bufferCutout = Arrays.copyOf(buffer, outpos.get()); + assertArrayEquals("failed to reconstruct original data", data[k], + bufferCutout); + } + } + + /** + * @param codec + * provided codec + */ + public void testUnsorted(LongCODEC codec) { + int[] lengths = { 133, 1026, 1333333 }; + for (int N : lengths) { + long[] data = new long[N]; + // initialize the data (most will be small) + for (int k = 0; k < N; k += 1) + data[k] = 3; + // throw some larger values + for (int k = 0; k < N; k += 5) + data[k] = 100; + for (int k = 0; k < N; k += 533) + data[k] = 10000; + data[5] = -311; + // could need more compressing + long[] compressed = new long[(int) Math.ceil(N * 1.01) + 1024]; + IntWrapper inputoffset = new IntWrapper(0); + IntWrapper outputoffset = new IntWrapper(0); + codec.compress(data, inputoffset, data.length, compressed, + outputoffset); + // we can repack the data: (optional) + compressed = Arrays.copyOf(compressed, outputoffset.intValue()); + + long[] recovered = new long[N]; + IntWrapper recoffset = new IntWrapper(0); + codec.uncompress(compressed, new IntWrapper(0), compressed.length, + recovered, recoffset); + assertArrayEquals(data, recovered); + } + } + + private void testUnsorted2(LongCODEC codec) { + long[] data = new long[128]; + data[5] = -1; + long[] compressed = new long[1024]; + IntWrapper inputoffset = new IntWrapper(0); + IntWrapper outputoffset = new IntWrapper(0); + codec.compress(data, inputoffset, data.length, compressed, outputoffset); + // we can repack the data: (optional) + compressed = Arrays.copyOf(compressed, outputoffset.intValue()); + + long[] recovered = new long[128]; + IntWrapper recoffset = new IntWrapper(0); + codec.uncompress(compressed, new IntWrapper(0), compressed.length, + recovered, recoffset); + assertArrayEquals(data, recovered); + } + + private void testUnsorted3(LongCODEC codec) { + long[] data = new long[128]; + data[127] = -1; + long[] compressed = new long[1024]; + IntWrapper inputoffset = new IntWrapper(0); + IntWrapper outputoffset = new IntWrapper(0); + codec.compress(data, inputoffset, data.length, compressed, outputoffset); + // we can repack the data: (optional) + compressed = Arrays.copyOf(compressed, outputoffset.intValue()); + + long[] recovered = new long[128]; + IntWrapper recoffset = new IntWrapper(0); + codec.uncompress(compressed, new IntWrapper(0), compressed.length, + recovered, recoffset); + assertArrayEquals(data, recovered); + } + + /** + * + */ + @Test + public void fastPforTest() { + // proposed by Stefan Ackermann (https://github.com/Stivo) + for (LongCODEC codec : codecs) { + int N = FastPFOR.BLOCK_SIZE; + long[] data = new long[N]; + for (int i = 0; i < N; i++) + data[i] = 0; + data[126] = -1; + long[] comp = LongTestUtils.compress(codec, Arrays.copyOf(data, N)); + long[] answer = LongTestUtils.uncompress(codec, comp, N); + for (int k = 0; k < N; ++k) + if (answer[k] != data[k]) + throw new RuntimeException("bug " + k + " " + answer[k] + + " != " + data[k]); + } + } + + /** + * + */ + @Test + public void fastPfor128Test() { + // proposed by Stefan Ackermann (https://github.com/Stivo) + for (LongCODEC codec : codecs) { + int N = FastPFOR128.BLOCK_SIZE; + long[] data = new long[N]; + for (int i = 0; i < N; i++) + data[i] = 0; + data[126] = -1; + long[] comp = LongTestUtils.compress(codec, Arrays.copyOf(data, N)); + long[] answer = LongTestUtils.uncompress(codec, comp, N); + for (int k = 0; k < N; ++k) + if (answer[k] != data[k]) + throw new RuntimeException("bug " + k + " " + answer[k] + + " != " + data[k]); + } + } + +} diff --git a/src/test/java/me/lemire/longcompression/LongTestUtils.java b/src/test/java/me/lemire/longcompression/LongTestUtils.java index 23baaaf..a44e665 100644 --- a/src/test/java/me/lemire/longcompression/LongTestUtils.java +++ b/src/test/java/me/lemire/longcompression/LongTestUtils.java @@ -77,7 +77,7 @@ public static void assertSymmetry(LongCODEC codec, long... orig) { } protected static long[] compress(LongCODEC codec, long[] data) { - long[] outBuf = new long[data.length * 4]; + long[] outBuf = new long[data.length * 8]; IntWrapper inPos = new IntWrapper(); IntWrapper outPos = new IntWrapper(); codec.compress(data, inPos, data.length, outBuf, outPos); diff --git a/src/test/java/me/lemire/longcompression/TestLongAs2IntsCodec.java b/src/test/java/me/lemire/longcompression/TestLongAs2IntsCodec.java new file mode 100644 index 0000000..00bb52a --- /dev/null +++ b/src/test/java/me/lemire/longcompression/TestLongAs2IntsCodec.java @@ -0,0 +1,106 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + +package me.lemire.longcompression; + +import java.util.stream.LongStream; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Edge-cases having caused issue specifically with LongVariableByte. + * + * @author Benoit Lacelle + */ +public class TestLongAs2IntsCodec { + final LongAs2IntsCodec codec = new LongAs2IntsCodec(); + + private void checkConsistency(LongCODEC codec, long[] array) { + { + long[] compressed = LongTestUtils.compress(codec, array); + long[] uncompressed = LongTestUtils.uncompress(codec, compressed, array.length); + + Assert.assertArrayEquals(array, uncompressed); + } + + if (codec instanceof ByteLongCODEC) { + byte[] compressed = LongTestUtils.compress((ByteLongCODEC) codec, array); + long[] uncompressed = LongTestUtils.uncompress((ByteLongCODEC) codec, compressed, array.length); + + Assert.assertArrayEquals(array, uncompressed); + } + + if (codec instanceof SkippableLongCODEC) { + long[] compressed = LongTestUtils.compressHeadless((SkippableLongCODEC) codec, array); + long[] uncompressed = + LongTestUtils.uncompressHeadless((SkippableLongCODEC) codec, compressed, array.length); + + Assert.assertArrayEquals(array, uncompressed); + } + } + + @Test + public void testCodec_Zero() { + checkConsistency(codec, new long[] { 0 }); + } + + @Test + public void testCodec_Minus1() { + checkConsistency(codec, new long[] { -1 }); + } + + @Test + public void testCodec_ZeroTimes8Minus1() { + checkConsistency(codec, new long[] { 0, 0, 0, 0, 0, 0, 0, 0, -1 }); + } + + @Test + public void testCodec_ZeroTimes127Minus1() { + long[] array = LongStream.concat(LongStream.range(0, 127).map(l -> 0), LongStream.of(-1)).toArray(); + + checkConsistency(codec, array); + } + + @Test + public void testCodec_ZeroTimes128Minus1() { + long[] array = LongStream.concat(LongStream.range(0, 128).map(l -> 0), LongStream.of(-1)).toArray(); + + checkConsistency(codec, array); + } + + @Test + public void testCodec_MinValue() { + checkConsistency(codec, new long[] { Long.MIN_VALUE }); + } + + @Test + public void testCodec_ZeroMinValue() { + checkConsistency(codec, new long[] { 0, Long.MIN_VALUE }); + } + + @Test + public void testCodec_allPowerOfTwo() { + checkConsistency(codec, new long[] { 1L << 42 }); + for (int i = 0; i < 64; i++) { + checkConsistency(codec, new long[] { 1L << i }); + } + } + + @Test + public void testCodec_ZeroThenAllPowerOfTwo() { + for (int i = 0; i < 64; i++) { + checkConsistency(codec, new long[] { 0, 1L << i }); + } + } + + @Test + public void testCodec_intermediateHighPowerOfTwo() { + Assert.assertEquals(3, LongTestUtils.compress((LongCODEC) codec, new long[] { 1L << 42 }).length); + } + +} diff --git a/src/test/java/me/lemire/longcompression/synth/LongClusteredDataGenerator.java b/src/test/java/me/lemire/longcompression/synth/LongClusteredDataGenerator.java new file mode 100644 index 0000000..5b90ee0 --- /dev/null +++ b/src/test/java/me/lemire/longcompression/synth/LongClusteredDataGenerator.java @@ -0,0 +1,91 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ +package me.lemire.longcompression.synth; + +import me.lemire.integercompression.synth.ClusteredDataGenerator; + +/** + * This class will generate lists of random longs based on the clustered + * model: + * + * Reference: Vo Ngoc Anh and Alistair Moffat. 2010. Index compression using + * 64-bit words. Softw. Pract. Exper.40, 2 (February 2010), 131-147. + * + * @author Benoit Lacelle + * @see ClusteredDataGenerator + */ +public class LongClusteredDataGenerator { + + final LongUniformDataGenerator unidg = new LongUniformDataGenerator(); + + /** + * Creating random array generator. + */ + public LongClusteredDataGenerator() { + } + + void fillUniform(long[] array, int offset, int length, long Min, long Max) { + long[] v = this.unidg.generateUniform(length, Max - Min); + for (int k = 0; k < v.length; ++k) + array[k + offset] = Min + v[k]; + } + + void fillClustered(long[] array, int offset, int length, long Min, long Max) { + final long range = Max - Min; + if ((range == length) || (length <= 10)) { + fillUniform(array, offset, length, Min, Max); + return; + } + final long cut = length + / 2 + + ((range - length - 1 > 0) ? (long)this.unidg.rand + .nextDouble() * (range - length - 1) : 0); + final double p = this.unidg.rand.nextDouble(); + if (p < 0.25) { + fillUniform(array, offset, length / 2, Min, Min + cut); + fillClustered(array, offset + length / 2, length + - length / 2, Min + cut, Max); + } else if (p < 0.5) { + fillClustered(array, offset, length / 2, Min, Min + cut); + fillUniform(array, offset + length / 2, length - length + / 2, Min + cut, Max); + } else { + fillClustered(array, offset, length / 2, Min, Min + cut); + fillClustered(array, offset + length / 2, length + - length / 2, Min + cut, Max); + } + } + + /** + * generates randomly N distinct integers from 0 to Max. + * + * @param N + * number of integers to generate + * @param Max + * maximal value of the integers + * @return array containing the integers + */ + public long[] generateClustered(int N, long Max) { + long[] array = new long[N]; + fillClustered(array, 0, N, 0, Max); + return array; + } + + /** + * Little test program. + * + * @param args + * arguments are ignored + */ + public static void main(final String[] args) { + long[] example = (new LongClusteredDataGenerator()) + .generateClustered(20, 1000); + for (int k = 0; k < example.length; ++k) + System.out.println(example[k]); + } + +} diff --git a/src/test/java/me/lemire/longcompression/synth/LongUniformDataGenerator.java b/src/test/java/me/lemire/longcompression/synth/LongUniformDataGenerator.java new file mode 100644 index 0000000..4d435f2 --- /dev/null +++ b/src/test/java/me/lemire/longcompression/synth/LongUniformDataGenerator.java @@ -0,0 +1,125 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ +package me.lemire.longcompression.synth; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Random; +import java.util.Set; + +import org.roaringbitmap.longlong.Roaring64Bitmap; + +import me.lemire.integercompression.synth.UniformDataGenerator; + +/** + * This class will generate "uniform" lists of random longs. + * + * @author Benoit Lacelle + * @see UniformDataGenerator + */ +public class LongUniformDataGenerator { + /** + * construct generator of random arrays. + */ + public LongUniformDataGenerator() { + this.rand = new Random(); + } + + /** + * @param seed + * random seed + */ + public LongUniformDataGenerator(final int seed) { + this.rand = new Random(seed); + } + + /** + * generates randomly N distinct longs from 0 to Max. + */ + long[] generateUniformHash(int N, long Max) { + if (N > Max) + throw new RuntimeException("not possible"); + long[] ans = new long[N]; + Set s = new HashSet<>(); + while (s.size() < N) + s.add((long) (this.rand.nextDouble() * Max)); + Iterator i = s.iterator(); + for (int k = 0; k < N; ++k) + ans[k] = i.next().longValue(); + Arrays.sort(ans); + return ans; + } + + /** + * output all longs from the range [0,Max) that are not in the array + */ + static long[] negate(long[] x, long Max) { + int newLength = saturatedCast(Max - x.length); + long[] ans = new long[newLength]; + int i = 0; + int c = 0; + for (int j = 0; j < x.length; ++j) { + long v = x[j]; + for (; i < v; ++i) + ans[c++] = i; + ++i; + } + while (c < ans.length) + ans[c++] = i++; + return ans; + } + + private static int saturatedCast(long toInt) { + if (toInt > Integer.MAX_VALUE) { + return Integer.MAX_VALUE; + } else { + return (int) toInt; + } + } + + /** + * generates randomly N distinct longs from 0 to Max. + * + * @param N + * number of longs to generate + * @param Max + * bound on the value of longs + * @return an array containing randomly selected longs + */ + public long[] generateUniform(int N, long Max) { + assert N >= 0; + assert Max >= 0; + if (N * 2 > Max) { + return negate(generateUniform(saturatedCast(Max - N), Max), Max); + } + if (2048 * N > Max) + return generateUniformBitmap(N, Max); + return generateUniformHash(N, Max); + } + + /** + * generates randomly N distinct longs from 0 to Max. + */ + long[] generateUniformBitmap(int N, long Max) { + if (N > Max) + throw new RuntimeException("not possible"); + Roaring64Bitmap bs = new Roaring64Bitmap(); + int cardinality = 0; + while (cardinality < N) { + long v = (long) (rand.nextDouble() * Max); + if (!bs.contains(v)) { + bs.add(v); + cardinality++; + } + } + return bs.toArray(); + } + + Random rand = new Random(); + +} \ No newline at end of file From b40c7e623e2889462e1a974453d3564ef389b406 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 28 Nov 2022 11:24:54 -0500 Subject: [PATCH 312/412] Cleaning. --- src/main/java/me/lemire/longcompression/LongVariableByte.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/me/lemire/longcompression/LongVariableByte.java b/src/main/java/me/lemire/longcompression/LongVariableByte.java index 478db20..f3d10ee 100644 --- a/src/main/java/me/lemire/longcompression/LongVariableByte.java +++ b/src/main/java/me/lemire/longcompression/LongVariableByte.java @@ -46,7 +46,6 @@ public void headlessCompress(long[] in, IntWrapper inpos, int inlength, long[] o buf.order(ByteOrder.LITTLE_ENDIAN); for (int k = inpos.get(); k < inpos.get() + inlength; ++k) { final long val = in[k]; - // System.out.println(LongUtil.longToBinaryWithLeading(val)); if (val >= 0 && val < (1 << 7)) { buf.put((byte) (val | (1 << 7))); } else if (val >= 0 && val < (1 << 14)) { @@ -187,7 +186,6 @@ public void compress(long[] in, IntWrapper inpos, int inlength, byte[] out, out[outpostmp++] = (byte) extract7bits(7, val); out[outpostmp++] = (byte) (extract7bitsmaskless(8, (val)) | (1 << 7)); } else { - // System.out.println(LongUtil.longToBinaryWithLeading(val)); out[outpostmp++] = (byte) extract7bits(0, val); out[outpostmp++] = (byte) extract7bits(1, val); out[outpostmp++] = (byte) extract7bits(2, val); @@ -214,7 +212,6 @@ public void uncompress(long[] in, IntWrapper inpos, int inlength, long[] out, int tmpoutpos = outpos.get(); for (long v = 0, shift = 0; p < finalp;) { val = in[p]; - // System.out.println(LongUtil.longToBinaryWithLeading(val)); long c = (byte) (val >>> s); // Shift to next byte s += 8; @@ -309,7 +306,6 @@ public void headlessUncompress(long[] in, IntWrapper inpos, int inlength, long[] int finaloutpos = num + tmpoutpos; for (long v = 0, shift = 0; tmpoutpos < finaloutpos;) { val = in[p]; - // System.out.println(longToBinaryWithLeading(val)); long c = val >>> s; // Shift to next byte s += 8; From 324c2823eff1bcd3c013c5ebc89fa143a2274a12 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 28 Nov 2022 11:27:08 -0500 Subject: [PATCH 313/412] Reverted random -> head --- src/main/java/me/lemire/longcompression/SkippableLongCODEC.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/me/lemire/longcompression/SkippableLongCODEC.java b/src/main/java/me/lemire/longcompression/SkippableLongCODEC.java index e3e7b84..c55a9ef 100644 --- a/src/main/java/me/lemire/longcompression/SkippableLongCODEC.java +++ b/src/main/java/me/lemire/longcompression/SkippableLongCODEC.java @@ -11,7 +11,7 @@ /** * Interface describing a standard CODEC to compress longs. This is a - * variation on the LongCODEC interface meant to be used for head access. + * variation on the LongCODEC interface meant to be used for random access. * * The main difference is that we must specify the number of longs we wish to * decode. This information should be stored elsewhere. From e2a90c6bc73d3f0dcd66a3a3d13f57c54607789b Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 28 Nov 2022 12:58:46 -0500 Subject: [PATCH 314/412] Minor fixes. --- .../me/lemire/integercompression/SkippableIntegerCODEC.java | 2 +- .../integercompression/benchmarktools/BenchmarkSkippable.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/SkippableIntegerCODEC.java b/src/main/java/me/lemire/integercompression/SkippableIntegerCODEC.java index 4568d71..719d9d5 100644 --- a/src/main/java/me/lemire/integercompression/SkippableIntegerCODEC.java +++ b/src/main/java/me/lemire/integercompression/SkippableIntegerCODEC.java @@ -10,7 +10,7 @@ /** * Interface describing a standard CODEC to compress integers. This is a - * variation on the IntegerCODEC interface meant to be used for head access. + * variation on the IntegerCODEC interface meant to be used for random access. * * The main difference is that we must specify the number of integers we wish to * decode. This information should be stored elsewhere. diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java index 58bbc4a..363b841 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java @@ -83,7 +83,6 @@ private static int decompressFromSkipTable(Object c, int[] compressed, if (num > length - uncomppos.get()) num = length - uncomppos.get(); int location = metadata[metapos++]; - // System.out.println("location = "+location); int initvalue = metadata[metapos++]; int outputlocation = uncomppos.get(); if (location != compressedpos.get()) From 7dc74015890b580bb5004686920be43543542c4f Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 28 Nov 2022 12:59:39 -0500 Subject: [PATCH 315/412] Removing spurious "we". --- example.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example.java b/example.java index 817e94f..71ccd63 100644 --- a/example.java +++ b/example.java @@ -117,7 +117,7 @@ public static void basicExampleHeadless() { */ IntWrapper inputoffset = new IntWrapper(0); IntWrapper outputoffset = new IntWrapper(1); - compressed[0] = data.length; // we manually store how many integers we + compressed[0] = data.length; // we manually store how many integers codec.headlessCompress(data, inputoffset, data.length, compressed, outputoffset, new IntWrapper(0)); // got it! // inputoffset should be at data.length but outputoffset tells From 1e48bd09f32d5cb65e42be90e47c99d731b4cfb3 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 28 Nov 2022 13:24:22 -0500 Subject: [PATCH 316/412] Extending the 'random access' documentation. --- .../me/lemire/integercompression/SkippableIntegerCODEC.java | 3 ++- .../java/me/lemire/longcompression/SkippableLongCODEC.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/SkippableIntegerCODEC.java b/src/main/java/me/lemire/integercompression/SkippableIntegerCODEC.java index 719d9d5..8b4dd8b 100644 --- a/src/main/java/me/lemire/integercompression/SkippableIntegerCODEC.java +++ b/src/main/java/me/lemire/integercompression/SkippableIntegerCODEC.java @@ -10,7 +10,8 @@ /** * Interface describing a standard CODEC to compress integers. This is a - * variation on the IntegerCODEC interface meant to be used for random access. + * variation on the IntegerCODEC interface meant to be used for random access + * (i.e., given a large array, you can segment it and decode just the subarray you need). * * The main difference is that we must specify the number of integers we wish to * decode. This information should be stored elsewhere. diff --git a/src/main/java/me/lemire/longcompression/SkippableLongCODEC.java b/src/main/java/me/lemire/longcompression/SkippableLongCODEC.java index c55a9ef..984914f 100644 --- a/src/main/java/me/lemire/longcompression/SkippableLongCODEC.java +++ b/src/main/java/me/lemire/longcompression/SkippableLongCODEC.java @@ -11,7 +11,8 @@ /** * Interface describing a standard CODEC to compress longs. This is a - * variation on the LongCODEC interface meant to be used for random access. + * variation on the LongCODEC interface meant to be used for random access + * (i.e., given a large array, you can segment it and decode just the subarray you need). * * The main difference is that we must specify the number of longs we wish to * decode. This information should be stored elsewhere. From 5b86fe74fd62b7b3f8911cb309d6252da58b932e Mon Sep 17 00:00:00 2001 From: Benoit Lacelle Date: Mon, 28 Nov 2022 22:56:07 +0400 Subject: [PATCH 317/412] Introduce LongBinaryPacking --- .../lemire/integercompression/BitPacking.java | 4 +- .../DeltaZigzagVariableByte.java | 3 + .../lemire/integercompression/FastPFOR.java | 3 + .../integercompression/FastPFOR128.java | 3 + .../integercompression/IntCompressor.java | 4 +- .../integercompression/IntegerCODEC.java | 4 +- .../SkippableIntegerCODEC.java | 6 +- .../integercompression/VariableByte.java | 7 +- .../longcompression/LongBinaryPacking.java | 143 +++++++++++++++++ .../longcompression/LongBitPacking.java | 146 ++++++++++++++++++ .../me/lemire/longcompression/LongCODEC.java | 6 +- .../longcompression/LongCompressor.java | 76 +++++++++ .../me/lemire/longcompression/LongUtil.java | 30 ++++ .../longcompression/LongVariableByte.java | 4 +- .../longcompression/RoaringIntPacking.java | 62 -------- .../longcompression/SkippableLongCODEC.java | 6 +- .../longcompression/ATestLongCODEC.java | 96 ++++++++++++ .../lemire/longcompression/LongBasicTest.java | 33 ++-- .../SkippableLongBasicTest.java | 3 +- .../longcompression/TestLongAs2IntsCodec.java | 83 +--------- .../TestLongBinaryPacking.java | 26 ++++ .../longcompression/TestLongVariableByte.java | 81 +--------- 22 files changed, 575 insertions(+), 254 deletions(-) create mode 100644 src/main/java/me/lemire/longcompression/LongBinaryPacking.java create mode 100644 src/main/java/me/lemire/longcompression/LongBitPacking.java create mode 100644 src/main/java/me/lemire/longcompression/LongCompressor.java create mode 100644 src/test/java/me/lemire/longcompression/ATestLongCODEC.java create mode 100644 src/test/java/me/lemire/longcompression/TestLongBinaryPacking.java diff --git a/src/main/java/me/lemire/integercompression/BitPacking.java b/src/main/java/me/lemire/integercompression/BitPacking.java index e83c9e0..8652be4 100644 --- a/src/main/java/me/lemire/integercompression/BitPacking.java +++ b/src/main/java/me/lemire/integercompression/BitPacking.java @@ -1690,7 +1690,7 @@ protected static void fastpack9(final int[] in, int inpos, } /** - * Unpack 32 integers + * Pack without mask 32 integers * * @param in * source array @@ -3005,7 +3005,7 @@ protected static void fastpackwithoutmask9(final int[] in, int inpos, } /** - * Pack the 32 integers + * Unpack the 32 integers * * @param in * source array diff --git a/src/main/java/me/lemire/integercompression/DeltaZigzagVariableByte.java b/src/main/java/me/lemire/integercompression/DeltaZigzagVariableByte.java index ca9d0ad..2f8c709 100644 --- a/src/main/java/me/lemire/integercompression/DeltaZigzagVariableByte.java +++ b/src/main/java/me/lemire/integercompression/DeltaZigzagVariableByte.java @@ -134,6 +134,9 @@ public void uncompress(int[] inBuf, IntWrapper inPos, int inLen, * In case you need a different way to allocate buffers, you can override this method * with a custom behavior. The default implementation allocates a new Java direct * {@link ByteBuffer} on each invocation. + * + * @param sizeInBytes + * @return */ protected ByteBuffer makeBuffer(int sizeInBytes) { return ByteBuffer.allocateDirect(sizeInBytes); diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 36226c0..47969f4 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -336,6 +336,9 @@ public String toString() { * In case you need a different way to allocate buffers, you can override this method * with a custom behavior. The default implementation allocates a new Java direct * {@link ByteBuffer} on each invocation. + * + * @param sizeInBytes + * @return */ protected ByteBuffer makeBuffer(int sizeInBytes) { return ByteBuffer.allocateDirect(sizeInBytes); diff --git a/src/main/java/me/lemire/integercompression/FastPFOR128.java b/src/main/java/me/lemire/integercompression/FastPFOR128.java index b124072..83a3e1f 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR128.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR128.java @@ -317,6 +317,9 @@ public String toString() { * In case you need a different way to allocate buffers, you can override this method * with a custom behavior. The default implementation allocates a new Java direct * {@link ByteBuffer} on each invocation. + * + * @param sizeInBytes + * @return */ protected ByteBuffer makeBuffer(int sizeInBytes) { return ByteBuffer.allocateDirect(sizeInBytes); diff --git a/src/main/java/me/lemire/integercompression/IntCompressor.java b/src/main/java/me/lemire/integercompression/IntCompressor.java index 87e7bde..abaeea9 100644 --- a/src/main/java/me/lemire/integercompression/IntCompressor.java +++ b/src/main/java/me/lemire/integercompression/IntCompressor.java @@ -36,7 +36,8 @@ public IntCompressor() { * @throws UncompressibleInputException if the data is too poorly compressible */ public int[] compress(int[] input) { - int [] compressed = new int[input.length + input.length / 100 + 1024]; + int[] compressed = new int[input.length + input.length / 100 + 1024]; + // Store at index=0 the length of the input, hence enabling .headlessCompress compressed[0] = input.length; IntWrapper outpos = new IntWrapper(1); try { @@ -58,6 +59,7 @@ public int[] compress(int[] input) { * @return uncompressed array */ public int[] uncompress(int[] compressed) { + // Read at index=0 the length of the input, hence enabling .headlessUncompress int[] decompressed = new int[compressed[0]]; IntWrapper inpos = new IntWrapper(1); codec.headlessUncompress(compressed, inpos, diff --git a/src/main/java/me/lemire/integercompression/IntegerCODEC.java b/src/main/java/me/lemire/integercompression/IntegerCODEC.java index f2c9c7a..1dd9a4c 100644 --- a/src/main/java/me/lemire/integercompression/IntegerCODEC.java +++ b/src/main/java/me/lemire/integercompression/IntegerCODEC.java @@ -25,7 +25,7 @@ public interface IntegerCODEC { * @param in * input array * @param inpos - * location in the input array + * where to start reading in the array * @param inlength * how many integers to compress * @param out @@ -52,7 +52,7 @@ public void compress(int[] in, IntWrapper inpos, int inlength, * @param out * array where to write the compressed output * @param outpos - * where to write the compressed output in out + * where to start writing the uncompressed output in out */ public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos); diff --git a/src/main/java/me/lemire/integercompression/SkippableIntegerCODEC.java b/src/main/java/me/lemire/integercompression/SkippableIntegerCODEC.java index 4568d71..0b6e825 100644 --- a/src/main/java/me/lemire/integercompression/SkippableIntegerCODEC.java +++ b/src/main/java/me/lemire/integercompression/SkippableIntegerCODEC.java @@ -32,7 +32,7 @@ public interface SkippableIntegerCODEC { * @param in * input array * @param inpos - * location in the input array + * where to start reading in the array * @param inlength * how many integers to compress * @param out @@ -56,9 +56,9 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out * @param inlength * length of the compressed data (ignored by some schemes) * @param out - * array where to write the compressed output + * array where to write the uncompressed output * @param outpos - * where to write the compressed output in out + * where to start writing the uncompressed output in out * @param num * number of integers we want to decode, the actual number of integers decoded can be less */ diff --git a/src/main/java/me/lemire/integercompression/VariableByte.java b/src/main/java/me/lemire/integercompression/VariableByte.java index 09e479b..1e28537 100644 --- a/src/main/java/me/lemire/integercompression/VariableByte.java +++ b/src/main/java/me/lemire/integercompression/VariableByte.java @@ -126,7 +126,7 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, s += 8; // Shift to next integer if s==32 p += s>>5; - // cycle from 31 to 0 + // cycle from 32 to 0 s = s & 31; v += ((c & 127) << shift); if ((c & 128) == 128) { @@ -194,7 +194,7 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] o s += 8; // Shift to next integer if s==32 p += s>>5; - // cycle from 31 to 0 + // cycle from 32 to 0 s = s & 31; v += ((c & 127) << shift); if ((c & 128) == 128) { @@ -214,6 +214,9 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] o * In case you need a different way to allocate buffers, you can override this method * with a custom behavior. The default implementation allocates a new Java direct * {@link ByteBuffer} on each invocation. + * + * @param sizeInBytes + * @return */ protected ByteBuffer makeBuffer(int sizeInBytes) { return ByteBuffer.allocateDirect(sizeInBytes); diff --git a/src/main/java/me/lemire/longcompression/LongBinaryPacking.java b/src/main/java/me/lemire/longcompression/LongBinaryPacking.java new file mode 100644 index 0000000..dba5cbc --- /dev/null +++ b/src/main/java/me/lemire/longcompression/LongBinaryPacking.java @@ -0,0 +1,143 @@ +package me.lemire.longcompression; + +import me.lemire.integercompression.BinaryPacking; +import me.lemire.integercompression.IntWrapper; +import me.lemire.integercompression.Util; + +/** + * Scheme based on a commonly used idea: can be extremely fast. + * It encodes integers in blocks of 64 longs. For arrays containing + * an arbitrary number of longs, you should use it in conjunction + * with another CODEC: + * + *
    LongCODEC ic = 
    + *  new Composition(new LongBinaryPacking(), new LongVariableByte()).
    + * + * Note that this does not use differential coding: if you are working on sorted + * lists, you must compute the deltas separately. + * + *

    + * For details, please see {@link BinaryPacking} + *

    + * + * @author Benoit Lacelle + */ +public final class LongBinaryPacking implements LongCODEC, SkippableLongCODEC { + final static int BLOCK_SIZE = 64; + + @Override + public void compress(long[] in, IntWrapper inpos, int inlength, + long[] out, IntWrapper outpos) { + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); + if (inlength == 0) + return; + out[outpos.get()] = inlength; + outpos.increment(); + headlessCompress(in, inpos, inlength, out, outpos); + } + + @Override + public void headlessCompress(long[] in, IntWrapper inpos, int inlength, + long[] out, IntWrapper outpos) { + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); + int tmpoutpos = outpos.get(); + int s = inpos.get(); + // Compress by block of 8 * 64 longs as much as possible + for (; s + BLOCK_SIZE * 8 - 1 < inpos.get() + inlength; s += BLOCK_SIZE * 8) { + // maxbits can be anything between 0 and 64 included: expressed within a byte (1 << 6) + final long mbits1 = LongUtil.maxbits(in, s + 0 * BLOCK_SIZE, BLOCK_SIZE); + final long mbits2 = LongUtil.maxbits(in, s + 1 * BLOCK_SIZE, BLOCK_SIZE); + final long mbits3 = LongUtil.maxbits(in, s + 2 * BLOCK_SIZE, BLOCK_SIZE); + final long mbits4 = LongUtil.maxbits(in, s + 3 * BLOCK_SIZE, BLOCK_SIZE); + final long mbits5 = LongUtil.maxbits(in, s + 4 * BLOCK_SIZE, BLOCK_SIZE); + final long mbits6 = LongUtil.maxbits(in, s + 5 * BLOCK_SIZE, BLOCK_SIZE); + final long mbits7 = LongUtil.maxbits(in, s + 6 * BLOCK_SIZE, BLOCK_SIZE); + final long mbits8 = LongUtil.maxbits(in, s + 7 * BLOCK_SIZE, BLOCK_SIZE); + // The first long expressed the maxbits for the 8 buckets + out[tmpoutpos++] = (mbits1 << 56) | (mbits2 << 48) | (mbits3 << 40) | (mbits4 << 32) | (mbits5 << 24) | (mbits6 << 16) | (mbits7 << 8) | (mbits8); + LongBitPacking.fastpackwithoutmask(in, s + 0 * BLOCK_SIZE, out, tmpoutpos, (int) mbits1); + tmpoutpos += mbits1; + LongBitPacking.fastpackwithoutmask(in, s + 1 * BLOCK_SIZE, out, tmpoutpos, (int) mbits2); + tmpoutpos += mbits2; + LongBitPacking.fastpackwithoutmask(in, s + 2 * BLOCK_SIZE, out, tmpoutpos, (int) mbits3); + tmpoutpos += mbits3; + LongBitPacking.fastpackwithoutmask(in, s + 3 * BLOCK_SIZE, out, tmpoutpos, (int) mbits4); + tmpoutpos += mbits4; + LongBitPacking.fastpackwithoutmask(in, s + 4 * BLOCK_SIZE, out, tmpoutpos, (int) mbits5); + tmpoutpos += mbits5; + LongBitPacking.fastpackwithoutmask(in, s + 5 * BLOCK_SIZE, out, tmpoutpos, (int) mbits6); + tmpoutpos += mbits6; + LongBitPacking.fastpackwithoutmask(in, s + 6 * BLOCK_SIZE, out, tmpoutpos, (int) mbits7); + tmpoutpos += mbits7; + LongBitPacking.fastpackwithoutmask(in, s + 7 * BLOCK_SIZE, out, tmpoutpos, (int) mbits8); + tmpoutpos += mbits8; + } + // Then we compress up to 7 blocks of 64 longs + for (; s < inpos.get() + inlength; s += BLOCK_SIZE ) { + final int mbits = LongUtil.maxbits(in, s, BLOCK_SIZE); + out[tmpoutpos++] = mbits; + LongBitPacking.fastpackwithoutmask(in, s, out, tmpoutpos, mbits); + tmpoutpos += mbits; + } + inpos.add(inlength); + outpos.set(tmpoutpos); + } + + @Override + public void uncompress(long[] in, IntWrapper inpos, int inlength, + long[] out, IntWrapper outpos) { + if (inlength == 0) + return; + final int outlength = (int) in[inpos.get()]; + inpos.increment(); + headlessUncompress(in,inpos, inlength,out,outpos,outlength); + } + + @Override + public void headlessUncompress(long[] in, IntWrapper inpos, int inlength, + long[] out, IntWrapper outpos, int num) { + final int outlength = Util.greatestMultiple(num, BLOCK_SIZE); + int tmpinpos = inpos.get(); + int s = outpos.get(); + for (; s + BLOCK_SIZE * 8 - 1 < outpos.get() + outlength; s += BLOCK_SIZE * 8) { + final long mbits1 = (in[tmpinpos] >>> 56); + final long mbits2 = (in[tmpinpos] >>> 48) & 0xFF; + final long mbits3 = (in[tmpinpos] >>> 40) & 0xFF; + final long mbits4 = (in[tmpinpos] >>> 32) & 0xFF; + final long mbits5 = (in[tmpinpos] >>> 24) & 0xFF; + final long mbits6 = (in[tmpinpos] >>> 16) & 0xFF; + final long mbits7 = (in[tmpinpos] >>> 8) & 0xFF; + final long mbits8 = (in[tmpinpos]) & 0xFF; + ++tmpinpos; + LongBitPacking.fastunpack(in, tmpinpos, out, s + 0 * BLOCK_SIZE, (int) mbits1); + tmpinpos += mbits1; + LongBitPacking.fastunpack(in, tmpinpos, out, s + 1 * BLOCK_SIZE, (int) mbits2); + tmpinpos += mbits2; + LongBitPacking.fastunpack(in, tmpinpos, out, s + 2 * BLOCK_SIZE, (int) mbits3); + tmpinpos += mbits3; + LongBitPacking.fastunpack(in, tmpinpos, out, s + 3 * BLOCK_SIZE, (int) mbits4); + tmpinpos += mbits4; + LongBitPacking.fastunpack(in, tmpinpos, out, s + 4 * BLOCK_SIZE, (int) mbits5); + tmpinpos += mbits5; + LongBitPacking.fastunpack(in, tmpinpos, out, s + 5 * BLOCK_SIZE, (int) mbits6); + tmpinpos += mbits6; + LongBitPacking.fastunpack(in, tmpinpos, out, s + 6 * BLOCK_SIZE, (int) mbits7); + tmpinpos += mbits7; + LongBitPacking.fastunpack(in, tmpinpos, out, s + 7 * BLOCK_SIZE, (int) mbits8); + tmpinpos += mbits8; + } + for (; s < outpos.get() + outlength; s += BLOCK_SIZE ) { + final int mbits = (int) in[tmpinpos]; + ++tmpinpos; + LongBitPacking.fastunpack(in, tmpinpos, out, s, mbits); + tmpinpos += mbits; + } + outpos.add(outlength); + inpos.set(tmpinpos); + } + + @Override + public String toString() { + return this.getClass().getSimpleName(); + } +} diff --git a/src/main/java/me/lemire/longcompression/LongBitPacking.java b/src/main/java/me/lemire/longcompression/LongBitPacking.java new file mode 100644 index 0000000..7da1c7f --- /dev/null +++ b/src/main/java/me/lemire/longcompression/LongBitPacking.java @@ -0,0 +1,146 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + +package me.lemire.longcompression; + +import java.util.Arrays; + +/** + * Bitpacking routines + * + *

    For details, please see

    + *

    + * Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second + * through vectorization Software: Practice & Experience + * http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract + * http://arxiv.org/abs/1209.2137 + *

    + * + * @author Benoit Lacelle + * + */ +public final class LongBitPacking { + + /** + * Pack 64 longs + * + * @param in + * source array + * @param inpos + * position in source array + * @param out + * output array + * @param outpos + * position in output array + * @param bit + * number of bits to use per long + */ + public static void fastpackwithoutmask(final long[] in, final int inpos, + final long[] out, final int outpos, final int bit) { + if (bit == 0) { + fastpackwithoutmask0(in, inpos, out, outpos); + } else if (bit == 64) { + fastpackwithoutmask64(in, inpos, out, outpos); + } else if (bit > 0 && bit < 64) { + slowpackwithoutmask(in, inpos, out, outpos, bit); + } else { + throw new IllegalArgumentException("Unsupported bit width: " + bit); + } + } + + protected static void fastpackwithoutmask0(final long[] in, int inpos, + final long[] out, int outpos) { + // nothing + } + + protected static void fastpackwithoutmask64(final long[] in, int inpos, + final long[] out, int outpos) { + System.arraycopy(in, inpos, out, outpos, 64); + } + + protected static void slowpackwithoutmask(final long[] in, int inpos, + final long[] out, int outpos, final int bit) { + int bucket = 0; + int shift = 0; + + out[outpos + bucket] = 0L; + for (int i = 0 ; i < 64 ; i++) { + if (shift >= 64) { + bucket++; + out[bucket + outpos] = 0L; + shift -= 64; + + if (shift > 0) { + // There is some leftovers from previous input in the next bucket + out[outpos + bucket] |= in[inpos + i - 1] >> (bit - shift); + } + } + out[outpos + bucket] |= in[inpos + i] << shift; + + shift += bit; + } + } + + + /** + * Unpack the 64 longs + * + * @param in + * source array + * @param inpos + * starting point in the source array + * @param out + * output array + * @param outpos + * starting point in the output array + * @param bit + * how many bits to use per integer + */ + public static void fastunpack(final long[] in, final int inpos, + final long[] out, final int outpos, final int bit) { + if (bit == 0) { + fastunpack0(in, inpos, out, outpos); + } else if (bit == 64) { + fastunpack64(in, inpos, out, outpos); + } else if (bit > 0 && bit < 64) { + slowunpack(in, inpos, out, outpos, bit); + } else { + throw new IllegalArgumentException("Unsupported bit width: " + bit); + } + } + + + protected static void fastunpack0(final long[] in, int inpos, + final long[] out, int outpos) { + Arrays.fill(out, outpos, outpos + 64, 0); + } + + protected static void fastunpack64(final long[] in, int inpos, + final long[] out, int outpos) { + System.arraycopy(in, inpos, out, outpos, 64); + } + + protected static void slowunpack(final long[] in, int inpos, + final long[] out, int outpos, final int bit) { + int bucket = 0; + int shift = 0; + for (int i = 0 ; i < 64 ; i++) { + if (shift >= 64) { + bucket++; + shift -= 64; + + if (shift > 0) { + // There is some leftovers from previous input in the next bucket + out[outpos + i - 1] |= (in[inpos + bucket] << (bit - shift) & ((1L << bit) - 1)); + } + } + out[outpos + i] = ((in[inpos + bucket] >>> shift) & ((1L << bit) - 1)); + + shift += bit; + } + } +} diff --git a/src/main/java/me/lemire/longcompression/LongCODEC.java b/src/main/java/me/lemire/longcompression/LongCODEC.java index c0f67b2..1068f9f 100644 --- a/src/main/java/me/lemire/longcompression/LongCODEC.java +++ b/src/main/java/me/lemire/longcompression/LongCODEC.java @@ -27,7 +27,7 @@ public interface LongCODEC { * @param in * input array * @param inpos - * location in the input array + * where to start reading in the array * @param inlength * how many longs to compress * @param out @@ -52,9 +52,9 @@ public void compress(long[] in, IntWrapper inpos, int inlength, * length of the compressed data (ignored by some * schemes) * @param out - * array where to write the compressed output + * array where to write the uncompressed output * @param outpos - * where to write the compressed output in out + * where to start writing the uncompressed output in out */ public void uncompress(long[] in, IntWrapper inpos, int inlength, long[] out, IntWrapper outpos); diff --git a/src/main/java/me/lemire/longcompression/LongCompressor.java b/src/main/java/me/lemire/longcompression/LongCompressor.java new file mode 100644 index 0000000..a140911 --- /dev/null +++ b/src/main/java/me/lemire/longcompression/LongCompressor.java @@ -0,0 +1,76 @@ +package me.lemire.longcompression; + +import java.util.Arrays; + +import me.lemire.integercompression.IntWrapper; +import me.lemire.integercompression.UncompressibleInputException; + +/** + * This is a convenience class that wraps a codec to provide + * a "friendly" API. + * + * @author Benoit Lacelle + */ +public class LongCompressor { + + + SkippableLongCODEC codec; + /** + * Constructor wrapping a codec. + * + * @param c the underlying codec + */ + public LongCompressor(SkippableLongCODEC c) { + codec = c; + } + + /** + * Constructor with default codec. + */ + public LongCompressor() { + codec = new SkippableLongComposition(new LongBinaryPacking(), + new LongVariableByte()); + } + + /** + * Compress an array and returns the compressed result as a new array. + * + * @param input array to be compressed + * @return compressed array + * @throws UncompressibleInputException if the data is too poorly compressible + */ + public long[] compress(long[] input) { + long[] compressed = new long[input.length + input.length / 100 + 1024]; + // Store at index=0 the length of the input, hence enabling .headlessCompress + compressed[0] = input.length; + IntWrapper outpos = new IntWrapper(1); + try { + codec.headlessCompress(input, new IntWrapper(0), + input.length, compressed, outpos); + } catch (IndexOutOfBoundsException ioebe) { + throw new + UncompressibleInputException("Your input is too poorly compressible " + + "with the current codec : "+codec); + } + compressed = Arrays.copyOf(compressed,outpos.intValue()); + return compressed; + } + + /** + * Uncompress an array and returns the uncompressed result as a new array. + * + * @param compressed compressed array + * @return uncompressed array + */ + public long[] uncompress(long[] compressed) { + // Read at index=0 the length of the input, hence enabling .headlessUncompress + long[] decompressed = new long[(int) compressed[0]]; + IntWrapper inpos = new IntWrapper(1); + codec.headlessUncompress(compressed, inpos, + compressed.length - inpos.intValue(), + decompressed, new IntWrapper(0), + decompressed.length); + return decompressed; + } + +} diff --git a/src/main/java/me/lemire/longcompression/LongUtil.java b/src/main/java/me/lemire/longcompression/LongUtil.java index c06433f..596a134 100644 --- a/src/main/java/me/lemire/longcompression/LongUtil.java +++ b/src/main/java/me/lemire/longcompression/LongUtil.java @@ -15,7 +15,37 @@ */ @Deprecated public class LongUtil { + + /** + * Compute the maximum of the integer logarithms (ceil(log(x+1)) of a range + * of value + * + * @param i + * source array + * @param pos + * starting position + * @param length + * number of integers to consider + * @return integer logarithm + */ + public static int maxbits(long[] i, int pos, int length) { + long mask = 0; + for (int k = pos; k < pos + length; ++k) + mask |= i[k]; + return bits(mask); + } + /** + * Compute the integer logarithms (ceil(log(x+1)) of a value + * + * @param i + * source value + * @return integer logarithm + */ + public static int bits(long i) { + return 64 - Long.numberOfLeadingZeros(i); + } + protected static String longToBinaryWithLeading(long l) { return String.format("%64s", Long.toBinaryString(l)).replace(' ', '0'); } diff --git a/src/main/java/me/lemire/longcompression/LongVariableByte.java b/src/main/java/me/lemire/longcompression/LongVariableByte.java index 478db20..d31967a 100644 --- a/src/main/java/me/lemire/longcompression/LongVariableByte.java +++ b/src/main/java/me/lemire/longcompression/LongVariableByte.java @@ -220,7 +220,7 @@ public void uncompress(long[] in, IntWrapper inpos, int inlength, long[] out, s += 8; // Shift to next long if s==64 p += s>>6; - // cycle from 63 to 0 + // Cycle from 64 to 0 s = s & 63; v += ((c & 127) << shift); if ((c & 128) == 128) { @@ -315,7 +315,7 @@ public void headlessUncompress(long[] in, IntWrapper inpos, int inlength, long[] s += 8; // Shift to next long if s == 64 p += s>>6; - // cycle from 63 to 0 + // Cycle from 64 to 0 s = s & 63; v += ((c & 127) << shift); if ((c & 128) == 128) { diff --git a/src/main/java/me/lemire/longcompression/RoaringIntPacking.java b/src/main/java/me/lemire/longcompression/RoaringIntPacking.java index f109ab3..d6b6baa 100644 --- a/src/main/java/me/lemire/longcompression/RoaringIntPacking.java +++ b/src/main/java/me/lemire/longcompression/RoaringIntPacking.java @@ -3,9 +3,6 @@ */ package me.lemire.longcompression; -import java.math.BigInteger; -import java.util.Comparator; - /** * Used to hold the logic packing 2 integers in a long, and separating a long in two integers. It is * useful in {@link Roaring64NavigableMap} as the implementation split the input long in two @@ -46,63 +43,4 @@ public static int low(long id) { public static long pack(int high, int low) { return (((long) high) << 32) | (low & 0xffffffffL); } - - - /** - * - * @param signedLongs true if long put in a {@link Roaring64NavigableMap} should be considered as - * signed long. - * @return the int representing the highest value which can be set as high value in a - * {@link Roaring64NavigableMap} - */ - public static int highestHigh(boolean signedLongs) { - if (signedLongs) { - return Integer.MAX_VALUE; - } else { - return -1; - } - } - - /** - * @return A comparator for unsigned longs: a negative long is a long greater than Long.MAX_VALUE - */ - public static Comparator unsignedComparator() { - return new Comparator() { - - @Override - public int compare(Integer o1, Integer o2) { - return compareUnsigned(o1, o2); - } - }; - } - - /** - * Compares two {@code int} values numerically treating the values as unsigned. - * - * @param x the first {@code int} to compare - * @param y the second {@code int} to compare - * @return the value {@code 0} if {@code x == y}; a value less than {@code 0} if {@code x < y} as - * unsigned values; and a value greater than {@code 0} if {@code x > y} as unsigned values - * @since 1.8 - */ - // Duplicated from jdk8 Integer.compareUnsigned - public static int compareUnsigned(int x, int y) { - return Integer.compare(x + Integer.MIN_VALUE, y + Integer.MIN_VALUE); - } - - /** the constant 2^64 */ - private static final BigInteger TWO_64 = BigInteger.ONE.shiftLeft(64); - - /** - * JDK8 Long.toUnsignedString was too complex to backport. Go for a slow version relying on - * BigInteger - */ - // https://stackoverflow.com/questions/7031198/java-signed-long-to-unsigned-long-string - static String toUnsignedString(long l) { - BigInteger b = BigInteger.valueOf(l); - if (b.signum() < 0) { - b = b.add(TWO_64); - } - return b.toString(); - } } diff --git a/src/main/java/me/lemire/longcompression/SkippableLongCODEC.java b/src/main/java/me/lemire/longcompression/SkippableLongCODEC.java index e3e7b84..57475f5 100644 --- a/src/main/java/me/lemire/longcompression/SkippableLongCODEC.java +++ b/src/main/java/me/lemire/longcompression/SkippableLongCODEC.java @@ -33,7 +33,7 @@ public interface SkippableLongCODEC { * @param in * input array * @param inpos - * location in the input array + * where to start reading in the array * @param inlength * how many longs to compress * @param out @@ -57,9 +57,9 @@ public void headlessCompress(long[] in, IntWrapper inpos, int inlength, long[] o * @param inlength * length of the compressed data (ignored by some schemes) * @param out - * array where to write the compressed output + * array where to write the uncompressed output * @param outpos - * where to write the compressed output in out + * where to start writing the uncompressed output in out * @param num * number of longs we want to decode, the actual number of longs decoded can be less */ diff --git a/src/test/java/me/lemire/longcompression/ATestLongCODEC.java b/src/test/java/me/lemire/longcompression/ATestLongCODEC.java new file mode 100644 index 0000000..c61ea69 --- /dev/null +++ b/src/test/java/me/lemire/longcompression/ATestLongCODEC.java @@ -0,0 +1,96 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + +package me.lemire.longcompression; + +import java.util.stream.LongStream; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Edge-cases to be tested on a per-codec basis + * + * @author Benoit Lacelle + */ +public abstract class ATestLongCODEC { + protected void checkConsistency(LongCODEC codec, long[] array) { + { + long[] compressed = LongTestUtils.compress(codec, array); + long[] uncompressed = LongTestUtils.uncompress(codec, compressed, array.length); + + Assert.assertArrayEquals(array, uncompressed); + } + + if (codec instanceof ByteLongCODEC) { + byte[] compressed = LongTestUtils.compress((ByteLongCODEC) codec, array); + long[] uncompressed = LongTestUtils.uncompress((ByteLongCODEC) codec, compressed, array.length); + + Assert.assertArrayEquals(array, uncompressed); + } + + if (codec instanceof SkippableLongCODEC) { + long[] compressed = LongTestUtils.compressHeadless((SkippableLongCODEC) codec, array); + long[] uncompressed = + LongTestUtils.uncompressHeadless((SkippableLongCODEC) codec, compressed, array.length); + + Assert.assertArrayEquals(array, uncompressed); + } + } + + public abstract LongCODEC getCodec(); + + @Test + public void testCodec_Minus1() { + checkConsistency(getCodec(), new long[] { -1 }); + } + + @Test + public void testCodec_ZeroTimes8Minus1() { + checkConsistency(getCodec(), new long[] { 0, 0, 0, 0, 0, 0, 0, 0, -1 }); + } + + @Test + public void testCodec_ZeroTimes127Minus1() { + long[] array = LongStream.concat(LongStream.range(0, 127).map(l -> 0), LongStream.of(-1)).toArray(); + + checkConsistency(getCodec(), array); + } + + @Test + public void testCodec_ZeroTimes128Minus1() { + long[] array = LongStream.concat(LongStream.range(0, 128).map(l -> 0), LongStream.of(-1)).toArray(); + + checkConsistency(getCodec(), array); + } + + @Test + public void testCodec_MinValue() { + checkConsistency(getCodec(), new long[] { Long.MIN_VALUE }); + } + + @Test + public void testCodec_ZeroMinValue() { + checkConsistency(getCodec(), new long[] { 0, Long.MIN_VALUE }); + } + + @Test + public void testCodec_allPowerOfTwo() { + checkConsistency(getCodec(), new long[] { 1L << 42 }); + for (int i = 0; i < 64; i++) { + checkConsistency(getCodec(), new long[] { 1L << i }); + } + } + + @Test + public void testCodec_ZeroThenAllPowerOfTwo() { + for (int i = 0; i < 64; i++) { + checkConsistency(getCodec(), new long[] { 0, 1L << i }); + } + } + +} diff --git a/src/test/java/me/lemire/longcompression/LongBasicTest.java b/src/test/java/me/lemire/longcompression/LongBasicTest.java index 5aa3551..1963246 100644 --- a/src/test/java/me/lemire/longcompression/LongBasicTest.java +++ b/src/test/java/me/lemire/longcompression/LongBasicTest.java @@ -14,24 +14,9 @@ import org.junit.Test; -import me.lemire.integercompression.BinaryPacking; -import me.lemire.integercompression.Composition; import me.lemire.integercompression.FastPFOR; import me.lemire.integercompression.FastPFOR128; import me.lemire.integercompression.IntWrapper; -import me.lemire.integercompression.JustCopy; -import me.lemire.integercompression.NewPFD; -import me.lemire.integercompression.NewPFDS16; -import me.lemire.integercompression.NewPFDS9; -import me.lemire.integercompression.OptPFD; -import me.lemire.integercompression.OptPFDS16; -import me.lemire.integercompression.OptPFDS9; -import me.lemire.integercompression.Simple9; -import me.lemire.integercompression.VariableByte; -import me.lemire.integercompression.differential.Delta; -import me.lemire.integercompression.differential.IntegratedBinaryPacking; -import me.lemire.integercompression.differential.IntegratedComposition; -import me.lemire.integercompression.differential.IntegratedVariableByte; import me.lemire.longcompression.differential.LongDelta; import me.lemire.longcompression.synth.LongClusteredDataGenerator; @@ -45,7 +30,9 @@ public class LongBasicTest { final LongCODEC[] codecs = { new LongJustCopy(), new LongVariableByte(), - new LongAs2IntsCodec()}; + new LongAs2IntsCodec(), + new LongComposition(new LongBinaryPacking(), new LongVariableByte()), + }; /** * This tests with a compressed array with various offset @@ -89,14 +76,19 @@ public void varyingLengthTest() { long[] comp = LongTestUtils.compress(c, Arrays.copyOf(data, L)); long[] answer = LongTestUtils.uncompress(c, comp, L); for (int k = 0; k < L; ++k) - if (answer[k] != data[k]) - throw new RuntimeException("bug"); + if (answer[k] != data[k]) { + long[] comp2 = LongTestUtils.compress(c, Arrays.copyOf(data, L)); + long[] answer2 = LongTestUtils.uncompress(c, comp2, L); + throw new RuntimeException("bug"); + } } for (int L = 128; L <= N; L *= 2) { long[] comp = LongTestUtils.compress(c, Arrays.copyOf(data, L)); long[] answer = LongTestUtils.uncompress(c, comp, L); for (int k = 0; k < L; ++k) if (answer[k] != data[k]) { + long[] comp2 = LongTestUtils.compress(c, Arrays.copyOf(data, L)); + long[] answer2 = LongTestUtils.uncompress(c, comp2, L); System.out.println(Arrays.toString(Arrays.copyOf( answer, L))); System.out.println(Arrays.toString(Arrays.copyOf(data, @@ -366,9 +358,12 @@ public void fastPforTest() { long[] comp = LongTestUtils.compress(codec, Arrays.copyOf(data, N)); long[] answer = LongTestUtils.uncompress(codec, comp, N); for (int k = 0; k < N; ++k) - if (answer[k] != data[k]) + if (answer[k] != data[k]) { + long[] comp2 = LongTestUtils.compress(codec, Arrays.copyOf(data, N)); + long[] answer2 = LongTestUtils.uncompress(codec, comp2, N); throw new RuntimeException("bug " + k + " " + answer[k] + " != " + data[k]); + } } } diff --git a/src/test/java/me/lemire/longcompression/SkippableLongBasicTest.java b/src/test/java/me/lemire/longcompression/SkippableLongBasicTest.java index e900c9c..24cb712 100644 --- a/src/test/java/me/lemire/longcompression/SkippableLongBasicTest.java +++ b/src/test/java/me/lemire/longcompression/SkippableLongBasicTest.java @@ -25,7 +25,8 @@ public class SkippableLongBasicTest { final SkippableLongCODEC[] codecs = { new LongJustCopy(), - new LongVariableByte(), }; + new LongVariableByte(), + new SkippableLongComposition(new LongBinaryPacking(), new LongVariableByte()), }; /** diff --git a/src/test/java/me/lemire/longcompression/TestLongAs2IntsCodec.java b/src/test/java/me/lemire/longcompression/TestLongAs2IntsCodec.java index 00bb52a..5b8014e 100644 --- a/src/test/java/me/lemire/longcompression/TestLongAs2IntsCodec.java +++ b/src/test/java/me/lemire/longcompression/TestLongAs2IntsCodec.java @@ -7,8 +7,6 @@ package me.lemire.longcompression; -import java.util.stream.LongStream; - import org.junit.Assert; import org.junit.Test; @@ -17,85 +15,12 @@ * * @author Benoit Lacelle */ -public class TestLongAs2IntsCodec { +public class TestLongAs2IntsCodec extends ATestLongCODEC { final LongAs2IntsCodec codec = new LongAs2IntsCodec(); - private void checkConsistency(LongCODEC codec, long[] array) { - { - long[] compressed = LongTestUtils.compress(codec, array); - long[] uncompressed = LongTestUtils.uncompress(codec, compressed, array.length); - - Assert.assertArrayEquals(array, uncompressed); - } - - if (codec instanceof ByteLongCODEC) { - byte[] compressed = LongTestUtils.compress((ByteLongCODEC) codec, array); - long[] uncompressed = LongTestUtils.uncompress((ByteLongCODEC) codec, compressed, array.length); - - Assert.assertArrayEquals(array, uncompressed); - } - - if (codec instanceof SkippableLongCODEC) { - long[] compressed = LongTestUtils.compressHeadless((SkippableLongCODEC) codec, array); - long[] uncompressed = - LongTestUtils.uncompressHeadless((SkippableLongCODEC) codec, compressed, array.length); - - Assert.assertArrayEquals(array, uncompressed); - } - } - - @Test - public void testCodec_Zero() { - checkConsistency(codec, new long[] { 0 }); - } - - @Test - public void testCodec_Minus1() { - checkConsistency(codec, new long[] { -1 }); - } - - @Test - public void testCodec_ZeroTimes8Minus1() { - checkConsistency(codec, new long[] { 0, 0, 0, 0, 0, 0, 0, 0, -1 }); - } - - @Test - public void testCodec_ZeroTimes127Minus1() { - long[] array = LongStream.concat(LongStream.range(0, 127).map(l -> 0), LongStream.of(-1)).toArray(); - - checkConsistency(codec, array); - } - - @Test - public void testCodec_ZeroTimes128Minus1() { - long[] array = LongStream.concat(LongStream.range(0, 128).map(l -> 0), LongStream.of(-1)).toArray(); - - checkConsistency(codec, array); - } - - @Test - public void testCodec_MinValue() { - checkConsistency(codec, new long[] { Long.MIN_VALUE }); - } - - @Test - public void testCodec_ZeroMinValue() { - checkConsistency(codec, new long[] { 0, Long.MIN_VALUE }); - } - - @Test - public void testCodec_allPowerOfTwo() { - checkConsistency(codec, new long[] { 1L << 42 }); - for (int i = 0; i < 64; i++) { - checkConsistency(codec, new long[] { 1L << i }); - } - } - - @Test - public void testCodec_ZeroThenAllPowerOfTwo() { - for (int i = 0; i < 64; i++) { - checkConsistency(codec, new long[] { 0, 1L << i }); - } + @Override + public LongCODEC getCodec() { + return codec; } @Test diff --git a/src/test/java/me/lemire/longcompression/TestLongBinaryPacking.java b/src/test/java/me/lemire/longcompression/TestLongBinaryPacking.java new file mode 100644 index 0000000..ecc3f2e --- /dev/null +++ b/src/test/java/me/lemire/longcompression/TestLongBinaryPacking.java @@ -0,0 +1,26 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + +package me.lemire.longcompression; + +import org.junit.Ignore; + +/** + * Edge-cases having caused issue specifically with LongBinaryPacking. + * + * @author Benoit Lacelle + */ +@Ignore("Parent class tests are not valid as LongBinaryPacking process by chunks of 64 longs") +public class TestLongBinaryPacking extends ATestLongCODEC { + final LongBinaryPacking codec = new LongBinaryPacking(); + + @Override + public LongCODEC getCodec() { + return codec; + } + +} diff --git a/src/test/java/me/lemire/longcompression/TestLongVariableByte.java b/src/test/java/me/lemire/longcompression/TestLongVariableByte.java index 15613f2..ee1755a 100644 --- a/src/test/java/me/lemire/longcompression/TestLongVariableByte.java +++ b/src/test/java/me/lemire/longcompression/TestLongVariableByte.java @@ -7,8 +7,6 @@ package me.lemire.longcompression; -import java.util.stream.LongStream; - import org.junit.Assert; import org.junit.Test; @@ -17,87 +15,20 @@ * * @author Benoit Lacelle */ -public class TestLongVariableByte { +public class TestLongVariableByte extends ATestLongCODEC { final LongVariableByte codec = new LongVariableByte(); - private void checkConsistency(LongCODEC codec, long[] array) { - { - long[] compressed = LongTestUtils.compress(codec, array); - long[] uncompressed = LongTestUtils.uncompress(codec, compressed, array.length); - - Assert.assertArrayEquals(array, uncompressed); - } - - if (codec instanceof ByteLongCODEC) { - byte[] compressed = LongTestUtils.compress((ByteLongCODEC) codec, array); - long[] uncompressed = LongTestUtils.uncompress((ByteLongCODEC) codec, compressed, array.length); - - Assert.assertArrayEquals(array, uncompressed); - } - - if (codec instanceof SkippableLongCODEC) { - long[] compressed = LongTestUtils.compressHeadless((SkippableLongCODEC) codec, array); - long[] uncompressed = - LongTestUtils.uncompressHeadless((SkippableLongCODEC) codec, compressed, array.length); - - Assert.assertArrayEquals(array, uncompressed); - } - } - - @Test - public void testCodec_ZeroMinus1() { - checkConsistency(codec, new long[] { -1 }); - } - - @Test - public void testCodec_ZeroTimes8Minus1() { - checkConsistency(codec, new long[] { 0, 0, 0, 0, 0, 0, 0, 0, -1 }); - } - - @Test - public void testCodec_ZeroTimes127Minus1() { - long[] array = LongStream.concat(LongStream.range(0, 127).map(l -> 0), LongStream.of(-1)).toArray(); - - checkConsistency(codec, array); - } - - @Test - public void testCodec_ZeroTimes128Minus1() { - long[] array = LongStream.concat(LongStream.range(0, 128).map(l -> 0), LongStream.of(-1)).toArray(); - - checkConsistency(codec, array); - } - - @Test - public void testCodec_MinValue() { - checkConsistency(codec, new long[] { Long.MIN_VALUE }); - } - - @Test - public void testCodec_ZeroMinValue() { - checkConsistency(codec, new long[] { 0, Long.MIN_VALUE }); - } - - @Test - public void testCodec_allPowerOfTwo() { - checkConsistency(codec, new long[] { 1L << 42 }); - for (int i = 0; i < 64; i++) { - checkConsistency(codec, new long[] { 1L << i }); - } - } - - @Test - public void testCodec_ZeroThenAllPowerOfTwo() { - for (int i = 0; i < 64; i++) { - checkConsistency(codec, new long[] { 0, 1L << i }); - } + @Override + public LongCODEC getCodec() { + return codec; } @Test public void testCodec_intermediateHighPowerOfTwo() { Assert.assertEquals(1, LongTestUtils.compress((LongCODEC) codec, new long[] { 1L << 42 }).length); Assert.assertEquals(7, LongTestUtils.compress((ByteLongCODEC) codec, new long[] { 1L << 42 }).length); - Assert.assertEquals(1, LongTestUtils.compressHeadless((SkippableLongCODEC) codec, new long[] { 1L << 42 }).length); + Assert.assertEquals(1, + LongTestUtils.compressHeadless((SkippableLongCODEC) codec, new long[] { 1L << 42 }).length); } } From 4fb854fd4582732e6934f6c0317ff14c41b9e3db Mon Sep 17 00:00:00 2001 From: Benoit Lacelle Date: Mon, 28 Nov 2022 23:10:17 +0400 Subject: [PATCH 318/412] Fix tab to 4-spaces --- .../lemire/longcompression/ByteLongCODEC.java | 2 +- .../longcompression/LongAs2IntsCodec.java | 338 +++++++++--------- .../longcompression/LongBinaryPacking.java | 10 +- .../longcompression/LongBitPacking.java | 36 +- .../me/lemire/longcompression/LongUtil.java | 10 +- .../longcompression/LongVariableByte.java | 2 +- 6 files changed, 199 insertions(+), 199 deletions(-) diff --git a/src/main/java/me/lemire/longcompression/ByteLongCODEC.java b/src/main/java/me/lemire/longcompression/ByteLongCODEC.java index e405370..dbc6864 100644 --- a/src/main/java/me/lemire/longcompression/ByteLongCODEC.java +++ b/src/main/java/me/lemire/longcompression/ByteLongCODEC.java @@ -57,6 +57,6 @@ public void compress(long[] in, IntWrapper inpos, int inlength, * where to write the compressed output in out */ public void uncompress(byte[] in, IntWrapper inpos, int inlength, - long[] out, IntWrapper outpos); + long[] out, IntWrapper outpos); } diff --git a/src/main/java/me/lemire/longcompression/LongAs2IntsCodec.java b/src/main/java/me/lemire/longcompression/LongAs2IntsCodec.java index 3b2bc76..35c1166 100644 --- a/src/main/java/me/lemire/longcompression/LongAs2IntsCodec.java +++ b/src/main/java/me/lemire/longcompression/LongAs2IntsCodec.java @@ -16,174 +16,174 @@ * */ public class LongAs2IntsCodec implements LongCODEC { - final IntegerCODEC highPartsCodec; - final IntegerCODEC lowPartsCodec; - - public LongAs2IntsCodec(IntegerCODEC highPartsCodec, IntegerCODEC lowPartsCodec) { - this.highPartsCodec = highPartsCodec; - this.lowPartsCodec = lowPartsCodec; - } - - /** - * By default, we expect longs to be slightly above Integer.MAX_VALUE. Hence highParts to be small and positive - * integers. For lowParts, we rely on {@link IntCompressor} default IntegerCODEC - */ - public LongAs2IntsCodec() { - this(new VariableByte(), new Composition(new BinaryPacking(), new VariableByte())); - } - - @Override - public void compress(long[] in, IntWrapper inpos, int inlength, long[] out, IntWrapper outpos) { - if (inlength == 0) { - return; - } - - int[] highParts = new int[inlength]; - int[] lowParts = new int[inlength]; - - for (int i = 0; i < inlength; i++) { - int inPosition = inpos.get() + i; - - highParts[i] = RoaringIntPacking.high(in[inPosition]); - lowParts[i] = RoaringIntPacking.low(in[inPosition]); - } - - // TODO What would be a relevant buffer size? - int[] buffer = new int[inlength * 16]; - - int outPosition = outpos.get(); - - boolean hasLeftover; - { - // The first integer is reserved to hold the number of compressed ints - IntWrapper highPartsOutPosition = new IntWrapper(1); - - highPartsCodec.compress(highParts, new IntWrapper(), inlength, buffer, highPartsOutPosition); - - // Record the compressedHighparts length - buffer[0] = highPartsOutPosition.get() - 1; - - for (int i = 0; i < highPartsOutPosition.get() / 2; i++) { - long pack = RoaringIntPacking.pack(buffer[i * 2], buffer[i * 2 + 1]); - out[outPosition++] = pack; - } - - if (1 == highPartsOutPosition.get() % 2) { - // Shift the trailing integer as first in the buffer - hasLeftover = true; - buffer[0] = buffer[highPartsOutPosition.get() - 1]; - } else { - hasLeftover = false; - } - } - - { - // The first integer is reserved to hold the number of compressed ints - IntWrapper lowPartsOutPosition = new IntWrapper(1); - if (hasLeftover) { - // Keep the trailing int from highParts before the reserved int from lowParts compressed length - lowPartsOutPosition.set(2); - } - - lowPartsCodec.compress(lowParts, new IntWrapper(0), inlength, buffer, lowPartsOutPosition); - - // Record the compressedHighparts length - buffer[hasLeftover ? 1 : 0] = lowPartsOutPosition.get() - (hasLeftover ? 2 : 1); - - for (int i = 0; i < lowPartsOutPosition.get() / 2; i++) { - long pack = RoaringIntPacking.pack(buffer[i * 2], buffer[i * 2 + 1]); - out[outPosition++] = pack; - } - - if (1 == lowPartsOutPosition.get() % 2) { - // The trailing integer is packed with a 0 - long pack = RoaringIntPacking.pack(buffer[lowPartsOutPosition.get() - 1], 0); - out[outPosition++] = pack; - } - } - - inpos.add(inlength); - outpos.set(outPosition); - } - - /** - * inlength is ignored by this codec. We may rely on it instead of storing the compressedLowPart length - */ - @Override - public void uncompress(long[] in, IntWrapper inpos, int inlength, long[] out, IntWrapper outpos) { - if (inlength == 0) { - return; - } - - int longIndex = inpos.get(); - - int nbCompressedHighParts = RoaringIntPacking.high(in[longIndex]); - int[] compressedHighParts = new int[nbCompressedHighParts]; - - // !highPart as we just read the highPart for nbCompressedHighParts - boolean highPart = false; - for (int i = 0; i < nbCompressedHighParts; i++) { - int nextInt; - if (highPart) { - nextInt = RoaringIntPacking.high(in[longIndex + (i + 1) / 2]); - } else { - nextInt = RoaringIntPacking.low(in[longIndex + (i + 1) / 2]); - } - compressedHighParts[i] = nextInt; - - highPart = !highPart; - } - - // TODO What would be a relevant buffer size? - int[] buffer = new int[inlength * 16]; - - IntWrapper highPartsOutPosition = new IntWrapper(); - highPartsCodec.uncompress(compressedHighParts, - new IntWrapper(), - compressedHighParts.length, - buffer, - highPartsOutPosition); - int[] highParts = Arrays.copyOf(buffer, highPartsOutPosition.get()); - - // +1 as we initially read nbCompressedHighParts - int intIndexNbCompressedLowParts = longIndex * 2 + 1 + nbCompressedHighParts; - int nbCompressedLowParts; - if (highPart) { - nbCompressedLowParts = RoaringIntPacking.high(in[intIndexNbCompressedLowParts / 2]); - } else { - nbCompressedLowParts = RoaringIntPacking.low(in[intIndexNbCompressedLowParts / 2]); - } - highPart = !highPart; - - int[] compressedLowParts = new int[nbCompressedLowParts]; - for (int i = 0; i < nbCompressedLowParts; i++) { - int nextInt; - if (highPart) { - nextInt = RoaringIntPacking.high(in[(intIndexNbCompressedLowParts + 1 + i) / 2]); - } else { - nextInt = RoaringIntPacking.low(in[(intIndexNbCompressedLowParts + 1 + i) / 2]); - } - compressedLowParts[i] = nextInt; - - highPart = !highPart; - } - - IntWrapper lowPartsOutPosition = new IntWrapper(); - lowPartsCodec.uncompress(compressedLowParts, - new IntWrapper(), - compressedLowParts.length, - buffer, - lowPartsOutPosition); - int[] lowParts = Arrays.copyOf(buffer, lowPartsOutPosition.get()); - assert highParts.length == lowParts.length; - - int outposition = outpos.get(); - for (int i = 0; i < highParts.length; i++) { - out[outposition++] = RoaringIntPacking.pack(highParts[i], lowParts[i]); - } - - inpos.add(inlength); - outpos.set(outposition); - } + final IntegerCODEC highPartsCodec; + final IntegerCODEC lowPartsCodec; + + public LongAs2IntsCodec(IntegerCODEC highPartsCodec, IntegerCODEC lowPartsCodec) { + this.highPartsCodec = highPartsCodec; + this.lowPartsCodec = lowPartsCodec; + } + + /** + * By default, we expect longs to be slightly above Integer.MAX_VALUE. Hence highParts to be small and positive + * integers. For lowParts, we rely on {@link IntCompressor} default IntegerCODEC + */ + public LongAs2IntsCodec() { + this(new VariableByte(), new Composition(new BinaryPacking(), new VariableByte())); + } + + @Override + public void compress(long[] in, IntWrapper inpos, int inlength, long[] out, IntWrapper outpos) { + if (inlength == 0) { + return; + } + + int[] highParts = new int[inlength]; + int[] lowParts = new int[inlength]; + + for (int i = 0; i < inlength; i++) { + int inPosition = inpos.get() + i; + + highParts[i] = RoaringIntPacking.high(in[inPosition]); + lowParts[i] = RoaringIntPacking.low(in[inPosition]); + } + + // TODO What would be a relevant buffer size? + int[] buffer = new int[inlength * 16]; + + int outPosition = outpos.get(); + + boolean hasLeftover; + { + // The first integer is reserved to hold the number of compressed ints + IntWrapper highPartsOutPosition = new IntWrapper(1); + + highPartsCodec.compress(highParts, new IntWrapper(), inlength, buffer, highPartsOutPosition); + + // Record the compressedHighparts length + buffer[0] = highPartsOutPosition.get() - 1; + + for (int i = 0; i < highPartsOutPosition.get() / 2; i++) { + long pack = RoaringIntPacking.pack(buffer[i * 2], buffer[i * 2 + 1]); + out[outPosition++] = pack; + } + + if (1 == highPartsOutPosition.get() % 2) { + // Shift the trailing integer as first in the buffer + hasLeftover = true; + buffer[0] = buffer[highPartsOutPosition.get() - 1]; + } else { + hasLeftover = false; + } + } + + { + // The first integer is reserved to hold the number of compressed ints + IntWrapper lowPartsOutPosition = new IntWrapper(1); + if (hasLeftover) { + // Keep the trailing int from highParts before the reserved int from lowParts compressed length + lowPartsOutPosition.set(2); + } + + lowPartsCodec.compress(lowParts, new IntWrapper(0), inlength, buffer, lowPartsOutPosition); + + // Record the compressedHighparts length + buffer[hasLeftover ? 1 : 0] = lowPartsOutPosition.get() - (hasLeftover ? 2 : 1); + + for (int i = 0; i < lowPartsOutPosition.get() / 2; i++) { + long pack = RoaringIntPacking.pack(buffer[i * 2], buffer[i * 2 + 1]); + out[outPosition++] = pack; + } + + if (1 == lowPartsOutPosition.get() % 2) { + // The trailing integer is packed with a 0 + long pack = RoaringIntPacking.pack(buffer[lowPartsOutPosition.get() - 1], 0); + out[outPosition++] = pack; + } + } + + inpos.add(inlength); + outpos.set(outPosition); + } + + /** + * inlength is ignored by this codec. We may rely on it instead of storing the compressedLowPart length + */ + @Override + public void uncompress(long[] in, IntWrapper inpos, int inlength, long[] out, IntWrapper outpos) { + if (inlength == 0) { + return; + } + + int longIndex = inpos.get(); + + int nbCompressedHighParts = RoaringIntPacking.high(in[longIndex]); + int[] compressedHighParts = new int[nbCompressedHighParts]; + + // !highPart as we just read the highPart for nbCompressedHighParts + boolean highPart = false; + for (int i = 0; i < nbCompressedHighParts; i++) { + int nextInt; + if (highPart) { + nextInt = RoaringIntPacking.high(in[longIndex + (i + 1) / 2]); + } else { + nextInt = RoaringIntPacking.low(in[longIndex + (i + 1) / 2]); + } + compressedHighParts[i] = nextInt; + + highPart = !highPart; + } + + // TODO What would be a relevant buffer size? + int[] buffer = new int[inlength * 16]; + + IntWrapper highPartsOutPosition = new IntWrapper(); + highPartsCodec.uncompress(compressedHighParts, + new IntWrapper(), + compressedHighParts.length, + buffer, + highPartsOutPosition); + int[] highParts = Arrays.copyOf(buffer, highPartsOutPosition.get()); + + // +1 as we initially read nbCompressedHighParts + int intIndexNbCompressedLowParts = longIndex * 2 + 1 + nbCompressedHighParts; + int nbCompressedLowParts; + if (highPart) { + nbCompressedLowParts = RoaringIntPacking.high(in[intIndexNbCompressedLowParts / 2]); + } else { + nbCompressedLowParts = RoaringIntPacking.low(in[intIndexNbCompressedLowParts / 2]); + } + highPart = !highPart; + + int[] compressedLowParts = new int[nbCompressedLowParts]; + for (int i = 0; i < nbCompressedLowParts; i++) { + int nextInt; + if (highPart) { + nextInt = RoaringIntPacking.high(in[(intIndexNbCompressedLowParts + 1 + i) / 2]); + } else { + nextInt = RoaringIntPacking.low(in[(intIndexNbCompressedLowParts + 1 + i) / 2]); + } + compressedLowParts[i] = nextInt; + + highPart = !highPart; + } + + IntWrapper lowPartsOutPosition = new IntWrapper(); + lowPartsCodec.uncompress(compressedLowParts, + new IntWrapper(), + compressedLowParts.length, + buffer, + lowPartsOutPosition); + int[] lowParts = Arrays.copyOf(buffer, lowPartsOutPosition.get()); + assert highParts.length == lowParts.length; + + int outposition = outpos.get(); + for (int i = 0; i < highParts.length; i++) { + out[outposition++] = RoaringIntPacking.pack(highParts[i], lowParts[i]); + } + + inpos.add(inlength); + outpos.set(outposition); + } } diff --git a/src/main/java/me/lemire/longcompression/LongBinaryPacking.java b/src/main/java/me/lemire/longcompression/LongBinaryPacking.java index dba5cbc..0d33ec6 100644 --- a/src/main/java/me/lemire/longcompression/LongBinaryPacking.java +++ b/src/main/java/me/lemire/longcompression/LongBinaryPacking.java @@ -27,7 +27,7 @@ public final class LongBinaryPacking implements LongCODEC, SkippableLongCODEC { @Override public void compress(long[] in, IntWrapper inpos, int inlength, - long[] out, IntWrapper outpos) { + long[] out, IntWrapper outpos) { inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); if (inlength == 0) return; @@ -38,13 +38,13 @@ public void compress(long[] in, IntWrapper inpos, int inlength, @Override public void headlessCompress(long[] in, IntWrapper inpos, int inlength, - long[] out, IntWrapper outpos) { + long[] out, IntWrapper outpos) { inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); int tmpoutpos = outpos.get(); int s = inpos.get(); // Compress by block of 8 * 64 longs as much as possible for (; s + BLOCK_SIZE * 8 - 1 < inpos.get() + inlength; s += BLOCK_SIZE * 8) { - // maxbits can be anything between 0 and 64 included: expressed within a byte (1 << 6) + // maxbits can be anything between 0 and 64 included: expressed within a byte (1 << 6) final long mbits1 = LongUtil.maxbits(in, s + 0 * BLOCK_SIZE, BLOCK_SIZE); final long mbits2 = LongUtil.maxbits(in, s + 1 * BLOCK_SIZE, BLOCK_SIZE); final long mbits3 = LongUtil.maxbits(in, s + 2 * BLOCK_SIZE, BLOCK_SIZE); @@ -85,7 +85,7 @@ public void headlessCompress(long[] in, IntWrapper inpos, int inlength, @Override public void uncompress(long[] in, IntWrapper inpos, int inlength, - long[] out, IntWrapper outpos) { + long[] out, IntWrapper outpos) { if (inlength == 0) return; final int outlength = (int) in[inpos.get()]; @@ -95,7 +95,7 @@ public void uncompress(long[] in, IntWrapper inpos, int inlength, @Override public void headlessUncompress(long[] in, IntWrapper inpos, int inlength, - long[] out, IntWrapper outpos, int num) { + long[] out, IntWrapper outpos, int num) { final int outlength = Util.greatestMultiple(num, BLOCK_SIZE); int tmpinpos = inpos.get(); int s = outpos.get(); diff --git a/src/main/java/me/lemire/longcompression/LongBitPacking.java b/src/main/java/me/lemire/longcompression/LongBitPacking.java index 7da1c7f..2d282ec 100644 --- a/src/main/java/me/lemire/longcompression/LongBitPacking.java +++ b/src/main/java/me/lemire/longcompression/LongBitPacking.java @@ -41,15 +41,15 @@ public final class LongBitPacking { */ public static void fastpackwithoutmask(final long[] in, final int inpos, final long[] out, final int outpos, final int bit) { - if (bit == 0) { - fastpackwithoutmask0(in, inpos, out, outpos); - } else if (bit == 64) { - fastpackwithoutmask64(in, inpos, out, outpos); - } else if (bit > 0 && bit < 64) { - slowpackwithoutmask(in, inpos, out, outpos, bit); - } else { + if (bit == 0) { + fastpackwithoutmask0(in, inpos, out, outpos); + } else if (bit == 64) { + fastpackwithoutmask64(in, inpos, out, outpos); + } else if (bit > 0 && bit < 64) { + slowpackwithoutmask(in, inpos, out, outpos, bit); + } else { throw new IllegalArgumentException("Unsupported bit width: " + bit); - } + } } protected static void fastpackwithoutmask0(final long[] in, int inpos, @@ -75,8 +75,8 @@ protected static void slowpackwithoutmask(final long[] in, int inpos, shift -= 64; if (shift > 0) { - // There is some leftovers from previous input in the next bucket - out[outpos + bucket] |= in[inpos + i - 1] >> (bit - shift); + // There is some leftovers from previous input in the next bucket + out[outpos + bucket] |= in[inpos + i - 1] >> (bit - shift); } } out[outpos + bucket] |= in[inpos + i] << shift; @@ -102,15 +102,15 @@ protected static void slowpackwithoutmask(final long[] in, int inpos, */ public static void fastunpack(final long[] in, final int inpos, final long[] out, final int outpos, final int bit) { - if (bit == 0) { - fastunpack0(in, inpos, out, outpos); - } else if (bit == 64) { - fastunpack64(in, inpos, out, outpos); - } else if (bit > 0 && bit < 64) { + if (bit == 0) { + fastunpack0(in, inpos, out, outpos); + } else if (bit == 64) { + fastunpack64(in, inpos, out, outpos); + } else if (bit > 0 && bit < 64) { slowunpack(in, inpos, out, outpos, bit); - } else { + } else { throw new IllegalArgumentException("Unsupported bit width: " + bit); - } + } } @@ -134,7 +134,7 @@ protected static void slowunpack(final long[] in, int inpos, shift -= 64; if (shift > 0) { - // There is some leftovers from previous input in the next bucket + // There is some leftovers from previous input in the next bucket out[outpos + i - 1] |= (in[inpos + bucket] << (bit - shift) & ((1L << bit) - 1)); } } diff --git a/src/main/java/me/lemire/longcompression/LongUtil.java b/src/main/java/me/lemire/longcompression/LongUtil.java index 596a134..7bdce83 100644 --- a/src/main/java/me/lemire/longcompression/LongUtil.java +++ b/src/main/java/me/lemire/longcompression/LongUtil.java @@ -15,8 +15,8 @@ */ @Deprecated public class LongUtil { - - /** + + /** * Compute the maximum of the integer logarithms (ceil(log(x+1)) of a range * of value * @@ -46,7 +46,7 @@ public static int bits(long i) { return 64 - Long.numberOfLeadingZeros(i); } - protected static String longToBinaryWithLeading(long l) { - return String.format("%64s", Long.toBinaryString(l)).replace(' ', '0'); - } + protected static String longToBinaryWithLeading(long l) { + return String.format("%64s", Long.toBinaryString(l)).replace(' ', '0'); + } } diff --git a/src/main/java/me/lemire/longcompression/LongVariableByte.java b/src/main/java/me/lemire/longcompression/LongVariableByte.java index d31967a..1be4494 100644 --- a/src/main/java/me/lemire/longcompression/LongVariableByte.java +++ b/src/main/java/me/lemire/longcompression/LongVariableByte.java @@ -237,7 +237,7 @@ public void uncompress(long[] in, IntWrapper inpos, int inlength, long[] out, @Override public void uncompress(byte[] in, IntWrapper inpos, int inlength, - long[] out, IntWrapper outpos) { + long[] out, IntWrapper outpos) { int p = inpos.get(); int finalp = inpos.get() + inlength; int tmpoutpos = outpos.get(); From 65159cd2f18f2e9ed19a727ceb016397c7f99d59 Mon Sep 17 00:00:00 2001 From: Benoit Lacelle Date: Mon, 28 Nov 2022 23:13:15 +0400 Subject: [PATCH 319/412] Fix LGTM --- .../longcompression/LongBinaryPacking.java | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/main/java/me/lemire/longcompression/LongBinaryPacking.java b/src/main/java/me/lemire/longcompression/LongBinaryPacking.java index 0d33ec6..33bb8f1 100644 --- a/src/main/java/me/lemire/longcompression/LongBinaryPacking.java +++ b/src/main/java/me/lemire/longcompression/LongBinaryPacking.java @@ -45,16 +45,16 @@ public void headlessCompress(long[] in, IntWrapper inpos, int inlength, // Compress by block of 8 * 64 longs as much as possible for (; s + BLOCK_SIZE * 8 - 1 < inpos.get() + inlength; s += BLOCK_SIZE * 8) { // maxbits can be anything between 0 and 64 included: expressed within a byte (1 << 6) - final long mbits1 = LongUtil.maxbits(in, s + 0 * BLOCK_SIZE, BLOCK_SIZE); - final long mbits2 = LongUtil.maxbits(in, s + 1 * BLOCK_SIZE, BLOCK_SIZE); - final long mbits3 = LongUtil.maxbits(in, s + 2 * BLOCK_SIZE, BLOCK_SIZE); - final long mbits4 = LongUtil.maxbits(in, s + 3 * BLOCK_SIZE, BLOCK_SIZE); - final long mbits5 = LongUtil.maxbits(in, s + 4 * BLOCK_SIZE, BLOCK_SIZE); - final long mbits6 = LongUtil.maxbits(in, s + 5 * BLOCK_SIZE, BLOCK_SIZE); - final long mbits7 = LongUtil.maxbits(in, s + 6 * BLOCK_SIZE, BLOCK_SIZE); - final long mbits8 = LongUtil.maxbits(in, s + 7 * BLOCK_SIZE, BLOCK_SIZE); + final int mbits1 = LongUtil.maxbits(in, s + 0 * BLOCK_SIZE, BLOCK_SIZE); + final int mbits2 = LongUtil.maxbits(in, s + 1 * BLOCK_SIZE, BLOCK_SIZE); + final int mbits3 = LongUtil.maxbits(in, s + 2 * BLOCK_SIZE, BLOCK_SIZE); + final int mbits4 = LongUtil.maxbits(in, s + 3 * BLOCK_SIZE, BLOCK_SIZE); + final int mbits5 = LongUtil.maxbits(in, s + 4 * BLOCK_SIZE, BLOCK_SIZE); + final int mbits6 = LongUtil.maxbits(in, s + 5 * BLOCK_SIZE, BLOCK_SIZE); + final int mbits7 = LongUtil.maxbits(in, s + 6 * BLOCK_SIZE, BLOCK_SIZE); + final int mbits8 = LongUtil.maxbits(in, s + 7 * BLOCK_SIZE, BLOCK_SIZE); // The first long expressed the maxbits for the 8 buckets - out[tmpoutpos++] = (mbits1 << 56) | (mbits2 << 48) | (mbits3 << 40) | (mbits4 << 32) | (mbits5 << 24) | (mbits6 << 16) | (mbits7 << 8) | (mbits8); + out[tmpoutpos++] = ((long) mbits1 << 56) | ((long) mbits2 << 48) | ((long) mbits3 << 40) | ((long) mbits4 << 32) | (mbits5 << 24) | (mbits6 << 16) | (mbits7 << 8) | (mbits8); LongBitPacking.fastpackwithoutmask(in, s + 0 * BLOCK_SIZE, out, tmpoutpos, (int) mbits1); tmpoutpos += mbits1; LongBitPacking.fastpackwithoutmask(in, s + 1 * BLOCK_SIZE, out, tmpoutpos, (int) mbits2); @@ -100,30 +100,30 @@ public void headlessUncompress(long[] in, IntWrapper inpos, int inlength, int tmpinpos = inpos.get(); int s = outpos.get(); for (; s + BLOCK_SIZE * 8 - 1 < outpos.get() + outlength; s += BLOCK_SIZE * 8) { - final long mbits1 = (in[tmpinpos] >>> 56); - final long mbits2 = (in[tmpinpos] >>> 48) & 0xFF; - final long mbits3 = (in[tmpinpos] >>> 40) & 0xFF; - final long mbits4 = (in[tmpinpos] >>> 32) & 0xFF; - final long mbits5 = (in[tmpinpos] >>> 24) & 0xFF; - final long mbits6 = (in[tmpinpos] >>> 16) & 0xFF; - final long mbits7 = (in[tmpinpos] >>> 8) & 0xFF; - final long mbits8 = (in[tmpinpos]) & 0xFF; + final int mbits1 = (int) ((in[tmpinpos] >>> 56)); + final int mbits2 = (int) ((in[tmpinpos] >>> 48) & 0xFF); + final int mbits3 = (int) ((in[tmpinpos] >>> 40) & 0xFF); + final int mbits4 = (int) ((in[tmpinpos] >>> 32) & 0xFF); + final int mbits5 = (int) ((in[tmpinpos] >>> 24) & 0xFF); + final int mbits6 = (int) ((in[tmpinpos] >>> 16) & 0xFF); + final int mbits7 = (int) ((in[tmpinpos] >>> 8) & 0xFF); + final int mbits8 = (int) ((in[tmpinpos]) & 0xFF); ++tmpinpos; - LongBitPacking.fastunpack(in, tmpinpos, out, s + 0 * BLOCK_SIZE, (int) mbits1); + LongBitPacking.fastunpack(in, tmpinpos, out, s + 0 * BLOCK_SIZE, mbits1); tmpinpos += mbits1; - LongBitPacking.fastunpack(in, tmpinpos, out, s + 1 * BLOCK_SIZE, (int) mbits2); + LongBitPacking.fastunpack(in, tmpinpos, out, s + 1 * BLOCK_SIZE, mbits2); tmpinpos += mbits2; - LongBitPacking.fastunpack(in, tmpinpos, out, s + 2 * BLOCK_SIZE, (int) mbits3); + LongBitPacking.fastunpack(in, tmpinpos, out, s + 2 * BLOCK_SIZE, mbits3); tmpinpos += mbits3; - LongBitPacking.fastunpack(in, tmpinpos, out, s + 3 * BLOCK_SIZE, (int) mbits4); + LongBitPacking.fastunpack(in, tmpinpos, out, s + 3 * BLOCK_SIZE, mbits4); tmpinpos += mbits4; - LongBitPacking.fastunpack(in, tmpinpos, out, s + 4 * BLOCK_SIZE, (int) mbits5); + LongBitPacking.fastunpack(in, tmpinpos, out, s + 4 * BLOCK_SIZE, mbits5); tmpinpos += mbits5; - LongBitPacking.fastunpack(in, tmpinpos, out, s + 5 * BLOCK_SIZE, (int) mbits6); + LongBitPacking.fastunpack(in, tmpinpos, out, s + 5 * BLOCK_SIZE, mbits6); tmpinpos += mbits6; - LongBitPacking.fastunpack(in, tmpinpos, out, s + 6 * BLOCK_SIZE, (int) mbits7); + LongBitPacking.fastunpack(in, tmpinpos, out, s + 6 * BLOCK_SIZE, mbits7); tmpinpos += mbits7; - LongBitPacking.fastunpack(in, tmpinpos, out, s + 7 * BLOCK_SIZE, (int) mbits8); + LongBitPacking.fastunpack(in, tmpinpos, out, s + 7 * BLOCK_SIZE, mbits8); tmpinpos += mbits8; } for (; s < outpos.get() + outlength; s += BLOCK_SIZE ) { From 6b5df2066d8d333bf60b1a69a5573373c5b84107 Mon Sep 17 00:00:00 2001 From: LGTM Migrator Date: Wed, 30 Nov 2022 10:31:07 +0000 Subject: [PATCH 320/412] Add CodeQL workflow for GitHub code scanning --- .github/workflows/codeql.yml | 41 ++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 .github/workflows/codeql.yml diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 0000000..ab99519 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,41 @@ +name: "CodeQL" + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + schedule: + - cron: "49 16 * * 6" + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ java ] + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + queries: +security-and-quality + + - name: Autobuild + uses: github/codeql-action/autobuild@v2 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 + with: + category: "/language:${{ matrix.language }}" From 56f86a6c3a903735aaa410a5a9d826b3df4964d3 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Sat, 11 Mar 2023 13:14:20 -0500 Subject: [PATCH 321/412] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f629b5e..89afe78 100644 --- a/README.md +++ b/README.md @@ -222,6 +222,7 @@ He also posted his slides online: http://www.slideshare.net/ikhtearSharif/ikhtea Other recommended libraries ----------------------------- +* Fast integer compression in Go: https://github.com/ronanh/intcomp * Encoding: Integer Compression Libraries for Go https://github.com/zhenjl/encoding * CSharpFastPFOR: A C# integer compression library https://github.com/Genbox/CSharpFastPFOR * TurboPFor is a C library that offers lots of interesting optimizations and Java wrappers. Well worth checking! (Uses a GPL license.) https://github.com/powturbo/TurboPFor From 0ecdda9e431da96d044b5773ec13eee9f4e9d2ed Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Thu, 13 Jul 2023 14:32:23 -0400 Subject: [PATCH 322/412] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 89afe78..84f07cb 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ JavaFastPFOR: A simple integer compression library in Java ========================================================== [![][maven img]][maven] [![][license img]][license] [![docs-badge][]][docs] -[![Code Quality: Cpp](https://img.shields.io/lgtm/grade/java/g/lemire/JavaFastPFOR.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/lemire/JavaFastPFOR/context:java) [![Java CI](https://github.com/lemire/JavaFastPFOR/actions/workflows/basic.yml/badge.svg)](https://github.com/lemire/JavaFastPFOR/actions/workflows/basic.yml) From 6e4daafa827e4e8048753b2b63da7b28c66b9153 Mon Sep 17 00:00:00 2001 From: Benoit Lacelle Date: Wed, 28 Feb 2024 20:21:57 +0400 Subject: [PATCH 323/412] Polish --- .../integercompression/SkippableIntegerCODEC.java | 11 +++++++---- .../me/lemire/integercompression/VariableByte.java | 4 ++-- .../me/lemire/longcompression/LongCompressor.java | 5 ++--- .../me/lemire/longcompression/LongVariableByte.java | 6 ++---- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/SkippableIntegerCODEC.java b/src/main/java/me/lemire/integercompression/SkippableIntegerCODEC.java index 0b6e825..31771d6 100644 --- a/src/main/java/me/lemire/integercompression/SkippableIntegerCODEC.java +++ b/src/main/java/me/lemire/integercompression/SkippableIntegerCODEC.java @@ -10,10 +10,10 @@ /** * Interface describing a standard CODEC to compress integers. This is a - * variation on the IntegerCODEC interface meant to be used for head access. + * variation on the IntegerCODEC interface meant to be used for partial reads. * - * The main difference is that we must specify the number of integers we wish to - * decode. This information should be stored elsewhere. + * The main difference is that you must specify the number of integers you wish to + * uncompress. This information should be stored elsewhere. * * This interface was designed by the Terrier team for their search engine. * @@ -29,6 +29,9 @@ public interface SkippableIntegerCODEC { * inpos will be incremented by 12 while outpos will be incremented by 3. We * use IntWrapper to pass the values by reference. * + * Implementation note: contrary to {@link IntegerCODEC#compress}, + * this may skip writing information about the number of encoded integers. + * * @param in * input array * @param inpos @@ -60,7 +63,7 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out * @param outpos * where to start writing the uncompressed output in out * @param num - * number of integers we want to decode, the actual number of integers decoded can be less + * number of integers we want to decode. May be less than the actual number of compressed integers */ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num); diff --git a/src/main/java/me/lemire/integercompression/VariableByte.java b/src/main/java/me/lemire/integercompression/VariableByte.java index 1e28537..92cfaeb 100644 --- a/src/main/java/me/lemire/integercompression/VariableByte.java +++ b/src/main/java/me/lemire/integercompression/VariableByte.java @@ -126,7 +126,7 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, s += 8; // Shift to next integer if s==32 p += s>>5; - // cycle from 32 to 0 + // cycle from 31 to 0 s = s & 31; v += ((c & 127) << shift); if ((c & 128) == 128) { @@ -194,7 +194,7 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] o s += 8; // Shift to next integer if s==32 p += s>>5; - // cycle from 32 to 0 + // cycle from 31 to 0 s = s & 31; v += ((c & 127) << shift); if ((c & 128) == 128) { diff --git a/src/main/java/me/lemire/longcompression/LongCompressor.java b/src/main/java/me/lemire/longcompression/LongCompressor.java index a140911..a2c79fd 100644 --- a/src/main/java/me/lemire/longcompression/LongCompressor.java +++ b/src/main/java/me/lemire/longcompression/LongCompressor.java @@ -13,8 +13,8 @@ */ public class LongCompressor { - SkippableLongCODEC codec; + /** * Constructor wrapping a codec. * @@ -48,8 +48,7 @@ public long[] compress(long[] input) { codec.headlessCompress(input, new IntWrapper(0), input.length, compressed, outpos); } catch (IndexOutOfBoundsException ioebe) { - throw new - UncompressibleInputException("Your input is too poorly compressible " + throw new UncompressibleInputException("Your input is too poorly compressible " + "with the current codec : "+codec); } compressed = Arrays.copyOf(compressed,outpos.intValue()); diff --git a/src/main/java/me/lemire/longcompression/LongVariableByte.java b/src/main/java/me/lemire/longcompression/LongVariableByte.java index 1be4494..e1f56df 100644 --- a/src/main/java/me/lemire/longcompression/LongVariableByte.java +++ b/src/main/java/me/lemire/longcompression/LongVariableByte.java @@ -187,7 +187,6 @@ public void compress(long[] in, IntWrapper inpos, int inlength, byte[] out, out[outpostmp++] = (byte) extract7bits(7, val); out[outpostmp++] = (byte) (extract7bitsmaskless(8, (val)) | (1 << 7)); } else { - // System.out.println(LongUtil.longToBinaryWithLeading(val)); out[outpostmp++] = (byte) extract7bits(0, val); out[outpostmp++] = (byte) extract7bits(1, val); out[outpostmp++] = (byte) extract7bits(2, val); @@ -220,7 +219,7 @@ public void uncompress(long[] in, IntWrapper inpos, int inlength, long[] out, s += 8; // Shift to next long if s==64 p += s>>6; - // Cycle from 64 to 0 + // Cycle from 63 to 0 s = s & 63; v += ((c & 127) << shift); if ((c & 128) == 128) { @@ -309,13 +308,12 @@ public void headlessUncompress(long[] in, IntWrapper inpos, int inlength, long[] int finaloutpos = num + tmpoutpos; for (long v = 0, shift = 0; tmpoutpos < finaloutpos;) { val = in[p]; - // System.out.println(longToBinaryWithLeading(val)); long c = val >>> s; // Shift to next byte s += 8; // Shift to next long if s == 64 p += s>>6; - // Cycle from 64 to 0 + // Cycle from 63 to 0 s = s & 63; v += ((c & 127) << shift); if ((c & 128) == 128) { From 867e9579e5801f4f7a1ace21ceb032e2f96b5328 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 28 Feb 2024 14:59:56 -0500 Subject: [PATCH 324/412] updating --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index a960b2c..ba1fca5 100644 --- a/pom.xml +++ b/pom.xml @@ -69,10 +69,10 @@ org.apache.maven.plugins maven-compiler-plugin - 3.8.0 + 3.12.1 - 11 - 11 + 17 + 17 From 43cb373522e98137688b4746120dd427e8b073c1 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 28 Feb 2024 15:03:45 -0500 Subject: [PATCH 325/412] adding long compression --- src/main/java/module-info.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index d2a749c..d254c12 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -5,5 +5,6 @@ // This is currently only for advanced users: // requires jdk.incubator.vector; exports me.lemire.integercompression; - exports me.lemire.integercompression.vector; + exports me.lemire.longcompression; + // exports me.lemire.integercompression.vector; } From f3e7857a144981ad5e82e742441915900b9b5386 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 28 Feb 2024 15:04:26 -0500 Subject: [PATCH 326/412] [maven-release-plugin] prepare release JavaFastPFOR-0.2.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ba1fca5..3db7c2f 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.1.13-SNAPSHOT + 0.2.0 jar 1.7 From 2f32b0c628373a078cb3e22fa81941522dcb923c Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 28 Feb 2024 15:04:28 -0500 Subject: [PATCH 327/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3db7c2f..a3c47da 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.2.0 + 0.2.1-SNAPSHOT jar 1.7 From 78afe707559f603ea63f582dd19c60f703ea331a Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 28 Feb 2024 15:07:05 -0500 Subject: [PATCH 328/412] Update basic.yml --- .github/workflows/basic.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index cb3e3e8..4688fa2 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -8,11 +8,11 @@ jobs: strategy: fail-fast: false matrix: - java: [ 11, 16 ] + java: [ 17, 21 ] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4.1.1 - name: Set up JDK - uses: actions/setup-java@v2.5.0 + uses: actions/setup-java@v4.1.0 with: java-version: ${{ matrix.java }} distribution: 'adopt' @@ -21,4 +21,4 @@ jobs: - name: Build example run: javac -cp target/classes/:. example.java - name: Run example - run: java -cp target/classes/:. example \ No newline at end of file + run: java -cp target/classes/:. example From 022682f83f4044e4293003178c36e4322c970bd1 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 28 Feb 2024 15:08:24 -0500 Subject: [PATCH 329/412] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 84f07cb..5d3fc30 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ the following code in your pom.xml file: me.lemire.integercompression JavaFastPFOR - [0.1,) + [0.2,) ``` From c99e15d39d730e2ac45232d0c7608eaa1afba05d Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 28 Feb 2024 15:10:22 -0500 Subject: [PATCH 330/412] bumping javadoc --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a3c47da..5237403 100644 --- a/pom.xml +++ b/pom.xml @@ -138,7 +138,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.4.1 + 3.6.3 me.lemire.integercompression.vector;com.kamikaze.pfordelta:me.lemire.integercompression.benchmarktools From 53a53073425c934a54ec78a3988b57b7ec185132 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 28 Feb 2024 15:18:30 -0500 Subject: [PATCH 331/412] bump --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 5237403..7fbfc6d 100644 --- a/pom.xml +++ b/pom.xml @@ -5,8 +5,8 @@ 0.2.1-SNAPSHOT jar - 1.7 - 1.7 + 1.8 + 1.8 UTF-8 From bb8318aaa820e17e6d0c8958a85709ab0cd36c7a Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 28 Feb 2024 15:23:53 -0500 Subject: [PATCH 332/412] Delete .github/workflows/codeql.yml --- .github/workflows/codeql.yml | 41 ------------------------------------ 1 file changed, 41 deletions(-) delete mode 100644 .github/workflows/codeql.yml diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml deleted file mode 100644 index ab99519..0000000 --- a/.github/workflows/codeql.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: "CodeQL" - -on: - push: - branches: [ "master" ] - pull_request: - branches: [ "master" ] - schedule: - - cron: "49 16 * * 6" - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - - strategy: - fail-fast: false - matrix: - language: [ java ] - - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Initialize CodeQL - uses: github/codeql-action/init@v2 - with: - languages: ${{ matrix.language }} - queries: +security-and-quality - - - name: Autobuild - uses: github/codeql-action/autobuild@v2 - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 - with: - category: "/language:${{ matrix.language }}" From 7412c29c667234f45accaf87347aef719c9b2c67 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Sun, 9 Jun 2024 10:18:34 -0400 Subject: [PATCH 333/412] [maven-release-plugin] prepare release JavaFastPFOR-0.2.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7fbfc6d..7dc9678 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.2.1-SNAPSHOT + 0.2.1 jar 1.8 From d75c85f796d6b955f18c5fb0dbc295ffd28fe353 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Sun, 9 Jun 2024 10:18:37 -0400 Subject: [PATCH 334/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7dc9678..2587c46 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.2.1 + 0.2.2-SNAPSHOT jar 1.8 From 82a4d19820d000e62952ae84b37268497ec16deb Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 19 Jun 2024 10:43:44 -0400 Subject: [PATCH 335/412] minor fixes --- README.md | 6 +- .../benchmarkresults_haswell_18sept2014.txt | 414 +- .../benchmarkresults_icore7_10may2013.txt | 288 +- ...benchmarkresults_icore7_12november2013.txt | 414 +- ...rkresults_skippable_haswell_18sept2014.txt | 318 +- pom.xml | 45 +- .../integercompression/GroupSimple9.java | 7072 ++++++++--------- .../me/lemire/integercompression/S16.java | 372 +- .../java/me/lemire/integercompression/S9.java | 348 +- .../lemire/integercompression/Simple16.java | 336 +- .../me/lemire/integercompression/Simple9.java | 530 +- .../SkippableComposition.java | 2 +- .../UncompressibleInputException.java | 16 +- .../me/lemire/integercompression/Util.java | 14 +- .../benchmarktools/Benchmark.java | 6 +- .../benchmarktools/BenchmarkSkippable.java | 6 +- .../differential/IntegratedIntCompressor.java | 12 +- .../SkippableIntegratedComposition.java | 2 +- .../lemire/longcompression/ByteLongCODEC.java | 2 +- .../longcompression/LongAs2IntsCodec.java | 338 +- .../me/lemire/longcompression/LongCODEC.java | 4 +- .../longcompression/LongComposition.java | 4 +- .../lemire/longcompression/LongJustCopy.java | 8 +- .../me/lemire/longcompression/LongUtil.java | 6 +- .../longcompression/LongVariableByte.java | 2 +- .../SkippableLongComposition.java | 2 +- .../differential/LongDelta.java | 6 +- .../lemire/integercompression/AdhocTest.java | 125 +- .../lemire/integercompression/BasicTest.java | 52 +- .../integercompression/ByteBasicTest.java | 44 +- .../integercompression/ExampleTest.java | 602 +- .../integercompression/ResourcedTest.java | 112 +- .../SkippableBasicTest.java | 2 +- .../lemire/longcompression/LongBasicTest.java | 124 +- .../lemire/longcompression/LongTestUtils.java | 6 +- .../SkippableLongBasicTest.java | 18 +- .../longcompression/TestLongAs2IntsCodec.java | 168 +- .../longcompression/TestLongVariableByte.java | 162 +- .../synth/LongClusteredDataGenerator.java | 6 +- .../synth/LongUniformDataGenerator.java | 22 +- 40 files changed, 6041 insertions(+), 5975 deletions(-) diff --git a/README.md b/README.md index f629b5e..535e452 100644 --- a/README.md +++ b/README.md @@ -82,9 +82,9 @@ the following code in your pom.xml file: ```xml - me.lemire.integercompression - JavaFastPFOR - [0.1,) + me.lemire.integercompression + JavaFastPFOR + [0.1,) ``` diff --git a/benchmarkresults/benchmarkresults_haswell_18sept2014.txt b/benchmarkresults/benchmarkresults_haswell_18sept2014.txt index 43fa98b..a501d5d 100644 --- a/benchmarkresults/benchmarkresults_haswell_18sept2014.txt +++ b/benchmarkresults/benchmarkresults_haswell_18sept2014.txt @@ -1,7 +1,7 @@ # benchmark based on the ClusterData model from: -# Vo Ngoc Anh and Alistair Moffat. -# Index compression using 64-bit words. -# Softw. Pract. Exper.40, 2 (February 2010), 131-147. +# Vo Ngoc Anh and Alistair Moffat. +# Index compression using 64-bit words. +# Softw. Pract. Exper.40, 2 (February 2010), 131-147. # Results will be written into a CSV file: benchmark-20140918T011257.csv @@ -10,852 +10,852 @@ # generating random data... ok. # FastPFOR + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 2.56 246 1061 + 2.56 246 1061 # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 3.21 66 275 + 3.21 66 275 # IntegratedBinaryPacking + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 2.96 838 1679 + 2.96 838 1679 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1276 1805 + 32.00 1276 1805 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.00 490 509 + 8.00 490 509 # IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.00 582 774 + 8.00 582 774 # BinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 2.96 765 1193 + 2.96 765 1193 # NewPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 2.88 139 896 + 2.88 139 896 # NewPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 2.90 166 905 + 2.90 166 905 # NewPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 2.88 139 898 + 2.88 139 898 # OptPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 2.87 25 938 + 2.87 25 938 # OptPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 2.90 29 960 + 2.90 29 960 # OptPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 2.87 25 882 + 2.87 25 882 # IntegratedFastPFOR + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 2.63 274 1015 + 2.63 274 1015 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 2.83 280 771 + 2.83 280 771 # XorBinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 2.84 444 837 + 2.84 444 837 # DeltaZigzagBinaryPacking + DeltaZigzagVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.27 498 652 + 3.27 498 652 # sparsity 2 # generating random data... # generating random data... ok. # FastPFOR + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.51 244 1048 + 3.51 244 1048 # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 4.18 55 247 + 4.18 55 247 # IntegratedBinaryPacking + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.93 862 1611 + 3.93 862 1611 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1286 1816 + 32.00 1286 1816 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.01 486 508 + 8.01 486 508 # IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.01 575 763 + 8.01 575 763 # BinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.93 774 1159 + 3.93 774 1159 # NewPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.83 118 865 + 3.83 118 865 # NewPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.86 141 875 + 3.86 141 875 # NewPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.83 118 867 + 3.83 118 867 # OptPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.82 18 881 + 3.82 18 881 # OptPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.85 22 887 + 3.85 22 887 # OptPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.82 18 838 + 3.82 18 838 # IntegratedFastPFOR + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.58 273 990 + 3.58 273 990 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 3.82 201 656 + 3.82 201 656 # XorBinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.90 442 819 + 3.90 442 819 # DeltaZigzagBinaryPacking + DeltaZigzagVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.50 494 640 + 4.50 494 640 # sparsity 3 # generating random data... # generating random data... ok. # FastPFOR + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.28 244 1030 + 4.28 244 1030 # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 4.95 51 247 + 4.95 51 247 # IntegratedBinaryPacking + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.71 850 1577 + 4.71 850 1577 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1252 1769 + 32.00 1252 1769 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.02 478 504 + 8.02 478 504 # IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.02 573 762 + 8.02 573 762 # BinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.71 770 1139 + 4.71 770 1139 # NewPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.60 107 850 + 4.60 107 850 # NewPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.63 127 863 + 4.63 127 863 # NewPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.60 107 853 + 4.60 107 853 # OptPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.59 14 865 + 4.59 14 865 # OptPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.62 18 882 + 4.62 18 882 # OptPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.59 14 844 + 4.59 14 844 # IntegratedFastPFOR + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.34 268 969 + 4.34 268 969 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 4.72 170 610 + 4.72 170 610 # XorBinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.68 434 783 + 4.68 434 783 # DeltaZigzagBinaryPacking + DeltaZigzagVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.33 472 624 + 5.33 472 624 # sparsity 4 # generating random data... # generating random data... ok. # FastPFOR + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.03 239 1004 + 5.03 239 1004 # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 5.73 47 251 + 5.73 47 251 # IntegratedBinaryPacking + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.48 846 1556 + 5.48 846 1556 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1274 1799 + 32.00 1274 1799 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.12 439 486 + 8.12 439 486 # IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.12 537 715 + 8.12 537 715 # BinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.48 769 1134 + 5.48 769 1134 # NewPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.36 95 817 + 5.36 95 817 # NewPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.39 115 838 + 5.39 115 838 # NewPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.36 96 827 + 5.36 96 827 # OptPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.34 12 842 + 5.34 12 842 # OptPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.37 16 871 + 5.37 16 871 # OptPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.34 12 803 + 5.34 12 803 # IntegratedFastPFOR + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.09 268 963 + 5.09 268 963 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 5.57 150 587 + 5.57 150 587 # XorBinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.47 432 800 + 5.47 432 800 # DeltaZigzagBinaryPacking + DeltaZigzagVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.16 491 635 + 6.16 491 635 # sparsity 5 # generating random data... # generating random data... ok. # FastPFOR + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.00 236 999 + 6.00 236 999 # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 6.70 43 242 + 6.70 43 242 # IntegratedBinaryPacking + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.45 863 1584 + 6.45 863 1584 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1236 1792 + 32.00 1236 1792 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.40 369 452 + 8.40 369 452 # IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.40 486 617 + 8.40 486 617 # BinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.45 777 1132 + 6.45 777 1132 # NewPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.33 86 808 + 6.33 86 808 # NewPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.36 103 828 + 6.36 103 828 # NewPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.33 86 813 + 6.33 86 813 # OptPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.31 9 825 + 6.31 9 825 # OptPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.34 13 858 + 6.34 13 858 # OptPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.31 9 819 + 6.31 9 819 # IntegratedFastPFOR + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.06 265 945 + 6.06 265 945 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 6.65 139 546 + 6.65 139 546 # XorBinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.45 442 804 + 6.45 442 804 # DeltaZigzagBinaryPacking + DeltaZigzagVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.18 493 635 + 7.18 493 635 # sparsity 6 # generating random data... # generating random data... ok. # FastPFOR + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.76 238 998 + 6.76 238 998 # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 7.45 42 251 + 7.45 42 251 # IntegratedBinaryPacking + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.20 854 1525 + 7.20 854 1525 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1177 1663 + 32.00 1177 1663 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.10 259 362 + 9.10 259 362 # IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.10 380 450 + 9.10 380 450 # BinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.20 718 1098 + 7.20 718 1098 # NewPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.08 79 786 + 7.08 79 786 # NewPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.11 95 821 + 7.11 95 821 # NewPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.08 81 814 + 7.08 81 814 # OptPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.06 8 836 + 7.06 8 836 # OptPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.09 11 860 + 7.09 11 860 # OptPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.06 8 822 + 7.06 8 822 # IntegratedFastPFOR + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.81 268 962 + 6.81 268 962 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 7.56 129 509 + 7.56 129 509 # XorBinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.19 433 789 + 7.19 433 789 # DeltaZigzagBinaryPacking + DeltaZigzagVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.93 491 632 + 7.93 491 632 # sparsity 7 # generating random data... # generating random data... ok. # FastPFOR + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.05 236 985 + 8.05 236 985 # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 8.75 39 247 + 8.75 39 247 # IntegratedBinaryPacking + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.50 861 1526 + 8.50 861 1526 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1279 1788 + 32.00 1279 1788 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.11 190 305 + 10.11 190 305 # IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.11 311 355 + 10.11 311 355 # BinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.50 753 1092 + 8.50 753 1092 # NewPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.37 71 792 + 8.37 71 792 # NewPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.40 83 804 + 8.40 83 804 # NewPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.37 72 805 + 8.37 72 805 # OptPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.35 7 808 + 8.35 7 808 # OptPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.38 10 835 + 8.38 10 835 # OptPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.35 7 796 + 8.35 7 796 # IntegratedFastPFOR + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.10 259 920 + 8.10 259 920 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 9.16 111 447 + 9.16 111 447 # XorBinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.52 435 784 + 8.52 435 784 # DeltaZigzagBinaryPacking + DeltaZigzagVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.32 485 622 + 9.32 485 622 # sparsity 8 # generating random data... # generating random data... ok. # FastPFOR + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.73 234 972 + 8.73 234 972 # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 9.44 37 250 + 9.44 37 250 # IntegratedBinaryPacking + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.19 848 1493 + 9.19 848 1493 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1279 1858 + 32.00 1279 1858 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.04 167 307 + 11.04 167 307 # IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.04 309 353 + 11.04 309 353 # BinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.19 751 1095 + 9.19 751 1095 # NewPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.06 67 770 + 9.06 67 770 # NewPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.09 78 781 + 9.09 78 781 # NewPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.06 68 792 + 9.06 68 792 # OptPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.03 6 795 + 9.03 6 795 # OptPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.07 9 824 + 9.07 9 824 # OptPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.03 6 787 + 9.03 6 787 # IntegratedFastPFOR + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.78 266 936 + 8.78 266 936 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 10.34 101 427 + 10.34 101 427 # XorBinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.21 437 794 + 9.21 437 794 # DeltaZigzagBinaryPacking + DeltaZigzagVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.01 488 626 + 10.01 488 626 # sparsity 9 # generating random data... # generating random data... ok. # FastPFOR + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.75 234 980 + 9.75 234 980 # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 10.48 36 242 + 10.48 36 242 # IntegratedBinaryPacking + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.21 844 1474 + 10.21 844 1474 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1262 1795 + 32.00 1262 1795 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.18 145 300 + 12.18 145 300 # IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.18 302 340 + 12.18 302 340 # BinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.21 761 1096 + 10.21 761 1096 # NewPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.08 63 786 + 10.08 63 786 # NewPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.12 72 752 + 10.12 72 752 # NewPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.08 63 783 + 10.08 63 783 # OptPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.05 6 787 + 10.05 6 787 # OptPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.09 8 798 + 10.09 8 798 # OptPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.05 6 779 + 10.05 6 779 # IntegratedFastPFOR + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.80 264 930 + 9.80 264 930 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 11.77 92 410 + 11.77 92 410 # XorBinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.23 438 789 + 10.23 438 789 # DeltaZigzagBinaryPacking + DeltaZigzagVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.05 486 624 + 11.05 486 624 # sparsity 10 # generating random data... # generating random data... ok. # FastPFOR + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.73 235 979 + 10.73 235 979 # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 11.46 35 239 + 11.46 35 239 # IntegratedBinaryPacking + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.18 840 1456 + 11.18 840 1456 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1248 1746 + 32.00 1248 1746 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.14 135 312 + 13.14 135 312 # IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.14 309 354 + 13.14 309 354 # BinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.18 761 1097 + 11.18 761 1097 # NewPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.09 59 802 + 11.09 59 802 # NewPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.13 69 814 + 11.13 69 814 # NewPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.09 59 771 + 11.09 59 771 # OptPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.04 5 783 + 11.04 5 783 # OptPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.08 8 816 + 11.08 8 816 # OptPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.04 5 776 + 11.04 5 776 # IntegratedFastPFOR + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.78 265 934 + 10.78 265 934 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 12.98 89 415 + 12.98 89 415 # XorBinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.20 436 787 + 11.20 436 787 # DeltaZigzagBinaryPacking + DeltaZigzagVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.02 483 620 + 12.02 483 620 # sparsity 11 # generating random data... # generating random data... ok. # FastPFOR + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.79 232 950 + 11.79 232 950 # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 12.68 34 256 + 12.68 34 256 # IntegratedBinaryPacking + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.23 842 1450 + 12.23 842 1450 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1292 1826 + 32.00 1292 1826 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 14.00 127 324 + 14.00 127 324 # IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 14.00 308 369 + 14.00 308 369 # BinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.23 760 1092 + 12.23 760 1092 # NewPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.35 56 795 + 12.35 56 795 # NewPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.38 65 829 + 12.38 65 829 # NewPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.35 57 822 + 12.35 57 822 # OptPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.13 5 706 + 12.13 5 706 # OptPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.17 7 750 + 12.17 7 750 # OptPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.13 5 712 + 12.13 5 712 # IntegratedFastPFOR + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.83 261 919 + 11.83 261 919 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 14.17 85 401 + 14.17 85 401 # XorBinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.25 436 781 + 12.25 436 781 # DeltaZigzagBinaryPacking + DeltaZigzagVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.08 489 623 + 13.08 489 623 # sparsity 12 # generating random data... # generating random data... ok. # FastPFOR + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.70 226 932 + 12.70 226 932 # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 13.76 34 261 + 13.76 34 261 # IntegratedBinaryPacking + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.16 849 1453 + 13.16 849 1453 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1208 1804 + 32.00 1208 1804 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 14.84 117 307 + 14.84 117 307 # IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 14.84 260 352 + 14.84 260 352 # BinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.16 762 1095 + 13.16 762 1095 # NewPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.46 56 899 + 13.46 56 899 # NewPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.48 63 915 + 13.48 63 915 # NewPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.46 56 897 + 13.46 56 897 # OptPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.20 5 681 + 13.20 5 681 # OptPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.24 7 735 + 13.24 7 735 # OptPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.20 5 699 + 13.20 5 699 # IntegratedFastPFOR + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.75 260 914 + 12.75 260 914 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 15.51 80 359 + 15.51 80 359 # XorBinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.18 435 781 + 13.18 435 781 # DeltaZigzagBinaryPacking + DeltaZigzagVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 14.00 489 626 + 14.00 489 626 Results were written into a CSV file: benchmark-20140918T011257.csv diff --git a/benchmarkresults/benchmarkresults_icore7_10may2013.txt b/benchmarkresults/benchmarkresults_icore7_10may2013.txt index 5b776fb..d10579e 100644 --- a/benchmarkresults/benchmarkresults_icore7_10may2013.txt +++ b/benchmarkresults/benchmarkresults_icore7_10may2013.txt @@ -3,610 +3,610 @@ # generating random data... ok. # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 3.34 51 262 + 3.34 51 262 # me.lemire.integercompression.IntegratedBinaryPacking+me.lemire.integercompression.IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.09 639 1183 + 3.09 639 1183 # me.lemire.integercompression.JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1151 1468 + 32.00 1151 1468 # me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.00 199 299 + 8.00 199 299 # me.lemire.integercompression.IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.00 148 339 + 8.00 148 339 # me.lemire.integercompression.BinaryPacking+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.09 613 920 + 3.09 613 920 # me.lemire.integercompression.NewPFD+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.02 143 721 + 3.02 143 721 # me.lemire.integercompression.NewPFDS9+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.05 164 705 + 3.05 164 705 # me.lemire.integercompression.OptPFD+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.01 26 790 + 3.01 26 790 # me.lemire.integercompression.OptPFDS9+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.03 30 816 + 3.03 30 816 # me.lemire.integercompression.FastPFOR+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 2.78 226 811 + 2.78 226 811 # me.lemire.integercompression.Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 2.97 236 604 + 2.97 236 604 # sparsity 2 # generating random data... # generating random data... ok. # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 4.17 47 266 + 4.17 47 266 # me.lemire.integercompression.IntegratedBinaryPacking+me.lemire.integercompression.IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.92 672 1261 + 3.92 672 1261 # me.lemire.integercompression.JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1218 1562 + 32.00 1218 1562 # me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.00 204 290 + 8.00 204 290 # me.lemire.integercompression.IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.00 236 343 + 8.00 236 343 # me.lemire.integercompression.BinaryPacking+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.92 505 917 + 3.92 505 917 # me.lemire.integercompression.NewPFD+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.82 127 698 + 3.82 127 698 # me.lemire.integercompression.NewPFDS9+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.85 151 726 + 3.85 151 726 # me.lemire.integercompression.OptPFD+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.81 18 752 + 3.81 18 752 # me.lemire.integercompression.OptPFDS9+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.84 23 779 + 3.84 23 779 # me.lemire.integercompression.FastPFOR+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.56 228 828 + 3.56 228 828 # me.lemire.integercompression.Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 3.82 182 562 + 3.82 182 562 # sparsity 3 # generating random data... # generating random data... ok. # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 4.96 43 276 + 4.96 43 276 # me.lemire.integercompression.IntegratedBinaryPacking+me.lemire.integercompression.IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.72 662 1187 + 4.72 662 1187 # me.lemire.integercompression.JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1215 1566 + 32.00 1215 1566 # me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.02 198 286 + 8.02 198 286 # me.lemire.integercompression.IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.02 254 340 + 8.02 254 340 # me.lemire.integercompression.BinaryPacking+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.72 576 848 + 4.72 576 848 # me.lemire.integercompression.NewPFD+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.61 111 654 + 4.61 111 654 # me.lemire.integercompression.NewPFDS9+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.64 129 699 + 4.64 129 699 # me.lemire.integercompression.OptPFD+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.60 14 732 + 4.60 14 732 # me.lemire.integercompression.OptPFDS9+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.63 18 761 + 4.63 18 761 # me.lemire.integercompression.FastPFOR+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.36 226 813 + 4.36 226 813 # me.lemire.integercompression.Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 4.76 148 511 + 4.76 148 511 # sparsity 4 # generating random data... # generating random data... ok. # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 5.97 39 270 + 5.97 39 270 # me.lemire.integercompression.IntegratedBinaryPacking+me.lemire.integercompression.IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.72 656 1148 + 5.72 656 1148 # me.lemire.integercompression.JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1212 1555 + 32.00 1212 1555 # me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.09 206 287 + 8.09 206 287 # me.lemire.integercompression.IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.09 213 334 + 8.09 213 334 # me.lemire.integercompression.BinaryPacking+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.72 626 891 + 5.72 626 891 # me.lemire.integercompression.NewPFD+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.60 105 672 + 5.60 105 672 # me.lemire.integercompression.NewPFDS9+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.63 121 701 + 5.63 121 701 # me.lemire.integercompression.OptPFD+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.58 10 667 + 5.58 10 667 # me.lemire.integercompression.OptPFDS9+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.62 14 736 + 5.62 14 736 # me.lemire.integercompression.FastPFOR+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.33 226 805 + 5.33 226 805 # me.lemire.integercompression.Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 5.86 123 464 + 5.86 123 464 # sparsity 5 # generating random data... # generating random data... ok. # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 6.49 39 262 + 6.49 39 262 # me.lemire.integercompression.IntegratedBinaryPacking+me.lemire.integercompression.IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.25 659 1121 + 6.25 659 1121 # me.lemire.integercompression.JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1154 1168 + 32.00 1154 1168 # me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.44 192 265 + 8.44 192 265 # me.lemire.integercompression.IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.44 240 297 + 8.44 240 297 # me.lemire.integercompression.BinaryPacking+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.25 631 907 + 6.25 631 907 # me.lemire.integercompression.NewPFD+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.13 101 685 + 6.13 101 685 # me.lemire.integercompression.NewPFDS9+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.16 116 714 + 6.16 116 714 # me.lemire.integercompression.OptPFD+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.11 9 708 + 6.11 9 708 # me.lemire.integercompression.OptPFDS9+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.14 13 741 + 6.14 13 741 # me.lemire.integercompression.FastPFOR+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.86 225 806 + 5.86 225 806 # me.lemire.integercompression.Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 6.44 120 442 + 6.44 120 442 # sparsity 6 # generating random data... # generating random data... ok. # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 7.64 35 269 + 7.64 35 269 # me.lemire.integercompression.IntegratedBinaryPacking+me.lemire.integercompression.IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.39 654 1111 + 7.39 654 1111 # me.lemire.integercompression.JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1207 1553 + 32.00 1207 1553 # me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.06 185 225 + 9.06 185 225 # me.lemire.integercompression.IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.06 166 248 + 9.06 166 248 # me.lemire.integercompression.BinaryPacking+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.39 620 888 + 7.39 620 888 # me.lemire.integercompression.NewPFD+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.26 91 679 + 7.26 91 679 # me.lemire.integercompression.NewPFDS9+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.30 104 704 + 7.30 104 704 # me.lemire.integercompression.OptPFD+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.24 7 704 + 7.24 7 704 # me.lemire.integercompression.OptPFDS9+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.28 10 735 + 7.28 10 735 # me.lemire.integercompression.FastPFOR+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.00 221 792 + 7.00 221 792 # me.lemire.integercompression.Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 7.76 106 393 + 7.76 106 393 # sparsity 7 # generating random data... # generating random data... ok. # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 8.66 33 266 + 8.66 33 266 # me.lemire.integercompression.IntegratedBinaryPacking+me.lemire.integercompression.IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.41 675 1165 + 8.41 675 1165 # me.lemire.integercompression.JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1210 1553 + 32.00 1210 1553 # me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.10 154 194 + 10.10 154 194 # me.lemire.integercompression.IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.10 176 207 + 10.10 176 207 # me.lemire.integercompression.BinaryPacking+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.41 628 896 + 8.41 628 896 # me.lemire.integercompression.NewPFD+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.27 84 643 + 8.27 84 643 # me.lemire.integercompression.NewPFDS9+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.31 95 685 + 8.31 95 685 # me.lemire.integercompression.OptPFD+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.25 6 693 + 8.25 6 693 # me.lemire.integercompression.OptPFDS9+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.29 9 723 + 8.29 9 723 # me.lemire.integercompression.FastPFOR+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.00 215 773 + 8.00 215 773 # me.lemire.integercompression.Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 9.10 94 357 + 9.10 94 357 # sparsity 8 # generating random data... # generating random data... ok. # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 9.52 32 241 + 9.52 32 241 # me.lemire.integercompression.IntegratedBinaryPacking+me.lemire.integercompression.IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.26 692 1194 + 9.26 692 1194 # me.lemire.integercompression.JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1208 1525 + 32.00 1208 1525 # me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.14 138 178 + 11.14 138 178 # me.lemire.integercompression.IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.14 187 190 + 11.14 187 190 # me.lemire.integercompression.BinaryPacking+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.26 647 893 + 9.26 647 893 # me.lemire.integercompression.NewPFD+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.14 79 655 + 9.14 79 655 # me.lemire.integercompression.NewPFDS9+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.18 88 684 + 9.18 88 684 # me.lemire.integercompression.OptPFD+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.11 6 680 + 9.11 6 680 # me.lemire.integercompression.OptPFDS9+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.15 8 712 + 9.15 8 712 # me.lemire.integercompression.FastPFOR+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.86 220 778 + 8.86 220 778 # me.lemire.integercompression.Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 10.39 86 330 + 10.39 86 330 # sparsity 9 # generating random data... # generating random data... ok. # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 10.46 31 253 + 10.46 31 253 # me.lemire.integercompression.IntegratedBinaryPacking+me.lemire.integercompression.IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.19 661 1122 + 10.19 661 1122 # me.lemire.integercompression.JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1210 1546 + 32.00 1210 1546 # me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.27 126 173 + 12.27 126 173 # me.lemire.integercompression.IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.27 155 181 + 12.27 155 181 # me.lemire.integercompression.BinaryPacking+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.19 617 886 + 10.19 617 886 # me.lemire.integercompression.NewPFD+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.07 73 634 + 10.07 73 634 # me.lemire.integercompression.NewPFDS9+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.11 82 669 + 10.11 82 669 # me.lemire.integercompression.OptPFD+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.04 5 663 + 10.04 5 663 # me.lemire.integercompression.OptPFDS9+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.08 7 700 + 10.08 7 700 # me.lemire.integercompression.FastPFOR+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.79 215 757 + 9.79 215 757 # me.lemire.integercompression.Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 11.79 78 325 + 11.79 78 325 # sparsity 10 # generating random data... # generating random data... ok. # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 11.13 30 243 + 11.13 30 243 # me.lemire.integercompression.IntegratedBinaryPacking+me.lemire.integercompression.IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.83 628 1028 + 10.83 628 1028 # me.lemire.integercompression.JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1167 1498 + 32.00 1167 1498 # me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.71 152 179 + 12.71 152 179 # me.lemire.integercompression.IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.71 151 187 + 12.71 151 187 # me.lemire.integercompression.BinaryPacking+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.83 389 820 + 10.83 389 820 # me.lemire.integercompression.NewPFD+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.76 72 638 + 10.76 72 638 # me.lemire.integercompression.NewPFDS9+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.79 79 683 + 10.79 79 683 # me.lemire.integercompression.OptPFD+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.69 5 655 + 10.69 5 655 # me.lemire.integercompression.OptPFDS9+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.73 7 682 + 10.73 7 682 # me.lemire.integercompression.FastPFOR+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.42 219 767 + 10.42 219 767 # me.lemire.integercompression.Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 12.49 77 332 + 12.49 77 332 # sparsity 11 # generating random data... # generating random data... ok. # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 12.38 29 254 + 12.38 29 254 # me.lemire.integercompression.IntegratedBinaryPacking+me.lemire.integercompression.IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.01 660 1112 + 12.01 660 1112 # me.lemire.integercompression.JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1142 1445 + 32.00 1142 1445 # me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.87 143 172 + 13.87 143 172 # me.lemire.integercompression.IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.87 144 178 + 13.87 144 178 # me.lemire.integercompression.BinaryPacking+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.01 582 830 + 12.01 582 830 # me.lemire.integercompression.NewPFD+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.04 64 647 + 12.04 64 647 # me.lemire.integercompression.NewPFDS9+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.08 69 649 + 12.08 69 649 # me.lemire.integercompression.OptPFD+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.91 4 637 + 11.91 4 637 # me.lemire.integercompression.OptPFDS9+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.95 7 660 + 11.95 7 660 # me.lemire.integercompression.FastPFOR+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.61 217 766 + 11.61 217 766 # me.lemire.integercompression.Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 13.96 73 313 + 13.96 73 313 # sparsity 12 # generating random data... # generating random data... ok. # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 13.57 29 265 + 13.57 29 265 # me.lemire.integercompression.IntegratedBinaryPacking+me.lemire.integercompression.IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.01 611 1012 + 13.01 611 1012 # me.lemire.integercompression.JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1215 1565 + 32.00 1215 1565 # me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 14.73 121 160 + 14.73 121 160 # me.lemire.integercompression.IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 14.73 131 166 + 14.73 131 166 # me.lemire.integercompression.BinaryPacking+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.01 603 832 + 13.01 603 832 # me.lemire.integercompression.NewPFD+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.26 68 737 + 13.26 68 737 # me.lemire.integercompression.NewPFDS9+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.29 72 761 + 13.29 72 761 # me.lemire.integercompression.OptPFD+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.06 4 591 + 13.06 4 591 # me.lemire.integercompression.OptPFDS9+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.10 6 625 + 13.10 6 625 # me.lemire.integercompression.FastPFOR+me.lemire.integercompression.VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.61 213 755 + 12.61 213 755 # me.lemire.integercompression.Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 15.38 69 281 + 15.38 69 281 diff --git a/benchmarkresults/benchmarkresults_icore7_12november2013.txt b/benchmarkresults/benchmarkresults_icore7_12november2013.txt index 07b11b3..795650e 100644 --- a/benchmarkresults/benchmarkresults_icore7_12november2013.txt +++ b/benchmarkresults/benchmarkresults_icore7_12november2013.txt @@ -10,9 +10,9 @@ Its dependencies (if any) will NOT be available to the current build. [INFO] [enforcer:enforce {execution: enforce-maven}] [INFO] [exec:java {execution: default-cli}] # benchmark based on the ClusterData model from: -# Vo Ngoc Anh and Alistair Moffat. -# Index compression using 64-bit words. -# Softw. Pract. Exper.40, 2 (February 2010), 131-147. +# Vo Ngoc Anh and Alistair Moffat. +# Index compression using 64-bit words. +# Softw. Pract. Exper.40, 2 (February 2010), 131-147. # Results will be written into a CSV file: benchmark-20131112T105209.csv @@ -21,852 +21,852 @@ Its dependencies (if any) will NOT be available to the current build. # generating random data... ok. # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 3.28 48 218 + 3.28 48 218 # IntegratedBinaryPacking + IntegratedVariableByte (Integrated) # bits per int, compress speed (mis), decompression speed (mis) - 3.03 623 1205 + 3.03 623 1205 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1154 1331 + 32.00 1154 1331 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.00 508 554 + 8.00 508 554 # IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.00 592 709 + 8.00 592 709 # BinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.03 596 900 + 3.03 596 900 # NewPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 2.95 115 701 + 2.95 115 701 # NewPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 2.98 135 726 + 2.98 135 726 # NewPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 2.95 116 726 + 2.95 116 726 # OptPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 2.94 19 761 + 2.94 19 761 # OptPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 2.97 22 767 + 2.97 22 767 # OptPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 2.94 19 765 + 2.94 19 765 # IntegratedFastPFOR + IntegratedVariableByte (Integrated) # bits per int, compress speed (mis), decompression speed (mis) - 2.71 219 797 + 2.71 219 797 # FastPFOR + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 2.71 217 813 + 2.71 217 813 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 2.90 254 599 + 2.90 254 599 # XorBinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 2.92 375 669 + 2.92 375 669 # DeltaZigzagBinaryPacking + DeltaZigzagVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.36 394 503 + 3.36 394 503 # sparsity 2 # generating random data... # generating random data... ok. # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 4.09 47 254 + 4.09 47 254 # IntegratedBinaryPacking + IntegratedVariableByte (Integrated) # bits per int, compress speed (mis), decompression speed (mis) - 3.84 636 1160 + 3.84 636 1160 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1152 1264 + 32.00 1152 1264 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.01 510 551 + 8.01 510 551 # IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.01 594 704 + 8.01 594 704 # BinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.84 602 875 + 3.84 602 875 # NewPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.74 101 673 + 3.74 101 673 # NewPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.77 117 695 + 3.77 117 695 # NewPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.74 101 694 + 3.74 101 694 # OptPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.73 15 725 + 3.73 15 725 # OptPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.76 18 741 + 3.76 18 741 # OptPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.73 15 731 + 3.73 15 731 # IntegratedFastPFOR + IntegratedVariableByte (Integrated) # bits per int, compress speed (mis), decompression speed (mis) - 3.48 215 782 + 3.48 215 782 # FastPFOR + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.48 212 789 + 3.48 212 789 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 3.72 190 530 + 3.72 190 530 # XorBinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.76 375 657 + 3.76 375 657 # DeltaZigzagBinaryPacking + DeltaZigzagVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.32 392 499 + 4.32 392 499 # sparsity 3 # generating random data... # generating random data... ok. # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 5.03 42 250 + 5.03 42 250 # IntegratedBinaryPacking + IntegratedVariableByte (Integrated) # bits per int, compress speed (mis), decompression speed (mis) - 4.77 643 1141 + 4.77 643 1141 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1149 1337 + 32.00 1149 1337 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.02 506 547 + 8.02 506 547 # IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.02 590 698 + 8.02 590 698 # BinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.77 619 904 + 4.77 619 904 # NewPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.66 89 640 + 4.66 89 640 # NewPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.69 103 672 + 4.69 103 672 # NewPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.66 89 668 + 4.66 89 668 # OptPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.64 12 700 + 4.64 12 700 # OptPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.68 14 712 + 4.68 14 712 # OptPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.64 12 704 + 4.64 12 704 # IntegratedFastPFOR + IntegratedVariableByte (Integrated) # bits per int, compress speed (mis), decompression speed (mis) - 4.39 212 762 + 4.39 212 762 # FastPFOR + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.39 209 763 + 4.39 209 763 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 4.81 146 480 + 4.81 146 480 # XorBinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.75 373 646 + 4.75 373 646 # DeltaZigzagBinaryPacking + DeltaZigzagVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.40 386 496 + 5.40 386 496 # sparsity 4 # generating random data... # generating random data... ok. # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 5.77 39 245 + 5.77 39 245 # IntegratedBinaryPacking + IntegratedVariableByte (Integrated) # bits per int, compress speed (mis), decompression speed (mis) - 5.53 629 1095 + 5.53 629 1095 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1148 1332 + 32.00 1148 1332 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.11 482 522 + 8.11 482 522 # IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.11 557 655 + 8.11 557 655 # BinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.53 617 889 + 5.53 617 889 # NewPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.42 82 659 + 5.42 82 659 # NewPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.45 94 684 + 5.45 94 684 # NewPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.42 82 686 + 5.42 82 686 # OptPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.40 10 695 + 5.40 10 695 # OptPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.43 12 715 + 5.43 12 715 # OptPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.40 10 705 + 5.40 10 705 # IntegratedFastPFOR + IntegratedVariableByte (Integrated) # bits per int, compress speed (mis), decompression speed (mis) - 5.16 214 776 + 5.16 214 776 # FastPFOR + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.16 211 780 + 5.16 211 780 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 5.66 128 457 + 5.66 128 457 # XorBinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.53 370 645 + 5.53 370 645 # DeltaZigzagBinaryPacking + DeltaZigzagVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.23 389 493 + 6.23 389 493 # sparsity 5 # generating random data... # generating random data... ok. # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 6.57 37 248 + 6.57 37 248 # IntegratedBinaryPacking + IntegratedVariableByte (Integrated) # bits per int, compress speed (mis), decompression speed (mis) - 6.32 640 1113 + 6.32 640 1113 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1150 1349 + 32.00 1150 1349 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.41 416 456 + 8.41 416 456 # IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.41 473 548 + 8.41 473 548 # BinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.32 622 898 + 6.32 622 898 # NewPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.20 75 643 + 6.20 75 643 # NewPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.23 86 668 + 6.23 86 668 # NewPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.20 75 666 + 6.20 75 666 # OptPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.18 8 690 + 6.18 8 690 # OptPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.21 11 705 + 6.21 11 705 # OptPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.18 8 697 + 6.18 8 697 # IntegratedFastPFOR + IntegratedVariableByte (Integrated) # bits per int, compress speed (mis), decompression speed (mis) - 5.93 211 741 + 5.93 211 741 # FastPFOR + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.93 208 772 + 5.93 208 772 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 6.51 118 426 + 6.51 118 426 # XorBinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.32 374 639 + 6.32 374 639 # DeltaZigzagBinaryPacking + DeltaZigzagVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.05 390 492 + 7.05 390 492 # sparsity 6 # generating random data... # generating random data... ok. # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 7.73 35 242 + 7.73 35 242 # IntegratedBinaryPacking + IntegratedVariableByte (Integrated) # bits per int, compress speed (mis), decompression speed (mis) - 7.48 630 1071 + 7.48 630 1071 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1143 1350 + 32.00 1143 1350 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.04 328 365 + 9.04 328 365 # IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.04 365 415 + 9.04 365 415 # BinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.48 620 882 + 7.48 620 882 # NewPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.36 67 641 + 7.36 67 641 # NewPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.39 76 668 + 7.39 76 668 # NewPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.36 67 667 + 7.36 67 667 # OptPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.33 7 679 + 7.33 7 679 # OptPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.37 9 695 + 7.37 9 695 # OptPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.33 7 686 + 7.33 7 686 # IntegratedFastPFOR + IntegratedVariableByte (Integrated) # bits per int, compress speed (mis), decompression speed (mis) - 7.09 211 749 + 7.09 211 749 # FastPFOR + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.09 208 764 + 7.09 208 764 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 7.88 101 383 + 7.88 101 383 # XorBinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.49 372 630 + 7.49 372 630 # DeltaZigzagBinaryPacking + DeltaZigzagVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.27 389 489 + 8.27 389 489 # sparsity 7 # generating random data... # generating random data... ok. # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 8.46 33 244 + 8.46 33 244 # IntegratedBinaryPacking + IntegratedVariableByte (Integrated) # bits per int, compress speed (mis), decompression speed (mis) - 8.21 628 1052 + 8.21 628 1052 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1148 1334 + 32.00 1148 1334 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.01 257 290 + 10.01 257 290 # IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.01 284 315 + 10.01 284 315 # BinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.21 612 859 + 8.21 612 859 # NewPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.08 63 626 + 8.08 63 626 # NewPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.11 71 665 + 8.11 71 665 # NewPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.08 63 663 + 8.08 63 663 # OptPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.06 6 675 + 8.06 6 675 # OptPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.09 8 687 + 8.09 8 687 # OptPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.06 6 682 + 8.06 6 682 # IntegratedFastPFOR + IntegratedVariableByte (Integrated) # bits per int, compress speed (mis), decompression speed (mis) - 7.81 210 756 + 7.81 210 756 # FastPFOR + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 7.81 207 759 + 7.81 207 759 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 8.85 92 353 + 8.85 92 353 # XorBinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.22 369 622 + 8.22 369 622 # DeltaZigzagBinaryPacking + DeltaZigzagVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.00 389 486 + 9.00 389 486 # sparsity 8 # generating random data... # generating random data... ok. # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 9.41 32 234 + 9.41 32 234 # IntegratedBinaryPacking + IntegratedVariableByte (Integrated) # bits per int, compress speed (mis), decompression speed (mis) - 9.16 636 1062 + 9.16 636 1062 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1151 1326 + 32.00 1151 1326 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.08 231 269 + 11.08 231 269 # IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.08 259 288 + 11.08 259 288 # BinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.16 616 873 + 9.16 616 873 # NewPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.04 59 638 + 9.04 59 638 # NewPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.07 65 664 + 9.07 65 664 # NewPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.04 59 664 + 9.04 59 664 # OptPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.01 5 665 + 9.01 5 665 # OptPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.05 7 680 + 9.05 7 680 # OptPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.01 5 671 + 9.01 5 671 # IntegratedFastPFOR + IntegratedVariableByte (Integrated) # bits per int, compress speed (mis), decompression speed (mis) - 8.77 209 746 + 8.77 209 746 # FastPFOR + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.77 207 738 + 8.77 207 738 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 10.25 81 324 + 10.25 81 324 # XorBinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.18 372 625 + 9.18 372 625 # DeltaZigzagBinaryPacking + DeltaZigzagVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.98 387 479 + 9.98 387 479 # sparsity 9 # generating random data... # generating random data... ok. # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 10.41 31 238 + 10.41 31 238 # IntegratedBinaryPacking + IntegratedVariableByte (Integrated) # bits per int, compress speed (mis), decompression speed (mis) - 10.15 637 1070 + 10.15 637 1070 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1145 1413 + 32.00 1145 1413 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.15 221 267 + 12.15 221 267 # IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.15 252 284 + 12.15 252 284 # BinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.15 609 849 + 10.15 609 849 # NewPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.03 54 624 + 10.03 54 624 # NewPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.06 60 650 + 10.06 60 650 # NewPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.03 54 649 + 10.03 54 649 # OptPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.00 5 653 + 10.00 5 653 # OptPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.03 7 666 + 10.03 7 666 # OptPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.00 5 659 + 10.00 5 659 # IntegratedFastPFOR + IntegratedVariableByte (Integrated) # bits per int, compress speed (mis), decompression speed (mis) - 9.75 207 739 + 9.75 207 739 # FastPFOR + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.75 206 743 + 9.75 206 743 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 11.72 73 313 + 11.72 73 313 # XorBinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.17 369 611 + 10.17 369 611 # DeltaZigzagBinaryPacking + DeltaZigzagVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.98 381 474 + 10.98 381 474 # sparsity 10 # generating random data... # generating random data... ok. # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 11.57 29 236 + 11.57 29 236 # IntegratedBinaryPacking + IntegratedVariableByte (Integrated) # bits per int, compress speed (mis), decompression speed (mis) - 11.28 626 1033 + 11.28 626 1033 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1141 1328 + 32.00 1141 1328 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.18 219 276 + 13.18 219 276 # IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.18 254 294 + 13.18 254 294 # BinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.28 610 848 + 11.28 610 848 # NewPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.19 50 617 + 11.19 50 617 # NewPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.23 56 638 + 11.23 56 638 # NewPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.19 50 640 + 11.19 50 640 # OptPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.13 4 640 + 11.13 4 640 # OptPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.17 6 655 + 11.17 6 655 # OptPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.13 4 647 + 11.13 4 647 # IntegratedFastPFOR + IntegratedVariableByte (Integrated) # bits per int, compress speed (mis), decompression speed (mis) - 10.87 207 736 + 10.87 207 736 # FastPFOR + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.87 204 734 + 10.87 204 734 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 13.19 68 311 + 13.19 68 311 # XorBinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.30 369 612 + 11.30 369 612 # DeltaZigzagBinaryPacking + DeltaZigzagVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.13 386 477 + 12.13 386 477 # sparsity 11 # generating random data... # generating random data... ok. # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 12.41 29 229 + 12.41 29 229 # IntegratedBinaryPacking + IntegratedVariableByte (Integrated) # bits per int, compress speed (mis), decompression speed (mis) - 12.01 634 1046 + 12.01 634 1046 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1148 1365 + 32.00 1148 1365 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.84 208 261 + 13.84 208 261 # IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.84 241 277 + 13.84 241 277 # BinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.01 605 832 + 12.01 605 832 # NewPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.07 49 650 + 12.07 49 650 # NewPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.10 54 674 + 12.10 54 674 # NewPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.07 49 675 + 12.07 49 675 # OptPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.93 4 604 + 11.93 4 604 # OptPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.97 6 618 + 11.97 6 618 # OptPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.93 4 611 + 11.93 4 611 # IntegratedFastPFOR + IntegratedVariableByte (Integrated) # bits per int, compress speed (mis), decompression speed (mis) - 11.60 206 724 + 11.60 206 724 # FastPFOR + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.60 203 724 + 11.60 203 724 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 13.98 66 291 + 13.98 66 291 # XorBinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.04 367 603 + 12.04 367 603 # DeltaZigzagBinaryPacking + DeltaZigzagVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.86 385 478 + 12.86 385 478 # sparsity 12 # generating random data... # generating random data... ok. # kamikaze PForDelta # bits per int, compress speed (mis), decompression speed (mis) - 13.48 28 236 + 13.48 28 236 # IntegratedBinaryPacking + IntegratedVariableByte (Integrated) # bits per int, compress speed (mis), decompression speed (mis) - 12.96 634 1051 + 12.96 634 1051 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1150 1307 + 32.00 1150 1307 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 14.69 202 258 + 14.69 202 258 # IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 14.69 235 272 + 14.69 235 272 # BinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.96 610 849 + 12.96 610 849 # NewPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.17 48 698 + 13.17 48 698 # NewPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.20 52 714 + 13.20 52 714 # NewPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.17 48 720 + 13.17 48 720 # OptPFD + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.96 4 588 + 12.96 4 588 # OptPFDS9 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.00 6 602 + 13.00 6 602 # OptPFDS16 + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.96 4 597 + 12.96 4 597 # IntegratedFastPFOR + IntegratedVariableByte (Integrated) # bits per int, compress speed (mis), decompression speed (mis) - 12.55 206 726 + 12.55 206 726 # FastPFOR + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.55 203 725 + 12.55 203 725 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 15.40 63 269 + 15.40 63 269 # XorBinaryPacking + VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.99 368 613 + 12.99 368 613 # DeltaZigzagBinaryPacking + DeltaZigzagVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.81 384 476 + 13.81 384 476 Results were written into a CSV file: benchmark-20131112T105209.csv diff --git a/benchmarkresults/benchmarkresults_skippable_haswell_18sept2014.txt b/benchmarkresults/benchmarkresults_skippable_haswell_18sept2014.txt index 4159637..7e35696 100644 --- a/benchmarkresults/benchmarkresults_skippable_haswell_18sept2014.txt +++ b/benchmarkresults/benchmarkresults_skippable_haswell_18sept2014.txt @@ -1,7 +1,7 @@ # benchmark based on the ClusterData model from: -# Vo Ngoc Anh and Alistair Moffat. -# Index compression using 64-bit words. -# Softw. Pract. Exper.40, 2 (February 2010), 131-147. +# Vo Ngoc Anh and Alistair Moffat. +# Index compression using 64-bit words. +# Softw. Pract. Exper.40, 2 (February 2010), 131-147. # Results will be written into a CSV file: benchmark-20140918T011322.csv @@ -10,504 +10,504 @@ # generating random data... ok. # IntegratedBinaryPacking + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.04 840 1619 + 3.04 840 1619 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1169 1698 + 32.00 1169 1698 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.00 195 369 + 8.00 195 369 # BinaryPacking+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.04 651 1148 + 3.04 651 1148 # NewPFD+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 2.96 129 865 + 2.96 129 865 # NewPFDS9+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 2.98 158 877 + 2.98 158 877 # NewPFDS16+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 2.96 130 879 + 2.96 130 879 # OptPFD+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 2.95 25 930 + 2.95 25 930 # OptPFDS9+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 2.97 27 951 + 2.97 27 951 # OptPFDS16+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 2.95 25 935 + 2.95 25 935 # FastPFOR+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 2.82 235 928 + 2.82 235 928 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 2.93 255 740 + 2.93 255 740 # Simple16 # bits per int, compress speed (mis), decompression speed (mis) - 2.77 147 395 + 2.77 147 395 # sparsity 2 # generating random data... # generating random data... ok. # IntegratedBinaryPacking + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.82 831 1555 + 3.82 831 1555 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1183 1800 + 32.00 1183 1800 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.00 220 372 + 8.00 220 372 # BinaryPacking+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.82 659 1139 + 3.82 659 1139 # NewPFD+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.72 116 855 + 3.72 116 855 # NewPFDS9+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.75 136 851 + 3.75 136 851 # NewPFDS16+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.72 115 853 + 3.72 115 853 # OptPFD+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.71 19 895 + 3.71 19 895 # OptPFDS9+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.74 22 917 + 3.74 22 917 # OptPFDS16+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.71 19 900 + 3.71 19 900 # FastPFOR+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 3.59 230 908 + 3.59 230 908 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 3.74 195 654 + 3.74 195 654 # Simple16 # bits per int, compress speed (mis), decompression speed (mis) - 3.49 111 366 + 3.49 111 366 # sparsity 3 # generating random data... # generating random data... ok. # IntegratedBinaryPacking + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.78 817 1519 + 4.78 817 1519 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1019 1759 + 32.00 1019 1759 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.02 238 370 + 8.02 238 370 # BinaryPacking+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.78 680 1121 + 4.78 680 1121 # NewPFD+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.67 98 825 + 4.67 98 825 # NewPFDS9+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.70 123 840 + 4.70 123 840 # NewPFDS16+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.67 102 834 + 4.67 102 834 # OptPFD+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.66 15 861 + 4.66 15 861 # OptPFDS9+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.69 18 895 + 4.69 18 895 # OptPFDS16+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.66 14 871 + 4.66 14 871 # FastPFOR+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 4.54 231 904 + 4.54 231 904 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 4.84 153 589 + 4.84 153 589 # Simple16 # bits per int, compress speed (mis), decompression speed (mis) - 4.40 83 339 + 4.40 83 339 # sparsity 4 # generating random data... # generating random data... ok. # IntegratedBinaryPacking + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.65 788 1505 + 5.65 788 1505 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1142 1757 + 32.00 1142 1757 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.09 242 363 + 8.09 242 363 # BinaryPacking+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.65 636 1113 + 5.65 636 1113 # NewPFD+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.52 92 828 + 5.52 92 828 # NewPFDS9+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.56 112 826 + 5.56 112 826 # NewPFDS16+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.52 94 826 + 5.52 94 826 # OptPFD+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.51 12 854 + 5.51 12 854 # OptPFDS9+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.54 15 883 + 5.54 15 883 # OptPFDS16+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.51 12 858 + 5.51 12 858 # FastPFOR+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 5.39 218 886 + 5.39 218 886 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 5.80 136 566 + 5.80 136 566 # Simple16 # bits per int, compress speed (mis), decompression speed (mis) - 5.32 68 319 + 5.32 68 319 # sparsity 5 # generating random data... # generating random data... ok. # IntegratedBinaryPacking + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.31 804 1490 + 6.31 804 1490 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1105 1860 + 32.00 1105 1860 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.40 245 330 + 8.40 245 330 # BinaryPacking+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.31 673 1121 + 6.31 673 1121 # NewPFD+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.19 87 832 + 6.19 87 832 # NewPFDS9+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.22 107 844 + 6.22 107 844 # NewPFDS16+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.19 88 830 + 6.19 88 830 # OptPFD+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.17 10 851 + 6.17 10 851 # OptPFDS9+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.20 14 883 + 6.20 14 883 # OptPFDS16+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.17 10 852 + 6.17 10 852 # FastPFOR+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.07 217 875 + 6.07 217 875 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 6.51 130 513 + 6.51 130 513 # Simple16 # bits per int, compress speed (mis), decompression speed (mis) - 6.13 60 307 + 6.13 60 307 # sparsity 6 # generating random data... # generating random data... ok. # IntegratedBinaryPacking + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.99 742 1431 + 6.99 742 1431 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1163 1660 + 32.00 1163 1660 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.99 205 290 + 8.99 205 290 # BinaryPacking+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.99 637 1107 + 6.99 637 1107 # NewPFD+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.87 82 821 + 6.87 82 821 # NewPFDS9+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.90 100 830 + 6.90 100 830 # NewPFDS16+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.87 82 818 + 6.87 82 818 # OptPFD+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.85 9 834 + 6.85 9 834 # OptPFDS9+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.88 12 865 + 6.88 12 865 # OptPFDS16+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.85 9 836 + 6.85 9 836 # FastPFOR+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 6.75 224 877 + 6.75 224 877 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 7.33 118 485 + 7.33 118 485 # Simple16 # bits per int, compress speed (mis), decompression speed (mis) - 6.98 54 296 + 6.98 54 296 # sparsity 7 # generating random data... # generating random data... ok. # IntegratedBinaryPacking + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.31 770 1463 + 8.31 770 1463 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1074 1832 + 32.00 1074 1832 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.01 203 240 + 10.01 203 240 # BinaryPacking+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.31 664 1105 + 8.31 664 1105 # NewPFD+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.18 73 796 + 8.18 73 796 # NewPFDS9+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.22 88 808 + 8.22 88 808 # NewPFDS16+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.18 73 792 + 8.18 73 792 # OptPFD+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.16 7 819 + 8.16 7 819 # OptPFDS9+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.20 10 849 + 8.20 10 849 # OptPFDS16+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.16 7 810 + 8.16 7 810 # FastPFOR+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.05 217 851 + 8.05 217 851 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 9.01 103 430 + 9.01 103 430 # Simple16 # bits per int, compress speed (mis), decompression speed (mis) - 8.61 47 277 + 8.61 47 277 # sparsity 8 # generating random data... # generating random data... ok. # IntegratedBinaryPacking + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.88 800 1414 + 8.88 800 1414 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1078 1718 + 32.00 1078 1718 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.91 211 227 + 10.91 211 227 # BinaryPacking+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.88 671 1083 + 8.88 671 1083 # NewPFD+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.76 70 804 + 8.76 70 804 # NewPFDS9+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.80 84 814 + 8.80 84 814 # NewPFDS16+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.76 70 800 + 8.76 70 800 # OptPFD+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.73 7 807 + 8.73 7 807 # OptPFDS9+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.77 9 792 + 8.77 9 792 # OptPFDS16+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.73 7 801 + 8.73 7 801 # FastPFOR+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 8.64 211 837 + 8.64 211 837 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 9.94 96 417 + 9.94 96 417 # Simple16 # bits per int, compress speed (mis), decompression speed (mis) - 9.51 44 268 + 9.51 44 268 # sparsity 9 # generating random data... # generating random data... ok. # IntegratedBinaryPacking + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.19 834 1442 + 10.19 834 1442 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1200 1632 + 32.00 1200 1632 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.16 206 212 + 12.16 206 212 # BinaryPacking+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.19 675 1092 + 10.19 675 1092 # NewPFD+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.07 64 804 + 10.07 64 804 # NewPFDS9+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.10 76 814 + 10.10 76 814 # NewPFDS16+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.07 63 802 + 10.07 63 802 # OptPFD+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.04 6 810 + 10.04 6 810 # OptPFDS9+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.08 9 841 + 10.08 9 841 # OptPFDS16+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.04 6 808 + 10.04 6 808 # FastPFOR+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 9.94 222 858 + 9.94 222 858 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 11.79 88 397 + 11.79 88 397 # Simple16 # bits per int, compress speed (mis), decompression speed (mis) - 11.40 38 253 + 11.40 38 253 # sparsity 10 # generating random data... # generating random data... ok. # IntegratedBinaryPacking + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.10 814 1406 + 11.10 814 1406 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1215 1820 + 32.00 1215 1820 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.07 207 208 + 13.07 207 208 # BinaryPacking+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.10 681 1073 + 11.10 681 1073 # NewPFD+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.00 60 800 + 11.00 60 800 # NewPFDS9+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.04 72 809 + 11.04 72 809 # NewPFDS16+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 11.00 60 796 + 11.00 60 796 # OptPFD+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.95 6 785 + 10.95 6 785 # OptPFDS9+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.99 8 815 + 10.99 8 815 # OptPFDS16+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.95 6 782 + 10.95 6 782 # FastPFOR+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 10.84 226 860 + 10.84 226 860 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 12.93 84 389 + 12.93 84 389 # Simple16 # bits per int, compress speed (mis), decompression speed (mis) - 12.58 36 245 + 12.58 36 245 # sparsity 11 # generating random data... # generating random data... ok. # IntegratedBinaryPacking + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.31 814 1392 + 12.31 814 1392 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1171 1846 + 32.00 1171 1846 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 14.14 172 201 + 14.14 172 201 # BinaryPacking+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.31 668 1071 + 12.31 668 1071 # NewPFD+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.42 56 825 + 12.42 56 825 # NewPFDS9+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.45 67 832 + 12.45 67 832 # NewPFDS16+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.42 56 821 + 12.42 56 821 # OptPFD+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.22 5 729 + 12.22 5 729 # OptPFDS9+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.27 8 758 + 12.27 8 758 # OptPFDS16+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.22 5 731 + 12.22 5 731 # FastPFOR+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.07 222 836 + 12.07 222 836 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 14.31 81 377 + 14.31 81 377 # Simple16 # bits per int, compress speed (mis), decompression speed (mis) - 14.05 33 238 + 14.05 33 238 # sparsity 12 # generating random data... # generating random data... ok. # IntegratedBinaryPacking + IntegratedVariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.97 805 1375 + 12.97 805 1375 # JustCopy # bits per int, compress speed (mis), decompression speed (mis) - 32.00 1160 1737 + 32.00 1160 1737 # VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 14.72 186 193 + 14.72 186 193 # BinaryPacking+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.97 656 1037 + 12.97 656 1037 # NewPFD+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.22 56 886 + 13.22 56 886 # NewPFDS9+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.24 67 891 + 13.24 67 891 # NewPFDS16+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.22 56 883 + 13.22 56 883 # OptPFD+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.98 5 704 + 12.98 5 704 # OptPFDS9+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 13.02 8 740 + 13.02 8 740 # OptPFDS16+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.98 5 704 + 12.98 5 704 # FastPFOR+VariableByte # bits per int, compress speed (mis), decompression speed (mis) - 12.73 223 845 + 12.73 223 845 # Simple9 # bits per int, compress speed (mis), decompression speed (mis) - 15.35 78 347 + 15.35 78 347 # Simple16 # bits per int, compress speed (mis), decompression speed (mis) - 15.15 31 225 + 15.15 31 225 Results were written into a CSV file: benchmark-20140918T011322.csv diff --git a/pom.xml b/pom.xml index a960b2c..7f89da1 100644 --- a/pom.xml +++ b/pom.xml @@ -5,8 +5,8 @@ 0.1.13-SNAPSHOT jar - 1.7 - 1.7 + 1.8 + 1.8 UTF-8 @@ -190,6 +190,47 @@ 3.2.1 + + + + + maven-clean-plugin + 2.5 + + + maven-deploy-plugin + 2.8.1 + + + maven-install-plugin + 2.5.1 + + + maven-jar-plugin + 2.4 + + + maven-javadoc-plugin + 2.9.1 + + + maven-resources-plugin + 2.6 + + + maven-site-plugin + 3.3 + + + maven-source-plugin + 2.2.1 + + + maven-surefire-plugin + 2.17 + + + JavaFastPFOR https://github.com/lemire/JavaFastPFOR/ diff --git a/src/main/java/me/lemire/integercompression/GroupSimple9.java b/src/main/java/me/lemire/integercompression/GroupSimple9.java index 0ce10ce..a294080 100644 --- a/src/main/java/me/lemire/integercompression/GroupSimple9.java +++ b/src/main/java/me/lemire/integercompression/GroupSimple9.java @@ -13,3540 +13,3540 @@ public final class GroupSimple9 implements IntegerCODEC, SkippableIntegerCODEC { - private static final int[][] M = { { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, { 9, 10, 11, 12, 13, 14, 15, 16, 17 }, - { 18, 19, 20, 21, 22, 23, 24, 25, 26 }, { 27, 28, 29, 30, 31, 32, 33, 34, 35 }, - { 36, 37, 38, 39, 40, 41, 42, 43, 44 }, { 45, 46, 47, 48, 49, 50, 51, 52, 53 }, - { 54, 55, 56, 57, 58, 59, 60, 61, 62 }, { 63, 64, 65, 66, 67, 68, 69, 70, 71 }, - { 72, 73, 74, 75, 76, 77, 78, 79, 80 } }; - - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int out[], IntWrapper outpos) { - if (inlength == 0) - return; - out[outpos.get()] = inlength; - outpos.increment(); - headlessCompress(in, inpos, inlength, out, outpos); - } - - private void encode0(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 24; i++) - out[outf + 0] = (out[outf + 0] << 1) + (in[inf + i]); - for (int i = 0; i < 4; i++) - out[outf + 1] = (out[outf + 1] << 1) + in[inf + 24 + i]; - for (int i = 0; i < 28; i++) - out[outf + 1] = (out[outf + 1] << 1) + in[inf + 28 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode1(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 24; i++) - out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; - for (int i = 0; i < 4; i++) - out[outf + 1] = (out[outf + 1] << 1) + in[inf + 24 + i]; - for (int i = 0; i < 14; i++) - out[outf + 1] = (out[outf + 1] << 2) + in[inf + 28 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode2(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 24; i++) - out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; - for (int i = 0; i < 4; i++) - out[outf + 1] = (out[outf + 1] << 1) + in[inf + 24 + i]; - for (int i = 0; i < 9; i++) - out[outf + 1] = (out[outf + 1] << 3) + in[inf + 28 + i];// 第二个28位是低位存储的,所以浪费的1比特在最顶端。 - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode3(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 24; i++) - out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; - for (int i = 0; i < 4; i++) - out[outf + 1] = (out[outf + 1] << 1) + in[inf + 24 + i]; - for (int i = 0; i < 7; i++) - out[outf + 1] = (out[outf + 1] << 4) + in[inf + 28 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode4(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 24; i++) - out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; - for (int i = 0; i < 4; i++) - out[outf + 1] = (out[outf + 1] << 1) + in[inf + 24 + i]; - for (int i = 0; i < 5; i++) - out[outf + 1] = (out[outf + 1] << 5) + in[inf + 28 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode5(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 24; i++) - out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; - for (int i = 0; i < 4; i++) - out[outf + 1] = (out[outf + 1] << 1) + in[inf + 24 + i]; - for (int i = 0; i < 4; i++) - out[outf + 1] = (out[outf + 1] << 7) + in[inf + 28 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode6(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 24; i++) - out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; - for (int i = 0; i < 4; i++) - out[outf + 1] = (out[outf + 1] << 1) + in[inf + 24 + i]; - for (int i = 0; i < 3; i++) - out[outf + 1] = (out[outf + 1] << 9) + in[inf + 28 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode7(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 24; i++) - out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; - for (int i = 0; i < 4; i++) - out[outf + 1] = (out[outf + 1] << 1) + in[inf + 24 + i]; - for (int i = 0; i < 2; i++) - out[outf + 1] = (out[outf + 1] << 14) + in[inf + 28 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode8(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 24; i++) - out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; - for (int i = 0; i < 4; i++) - out[outf + 1] = (out[outf + 1] << 1) + in[inf + 24 + i]; - for (int i = 0; i < 1; i++) - out[outf + 1] = (out[outf + 1] << 28) + in[inf + 28 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode9(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 12; i++) - out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; - for (int i = 0; i < 2; i++) - out[outf + 1] = (out[outf + 1] << 2) + in[inf + 12 + i]; - for (int i = 0; i < 28; i++) - out[outf + 1] = (out[outf + 1] << 1) + in[inf + 14 + i]; - - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode10(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 12; i++) { - out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; - - } - for (int i = 0; i < 2; i++) - out[outf + 1] = (out[outf + 1] << 2) + in[inf + 12 + i]; - for (int i = 0; i < 14; i++) - out[outf + 1] = (out[outf + 1] << 2) + in[inf + 14 + i]; - - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode11(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 12; i++) - out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; - for (int i = 0; i < 2; i++) - out[outf + 1] = (out[outf + 1] << 2) + in[inf + 12 + i]; - for (int i = 0; i < 9; i++) - out[outf + 1] = (out[outf + 1] << 3) + in[inf + 14 + i]; - - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode12(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 12; i++) - out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; - for (int i = 0; i < 2; i++) - out[outf + 1] = (out[outf + 1] << 2) + in[inf + 12 + i]; - for (int i = 0; i < 7; i++) - out[outf + 1] = (out[outf + 1] << 4) + in[inf + 14 + i]; - - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode13(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 12; i++) - out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; - for (int i = 0; i < 2; i++) - out[outf + 1] = (out[outf + 1] << 2) + in[inf + 12 + i]; - for (int i = 0; i < 5; i++) - out[outf + 1] = (out[outf + 1] << 5) + in[inf + 14 + i]; - - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode14(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 12; i++) - out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; - for (int i = 0; i < 2; i++) - out[outf + 1] = (out[outf + 1] << 2) + in[inf + 12 + i]; - for (int i = 0; i < 4; i++) - out[outf + 1] = (out[outf + 1] << 7) + in[inf + 14 + i]; - - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode15(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 12; i++) - out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; - for (int i = 0; i < 2; i++) - out[outf + 1] = (out[outf + 1] << 2) + in[inf + 12 + i]; - for (int i = 0; i < 3; i++) - out[outf + 1] = (out[outf + 1] << 9) + in[inf + 14 + i]; - - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode16(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 12; i++) - out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; - for (int i = 0; i < 2; i++) - out[outf + 1] = (out[outf + 1] << 2) + in[inf + 12 + i]; - for (int i = 0; i < 2; i++) - out[outf + 1] = (out[outf + 1] << 14) + in[inf + 14 + i]; - - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode17(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 12; i++) - out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; - for (int i = 0; i < 2; i++) - out[outf + 1] = (out[outf + 1] << 2) + in[inf + 12 + i]; - for (int i = 0; i < 1; i++) - out[outf + 1] = (out[outf + 1] << 28) + in[inf + 14 + i]; - - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode18(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 8; i++) - out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; - for (int i = 0; i < 1; i++) - out[outf + 1] = (out[outf + 1] << 3) + in[inf + 8 + i]; - for (int i = 0; i < 28; i++) - out[outf + 1] = (out[outf + 1] << 1) + in[inf + 9 + i]; - - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode19(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 8; i++) - out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; - for (int i = 0; i < 1; i++) - out[outf + 1] = (out[outf + 1] << 3) + in[inf + 8 + i]; - for (int i = 0; i < 14; i++) - out[outf + 1] = (out[outf + 1] << 2) + in[inf + 9 + i]; - - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode20(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 8; i++) - out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; - for (int i = 0; i < 1; i++) - out[outf + 1] = (out[outf + 1] << 3) + in[inf + 8 + i]; - for (int i = 0; i < 9; i++) - out[outf + 1] = (out[outf + 1] << 3) + in[inf + 9 + i]; - - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode21(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 8; i++) - out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; - for (int i = 0; i < 1; i++) - out[outf + 1] = (out[outf + 1] << 3) + in[inf + 8 + i]; - for (int i = 0; i < 7; i++) - out[outf + 1] = (out[outf + 1] << 4) + in[inf + 9 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode22(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 8; i++) - out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; - for (int i = 0; i < 1; i++) - out[outf + 1] = (out[outf + 1] << 3) + in[inf + 8 + i]; - for (int i = 0; i < 5; i++) - out[outf + 1] = (out[outf + 1] << 5) + in[inf + 9 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode23(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 8; i++) - out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; - for (int i = 0; i < 1; i++) - out[outf + 1] = (out[outf + 1] << 3) + in[inf + 8 + i]; - for (int i = 0; i < 4; i++) - out[outf + 1] = (out[outf + 1] << 7) + in[inf + 9 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode24(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 8; i++) - out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; - for (int i = 0; i < 1; i++) - out[outf + 1] = (out[outf + 1] << 3) + in[inf + 8 + i]; - for (int i = 0; i < 3; i++) - out[outf + 1] = (out[outf + 1] << 9) + in[inf + 9 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode25(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 8; i++) - out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; - for (int i = 0; i < 1; i++) - out[outf + 1] = (out[outf + 1] << 3) + in[inf + 8 + i]; - for (int i = 0; i < 2; i++) - out[outf + 1] = (out[outf + 1] << 14) + in[inf + 9 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode26(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 8; i++) - out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; - for (int i = 0; i < 1; i++) - out[outf + 1] = (out[outf + 1] << 3) + in[inf + 8 + i]; - for (int i = 0; i < 1; i++) - out[outf + 1] = (out[outf + 1] << 28) + in[inf + 9 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode27(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 6; i++) - out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; - for (int i = 0; i < 1; i++) - out[outf + 1] = (out[outf + 1] << 4) + in[inf + 6 + i]; - for (int i = 0; i < 28; i++) - out[outf + 1] = (out[outf + 1] << 1) + in[inf + 7 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode28(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 6; i++) - out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; - for (int i = 0; i < 1; i++) - out[outf + 1] = (out[outf + 1] << 4) + in[inf + 6 + i]; - for (int i = 0; i < 14; i++) - out[outf + 1] = (out[outf + 1] << 2) + in[inf + 7 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode29(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 6; i++) - out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; - for (int i = 0; i < 1; i++) - out[outf + 1] = (out[outf + 1] << 4) + in[inf + 6 + i]; - for (int i = 0; i < 9; i++) - out[outf + 1] = (out[outf + 1] << 3) + in[inf + 7 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode30(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 6; i++) - out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; - for (int i = 0; i < 1; i++) - out[outf + 1] = (out[outf + 1] << 4) + in[inf + 6 + i]; - for (int i = 0; i < 7; i++) - out[outf + 1] = (out[outf + 1] << 4) + in[inf + 7 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode31(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 6; i++) - out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; - for (int i = 0; i < 1; i++) - out[outf + 1] = (out[outf + 1] << 4) + in[inf + 6 + i]; - for (int i = 0; i < 5; i++) - out[outf + 1] = (out[outf + 1] << 5) + in[inf + 7 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode32(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 6; i++) - out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; - for (int i = 0; i < 1; i++) - out[outf + 1] = (out[outf + 1] << 4) + in[inf + 6 + i]; - for (int i = 0; i < 4; i++) - out[outf + 1] = (out[outf + 1] << 7) + in[inf + 7 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode33(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 6; i++) - out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; - for (int i = 0; i < 1; i++) - out[outf + 1] = (out[outf + 1] << 4) + in[inf + 6 + i]; - for (int i = 0; i < 3; i++) - out[outf + 1] = (out[outf + 1] << 9) + in[inf + 7 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode34(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 6; i++) - out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; - for (int i = 0; i < 1; i++) - out[outf + 1] = (out[outf + 1] << 4) + in[inf + 6 + i]; - for (int i = 0; i < 2; i++) - out[outf + 1] = (out[outf + 1] << 14) + in[inf + 7 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode35(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 6; i++) - out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; - for (int i = 0; i < 1; i++) - out[outf + 1] = (out[outf + 1] << 4) + in[inf + 6 + i]; - for (int i = 0; i < 1; i++) - out[outf + 1] = (out[outf + 1] << 28) + in[inf + 7 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode36(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 4; i++) - out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; - out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); - out[outf + 1] = (out[outf + 1] << 1) + ((in[inf + 4] << 31) >>> 31); - for (int i = 0; i < 28; i++) - out[outf + 1] = (out[outf + 1] << 1) + in[inf + 5 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode37(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 4; i++) - out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; - out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); - out[outf + 1] = (out[outf + 1] << 1) + ((in[inf + 4] << 31) >>> 31); - for (int i = 0; i < 14; i++) - out[outf + 1] = (out[outf + 1] << 2) + in[inf + 5 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode38(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 4; i++) - out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; - out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); - out[outf + 1] = (out[outf + 1] << 1) + ((in[inf + 4] << 31) >>> 31); - for (int i = 0; i < 9; i++) - out[outf + 1] = (out[outf + 1] << 3) + in[inf + 5 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode39(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 4; i++) - out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; - out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); - out[outf + 1] = (out[outf + 1] << 1) + ((in[inf + 4] << 31) >>> 31); - for (int i = 0; i < 7; i++) - out[outf + 1] = (out[outf + 1] << 4) + in[inf + 5 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode40(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 4; i++) - out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; - out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); - out[outf + 1] = (out[outf + 1] << 1) + ((in[inf + 4] << 31) >>> 31); - for (int i = 0; i < 5; i++) - out[outf + 1] = (out[outf + 1] << 5) + in[inf + 5 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode41(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 4; i++) - out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; - out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); - out[outf + 1] = (out[outf + 1] << 1) + ((in[inf + 4] << 31) >>> 31); - for (int i = 0; i < 4; i++) - out[outf + 1] = (out[outf + 1] << 7) + in[inf + 5 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode42(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 4; i++) - out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; - out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); - out[outf + 1] = (out[outf + 1] << 1) + ((in[inf + 4] << 31) >>> 31); - for (int i = 0; i < 3; i++) - out[outf + 1] = (out[outf + 1] << 9) + in[inf + 5 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode43(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 4; i++) - out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; - out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); - out[outf + 1] = (out[outf + 1] << 1) + ((in[inf + 4] << 31) >>> 31); - for (int i = 0; i < 2; i++) - out[outf + 1] = (out[outf + 1] << 14) + in[inf + 5 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode44(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 4; i++) - out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; - out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); - out[outf + 1] = (out[outf + 1] << 1) + ((in[inf + 4] << 31) >>> 31); - for (int i = 0; i < 1; i++) - out[outf + 1] = (out[outf + 1] << 28) + in[inf + 5 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode45(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 3; i++) - out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; - out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); - out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 3] << 28) >>> 28); - for (int i = 0; i < 28; i++) - out[outf + 1] = (out[outf + 1] << 1) + in[inf + 4 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode46(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 3; i++) - out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; - out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); - out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 3] << 28) >>> 28); - for (int i = 0; i < 14; i++) - out[outf + 1] = (out[outf + 1] << 2) + in[inf + 4 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode47(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 3; i++) - out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; - out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); - out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 3] << 28) >>> 28); - for (int i = 0; i < 9; i++) - out[outf + 1] = (out[outf + 1] << 3) + in[inf + 4 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode48(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 3; i++) - out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; - out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); - out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 3] << 28) >>> 28); - for (int i = 0; i < 7; i++) - out[outf + 1] = (out[outf + 1] << 4) + in[inf + 4 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode49(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 3; i++) - out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; - out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); - out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 3] << 28) >>> 28); - for (int i = 0; i < 5; i++) - out[outf + 1] = (out[outf + 1] << 5) + in[inf + 4 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode50(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 3; i++) - out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; - out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); - out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 3] << 28) >>> 28); - for (int i = 0; i < 4; i++) - out[outf + 1] = (out[outf + 1] << 7) + in[inf + 4 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode51(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 3; i++) - out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; - out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); - out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 3] << 28) >>> 28); - for (int i = 0; i < 3; i++) - out[outf + 1] = (out[outf + 1] << 9) + in[inf + 4 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode52(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 3; i++) - out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; - out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); - out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 3] << 28) >>> 28); - for (int i = 0; i < 2; i++) - out[outf + 1] = (out[outf + 1] << 14) + in[inf + 4 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode53(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 3; i++) - out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; - out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); - out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 3] << 28) >>> 28); - for (int i = 0; i < 1; i++) - out[outf + 1] = (out[outf + 1] << 28) + in[inf + 4 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode54(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 2; i++) - out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; - out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); - out[outf + 1] = (out[outf + 1] << 3) + ((in[inf + 2] << 29) >>> 29); - for (int i = 0; i < 28; i++) - out[outf + 1] = (out[outf + 1] << 1) + in[inf + 3 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode55(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 2; i++) - out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; - out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); - out[outf + 1] = (out[outf + 1] << 3) + ((in[inf + 2] << 29) >>> 29); - for (int i = 0; i < 14; i++) - out[outf + 1] = (out[outf + 1] << 2) + in[inf + 3 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode56(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 2; i++) - out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; - out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); - out[outf + 1] = (out[outf + 1] << 3) + ((in[inf + 2] << 29) >>> 29); - for (int i = 0; i < 9; i++) - out[outf + 1] = (out[outf + 1] << 3) + in[inf + 3 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode57(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 2; i++) - out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; - out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); - out[outf + 1] = (out[outf + 1] << 3) + ((in[inf + 2] << 29) >>> 29); - for (int i = 0; i < 7; i++) - out[outf + 1] = (out[outf + 1] << 4) + in[inf + 3 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode58(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 2; i++) - out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; - out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); - out[outf + 1] = (out[outf + 1] << 3) + ((in[inf + 2] << 29) >>> 29); - for (int i = 0; i < 5; i++) - out[outf + 1] = (out[outf + 1] << 5) + in[inf + 3 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode59(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 2; i++) - out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; - out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); - out[outf + 1] = (out[outf + 1] << 3) + ((in[inf + 2] << 29) >>> 29); - for (int i = 0; i < 4; i++) - out[outf + 1] = (out[outf + 1] << 7) + in[inf + 3 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode60(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 2; i++) - out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; - out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); - out[outf + 1] = (out[outf + 1] << 3) + ((in[inf + 2] << 29) >>> 29); - for (int i = 0; i < 3; i++) - out[outf + 1] = (out[outf + 1] << 9) + in[inf + 3 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode61(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 2; i++) - out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; - out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); - out[outf + 1] = (out[outf + 1] << 3) + ((in[inf + 2] << 29) >>> 29); - for (int i = 0; i < 2; i++) - out[outf + 1] = (out[outf + 1] << 14) + in[inf + 3 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode62(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - for (int i = 0; i < 2; i++) - out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; - out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); - out[outf + 1] = (out[outf + 1] << 3) + ((in[inf + 2] << 29) >>> 29); - for (int i = 0; i < 1; i++) - out[outf + 1] = (out[outf + 1] << 28) + in[inf + 3 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode63(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - - out[outf + 0] = (out[outf + 0] << 14) + in[inf]; - out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); - out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); - for (int i = 0; i < 28; i++) - out[outf + 1] = (out[outf + 1] << 1) + in[inf + 2 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode64(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - out[outf + 0] = (out[outf + 0] << 14) + in[inf]; - out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); - out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); - for (int i = 0; i < 14; i++) - out[outf + 1] = (out[outf + 1] << 2) + in[inf + 2 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode65(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - out[outf + 0] = (out[outf + 0] << 14) + in[inf]; - out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); - out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); - for (int i = 0; i < 9; i++) - out[outf + 1] = (out[outf + 1] << 3) + in[inf + 2 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode66(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - out[outf + 0] = (out[outf + 0] << 14) + in[inf]; - out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); - out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); - for (int i = 0; i < 7; i++) - out[outf + 1] = (out[outf + 1] << 4) + in[inf + 2 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode67(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - out[outf + 0] = (out[outf + 0] << 14) + in[inf]; - out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); - out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); - for (int i = 0; i < 5; i++) - out[outf + 1] = (out[outf + 1] << 5) + in[inf + 2 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode68(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - out[outf + 0] = (out[outf + 0] << 14) + in[inf]; - out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); - out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); - for (int i = 0; i < 4; i++) - out[outf + 1] = (out[outf + 1] << 7) + in[inf + 2 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode69(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - out[outf + 0] = (out[outf + 0] << 14) + in[inf]; - out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); - out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); - for (int i = 0; i < 3; i++) - out[outf + 1] = (out[outf + 1] << 9) + in[inf + 2 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode70(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - out[outf + 0] = (out[outf + 0] << 14) + in[inf]; - out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); - out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); - for (int i = 0; i < 2; i++) - out[outf + 1] = (out[outf + 1] << 14) + in[inf + 2 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode71(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - out[outf + 0] = (out[outf + 0] << 14) + in[inf]; - out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); - out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); - for (int i = 0; i < 1; i++) - out[outf + 1] = (out[outf + 1] << 28) + in[inf + 2 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode72(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - - out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); - out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); - for (int i = 0; i < 28; i++) - out[outf + 1] = (out[outf + 1] << 1) + in[inf + 1 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode73(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); - out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); - for (int i = 0; i < 14; i++) - out[outf + 1] = (out[outf + 1] << 2) + in[inf + 1 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode74(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); - out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); - for (int i = 0; i < 9; i++) - out[outf + 1] = (out[outf + 1] << 3) + in[inf + 1 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode75(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); - out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); - for (int i = 0; i < 7; i++) - out[outf + 1] = (out[outf + 1] << 4) + in[inf + 1 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode76(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); - out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); - for (int i = 0; i < 5; i++) - out[outf + 1] = (out[outf + 1] << 5) + in[inf + 1 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode77(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); - out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); - for (int i = 0; i < 4; i++) - out[outf + 1] = (out[outf + 1] << 7) + in[inf + 1 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode78(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); - out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); - for (int i = 0; i < 3; i++) - out[outf + 1] = (out[outf + 1] << 9) + in[inf + 1 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode79(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); - out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); - for (int i = 0; i < 2; i++) - out[outf + 1] = (out[outf + 1] << 14) + in[inf + 1 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - private void encode80(final int[] in, final int inf, final int code, final int[] out, - final int outf) { - out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); - out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); - for (int i = 0; i < 1; i++) - out[outf + 1] = (out[outf + 1] << 28) + in[inf + 1 + i]; - out[outf + 0] = code << 24 | out[outf + 0]; - - } - - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - if (inlength == 0) - return; - final int outlength = in[inpos.get()]; - inpos.increment(); - headlessUncompress(in, inpos, inlength, out, outpos, outlength); - } - - - - private void decode80(int val, int valn, int[] out, int currentPos) { - // number : 1, bitwidth : 28 - out[currentPos++] = (val << 8) >>> 4 | (valn >>> 28); - // number : 1, bitwidth : 28 - out[currentPos++] = (valn << 4) >>> 4; - } - - private void decode79(int val, int valn, int[] out, int currentPos) { - // number : 1, bitwidth : 28 - out[currentPos++] = (val << 8) >>> 4 | (valn >>> 28); - // number :2, bitwidth : 14 - out[currentPos++] = (valn << 4) >>> 18; - out[currentPos++] = (valn << 18) >>> 18; - } - - private void decode78(int val, int valn, int[] out, int currentPos) { - // number : 1, bitwidth : 28 - out[currentPos++] = (val << 8) >>> 4 | (valn >>> 27); - // number : 3, bitwidth :9 - out[currentPos++] = (valn << 5) >>> 23; - out[currentPos++] = (valn << 14) >>> 23; - out[currentPos++] = (valn << 23) >>> 23; - } - - private void decode77(int val, int valn, int[] out, int currentPos) { - // number : 1, bitwidth : 28 - out[currentPos++] = (val << 8) >>> 4 | (valn >>> 28); - // number : 4, bitwidth : 7 - out[currentPos++] = (valn << 4) >>> 25; - out[currentPos++] = (valn << 11) >>> 25; - out[currentPos++] = (valn << 18) >>> 25; - out[currentPos++] = (valn << 25) >>> 25; - } - - private void decode76(int val, int valn, int[] out, int currentPos) { - // number : 5, bitwidth : 5 - out[currentPos++] = (val << 8) >>> 4 | (valn >>> 25); - // number : 14, bitwidth : 2 - out[currentPos++] = (valn << 7) >>> 27; - out[currentPos++] = (valn << 12) >>> 27; - out[currentPos++] = (valn << 17) >>> 27; - out[currentPos++] = (valn << 22) >>> 27; - out[currentPos++] = (valn << 27) >>> 27; - } - - private void decode75(int val, int valn, int[] out, int currentPos) { - // number : 1, bitwidth : 28 - out[currentPos++] = (val << 8) >>> 4 | (valn >>> 28); - // number : 7, bitwidth : 4 - out[currentPos++] = (valn << 4) >>> 28; - out[currentPos++] = (valn << 8) >>> 28; - out[currentPos++] = (valn << 12) >>> 28; - out[currentPos++] = (valn << 16) >>> 28; - out[currentPos++] = (valn << 20) >>> 28; - out[currentPos++] = (valn << 24) >>> 28; - out[currentPos++] = (valn << 28) >>> 28; - } - - private void decode74(int val, int valn, int[] out, int currentPos) { - // number : 1, bitwidth : 28 - out[currentPos++] = (val << 8) >>> 4 | (valn >>> 27); - // number : 9, bitwidth : 3 - out[currentPos++] = (valn << 5) >>> 29; - out[currentPos++] = (valn << 8) >>> 29; - out[currentPos++] = (valn << 11) >>> 29; - out[currentPos++] = (valn << 14) >>> 29; - out[currentPos++] = (valn << 17) >>> 29; - out[currentPos++] = (valn << 20) >>> 29; - out[currentPos++] = (valn << 23) >>> 29; - out[currentPos++] = (valn << 26) >>> 29; - out[currentPos++] = (valn << 29) >>> 29; - } - - private void decode73(int val, int valn, int[] out, int currentPos) { - // number : 1, bitwidth : 28 - out[currentPos++] = (val << 8) >>> 4 | (valn >>> 28); - // number : 14, bitwidth : 2 - out[currentPos++] = (valn << 4) >>> 30; - out[currentPos++] = (valn << 6) >>> 30; - out[currentPos++] = (valn << 8) >>> 30; - out[currentPos++] = (valn << 10) >>> 30; - out[currentPos++] = (valn << 12) >>> 30; - out[currentPos++] = (valn << 14) >>> 30; - out[currentPos++] = (valn << 16) >>> 30; - out[currentPos++] = (valn << 18) >>> 30; - out[currentPos++] = (valn << 20) >>> 30; - out[currentPos++] = (valn << 22) >>> 30; // 10 - out[currentPos++] = (valn << 24) >>> 30; - out[currentPos++] = (valn << 26) >>> 30; - out[currentPos++] = (valn << 28) >>> 30; - out[currentPos++] = (valn << 30) >>> 30; - } - - private void decode72(int val, int valn, int[] out, int currentPos) { - // number : 1, bitwidth : 28 - out[currentPos++] = (val << 8) >>> 4 | (valn >>> 28); - // number : 28, bitwidth : 1 - out[currentPos++] = (valn << 4) >>> 31; - out[currentPos++] = (valn << 5) >>> 31; - out[currentPos++] = (valn << 6) >>> 31; - out[currentPos++] = (valn << 7) >>> 31; - out[currentPos++] = (valn << 8) >>> 31; - out[currentPos++] = (valn << 9) >>> 31; - out[currentPos++] = (valn << 10) >>> 31; - out[currentPos++] = (valn << 11) >>> 31; - out[currentPos++] = (valn << 12) >>> 31; - out[currentPos++] = (valn << 13) >>> 31; // 10 - out[currentPos++] = (valn << 14) >>> 31; - out[currentPos++] = (valn << 15) >>> 31; - out[currentPos++] = (valn << 16) >>> 31; - out[currentPos++] = (valn << 17) >>> 31; - out[currentPos++] = (valn << 18) >>> 31; - out[currentPos++] = (valn << 19) >>> 31; - out[currentPos++] = (valn << 20) >>> 31; - out[currentPos++] = (valn << 21) >>> 31; - out[currentPos++] = (valn << 22) >>> 31; - out[currentPos++] = (valn << 23) >>> 31; // 20 - out[currentPos++] = (valn << 24) >>> 31; - out[currentPos++] = (valn << 25) >>> 31; - out[currentPos++] = (valn << 26) >>> 31; - out[currentPos++] = (valn << 27) >>> 31; - out[currentPos++] = (valn << 28) >>> 31; - out[currentPos++] = (valn << 29) >>> 31; - out[currentPos++] = (valn << 30) >>> 31; - out[currentPos++] = (valn << 31) >>> 31; - } - - private void decode71(int val, int valn, int[] out, int currentPos) { - // number : 2, bitwidth : 14 - out[currentPos++] = (val << 8) >>> 18; - out[currentPos++] = (val << 22) >>> 18 | (valn >>> 28); - // number : 1, bitwidth : 28 - out[currentPos++] = (valn << 4) >>> 4; - } - - private void decode70(int val, int valn, int[] out, int currentPos) { - // number : 2, bitwidth : 14 - out[currentPos++] = (val << 8) >>> 18; - out[currentPos++] = (val << 22) >>> 18 | (valn >>> 28); - // number : 2, bitwidth : 14 - out[currentPos++] = (valn << 4) >>> 18; - out[currentPos++] = (valn << 18) >>> 18; - } - - private void decode69(int val, int valn, int[] out, int currentPos) { - // number : 2, bitwidth : 14 - out[currentPos++] = (val << 8) >>> 18; - out[currentPos++] = (val << 22) >>> 18 | (valn >>> 27); - // number : 3, bitwidth : 9 - out[currentPos++] = (valn << 5) >>> 23; - out[currentPos++] = (valn << 14) >>> 23; - out[currentPos++] = (valn << 23) >>> 23; - } - - private void decode68(int val, int valn, int[] out, int currentPos) { - // number : 2, bitwidth : 14 - out[currentPos++] = (val << 8) >>> 18; - out[currentPos++] = (val << 22) >>> 18 | (valn >>> 28); - // number : 4, bitwidth : 7 - out[currentPos++] = (valn << 4) >>> 25; - out[currentPos++] = (valn << 11) >>> 25; - out[currentPos++] = (valn << 18) >>> 25; - out[currentPos++] = (valn << 25) >>> 25; - } - - private void decode67(int val, int valn, int[] out, int currentPos) { - // number : 2, bitwidth : 14 - out[currentPos++] = (val << 8) >>> 18; - out[currentPos++] = (val << 22) >>> 18 | (valn >>> 25); - // number : 5, bitwidth : 5 - out[currentPos++] = (valn << 7) >>> 27; - out[currentPos++] = (valn << 12) >>> 27; - out[currentPos++] = (valn << 17) >>> 27; - out[currentPos++] = (valn << 22) >>> 27; - out[currentPos++] = (valn << 27) >>> 27; - } - - private void decode66(int val, int valn, int[] out, int currentPos) { - // number : 2, bitwidth : 14 - out[currentPos++] = (val << 8) >>> 18; - out[currentPos++] = (val << 22) >>> 18 | (valn >>> 28); - // number : 7, bitwidth : 4 - out[currentPos++] = (valn << 4) >>> 28; - out[currentPos++] = (valn << 8) >>> 28; - out[currentPos++] = (valn << 12) >>> 28; - out[currentPos++] = (valn << 16) >>> 28; - out[currentPos++] = (valn << 20) >>> 28; - out[currentPos++] = (valn << 24) >>> 28; - out[currentPos++] = (valn << 28) >>> 28; - } - - private void decode65(int val, int valn, int[] out, int currentPos) { - // number : 2, bitwidth : 14 - out[currentPos++] = (val << 8) >>> 18; - out[currentPos++] = (val << 22) >>> 18 | (valn >>> 27); - // number : 9, bitwidth : 3 - out[currentPos++] = (valn << 5) >>> 29; - out[currentPos++] = (valn << 8) >>> 29; - out[currentPos++] = (valn << 11) >>> 29; - out[currentPos++] = (valn << 14) >>> 29; - out[currentPos++] = (valn << 17) >>> 29; - out[currentPos++] = (valn << 20) >>> 29; - out[currentPos++] = (valn << 23) >>> 29; - out[currentPos++] = (valn << 26) >>> 29; - out[currentPos++] = (valn << 29) >>> 29; - } - - private void decode64(int val, int valn, int[] out, int currentPos) { - // number : 2, bitwidth : 14 - out[currentPos++] = (val << 8) >>> 18; - out[currentPos++] = (val << 22) >>> 18 | (valn >>> 28); - // number : 14, bitwidth : 2 - out[currentPos++] = (valn << 4) >>> 30; - out[currentPos++] = (valn << 6) >>> 30; - out[currentPos++] = (valn << 8) >>> 30; - out[currentPos++] = (valn << 10) >>> 30; - out[currentPos++] = (valn << 12) >>> 30; - out[currentPos++] = (valn << 14) >>> 30; - out[currentPos++] = (valn << 16) >>> 30; - out[currentPos++] = (valn << 18) >>> 30; - out[currentPos++] = (valn << 20) >>> 30; - out[currentPos++] = (valn << 22) >>> 30; // 10 - out[currentPos++] = (valn << 24) >>> 30; - out[currentPos++] = (valn << 26) >>> 30; - out[currentPos++] = (valn << 28) >>> 30; - out[currentPos++] = (valn << 30) >>> 30; - } - - private void decode63(int val, int valn, int[] out, int currentPos) { - // number : 2, bitwidth : 14 - out[currentPos++] = (val << 8) >>> 18; - out[currentPos++] = (val << 22) >>> 18 | (valn >>> 28); - // number : 28, bitwidth : 1 - out[currentPos++] = (valn << 4) >>> 31; - out[currentPos++] = (valn << 5) >>> 31; - out[currentPos++] = (valn << 6) >>> 31; - out[currentPos++] = (valn << 7) >>> 31; - out[currentPos++] = (valn << 8) >>> 31; - out[currentPos++] = (valn << 9) >>> 31; - out[currentPos++] = (valn << 10) >>> 31; - out[currentPos++] = (valn << 11) >>> 31; - out[currentPos++] = (valn << 12) >>> 31; - out[currentPos++] = (valn << 13) >>> 31; // 10 - out[currentPos++] = (valn << 14) >>> 31; - out[currentPos++] = (valn << 15) >>> 31; - out[currentPos++] = (valn << 16) >>> 31; - out[currentPos++] = (valn << 17) >>> 31; - out[currentPos++] = (valn << 18) >>> 31; - out[currentPos++] = (valn << 19) >>> 31; - out[currentPos++] = (valn << 20) >>> 31; - out[currentPos++] = (valn << 21) >>> 31; - out[currentPos++] = (valn << 22) >>> 31; - out[currentPos++] = (valn << 23) >>> 31; // 20 - out[currentPos++] = (valn << 24) >>> 31; - out[currentPos++] = (valn << 25) >>> 31; - out[currentPos++] = (valn << 26) >>> 31; - out[currentPos++] = (valn << 27) >>> 31; - out[currentPos++] = (valn << 28) >>> 31; - out[currentPos++] = (valn << 29) >>> 31; - out[currentPos++] = (valn << 30) >>> 31; - out[currentPos++] = (valn << 31) >>> 31; - } - - private void decode62(int val, int valn, int[] out, int currentPos) { - // number : 3, bitwidth : 9 - out[currentPos++] = (val << 8) >>> 23; - out[currentPos++] = (val << 17) >>> 23; - out[currentPos++] = (val << 26) >>> 23 | (valn >>> 28); - // number : 1, bitwidth : 28 - out[currentPos++] = (valn << 4) >>> 4; - } - - private void decode61(int val, int valn, int[] out, int currentPos) { - // number : 3, bitwidth : 9 - out[currentPos++] = (val << 8) >>> 23; - out[currentPos++] = (val << 17) >>> 23; - out[currentPos++] = (val << 26) >>> 23 | (valn >>> 28); - // number : 2, bitwidth : 14 - out[currentPos++] = (valn << 4) >>> 18; - out[currentPos++] = (valn << 18) >>> 18; - } - - private void decode60(int val, int valn, int[] out, int currentPos) { - // number : 3, bitwidth : 9 - out[currentPos++] = (val << 8) >>> 23; - out[currentPos++] = (val << 17) >>> 23; - out[currentPos++] = (val << 26) >>> 23 | (valn >>> 27); - // number : 3, bitwidth : 9 - out[currentPos++] = (valn << 5) >>> 23; - out[currentPos++] = (valn << 14) >>> 23; - out[currentPos++] = (valn << 23) >>> 23; - } - - private void decode59(int val, int valn, int[] out, int currentPos) { - // number : 3, bitwidth : 9 - out[currentPos++] = (val << 8) >>> 23; - out[currentPos++] = (val << 17) >>> 23; - out[currentPos++] = (val << 26) >>> 23 | (valn >>> 28); - // number : 4, bitwidth : 7 - out[currentPos++] = (valn << 4) >>> 25; - out[currentPos++] = (valn << 11) >>> 25; - out[currentPos++] = (valn << 18) >>> 25; - out[currentPos++] = (valn << 25) >>> 25; - } - - private void decode58(int val, int valn, int[] out, int currentPos) { - // number : 3, bitwidth : 9 - out[currentPos++] = (val << 8) >>> 23; - out[currentPos++] = (val << 17) >>> 23; - out[currentPos++] = (val << 26) >>> 23 | (valn >>> 25); - // number : 5, bitwidth : 5 - out[currentPos++] = (valn << 7) >>> 27; - out[currentPos++] = (valn << 12) >>> 27; - out[currentPos++] = (valn << 17) >>> 27; - out[currentPos++] = (valn << 22) >>> 27; - out[currentPos++] = (valn << 27) >>> 27; - } - - private void decode57(int val, int valn, int[] out, int currentPos) { - // number : 3, bitwidth : 9 - out[currentPos++] = (val << 8) >>> 23; - out[currentPos++] = (val << 17) >>> 23; - out[currentPos++] = (val << 26) >>> 23 | (valn >>> 28); - // number : 7, bitwidth : 4 - out[currentPos++] = (valn << 4) >>> 28; - out[currentPos++] = (valn << 8) >>> 28; - out[currentPos++] = (valn << 12) >>> 28; - out[currentPos++] = (valn << 16) >>> 28; - out[currentPos++] = (valn << 20) >>> 28; - out[currentPos++] = (valn << 24) >>> 28; - out[currentPos++] = (valn << 28) >>> 28; - } - - private void decode56(int val, int valn, int[] out, int currentPos) { - // number : 3, bitwidth : 9 - out[currentPos++] = (val << 8) >>> 23; - out[currentPos++] = (val << 17) >>> 23; - out[currentPos++] = (val << 26) >>> 23 | (valn >>> 27); - // number : 9, bitwidth : 3 - out[currentPos++] = (valn << 5) >>> 29; - out[currentPos++] = (valn << 8) >>> 29; - out[currentPos++] = (valn << 11) >>> 29; - out[currentPos++] = (valn << 14) >>> 29; - out[currentPos++] = (valn << 17) >>> 29; - out[currentPos++] = (valn << 20) >>> 29; - out[currentPos++] = (valn << 23) >>> 29; - out[currentPos++] = (valn << 26) >>> 29; - out[currentPos++] = (valn << 29) >>> 29; - } - - private void decode55(int val, int valn, int[] out, int currentPos) { - // number : 3, bitwidth : 9 - out[currentPos++] = (val << 8) >>> 23; - out[currentPos++] = (val << 17) >>> 23; - out[currentPos++] = (val << 26) >>> 23 | (valn >>> 28); - // number : 14, bitwidth : 2 - out[currentPos++] = (valn << 4) >>> 30; - out[currentPos++] = (valn << 6) >>> 30; - out[currentPos++] = (valn << 8) >>> 30; - out[currentPos++] = (valn << 10) >>> 30; - out[currentPos++] = (valn << 12) >>> 30; - out[currentPos++] = (valn << 14) >>> 30; - out[currentPos++] = (valn << 16) >>> 30; - out[currentPos++] = (valn << 18) >>> 30; - out[currentPos++] = (valn << 20) >>> 30; - out[currentPos++] = (valn << 22) >>> 30; // 10 - out[currentPos++] = (valn << 24) >>> 30; - out[currentPos++] = (valn << 26) >>> 30; - out[currentPos++] = (valn << 28) >>> 30; - out[currentPos++] = (valn << 30) >>> 30; - } - - private void decode54(int val, int valn, int[] out, int currentPos) { - // number : 3, bitwidth : 9 - out[currentPos++] = (val << 8) >>> 23; - out[currentPos++] = (val << 17) >>> 23; - out[currentPos++] = (val << 26) >>> 23 | (valn >>> 28); - // number : 28, bitwidth : 1 - out[currentPos++] = (valn << 4) >>> 31; - out[currentPos++] = (valn << 5) >>> 31; - out[currentPos++] = (valn << 6) >>> 31; - out[currentPos++] = (valn << 7) >>> 31; - out[currentPos++] = (valn << 8) >>> 31; - out[currentPos++] = (valn << 9) >>> 31; - out[currentPos++] = (valn << 10) >>> 31; - out[currentPos++] = (valn << 11) >>> 31; - out[currentPos++] = (valn << 12) >>> 31; - out[currentPos++] = (valn << 13) >>> 31; // 10 - out[currentPos++] = (valn << 14) >>> 31; - out[currentPos++] = (valn << 15) >>> 31; - out[currentPos++] = (valn << 16) >>> 31; - out[currentPos++] = (valn << 17) >>> 31; - out[currentPos++] = (valn << 18) >>> 31; - out[currentPos++] = (valn << 19) >>> 31; - out[currentPos++] = (valn << 20) >>> 31; - out[currentPos++] = (valn << 21) >>> 31; - out[currentPos++] = (valn << 22) >>> 31; - out[currentPos++] = (valn << 23) >>> 31; // 20 - out[currentPos++] = (valn << 24) >>> 31; - out[currentPos++] = (valn << 25) >>> 31; - out[currentPos++] = (valn << 26) >>> 31; - out[currentPos++] = (valn << 27) >>> 31; - out[currentPos++] = (valn << 28) >>> 31; - out[currentPos++] = (valn << 29) >>> 31; - out[currentPos++] = (valn << 30) >>> 31; - out[currentPos++] = (valn << 31) >>> 31; - } - - private void decode53(int val, int valn, int[] out, int currentPos) { - // number : 4, bitwidth : 7 - out[currentPos++] = (val << 8) >>> 25; - out[currentPos++] = (val << 15) >>> 25; - out[currentPos++] = (val << 22) >>> 25; - out[currentPos++] = (val << 29) >>> 25 | (valn >>> 28); - // number : 1, bitwidth : 28 - out[currentPos++] = (valn << 4) >>> 4; - } - - private void decode52(int val, int valn, int[] out, int currentPos) { - // number : 4, bitwidth : 7 - out[currentPos++] = (val << 8) >>> 25; - out[currentPos++] = (val << 15) >>> 25; - out[currentPos++] = (val << 22) >>> 25; - out[currentPos++] = (val << 29) >>> 25 | (valn >>> 28); - // number : 2, bitwidth : 14 - out[currentPos++] = (valn << 4) >>> 18; - out[currentPos++] = (valn << 18) >>> 18; - } - - private void decode51(int val, int valn, int[] out, int currentPos) { - // number : 4, bitwidth : 7 - out[currentPos++] = (val << 8) >>> 25; - out[currentPos++] = (val << 15) >>> 25; - out[currentPos++] = (val << 22) >>> 25; - out[currentPos++] = (val << 29) >>> 25 | (valn >>> 27); - // number : 3, bitwidth : 9 - out[currentPos++] = (valn << 5) >>> 23; - out[currentPos++] = (valn << 14) >>> 23; - out[currentPos++] = (valn << 23) >>> 23; - } - - private void decode50(int val, int valn, int[] out, int currentPos) { - // number : 4, bitwidth : 7 - out[currentPos++] = (val << 8) >>> 25; - out[currentPos++] = (val << 15) >>> 25; - out[currentPos++] = (val << 22) >>> 25; - out[currentPos++] = (val << 29) >>> 25 | (valn >>> 28); - // number : 4, bitwidth : 7 - out[currentPos++] = (valn << 4) >>> 25; - out[currentPos++] = (valn << 11) >>> 25; - out[currentPos++] = (valn << 18) >>> 25; - out[currentPos++] = (valn << 25) >>> 25; - } - - private void decode49(int val, int valn, int[] out, int currentPos) { - // number : 4, bitwidth : 7 - out[currentPos++] = (val << 8) >>> 25; - out[currentPos++] = (val << 15) >>> 25; - out[currentPos++] = (val << 22) >>> 25; - out[currentPos++] = (val << 29) >>> 25 | (valn >>> 25); - // number : 5, bitwidth : 5 - out[currentPos++] = (valn << 7) >>> 27; - out[currentPos++] = (valn << 12) >>> 27; - out[currentPos++] = (valn << 17) >>> 27; - out[currentPos++] = (valn << 22) >>> 27; - out[currentPos++] = (valn << 27) >>> 27; - } - - private void decode48(int val, int valn, int[] out, int currentPos) { - // number : 4, bitwidth : 7 - out[currentPos++] = (val << 8) >>> 25; - out[currentPos++] = (val << 15) >>> 25; - out[currentPos++] = (val << 22) >>> 25; - out[currentPos++] = (val << 29) >>> 25 | (valn >>> 28); - // number : 7, bitwidth : 4 - out[currentPos++] = (valn << 4) >>> 28; - out[currentPos++] = (valn << 8) >>> 28; - out[currentPos++] = (valn << 12) >>> 28; - out[currentPos++] = (valn << 16) >>> 28; - out[currentPos++] = (valn << 20) >>> 28; - out[currentPos++] = (valn << 24) >>> 28; - out[currentPos++] = (valn << 28) >>> 28; - } - - private void decode47(int val, int valn, int[] out, int currentPos) { - // number : 4, bitwidth : 7 - out[currentPos++] = (val << 8) >>> 25; - out[currentPos++] = (val << 15) >>> 25; - out[currentPos++] = (val << 22) >>> 25; - out[currentPos++] = (val << 29) >>> 25 | (valn >>> 27); - // number : 9, bitwidth : 3 - out[currentPos++] = (valn << 5) >>> 29; - out[currentPos++] = (valn << 8) >>> 29; - out[currentPos++] = (valn << 11) >>> 29; - out[currentPos++] = (valn << 14) >>> 29; - out[currentPos++] = (valn << 17) >>> 29; - out[currentPos++] = (valn << 20) >>> 29; - out[currentPos++] = (valn << 23) >>> 29; - out[currentPos++] = (valn << 26) >>> 29; - out[currentPos++] = (valn << 29) >>> 29; - } - - private void decode46(int val, int valn, int[] out, int currentPos) { - // number : 4, bitwidth : 7 - out[currentPos++] = (val << 8) >>> 25; - out[currentPos++] = (val << 15) >>> 25; - out[currentPos++] = (val << 22) >>> 25; - out[currentPos++] = (val << 29) >>> 25 | (valn >>> 28); - // number : 14, bitwidth : 2 - out[currentPos++] = (valn << 4) >>> 30; - out[currentPos++] = (valn << 6) >>> 30; - out[currentPos++] = (valn << 8) >>> 30; - out[currentPos++] = (valn << 10) >>> 30; - out[currentPos++] = (valn << 12) >>> 30; - out[currentPos++] = (valn << 14) >>> 30; - out[currentPos++] = (valn << 16) >>> 30; - out[currentPos++] = (valn << 18) >>> 30; - out[currentPos++] = (valn << 20) >>> 30; - out[currentPos++] = (valn << 22) >>> 30; // 10 - out[currentPos++] = (valn << 24) >>> 30; - out[currentPos++] = (valn << 26) >>> 30; - out[currentPos++] = (valn << 28) >>> 30; - out[currentPos++] = (valn << 30) >>> 30; - } - - private void decode45(int val, int valn, int[] out, int currentPos) { - // number : 4, bitwidth : 7 - out[currentPos++] = (val << 8) >>> 25; - out[currentPos++] = (val << 15) >>> 25; - out[currentPos++] = (val << 22) >>> 25; - out[currentPos++] = (val << 29) >>> 25 | (valn >>> 28); - // number : 28, bitwidth : 1 - out[currentPos++] = (valn << 4) >>> 31; - out[currentPos++] = (valn << 5) >>> 31; - out[currentPos++] = (valn << 6) >>> 31; - out[currentPos++] = (valn << 7) >>> 31; - out[currentPos++] = (valn << 8) >>> 31; - out[currentPos++] = (valn << 9) >>> 31; - out[currentPos++] = (valn << 10) >>> 31; - out[currentPos++] = (valn << 11) >>> 31; - out[currentPos++] = (valn << 12) >>> 31; - out[currentPos++] = (valn << 13) >>> 31; // 10 - out[currentPos++] = (valn << 14) >>> 31; - out[currentPos++] = (valn << 15) >>> 31; - out[currentPos++] = (valn << 16) >>> 31; - out[currentPos++] = (valn << 17) >>> 31; - out[currentPos++] = (valn << 18) >>> 31; - out[currentPos++] = (valn << 19) >>> 31; - out[currentPos++] = (valn << 20) >>> 31; - out[currentPos++] = (valn << 21) >>> 31; - out[currentPos++] = (valn << 22) >>> 31; - out[currentPos++] = (valn << 23) >>> 31; // 20 - out[currentPos++] = (valn << 24) >>> 31; - out[currentPos++] = (valn << 25) >>> 31; - out[currentPos++] = (valn << 26) >>> 31; - out[currentPos++] = (valn << 27) >>> 31; - out[currentPos++] = (valn << 28) >>> 31; - out[currentPos++] = (valn << 29) >>> 31; - out[currentPos++] = (valn << 30) >>> 31; - out[currentPos++] = (valn << 31) >>> 31; - } - - private void decode44(int val, int valn, int[] out, int currentPos) { - // number : 5, bitwidth : 5 - out[currentPos++] = (val << 8) >>> 27; - out[currentPos++] = (val << 13) >>> 27; - out[currentPos++] = (val << 18) >>> 27; - out[currentPos++] = (val << 23) >>> 27; - out[currentPos++] = (val << 28) >>> 27 | (valn >>> 28); - // number : 1, bitwidth : 28 - out[currentPos++] = (valn << 4) >>> 4; - } - - private void decode43(int val, int valn, int[] out, int currentPos) { - // number : 5, bitwidth : 5 - out[currentPos++] = (val << 8) >>> 27; - out[currentPos++] = (val << 13) >>> 27; - out[currentPos++] = (val << 18) >>> 27; - out[currentPos++] = (val << 23) >>> 27; - out[currentPos++] = (val << 28) >>> 27 | (valn >>> 28); - // number : 2, bitwidth : 14 - out[currentPos++] = (valn << 4) >>> 18; - out[currentPos++] = (valn << 18) >>> 18; - } - - private void decode42(int val, int valn, int[] out, int currentPos) { - // number : 5, bitwidth : 5 - out[currentPos++] = (val << 8) >>> 27; - out[currentPos++] = (val << 13) >>> 27; - out[currentPos++] = (val << 18) >>> 27; - out[currentPos++] = (val << 23) >>> 27; - out[currentPos++] = (val << 28) >>> 27 | (valn >>> 27); - // number : 3, bitwidth : 9 - out[currentPos++] = (valn << 5) >>> 23; - out[currentPos++] = (valn << 14) >>> 23; - out[currentPos++] = (valn << 23) >>> 23; - } - - private void decode41(int val, int valn, int[] out, int currentPos) { - // number : 5, bitwidth : 5 - out[currentPos++] = (val << 8) >>> 27; - out[currentPos++] = (val << 13) >>> 27; - out[currentPos++] = (val << 18) >>> 27; - out[currentPos++] = (val << 23) >>> 27; - out[currentPos++] = (val << 28) >>> 27 | (valn >>> 28); - // number : 4, bitwidth : 7 - out[currentPos++] = (valn << 4) >>> 25; - out[currentPos++] = (valn << 11) >>> 25; - out[currentPos++] = (valn << 18) >>> 25; - out[currentPos++] = (valn << 25) >>> 25; - } - - private void decode40(int val, int valn, int[] out, int currentPos) { - // number : 5, bitwidth : 5 - out[currentPos++] = (val << 8) >>> 27; - out[currentPos++] = (val << 13) >>> 27; - out[currentPos++] = (val << 18) >>> 27; - out[currentPos++] = (val << 23) >>> 27; - out[currentPos++] = (val << 28) >>> 27 | (valn >>> 25); - // number : 5, bitwidth : 5 - out[currentPos++] = (valn << 7) >>> 27; - out[currentPos++] = (valn << 12) >>> 27; - out[currentPos++] = (valn << 17) >>> 27; - out[currentPos++] = (valn << 22) >>> 27; - out[currentPos++] = (valn << 27) >>> 27; - } - - private void decode39(int val, int valn, int[] out, int currentPos) { - // number : 5, bitwidth : 5 - out[currentPos++] = (val << 8) >>> 27; - out[currentPos++] = (val << 13) >>> 27; - out[currentPos++] = (val << 18) >>> 27; - out[currentPos++] = (val << 23) >>> 27; - out[currentPos++] = (val << 28) >>> 27 | (valn >>> 28); - // number : 7, bitwidth : 4 - out[currentPos++] = (valn << 4) >>> 28; - out[currentPos++] = (valn << 8) >>> 28; - out[currentPos++] = (valn << 12) >>> 28; - out[currentPos++] = (valn << 16) >>> 28; - out[currentPos++] = (valn << 20) >>> 28; - out[currentPos++] = (valn << 24) >>> 28; - out[currentPos++] = (valn << 28) >>> 28; - } - - private void decode38(int val, int valn, int[] out, int currentPos) { - // number : 5, bitwidth : 5 - out[currentPos++] = (val << 8) >>> 27; - out[currentPos++] = (val << 13) >>> 27; - out[currentPos++] = (val << 18) >>> 27; - out[currentPos++] = (val << 23) >>> 27; - out[currentPos++] = (val << 28) >>> 27 | (valn >>> 27); - // number : 9, bitwidth : 3 - out[currentPos++] = (valn << 5) >>> 29; - out[currentPos++] = (valn << 8) >>> 29; - out[currentPos++] = (valn << 11) >>> 29; - out[currentPos++] = (valn << 14) >>> 29; - out[currentPos++] = (valn << 17) >>> 29; - out[currentPos++] = (valn << 20) >>> 29; - out[currentPos++] = (valn << 23) >>> 29; - out[currentPos++] = (valn << 26) >>> 29; - out[currentPos++] = (valn << 29) >>> 29; - } - - private void decode37(int val, int valn, int[] out, int currentPos) { - // number : 5, bitwidth : 5 - out[currentPos++] = (val << 8) >>> 27; - out[currentPos++] = (val << 13) >>> 27; - out[currentPos++] = (val << 18) >>> 27; - out[currentPos++] = (val << 23) >>> 27; - out[currentPos++] = (val << 28) >>> 27 | (valn >>> 28); - // number : 14, bitwidth : 2 - out[currentPos++] = (valn << 4) >>> 30; - out[currentPos++] = (valn << 6) >>> 30; - out[currentPos++] = (valn << 8) >>> 30; - out[currentPos++] = (valn << 10) >>> 30; - out[currentPos++] = (valn << 12) >>> 30; - out[currentPos++] = (valn << 14) >>> 30; - out[currentPos++] = (valn << 16) >>> 30; - out[currentPos++] = (valn << 18) >>> 30; - out[currentPos++] = (valn << 20) >>> 30; - out[currentPos++] = (valn << 22) >>> 30; // 10 - out[currentPos++] = (valn << 24) >>> 30; - out[currentPos++] = (valn << 26) >>> 30; - out[currentPos++] = (valn << 28) >>> 30; - out[currentPos++] = (valn << 30) >>> 30; - } - - private void decode36(int val, int valn, int[] out, int currentPos) { - // number : 5, bitwidth : 5 - out[currentPos++] = (val << 8) >>> 27; - out[currentPos++] = (val << 13) >>> 27; - out[currentPos++] = (val << 18) >>> 27; - out[currentPos++] = (val << 23) >>> 27; - out[currentPos++] = (val << 28) >>> 27 | (valn >>> 28); - // number : 28, bitwidth : 1 - out[currentPos++] = (valn << 4) >>> 31; - out[currentPos++] = (valn << 5) >>> 31; - out[currentPos++] = (valn << 6) >>> 31; - out[currentPos++] = (valn << 7) >>> 31; - out[currentPos++] = (valn << 8) >>> 31; - out[currentPos++] = (valn << 9) >>> 31; - out[currentPos++] = (valn << 10) >>> 31; - out[currentPos++] = (valn << 11) >>> 31; - out[currentPos++] = (valn << 12) >>> 31; - out[currentPos++] = (valn << 13) >>> 31; // 10 - out[currentPos++] = (valn << 14) >>> 31; - out[currentPos++] = (valn << 15) >>> 31; - out[currentPos++] = (valn << 16) >>> 31; - out[currentPos++] = (valn << 17) >>> 31; - out[currentPos++] = (valn << 18) >>> 31; - out[currentPos++] = (valn << 19) >>> 31; - out[currentPos++] = (valn << 20) >>> 31; - out[currentPos++] = (valn << 21) >>> 31; - out[currentPos++] = (valn << 22) >>> 31; - out[currentPos++] = (valn << 23) >>> 31; // 20 - out[currentPos++] = (valn << 24) >>> 31; - out[currentPos++] = (valn << 25) >>> 31; - out[currentPos++] = (valn << 26) >>> 31; - out[currentPos++] = (valn << 27) >>> 31; - out[currentPos++] = (valn << 28) >>> 31; - out[currentPos++] = (valn << 29) >>> 31; - out[currentPos++] = (valn << 30) >>> 31; - out[currentPos++] = (valn << 31) >>> 31; - } - - private void decode35(int val, int valn, int[] out, int currentPos) { - // number : 7, bitwidth : 4 - out[currentPos++] = (val << 8) >>> 28; - out[currentPos++] = (val << 12) >>> 28; - out[currentPos++] = (val << 16) >>> 28; - out[currentPos++] = (val << 20) >>> 28; - out[currentPos++] = (val << 24) >>> 28; - out[currentPos++] = (val << 28) >>> 28; - out[currentPos++] = (valn << 0) >>> 28; - // number : 1, bitwidth : 28 - out[currentPos++] = (valn << 4) >>> 4; - } - - private void decode34(int val, int valn, int[] out, int currentPos) { - // number : 7, bitwidth : 4 - out[currentPos++] = (val << 8) >>> 28; - out[currentPos++] = (val << 12) >>> 28; - out[currentPos++] = (val << 16) >>> 28; - out[currentPos++] = (val << 20) >>> 28; - out[currentPos++] = (val << 24) >>> 28; - out[currentPos++] = (val << 28) >>> 28; - out[currentPos++] = (valn << 0) >>> 28; - // number : 2, bitwidth : 14 - out[currentPos++] = (valn << 4) >>> 18; - out[currentPos++] = (valn << 18) >>> 18; - } - - private void decode33(int val, int valn, int[] out, int currentPos) { - // number : 7, bitwidth : 4 - out[currentPos++] = (val << 8) >>> 28; - out[currentPos++] = (val << 12) >>> 28; - out[currentPos++] = (val << 16) >>> 28; - out[currentPos++] = (val << 20) >>> 28; - out[currentPos++] = (val << 24) >>> 28; - out[currentPos++] = (val << 28) >>> 28; - out[currentPos++] = (valn << 1) >>> 28; - // number : 3, bitwidth : 9 - out[currentPos++] = (valn << 5) >>> 23; - out[currentPos++] = (valn << 14) >>> 23; - out[currentPos++] = (valn << 23) >>> 23; - } - - private void decode32(int val, int valn, int[] out, int currentPos) { - // number : 7, bitwidth : 4 - out[currentPos++] = (val << 8) >>> 28; - out[currentPos++] = (val << 12) >>> 28; - out[currentPos++] = (val << 16) >>> 28; - out[currentPos++] = (val << 20) >>> 28; - out[currentPos++] = (val << 24) >>> 28; - out[currentPos++] = (val << 28) >>> 28; - out[currentPos++] = (valn << 0) >>> 28; - // number : 4, bitwidth : 7 - out[currentPos++] = (valn << 4) >>> 25; - out[currentPos++] = (valn << 11) >>> 25; - out[currentPos++] = (valn << 18) >>> 25; - out[currentPos++] = (valn << 25) >>> 25; - } - - private void decode31(int val, int valn, int[] out, int currentPos) { - // number : 7, bitwidth : 4 - out[currentPos++] = (val << 8) >>> 28; - out[currentPos++] = (val << 12) >>> 28; - out[currentPos++] = (val << 16) >>> 28; - out[currentPos++] = (val << 20) >>> 28; - out[currentPos++] = (val << 24) >>> 28; - out[currentPos++] = (val << 28) >>> 28; - out[currentPos++] = (valn << 3) >>> 28; - // number : 5, bitwidth : 5 - out[currentPos++] = (valn << 7) >>> 27; - out[currentPos++] = (valn << 12) >>> 27; - out[currentPos++] = (valn << 17) >>> 27; - out[currentPos++] = (valn << 22) >>> 27; - out[currentPos++] = (valn << 27) >>> 27; - } - - private void decode30(int val, int valn, int[] out, int currentPos) { - // number : 7, bitwidth : 4 - out[currentPos++] = (val << 8) >>> 28; - out[currentPos++] = (val << 12) >>> 28; - out[currentPos++] = (val << 16) >>> 28; - out[currentPos++] = (val << 20) >>> 28; - out[currentPos++] = (val << 24) >>> 28; - out[currentPos++] = (val << 28) >>> 28; - out[currentPos++] = (valn << 0) >>> 28; - // number : 7, bitwidth : 4 - out[currentPos++] = (valn << 4) >>> 28; - out[currentPos++] = (valn << 8) >>> 28; - out[currentPos++] = (valn << 12) >>> 28; - out[currentPos++] = (valn << 16) >>> 28; - out[currentPos++] = (valn << 20) >>> 28; - out[currentPos++] = (valn << 24) >>> 28; - out[currentPos++] = (valn << 28) >>> 28; - } - - private void decode29(int val, int valn, int[] out, int currentPos) { - // number : 7, bitwidth : 4 - out[currentPos++] = (val << 8) >>> 28; - out[currentPos++] = (val << 12) >>> 28; - out[currentPos++] = (val << 16) >>> 28; - out[currentPos++] = (val << 20) >>> 28; - out[currentPos++] = (val << 24) >>> 28; - out[currentPos++] = (val << 28) >>> 28; - out[currentPos++] = (valn << 1) >>> 28; - // number : 9, bitwidth : 3 - out[currentPos++] = (valn << 5) >>> 29; - out[currentPos++] = (valn << 8) >>> 29; - out[currentPos++] = (valn << 11) >>> 29; - out[currentPos++] = (valn << 14) >>> 29; - out[currentPos++] = (valn << 17) >>> 29; - out[currentPos++] = (valn << 20) >>> 29; - out[currentPos++] = (valn << 23) >>> 29; - out[currentPos++] = (valn << 26) >>> 29; - out[currentPos++] = (valn << 29) >>> 29; - } - - private void decode28(int val, int valn, int[] out, int currentPos) { - // number : 7, bitwidth : 4 - out[currentPos++] = (val << 8) >>> 28; - out[currentPos++] = (val << 12) >>> 28; - out[currentPos++] = (val << 16) >>> 28; - out[currentPos++] = (val << 20) >>> 28; - out[currentPos++] = (val << 24) >>> 28; - out[currentPos++] = (val << 28) >>> 28; - out[currentPos++] = (valn << 0) >>> 28; - // number : 14, bitwidth : 2 - out[currentPos++] = (valn << 4) >>> 30; - out[currentPos++] = (valn << 6) >>> 30; - out[currentPos++] = (valn << 8) >>> 30; - out[currentPos++] = (valn << 10) >>> 30; - out[currentPos++] = (valn << 12) >>> 30; - out[currentPos++] = (valn << 14) >>> 30; - out[currentPos++] = (valn << 16) >>> 30; - out[currentPos++] = (valn << 18) >>> 30; - out[currentPos++] = (valn << 20) >>> 30; - out[currentPos++] = (valn << 22) >>> 30; // 10 - out[currentPos++] = (valn << 24) >>> 30; - out[currentPos++] = (valn << 26) >>> 30; - out[currentPos++] = (valn << 28) >>> 30; - out[currentPos++] = (valn << 30) >>> 30; - } - - private void decode27(int val, int valn, int[] out, int currentPos) { - // number : 7, bitwidth : 4 - out[currentPos++] = (val << 8) >>> 28; - out[currentPos++] = (val << 12) >>> 28; - out[currentPos++] = (val << 16) >>> 28; - out[currentPos++] = (val << 20) >>> 28; - out[currentPos++] = (val << 24) >>> 28; - out[currentPos++] = (val << 28) >>> 28; - out[currentPos++] = (valn << 0) >>> 28; - // number : 28, bitwidth : 1 - out[currentPos++] = (valn << 4) >>> 31; - out[currentPos++] = (valn << 5) >>> 31; - out[currentPos++] = (valn << 6) >>> 31; - out[currentPos++] = (valn << 7) >>> 31; - out[currentPos++] = (valn << 8) >>> 31; - out[currentPos++] = (valn << 9) >>> 31; - out[currentPos++] = (valn << 10) >>> 31; - out[currentPos++] = (valn << 11) >>> 31; - out[currentPos++] = (valn << 12) >>> 31; - out[currentPos++] = (valn << 13) >>> 31; // 10 - out[currentPos++] = (valn << 14) >>> 31; - out[currentPos++] = (valn << 15) >>> 31; - out[currentPos++] = (valn << 16) >>> 31; - out[currentPos++] = (valn << 17) >>> 31; - out[currentPos++] = (valn << 18) >>> 31; - out[currentPos++] = (valn << 19) >>> 31; - out[currentPos++] = (valn << 20) >>> 31; - out[currentPos++] = (valn << 21) >>> 31; - out[currentPos++] = (valn << 22) >>> 31; - out[currentPos++] = (valn << 23) >>> 31; // 20 - out[currentPos++] = (valn << 24) >>> 31; - out[currentPos++] = (valn << 25) >>> 31; - out[currentPos++] = (valn << 26) >>> 31; - out[currentPos++] = (valn << 27) >>> 31; - out[currentPos++] = (valn << 28) >>> 31; - out[currentPos++] = (valn << 29) >>> 31; - out[currentPos++] = (valn << 30) >>> 31; - out[currentPos++] = (valn << 31) >>> 31; - } - - private void decode26(int val, int valn, int[] out, int currentPos) { - // number : 9, bitwidth : 3 - out[currentPos++] = (val << 8) >>> 29; - out[currentPos++] = (val << 11) >>> 29; - out[currentPos++] = (val << 14) >>> 29; - out[currentPos++] = (val << 17) >>> 29; - out[currentPos++] = (val << 20) >>> 29; - out[currentPos++] = (val << 23) >>> 29; - out[currentPos++] = (val << 26) >>> 29; - out[currentPos++] = (val << 29) >>> 29; - out[currentPos++] = (valn << 1) >>> 29; - // number : 1, bitwidth : 28 - out[currentPos++] = (valn << 4) >>> 4; - } - - private void decode25(int val, int valn, int[] out, int currentPos) { - // number : 9, bitwidth : 3 - out[currentPos++] = (val << 8) >>> 29; - out[currentPos++] = (val << 11) >>> 29; - out[currentPos++] = (val << 14) >>> 29; - out[currentPos++] = (val << 17) >>> 29; - out[currentPos++] = (val << 20) >>> 29; - out[currentPos++] = (val << 23) >>> 29; - out[currentPos++] = (val << 26) >>> 29; - out[currentPos++] = (val << 29) >>> 29; - out[currentPos++] = (valn << 1) >>> 29; - // number : 2, bitwidth : 14 - out[currentPos++] = (valn << 4) >>> 18; - out[currentPos++] = (valn << 18) >>> 18; - } - - private void decode24(int val, int valn, int[] out, int currentPos) { - // number : 9, bitwidth : 3 - out[currentPos++] = (val << 8) >>> 29; - out[currentPos++] = (val << 11) >>> 29; - out[currentPos++] = (val << 14) >>> 29; - out[currentPos++] = (val << 17) >>> 29; - out[currentPos++] = (val << 20) >>> 29; - out[currentPos++] = (val << 23) >>> 29; - out[currentPos++] = (val << 26) >>> 29; - out[currentPos++] = (val << 29) >>> 29; - out[currentPos++] = (valn << 2) >>> 29; - // number : 3, bitwidth : 9 - out[currentPos++] = (valn << 5) >>> 23; - out[currentPos++] = (valn << 14) >>> 23; - out[currentPos++] = (valn << 23) >>> 23; - } - - private void decode23(int val, int valn, int[] out, int currentPos) { - // number : 9, bitwidth : 3 - out[currentPos++] = (val << 8) >>> 29; - out[currentPos++] = (val << 11) >>> 29; - out[currentPos++] = (val << 14) >>> 29; - out[currentPos++] = (val << 17) >>> 29; - out[currentPos++] = (val << 20) >>> 29; - out[currentPos++] = (val << 23) >>> 29; - out[currentPos++] = (val << 26) >>> 29; - out[currentPos++] = (val << 29) >>> 29; - out[currentPos++] = (valn << 1) >>> 29; - // number : 4, bitwidth : 7 - out[currentPos++] = (valn << 4) >>> 25; - out[currentPos++] = (valn << 11) >>> 25; - out[currentPos++] = (valn << 18) >>> 25; - out[currentPos++] = (valn << 25) >>> 25; - } - - private void decode22(int val, int valn, int[] out, int currentPos) { - // number : 9, bitwidth : 3 - out[currentPos++] = (val << 8) >>> 29; - out[currentPos++] = (val << 11) >>> 29; - out[currentPos++] = (val << 14) >>> 29; - out[currentPos++] = (val << 17) >>> 29; - out[currentPos++] = (val << 20) >>> 29; - out[currentPos++] = (val << 23) >>> 29; - out[currentPos++] = (val << 26) >>> 29; - out[currentPos++] = (val << 29) >>> 29; - out[currentPos++] = (valn << 4) >>> 29; - // number : 5, bitwidth : 5 - out[currentPos++] = (valn << 7) >>> 27; - out[currentPos++] = (valn << 12) >>> 27; - out[currentPos++] = (valn << 17) >>> 27; - out[currentPos++] = (valn << 22) >>> 27; - out[currentPos++] = (valn << 27) >>> 27; - } - - private void decode21(int val, int valn, int[] out, int currentPos) { - // number : 9, bitwidth : 3 - out[currentPos++] = (val << 8) >>> 29; - out[currentPos++] = (val << 11) >>> 29; - out[currentPos++] = (val << 14) >>> 29; - out[currentPos++] = (val << 17) >>> 29; - out[currentPos++] = (val << 20) >>> 29; - out[currentPos++] = (val << 23) >>> 29; - out[currentPos++] = (val << 26) >>> 29; - out[currentPos++] = (val << 29) >>> 29; - out[currentPos++] = (valn << 1) >>> 29; - // number : 7, bitwidth : 4 - out[currentPos++] = (valn << 4) >>> 28; - out[currentPos++] = (valn << 8) >>> 28; - out[currentPos++] = (valn << 12) >>> 28; - out[currentPos++] = (valn << 16) >>> 28; - out[currentPos++] = (valn << 20) >>> 28; - out[currentPos++] = (valn << 24) >>> 28; - out[currentPos++] = (valn << 28) >>> 28; - } - - private void decode20(int val, int valn, int[] out, int currentPos) { - // number : 9, bitwidth : 3 - out[currentPos++] = (val << 8) >>> 29; - out[currentPos++] = (val << 11) >>> 29; - out[currentPos++] = (val << 14) >>> 29; - out[currentPos++] = (val << 17) >>> 29; - out[currentPos++] = (val << 20) >>> 29; - out[currentPos++] = (val << 23) >>> 29; - out[currentPos++] = (val << 26) >>> 29; - out[currentPos++] = (val << 29) >>> 29; - out[currentPos++] = (valn << 2) >>> 29; - // number : 9, bitwidth : 3 - out[currentPos++] = (valn << 5) >>> 29; - out[currentPos++] = (valn << 8) >>> 29; - out[currentPos++] = (valn << 11) >>> 29; - out[currentPos++] = (valn << 14) >>> 29; - out[currentPos++] = (valn << 17) >>> 29; - out[currentPos++] = (valn << 20) >>> 29; - out[currentPos++] = (valn << 23) >>> 29; - out[currentPos++] = (valn << 26) >>> 29; - out[currentPos++] = (valn << 29) >>> 29; - } - - private void decode19(int val, int valn, int[] out, int currentPos) { - // number : 9, bitwidth : 3 - out[currentPos++] = (val << 8) >>> 29; - out[currentPos++] = (val << 11) >>> 29; - out[currentPos++] = (val << 14) >>> 29; - out[currentPos++] = (val << 17) >>> 29; - out[currentPos++] = (val << 20) >>> 29; - out[currentPos++] = (val << 23) >>> 29; - out[currentPos++] = (val << 26) >>> 29; - out[currentPos++] = (val << 29) >>> 29; - out[currentPos++] = (valn << 1) >>> 29; - // number : 14, bitwidth : 2 - out[currentPos++] = (valn << 4) >>> 30; - out[currentPos++] = (valn << 6) >>> 30; - out[currentPos++] = (valn << 8) >>> 30; - out[currentPos++] = (valn << 10) >>> 30; - out[currentPos++] = (valn << 12) >>> 30; - out[currentPos++] = (valn << 14) >>> 30; - out[currentPos++] = (valn << 16) >>> 30; - out[currentPos++] = (valn << 18) >>> 30; - out[currentPos++] = (valn << 20) >>> 30; - out[currentPos++] = (valn << 22) >>> 30; // 10 - out[currentPos++] = (valn << 24) >>> 30; - out[currentPos++] = (valn << 26) >>> 30; - out[currentPos++] = (valn << 28) >>> 30; - out[currentPos++] = (valn << 30) >>> 30; - } - - private void decode18(int val, int valn, int[] out, int currentPos) { - // number : 9, bitwidth : 3 - out[currentPos++] = (val << 8) >>> 29; - out[currentPos++] = (val << 11) >>> 29; - out[currentPos++] = (val << 14) >>> 29; - out[currentPos++] = (val << 17) >>> 29; - out[currentPos++] = (val << 20) >>> 29; - out[currentPos++] = (val << 23) >>> 29; - out[currentPos++] = (val << 26) >>> 29; - out[currentPos++] = (val << 29) >>> 29; - out[currentPos++] = (valn << 1) >>> 29; - // number : 28, bitwidth : 1 - out[currentPos++] = (valn << 4) >>> 31; - out[currentPos++] = (valn << 5) >>> 31; - out[currentPos++] = (valn << 6) >>> 31; - out[currentPos++] = (valn << 7) >>> 31; - out[currentPos++] = (valn << 8) >>> 31; - out[currentPos++] = (valn << 9) >>> 31; - out[currentPos++] = (valn << 10) >>> 31; - out[currentPos++] = (valn << 11) >>> 31; - out[currentPos++] = (valn << 12) >>> 31; - out[currentPos++] = (valn << 13) >>> 31; // 10 - out[currentPos++] = (valn << 14) >>> 31; - out[currentPos++] = (valn << 15) >>> 31; - out[currentPos++] = (valn << 16) >>> 31; - out[currentPos++] = (valn << 17) >>> 31; - out[currentPos++] = (valn << 18) >>> 31; - out[currentPos++] = (valn << 19) >>> 31; - out[currentPos++] = (valn << 20) >>> 31; - out[currentPos++] = (valn << 21) >>> 31; - out[currentPos++] = (valn << 22) >>> 31; - out[currentPos++] = (valn << 23) >>> 31; // 20 - out[currentPos++] = (valn << 24) >>> 31; - out[currentPos++] = (valn << 25) >>> 31; - out[currentPos++] = (valn << 26) >>> 31; - out[currentPos++] = (valn << 27) >>> 31; - out[currentPos++] = (valn << 28) >>> 31; - out[currentPos++] = (valn << 29) >>> 31; - out[currentPos++] = (valn << 30) >>> 31; - out[currentPos++] = (valn << 31) >>> 31; - } - - private void decode17(int val, int valn, int[] out, int currentPos) { - // number : 14, bitwidth : 2 - out[currentPos++] = (val << 8) >>> 30; - out[currentPos++] = (val << 10) >>> 30; - out[currentPos++] = (val << 12) >>> 30; - out[currentPos++] = (val << 14) >>> 30; - out[currentPos++] = (val << 16) >>> 30; - out[currentPos++] = (val << 18) >>> 30; - out[currentPos++] = (val << 20) >>> 30; - out[currentPos++] = (val << 22) >>> 30; // 10 - out[currentPos++] = (val << 24) >>> 30; - out[currentPos++] = (val << 26) >>> 30; - out[currentPos++] = (val << 28) >>> 30; - out[currentPos++] = (val << 30) >>> 30; - out[currentPos++] = (valn << 0) >>> 30; - out[currentPos++] = (valn << 2) >>> 30; - // number : 1, bitwidth : 28 - out[currentPos++] = (valn << 4) >>> 4; - } - - private void decode16(int val, int valn, int[] out, int currentPos) { - // number : 14, bitwidth : 2 - out[currentPos++] = (val << 8) >>> 30; - out[currentPos++] = (val << 10) >>> 30; - out[currentPos++] = (val << 12) >>> 30; - out[currentPos++] = (val << 14) >>> 30; - out[currentPos++] = (val << 16) >>> 30; - out[currentPos++] = (val << 18) >>> 30; - out[currentPos++] = (val << 20) >>> 30; - out[currentPos++] = (val << 22) >>> 30; // 10 - out[currentPos++] = (val << 24) >>> 30; - out[currentPos++] = (val << 26) >>> 30; - out[currentPos++] = (val << 28) >>> 30; - out[currentPos++] = (val << 30) >>> 30; - out[currentPos++] = (valn << 0) >>> 30; - out[currentPos++] = (valn << 2) >>> 30; - // number : 2, bitwidth : 14 - out[currentPos++] = (valn << 4) >>> 18; - out[currentPos++] = (valn << 18) >>> 18; - } - - private void decode15(int val, int valn, int[] out, int currentPos) { - // number : 14, bitwidth : 2 - out[currentPos++] = (val << 8) >>> 30; - out[currentPos++] = (val << 10) >>> 30; - out[currentPos++] = (val << 12) >>> 30; - out[currentPos++] = (val << 14) >>> 30; - out[currentPos++] = (val << 16) >>> 30; - out[currentPos++] = (val << 18) >>> 30; - out[currentPos++] = (val << 20) >>> 30; - out[currentPos++] = (val << 22) >>> 30; // 10 - out[currentPos++] = (val << 24) >>> 30; - out[currentPos++] = (val << 26) >>> 30; - out[currentPos++] = (val << 28) >>> 30; - out[currentPos++] = (val << 30) >>> 30; - out[currentPos++] = (valn << 1) >>> 30; - out[currentPos++] = (valn << 3) >>> 30; - // number : 3, bitwidth : 9 - out[currentPos++] = (valn << 5) >>> 23; - out[currentPos++] = (valn << 14) >>> 23; - out[currentPos++] = (valn << 23) >>> 23; - } - - private void decode14(int val, int valn, int[] out, int currentPos) { - // number : 14, bitwidth : 2 - out[currentPos++] = (val << 8) >>> 30; - out[currentPos++] = (val << 10) >>> 30; - out[currentPos++] = (val << 12) >>> 30; - out[currentPos++] = (val << 14) >>> 30; - out[currentPos++] = (val << 16) >>> 30; - out[currentPos++] = (val << 18) >>> 30; - out[currentPos++] = (val << 20) >>> 30; - out[currentPos++] = (val << 22) >>> 30; // 10 - out[currentPos++] = (val << 24) >>> 30; - out[currentPos++] = (val << 26) >>> 30; - out[currentPos++] = (val << 28) >>> 30; - out[currentPos++] = (val << 30) >>> 30; - out[currentPos++] = (valn << 0) >>> 30; - out[currentPos++] = (valn << 2) >>> 30; - // number : 4, bitwidth : 7 - out[currentPos++] = (valn << 4) >>> 25; - out[currentPos++] = (valn << 11) >>> 25; - out[currentPos++] = (valn << 18) >>> 25; - out[currentPos++] = (valn << 25) >>> 25; - } - - private void decode13(int val, int valn, int[] out, int currentPos) { - // number : 14, bitwidth : 2 - out[currentPos++] = (val << 8) >>> 30; - out[currentPos++] = (val << 10) >>> 30; - out[currentPos++] = (val << 12) >>> 30; - out[currentPos++] = (val << 14) >>> 30; - out[currentPos++] = (val << 16) >>> 30; - out[currentPos++] = (val << 18) >>> 30; - out[currentPos++] = (val << 20) >>> 30; - out[currentPos++] = (val << 22) >>> 30; // 10 - out[currentPos++] = (val << 24) >>> 30; - out[currentPos++] = (val << 26) >>> 30; - out[currentPos++] = (val << 28) >>> 30; - out[currentPos++] = (val << 30) >>> 30; - out[currentPos++] = (valn << 3) >>> 30; - out[currentPos++] = (valn << 5) >>> 30; - // number : 5, bitwidth : 5 - out[currentPos++] = (valn << 7) >>> 27; - out[currentPos++] = (valn << 12) >>> 27; - out[currentPos++] = (valn << 17) >>> 27; - out[currentPos++] = (valn << 22) >>> 27; - out[currentPos++] = (valn << 27) >>> 27; - - } - - private void decode12(int val, int valn, int[] out, int currentPos) { - // number : 14, bitwidth : 2 - out[currentPos++] = (val << 8) >>> 30; - out[currentPos++] = (val << 10) >>> 30; - out[currentPos++] = (val << 12) >>> 30; - out[currentPos++] = (val << 14) >>> 30; - out[currentPos++] = (val << 16) >>> 30; - out[currentPos++] = (val << 18) >>> 30; - out[currentPos++] = (val << 20) >>> 30; - out[currentPos++] = (val << 22) >>> 30; // 10 - out[currentPos++] = (val << 24) >>> 30; - out[currentPos++] = (val << 26) >>> 30; - out[currentPos++] = (val << 28) >>> 30; - out[currentPos++] = (val << 30) >>> 30; - out[currentPos++] = (valn << 0) >>> 30; - out[currentPos++] = (valn << 2) >>> 30; - // number : 7, bitwidth : 4 - out[currentPos++] = (valn << 4) >>> 28; - out[currentPos++] = (valn << 8) >>> 28; - out[currentPos++] = (valn << 12) >>> 28; - out[currentPos++] = (valn << 16) >>> 28; - out[currentPos++] = (valn << 20) >>> 28; - out[currentPos++] = (valn << 24) >>> 28; - out[currentPos++] = (valn << 28) >>> 28; - - } - - private void decode11(int val, int valn, int[] out, int currentPos) { - // number : 14, bitwidth : 2 - out[currentPos++] = (val << 8) >>> 30; - out[currentPos++] = (val << 10) >>> 30; - out[currentPos++] = (val << 12) >>> 30; - out[currentPos++] = (val << 14) >>> 30; - out[currentPos++] = (val << 16) >>> 30; - out[currentPos++] = (val << 18) >>> 30; - out[currentPos++] = (val << 20) >>> 30; - out[currentPos++] = (val << 22) >>> 30; // 10 - out[currentPos++] = (val << 24) >>> 30; - out[currentPos++] = (val << 26) >>> 30; - out[currentPos++] = (val << 28) >>> 30; - out[currentPos++] = (val << 30) >>> 30; - out[currentPos++] = (valn << 1) >>> 30; - out[currentPos++] = (valn << 3) >>> 30; - // number : 9, bitwidth : 3 - out[currentPos++] = (valn << 5) >>> 29; - out[currentPos++] = (valn << 8) >>> 29; - out[currentPos++] = (valn << 11) >>> 29; - out[currentPos++] = (valn << 14) >>> 29; - out[currentPos++] = (valn << 17) >>> 29; - out[currentPos++] = (valn << 20) >>> 29; - out[currentPos++] = (valn << 23) >>> 29; - out[currentPos++] = (valn << 26) >>> 29; - out[currentPos++] = (valn << 29) >>> 29; - - } - - private void decode10(int val, int valn, int[] out, int currentPos) { - // number : 14, bitwidth : 2 - out[currentPos++] = (val << 8) >>> 30; - out[currentPos++] = (val << 10) >>> 30; - out[currentPos++] = (val << 12) >>> 30; - out[currentPos++] = (val << 14) >>> 30; - out[currentPos++] = (val << 16) >>> 30; - out[currentPos++] = (val << 18) >>> 30; - out[currentPos++] = (val << 20) >>> 30; - out[currentPos++] = (val << 22) >>> 30; // 10 - out[currentPos++] = (val << 24) >>> 30; - out[currentPos++] = (val << 26) >>> 30; - out[currentPos++] = (val << 28) >>> 30; - out[currentPos++] = (val << 30) >>> 30; - out[currentPos++] = (valn << 0) >>> 30; - out[currentPos++] = (valn << 2) >>> 30; - // number : 14, bitwidth : 2 - out[currentPos++] = (valn << 4) >>> 30; - out[currentPos++] = (valn << 6) >>> 30; - out[currentPos++] = (valn << 8) >>> 30; - out[currentPos++] = (valn << 10) >>> 30; - out[currentPos++] = (valn << 12) >>> 30; - out[currentPos++] = (valn << 14) >>> 30; - out[currentPos++] = (valn << 16) >>> 30; - out[currentPos++] = (valn << 18) >>> 30; - out[currentPos++] = (valn << 20) >>> 30; - out[currentPos++] = (valn << 22) >>> 30; // 10 - out[currentPos++] = (valn << 24) >>> 30; - out[currentPos++] = (valn << 26) >>> 30; - out[currentPos++] = (valn << 28) >>> 30; - out[currentPos++] = (valn << 30) >>> 30; - } - - private void decode9(int val, int valn, int[] out, int currentPos) { - // number : 14, bitwidth : 2 - out[currentPos++] = (val << 8) >>> 30; - out[currentPos++] = (val << 10) >>> 30; - out[currentPos++] = (val << 12) >>> 30; - out[currentPos++] = (val << 14) >>> 30; - out[currentPos++] = (val << 16) >>> 30; - out[currentPos++] = (val << 18) >>> 30; - out[currentPos++] = (val << 20) >>> 30; - out[currentPos++] = (val << 22) >>> 30; // 10 - out[currentPos++] = (val << 24) >>> 30; - out[currentPos++] = (val << 26) >>> 30; - out[currentPos++] = (val << 28) >>> 30; - out[currentPos++] = (val << 30) >>> 30; - out[currentPos++] = (valn << 0) >>> 30; - out[currentPos++] = (valn << 2) >>> 30; - // number : 28, bitwidth : 1 - out[currentPos++] = (valn << 4) >>> 31; - out[currentPos++] = (valn << 5) >>> 31; - out[currentPos++] = (valn << 6) >>> 31; - out[currentPos++] = (valn << 7) >>> 31; - out[currentPos++] = (valn << 8) >>> 31; - out[currentPos++] = (valn << 9) >>> 31; - out[currentPos++] = (valn << 10) >>> 31; - out[currentPos++] = (valn << 11) >>> 31; - out[currentPos++] = (valn << 12) >>> 31; - out[currentPos++] = (valn << 13) >>> 31; // 10 - out[currentPos++] = (valn << 14) >>> 31; - out[currentPos++] = (valn << 15) >>> 31; - out[currentPos++] = (valn << 16) >>> 31; - out[currentPos++] = (valn << 17) >>> 31; - out[currentPos++] = (valn << 18) >>> 31; - out[currentPos++] = (valn << 19) >>> 31; - out[currentPos++] = (valn << 20) >>> 31; - out[currentPos++] = (valn << 21) >>> 31; - out[currentPos++] = (valn << 22) >>> 31; - out[currentPos++] = (valn << 23) >>> 31; // 20 - out[currentPos++] = (valn << 24) >>> 31; - out[currentPos++] = (valn << 25) >>> 31; - out[currentPos++] = (valn << 26) >>> 31; - out[currentPos++] = (valn << 27) >>> 31; - out[currentPos++] = (valn << 28) >>> 31; - out[currentPos++] = (valn << 29) >>> 31; - out[currentPos++] = (valn << 30) >>> 31; - out[currentPos++] = (valn << 31) >>> 31; - } - - private void decode8(int val, int valn, int[] out, int currentPos) { - // number : 28, bitwidth : 1 - out[currentPos++] = (val << 8) >>> 31; - out[currentPos++] = (val << 9) >>> 31; - out[currentPos++] = (val << 10) >>> 31; - out[currentPos++] = (val << 11) >>> 31; - out[currentPos++] = (val << 12) >>> 31; - out[currentPos++] = (val << 13) >>> 31; // 10 - out[currentPos++] = (val << 14) >>> 31; - out[currentPos++] = (val << 15) >>> 31; - out[currentPos++] = (val << 16) >>> 31; - out[currentPos++] = (val << 17) >>> 31; - out[currentPos++] = (val << 18) >>> 31; - out[currentPos++] = (val << 19) >>> 31; - out[currentPos++] = (val << 20) >>> 31; - out[currentPos++] = (val << 21) >>> 31; - out[currentPos++] = (val << 22) >>> 31; - out[currentPos++] = (val << 23) >>> 31; // 20 - out[currentPos++] = (val << 24) >>> 31; - out[currentPos++] = (val << 25) >>> 31; - out[currentPos++] = (val << 26) >>> 31; - out[currentPos++] = (val << 27) >>> 31; - out[currentPos++] = (val << 28) >>> 31; - out[currentPos++] = (val << 29) >>> 31; - out[currentPos++] = (val << 30) >>> 31; - out[currentPos++] = (val << 31) >>> 31; - out[currentPos++] = valn >>> 31; - out[currentPos++] = (valn << 1) >>> 31; - out[currentPos++] = (valn << 2) >>> 31; - out[currentPos++] = (valn << 3) >>> 31; - // number : 1, bitwidth : 28 - out[currentPos++] = (valn << 4) >>> 4; - } - - private void decode7(int val, int valn, int[] out, int currentPos) { - // number : 28, bitwidth : 1 - out[currentPos++] = (val << 8) >>> 31; - out[currentPos++] = (val << 9) >>> 31; - out[currentPos++] = (val << 10) >>> 31; - out[currentPos++] = (val << 11) >>> 31; - out[currentPos++] = (val << 12) >>> 31; - out[currentPos++] = (val << 13) >>> 31; // 10 - out[currentPos++] = (val << 14) >>> 31; - out[currentPos++] = (val << 15) >>> 31; - out[currentPos++] = (val << 16) >>> 31; - out[currentPos++] = (val << 17) >>> 31; - out[currentPos++] = (val << 18) >>> 31; - out[currentPos++] = (val << 19) >>> 31; - out[currentPos++] = (val << 20) >>> 31; - out[currentPos++] = (val << 21) >>> 31; - out[currentPos++] = (val << 22) >>> 31; - out[currentPos++] = (val << 23) >>> 31; // 20 - out[currentPos++] = (val << 24) >>> 31; - out[currentPos++] = (val << 25) >>> 31; - out[currentPos++] = (val << 26) >>> 31; - out[currentPos++] = (val << 27) >>> 31; - out[currentPos++] = (val << 28) >>> 31; - out[currentPos++] = (val << 29) >>> 31; - out[currentPos++] = (val << 30) >>> 31; - out[currentPos++] = (val << 31) >>> 31; - out[currentPos++] = valn >>> 31; - out[currentPos++] = (valn << 1) >>> 31; - out[currentPos++] = (valn << 2) >>> 31; - out[currentPos++] = (valn << 3) >>> 31; - // number : 2, bitwidth : 14 - out[currentPos++] = (valn << 4) >>> 18; - out[currentPos++] = (valn << 18) >>> 18; - } - - private void decode6(int val, int valn, int[] out, int currentPos) { - // number : 28, bitwidth : 1 - out[currentPos++] = (val << 8) >>> 31; - out[currentPos++] = (val << 9) >>> 31; - out[currentPos++] = (val << 10) >>> 31; - out[currentPos++] = (val << 11) >>> 31; - out[currentPos++] = (val << 12) >>> 31; - out[currentPos++] = (val << 13) >>> 31; // 10 - out[currentPos++] = (val << 14) >>> 31; - out[currentPos++] = (val << 15) >>> 31; - out[currentPos++] = (val << 16) >>> 31; - out[currentPos++] = (val << 17) >>> 31; - out[currentPos++] = (val << 18) >>> 31; - out[currentPos++] = (val << 19) >>> 31; - out[currentPos++] = (val << 20) >>> 31; - out[currentPos++] = (val << 21) >>> 31; - out[currentPos++] = (val << 22) >>> 31; - out[currentPos++] = (val << 23) >>> 31; // 20 - out[currentPos++] = (val << 24) >>> 31; - out[currentPos++] = (val << 25) >>> 31; - out[currentPos++] = (val << 26) >>> 31; - out[currentPos++] = (val << 27) >>> 31; - out[currentPos++] = (val << 28) >>> 31; - out[currentPos++] = (val << 29) >>> 31; - out[currentPos++] = (val << 30) >>> 31; - out[currentPos++] = (val << 31) >>> 31; - out[currentPos++] = (valn << 1) >>> 31; - out[currentPos++] = (valn << 2) >>> 31; - out[currentPos++] = (valn << 3) >>> 31; - out[currentPos++] = (valn << 4) >>> 31; - // number : 3, bitwidth : 9 - out[currentPos++] = (valn << 5) >>> 23; - out[currentPos++] = (valn << 14) >>> 23; - out[currentPos++] = (valn << 23) >>> 23; - } - - private void decode5(int val, int valn, int[] out, int currentPos) { - // number : 28, bitwidth : 1 - out[currentPos++] = (val << 8) >>> 31; - out[currentPos++] = (val << 9) >>> 31; - out[currentPos++] = (val << 10) >>> 31; - out[currentPos++] = (val << 11) >>> 31; - out[currentPos++] = (val << 12) >>> 31; - out[currentPos++] = (val << 13) >>> 31; // 10 - out[currentPos++] = (val << 14) >>> 31; - out[currentPos++] = (val << 15) >>> 31; - out[currentPos++] = (val << 16) >>> 31; - out[currentPos++] = (val << 17) >>> 31; - out[currentPos++] = (val << 18) >>> 31; - out[currentPos++] = (val << 19) >>> 31; - out[currentPos++] = (val << 20) >>> 31; - out[currentPos++] = (val << 21) >>> 31; - out[currentPos++] = (val << 22) >>> 31; - out[currentPos++] = (val << 23) >>> 31; // 20 - out[currentPos++] = (val << 24) >>> 31; - out[currentPos++] = (val << 25) >>> 31; - out[currentPos++] = (val << 26) >>> 31; - out[currentPos++] = (val << 27) >>> 31; - out[currentPos++] = (val << 28) >>> 31; - out[currentPos++] = (val << 29) >>> 31; - out[currentPos++] = (val << 30) >>> 31; - out[currentPos++] = (val << 31) >>> 31; - out[currentPos++] = valn >>> 31; - out[currentPos++] = (valn << 1) >>> 31; - out[currentPos++] = (valn << 2) >>> 31; - out[currentPos++] = (valn << 3) >>> 31; - // number : 4, bitwidth : 7 - out[currentPos++] = (valn << 4) >>> 25; - out[currentPos++] = (valn << 11) >>> 25; - out[currentPos++] = (valn << 18) >>> 25; - out[currentPos++] = (valn << 25) >>> 25; - } - - private void decode4(int val, int valn, int[] out, int currentPos) { - // number : 28, bitwidth : 1 - out[currentPos++] = (val << 8) >>> 31; - out[currentPos++] = (val << 9) >>> 31; - out[currentPos++] = (val << 10) >>> 31; - out[currentPos++] = (val << 11) >>> 31; - out[currentPos++] = (val << 12) >>> 31; - out[currentPos++] = (val << 13) >>> 31; // 10 - out[currentPos++] = (val << 14) >>> 31; - out[currentPos++] = (val << 15) >>> 31; - out[currentPos++] = (val << 16) >>> 31; - out[currentPos++] = (val << 17) >>> 31; - out[currentPos++] = (val << 18) >>> 31; - out[currentPos++] = (val << 19) >>> 31; - out[currentPos++] = (val << 20) >>> 31; - out[currentPos++] = (val << 21) >>> 31; - out[currentPos++] = (val << 22) >>> 31; - out[currentPos++] = (val << 23) >>> 31; // 20 - out[currentPos++] = (val << 24) >>> 31; - out[currentPos++] = (val << 25) >>> 31; - out[currentPos++] = (val << 26) >>> 31; - out[currentPos++] = (val << 27) >>> 31; - out[currentPos++] = (val << 28) >>> 31; - out[currentPos++] = (val << 29) >>> 31; - out[currentPos++] = (val << 30) >>> 31; - out[currentPos++] = (val << 31) >>> 31; - out[currentPos++] = (valn << 3) >>> 31;// 头部3bit - out[currentPos++] = (valn << 4) >>> 31; - out[currentPos++] = (valn << 5) >>> 31; - out[currentPos++] = (valn << 6) >>> 31; - // number : 5, bitwidth : 5 - out[currentPos++] = (valn << 7) >>> 27; - out[currentPos++] = (valn << 12) >>> 27; - out[currentPos++] = (valn << 17) >>> 27; - out[currentPos++] = (valn << 22) >>> 27; - out[currentPos++] = (valn << 27) >>> 27; - } - - private void decode3(int val, int valn, int[] out, int currentPos) { - // number : 28, bitwidth : 1 - out[currentPos++] = (val << 8) >>> 31; - out[currentPos++] = (val << 9) >>> 31; - out[currentPos++] = (val << 10) >>> 31; - out[currentPos++] = (val << 11) >>> 31; - out[currentPos++] = (val << 12) >>> 31; - out[currentPos++] = (val << 13) >>> 31; // 10 - out[currentPos++] = (val << 14) >>> 31; - out[currentPos++] = (val << 15) >>> 31; - out[currentPos++] = (val << 16) >>> 31; - out[currentPos++] = (val << 17) >>> 31; - out[currentPos++] = (val << 18) >>> 31; - out[currentPos++] = (val << 19) >>> 31; - out[currentPos++] = (val << 20) >>> 31; - out[currentPos++] = (val << 21) >>> 31; - out[currentPos++] = (val << 22) >>> 31; - out[currentPos++] = (val << 23) >>> 31; // 20 - out[currentPos++] = (val << 24) >>> 31; - out[currentPos++] = (val << 25) >>> 31; - out[currentPos++] = (val << 26) >>> 31; - out[currentPos++] = (val << 27) >>> 31; - out[currentPos++] = (val << 28) >>> 31; - out[currentPos++] = (val << 29) >>> 31; - out[currentPos++] = (val << 30) >>> 31; - out[currentPos++] = (val << 31) >>> 31; - out[currentPos++] = valn >>> 31; - out[currentPos++] = (valn << 1) >>> 31; - out[currentPos++] = (valn << 2) >>> 31; - out[currentPos++] = (valn << 3) >>> 31; - // number : 7, bitwidth : 4 - out[currentPos++] = (valn << 4) >>> 28; - out[currentPos++] = (valn << 8) >>> 28; - out[currentPos++] = (valn << 12) >>> 28; - out[currentPos++] = (valn << 16) >>> 28; - out[currentPos++] = (valn << 20) >>> 28; - out[currentPos++] = (valn << 24) >>> 28; - out[currentPos++] = (valn << 28) >>> 28; - } - - private void decode2(int val, int valn, int[] out, int currentPos) { - // number : 28, bitwidth : 1 - out[currentPos++] = (val << 8) >>> 31; - out[currentPos++] = (val << 9) >>> 31; - out[currentPos++] = (val << 10) >>> 31; - out[currentPos++] = (val << 11) >>> 31; - out[currentPos++] = (val << 12) >>> 31; - out[currentPos++] = (val << 13) >>> 31; // 10 - out[currentPos++] = (val << 14) >>> 31; - out[currentPos++] = (val << 15) >>> 31; - out[currentPos++] = (val << 16) >>> 31; - out[currentPos++] = (val << 17) >>> 31; - out[currentPos++] = (val << 18) >>> 31; - out[currentPos++] = (val << 19) >>> 31; - out[currentPos++] = (val << 20) >>> 31; - out[currentPos++] = (val << 21) >>> 31; - out[currentPos++] = (val << 22) >>> 31; - out[currentPos++] = (val << 23) >>> 31; // 20 - out[currentPos++] = (val << 24) >>> 31; - out[currentPos++] = (val << 25) >>> 31; - out[currentPos++] = (val << 26) >>> 31; - out[currentPos++] = (val << 27) >>> 31; - out[currentPos++] = (val << 28) >>> 31; - out[currentPos++] = (val << 29) >>> 31; - out[currentPos++] = (val << 30) >>> 31; - out[currentPos++] = (val << 31) >>> 31; - out[currentPos++] = (valn << 1) >>> 31;// 头部1bit - out[currentPos++] = (valn << 2) >>> 31; - out[currentPos++] = (valn << 3) >>> 31; - out[currentPos++] = (valn << 4) >>> 31; - // number : 9, bitwidth : 3 - out[currentPos++] = (valn << 5) >>> 29; - out[currentPos++] = (valn << 8) >>> 29; - out[currentPos++] = (valn << 11) >>> 29; - out[currentPos++] = (valn << 14) >>> 29; - out[currentPos++] = (valn << 17) >>> 29; - out[currentPos++] = (valn << 20) >>> 29; - out[currentPos++] = (valn << 23) >>> 29; - out[currentPos++] = (valn << 26) >>> 29; - out[currentPos++] = (valn << 29) >>> 29; - } - - private void decode1(int val, int valn, int[] out, int currentPos) { - // number : 28, bitwidth : 1 - out[currentPos++] = (val << 8) >>> 31; - out[currentPos++] = (val << 9) >>> 31; - out[currentPos++] = (val << 10) >>> 31; - out[currentPos++] = (val << 11) >>> 31; - out[currentPos++] = (val << 12) >>> 31; - out[currentPos++] = (val << 13) >>> 31; // 10 - out[currentPos++] = (val << 14) >>> 31; - out[currentPos++] = (val << 15) >>> 31; - out[currentPos++] = (val << 16) >>> 31; - out[currentPos++] = (val << 17) >>> 31; - out[currentPos++] = (val << 18) >>> 31; - out[currentPos++] = (val << 19) >>> 31; - out[currentPos++] = (val << 20) >>> 31; - out[currentPos++] = (val << 21) >>> 31; - out[currentPos++] = (val << 22) >>> 31; - out[currentPos++] = (val << 23) >>> 31;// 20 - out[currentPos++] = (val << 24) >>> 31; - out[currentPos++] = (val << 25) >>> 31; - out[currentPos++] = (val << 26) >>> 31; - out[currentPos++] = (val << 27) >>> 31; - out[currentPos++] = (val << 28) >>> 31; - out[currentPos++] = (val << 29) >>> 31; - out[currentPos++] = (val << 30) >>> 31; - out[currentPos++] = (val << 31) >>> 31; - out[currentPos++] = valn >>> 31; - out[currentPos++] = (valn << 1) >>> 31; - out[currentPos++] = (valn << 2) >>> 31; - out[currentPos++] = (valn << 3) >>> 31; - // number : 14, bitwidth : 2 - out[currentPos++] = (valn << 4) >>> 30; - out[currentPos++] = (valn << 6) >>> 30; - out[currentPos++] = (valn << 8) >>> 30; - out[currentPos++] = (valn << 10) >>> 30; - out[currentPos++] = (valn << 12) >>> 30; - out[currentPos++] = (valn << 14) >>> 30; - out[currentPos++] = (valn << 16) >>> 30; - out[currentPos++] = (valn << 18) >>> 30; - out[currentPos++] = (valn << 20) >>> 30; - out[currentPos++] = (valn << 22) >>> 30; // 10 - out[currentPos++] = (valn << 24) >>> 30; - out[currentPos++] = (valn << 26) >>> 30; - out[currentPos++] = (valn << 28) >>> 30; - out[currentPos++] = (valn << 30) >>> 30; - } - - private void decode0(int val, int valn, int[] out, int currentPos) { - // number : 28, bitwidth : 1 - out[currentPos++] = (val << 8) >>> 31; - out[currentPos++] = (val << 9) >>> 31; - out[currentPos++] = (val << 10) >>> 31; - out[currentPos++] = (val << 11) >>> 31; - out[currentPos++] = (val << 12) >>> 31; - out[currentPos++] = (val << 13) >>> 31; // 10 - out[currentPos++] = (val << 14) >>> 31; - out[currentPos++] = (val << 15) >>> 31; - out[currentPos++] = (val << 16) >>> 31; - out[currentPos++] = (val << 17) >>> 31; - out[currentPos++] = (val << 18) >>> 31; - out[currentPos++] = (val << 19) >>> 31; - out[currentPos++] = (val << 20) >>> 31; - out[currentPos++] = (val << 21) >>> 31; - out[currentPos++] = (val << 22) >>> 31; - out[currentPos++] = (val << 23) >>> 31; // 20 - out[currentPos++] = (val << 24) >>> 31; - out[currentPos++] = (val << 25) >>> 31; - out[currentPos++] = (val << 26) >>> 31; - out[currentPos++] = (val << 27) >>> 31; - out[currentPos++] = (val << 28) >>> 31; - out[currentPos++] = (val << 29) >>> 31; - out[currentPos++] = (val << 30) >>> 31; - out[currentPos++] = (val << 31) >>> 31; - out[currentPos++] = valn >>> 31; - out[currentPos++] = (valn << 1) >>> 31; - out[currentPos++] = (valn << 2) >>> 31; - out[currentPos++] = (valn << 3) >>> 31; - // number : 28, bitwidth : 1 - out[currentPos++] = (valn << 4) >>> 31; - out[currentPos++] = (valn << 5) >>> 31; - out[currentPos++] = (valn << 6) >>> 31; - out[currentPos++] = (valn << 7) >>> 31; - out[currentPos++] = (valn << 8) >>> 31; - out[currentPos++] = (valn << 9) >>> 31; - out[currentPos++] = (valn << 10) >>> 31; - out[currentPos++] = (valn << 11) >>> 31; - out[currentPos++] = (valn << 12) >>> 31; - out[currentPos++] = (valn << 13) >>> 31; // 10 - out[currentPos++] = (valn << 14) >>> 31; - out[currentPos++] = (valn << 15) >>> 31; - out[currentPos++] = (valn << 16) >>> 31; - out[currentPos++] = (valn << 17) >>> 31; - out[currentPos++] = (valn << 18) >>> 31; - out[currentPos++] = (valn << 19) >>> 31; - out[currentPos++] = (valn << 20) >>> 31; - out[currentPos++] = (valn << 21) >>> 31; - out[currentPos++] = (valn << 22) >>> 31; - out[currentPos++] = (valn << 23) >>> 31; // 20 - out[currentPos++] = (valn << 24) >>> 31; - out[currentPos++] = (valn << 25) >>> 31; - out[currentPos++] = (valn << 26) >>> 31; - out[currentPos++] = (valn << 27) >>> 31; - out[currentPos++] = (valn << 28) >>> 31; - out[currentPos++] = (valn << 29) >>> 31; - out[currentPos++] = (valn << 30) >>> 31; - out[currentPos++] = (valn << 31) >>> 31; - } - - - private final static int bitLength[] = { 1, 2, 3, 4, 5, 7, 9, 14, 28 }; - - private final static int codeNum[] = { 28, 14, 9, 7, 5, 4, 3, 2, 1 }; - - @Override - public String toString() { - return this.getClass().getSimpleName(); - } - - @Override - public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - int tmpoutpos = outpos.get(); - int currentPos = inpos.get(); - int selector1 = 0; - int selector2 = 0; - final int finalin = currentPos + inlength; - while (currentPos < finalin - 28 * 2) { - int nextCurrentPos = currentPos; - mainloop1: for (selector1=0; selector1 <= 8; selector1++) { - int compressedNum = codeNum[selector1]; - //if (finalin <= nextCurrentPos + compressedNum - 1) - // compressedNum = finalin - nextCurrentPos; - int b = bitLength[selector1]; - int max = 1 << b; - int i = 0; - for (; i < compressedNum; i++) { - if (Util.smallerorequalthan(max, in[nextCurrentPos + i])) - continue mainloop1; - } - nextCurrentPos += compressedNum; - break; - } - mainloop2: for (selector2 = 0; selector2 <= 8; selector2++) { - int compressedNum = codeNum[selector2]; - //if (finalin <= nextCurrentPos + compressedNum - 1) - // compressedNum = finalin - nextCurrentPos; - int b = bitLength[selector2]; - int max = 1 << b; - int i = 0; - for (; i < compressedNum; i++) { - if (Util.smallerorequalthan(max, in[nextCurrentPos + i])) - continue mainloop2; - } - nextCurrentPos += compressedNum; - break; - } - int code = M[selector1][selector2]; - out[tmpoutpos] = 0; - out[tmpoutpos + 1] = 0; - switch (code) { - case 0: - encode0(in, currentPos, code, out, tmpoutpos); - break; - case 1: - encode1(in, currentPos, code, out, tmpoutpos); - break; - case 2: - encode2(in, currentPos, code, out, tmpoutpos); - break; - case 3: - encode3(in, currentPos, code, out, tmpoutpos); - break; - case 4: - encode4(in, currentPos, code, out, tmpoutpos); - break; - case 5: - encode5(in, currentPos, code, out, tmpoutpos); - break; - case 6: - encode6(in, currentPos, code, out, tmpoutpos); - break; - case 7: - encode7(in, currentPos, code, out, tmpoutpos); - break; - case 8: - encode8(in, currentPos, code, out, tmpoutpos); - break; - case 9: - encode9(in, currentPos, code, out, tmpoutpos); - break; - case 10: - encode10(in, currentPos, code, out, tmpoutpos); - break; - case 11: - encode11(in, currentPos, code, out, tmpoutpos); - break; - case 12: - encode12(in, currentPos, code, out, tmpoutpos); - break; - case 13: - encode13(in, currentPos, code, out, tmpoutpos); - break; - case 14: - encode14(in, currentPos, code, out, tmpoutpos); - break; - case 15: - encode15(in, currentPos, code, out, tmpoutpos); - break; - case 16: - encode16(in, currentPos, code, out, tmpoutpos); - break; - case 17: - encode17(in, currentPos, code, out, tmpoutpos); - break; - case 18: - encode18(in, currentPos, code, out, tmpoutpos); - break; - case 19: - encode19(in, currentPos, code, out, tmpoutpos); - break; - case 20: - encode20(in, currentPos, code, out, tmpoutpos); - break; - case 21: - encode21(in, currentPos, code, out, tmpoutpos); - break; - case 22: - encode22(in, currentPos, code, out, tmpoutpos); - break; - case 23: - encode23(in, currentPos, code, out, tmpoutpos); - break; - case 24: - encode24(in, currentPos, code, out, tmpoutpos); - break; - case 25: - encode25(in, currentPos, code, out, tmpoutpos); - break; - case 26: - encode26(in, currentPos, code, out, tmpoutpos); - break; - case 27: - encode27(in, currentPos, code, out, tmpoutpos); - break; - case 28: - encode28(in, currentPos, code, out, tmpoutpos); - break; - case 29: - encode29(in, currentPos, code, out, tmpoutpos); - break; - case 30: - encode30(in, currentPos, code, out, tmpoutpos); - break; - case 31: - encode31(in, currentPos, code, out, tmpoutpos); - break; - case 32: - encode32(in, currentPos, code, out, tmpoutpos); - break; - case 33: - encode33(in, currentPos, code, out, tmpoutpos); - break; - case 34: - encode34(in, currentPos, code, out, tmpoutpos); - break; - case 35: - encode35(in, currentPos, code, out, tmpoutpos); - break; - case 36: - encode36(in, currentPos, code, out, tmpoutpos); - break; - case 37: - encode37(in, currentPos, code, out, tmpoutpos); - break; - case 38: - encode38(in, currentPos, code, out, tmpoutpos); - break; - case 39: - encode39(in, currentPos, code, out, tmpoutpos); - break; - case 40: - encode40(in, currentPos, code, out, tmpoutpos); - break; - case 41: - encode41(in, currentPos, code, out, tmpoutpos); - break; - case 42: - encode42(in, currentPos, code, out, tmpoutpos); - break; - case 43: - encode43(in, currentPos, code, out, tmpoutpos); - break; - case 44: - encode44(in, currentPos, code, out, tmpoutpos); - break; - case 45: - encode45(in, currentPos, code, out, tmpoutpos); - break; - case 46: - encode46(in, currentPos, code, out, tmpoutpos); - break; - case 47: - encode47(in, currentPos, code, out, tmpoutpos); - break; - case 48: - encode48(in, currentPos, code, out, tmpoutpos); - break; - case 49: - encode49(in, currentPos, code, out, tmpoutpos); - break; - case 50: - encode50(in, currentPos, code, out, tmpoutpos); - break; - case 51: - encode51(in, currentPos, code, out, tmpoutpos); - break; - case 52: - encode52(in, currentPos, code, out, tmpoutpos); - break; - case 53: - encode53(in, currentPos, code, out, tmpoutpos); - break; - case 54: - encode54(in, currentPos, code, out, tmpoutpos); - break; - case 55: - encode55(in, currentPos, code, out, tmpoutpos); - break; - case 56: - encode56(in, currentPos, code, out, tmpoutpos); - break; - case 57: - encode57(in, currentPos, code, out, tmpoutpos); - break; - case 58: - encode58(in, currentPos, code, out, tmpoutpos); - break; - case 59: - encode59(in, currentPos, code, out, tmpoutpos); - break; - case 60: - encode60(in, currentPos, code, out, tmpoutpos); - break; - case 61: - encode61(in, currentPos, code, out, tmpoutpos); - break; - case 62: - encode62(in, currentPos, code, out, tmpoutpos); - break; - case 63: - encode63(in, currentPos, code, out, tmpoutpos); - break; - case 64: - encode64(in, currentPos, code, out, tmpoutpos); - break; - case 65: - encode65(in, currentPos, code, out, tmpoutpos); - break; - case 66: - encode66(in, currentPos, code, out, tmpoutpos); - break; - case 67: - encode67(in, currentPos, code, out, tmpoutpos); - break; - case 68: - encode68(in, currentPos, code, out, tmpoutpos); - break; - case 69: - encode69(in, currentPos, code, out, tmpoutpos); - break; - case 70: - encode70(in, currentPos, code, out, tmpoutpos); - break; - case 71: - encode71(in, currentPos, code, out, tmpoutpos); - break; - case 72: - encode72(in, currentPos, code, out, tmpoutpos); - break; - case 73: - encode73(in, currentPos, code, out, tmpoutpos); - break; - case 74: - encode74(in, currentPos, code, out, tmpoutpos); - break; - case 75: - encode75(in, currentPos, code, out, tmpoutpos); - break; - case 76: - encode76(in, currentPos, code, out, tmpoutpos); - break; - case 77: - encode77(in, currentPos, code, out, tmpoutpos); - break; - case 78: - encode78(in, currentPos, code, out, tmpoutpos); - break; - case 79: - encode79(in, currentPos, code, out, tmpoutpos); - break; - case 80: - encode80(in, currentPos, code, out, tmpoutpos); - break; - default: - throw new RuntimeException("unsupported code"); - }// end switch - tmpoutpos += 2; - currentPos = nextCurrentPos; - } - - outer: while (currentPos < finalin) { - mainloop: for (int selector = 0; selector < 8; selector++) { - int res = 0; - int compressedNum = codeNum[selector]; - if (finalin <= currentPos + compressedNum - 1) - compressedNum = finalin - currentPos; - int b = bitLength[selector]; - int max = 1 << b; - int i = 0; - for (; i < compressedNum; i++) { - if (Util.smallerorequalthan(max, in[currentPos + i])) - continue mainloop; - res = (res << b) + in[currentPos + i]; - } - if (compressedNum != codeNum[selector]) { - res <<= (codeNum[selector] - compressedNum) * b; - } - res |= selector << 28; - out[tmpoutpos++] = res; - - currentPos += compressedNum; - continue outer; - } - final int selector = 8; - out[tmpoutpos++] = in[currentPos++] | (selector << 28); - } - inpos.set(currentPos); - outpos.set(tmpoutpos); - } - - @Override - public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num) { - int currentPos = outpos.get(); - int tmpinpos = inpos.get(); - final int finalout = currentPos + num; - while (currentPos < finalout - 2 * 28) { - - int val = in[tmpinpos++]; - int valn = in[tmpinpos++]; - int header = val >>> 24; - switch (header) { - case 0: { - decode0(val, valn, out, currentPos); - currentPos+=56; - break; - } - case 1: { - decode1(val, valn, out, currentPos); - currentPos+=42; - break; - } - case 2: { - decode2(val, valn, out, currentPos); - currentPos+=37; - break; - } - case 3: { - decode3(val, valn, out, currentPos); - currentPos+=35; - break; - } - case 4: { - decode4(val, valn, out, currentPos); - currentPos+=33; - break; - } - case 5: { - decode5(val, valn, out, currentPos); - currentPos+=32; - break; - } - case 6: { - decode6(val, valn, out, currentPos); - currentPos+=31; - break; - } - case 7: { - decode7(val, valn, out, currentPos); - currentPos+=30; - break; - } - case 8: { - decode8(val, valn, out, currentPos); - currentPos+=29; - break; - } - case 9: { - decode9(val, valn, out, currentPos); - currentPos+=42; - break; - } - case 10: { - decode10(val, valn, out, currentPos); - currentPos+=28; - break; - } - case 11: { - decode11(val, valn, out, currentPos); - currentPos+=23; - break; - } - case 12: { - decode12(val, valn, out, currentPos); - currentPos+=21; - break; - } - case 13: { - decode13(val, valn, out, currentPos); - currentPos+=19; - break; - } - case 14: { - decode14(val, valn, out, currentPos); - currentPos+=18; - break; - } - case 15: { - decode15(val, valn, out, currentPos); - currentPos+=17; - break; - } - case 16: { - decode16(val, valn, out, currentPos); - currentPos+=16; - break; - } - case 17: { - decode17(val, valn, out, currentPos); - currentPos+=15; - break; - } - case 18: { - decode18(val, valn, out, currentPos); - currentPos+=37; - break; - } - case 19: { - decode19(val, valn, out, currentPos); - currentPos+=23; - break; - } - case 20: { - decode20(val, valn, out, currentPos); - currentPos+=18; - break; - } - case 21: { - decode21(val, valn, out, currentPos); - currentPos+=16; - break; - } - case 22: { - decode22(val, valn, out, currentPos); - currentPos+=14; - break; - } - case 23: { - decode23(val, valn, out, currentPos); - currentPos+=13; - break; - } - case 24: { - decode24(val, valn, out, currentPos); - currentPos+=12; - break; - } - case 25: { - decode25(val, valn, out, currentPos); - currentPos+=11; - break; - } - case 26: { - decode26(val, valn, out, currentPos); - currentPos+=10; - break; - } - case 27: { - decode27(val, valn, out, currentPos); - currentPos+=35; - break; - } - case 28: { - decode28(val, valn, out, currentPos); - currentPos+=21; - break; - } - case 29: { - decode29(val, valn, out, currentPos); - currentPos+=16; - break; - } - - case 30: { - decode30(val, valn, out, currentPos); - currentPos+=14; - break; - } - case 31: { - decode31(val, valn, out, currentPos); - currentPos+=12; - break; - } - case 32: { - decode32(val, valn, out, currentPos); - currentPos+=11; - break; - } - case 33: { - decode33(val, valn, out, currentPos); - currentPos+=10; - break; - } - case 34: { - decode34(val, valn, out, currentPos); - currentPos+=9; - break; - } - case 35: { - decode35(val, valn, out, currentPos); - currentPos+=8; - break; - } - case 36: { - decode36(val, valn, out, currentPos); - currentPos+=33; - break; - } - case 37: { - decode37(val, valn, out, currentPos); - currentPos+=19; - break; - } - case 38: { - decode38(val, valn, out, currentPos); - currentPos+=14; - break; - } - case 39: { - decode39(val, valn, out, currentPos); - currentPos+=12; - break; - } - case 40: { - decode40(val, valn, out, currentPos); - currentPos+=10; - break; - } - case 41: { - decode41(val, valn, out, currentPos); - currentPos+=9; - break; - } - case 42: { - decode42(val, valn, out, currentPos); - currentPos+=8; - break; - } - case 43: { - decode43(val, valn, out, currentPos); - currentPos+=7; - break; - } - case 44: { - decode44(val, valn, out, currentPos); - currentPos+=6; - break; - } - case 45: { - decode45(val, valn, out, currentPos); - currentPos+=32; - break; - } - case 46: { - decode46(val, valn, out, currentPos); - currentPos+=18; - break; - } - case 47: { - decode47(val, valn, out, currentPos); - currentPos+=13; - break; - } - case 48: { - decode48(val, valn, out, currentPos); - currentPos+=11; - break; - } - case 49: { - decode49(val, valn, out, currentPos); - currentPos+=9; - break; - } - case 50: { - decode50(val, valn, out, currentPos); - currentPos+=8; - break; - } - case 51: { - decode51(val, valn, out, currentPos); - currentPos+=7; - break; - } - case 52: { - decode52(val, valn, out, currentPos); - currentPos+=6; - break; - } - case 53: { - decode53(val, valn, out, currentPos); - currentPos+=5; - break; - } - case 54: { - decode54(val, valn, out, currentPos); - currentPos+=31; - break; - } - case 55: { - decode55(val, valn, out, currentPos); - currentPos+=17; - break; - } - case 56: { - decode56(val, valn, out, currentPos); - currentPos+=12; - break; - } - case 57: { - decode57(val, valn, out, currentPos); - currentPos+=10; - break; - } - case 58: { - decode58(val, valn, out, currentPos); - currentPos+=8; - break; - } - case 59: { - decode59(val, valn, out, currentPos); - currentPos+=7; - break; - } - case 60: { - decode60(val, valn, out, currentPos); - currentPos+=6; - break; - } - case 61: { - decode61(val, valn, out, currentPos); - currentPos+=5; - break; - } - case 62: { - decode62(val, valn, out, currentPos); - currentPos+=4; - break; - } - case 63: { - decode63(val, valn, out, currentPos); - currentPos+=30; - break; - } - case 64: { - decode64(val, valn, out, currentPos); - currentPos+=16; - break; - } - case 65: { - decode65(val, valn, out, currentPos); - currentPos+=11; - break; - } - case 66: { - decode66(val, valn, out, currentPos); - currentPos+=9; - break; - } - case 67: { - decode67(val, valn, out, currentPos); - currentPos+=7; - break; - } - case 68: { - decode68(val, valn, out, currentPos); - currentPos+=6; - break; - } - case 69: { - decode69(val, valn, out, currentPos); - currentPos+=5; - break; - } - case 70: { - decode70(val, valn, out, currentPos); - currentPos+=4; - break; - } - case 71: { - decode71(val, valn, out, currentPos); - currentPos+=3; - break; - } - case 72: { - decode72(val, valn, out, currentPos); - currentPos+=29; - break; - } - case 73: { - decode73(val, valn, out, currentPos); - currentPos+=15; - break; - } - case 74: { - decode74(val, valn, out, currentPos); - currentPos+=10; - break; - } - case 75: { - decode75(val, valn, out, currentPos); - currentPos+=8; - break; - } - case 76: { - decode76(val, valn, out, currentPos); - currentPos+=6; - break; - } - case 77: { - decode77(val, valn, out, currentPos); - currentPos+=5; - break; - } - case 78: { - decode78(val, valn, out, currentPos); - currentPos+=4; - break; - } - case 79: { - decode79(val, valn, out, currentPos); - currentPos+=3; - break; - } - case 80: { - decode80(val, valn, out, currentPos); - currentPos+=2; - break; - } - default: - throw new RuntimeException("Wrong code: " + header); - }// end switch - } // end while - - while (currentPos < finalout) { - int val = in[tmpinpos++]; - int header = val >>> 28; - switch (header) { - case 0: { // number : 28, bitwidth : 1 - final int howmany = finalout - currentPos < 28 ? finalout - currentPos : 28; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (k + 4)) >>> 31; - } - break; - } - case 1: { // number : 14, bitwidth : 2 - final int howmany = finalout - currentPos < 14 ? finalout - currentPos : 14; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (2 * k + 4)) >>> 30; - } - break; - } - case 2: { // number : 9, bitwidth : 3 - final int howmany = finalout - currentPos < 9 ? finalout - currentPos : 9; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (3 * k + 5)) >>> 29; - } - break; - } - case 3: { // number : 7, bitwidth : 4 - final int howmany = finalout - currentPos < 7 ? finalout - currentPos : 7; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (4 * k + 4)) >>> 28; - } - break; - } - case 4: { // number : 5, bitwidth : 5 - final int howmany = finalout - currentPos < 5 ? finalout - currentPos : 5; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (5 * k + 7)) >>> 27; - } - break; - } - case 5: { // number : 4, bitwidth : 7 - final int howmany = finalout - currentPos < 4 ? finalout - currentPos : 4; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (7 * k + 4)) >>> 25; - } - break; - } - case 6: { // number : 3, bitwidth : 9 - final int howmany = finalout - currentPos < 3 ? finalout - currentPos : 3; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (9 * k + 5)) >>> 23; - } - break; - } - case 7: { // number : 2, bitwidth : 14 - final int howmany = finalout - currentPos < 2 ? finalout - currentPos : 2; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (14 * k + 4)) >>> 18; - } - break; - } - case 8: { // number : 1, bitwidth : 28 - out[currentPos++] = (val << 4) >>> 4; - break; - } - default: { - throw new RuntimeException("shouldn't happen"); - } - } - } - - outpos.set(finalout); - inpos.set(tmpinpos); - - } + private static final int[][] M = { { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, { 9, 10, 11, 12, 13, 14, 15, 16, 17 }, + { 18, 19, 20, 21, 22, 23, 24, 25, 26 }, { 27, 28, 29, 30, 31, 32, 33, 34, 35 }, + { 36, 37, 38, 39, 40, 41, 42, 43, 44 }, { 45, 46, 47, 48, 49, 50, 51, 52, 53 }, + { 54, 55, 56, 57, 58, 59, 60, 61, 62 }, { 63, 64, 65, 66, 67, 68, 69, 70, 71 }, + { 72, 73, 74, 75, 76, 77, 78, 79, 80 } }; + + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int out[], IntWrapper outpos) { + if (inlength == 0) + return; + out[outpos.get()] = inlength; + outpos.increment(); + headlessCompress(in, inpos, inlength, out, outpos); + } + + private void encode0(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 24; i++) + out[outf + 0] = (out[outf + 0] << 1) + (in[inf + i]); + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 24 + i]; + for (int i = 0; i < 28; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 28 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode1(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 24; i++) + out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 24 + i]; + for (int i = 0; i < 14; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 28 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode2(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 24; i++) + out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 24 + i]; + for (int i = 0; i < 9; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 28 + i];// 第二个28位是低位存储的,所以浪费的1比特在最顶端。 + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode3(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 24; i++) + out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 24 + i]; + for (int i = 0; i < 7; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 28 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode4(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 24; i++) + out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 24 + i]; + for (int i = 0; i < 5; i++) + out[outf + 1] = (out[outf + 1] << 5) + in[inf + 28 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode5(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 24; i++) + out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 24 + i]; + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 7) + in[inf + 28 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode6(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 24; i++) + out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 24 + i]; + for (int i = 0; i < 3; i++) + out[outf + 1] = (out[outf + 1] << 9) + in[inf + 28 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode7(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 24; i++) + out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 24 + i]; + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 14) + in[inf + 28 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode8(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 24; i++) + out[outf + 0] = (out[outf + 0] << 1) + in[inf + i]; + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 24 + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 28) + in[inf + 28 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode9(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 12; i++) + out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 12 + i]; + for (int i = 0; i < 28; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 14 + i]; + + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode10(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 12; i++) { + out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; + + } + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 12 + i]; + for (int i = 0; i < 14; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 14 + i]; + + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode11(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 12; i++) + out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 12 + i]; + for (int i = 0; i < 9; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 14 + i]; + + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode12(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 12; i++) + out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 12 + i]; + for (int i = 0; i < 7; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 14 + i]; + + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode13(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 12; i++) + out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 12 + i]; + for (int i = 0; i < 5; i++) + out[outf + 1] = (out[outf + 1] << 5) + in[inf + 14 + i]; + + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode14(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 12; i++) + out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 12 + i]; + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 7) + in[inf + 14 + i]; + + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode15(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 12; i++) + out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 12 + i]; + for (int i = 0; i < 3; i++) + out[outf + 1] = (out[outf + 1] << 9) + in[inf + 14 + i]; + + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode16(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 12; i++) + out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 12 + i]; + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 14) + in[inf + 14 + i]; + + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode17(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 12; i++) + out[outf + 0] = (out[outf + 0] << 2) + in[inf + i]; + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 12 + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 28) + in[inf + 14 + i]; + + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode18(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 8; i++) + out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 8 + i]; + for (int i = 0; i < 28; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 9 + i]; + + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode19(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 8; i++) + out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 8 + i]; + for (int i = 0; i < 14; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 9 + i]; + + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode20(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 8; i++) + out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 8 + i]; + for (int i = 0; i < 9; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 9 + i]; + + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode21(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 8; i++) + out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 8 + i]; + for (int i = 0; i < 7; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 9 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode22(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 8; i++) + out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 8 + i]; + for (int i = 0; i < 5; i++) + out[outf + 1] = (out[outf + 1] << 5) + in[inf + 9 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode23(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 8; i++) + out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 8 + i]; + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 7) + in[inf + 9 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode24(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 8; i++) + out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 8 + i]; + for (int i = 0; i < 3; i++) + out[outf + 1] = (out[outf + 1] << 9) + in[inf + 9 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode25(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 8; i++) + out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 8 + i]; + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 14) + in[inf + 9 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode26(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 8; i++) + out[outf + 0] = (out[outf + 0] << 3) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 8 + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 28) + in[inf + 9 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode27(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 6; i++) + out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 6 + i]; + for (int i = 0; i < 28; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 7 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode28(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 6; i++) + out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 6 + i]; + for (int i = 0; i < 14; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 7 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode29(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 6; i++) + out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 6 + i]; + for (int i = 0; i < 9; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 7 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode30(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 6; i++) + out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 6 + i]; + for (int i = 0; i < 7; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 7 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode31(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 6; i++) + out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 6 + i]; + for (int i = 0; i < 5; i++) + out[outf + 1] = (out[outf + 1] << 5) + in[inf + 7 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode32(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 6; i++) + out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 6 + i]; + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 7) + in[inf + 7 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode33(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 6; i++) + out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 6 + i]; + for (int i = 0; i < 3; i++) + out[outf + 1] = (out[outf + 1] << 9) + in[inf + 7 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode34(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 6; i++) + out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 6 + i]; + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 14) + in[inf + 7 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode35(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 6; i++) + out[outf + 0] = (out[outf + 0] << 4) + in[inf + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 6 + i]; + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 28) + in[inf + 7 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode36(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 4; i++) + out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); + out[outf + 1] = (out[outf + 1] << 1) + ((in[inf + 4] << 31) >>> 31); + for (int i = 0; i < 28; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 5 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode37(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 4; i++) + out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); + out[outf + 1] = (out[outf + 1] << 1) + ((in[inf + 4] << 31) >>> 31); + for (int i = 0; i < 14; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 5 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode38(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 4; i++) + out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); + out[outf + 1] = (out[outf + 1] << 1) + ((in[inf + 4] << 31) >>> 31); + for (int i = 0; i < 9; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 5 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode39(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 4; i++) + out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); + out[outf + 1] = (out[outf + 1] << 1) + ((in[inf + 4] << 31) >>> 31); + for (int i = 0; i < 7; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 5 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode40(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 4; i++) + out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); + out[outf + 1] = (out[outf + 1] << 1) + ((in[inf + 4] << 31) >>> 31); + for (int i = 0; i < 5; i++) + out[outf + 1] = (out[outf + 1] << 5) + in[inf + 5 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode41(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 4; i++) + out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); + out[outf + 1] = (out[outf + 1] << 1) + ((in[inf + 4] << 31) >>> 31); + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 7) + in[inf + 5 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode42(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 4; i++) + out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); + out[outf + 1] = (out[outf + 1] << 1) + ((in[inf + 4] << 31) >>> 31); + for (int i = 0; i < 3; i++) + out[outf + 1] = (out[outf + 1] << 9) + in[inf + 5 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode43(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 4; i++) + out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); + out[outf + 1] = (out[outf + 1] << 1) + ((in[inf + 4] << 31) >>> 31); + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 14) + in[inf + 5 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode44(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 4; i++) + out[outf + 0] = (out[outf + 0] << 5) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 4) + (in[inf + 4] >>> 1); + out[outf + 1] = (out[outf + 1] << 1) + ((in[inf + 4] << 31) >>> 31); + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 28) + in[inf + 5 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode45(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 3; i++) + out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 3] << 28) >>> 28); + for (int i = 0; i < 28; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 4 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode46(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 3; i++) + out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 3] << 28) >>> 28); + for (int i = 0; i < 14; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 4 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode47(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 3; i++) + out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 3] << 28) >>> 28); + for (int i = 0; i < 9; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 4 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode48(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 3; i++) + out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 3] << 28) >>> 28); + for (int i = 0; i < 7; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 4 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode49(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 3; i++) + out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 3] << 28) >>> 28); + for (int i = 0; i < 5; i++) + out[outf + 1] = (out[outf + 1] << 5) + in[inf + 4 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode50(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 3; i++) + out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 3] << 28) >>> 28); + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 7) + in[inf + 4 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode51(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 3; i++) + out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 3] << 28) >>> 28); + for (int i = 0; i < 3; i++) + out[outf + 1] = (out[outf + 1] << 9) + in[inf + 4 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode52(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 3; i++) + out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 3] << 28) >>> 28); + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 14) + in[inf + 4 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode53(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 3; i++) + out[outf + 0] = (out[outf + 0] << 7) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 3) + (in[inf + 3] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 3] << 28) >>> 28); + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 28) + in[inf + 4 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode54(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 2; i++) + out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); + out[outf + 1] = (out[outf + 1] << 3) + ((in[inf + 2] << 29) >>> 29); + for (int i = 0; i < 28; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 3 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode55(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 2; i++) + out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); + out[outf + 1] = (out[outf + 1] << 3) + ((in[inf + 2] << 29) >>> 29); + for (int i = 0; i < 14; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 3 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode56(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 2; i++) + out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); + out[outf + 1] = (out[outf + 1] << 3) + ((in[inf + 2] << 29) >>> 29); + for (int i = 0; i < 9; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 3 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode57(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 2; i++) + out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); + out[outf + 1] = (out[outf + 1] << 3) + ((in[inf + 2] << 29) >>> 29); + for (int i = 0; i < 7; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 3 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode58(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 2; i++) + out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); + out[outf + 1] = (out[outf + 1] << 3) + ((in[inf + 2] << 29) >>> 29); + for (int i = 0; i < 5; i++) + out[outf + 1] = (out[outf + 1] << 5) + in[inf + 3 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode59(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 2; i++) + out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); + out[outf + 1] = (out[outf + 1] << 3) + ((in[inf + 2] << 29) >>> 29); + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 7) + in[inf + 3 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode60(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 2; i++) + out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); + out[outf + 1] = (out[outf + 1] << 3) + ((in[inf + 2] << 29) >>> 29); + for (int i = 0; i < 3; i++) + out[outf + 1] = (out[outf + 1] << 9) + in[inf + 3 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode61(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 2; i++) + out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); + out[outf + 1] = (out[outf + 1] << 3) + ((in[inf + 2] << 29) >>> 29); + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 14) + in[inf + 3 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode62(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + for (int i = 0; i < 2; i++) + out[outf + 0] = (out[outf + 0] << 9) + in[inf + i]; + out[outf + 0] = (out[outf + 0] << 6) + (in[inf + 2] >>> 3); + out[outf + 1] = (out[outf + 1] << 3) + ((in[inf + 2] << 29) >>> 29); + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 28) + in[inf + 3 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode63(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + + out[outf + 0] = (out[outf + 0] << 14) + in[inf]; + out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); + for (int i = 0; i < 28; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 2 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode64(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + out[outf + 0] = (out[outf + 0] << 14) + in[inf]; + out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); + for (int i = 0; i < 14; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 2 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode65(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + out[outf + 0] = (out[outf + 0] << 14) + in[inf]; + out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); + for (int i = 0; i < 9; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 2 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode66(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + out[outf + 0] = (out[outf + 0] << 14) + in[inf]; + out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); + for (int i = 0; i < 7; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 2 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode67(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + out[outf + 0] = (out[outf + 0] << 14) + in[inf]; + out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); + for (int i = 0; i < 5; i++) + out[outf + 1] = (out[outf + 1] << 5) + in[inf + 2 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode68(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + out[outf + 0] = (out[outf + 0] << 14) + in[inf]; + out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 7) + in[inf + 2 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode69(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + out[outf + 0] = (out[outf + 0] << 14) + in[inf]; + out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); + for (int i = 0; i < 3; i++) + out[outf + 1] = (out[outf + 1] << 9) + in[inf + 2 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode70(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + out[outf + 0] = (out[outf + 0] << 14) + in[inf]; + out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 14) + in[inf + 2 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode71(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + out[outf + 0] = (out[outf + 0] << 14) + in[inf]; + out[outf + 0] = (out[outf + 0] << 10) + (in[inf + 1] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf + 1] << 28) >>> 28); + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 28) + in[inf + 2 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode72(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + + out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); + for (int i = 0; i < 28; i++) + out[outf + 1] = (out[outf + 1] << 1) + in[inf + 1 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode73(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); + for (int i = 0; i < 14; i++) + out[outf + 1] = (out[outf + 1] << 2) + in[inf + 1 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode74(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); + for (int i = 0; i < 9; i++) + out[outf + 1] = (out[outf + 1] << 3) + in[inf + 1 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode75(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); + for (int i = 0; i < 7; i++) + out[outf + 1] = (out[outf + 1] << 4) + in[inf + 1 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode76(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); + for (int i = 0; i < 5; i++) + out[outf + 1] = (out[outf + 1] << 5) + in[inf + 1 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode77(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); + for (int i = 0; i < 4; i++) + out[outf + 1] = (out[outf + 1] << 7) + in[inf + 1 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode78(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); + for (int i = 0; i < 3; i++) + out[outf + 1] = (out[outf + 1] << 9) + in[inf + 1 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode79(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); + for (int i = 0; i < 2; i++) + out[outf + 1] = (out[outf + 1] << 14) + in[inf + 1 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + private void encode80(final int[] in, final int inf, final int code, final int[] out, + final int outf) { + out[outf + 0] = (out[outf + 0] << 24) + (in[inf] >>> 4); + out[outf + 1] = (out[outf + 1] << 4) + ((in[inf] << 28) >>> 28); + for (int i = 0; i < 1; i++) + out[outf + 1] = (out[outf + 1] << 28) + in[inf + 1 + i]; + out[outf + 0] = code << 24 | out[outf + 0]; + + } + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + if (inlength == 0) + return; + final int outlength = in[inpos.get()]; + inpos.increment(); + headlessUncompress(in, inpos, inlength, out, outpos, outlength); + } + + + + private void decode80(int val, int valn, int[] out, int currentPos) { + // number : 1, bitwidth : 28 + out[currentPos++] = (val << 8) >>> 4 | (valn >>> 28); + // number : 1, bitwidth : 28 + out[currentPos++] = (valn << 4) >>> 4; + } + + private void decode79(int val, int valn, int[] out, int currentPos) { + // number : 1, bitwidth : 28 + out[currentPos++] = (val << 8) >>> 4 | (valn >>> 28); + // number :2, bitwidth : 14 + out[currentPos++] = (valn << 4) >>> 18; + out[currentPos++] = (valn << 18) >>> 18; + } + + private void decode78(int val, int valn, int[] out, int currentPos) { + // number : 1, bitwidth : 28 + out[currentPos++] = (val << 8) >>> 4 | (valn >>> 27); + // number : 3, bitwidth :9 + out[currentPos++] = (valn << 5) >>> 23; + out[currentPos++] = (valn << 14) >>> 23; + out[currentPos++] = (valn << 23) >>> 23; + } + + private void decode77(int val, int valn, int[] out, int currentPos) { + // number : 1, bitwidth : 28 + out[currentPos++] = (val << 8) >>> 4 | (valn >>> 28); + // number : 4, bitwidth : 7 + out[currentPos++] = (valn << 4) >>> 25; + out[currentPos++] = (valn << 11) >>> 25; + out[currentPos++] = (valn << 18) >>> 25; + out[currentPos++] = (valn << 25) >>> 25; + } + + private void decode76(int val, int valn, int[] out, int currentPos) { + // number : 5, bitwidth : 5 + out[currentPos++] = (val << 8) >>> 4 | (valn >>> 25); + // number : 14, bitwidth : 2 + out[currentPos++] = (valn << 7) >>> 27; + out[currentPos++] = (valn << 12) >>> 27; + out[currentPos++] = (valn << 17) >>> 27; + out[currentPos++] = (valn << 22) >>> 27; + out[currentPos++] = (valn << 27) >>> 27; + } + + private void decode75(int val, int valn, int[] out, int currentPos) { + // number : 1, bitwidth : 28 + out[currentPos++] = (val << 8) >>> 4 | (valn >>> 28); + // number : 7, bitwidth : 4 + out[currentPos++] = (valn << 4) >>> 28; + out[currentPos++] = (valn << 8) >>> 28; + out[currentPos++] = (valn << 12) >>> 28; + out[currentPos++] = (valn << 16) >>> 28; + out[currentPos++] = (valn << 20) >>> 28; + out[currentPos++] = (valn << 24) >>> 28; + out[currentPos++] = (valn << 28) >>> 28; + } + + private void decode74(int val, int valn, int[] out, int currentPos) { + // number : 1, bitwidth : 28 + out[currentPos++] = (val << 8) >>> 4 | (valn >>> 27); + // number : 9, bitwidth : 3 + out[currentPos++] = (valn << 5) >>> 29; + out[currentPos++] = (valn << 8) >>> 29; + out[currentPos++] = (valn << 11) >>> 29; + out[currentPos++] = (valn << 14) >>> 29; + out[currentPos++] = (valn << 17) >>> 29; + out[currentPos++] = (valn << 20) >>> 29; + out[currentPos++] = (valn << 23) >>> 29; + out[currentPos++] = (valn << 26) >>> 29; + out[currentPos++] = (valn << 29) >>> 29; + } + + private void decode73(int val, int valn, int[] out, int currentPos) { + // number : 1, bitwidth : 28 + out[currentPos++] = (val << 8) >>> 4 | (valn >>> 28); + // number : 14, bitwidth : 2 + out[currentPos++] = (valn << 4) >>> 30; + out[currentPos++] = (valn << 6) >>> 30; + out[currentPos++] = (valn << 8) >>> 30; + out[currentPos++] = (valn << 10) >>> 30; + out[currentPos++] = (valn << 12) >>> 30; + out[currentPos++] = (valn << 14) >>> 30; + out[currentPos++] = (valn << 16) >>> 30; + out[currentPos++] = (valn << 18) >>> 30; + out[currentPos++] = (valn << 20) >>> 30; + out[currentPos++] = (valn << 22) >>> 30; // 10 + out[currentPos++] = (valn << 24) >>> 30; + out[currentPos++] = (valn << 26) >>> 30; + out[currentPos++] = (valn << 28) >>> 30; + out[currentPos++] = (valn << 30) >>> 30; + } + + private void decode72(int val, int valn, int[] out, int currentPos) { + // number : 1, bitwidth : 28 + out[currentPos++] = (val << 8) >>> 4 | (valn >>> 28); + // number : 28, bitwidth : 1 + out[currentPos++] = (valn << 4) >>> 31; + out[currentPos++] = (valn << 5) >>> 31; + out[currentPos++] = (valn << 6) >>> 31; + out[currentPos++] = (valn << 7) >>> 31; + out[currentPos++] = (valn << 8) >>> 31; + out[currentPos++] = (valn << 9) >>> 31; + out[currentPos++] = (valn << 10) >>> 31; + out[currentPos++] = (valn << 11) >>> 31; + out[currentPos++] = (valn << 12) >>> 31; + out[currentPos++] = (valn << 13) >>> 31; // 10 + out[currentPos++] = (valn << 14) >>> 31; + out[currentPos++] = (valn << 15) >>> 31; + out[currentPos++] = (valn << 16) >>> 31; + out[currentPos++] = (valn << 17) >>> 31; + out[currentPos++] = (valn << 18) >>> 31; + out[currentPos++] = (valn << 19) >>> 31; + out[currentPos++] = (valn << 20) >>> 31; + out[currentPos++] = (valn << 21) >>> 31; + out[currentPos++] = (valn << 22) >>> 31; + out[currentPos++] = (valn << 23) >>> 31; // 20 + out[currentPos++] = (valn << 24) >>> 31; + out[currentPos++] = (valn << 25) >>> 31; + out[currentPos++] = (valn << 26) >>> 31; + out[currentPos++] = (valn << 27) >>> 31; + out[currentPos++] = (valn << 28) >>> 31; + out[currentPos++] = (valn << 29) >>> 31; + out[currentPos++] = (valn << 30) >>> 31; + out[currentPos++] = (valn << 31) >>> 31; + } + + private void decode71(int val, int valn, int[] out, int currentPos) { + // number : 2, bitwidth : 14 + out[currentPos++] = (val << 8) >>> 18; + out[currentPos++] = (val << 22) >>> 18 | (valn >>> 28); + // number : 1, bitwidth : 28 + out[currentPos++] = (valn << 4) >>> 4; + } + + private void decode70(int val, int valn, int[] out, int currentPos) { + // number : 2, bitwidth : 14 + out[currentPos++] = (val << 8) >>> 18; + out[currentPos++] = (val << 22) >>> 18 | (valn >>> 28); + // number : 2, bitwidth : 14 + out[currentPos++] = (valn << 4) >>> 18; + out[currentPos++] = (valn << 18) >>> 18; + } + + private void decode69(int val, int valn, int[] out, int currentPos) { + // number : 2, bitwidth : 14 + out[currentPos++] = (val << 8) >>> 18; + out[currentPos++] = (val << 22) >>> 18 | (valn >>> 27); + // number : 3, bitwidth : 9 + out[currentPos++] = (valn << 5) >>> 23; + out[currentPos++] = (valn << 14) >>> 23; + out[currentPos++] = (valn << 23) >>> 23; + } + + private void decode68(int val, int valn, int[] out, int currentPos) { + // number : 2, bitwidth : 14 + out[currentPos++] = (val << 8) >>> 18; + out[currentPos++] = (val << 22) >>> 18 | (valn >>> 28); + // number : 4, bitwidth : 7 + out[currentPos++] = (valn << 4) >>> 25; + out[currentPos++] = (valn << 11) >>> 25; + out[currentPos++] = (valn << 18) >>> 25; + out[currentPos++] = (valn << 25) >>> 25; + } + + private void decode67(int val, int valn, int[] out, int currentPos) { + // number : 2, bitwidth : 14 + out[currentPos++] = (val << 8) >>> 18; + out[currentPos++] = (val << 22) >>> 18 | (valn >>> 25); + // number : 5, bitwidth : 5 + out[currentPos++] = (valn << 7) >>> 27; + out[currentPos++] = (valn << 12) >>> 27; + out[currentPos++] = (valn << 17) >>> 27; + out[currentPos++] = (valn << 22) >>> 27; + out[currentPos++] = (valn << 27) >>> 27; + } + + private void decode66(int val, int valn, int[] out, int currentPos) { + // number : 2, bitwidth : 14 + out[currentPos++] = (val << 8) >>> 18; + out[currentPos++] = (val << 22) >>> 18 | (valn >>> 28); + // number : 7, bitwidth : 4 + out[currentPos++] = (valn << 4) >>> 28; + out[currentPos++] = (valn << 8) >>> 28; + out[currentPos++] = (valn << 12) >>> 28; + out[currentPos++] = (valn << 16) >>> 28; + out[currentPos++] = (valn << 20) >>> 28; + out[currentPos++] = (valn << 24) >>> 28; + out[currentPos++] = (valn << 28) >>> 28; + } + + private void decode65(int val, int valn, int[] out, int currentPos) { + // number : 2, bitwidth : 14 + out[currentPos++] = (val << 8) >>> 18; + out[currentPos++] = (val << 22) >>> 18 | (valn >>> 27); + // number : 9, bitwidth : 3 + out[currentPos++] = (valn << 5) >>> 29; + out[currentPos++] = (valn << 8) >>> 29; + out[currentPos++] = (valn << 11) >>> 29; + out[currentPos++] = (valn << 14) >>> 29; + out[currentPos++] = (valn << 17) >>> 29; + out[currentPos++] = (valn << 20) >>> 29; + out[currentPos++] = (valn << 23) >>> 29; + out[currentPos++] = (valn << 26) >>> 29; + out[currentPos++] = (valn << 29) >>> 29; + } + + private void decode64(int val, int valn, int[] out, int currentPos) { + // number : 2, bitwidth : 14 + out[currentPos++] = (val << 8) >>> 18; + out[currentPos++] = (val << 22) >>> 18 | (valn >>> 28); + // number : 14, bitwidth : 2 + out[currentPos++] = (valn << 4) >>> 30; + out[currentPos++] = (valn << 6) >>> 30; + out[currentPos++] = (valn << 8) >>> 30; + out[currentPos++] = (valn << 10) >>> 30; + out[currentPos++] = (valn << 12) >>> 30; + out[currentPos++] = (valn << 14) >>> 30; + out[currentPos++] = (valn << 16) >>> 30; + out[currentPos++] = (valn << 18) >>> 30; + out[currentPos++] = (valn << 20) >>> 30; + out[currentPos++] = (valn << 22) >>> 30; // 10 + out[currentPos++] = (valn << 24) >>> 30; + out[currentPos++] = (valn << 26) >>> 30; + out[currentPos++] = (valn << 28) >>> 30; + out[currentPos++] = (valn << 30) >>> 30; + } + + private void decode63(int val, int valn, int[] out, int currentPos) { + // number : 2, bitwidth : 14 + out[currentPos++] = (val << 8) >>> 18; + out[currentPos++] = (val << 22) >>> 18 | (valn >>> 28); + // number : 28, bitwidth : 1 + out[currentPos++] = (valn << 4) >>> 31; + out[currentPos++] = (valn << 5) >>> 31; + out[currentPos++] = (valn << 6) >>> 31; + out[currentPos++] = (valn << 7) >>> 31; + out[currentPos++] = (valn << 8) >>> 31; + out[currentPos++] = (valn << 9) >>> 31; + out[currentPos++] = (valn << 10) >>> 31; + out[currentPos++] = (valn << 11) >>> 31; + out[currentPos++] = (valn << 12) >>> 31; + out[currentPos++] = (valn << 13) >>> 31; // 10 + out[currentPos++] = (valn << 14) >>> 31; + out[currentPos++] = (valn << 15) >>> 31; + out[currentPos++] = (valn << 16) >>> 31; + out[currentPos++] = (valn << 17) >>> 31; + out[currentPos++] = (valn << 18) >>> 31; + out[currentPos++] = (valn << 19) >>> 31; + out[currentPos++] = (valn << 20) >>> 31; + out[currentPos++] = (valn << 21) >>> 31; + out[currentPos++] = (valn << 22) >>> 31; + out[currentPos++] = (valn << 23) >>> 31; // 20 + out[currentPos++] = (valn << 24) >>> 31; + out[currentPos++] = (valn << 25) >>> 31; + out[currentPos++] = (valn << 26) >>> 31; + out[currentPos++] = (valn << 27) >>> 31; + out[currentPos++] = (valn << 28) >>> 31; + out[currentPos++] = (valn << 29) >>> 31; + out[currentPos++] = (valn << 30) >>> 31; + out[currentPos++] = (valn << 31) >>> 31; + } + + private void decode62(int val, int valn, int[] out, int currentPos) { + // number : 3, bitwidth : 9 + out[currentPos++] = (val << 8) >>> 23; + out[currentPos++] = (val << 17) >>> 23; + out[currentPos++] = (val << 26) >>> 23 | (valn >>> 28); + // number : 1, bitwidth : 28 + out[currentPos++] = (valn << 4) >>> 4; + } + + private void decode61(int val, int valn, int[] out, int currentPos) { + // number : 3, bitwidth : 9 + out[currentPos++] = (val << 8) >>> 23; + out[currentPos++] = (val << 17) >>> 23; + out[currentPos++] = (val << 26) >>> 23 | (valn >>> 28); + // number : 2, bitwidth : 14 + out[currentPos++] = (valn << 4) >>> 18; + out[currentPos++] = (valn << 18) >>> 18; + } + + private void decode60(int val, int valn, int[] out, int currentPos) { + // number : 3, bitwidth : 9 + out[currentPos++] = (val << 8) >>> 23; + out[currentPos++] = (val << 17) >>> 23; + out[currentPos++] = (val << 26) >>> 23 | (valn >>> 27); + // number : 3, bitwidth : 9 + out[currentPos++] = (valn << 5) >>> 23; + out[currentPos++] = (valn << 14) >>> 23; + out[currentPos++] = (valn << 23) >>> 23; + } + + private void decode59(int val, int valn, int[] out, int currentPos) { + // number : 3, bitwidth : 9 + out[currentPos++] = (val << 8) >>> 23; + out[currentPos++] = (val << 17) >>> 23; + out[currentPos++] = (val << 26) >>> 23 | (valn >>> 28); + // number : 4, bitwidth : 7 + out[currentPos++] = (valn << 4) >>> 25; + out[currentPos++] = (valn << 11) >>> 25; + out[currentPos++] = (valn << 18) >>> 25; + out[currentPos++] = (valn << 25) >>> 25; + } + + private void decode58(int val, int valn, int[] out, int currentPos) { + // number : 3, bitwidth : 9 + out[currentPos++] = (val << 8) >>> 23; + out[currentPos++] = (val << 17) >>> 23; + out[currentPos++] = (val << 26) >>> 23 | (valn >>> 25); + // number : 5, bitwidth : 5 + out[currentPos++] = (valn << 7) >>> 27; + out[currentPos++] = (valn << 12) >>> 27; + out[currentPos++] = (valn << 17) >>> 27; + out[currentPos++] = (valn << 22) >>> 27; + out[currentPos++] = (valn << 27) >>> 27; + } + + private void decode57(int val, int valn, int[] out, int currentPos) { + // number : 3, bitwidth : 9 + out[currentPos++] = (val << 8) >>> 23; + out[currentPos++] = (val << 17) >>> 23; + out[currentPos++] = (val << 26) >>> 23 | (valn >>> 28); + // number : 7, bitwidth : 4 + out[currentPos++] = (valn << 4) >>> 28; + out[currentPos++] = (valn << 8) >>> 28; + out[currentPos++] = (valn << 12) >>> 28; + out[currentPos++] = (valn << 16) >>> 28; + out[currentPos++] = (valn << 20) >>> 28; + out[currentPos++] = (valn << 24) >>> 28; + out[currentPos++] = (valn << 28) >>> 28; + } + + private void decode56(int val, int valn, int[] out, int currentPos) { + // number : 3, bitwidth : 9 + out[currentPos++] = (val << 8) >>> 23; + out[currentPos++] = (val << 17) >>> 23; + out[currentPos++] = (val << 26) >>> 23 | (valn >>> 27); + // number : 9, bitwidth : 3 + out[currentPos++] = (valn << 5) >>> 29; + out[currentPos++] = (valn << 8) >>> 29; + out[currentPos++] = (valn << 11) >>> 29; + out[currentPos++] = (valn << 14) >>> 29; + out[currentPos++] = (valn << 17) >>> 29; + out[currentPos++] = (valn << 20) >>> 29; + out[currentPos++] = (valn << 23) >>> 29; + out[currentPos++] = (valn << 26) >>> 29; + out[currentPos++] = (valn << 29) >>> 29; + } + + private void decode55(int val, int valn, int[] out, int currentPos) { + // number : 3, bitwidth : 9 + out[currentPos++] = (val << 8) >>> 23; + out[currentPos++] = (val << 17) >>> 23; + out[currentPos++] = (val << 26) >>> 23 | (valn >>> 28); + // number : 14, bitwidth : 2 + out[currentPos++] = (valn << 4) >>> 30; + out[currentPos++] = (valn << 6) >>> 30; + out[currentPos++] = (valn << 8) >>> 30; + out[currentPos++] = (valn << 10) >>> 30; + out[currentPos++] = (valn << 12) >>> 30; + out[currentPos++] = (valn << 14) >>> 30; + out[currentPos++] = (valn << 16) >>> 30; + out[currentPos++] = (valn << 18) >>> 30; + out[currentPos++] = (valn << 20) >>> 30; + out[currentPos++] = (valn << 22) >>> 30; // 10 + out[currentPos++] = (valn << 24) >>> 30; + out[currentPos++] = (valn << 26) >>> 30; + out[currentPos++] = (valn << 28) >>> 30; + out[currentPos++] = (valn << 30) >>> 30; + } + + private void decode54(int val, int valn, int[] out, int currentPos) { + // number : 3, bitwidth : 9 + out[currentPos++] = (val << 8) >>> 23; + out[currentPos++] = (val << 17) >>> 23; + out[currentPos++] = (val << 26) >>> 23 | (valn >>> 28); + // number : 28, bitwidth : 1 + out[currentPos++] = (valn << 4) >>> 31; + out[currentPos++] = (valn << 5) >>> 31; + out[currentPos++] = (valn << 6) >>> 31; + out[currentPos++] = (valn << 7) >>> 31; + out[currentPos++] = (valn << 8) >>> 31; + out[currentPos++] = (valn << 9) >>> 31; + out[currentPos++] = (valn << 10) >>> 31; + out[currentPos++] = (valn << 11) >>> 31; + out[currentPos++] = (valn << 12) >>> 31; + out[currentPos++] = (valn << 13) >>> 31; // 10 + out[currentPos++] = (valn << 14) >>> 31; + out[currentPos++] = (valn << 15) >>> 31; + out[currentPos++] = (valn << 16) >>> 31; + out[currentPos++] = (valn << 17) >>> 31; + out[currentPos++] = (valn << 18) >>> 31; + out[currentPos++] = (valn << 19) >>> 31; + out[currentPos++] = (valn << 20) >>> 31; + out[currentPos++] = (valn << 21) >>> 31; + out[currentPos++] = (valn << 22) >>> 31; + out[currentPos++] = (valn << 23) >>> 31; // 20 + out[currentPos++] = (valn << 24) >>> 31; + out[currentPos++] = (valn << 25) >>> 31; + out[currentPos++] = (valn << 26) >>> 31; + out[currentPos++] = (valn << 27) >>> 31; + out[currentPos++] = (valn << 28) >>> 31; + out[currentPos++] = (valn << 29) >>> 31; + out[currentPos++] = (valn << 30) >>> 31; + out[currentPos++] = (valn << 31) >>> 31; + } + + private void decode53(int val, int valn, int[] out, int currentPos) { + // number : 4, bitwidth : 7 + out[currentPos++] = (val << 8) >>> 25; + out[currentPos++] = (val << 15) >>> 25; + out[currentPos++] = (val << 22) >>> 25; + out[currentPos++] = (val << 29) >>> 25 | (valn >>> 28); + // number : 1, bitwidth : 28 + out[currentPos++] = (valn << 4) >>> 4; + } + + private void decode52(int val, int valn, int[] out, int currentPos) { + // number : 4, bitwidth : 7 + out[currentPos++] = (val << 8) >>> 25; + out[currentPos++] = (val << 15) >>> 25; + out[currentPos++] = (val << 22) >>> 25; + out[currentPos++] = (val << 29) >>> 25 | (valn >>> 28); + // number : 2, bitwidth : 14 + out[currentPos++] = (valn << 4) >>> 18; + out[currentPos++] = (valn << 18) >>> 18; + } + + private void decode51(int val, int valn, int[] out, int currentPos) { + // number : 4, bitwidth : 7 + out[currentPos++] = (val << 8) >>> 25; + out[currentPos++] = (val << 15) >>> 25; + out[currentPos++] = (val << 22) >>> 25; + out[currentPos++] = (val << 29) >>> 25 | (valn >>> 27); + // number : 3, bitwidth : 9 + out[currentPos++] = (valn << 5) >>> 23; + out[currentPos++] = (valn << 14) >>> 23; + out[currentPos++] = (valn << 23) >>> 23; + } + + private void decode50(int val, int valn, int[] out, int currentPos) { + // number : 4, bitwidth : 7 + out[currentPos++] = (val << 8) >>> 25; + out[currentPos++] = (val << 15) >>> 25; + out[currentPos++] = (val << 22) >>> 25; + out[currentPos++] = (val << 29) >>> 25 | (valn >>> 28); + // number : 4, bitwidth : 7 + out[currentPos++] = (valn << 4) >>> 25; + out[currentPos++] = (valn << 11) >>> 25; + out[currentPos++] = (valn << 18) >>> 25; + out[currentPos++] = (valn << 25) >>> 25; + } + + private void decode49(int val, int valn, int[] out, int currentPos) { + // number : 4, bitwidth : 7 + out[currentPos++] = (val << 8) >>> 25; + out[currentPos++] = (val << 15) >>> 25; + out[currentPos++] = (val << 22) >>> 25; + out[currentPos++] = (val << 29) >>> 25 | (valn >>> 25); + // number : 5, bitwidth : 5 + out[currentPos++] = (valn << 7) >>> 27; + out[currentPos++] = (valn << 12) >>> 27; + out[currentPos++] = (valn << 17) >>> 27; + out[currentPos++] = (valn << 22) >>> 27; + out[currentPos++] = (valn << 27) >>> 27; + } + + private void decode48(int val, int valn, int[] out, int currentPos) { + // number : 4, bitwidth : 7 + out[currentPos++] = (val << 8) >>> 25; + out[currentPos++] = (val << 15) >>> 25; + out[currentPos++] = (val << 22) >>> 25; + out[currentPos++] = (val << 29) >>> 25 | (valn >>> 28); + // number : 7, bitwidth : 4 + out[currentPos++] = (valn << 4) >>> 28; + out[currentPos++] = (valn << 8) >>> 28; + out[currentPos++] = (valn << 12) >>> 28; + out[currentPos++] = (valn << 16) >>> 28; + out[currentPos++] = (valn << 20) >>> 28; + out[currentPos++] = (valn << 24) >>> 28; + out[currentPos++] = (valn << 28) >>> 28; + } + + private void decode47(int val, int valn, int[] out, int currentPos) { + // number : 4, bitwidth : 7 + out[currentPos++] = (val << 8) >>> 25; + out[currentPos++] = (val << 15) >>> 25; + out[currentPos++] = (val << 22) >>> 25; + out[currentPos++] = (val << 29) >>> 25 | (valn >>> 27); + // number : 9, bitwidth : 3 + out[currentPos++] = (valn << 5) >>> 29; + out[currentPos++] = (valn << 8) >>> 29; + out[currentPos++] = (valn << 11) >>> 29; + out[currentPos++] = (valn << 14) >>> 29; + out[currentPos++] = (valn << 17) >>> 29; + out[currentPos++] = (valn << 20) >>> 29; + out[currentPos++] = (valn << 23) >>> 29; + out[currentPos++] = (valn << 26) >>> 29; + out[currentPos++] = (valn << 29) >>> 29; + } + + private void decode46(int val, int valn, int[] out, int currentPos) { + // number : 4, bitwidth : 7 + out[currentPos++] = (val << 8) >>> 25; + out[currentPos++] = (val << 15) >>> 25; + out[currentPos++] = (val << 22) >>> 25; + out[currentPos++] = (val << 29) >>> 25 | (valn >>> 28); + // number : 14, bitwidth : 2 + out[currentPos++] = (valn << 4) >>> 30; + out[currentPos++] = (valn << 6) >>> 30; + out[currentPos++] = (valn << 8) >>> 30; + out[currentPos++] = (valn << 10) >>> 30; + out[currentPos++] = (valn << 12) >>> 30; + out[currentPos++] = (valn << 14) >>> 30; + out[currentPos++] = (valn << 16) >>> 30; + out[currentPos++] = (valn << 18) >>> 30; + out[currentPos++] = (valn << 20) >>> 30; + out[currentPos++] = (valn << 22) >>> 30; // 10 + out[currentPos++] = (valn << 24) >>> 30; + out[currentPos++] = (valn << 26) >>> 30; + out[currentPos++] = (valn << 28) >>> 30; + out[currentPos++] = (valn << 30) >>> 30; + } + + private void decode45(int val, int valn, int[] out, int currentPos) { + // number : 4, bitwidth : 7 + out[currentPos++] = (val << 8) >>> 25; + out[currentPos++] = (val << 15) >>> 25; + out[currentPos++] = (val << 22) >>> 25; + out[currentPos++] = (val << 29) >>> 25 | (valn >>> 28); + // number : 28, bitwidth : 1 + out[currentPos++] = (valn << 4) >>> 31; + out[currentPos++] = (valn << 5) >>> 31; + out[currentPos++] = (valn << 6) >>> 31; + out[currentPos++] = (valn << 7) >>> 31; + out[currentPos++] = (valn << 8) >>> 31; + out[currentPos++] = (valn << 9) >>> 31; + out[currentPos++] = (valn << 10) >>> 31; + out[currentPos++] = (valn << 11) >>> 31; + out[currentPos++] = (valn << 12) >>> 31; + out[currentPos++] = (valn << 13) >>> 31; // 10 + out[currentPos++] = (valn << 14) >>> 31; + out[currentPos++] = (valn << 15) >>> 31; + out[currentPos++] = (valn << 16) >>> 31; + out[currentPos++] = (valn << 17) >>> 31; + out[currentPos++] = (valn << 18) >>> 31; + out[currentPos++] = (valn << 19) >>> 31; + out[currentPos++] = (valn << 20) >>> 31; + out[currentPos++] = (valn << 21) >>> 31; + out[currentPos++] = (valn << 22) >>> 31; + out[currentPos++] = (valn << 23) >>> 31; // 20 + out[currentPos++] = (valn << 24) >>> 31; + out[currentPos++] = (valn << 25) >>> 31; + out[currentPos++] = (valn << 26) >>> 31; + out[currentPos++] = (valn << 27) >>> 31; + out[currentPos++] = (valn << 28) >>> 31; + out[currentPos++] = (valn << 29) >>> 31; + out[currentPos++] = (valn << 30) >>> 31; + out[currentPos++] = (valn << 31) >>> 31; + } + + private void decode44(int val, int valn, int[] out, int currentPos) { + // number : 5, bitwidth : 5 + out[currentPos++] = (val << 8) >>> 27; + out[currentPos++] = (val << 13) >>> 27; + out[currentPos++] = (val << 18) >>> 27; + out[currentPos++] = (val << 23) >>> 27; + out[currentPos++] = (val << 28) >>> 27 | (valn >>> 28); + // number : 1, bitwidth : 28 + out[currentPos++] = (valn << 4) >>> 4; + } + + private void decode43(int val, int valn, int[] out, int currentPos) { + // number : 5, bitwidth : 5 + out[currentPos++] = (val << 8) >>> 27; + out[currentPos++] = (val << 13) >>> 27; + out[currentPos++] = (val << 18) >>> 27; + out[currentPos++] = (val << 23) >>> 27; + out[currentPos++] = (val << 28) >>> 27 | (valn >>> 28); + // number : 2, bitwidth : 14 + out[currentPos++] = (valn << 4) >>> 18; + out[currentPos++] = (valn << 18) >>> 18; + } + + private void decode42(int val, int valn, int[] out, int currentPos) { + // number : 5, bitwidth : 5 + out[currentPos++] = (val << 8) >>> 27; + out[currentPos++] = (val << 13) >>> 27; + out[currentPos++] = (val << 18) >>> 27; + out[currentPos++] = (val << 23) >>> 27; + out[currentPos++] = (val << 28) >>> 27 | (valn >>> 27); + // number : 3, bitwidth : 9 + out[currentPos++] = (valn << 5) >>> 23; + out[currentPos++] = (valn << 14) >>> 23; + out[currentPos++] = (valn << 23) >>> 23; + } + + private void decode41(int val, int valn, int[] out, int currentPos) { + // number : 5, bitwidth : 5 + out[currentPos++] = (val << 8) >>> 27; + out[currentPos++] = (val << 13) >>> 27; + out[currentPos++] = (val << 18) >>> 27; + out[currentPos++] = (val << 23) >>> 27; + out[currentPos++] = (val << 28) >>> 27 | (valn >>> 28); + // number : 4, bitwidth : 7 + out[currentPos++] = (valn << 4) >>> 25; + out[currentPos++] = (valn << 11) >>> 25; + out[currentPos++] = (valn << 18) >>> 25; + out[currentPos++] = (valn << 25) >>> 25; + } + + private void decode40(int val, int valn, int[] out, int currentPos) { + // number : 5, bitwidth : 5 + out[currentPos++] = (val << 8) >>> 27; + out[currentPos++] = (val << 13) >>> 27; + out[currentPos++] = (val << 18) >>> 27; + out[currentPos++] = (val << 23) >>> 27; + out[currentPos++] = (val << 28) >>> 27 | (valn >>> 25); + // number : 5, bitwidth : 5 + out[currentPos++] = (valn << 7) >>> 27; + out[currentPos++] = (valn << 12) >>> 27; + out[currentPos++] = (valn << 17) >>> 27; + out[currentPos++] = (valn << 22) >>> 27; + out[currentPos++] = (valn << 27) >>> 27; + } + + private void decode39(int val, int valn, int[] out, int currentPos) { + // number : 5, bitwidth : 5 + out[currentPos++] = (val << 8) >>> 27; + out[currentPos++] = (val << 13) >>> 27; + out[currentPos++] = (val << 18) >>> 27; + out[currentPos++] = (val << 23) >>> 27; + out[currentPos++] = (val << 28) >>> 27 | (valn >>> 28); + // number : 7, bitwidth : 4 + out[currentPos++] = (valn << 4) >>> 28; + out[currentPos++] = (valn << 8) >>> 28; + out[currentPos++] = (valn << 12) >>> 28; + out[currentPos++] = (valn << 16) >>> 28; + out[currentPos++] = (valn << 20) >>> 28; + out[currentPos++] = (valn << 24) >>> 28; + out[currentPos++] = (valn << 28) >>> 28; + } + + private void decode38(int val, int valn, int[] out, int currentPos) { + // number : 5, bitwidth : 5 + out[currentPos++] = (val << 8) >>> 27; + out[currentPos++] = (val << 13) >>> 27; + out[currentPos++] = (val << 18) >>> 27; + out[currentPos++] = (val << 23) >>> 27; + out[currentPos++] = (val << 28) >>> 27 | (valn >>> 27); + // number : 9, bitwidth : 3 + out[currentPos++] = (valn << 5) >>> 29; + out[currentPos++] = (valn << 8) >>> 29; + out[currentPos++] = (valn << 11) >>> 29; + out[currentPos++] = (valn << 14) >>> 29; + out[currentPos++] = (valn << 17) >>> 29; + out[currentPos++] = (valn << 20) >>> 29; + out[currentPos++] = (valn << 23) >>> 29; + out[currentPos++] = (valn << 26) >>> 29; + out[currentPos++] = (valn << 29) >>> 29; + } + + private void decode37(int val, int valn, int[] out, int currentPos) { + // number : 5, bitwidth : 5 + out[currentPos++] = (val << 8) >>> 27; + out[currentPos++] = (val << 13) >>> 27; + out[currentPos++] = (val << 18) >>> 27; + out[currentPos++] = (val << 23) >>> 27; + out[currentPos++] = (val << 28) >>> 27 | (valn >>> 28); + // number : 14, bitwidth : 2 + out[currentPos++] = (valn << 4) >>> 30; + out[currentPos++] = (valn << 6) >>> 30; + out[currentPos++] = (valn << 8) >>> 30; + out[currentPos++] = (valn << 10) >>> 30; + out[currentPos++] = (valn << 12) >>> 30; + out[currentPos++] = (valn << 14) >>> 30; + out[currentPos++] = (valn << 16) >>> 30; + out[currentPos++] = (valn << 18) >>> 30; + out[currentPos++] = (valn << 20) >>> 30; + out[currentPos++] = (valn << 22) >>> 30; // 10 + out[currentPos++] = (valn << 24) >>> 30; + out[currentPos++] = (valn << 26) >>> 30; + out[currentPos++] = (valn << 28) >>> 30; + out[currentPos++] = (valn << 30) >>> 30; + } + + private void decode36(int val, int valn, int[] out, int currentPos) { + // number : 5, bitwidth : 5 + out[currentPos++] = (val << 8) >>> 27; + out[currentPos++] = (val << 13) >>> 27; + out[currentPos++] = (val << 18) >>> 27; + out[currentPos++] = (val << 23) >>> 27; + out[currentPos++] = (val << 28) >>> 27 | (valn >>> 28); + // number : 28, bitwidth : 1 + out[currentPos++] = (valn << 4) >>> 31; + out[currentPos++] = (valn << 5) >>> 31; + out[currentPos++] = (valn << 6) >>> 31; + out[currentPos++] = (valn << 7) >>> 31; + out[currentPos++] = (valn << 8) >>> 31; + out[currentPos++] = (valn << 9) >>> 31; + out[currentPos++] = (valn << 10) >>> 31; + out[currentPos++] = (valn << 11) >>> 31; + out[currentPos++] = (valn << 12) >>> 31; + out[currentPos++] = (valn << 13) >>> 31; // 10 + out[currentPos++] = (valn << 14) >>> 31; + out[currentPos++] = (valn << 15) >>> 31; + out[currentPos++] = (valn << 16) >>> 31; + out[currentPos++] = (valn << 17) >>> 31; + out[currentPos++] = (valn << 18) >>> 31; + out[currentPos++] = (valn << 19) >>> 31; + out[currentPos++] = (valn << 20) >>> 31; + out[currentPos++] = (valn << 21) >>> 31; + out[currentPos++] = (valn << 22) >>> 31; + out[currentPos++] = (valn << 23) >>> 31; // 20 + out[currentPos++] = (valn << 24) >>> 31; + out[currentPos++] = (valn << 25) >>> 31; + out[currentPos++] = (valn << 26) >>> 31; + out[currentPos++] = (valn << 27) >>> 31; + out[currentPos++] = (valn << 28) >>> 31; + out[currentPos++] = (valn << 29) >>> 31; + out[currentPos++] = (valn << 30) >>> 31; + out[currentPos++] = (valn << 31) >>> 31; + } + + private void decode35(int val, int valn, int[] out, int currentPos) { + // number : 7, bitwidth : 4 + out[currentPos++] = (val << 8) >>> 28; + out[currentPos++] = (val << 12) >>> 28; + out[currentPos++] = (val << 16) >>> 28; + out[currentPos++] = (val << 20) >>> 28; + out[currentPos++] = (val << 24) >>> 28; + out[currentPos++] = (val << 28) >>> 28; + out[currentPos++] = (valn << 0) >>> 28; + // number : 1, bitwidth : 28 + out[currentPos++] = (valn << 4) >>> 4; + } + + private void decode34(int val, int valn, int[] out, int currentPos) { + // number : 7, bitwidth : 4 + out[currentPos++] = (val << 8) >>> 28; + out[currentPos++] = (val << 12) >>> 28; + out[currentPos++] = (val << 16) >>> 28; + out[currentPos++] = (val << 20) >>> 28; + out[currentPos++] = (val << 24) >>> 28; + out[currentPos++] = (val << 28) >>> 28; + out[currentPos++] = (valn << 0) >>> 28; + // number : 2, bitwidth : 14 + out[currentPos++] = (valn << 4) >>> 18; + out[currentPos++] = (valn << 18) >>> 18; + } + + private void decode33(int val, int valn, int[] out, int currentPos) { + // number : 7, bitwidth : 4 + out[currentPos++] = (val << 8) >>> 28; + out[currentPos++] = (val << 12) >>> 28; + out[currentPos++] = (val << 16) >>> 28; + out[currentPos++] = (val << 20) >>> 28; + out[currentPos++] = (val << 24) >>> 28; + out[currentPos++] = (val << 28) >>> 28; + out[currentPos++] = (valn << 1) >>> 28; + // number : 3, bitwidth : 9 + out[currentPos++] = (valn << 5) >>> 23; + out[currentPos++] = (valn << 14) >>> 23; + out[currentPos++] = (valn << 23) >>> 23; + } + + private void decode32(int val, int valn, int[] out, int currentPos) { + // number : 7, bitwidth : 4 + out[currentPos++] = (val << 8) >>> 28; + out[currentPos++] = (val << 12) >>> 28; + out[currentPos++] = (val << 16) >>> 28; + out[currentPos++] = (val << 20) >>> 28; + out[currentPos++] = (val << 24) >>> 28; + out[currentPos++] = (val << 28) >>> 28; + out[currentPos++] = (valn << 0) >>> 28; + // number : 4, bitwidth : 7 + out[currentPos++] = (valn << 4) >>> 25; + out[currentPos++] = (valn << 11) >>> 25; + out[currentPos++] = (valn << 18) >>> 25; + out[currentPos++] = (valn << 25) >>> 25; + } + + private void decode31(int val, int valn, int[] out, int currentPos) { + // number : 7, bitwidth : 4 + out[currentPos++] = (val << 8) >>> 28; + out[currentPos++] = (val << 12) >>> 28; + out[currentPos++] = (val << 16) >>> 28; + out[currentPos++] = (val << 20) >>> 28; + out[currentPos++] = (val << 24) >>> 28; + out[currentPos++] = (val << 28) >>> 28; + out[currentPos++] = (valn << 3) >>> 28; + // number : 5, bitwidth : 5 + out[currentPos++] = (valn << 7) >>> 27; + out[currentPos++] = (valn << 12) >>> 27; + out[currentPos++] = (valn << 17) >>> 27; + out[currentPos++] = (valn << 22) >>> 27; + out[currentPos++] = (valn << 27) >>> 27; + } + + private void decode30(int val, int valn, int[] out, int currentPos) { + // number : 7, bitwidth : 4 + out[currentPos++] = (val << 8) >>> 28; + out[currentPos++] = (val << 12) >>> 28; + out[currentPos++] = (val << 16) >>> 28; + out[currentPos++] = (val << 20) >>> 28; + out[currentPos++] = (val << 24) >>> 28; + out[currentPos++] = (val << 28) >>> 28; + out[currentPos++] = (valn << 0) >>> 28; + // number : 7, bitwidth : 4 + out[currentPos++] = (valn << 4) >>> 28; + out[currentPos++] = (valn << 8) >>> 28; + out[currentPos++] = (valn << 12) >>> 28; + out[currentPos++] = (valn << 16) >>> 28; + out[currentPos++] = (valn << 20) >>> 28; + out[currentPos++] = (valn << 24) >>> 28; + out[currentPos++] = (valn << 28) >>> 28; + } + + private void decode29(int val, int valn, int[] out, int currentPos) { + // number : 7, bitwidth : 4 + out[currentPos++] = (val << 8) >>> 28; + out[currentPos++] = (val << 12) >>> 28; + out[currentPos++] = (val << 16) >>> 28; + out[currentPos++] = (val << 20) >>> 28; + out[currentPos++] = (val << 24) >>> 28; + out[currentPos++] = (val << 28) >>> 28; + out[currentPos++] = (valn << 1) >>> 28; + // number : 9, bitwidth : 3 + out[currentPos++] = (valn << 5) >>> 29; + out[currentPos++] = (valn << 8) >>> 29; + out[currentPos++] = (valn << 11) >>> 29; + out[currentPos++] = (valn << 14) >>> 29; + out[currentPos++] = (valn << 17) >>> 29; + out[currentPos++] = (valn << 20) >>> 29; + out[currentPos++] = (valn << 23) >>> 29; + out[currentPos++] = (valn << 26) >>> 29; + out[currentPos++] = (valn << 29) >>> 29; + } + + private void decode28(int val, int valn, int[] out, int currentPos) { + // number : 7, bitwidth : 4 + out[currentPos++] = (val << 8) >>> 28; + out[currentPos++] = (val << 12) >>> 28; + out[currentPos++] = (val << 16) >>> 28; + out[currentPos++] = (val << 20) >>> 28; + out[currentPos++] = (val << 24) >>> 28; + out[currentPos++] = (val << 28) >>> 28; + out[currentPos++] = (valn << 0) >>> 28; + // number : 14, bitwidth : 2 + out[currentPos++] = (valn << 4) >>> 30; + out[currentPos++] = (valn << 6) >>> 30; + out[currentPos++] = (valn << 8) >>> 30; + out[currentPos++] = (valn << 10) >>> 30; + out[currentPos++] = (valn << 12) >>> 30; + out[currentPos++] = (valn << 14) >>> 30; + out[currentPos++] = (valn << 16) >>> 30; + out[currentPos++] = (valn << 18) >>> 30; + out[currentPos++] = (valn << 20) >>> 30; + out[currentPos++] = (valn << 22) >>> 30; // 10 + out[currentPos++] = (valn << 24) >>> 30; + out[currentPos++] = (valn << 26) >>> 30; + out[currentPos++] = (valn << 28) >>> 30; + out[currentPos++] = (valn << 30) >>> 30; + } + + private void decode27(int val, int valn, int[] out, int currentPos) { + // number : 7, bitwidth : 4 + out[currentPos++] = (val << 8) >>> 28; + out[currentPos++] = (val << 12) >>> 28; + out[currentPos++] = (val << 16) >>> 28; + out[currentPos++] = (val << 20) >>> 28; + out[currentPos++] = (val << 24) >>> 28; + out[currentPos++] = (val << 28) >>> 28; + out[currentPos++] = (valn << 0) >>> 28; + // number : 28, bitwidth : 1 + out[currentPos++] = (valn << 4) >>> 31; + out[currentPos++] = (valn << 5) >>> 31; + out[currentPos++] = (valn << 6) >>> 31; + out[currentPos++] = (valn << 7) >>> 31; + out[currentPos++] = (valn << 8) >>> 31; + out[currentPos++] = (valn << 9) >>> 31; + out[currentPos++] = (valn << 10) >>> 31; + out[currentPos++] = (valn << 11) >>> 31; + out[currentPos++] = (valn << 12) >>> 31; + out[currentPos++] = (valn << 13) >>> 31; // 10 + out[currentPos++] = (valn << 14) >>> 31; + out[currentPos++] = (valn << 15) >>> 31; + out[currentPos++] = (valn << 16) >>> 31; + out[currentPos++] = (valn << 17) >>> 31; + out[currentPos++] = (valn << 18) >>> 31; + out[currentPos++] = (valn << 19) >>> 31; + out[currentPos++] = (valn << 20) >>> 31; + out[currentPos++] = (valn << 21) >>> 31; + out[currentPos++] = (valn << 22) >>> 31; + out[currentPos++] = (valn << 23) >>> 31; // 20 + out[currentPos++] = (valn << 24) >>> 31; + out[currentPos++] = (valn << 25) >>> 31; + out[currentPos++] = (valn << 26) >>> 31; + out[currentPos++] = (valn << 27) >>> 31; + out[currentPos++] = (valn << 28) >>> 31; + out[currentPos++] = (valn << 29) >>> 31; + out[currentPos++] = (valn << 30) >>> 31; + out[currentPos++] = (valn << 31) >>> 31; + } + + private void decode26(int val, int valn, int[] out, int currentPos) { + // number : 9, bitwidth : 3 + out[currentPos++] = (val << 8) >>> 29; + out[currentPos++] = (val << 11) >>> 29; + out[currentPos++] = (val << 14) >>> 29; + out[currentPos++] = (val << 17) >>> 29; + out[currentPos++] = (val << 20) >>> 29; + out[currentPos++] = (val << 23) >>> 29; + out[currentPos++] = (val << 26) >>> 29; + out[currentPos++] = (val << 29) >>> 29; + out[currentPos++] = (valn << 1) >>> 29; + // number : 1, bitwidth : 28 + out[currentPos++] = (valn << 4) >>> 4; + } + + private void decode25(int val, int valn, int[] out, int currentPos) { + // number : 9, bitwidth : 3 + out[currentPos++] = (val << 8) >>> 29; + out[currentPos++] = (val << 11) >>> 29; + out[currentPos++] = (val << 14) >>> 29; + out[currentPos++] = (val << 17) >>> 29; + out[currentPos++] = (val << 20) >>> 29; + out[currentPos++] = (val << 23) >>> 29; + out[currentPos++] = (val << 26) >>> 29; + out[currentPos++] = (val << 29) >>> 29; + out[currentPos++] = (valn << 1) >>> 29; + // number : 2, bitwidth : 14 + out[currentPos++] = (valn << 4) >>> 18; + out[currentPos++] = (valn << 18) >>> 18; + } + + private void decode24(int val, int valn, int[] out, int currentPos) { + // number : 9, bitwidth : 3 + out[currentPos++] = (val << 8) >>> 29; + out[currentPos++] = (val << 11) >>> 29; + out[currentPos++] = (val << 14) >>> 29; + out[currentPos++] = (val << 17) >>> 29; + out[currentPos++] = (val << 20) >>> 29; + out[currentPos++] = (val << 23) >>> 29; + out[currentPos++] = (val << 26) >>> 29; + out[currentPos++] = (val << 29) >>> 29; + out[currentPos++] = (valn << 2) >>> 29; + // number : 3, bitwidth : 9 + out[currentPos++] = (valn << 5) >>> 23; + out[currentPos++] = (valn << 14) >>> 23; + out[currentPos++] = (valn << 23) >>> 23; + } + + private void decode23(int val, int valn, int[] out, int currentPos) { + // number : 9, bitwidth : 3 + out[currentPos++] = (val << 8) >>> 29; + out[currentPos++] = (val << 11) >>> 29; + out[currentPos++] = (val << 14) >>> 29; + out[currentPos++] = (val << 17) >>> 29; + out[currentPos++] = (val << 20) >>> 29; + out[currentPos++] = (val << 23) >>> 29; + out[currentPos++] = (val << 26) >>> 29; + out[currentPos++] = (val << 29) >>> 29; + out[currentPos++] = (valn << 1) >>> 29; + // number : 4, bitwidth : 7 + out[currentPos++] = (valn << 4) >>> 25; + out[currentPos++] = (valn << 11) >>> 25; + out[currentPos++] = (valn << 18) >>> 25; + out[currentPos++] = (valn << 25) >>> 25; + } + + private void decode22(int val, int valn, int[] out, int currentPos) { + // number : 9, bitwidth : 3 + out[currentPos++] = (val << 8) >>> 29; + out[currentPos++] = (val << 11) >>> 29; + out[currentPos++] = (val << 14) >>> 29; + out[currentPos++] = (val << 17) >>> 29; + out[currentPos++] = (val << 20) >>> 29; + out[currentPos++] = (val << 23) >>> 29; + out[currentPos++] = (val << 26) >>> 29; + out[currentPos++] = (val << 29) >>> 29; + out[currentPos++] = (valn << 4) >>> 29; + // number : 5, bitwidth : 5 + out[currentPos++] = (valn << 7) >>> 27; + out[currentPos++] = (valn << 12) >>> 27; + out[currentPos++] = (valn << 17) >>> 27; + out[currentPos++] = (valn << 22) >>> 27; + out[currentPos++] = (valn << 27) >>> 27; + } + + private void decode21(int val, int valn, int[] out, int currentPos) { + // number : 9, bitwidth : 3 + out[currentPos++] = (val << 8) >>> 29; + out[currentPos++] = (val << 11) >>> 29; + out[currentPos++] = (val << 14) >>> 29; + out[currentPos++] = (val << 17) >>> 29; + out[currentPos++] = (val << 20) >>> 29; + out[currentPos++] = (val << 23) >>> 29; + out[currentPos++] = (val << 26) >>> 29; + out[currentPos++] = (val << 29) >>> 29; + out[currentPos++] = (valn << 1) >>> 29; + // number : 7, bitwidth : 4 + out[currentPos++] = (valn << 4) >>> 28; + out[currentPos++] = (valn << 8) >>> 28; + out[currentPos++] = (valn << 12) >>> 28; + out[currentPos++] = (valn << 16) >>> 28; + out[currentPos++] = (valn << 20) >>> 28; + out[currentPos++] = (valn << 24) >>> 28; + out[currentPos++] = (valn << 28) >>> 28; + } + + private void decode20(int val, int valn, int[] out, int currentPos) { + // number : 9, bitwidth : 3 + out[currentPos++] = (val << 8) >>> 29; + out[currentPos++] = (val << 11) >>> 29; + out[currentPos++] = (val << 14) >>> 29; + out[currentPos++] = (val << 17) >>> 29; + out[currentPos++] = (val << 20) >>> 29; + out[currentPos++] = (val << 23) >>> 29; + out[currentPos++] = (val << 26) >>> 29; + out[currentPos++] = (val << 29) >>> 29; + out[currentPos++] = (valn << 2) >>> 29; + // number : 9, bitwidth : 3 + out[currentPos++] = (valn << 5) >>> 29; + out[currentPos++] = (valn << 8) >>> 29; + out[currentPos++] = (valn << 11) >>> 29; + out[currentPos++] = (valn << 14) >>> 29; + out[currentPos++] = (valn << 17) >>> 29; + out[currentPos++] = (valn << 20) >>> 29; + out[currentPos++] = (valn << 23) >>> 29; + out[currentPos++] = (valn << 26) >>> 29; + out[currentPos++] = (valn << 29) >>> 29; + } + + private void decode19(int val, int valn, int[] out, int currentPos) { + // number : 9, bitwidth : 3 + out[currentPos++] = (val << 8) >>> 29; + out[currentPos++] = (val << 11) >>> 29; + out[currentPos++] = (val << 14) >>> 29; + out[currentPos++] = (val << 17) >>> 29; + out[currentPos++] = (val << 20) >>> 29; + out[currentPos++] = (val << 23) >>> 29; + out[currentPos++] = (val << 26) >>> 29; + out[currentPos++] = (val << 29) >>> 29; + out[currentPos++] = (valn << 1) >>> 29; + // number : 14, bitwidth : 2 + out[currentPos++] = (valn << 4) >>> 30; + out[currentPos++] = (valn << 6) >>> 30; + out[currentPos++] = (valn << 8) >>> 30; + out[currentPos++] = (valn << 10) >>> 30; + out[currentPos++] = (valn << 12) >>> 30; + out[currentPos++] = (valn << 14) >>> 30; + out[currentPos++] = (valn << 16) >>> 30; + out[currentPos++] = (valn << 18) >>> 30; + out[currentPos++] = (valn << 20) >>> 30; + out[currentPos++] = (valn << 22) >>> 30; // 10 + out[currentPos++] = (valn << 24) >>> 30; + out[currentPos++] = (valn << 26) >>> 30; + out[currentPos++] = (valn << 28) >>> 30; + out[currentPos++] = (valn << 30) >>> 30; + } + + private void decode18(int val, int valn, int[] out, int currentPos) { + // number : 9, bitwidth : 3 + out[currentPos++] = (val << 8) >>> 29; + out[currentPos++] = (val << 11) >>> 29; + out[currentPos++] = (val << 14) >>> 29; + out[currentPos++] = (val << 17) >>> 29; + out[currentPos++] = (val << 20) >>> 29; + out[currentPos++] = (val << 23) >>> 29; + out[currentPos++] = (val << 26) >>> 29; + out[currentPos++] = (val << 29) >>> 29; + out[currentPos++] = (valn << 1) >>> 29; + // number : 28, bitwidth : 1 + out[currentPos++] = (valn << 4) >>> 31; + out[currentPos++] = (valn << 5) >>> 31; + out[currentPos++] = (valn << 6) >>> 31; + out[currentPos++] = (valn << 7) >>> 31; + out[currentPos++] = (valn << 8) >>> 31; + out[currentPos++] = (valn << 9) >>> 31; + out[currentPos++] = (valn << 10) >>> 31; + out[currentPos++] = (valn << 11) >>> 31; + out[currentPos++] = (valn << 12) >>> 31; + out[currentPos++] = (valn << 13) >>> 31; // 10 + out[currentPos++] = (valn << 14) >>> 31; + out[currentPos++] = (valn << 15) >>> 31; + out[currentPos++] = (valn << 16) >>> 31; + out[currentPos++] = (valn << 17) >>> 31; + out[currentPos++] = (valn << 18) >>> 31; + out[currentPos++] = (valn << 19) >>> 31; + out[currentPos++] = (valn << 20) >>> 31; + out[currentPos++] = (valn << 21) >>> 31; + out[currentPos++] = (valn << 22) >>> 31; + out[currentPos++] = (valn << 23) >>> 31; // 20 + out[currentPos++] = (valn << 24) >>> 31; + out[currentPos++] = (valn << 25) >>> 31; + out[currentPos++] = (valn << 26) >>> 31; + out[currentPos++] = (valn << 27) >>> 31; + out[currentPos++] = (valn << 28) >>> 31; + out[currentPos++] = (valn << 29) >>> 31; + out[currentPos++] = (valn << 30) >>> 31; + out[currentPos++] = (valn << 31) >>> 31; + } + + private void decode17(int val, int valn, int[] out, int currentPos) { + // number : 14, bitwidth : 2 + out[currentPos++] = (val << 8) >>> 30; + out[currentPos++] = (val << 10) >>> 30; + out[currentPos++] = (val << 12) >>> 30; + out[currentPos++] = (val << 14) >>> 30; + out[currentPos++] = (val << 16) >>> 30; + out[currentPos++] = (val << 18) >>> 30; + out[currentPos++] = (val << 20) >>> 30; + out[currentPos++] = (val << 22) >>> 30; // 10 + out[currentPos++] = (val << 24) >>> 30; + out[currentPos++] = (val << 26) >>> 30; + out[currentPos++] = (val << 28) >>> 30; + out[currentPos++] = (val << 30) >>> 30; + out[currentPos++] = (valn << 0) >>> 30; + out[currentPos++] = (valn << 2) >>> 30; + // number : 1, bitwidth : 28 + out[currentPos++] = (valn << 4) >>> 4; + } + + private void decode16(int val, int valn, int[] out, int currentPos) { + // number : 14, bitwidth : 2 + out[currentPos++] = (val << 8) >>> 30; + out[currentPos++] = (val << 10) >>> 30; + out[currentPos++] = (val << 12) >>> 30; + out[currentPos++] = (val << 14) >>> 30; + out[currentPos++] = (val << 16) >>> 30; + out[currentPos++] = (val << 18) >>> 30; + out[currentPos++] = (val << 20) >>> 30; + out[currentPos++] = (val << 22) >>> 30; // 10 + out[currentPos++] = (val << 24) >>> 30; + out[currentPos++] = (val << 26) >>> 30; + out[currentPos++] = (val << 28) >>> 30; + out[currentPos++] = (val << 30) >>> 30; + out[currentPos++] = (valn << 0) >>> 30; + out[currentPos++] = (valn << 2) >>> 30; + // number : 2, bitwidth : 14 + out[currentPos++] = (valn << 4) >>> 18; + out[currentPos++] = (valn << 18) >>> 18; + } + + private void decode15(int val, int valn, int[] out, int currentPos) { + // number : 14, bitwidth : 2 + out[currentPos++] = (val << 8) >>> 30; + out[currentPos++] = (val << 10) >>> 30; + out[currentPos++] = (val << 12) >>> 30; + out[currentPos++] = (val << 14) >>> 30; + out[currentPos++] = (val << 16) >>> 30; + out[currentPos++] = (val << 18) >>> 30; + out[currentPos++] = (val << 20) >>> 30; + out[currentPos++] = (val << 22) >>> 30; // 10 + out[currentPos++] = (val << 24) >>> 30; + out[currentPos++] = (val << 26) >>> 30; + out[currentPos++] = (val << 28) >>> 30; + out[currentPos++] = (val << 30) >>> 30; + out[currentPos++] = (valn << 1) >>> 30; + out[currentPos++] = (valn << 3) >>> 30; + // number : 3, bitwidth : 9 + out[currentPos++] = (valn << 5) >>> 23; + out[currentPos++] = (valn << 14) >>> 23; + out[currentPos++] = (valn << 23) >>> 23; + } + + private void decode14(int val, int valn, int[] out, int currentPos) { + // number : 14, bitwidth : 2 + out[currentPos++] = (val << 8) >>> 30; + out[currentPos++] = (val << 10) >>> 30; + out[currentPos++] = (val << 12) >>> 30; + out[currentPos++] = (val << 14) >>> 30; + out[currentPos++] = (val << 16) >>> 30; + out[currentPos++] = (val << 18) >>> 30; + out[currentPos++] = (val << 20) >>> 30; + out[currentPos++] = (val << 22) >>> 30; // 10 + out[currentPos++] = (val << 24) >>> 30; + out[currentPos++] = (val << 26) >>> 30; + out[currentPos++] = (val << 28) >>> 30; + out[currentPos++] = (val << 30) >>> 30; + out[currentPos++] = (valn << 0) >>> 30; + out[currentPos++] = (valn << 2) >>> 30; + // number : 4, bitwidth : 7 + out[currentPos++] = (valn << 4) >>> 25; + out[currentPos++] = (valn << 11) >>> 25; + out[currentPos++] = (valn << 18) >>> 25; + out[currentPos++] = (valn << 25) >>> 25; + } + + private void decode13(int val, int valn, int[] out, int currentPos) { + // number : 14, bitwidth : 2 + out[currentPos++] = (val << 8) >>> 30; + out[currentPos++] = (val << 10) >>> 30; + out[currentPos++] = (val << 12) >>> 30; + out[currentPos++] = (val << 14) >>> 30; + out[currentPos++] = (val << 16) >>> 30; + out[currentPos++] = (val << 18) >>> 30; + out[currentPos++] = (val << 20) >>> 30; + out[currentPos++] = (val << 22) >>> 30; // 10 + out[currentPos++] = (val << 24) >>> 30; + out[currentPos++] = (val << 26) >>> 30; + out[currentPos++] = (val << 28) >>> 30; + out[currentPos++] = (val << 30) >>> 30; + out[currentPos++] = (valn << 3) >>> 30; + out[currentPos++] = (valn << 5) >>> 30; + // number : 5, bitwidth : 5 + out[currentPos++] = (valn << 7) >>> 27; + out[currentPos++] = (valn << 12) >>> 27; + out[currentPos++] = (valn << 17) >>> 27; + out[currentPos++] = (valn << 22) >>> 27; + out[currentPos++] = (valn << 27) >>> 27; + + } + + private void decode12(int val, int valn, int[] out, int currentPos) { + // number : 14, bitwidth : 2 + out[currentPos++] = (val << 8) >>> 30; + out[currentPos++] = (val << 10) >>> 30; + out[currentPos++] = (val << 12) >>> 30; + out[currentPos++] = (val << 14) >>> 30; + out[currentPos++] = (val << 16) >>> 30; + out[currentPos++] = (val << 18) >>> 30; + out[currentPos++] = (val << 20) >>> 30; + out[currentPos++] = (val << 22) >>> 30; // 10 + out[currentPos++] = (val << 24) >>> 30; + out[currentPos++] = (val << 26) >>> 30; + out[currentPos++] = (val << 28) >>> 30; + out[currentPos++] = (val << 30) >>> 30; + out[currentPos++] = (valn << 0) >>> 30; + out[currentPos++] = (valn << 2) >>> 30; + // number : 7, bitwidth : 4 + out[currentPos++] = (valn << 4) >>> 28; + out[currentPos++] = (valn << 8) >>> 28; + out[currentPos++] = (valn << 12) >>> 28; + out[currentPos++] = (valn << 16) >>> 28; + out[currentPos++] = (valn << 20) >>> 28; + out[currentPos++] = (valn << 24) >>> 28; + out[currentPos++] = (valn << 28) >>> 28; + + } + + private void decode11(int val, int valn, int[] out, int currentPos) { + // number : 14, bitwidth : 2 + out[currentPos++] = (val << 8) >>> 30; + out[currentPos++] = (val << 10) >>> 30; + out[currentPos++] = (val << 12) >>> 30; + out[currentPos++] = (val << 14) >>> 30; + out[currentPos++] = (val << 16) >>> 30; + out[currentPos++] = (val << 18) >>> 30; + out[currentPos++] = (val << 20) >>> 30; + out[currentPos++] = (val << 22) >>> 30; // 10 + out[currentPos++] = (val << 24) >>> 30; + out[currentPos++] = (val << 26) >>> 30; + out[currentPos++] = (val << 28) >>> 30; + out[currentPos++] = (val << 30) >>> 30; + out[currentPos++] = (valn << 1) >>> 30; + out[currentPos++] = (valn << 3) >>> 30; + // number : 9, bitwidth : 3 + out[currentPos++] = (valn << 5) >>> 29; + out[currentPos++] = (valn << 8) >>> 29; + out[currentPos++] = (valn << 11) >>> 29; + out[currentPos++] = (valn << 14) >>> 29; + out[currentPos++] = (valn << 17) >>> 29; + out[currentPos++] = (valn << 20) >>> 29; + out[currentPos++] = (valn << 23) >>> 29; + out[currentPos++] = (valn << 26) >>> 29; + out[currentPos++] = (valn << 29) >>> 29; + + } + + private void decode10(int val, int valn, int[] out, int currentPos) { + // number : 14, bitwidth : 2 + out[currentPos++] = (val << 8) >>> 30; + out[currentPos++] = (val << 10) >>> 30; + out[currentPos++] = (val << 12) >>> 30; + out[currentPos++] = (val << 14) >>> 30; + out[currentPos++] = (val << 16) >>> 30; + out[currentPos++] = (val << 18) >>> 30; + out[currentPos++] = (val << 20) >>> 30; + out[currentPos++] = (val << 22) >>> 30; // 10 + out[currentPos++] = (val << 24) >>> 30; + out[currentPos++] = (val << 26) >>> 30; + out[currentPos++] = (val << 28) >>> 30; + out[currentPos++] = (val << 30) >>> 30; + out[currentPos++] = (valn << 0) >>> 30; + out[currentPos++] = (valn << 2) >>> 30; + // number : 14, bitwidth : 2 + out[currentPos++] = (valn << 4) >>> 30; + out[currentPos++] = (valn << 6) >>> 30; + out[currentPos++] = (valn << 8) >>> 30; + out[currentPos++] = (valn << 10) >>> 30; + out[currentPos++] = (valn << 12) >>> 30; + out[currentPos++] = (valn << 14) >>> 30; + out[currentPos++] = (valn << 16) >>> 30; + out[currentPos++] = (valn << 18) >>> 30; + out[currentPos++] = (valn << 20) >>> 30; + out[currentPos++] = (valn << 22) >>> 30; // 10 + out[currentPos++] = (valn << 24) >>> 30; + out[currentPos++] = (valn << 26) >>> 30; + out[currentPos++] = (valn << 28) >>> 30; + out[currentPos++] = (valn << 30) >>> 30; + } + + private void decode9(int val, int valn, int[] out, int currentPos) { + // number : 14, bitwidth : 2 + out[currentPos++] = (val << 8) >>> 30; + out[currentPos++] = (val << 10) >>> 30; + out[currentPos++] = (val << 12) >>> 30; + out[currentPos++] = (val << 14) >>> 30; + out[currentPos++] = (val << 16) >>> 30; + out[currentPos++] = (val << 18) >>> 30; + out[currentPos++] = (val << 20) >>> 30; + out[currentPos++] = (val << 22) >>> 30; // 10 + out[currentPos++] = (val << 24) >>> 30; + out[currentPos++] = (val << 26) >>> 30; + out[currentPos++] = (val << 28) >>> 30; + out[currentPos++] = (val << 30) >>> 30; + out[currentPos++] = (valn << 0) >>> 30; + out[currentPos++] = (valn << 2) >>> 30; + // number : 28, bitwidth : 1 + out[currentPos++] = (valn << 4) >>> 31; + out[currentPos++] = (valn << 5) >>> 31; + out[currentPos++] = (valn << 6) >>> 31; + out[currentPos++] = (valn << 7) >>> 31; + out[currentPos++] = (valn << 8) >>> 31; + out[currentPos++] = (valn << 9) >>> 31; + out[currentPos++] = (valn << 10) >>> 31; + out[currentPos++] = (valn << 11) >>> 31; + out[currentPos++] = (valn << 12) >>> 31; + out[currentPos++] = (valn << 13) >>> 31; // 10 + out[currentPos++] = (valn << 14) >>> 31; + out[currentPos++] = (valn << 15) >>> 31; + out[currentPos++] = (valn << 16) >>> 31; + out[currentPos++] = (valn << 17) >>> 31; + out[currentPos++] = (valn << 18) >>> 31; + out[currentPos++] = (valn << 19) >>> 31; + out[currentPos++] = (valn << 20) >>> 31; + out[currentPos++] = (valn << 21) >>> 31; + out[currentPos++] = (valn << 22) >>> 31; + out[currentPos++] = (valn << 23) >>> 31; // 20 + out[currentPos++] = (valn << 24) >>> 31; + out[currentPos++] = (valn << 25) >>> 31; + out[currentPos++] = (valn << 26) >>> 31; + out[currentPos++] = (valn << 27) >>> 31; + out[currentPos++] = (valn << 28) >>> 31; + out[currentPos++] = (valn << 29) >>> 31; + out[currentPos++] = (valn << 30) >>> 31; + out[currentPos++] = (valn << 31) >>> 31; + } + + private void decode8(int val, int valn, int[] out, int currentPos) { + // number : 28, bitwidth : 1 + out[currentPos++] = (val << 8) >>> 31; + out[currentPos++] = (val << 9) >>> 31; + out[currentPos++] = (val << 10) >>> 31; + out[currentPos++] = (val << 11) >>> 31; + out[currentPos++] = (val << 12) >>> 31; + out[currentPos++] = (val << 13) >>> 31; // 10 + out[currentPos++] = (val << 14) >>> 31; + out[currentPos++] = (val << 15) >>> 31; + out[currentPos++] = (val << 16) >>> 31; + out[currentPos++] = (val << 17) >>> 31; + out[currentPos++] = (val << 18) >>> 31; + out[currentPos++] = (val << 19) >>> 31; + out[currentPos++] = (val << 20) >>> 31; + out[currentPos++] = (val << 21) >>> 31; + out[currentPos++] = (val << 22) >>> 31; + out[currentPos++] = (val << 23) >>> 31; // 20 + out[currentPos++] = (val << 24) >>> 31; + out[currentPos++] = (val << 25) >>> 31; + out[currentPos++] = (val << 26) >>> 31; + out[currentPos++] = (val << 27) >>> 31; + out[currentPos++] = (val << 28) >>> 31; + out[currentPos++] = (val << 29) >>> 31; + out[currentPos++] = (val << 30) >>> 31; + out[currentPos++] = (val << 31) >>> 31; + out[currentPos++] = valn >>> 31; + out[currentPos++] = (valn << 1) >>> 31; + out[currentPos++] = (valn << 2) >>> 31; + out[currentPos++] = (valn << 3) >>> 31; + // number : 1, bitwidth : 28 + out[currentPos++] = (valn << 4) >>> 4; + } + + private void decode7(int val, int valn, int[] out, int currentPos) { + // number : 28, bitwidth : 1 + out[currentPos++] = (val << 8) >>> 31; + out[currentPos++] = (val << 9) >>> 31; + out[currentPos++] = (val << 10) >>> 31; + out[currentPos++] = (val << 11) >>> 31; + out[currentPos++] = (val << 12) >>> 31; + out[currentPos++] = (val << 13) >>> 31; // 10 + out[currentPos++] = (val << 14) >>> 31; + out[currentPos++] = (val << 15) >>> 31; + out[currentPos++] = (val << 16) >>> 31; + out[currentPos++] = (val << 17) >>> 31; + out[currentPos++] = (val << 18) >>> 31; + out[currentPos++] = (val << 19) >>> 31; + out[currentPos++] = (val << 20) >>> 31; + out[currentPos++] = (val << 21) >>> 31; + out[currentPos++] = (val << 22) >>> 31; + out[currentPos++] = (val << 23) >>> 31; // 20 + out[currentPos++] = (val << 24) >>> 31; + out[currentPos++] = (val << 25) >>> 31; + out[currentPos++] = (val << 26) >>> 31; + out[currentPos++] = (val << 27) >>> 31; + out[currentPos++] = (val << 28) >>> 31; + out[currentPos++] = (val << 29) >>> 31; + out[currentPos++] = (val << 30) >>> 31; + out[currentPos++] = (val << 31) >>> 31; + out[currentPos++] = valn >>> 31; + out[currentPos++] = (valn << 1) >>> 31; + out[currentPos++] = (valn << 2) >>> 31; + out[currentPos++] = (valn << 3) >>> 31; + // number : 2, bitwidth : 14 + out[currentPos++] = (valn << 4) >>> 18; + out[currentPos++] = (valn << 18) >>> 18; + } + + private void decode6(int val, int valn, int[] out, int currentPos) { + // number : 28, bitwidth : 1 + out[currentPos++] = (val << 8) >>> 31; + out[currentPos++] = (val << 9) >>> 31; + out[currentPos++] = (val << 10) >>> 31; + out[currentPos++] = (val << 11) >>> 31; + out[currentPos++] = (val << 12) >>> 31; + out[currentPos++] = (val << 13) >>> 31; // 10 + out[currentPos++] = (val << 14) >>> 31; + out[currentPos++] = (val << 15) >>> 31; + out[currentPos++] = (val << 16) >>> 31; + out[currentPos++] = (val << 17) >>> 31; + out[currentPos++] = (val << 18) >>> 31; + out[currentPos++] = (val << 19) >>> 31; + out[currentPos++] = (val << 20) >>> 31; + out[currentPos++] = (val << 21) >>> 31; + out[currentPos++] = (val << 22) >>> 31; + out[currentPos++] = (val << 23) >>> 31; // 20 + out[currentPos++] = (val << 24) >>> 31; + out[currentPos++] = (val << 25) >>> 31; + out[currentPos++] = (val << 26) >>> 31; + out[currentPos++] = (val << 27) >>> 31; + out[currentPos++] = (val << 28) >>> 31; + out[currentPos++] = (val << 29) >>> 31; + out[currentPos++] = (val << 30) >>> 31; + out[currentPos++] = (val << 31) >>> 31; + out[currentPos++] = (valn << 1) >>> 31; + out[currentPos++] = (valn << 2) >>> 31; + out[currentPos++] = (valn << 3) >>> 31; + out[currentPos++] = (valn << 4) >>> 31; + // number : 3, bitwidth : 9 + out[currentPos++] = (valn << 5) >>> 23; + out[currentPos++] = (valn << 14) >>> 23; + out[currentPos++] = (valn << 23) >>> 23; + } + + private void decode5(int val, int valn, int[] out, int currentPos) { + // number : 28, bitwidth : 1 + out[currentPos++] = (val << 8) >>> 31; + out[currentPos++] = (val << 9) >>> 31; + out[currentPos++] = (val << 10) >>> 31; + out[currentPos++] = (val << 11) >>> 31; + out[currentPos++] = (val << 12) >>> 31; + out[currentPos++] = (val << 13) >>> 31; // 10 + out[currentPos++] = (val << 14) >>> 31; + out[currentPos++] = (val << 15) >>> 31; + out[currentPos++] = (val << 16) >>> 31; + out[currentPos++] = (val << 17) >>> 31; + out[currentPos++] = (val << 18) >>> 31; + out[currentPos++] = (val << 19) >>> 31; + out[currentPos++] = (val << 20) >>> 31; + out[currentPos++] = (val << 21) >>> 31; + out[currentPos++] = (val << 22) >>> 31; + out[currentPos++] = (val << 23) >>> 31; // 20 + out[currentPos++] = (val << 24) >>> 31; + out[currentPos++] = (val << 25) >>> 31; + out[currentPos++] = (val << 26) >>> 31; + out[currentPos++] = (val << 27) >>> 31; + out[currentPos++] = (val << 28) >>> 31; + out[currentPos++] = (val << 29) >>> 31; + out[currentPos++] = (val << 30) >>> 31; + out[currentPos++] = (val << 31) >>> 31; + out[currentPos++] = valn >>> 31; + out[currentPos++] = (valn << 1) >>> 31; + out[currentPos++] = (valn << 2) >>> 31; + out[currentPos++] = (valn << 3) >>> 31; + // number : 4, bitwidth : 7 + out[currentPos++] = (valn << 4) >>> 25; + out[currentPos++] = (valn << 11) >>> 25; + out[currentPos++] = (valn << 18) >>> 25; + out[currentPos++] = (valn << 25) >>> 25; + } + + private void decode4(int val, int valn, int[] out, int currentPos) { + // number : 28, bitwidth : 1 + out[currentPos++] = (val << 8) >>> 31; + out[currentPos++] = (val << 9) >>> 31; + out[currentPos++] = (val << 10) >>> 31; + out[currentPos++] = (val << 11) >>> 31; + out[currentPos++] = (val << 12) >>> 31; + out[currentPos++] = (val << 13) >>> 31; // 10 + out[currentPos++] = (val << 14) >>> 31; + out[currentPos++] = (val << 15) >>> 31; + out[currentPos++] = (val << 16) >>> 31; + out[currentPos++] = (val << 17) >>> 31; + out[currentPos++] = (val << 18) >>> 31; + out[currentPos++] = (val << 19) >>> 31; + out[currentPos++] = (val << 20) >>> 31; + out[currentPos++] = (val << 21) >>> 31; + out[currentPos++] = (val << 22) >>> 31; + out[currentPos++] = (val << 23) >>> 31; // 20 + out[currentPos++] = (val << 24) >>> 31; + out[currentPos++] = (val << 25) >>> 31; + out[currentPos++] = (val << 26) >>> 31; + out[currentPos++] = (val << 27) >>> 31; + out[currentPos++] = (val << 28) >>> 31; + out[currentPos++] = (val << 29) >>> 31; + out[currentPos++] = (val << 30) >>> 31; + out[currentPos++] = (val << 31) >>> 31; + out[currentPos++] = (valn << 3) >>> 31;// 头部3bit + out[currentPos++] = (valn << 4) >>> 31; + out[currentPos++] = (valn << 5) >>> 31; + out[currentPos++] = (valn << 6) >>> 31; + // number : 5, bitwidth : 5 + out[currentPos++] = (valn << 7) >>> 27; + out[currentPos++] = (valn << 12) >>> 27; + out[currentPos++] = (valn << 17) >>> 27; + out[currentPos++] = (valn << 22) >>> 27; + out[currentPos++] = (valn << 27) >>> 27; + } + + private void decode3(int val, int valn, int[] out, int currentPos) { + // number : 28, bitwidth : 1 + out[currentPos++] = (val << 8) >>> 31; + out[currentPos++] = (val << 9) >>> 31; + out[currentPos++] = (val << 10) >>> 31; + out[currentPos++] = (val << 11) >>> 31; + out[currentPos++] = (val << 12) >>> 31; + out[currentPos++] = (val << 13) >>> 31; // 10 + out[currentPos++] = (val << 14) >>> 31; + out[currentPos++] = (val << 15) >>> 31; + out[currentPos++] = (val << 16) >>> 31; + out[currentPos++] = (val << 17) >>> 31; + out[currentPos++] = (val << 18) >>> 31; + out[currentPos++] = (val << 19) >>> 31; + out[currentPos++] = (val << 20) >>> 31; + out[currentPos++] = (val << 21) >>> 31; + out[currentPos++] = (val << 22) >>> 31; + out[currentPos++] = (val << 23) >>> 31; // 20 + out[currentPos++] = (val << 24) >>> 31; + out[currentPos++] = (val << 25) >>> 31; + out[currentPos++] = (val << 26) >>> 31; + out[currentPos++] = (val << 27) >>> 31; + out[currentPos++] = (val << 28) >>> 31; + out[currentPos++] = (val << 29) >>> 31; + out[currentPos++] = (val << 30) >>> 31; + out[currentPos++] = (val << 31) >>> 31; + out[currentPos++] = valn >>> 31; + out[currentPos++] = (valn << 1) >>> 31; + out[currentPos++] = (valn << 2) >>> 31; + out[currentPos++] = (valn << 3) >>> 31; + // number : 7, bitwidth : 4 + out[currentPos++] = (valn << 4) >>> 28; + out[currentPos++] = (valn << 8) >>> 28; + out[currentPos++] = (valn << 12) >>> 28; + out[currentPos++] = (valn << 16) >>> 28; + out[currentPos++] = (valn << 20) >>> 28; + out[currentPos++] = (valn << 24) >>> 28; + out[currentPos++] = (valn << 28) >>> 28; + } + + private void decode2(int val, int valn, int[] out, int currentPos) { + // number : 28, bitwidth : 1 + out[currentPos++] = (val << 8) >>> 31; + out[currentPos++] = (val << 9) >>> 31; + out[currentPos++] = (val << 10) >>> 31; + out[currentPos++] = (val << 11) >>> 31; + out[currentPos++] = (val << 12) >>> 31; + out[currentPos++] = (val << 13) >>> 31; // 10 + out[currentPos++] = (val << 14) >>> 31; + out[currentPos++] = (val << 15) >>> 31; + out[currentPos++] = (val << 16) >>> 31; + out[currentPos++] = (val << 17) >>> 31; + out[currentPos++] = (val << 18) >>> 31; + out[currentPos++] = (val << 19) >>> 31; + out[currentPos++] = (val << 20) >>> 31; + out[currentPos++] = (val << 21) >>> 31; + out[currentPos++] = (val << 22) >>> 31; + out[currentPos++] = (val << 23) >>> 31; // 20 + out[currentPos++] = (val << 24) >>> 31; + out[currentPos++] = (val << 25) >>> 31; + out[currentPos++] = (val << 26) >>> 31; + out[currentPos++] = (val << 27) >>> 31; + out[currentPos++] = (val << 28) >>> 31; + out[currentPos++] = (val << 29) >>> 31; + out[currentPos++] = (val << 30) >>> 31; + out[currentPos++] = (val << 31) >>> 31; + out[currentPos++] = (valn << 1) >>> 31;// 头部1bit + out[currentPos++] = (valn << 2) >>> 31; + out[currentPos++] = (valn << 3) >>> 31; + out[currentPos++] = (valn << 4) >>> 31; + // number : 9, bitwidth : 3 + out[currentPos++] = (valn << 5) >>> 29; + out[currentPos++] = (valn << 8) >>> 29; + out[currentPos++] = (valn << 11) >>> 29; + out[currentPos++] = (valn << 14) >>> 29; + out[currentPos++] = (valn << 17) >>> 29; + out[currentPos++] = (valn << 20) >>> 29; + out[currentPos++] = (valn << 23) >>> 29; + out[currentPos++] = (valn << 26) >>> 29; + out[currentPos++] = (valn << 29) >>> 29; + } + + private void decode1(int val, int valn, int[] out, int currentPos) { + // number : 28, bitwidth : 1 + out[currentPos++] = (val << 8) >>> 31; + out[currentPos++] = (val << 9) >>> 31; + out[currentPos++] = (val << 10) >>> 31; + out[currentPos++] = (val << 11) >>> 31; + out[currentPos++] = (val << 12) >>> 31; + out[currentPos++] = (val << 13) >>> 31; // 10 + out[currentPos++] = (val << 14) >>> 31; + out[currentPos++] = (val << 15) >>> 31; + out[currentPos++] = (val << 16) >>> 31; + out[currentPos++] = (val << 17) >>> 31; + out[currentPos++] = (val << 18) >>> 31; + out[currentPos++] = (val << 19) >>> 31; + out[currentPos++] = (val << 20) >>> 31; + out[currentPos++] = (val << 21) >>> 31; + out[currentPos++] = (val << 22) >>> 31; + out[currentPos++] = (val << 23) >>> 31;// 20 + out[currentPos++] = (val << 24) >>> 31; + out[currentPos++] = (val << 25) >>> 31; + out[currentPos++] = (val << 26) >>> 31; + out[currentPos++] = (val << 27) >>> 31; + out[currentPos++] = (val << 28) >>> 31; + out[currentPos++] = (val << 29) >>> 31; + out[currentPos++] = (val << 30) >>> 31; + out[currentPos++] = (val << 31) >>> 31; + out[currentPos++] = valn >>> 31; + out[currentPos++] = (valn << 1) >>> 31; + out[currentPos++] = (valn << 2) >>> 31; + out[currentPos++] = (valn << 3) >>> 31; + // number : 14, bitwidth : 2 + out[currentPos++] = (valn << 4) >>> 30; + out[currentPos++] = (valn << 6) >>> 30; + out[currentPos++] = (valn << 8) >>> 30; + out[currentPos++] = (valn << 10) >>> 30; + out[currentPos++] = (valn << 12) >>> 30; + out[currentPos++] = (valn << 14) >>> 30; + out[currentPos++] = (valn << 16) >>> 30; + out[currentPos++] = (valn << 18) >>> 30; + out[currentPos++] = (valn << 20) >>> 30; + out[currentPos++] = (valn << 22) >>> 30; // 10 + out[currentPos++] = (valn << 24) >>> 30; + out[currentPos++] = (valn << 26) >>> 30; + out[currentPos++] = (valn << 28) >>> 30; + out[currentPos++] = (valn << 30) >>> 30; + } + + private void decode0(int val, int valn, int[] out, int currentPos) { + // number : 28, bitwidth : 1 + out[currentPos++] = (val << 8) >>> 31; + out[currentPos++] = (val << 9) >>> 31; + out[currentPos++] = (val << 10) >>> 31; + out[currentPos++] = (val << 11) >>> 31; + out[currentPos++] = (val << 12) >>> 31; + out[currentPos++] = (val << 13) >>> 31; // 10 + out[currentPos++] = (val << 14) >>> 31; + out[currentPos++] = (val << 15) >>> 31; + out[currentPos++] = (val << 16) >>> 31; + out[currentPos++] = (val << 17) >>> 31; + out[currentPos++] = (val << 18) >>> 31; + out[currentPos++] = (val << 19) >>> 31; + out[currentPos++] = (val << 20) >>> 31; + out[currentPos++] = (val << 21) >>> 31; + out[currentPos++] = (val << 22) >>> 31; + out[currentPos++] = (val << 23) >>> 31; // 20 + out[currentPos++] = (val << 24) >>> 31; + out[currentPos++] = (val << 25) >>> 31; + out[currentPos++] = (val << 26) >>> 31; + out[currentPos++] = (val << 27) >>> 31; + out[currentPos++] = (val << 28) >>> 31; + out[currentPos++] = (val << 29) >>> 31; + out[currentPos++] = (val << 30) >>> 31; + out[currentPos++] = (val << 31) >>> 31; + out[currentPos++] = valn >>> 31; + out[currentPos++] = (valn << 1) >>> 31; + out[currentPos++] = (valn << 2) >>> 31; + out[currentPos++] = (valn << 3) >>> 31; + // number : 28, bitwidth : 1 + out[currentPos++] = (valn << 4) >>> 31; + out[currentPos++] = (valn << 5) >>> 31; + out[currentPos++] = (valn << 6) >>> 31; + out[currentPos++] = (valn << 7) >>> 31; + out[currentPos++] = (valn << 8) >>> 31; + out[currentPos++] = (valn << 9) >>> 31; + out[currentPos++] = (valn << 10) >>> 31; + out[currentPos++] = (valn << 11) >>> 31; + out[currentPos++] = (valn << 12) >>> 31; + out[currentPos++] = (valn << 13) >>> 31; // 10 + out[currentPos++] = (valn << 14) >>> 31; + out[currentPos++] = (valn << 15) >>> 31; + out[currentPos++] = (valn << 16) >>> 31; + out[currentPos++] = (valn << 17) >>> 31; + out[currentPos++] = (valn << 18) >>> 31; + out[currentPos++] = (valn << 19) >>> 31; + out[currentPos++] = (valn << 20) >>> 31; + out[currentPos++] = (valn << 21) >>> 31; + out[currentPos++] = (valn << 22) >>> 31; + out[currentPos++] = (valn << 23) >>> 31; // 20 + out[currentPos++] = (valn << 24) >>> 31; + out[currentPos++] = (valn << 25) >>> 31; + out[currentPos++] = (valn << 26) >>> 31; + out[currentPos++] = (valn << 27) >>> 31; + out[currentPos++] = (valn << 28) >>> 31; + out[currentPos++] = (valn << 29) >>> 31; + out[currentPos++] = (valn << 30) >>> 31; + out[currentPos++] = (valn << 31) >>> 31; + } + + + private final static int bitLength[] = { 1, 2, 3, 4, 5, 7, 9, 14, 28 }; + + private final static int codeNum[] = { 28, 14, 9, 7, 5, 4, 3, 2, 1 }; + + @Override + public String toString() { + return this.getClass().getSimpleName(); + } + + @Override + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + int tmpoutpos = outpos.get(); + int currentPos = inpos.get(); + int selector1 = 0; + int selector2 = 0; + final int finalin = currentPos + inlength; + while (currentPos < finalin - 28 * 2) { + int nextCurrentPos = currentPos; + mainloop1: for (selector1=0; selector1 <= 8; selector1++) { + int compressedNum = codeNum[selector1]; + //if (finalin <= nextCurrentPos + compressedNum - 1) + // compressedNum = finalin - nextCurrentPos; + int b = bitLength[selector1]; + int max = 1 << b; + int i = 0; + for (; i < compressedNum; i++) { + if (Util.smallerorequalthan(max, in[nextCurrentPos + i])) + continue mainloop1; + } + nextCurrentPos += compressedNum; + break; + } + mainloop2: for (selector2 = 0; selector2 <= 8; selector2++) { + int compressedNum = codeNum[selector2]; + //if (finalin <= nextCurrentPos + compressedNum - 1) + // compressedNum = finalin - nextCurrentPos; + int b = bitLength[selector2]; + int max = 1 << b; + int i = 0; + for (; i < compressedNum; i++) { + if (Util.smallerorequalthan(max, in[nextCurrentPos + i])) + continue mainloop2; + } + nextCurrentPos += compressedNum; + break; + } + int code = M[selector1][selector2]; + out[tmpoutpos] = 0; + out[tmpoutpos + 1] = 0; + switch (code) { + case 0: + encode0(in, currentPos, code, out, tmpoutpos); + break; + case 1: + encode1(in, currentPos, code, out, tmpoutpos); + break; + case 2: + encode2(in, currentPos, code, out, tmpoutpos); + break; + case 3: + encode3(in, currentPos, code, out, tmpoutpos); + break; + case 4: + encode4(in, currentPos, code, out, tmpoutpos); + break; + case 5: + encode5(in, currentPos, code, out, tmpoutpos); + break; + case 6: + encode6(in, currentPos, code, out, tmpoutpos); + break; + case 7: + encode7(in, currentPos, code, out, tmpoutpos); + break; + case 8: + encode8(in, currentPos, code, out, tmpoutpos); + break; + case 9: + encode9(in, currentPos, code, out, tmpoutpos); + break; + case 10: + encode10(in, currentPos, code, out, tmpoutpos); + break; + case 11: + encode11(in, currentPos, code, out, tmpoutpos); + break; + case 12: + encode12(in, currentPos, code, out, tmpoutpos); + break; + case 13: + encode13(in, currentPos, code, out, tmpoutpos); + break; + case 14: + encode14(in, currentPos, code, out, tmpoutpos); + break; + case 15: + encode15(in, currentPos, code, out, tmpoutpos); + break; + case 16: + encode16(in, currentPos, code, out, tmpoutpos); + break; + case 17: + encode17(in, currentPos, code, out, tmpoutpos); + break; + case 18: + encode18(in, currentPos, code, out, tmpoutpos); + break; + case 19: + encode19(in, currentPos, code, out, tmpoutpos); + break; + case 20: + encode20(in, currentPos, code, out, tmpoutpos); + break; + case 21: + encode21(in, currentPos, code, out, tmpoutpos); + break; + case 22: + encode22(in, currentPos, code, out, tmpoutpos); + break; + case 23: + encode23(in, currentPos, code, out, tmpoutpos); + break; + case 24: + encode24(in, currentPos, code, out, tmpoutpos); + break; + case 25: + encode25(in, currentPos, code, out, tmpoutpos); + break; + case 26: + encode26(in, currentPos, code, out, tmpoutpos); + break; + case 27: + encode27(in, currentPos, code, out, tmpoutpos); + break; + case 28: + encode28(in, currentPos, code, out, tmpoutpos); + break; + case 29: + encode29(in, currentPos, code, out, tmpoutpos); + break; + case 30: + encode30(in, currentPos, code, out, tmpoutpos); + break; + case 31: + encode31(in, currentPos, code, out, tmpoutpos); + break; + case 32: + encode32(in, currentPos, code, out, tmpoutpos); + break; + case 33: + encode33(in, currentPos, code, out, tmpoutpos); + break; + case 34: + encode34(in, currentPos, code, out, tmpoutpos); + break; + case 35: + encode35(in, currentPos, code, out, tmpoutpos); + break; + case 36: + encode36(in, currentPos, code, out, tmpoutpos); + break; + case 37: + encode37(in, currentPos, code, out, tmpoutpos); + break; + case 38: + encode38(in, currentPos, code, out, tmpoutpos); + break; + case 39: + encode39(in, currentPos, code, out, tmpoutpos); + break; + case 40: + encode40(in, currentPos, code, out, tmpoutpos); + break; + case 41: + encode41(in, currentPos, code, out, tmpoutpos); + break; + case 42: + encode42(in, currentPos, code, out, tmpoutpos); + break; + case 43: + encode43(in, currentPos, code, out, tmpoutpos); + break; + case 44: + encode44(in, currentPos, code, out, tmpoutpos); + break; + case 45: + encode45(in, currentPos, code, out, tmpoutpos); + break; + case 46: + encode46(in, currentPos, code, out, tmpoutpos); + break; + case 47: + encode47(in, currentPos, code, out, tmpoutpos); + break; + case 48: + encode48(in, currentPos, code, out, tmpoutpos); + break; + case 49: + encode49(in, currentPos, code, out, tmpoutpos); + break; + case 50: + encode50(in, currentPos, code, out, tmpoutpos); + break; + case 51: + encode51(in, currentPos, code, out, tmpoutpos); + break; + case 52: + encode52(in, currentPos, code, out, tmpoutpos); + break; + case 53: + encode53(in, currentPos, code, out, tmpoutpos); + break; + case 54: + encode54(in, currentPos, code, out, tmpoutpos); + break; + case 55: + encode55(in, currentPos, code, out, tmpoutpos); + break; + case 56: + encode56(in, currentPos, code, out, tmpoutpos); + break; + case 57: + encode57(in, currentPos, code, out, tmpoutpos); + break; + case 58: + encode58(in, currentPos, code, out, tmpoutpos); + break; + case 59: + encode59(in, currentPos, code, out, tmpoutpos); + break; + case 60: + encode60(in, currentPos, code, out, tmpoutpos); + break; + case 61: + encode61(in, currentPos, code, out, tmpoutpos); + break; + case 62: + encode62(in, currentPos, code, out, tmpoutpos); + break; + case 63: + encode63(in, currentPos, code, out, tmpoutpos); + break; + case 64: + encode64(in, currentPos, code, out, tmpoutpos); + break; + case 65: + encode65(in, currentPos, code, out, tmpoutpos); + break; + case 66: + encode66(in, currentPos, code, out, tmpoutpos); + break; + case 67: + encode67(in, currentPos, code, out, tmpoutpos); + break; + case 68: + encode68(in, currentPos, code, out, tmpoutpos); + break; + case 69: + encode69(in, currentPos, code, out, tmpoutpos); + break; + case 70: + encode70(in, currentPos, code, out, tmpoutpos); + break; + case 71: + encode71(in, currentPos, code, out, tmpoutpos); + break; + case 72: + encode72(in, currentPos, code, out, tmpoutpos); + break; + case 73: + encode73(in, currentPos, code, out, tmpoutpos); + break; + case 74: + encode74(in, currentPos, code, out, tmpoutpos); + break; + case 75: + encode75(in, currentPos, code, out, tmpoutpos); + break; + case 76: + encode76(in, currentPos, code, out, tmpoutpos); + break; + case 77: + encode77(in, currentPos, code, out, tmpoutpos); + break; + case 78: + encode78(in, currentPos, code, out, tmpoutpos); + break; + case 79: + encode79(in, currentPos, code, out, tmpoutpos); + break; + case 80: + encode80(in, currentPos, code, out, tmpoutpos); + break; + default: + throw new RuntimeException("unsupported code"); + }// end switch + tmpoutpos += 2; + currentPos = nextCurrentPos; + } + + outer: while (currentPos < finalin) { + mainloop: for (int selector = 0; selector < 8; selector++) { + int res = 0; + int compressedNum = codeNum[selector]; + if (finalin <= currentPos + compressedNum - 1) + compressedNum = finalin - currentPos; + int b = bitLength[selector]; + int max = 1 << b; + int i = 0; + for (; i < compressedNum; i++) { + if (Util.smallerorequalthan(max, in[currentPos + i])) + continue mainloop; + res = (res << b) + in[currentPos + i]; + } + if (compressedNum != codeNum[selector]) { + res <<= (codeNum[selector] - compressedNum) * b; + } + res |= selector << 28; + out[tmpoutpos++] = res; + + currentPos += compressedNum; + continue outer; + } + final int selector = 8; + out[tmpoutpos++] = in[currentPos++] | (selector << 28); + } + inpos.set(currentPos); + outpos.set(tmpoutpos); + } + + @Override + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num) { + int currentPos = outpos.get(); + int tmpinpos = inpos.get(); + final int finalout = currentPos + num; + while (currentPos < finalout - 2 * 28) { + + int val = in[tmpinpos++]; + int valn = in[tmpinpos++]; + int header = val >>> 24; + switch (header) { + case 0: { + decode0(val, valn, out, currentPos); + currentPos+=56; + break; + } + case 1: { + decode1(val, valn, out, currentPos); + currentPos+=42; + break; + } + case 2: { + decode2(val, valn, out, currentPos); + currentPos+=37; + break; + } + case 3: { + decode3(val, valn, out, currentPos); + currentPos+=35; + break; + } + case 4: { + decode4(val, valn, out, currentPos); + currentPos+=33; + break; + } + case 5: { + decode5(val, valn, out, currentPos); + currentPos+=32; + break; + } + case 6: { + decode6(val, valn, out, currentPos); + currentPos+=31; + break; + } + case 7: { + decode7(val, valn, out, currentPos); + currentPos+=30; + break; + } + case 8: { + decode8(val, valn, out, currentPos); + currentPos+=29; + break; + } + case 9: { + decode9(val, valn, out, currentPos); + currentPos+=42; + break; + } + case 10: { + decode10(val, valn, out, currentPos); + currentPos+=28; + break; + } + case 11: { + decode11(val, valn, out, currentPos); + currentPos+=23; + break; + } + case 12: { + decode12(val, valn, out, currentPos); + currentPos+=21; + break; + } + case 13: { + decode13(val, valn, out, currentPos); + currentPos+=19; + break; + } + case 14: { + decode14(val, valn, out, currentPos); + currentPos+=18; + break; + } + case 15: { + decode15(val, valn, out, currentPos); + currentPos+=17; + break; + } + case 16: { + decode16(val, valn, out, currentPos); + currentPos+=16; + break; + } + case 17: { + decode17(val, valn, out, currentPos); + currentPos+=15; + break; + } + case 18: { + decode18(val, valn, out, currentPos); + currentPos+=37; + break; + } + case 19: { + decode19(val, valn, out, currentPos); + currentPos+=23; + break; + } + case 20: { + decode20(val, valn, out, currentPos); + currentPos+=18; + break; + } + case 21: { + decode21(val, valn, out, currentPos); + currentPos+=16; + break; + } + case 22: { + decode22(val, valn, out, currentPos); + currentPos+=14; + break; + } + case 23: { + decode23(val, valn, out, currentPos); + currentPos+=13; + break; + } + case 24: { + decode24(val, valn, out, currentPos); + currentPos+=12; + break; + } + case 25: { + decode25(val, valn, out, currentPos); + currentPos+=11; + break; + } + case 26: { + decode26(val, valn, out, currentPos); + currentPos+=10; + break; + } + case 27: { + decode27(val, valn, out, currentPos); + currentPos+=35; + break; + } + case 28: { + decode28(val, valn, out, currentPos); + currentPos+=21; + break; + } + case 29: { + decode29(val, valn, out, currentPos); + currentPos+=16; + break; + } + + case 30: { + decode30(val, valn, out, currentPos); + currentPos+=14; + break; + } + case 31: { + decode31(val, valn, out, currentPos); + currentPos+=12; + break; + } + case 32: { + decode32(val, valn, out, currentPos); + currentPos+=11; + break; + } + case 33: { + decode33(val, valn, out, currentPos); + currentPos+=10; + break; + } + case 34: { + decode34(val, valn, out, currentPos); + currentPos+=9; + break; + } + case 35: { + decode35(val, valn, out, currentPos); + currentPos+=8; + break; + } + case 36: { + decode36(val, valn, out, currentPos); + currentPos+=33; + break; + } + case 37: { + decode37(val, valn, out, currentPos); + currentPos+=19; + break; + } + case 38: { + decode38(val, valn, out, currentPos); + currentPos+=14; + break; + } + case 39: { + decode39(val, valn, out, currentPos); + currentPos+=12; + break; + } + case 40: { + decode40(val, valn, out, currentPos); + currentPos+=10; + break; + } + case 41: { + decode41(val, valn, out, currentPos); + currentPos+=9; + break; + } + case 42: { + decode42(val, valn, out, currentPos); + currentPos+=8; + break; + } + case 43: { + decode43(val, valn, out, currentPos); + currentPos+=7; + break; + } + case 44: { + decode44(val, valn, out, currentPos); + currentPos+=6; + break; + } + case 45: { + decode45(val, valn, out, currentPos); + currentPos+=32; + break; + } + case 46: { + decode46(val, valn, out, currentPos); + currentPos+=18; + break; + } + case 47: { + decode47(val, valn, out, currentPos); + currentPos+=13; + break; + } + case 48: { + decode48(val, valn, out, currentPos); + currentPos+=11; + break; + } + case 49: { + decode49(val, valn, out, currentPos); + currentPos+=9; + break; + } + case 50: { + decode50(val, valn, out, currentPos); + currentPos+=8; + break; + } + case 51: { + decode51(val, valn, out, currentPos); + currentPos+=7; + break; + } + case 52: { + decode52(val, valn, out, currentPos); + currentPos+=6; + break; + } + case 53: { + decode53(val, valn, out, currentPos); + currentPos+=5; + break; + } + case 54: { + decode54(val, valn, out, currentPos); + currentPos+=31; + break; + } + case 55: { + decode55(val, valn, out, currentPos); + currentPos+=17; + break; + } + case 56: { + decode56(val, valn, out, currentPos); + currentPos+=12; + break; + } + case 57: { + decode57(val, valn, out, currentPos); + currentPos+=10; + break; + } + case 58: { + decode58(val, valn, out, currentPos); + currentPos+=8; + break; + } + case 59: { + decode59(val, valn, out, currentPos); + currentPos+=7; + break; + } + case 60: { + decode60(val, valn, out, currentPos); + currentPos+=6; + break; + } + case 61: { + decode61(val, valn, out, currentPos); + currentPos+=5; + break; + } + case 62: { + decode62(val, valn, out, currentPos); + currentPos+=4; + break; + } + case 63: { + decode63(val, valn, out, currentPos); + currentPos+=30; + break; + } + case 64: { + decode64(val, valn, out, currentPos); + currentPos+=16; + break; + } + case 65: { + decode65(val, valn, out, currentPos); + currentPos+=11; + break; + } + case 66: { + decode66(val, valn, out, currentPos); + currentPos+=9; + break; + } + case 67: { + decode67(val, valn, out, currentPos); + currentPos+=7; + break; + } + case 68: { + decode68(val, valn, out, currentPos); + currentPos+=6; + break; + } + case 69: { + decode69(val, valn, out, currentPos); + currentPos+=5; + break; + } + case 70: { + decode70(val, valn, out, currentPos); + currentPos+=4; + break; + } + case 71: { + decode71(val, valn, out, currentPos); + currentPos+=3; + break; + } + case 72: { + decode72(val, valn, out, currentPos); + currentPos+=29; + break; + } + case 73: { + decode73(val, valn, out, currentPos); + currentPos+=15; + break; + } + case 74: { + decode74(val, valn, out, currentPos); + currentPos+=10; + break; + } + case 75: { + decode75(val, valn, out, currentPos); + currentPos+=8; + break; + } + case 76: { + decode76(val, valn, out, currentPos); + currentPos+=6; + break; + } + case 77: { + decode77(val, valn, out, currentPos); + currentPos+=5; + break; + } + case 78: { + decode78(val, valn, out, currentPos); + currentPos+=4; + break; + } + case 79: { + decode79(val, valn, out, currentPos); + currentPos+=3; + break; + } + case 80: { + decode80(val, valn, out, currentPos); + currentPos+=2; + break; + } + default: + throw new RuntimeException("Wrong code: " + header); + }// end switch + } // end while + + while (currentPos < finalout) { + int val = in[tmpinpos++]; + int header = val >>> 28; + switch (header) { + case 0: { // number : 28, bitwidth : 1 + final int howmany = finalout - currentPos < 28 ? finalout - currentPos : 28; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (k + 4)) >>> 31; + } + break; + } + case 1: { // number : 14, bitwidth : 2 + final int howmany = finalout - currentPos < 14 ? finalout - currentPos : 14; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (2 * k + 4)) >>> 30; + } + break; + } + case 2: { // number : 9, bitwidth : 3 + final int howmany = finalout - currentPos < 9 ? finalout - currentPos : 9; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (3 * k + 5)) >>> 29; + } + break; + } + case 3: { // number : 7, bitwidth : 4 + final int howmany = finalout - currentPos < 7 ? finalout - currentPos : 7; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (4 * k + 4)) >>> 28; + } + break; + } + case 4: { // number : 5, bitwidth : 5 + final int howmany = finalout - currentPos < 5 ? finalout - currentPos : 5; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (5 * k + 7)) >>> 27; + } + break; + } + case 5: { // number : 4, bitwidth : 7 + final int howmany = finalout - currentPos < 4 ? finalout - currentPos : 4; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (7 * k + 4)) >>> 25; + } + break; + } + case 6: { // number : 3, bitwidth : 9 + final int howmany = finalout - currentPos < 3 ? finalout - currentPos : 3; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (9 * k + 5)) >>> 23; + } + break; + } + case 7: { // number : 2, bitwidth : 14 + final int howmany = finalout - currentPos < 2 ? finalout - currentPos : 2; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (14 * k + 4)) >>> 18; + } + break; + } + case 8: { // number : 1, bitwidth : 28 + out[currentPos++] = (val << 4) >>> 4; + break; + } + default: { + throw new RuntimeException("shouldn't happen"); + } + } + } + + outpos.set(finalout); + inpos.set(tmpinpos); + + } } \ No newline at end of file diff --git a/src/main/java/me/lemire/integercompression/S16.java b/src/main/java/me/lemire/integercompression/S16.java index 08ffbc4..e40522d 100644 --- a/src/main/java/me/lemire/integercompression/S16.java +++ b/src/main/java/me/lemire/integercompression/S16.java @@ -15,191 +15,191 @@ */ public final class S16 { - /** - * Compress an integer array using Simple16 - * - * - * @param in - * array to compress - * @param currentPos - * where to start reading - * @param inlength - * how many integers to read - * @param out - * output array - * @param tmpoutpos - * location in the output array - * @return the number of 32-bit words written (in compressed form) - */ - public static int compress(final int[] in, int currentPos, int inlength, final int out[], final int tmpoutpos) { - int outpos = tmpoutpos; - final int finalin = currentPos + inlength; - while (currentPos < finalin) { - int inoffset = compressblock(out, outpos++, in, currentPos, inlength); - if (inoffset == -1) - throw new RuntimeException("Too big a number"); - currentPos += inoffset; - inlength -= inoffset; - } - return outpos - tmpoutpos; - } - - /** - * Estimate size of the compressed output. - * - * @param in - * array to compress - * @param currentPos - * where to start reading - * @param inlength - * how many integers to read - * @return estimated size of the output (in 32-bit integers) - */ - public static int estimatecompress(final int[] in, int currentPos, int inlength) { - final int finalin = currentPos + inlength; - int counter = 0; - while (currentPos < finalin) { - int inoffset = fakecompressblock(in, currentPos, inlength); - if (inoffset == -1) - throw new RuntimeException("Too big a number"); - currentPos += inoffset; - inlength -= inoffset; - ++counter; - } - return counter; - } - - /** - * Compress an integer array using Simple16 - * - * @param out - * the compressed output - * @param outOffset - * the offset of the output in the number of integers - * @param in - * the integer input array - * @param inOffset - * the offset of the input in the number of integers - * @param n - * the number of elements to be compressed - * @return the size of the outputs in 32-bit integers - * - */ - public static final int compressblock(int[] out, int outOffset, int[] in, int inOffset, int n) { - int numIdx, j, num, bits; - for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { - out[outOffset] = numIdx << S16_BITSSIZE; - num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; - - for (j = 0, bits = 0; (j < num) && (in[inOffset + j] < SHIFTED_S16_BITS[numIdx][j]);) { - out[outOffset] |= (in[inOffset + j] << bits); - bits += S16_BITS[numIdx][j]; - j++; - } - - if (j == num) { - return num; - } - } - - return -1; - } - - private static final int fakecompressblock(int[] in, int inOffset, int n) { - int numIdx, j, num; - for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { - num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; - - for (j = 0; (j < num) && (in[inOffset + j] < SHIFTED_S16_BITS[numIdx][j]);) { - j++; - } - - if (j == num) { - return num; - } - } - - return -1; - } - - /** - * Decompress an integer array using Simple16 - * - * @param out - * the decompressed output - * @param outOffset - * the offset of the output in the number of integers - * @param in - * the compressed input array - * @param inOffset - * the offset of the input in the number of integers - * @param n - * the number of elements to be compressed - * @return the number of processed integers - */ - public static final int decompressblock(int[] out, int outOffset, int[] in, int inOffset, int n) { - int numIdx, j = 0, bits = 0; - numIdx = in[inOffset] >>> S16_BITSSIZE; - int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; - for (j = 0, bits = 0; j < num; j++) { - out[outOffset + j] = (in[inOffset] >>> bits) & (0xffffffff >>> (32 - S16_BITS[numIdx][j])); - bits += S16_BITS[numIdx][j]; - } - return num; - } - - /** - * Uncompressed data from an input array into an output array - * - * @param in - * input array (in compressed form) - * @param tmpinpos - * starting location in the compressed input array - * @param inlength - * how much data we wish the read (in 32-bit words) - * @param out - * output array (in decompressed form) - * @param currentPos - * current position in the output array - * @param outlength - * available data in the output array - */ - public static void uncompress(final int[] in, int tmpinpos, final int inlength, final int[] out, int currentPos, - int outlength) { - final int finalpos = tmpinpos + inlength; - while (tmpinpos < finalpos) { - final int howmany = decompressblock(out, currentPos, in, tmpinpos, outlength); - outlength -= howmany; - currentPos += howmany; - tmpinpos += 1; - } - - } - - private static int[][] shiftme(int[][] x) { - int[][] answer = new int[x.length][]; - for (int k = 0; k < x.length; ++k) { - answer[k] = new int[x[k].length]; - for (int z = 0; z < answer[k].length; ++z) - answer[k][z] = 1 << x[k][z]; - } - return answer; - } - - private static final int S16_NUMSIZE = 16; - private static final int S16_BITSSIZE = 28; - // the possible number of bits used to represent one integer - private static final int[] S16_NUM = { 28, 21, 21, 21, 14, 9, 8, 7, 6, 6, 5, 5, 4, 3, 2, 1 }; - // the corresponding number of elements for each value of the number of - // bits - private static final int[][] S16_BITS = { - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, - { 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, - { 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1 }, - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2 }, - { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, { 4, 3, 3, 3, 3, 3, 3, 3, 3 }, { 3, 4, 4, 4, 4, 3, 3, 3 }, - { 4, 4, 4, 4, 4, 4, 4 }, { 5, 5, 5, 5, 4, 4 }, { 4, 4, 5, 5, 5, 5 }, { 6, 6, 6, 5, 5 }, { 5, 5, 6, 6, 6 }, - { 7, 7, 7, 7 }, { 10, 9, 9, }, { 14, 14 }, { 28 } }; - private static final int[][] SHIFTED_S16_BITS = shiftme(S16_BITS); + /** + * Compress an integer array using Simple16 + * + * + * @param in + * array to compress + * @param currentPos + * where to start reading + * @param inlength + * how many integers to read + * @param out + * output array + * @param tmpoutpos + * location in the output array + * @return the number of 32-bit words written (in compressed form) + */ + public static int compress(final int[] in, int currentPos, int inlength, final int out[], final int tmpoutpos) { + int outpos = tmpoutpos; + final int finalin = currentPos + inlength; + while (currentPos < finalin) { + int inoffset = compressblock(out, outpos++, in, currentPos, inlength); + if (inoffset == -1) + throw new RuntimeException("Too big a number"); + currentPos += inoffset; + inlength -= inoffset; + } + return outpos - tmpoutpos; + } + + /** + * Estimate size of the compressed output. + * + * @param in + * array to compress + * @param currentPos + * where to start reading + * @param inlength + * how many integers to read + * @return estimated size of the output (in 32-bit integers) + */ + public static int estimatecompress(final int[] in, int currentPos, int inlength) { + final int finalin = currentPos + inlength; + int counter = 0; + while (currentPos < finalin) { + int inoffset = fakecompressblock(in, currentPos, inlength); + if (inoffset == -1) + throw new RuntimeException("Too big a number"); + currentPos += inoffset; + inlength -= inoffset; + ++counter; + } + return counter; + } + + /** + * Compress an integer array using Simple16 + * + * @param out + * the compressed output + * @param outOffset + * the offset of the output in the number of integers + * @param in + * the integer input array + * @param inOffset + * the offset of the input in the number of integers + * @param n + * the number of elements to be compressed + * @return the size of the outputs in 32-bit integers + * + */ + public static final int compressblock(int[] out, int outOffset, int[] in, int inOffset, int n) { + int numIdx, j, num, bits; + for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { + out[outOffset] = numIdx << S16_BITSSIZE; + num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; + + for (j = 0, bits = 0; (j < num) && (in[inOffset + j] < SHIFTED_S16_BITS[numIdx][j]);) { + out[outOffset] |= (in[inOffset + j] << bits); + bits += S16_BITS[numIdx][j]; + j++; + } + + if (j == num) { + return num; + } + } + + return -1; + } + + private static final int fakecompressblock(int[] in, int inOffset, int n) { + int numIdx, j, num; + for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { + num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; + + for (j = 0; (j < num) && (in[inOffset + j] < SHIFTED_S16_BITS[numIdx][j]);) { + j++; + } + + if (j == num) { + return num; + } + } + + return -1; + } + + /** + * Decompress an integer array using Simple16 + * + * @param out + * the decompressed output + * @param outOffset + * the offset of the output in the number of integers + * @param in + * the compressed input array + * @param inOffset + * the offset of the input in the number of integers + * @param n + * the number of elements to be compressed + * @return the number of processed integers + */ + public static final int decompressblock(int[] out, int outOffset, int[] in, int inOffset, int n) { + int numIdx, j = 0, bits = 0; + numIdx = in[inOffset] >>> S16_BITSSIZE; + int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; + for (j = 0, bits = 0; j < num; j++) { + out[outOffset + j] = (in[inOffset] >>> bits) & (0xffffffff >>> (32 - S16_BITS[numIdx][j])); + bits += S16_BITS[numIdx][j]; + } + return num; + } + + /** + * Uncompressed data from an input array into an output array + * + * @param in + * input array (in compressed form) + * @param tmpinpos + * starting location in the compressed input array + * @param inlength + * how much data we wish the read (in 32-bit words) + * @param out + * output array (in decompressed form) + * @param currentPos + * current position in the output array + * @param outlength + * available data in the output array + */ + public static void uncompress(final int[] in, int tmpinpos, final int inlength, final int[] out, int currentPos, + int outlength) { + final int finalpos = tmpinpos + inlength; + while (tmpinpos < finalpos) { + final int howmany = decompressblock(out, currentPos, in, tmpinpos, outlength); + outlength -= howmany; + currentPos += howmany; + tmpinpos += 1; + } + + } + + private static int[][] shiftme(int[][] x) { + int[][] answer = new int[x.length][]; + for (int k = 0; k < x.length; ++k) { + answer[k] = new int[x[k].length]; + for (int z = 0; z < answer[k].length; ++z) + answer[k][z] = 1 << x[k][z]; + } + return answer; + } + + private static final int S16_NUMSIZE = 16; + private static final int S16_BITSSIZE = 28; + // the possible number of bits used to represent one integer + private static final int[] S16_NUM = { 28, 21, 21, 21, 14, 9, 8, 7, 6, 6, 5, 5, 4, 3, 2, 1 }; + // the corresponding number of elements for each value of the number of + // bits + private static final int[][] S16_BITS = { + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2 }, + { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, { 4, 3, 3, 3, 3, 3, 3, 3, 3 }, { 3, 4, 4, 4, 4, 3, 3, 3 }, + { 4, 4, 4, 4, 4, 4, 4 }, { 5, 5, 5, 5, 4, 4 }, { 4, 4, 5, 5, 5, 5 }, { 6, 6, 6, 5, 5 }, { 5, 5, 6, 6, 6 }, + { 7, 7, 7, 7 }, { 10, 9, 9, }, { 14, 14 }, { 28 } }; + private static final int[][] SHIFTED_S16_BITS = shiftme(S16_BITS); } diff --git a/src/main/java/me/lemire/integercompression/S9.java b/src/main/java/me/lemire/integercompression/S9.java index 2180e5a..7e03e42 100644 --- a/src/main/java/me/lemire/integercompression/S9.java +++ b/src/main/java/me/lemire/integercompression/S9.java @@ -17,187 +17,187 @@ public final class S9 { - /** - * Estimate size of the compressed output. - * - * @param in - * array to compress - * @param currentPos - * where to start reading - * @param inlength - * how many integers to read - * @return estimated size of the output (in 32-bit integers) - */ - public static int estimatecompress(int[] in, int currentPos, int inlength) { - int tmpoutpos = 0; - int finalpos = currentPos + inlength; - outer: while (currentPos < finalpos) { - mainloop: for (int selector = 0; selector < 8; selector++) { + /** + * Estimate size of the compressed output. + * + * @param in + * array to compress + * @param currentPos + * where to start reading + * @param inlength + * how many integers to read + * @return estimated size of the output (in 32-bit integers) + */ + public static int estimatecompress(int[] in, int currentPos, int inlength) { + int tmpoutpos = 0; + int finalpos = currentPos + inlength; + outer: while (currentPos < finalpos) { + mainloop: for (int selector = 0; selector < 8; selector++) { - int compressedNum = codeNum[selector]; - if (finalpos <= currentPos + compressedNum - 1) - compressedNum = finalpos - currentPos; - int b = bitLength[selector]; - int max = 1 << b; - int i = 0; - for (; i < compressedNum; i++) - if (Util.smallerorequalthan(max , in[currentPos + i])) - continue mainloop; - currentPos += compressedNum; - ++tmpoutpos; - continue outer; - } - final int selector = 8; - if (in[currentPos] >= 1 << bitLength[selector]) - throw new RuntimeException("Too big a number"); - tmpoutpos++; - currentPos++; + int compressedNum = codeNum[selector]; + if (finalpos <= currentPos + compressedNum - 1) + compressedNum = finalpos - currentPos; + int b = bitLength[selector]; + int max = 1 << b; + int i = 0; + for (; i < compressedNum; i++) + if (Util.smallerorequalthan(max , in[currentPos + i])) + continue mainloop; + currentPos += compressedNum; + ++tmpoutpos; + continue outer; + } + final int selector = 8; + if (in[currentPos] >= 1 << bitLength[selector]) + throw new RuntimeException("Too big a number"); + tmpoutpos++; + currentPos++; - } - return tmpoutpos; - } + } + return tmpoutpos; + } - /** - * Compress an integer array using Simple9 - * - * - * @param in - * array to compress - * @param currentPos - * where to start reading - * @param inlength - * how many integers to read - * @param out - * output array - * @param tmpoutpos - * location in the output array - * @return the number of 32-bit words written (in compressed form) - */ - public static int compress(int[] in, int currentPos, int inlength, int out[], int tmpoutpos) { - int origtmpoutpos = tmpoutpos; - int finalpos = currentPos + inlength; - outer: while (currentPos < finalpos) { - mainloop: for (int selector = 0; selector < 8; selector++) { - int res = 0; - int compressedNum = codeNum[selector]; - if (finalpos <= currentPos + compressedNum - 1) - compressedNum = finalpos - currentPos; - int b = bitLength[selector]; - int max = 1 << b; - int i = 0; - for (; i < compressedNum; i++) { - if (Util.smallerorequalthan(max, in[currentPos + i])) - continue mainloop; - res = (res << b) + in[currentPos + i]; - } - if (compressedNum != codeNum[selector]) - res <<= (codeNum[selector] - compressedNum) * b; - res |= selector << 28; - out[tmpoutpos++] = res; - currentPos += compressedNum; - continue outer; - } - final int selector = 8; - if (in[currentPos] >= 1 << bitLength[selector]) - throw new RuntimeException("Too big a number"); - out[tmpoutpos++] = in[currentPos++] | (selector << 28); - } - return tmpoutpos - origtmpoutpos; - } + /** + * Compress an integer array using Simple9 + * + * + * @param in + * array to compress + * @param currentPos + * where to start reading + * @param inlength + * how many integers to read + * @param out + * output array + * @param tmpoutpos + * location in the output array + * @return the number of 32-bit words written (in compressed form) + */ + public static int compress(int[] in, int currentPos, int inlength, int out[], int tmpoutpos) { + int origtmpoutpos = tmpoutpos; + int finalpos = currentPos + inlength; + outer: while (currentPos < finalpos) { + mainloop: for (int selector = 0; selector < 8; selector++) { + int res = 0; + int compressedNum = codeNum[selector]; + if (finalpos <= currentPos + compressedNum - 1) + compressedNum = finalpos - currentPos; + int b = bitLength[selector]; + int max = 1 << b; + int i = 0; + for (; i < compressedNum; i++) { + if (Util.smallerorequalthan(max, in[currentPos + i])) + continue mainloop; + res = (res << b) + in[currentPos + i]; + } + if (compressedNum != codeNum[selector]) + res <<= (codeNum[selector] - compressedNum) * b; + res |= selector << 28; + out[tmpoutpos++] = res; + currentPos += compressedNum; + continue outer; + } + final int selector = 8; + if (in[currentPos] >= 1 << bitLength[selector]) + throw new RuntimeException("Too big a number"); + out[tmpoutpos++] = in[currentPos++] | (selector << 28); + } + return tmpoutpos - origtmpoutpos; + } - /** - * Uncompressed data from an input array into an output array - * - * @param in - * input array (in compressed form) - * @param tmpinpos - * starting location in the compressed input array - * @param inlength - * how much data we wish the read (in 32-bit words) - * @param out - * output array (in decompressed form) - * @param currentPos - * current position in the output array - * @param outlength - * available data in the output array - */ - public static void uncompress(int[] in, int tmpinpos, int inlength, int[] out, int currentPos, int outlength) { - int finallength = currentPos + outlength; + /** + * Uncompressed data from an input array into an output array + * + * @param in + * input array (in compressed form) + * @param tmpinpos + * starting location in the compressed input array + * @param inlength + * how much data we wish the read (in 32-bit words) + * @param out + * output array (in decompressed form) + * @param currentPos + * current position in the output array + * @param outlength + * available data in the output array + */ + public static void uncompress(int[] in, int tmpinpos, int inlength, int[] out, int currentPos, int outlength) { + int finallength = currentPos + outlength; - while (currentPos < finallength) { - int val = in[tmpinpos++]; - int header = val >>> 28; - switch (header) { - case 0: { // number : 28, bitwidth : 1 - final int howmany = finallength - currentPos < 28 ? finallength - currentPos : 28; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (k + 4)) >>> 31; - } - break; - } - case 1: { // number : 14, bitwidth : 2 - final int howmany = finallength - currentPos < 14 ? finallength - currentPos : 14; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (2 * k + 4)) >>> 30; - } - break; - } - case 2: { // number : 9, bitwidth : 3 - final int howmany = finallength - currentPos < 9 ? finallength - currentPos : 9; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (3 * k + 5)) >>> 29; - } - break; - } - case 3: { // number : 7, bitwidth : 4 - final int howmany = finallength - currentPos < 7 ? finallength - currentPos : 7; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (4 * k + 4)) >>> 28; - } - break; - } - case 4: { // number : 5, bitwidth : 5 - final int howmany = finallength - currentPos < 5 ? finallength - currentPos : 5; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (5 * k + 7)) >>> 27; - } - break; - } - case 5: { // number : 4, bitwidth : 7 - final int howmany = finallength - currentPos < 4 ? finallength - currentPos : 4; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (7 * k + 4)) >>> 25; - } - break; - } - case 6: { // number : 3, bitwidth : 9 - final int howmany = finallength - currentPos < 3 ? finallength - currentPos : 3; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (9 * k + 5)) >>> 23; - } - break; - } - case 7: { // number : 2, bitwidth : 14 - final int howmany = finallength - currentPos < 2 ? finallength - currentPos : 2; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (14 * k + 4)) >>> 18; - } - break; - } - case 8: { // number : 1, bitwidth : 28 - out[currentPos++] = (val << 4) >>> 4; - break; - } - default: { - throw new RuntimeException("shouldn't happen"); - } - } - } + while (currentPos < finallength) { + int val = in[tmpinpos++]; + int header = val >>> 28; + switch (header) { + case 0: { // number : 28, bitwidth : 1 + final int howmany = finallength - currentPos < 28 ? finallength - currentPos : 28; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (k + 4)) >>> 31; + } + break; + } + case 1: { // number : 14, bitwidth : 2 + final int howmany = finallength - currentPos < 14 ? finallength - currentPos : 14; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (2 * k + 4)) >>> 30; + } + break; + } + case 2: { // number : 9, bitwidth : 3 + final int howmany = finallength - currentPos < 9 ? finallength - currentPos : 9; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (3 * k + 5)) >>> 29; + } + break; + } + case 3: { // number : 7, bitwidth : 4 + final int howmany = finallength - currentPos < 7 ? finallength - currentPos : 7; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (4 * k + 4)) >>> 28; + } + break; + } + case 4: { // number : 5, bitwidth : 5 + final int howmany = finallength - currentPos < 5 ? finallength - currentPos : 5; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (5 * k + 7)) >>> 27; + } + break; + } + case 5: { // number : 4, bitwidth : 7 + final int howmany = finallength - currentPos < 4 ? finallength - currentPos : 4; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (7 * k + 4)) >>> 25; + } + break; + } + case 6: { // number : 3, bitwidth : 9 + final int howmany = finallength - currentPos < 3 ? finallength - currentPos : 3; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (9 * k + 5)) >>> 23; + } + break; + } + case 7: { // number : 2, bitwidth : 14 + final int howmany = finallength - currentPos < 2 ? finallength - currentPos : 2; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (14 * k + 4)) >>> 18; + } + break; + } + case 8: { // number : 1, bitwidth : 28 + out[currentPos++] = (val << 4) >>> 4; + break; + } + default: { + throw new RuntimeException("shouldn't happen"); + } + } + } - } + } - private final static int bitLength[] = { 1, 2, 3, 4, 5, 7, 9, 14, 28 }; + private final static int bitLength[] = { 1, 2, 3, 4, 5, 7, 9, 14, 28 }; - private final static int codeNum[] = { 28, 14, 9, 7, 5, 4, 3, 2, 1 }; + private final static int codeNum[] = { 28, 14, 9, 7, 5, 4, 3, 2, 1 }; } diff --git a/src/main/java/me/lemire/integercompression/Simple16.java b/src/main/java/me/lemire/integercompression/Simple16.java index e0f9d5a..cdc7308 100644 --- a/src/main/java/me/lemire/integercompression/Simple16.java +++ b/src/main/java/me/lemire/integercompression/Simple16.java @@ -13,173 +13,173 @@ */ public final class Simple16 implements IntegerCODEC, SkippableIntegerCODEC { - public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int out[], IntWrapper outpos) { - int i_inpos = inpos.get(); - int i_outpos = outpos.get(); - final int finalin = i_inpos + inlength; - while (i_inpos < finalin) { - int inoffset = compressblock(out, i_outpos++, in, i_inpos, inlength); - if (inoffset == -1) - throw new RuntimeException("Too big a number"); - i_inpos += inoffset; - inlength -= inoffset; - } - inpos.set(i_inpos); - outpos.set(i_outpos); - } - - /** - * Compress an integer array using Simple16 - * - * @param out - * the compressed output - * @param outOffset - * the offset of the output in the number of integers - * @param in - * the integer input array - * @param inOffset - * the offset of the input in the number of integers - * @param n - * the number of elements to be compressed - * @return the number of compressed integers - */ - public static final int compressblock(int[] out, int outOffset, int[] in, int inOffset, int n) { - int numIdx, j, num, bits; - for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { - out[outOffset] = numIdx << S16_BITSSIZE; - num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; - - for (j = 0, bits = 0; (j < num) && (in[inOffset + j] < SHIFTED_S16_BITS[numIdx][j]);) { - out[outOffset] |= (in[inOffset + j] << bits); - bits += S16_BITS[numIdx][j]; - j++; - } - - if (j == num) { - return num; - } - } - - return -1; - } - - /** - * Decompress an integer array using Simple16 - * - * @param out - * the decompressed output - * @param outOffset - * the offset of the output in the number of integers - * @param in - * the compressed input array - * @param inOffset - * the offset of the input in the number of integers - * @param n - * the number of elements to be compressed - * @return the number of processed integers - */ - public static final int decompressblock(int[] out, int outOffset, int[] in, int inOffset, int n) { - int numIdx, j = 0, bits = 0; - numIdx = in[inOffset] >>> S16_BITSSIZE; - int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; - for (j = 0, bits = 0; j < num; j++) { - out[outOffset + j] = (in[inOffset] >>> bits) & (0xffffffff >>> (32 - S16_BITS[numIdx][j])); - bits += S16_BITS[numIdx][j]; - } - return num; - } - - @Override - public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num) { - int i_inpos = inpos.get(); - int i_outpos = outpos.get(); - while (num > 0) { - final int howmany = decompressblock(out, i_outpos, in, i_inpos, num); - num -= howmany; - i_outpos += howmany; - i_inpos++; - } - inpos.set(i_inpos); - outpos.set(i_outpos); - } - - /** - * Uncompress data from an array to another array. - * - * Both inpos and outpos parameters are modified to indicate new positions - * after read/write. - * - * @param in - * array containing data in compressed form - * @param tmpinpos - * where to start reading in the array - * @param inlength - * length of the compressed data (ignored by some schemes) - * @param out - * array where to write the compressed output - * @param currentPos - * where to write the compressed output in out - * @param outlength - * number of integers we want to decode - */ - public static void uncompress(int[] in, int tmpinpos, int inlength, int[] out, int currentPos, int outlength) { - final int finalpos = tmpinpos + inlength; - while (tmpinpos < finalpos) { - final int howmany = decompressblock(out, currentPos, in, tmpinpos, outlength); - outlength -= howmany; - currentPos += howmany; - tmpinpos += 1; - } - - } - - private static int[][] shiftme(int[][] x) { - int[][] answer = new int[x.length][]; - for (int k = 0; k < x.length; ++k) { - answer[k] = new int[x[k].length]; - for (int z = 0; z < answer[k].length; ++z) - answer[k][z] = 1 << x[k][z]; - } - return answer; - } - - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - if (inlength == 0) - return; - out[outpos.get()] = inlength; - outpos.increment(); - headlessCompress(in, inpos, inlength, out, outpos); - } - - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - if (inlength == 0) - return; - final int outlength = in[inpos.get()]; - inpos.increment(); - headlessUncompress(in, inpos, inlength, out, outpos, outlength); - - } - - @Override - public String toString() { - return this.getClass().getSimpleName(); - } - - private static final int S16_NUMSIZE = 16; - private static final int S16_BITSSIZE = 28; - // the possible number of bits used to represent one integer - private static final int[] S16_NUM = { 28, 21, 21, 21, 14, 9, 8, 7, 6, 6, 5, 5, 4, 3, 2, 1 }; - // the corresponding number of elements for each value of the number of bits - private static final int[][] S16_BITS = { - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, - { 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, - { 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1 }, - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2 }, - { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, { 4, 3, 3, 3, 3, 3, 3, 3, 3 }, { 3, 4, 4, 4, 4, 3, 3, 3 }, - { 4, 4, 4, 4, 4, 4, 4 }, { 5, 5, 5, 5, 4, 4 }, { 4, 4, 5, 5, 5, 5 }, { 6, 6, 6, 5, 5 }, { 5, 5, 6, 6, 6 }, - { 7, 7, 7, 7 }, { 10, 9, 9, }, { 14, 14 }, { 28 } }; - private static final int[][] SHIFTED_S16_BITS = shiftme(S16_BITS); + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int out[], IntWrapper outpos) { + int i_inpos = inpos.get(); + int i_outpos = outpos.get(); + final int finalin = i_inpos + inlength; + while (i_inpos < finalin) { + int inoffset = compressblock(out, i_outpos++, in, i_inpos, inlength); + if (inoffset == -1) + throw new RuntimeException("Too big a number"); + i_inpos += inoffset; + inlength -= inoffset; + } + inpos.set(i_inpos); + outpos.set(i_outpos); + } + + /** + * Compress an integer array using Simple16 + * + * @param out + * the compressed output + * @param outOffset + * the offset of the output in the number of integers + * @param in + * the integer input array + * @param inOffset + * the offset of the input in the number of integers + * @param n + * the number of elements to be compressed + * @return the number of compressed integers + */ + public static final int compressblock(int[] out, int outOffset, int[] in, int inOffset, int n) { + int numIdx, j, num, bits; + for (numIdx = 0; numIdx < S16_NUMSIZE; numIdx++) { + out[outOffset] = numIdx << S16_BITSSIZE; + num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n; + + for (j = 0, bits = 0; (j < num) && (in[inOffset + j] < SHIFTED_S16_BITS[numIdx][j]);) { + out[outOffset] |= (in[inOffset + j] << bits); + bits += S16_BITS[numIdx][j]; + j++; + } + + if (j == num) { + return num; + } + } + + return -1; + } + + /** + * Decompress an integer array using Simple16 + * + * @param out + * the decompressed output + * @param outOffset + * the offset of the output in the number of integers + * @param in + * the compressed input array + * @param inOffset + * the offset of the input in the number of integers + * @param n + * the number of elements to be compressed + * @return the number of processed integers + */ + public static final int decompressblock(int[] out, int outOffset, int[] in, int inOffset, int n) { + int numIdx, j = 0, bits = 0; + numIdx = in[inOffset] >>> S16_BITSSIZE; + int num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n; + for (j = 0, bits = 0; j < num; j++) { + out[outOffset + j] = (in[inOffset] >>> bits) & (0xffffffff >>> (32 - S16_BITS[numIdx][j])); + bits += S16_BITS[numIdx][j]; + } + return num; + } + + @Override + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num) { + int i_inpos = inpos.get(); + int i_outpos = outpos.get(); + while (num > 0) { + final int howmany = decompressblock(out, i_outpos, in, i_inpos, num); + num -= howmany; + i_outpos += howmany; + i_inpos++; + } + inpos.set(i_inpos); + outpos.set(i_outpos); + } + + /** + * Uncompress data from an array to another array. + * + * Both inpos and outpos parameters are modified to indicate new positions + * after read/write. + * + * @param in + * array containing data in compressed form + * @param tmpinpos + * where to start reading in the array + * @param inlength + * length of the compressed data (ignored by some schemes) + * @param out + * array where to write the compressed output + * @param currentPos + * where to write the compressed output in out + * @param outlength + * number of integers we want to decode + */ + public static void uncompress(int[] in, int tmpinpos, int inlength, int[] out, int currentPos, int outlength) { + final int finalpos = tmpinpos + inlength; + while (tmpinpos < finalpos) { + final int howmany = decompressblock(out, currentPos, in, tmpinpos, outlength); + outlength -= howmany; + currentPos += howmany; + tmpinpos += 1; + } + + } + + private static int[][] shiftme(int[][] x) { + int[][] answer = new int[x.length][]; + for (int k = 0; k < x.length; ++k) { + answer[k] = new int[x[k].length]; + for (int z = 0; z < answer[k].length; ++z) + answer[k][z] = 1 << x[k][z]; + } + return answer; + } + + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + if (inlength == 0) + return; + out[outpos.get()] = inlength; + outpos.increment(); + headlessCompress(in, inpos, inlength, out, outpos); + } + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + if (inlength == 0) + return; + final int outlength = in[inpos.get()]; + inpos.increment(); + headlessUncompress(in, inpos, inlength, out, outpos, outlength); + + } + + @Override + public String toString() { + return this.getClass().getSimpleName(); + } + + private static final int S16_NUMSIZE = 16; + private static final int S16_BITSSIZE = 28; + // the possible number of bits used to represent one integer + private static final int[] S16_NUM = { 28, 21, 21, 21, 14, 9, 8, 7, 6, 6, 5, 5, 4, 3, 2, 1 }; + // the corresponding number of elements for each value of the number of bits + private static final int[][] S16_BITS = { + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2 }, + { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, { 4, 3, 3, 3, 3, 3, 3, 3, 3 }, { 3, 4, 4, 4, 4, 3, 3, 3 }, + { 4, 4, 4, 4, 4, 4, 4 }, { 5, 5, 5, 5, 4, 4 }, { 4, 4, 5, 5, 5, 5 }, { 6, 6, 6, 5, 5 }, { 5, 5, 6, 6, 6 }, + { 7, 7, 7, 7 }, { 10, 9, 9, }, { 14, 14 }, { 28 } }; + private static final int[][] SHIFTED_S16_BITS = shiftme(S16_BITS); } \ No newline at end of file diff --git a/src/main/java/me/lemire/integercompression/Simple9.java b/src/main/java/me/lemire/integercompression/Simple9.java index 032489d..4864756 100644 --- a/src/main/java/me/lemire/integercompression/Simple9.java +++ b/src/main/java/me/lemire/integercompression/Simple9.java @@ -20,280 +20,280 @@ public final class Simple9 implements IntegerCODEC, SkippableIntegerCODEC { - @Override - public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int out[], IntWrapper outpos) { - int tmpoutpos = outpos.get(); - int currentPos = inpos.get(); - final int finalin = currentPos + inlength; - outer: while (currentPos < finalin - 28) { - mainloop: for (int selector = 0; selector < 8; selector++) { + @Override + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int out[], IntWrapper outpos) { + int tmpoutpos = outpos.get(); + int currentPos = inpos.get(); + final int finalin = currentPos + inlength; + outer: while (currentPos < finalin - 28) { + mainloop: for (int selector = 0; selector < 8; selector++) { - int res = 0; - int compressedNum = codeNum[selector]; - int b = bitLength[selector]; - int max = 1 << b; - int i = 0; - for (; i < compressedNum; i++) { - if (max <= in[currentPos + i]) - continue mainloop; - res = (res << b) + in[currentPos + i]; - } - res |= selector << 28; - out[tmpoutpos++] = res; - currentPos += compressedNum; - continue outer; - } - final int selector = 8; - if (in[currentPos] >= 1 << bitLength[selector]) - throw new RuntimeException("Too big a number"); - out[tmpoutpos++] = in[currentPos++] | (selector << 28); - } - outer: while (currentPos < finalin) { - mainloop: for (int selector = 0; selector < 8; selector++) { - int res = 0; - int compressedNum = codeNum[selector]; - if (finalin <= currentPos + compressedNum - 1) - compressedNum = finalin - currentPos; - int b = bitLength[selector]; - int max = 1 << b; - int i = 0; - for (; i < compressedNum; i++) { - if (max <= in[currentPos + i]) - continue mainloop; - res = (res << b) + in[currentPos + i]; - } + int res = 0; + int compressedNum = codeNum[selector]; + int b = bitLength[selector]; + int max = 1 << b; + int i = 0; + for (; i < compressedNum; i++) { + if (max <= in[currentPos + i]) + continue mainloop; + res = (res << b) + in[currentPos + i]; + } + res |= selector << 28; + out[tmpoutpos++] = res; + currentPos += compressedNum; + continue outer; + } + final int selector = 8; + if (in[currentPos] >= 1 << bitLength[selector]) + throw new RuntimeException("Too big a number"); + out[tmpoutpos++] = in[currentPos++] | (selector << 28); + } + outer: while (currentPos < finalin) { + mainloop: for (int selector = 0; selector < 8; selector++) { + int res = 0; + int compressedNum = codeNum[selector]; + if (finalin <= currentPos + compressedNum - 1) + compressedNum = finalin - currentPos; + int b = bitLength[selector]; + int max = 1 << b; + int i = 0; + for (; i < compressedNum; i++) { + if (max <= in[currentPos + i]) + continue mainloop; + res = (res << b) + in[currentPos + i]; + } - if (compressedNum != codeNum[selector]) - res <<= (codeNum[selector] - compressedNum) * b; - res |= selector << 28; - out[tmpoutpos++] = res; - currentPos += compressedNum; - continue outer; - } - final int selector = 8; - if (in[currentPos] >= 1 << bitLength[selector]) - throw new RuntimeException("Too big a number"); - out[tmpoutpos++] = in[currentPos++] | (selector << 28); - } - inpos.set(currentPos); - outpos.set(tmpoutpos); - } + if (compressedNum != codeNum[selector]) + res <<= (codeNum[selector] - compressedNum) * b; + res |= selector << 28; + out[tmpoutpos++] = res; + currentPos += compressedNum; + continue outer; + } + final int selector = 8; + if (in[currentPos] >= 1 << bitLength[selector]) + throw new RuntimeException("Too big a number"); + out[tmpoutpos++] = in[currentPos++] | (selector << 28); + } + inpos.set(currentPos); + outpos.set(tmpoutpos); + } - @Override - public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, - int outlength) { - int currentPos = outpos.get(); - int tmpinpos = inpos.get(); - final int finalout = currentPos + outlength; - while (currentPos < finalout - 28) { - int val = in[tmpinpos++]; - int header = val >>> 28; - switch (header) { - case 0: { // number : 28, bitwidth : 1 - out[currentPos++] = (val << 4) >>> 31; - out[currentPos++] = (val << 5) >>> 31; - out[currentPos++] = (val << 6) >>> 31; - out[currentPos++] = (val << 7) >>> 31; - out[currentPos++] = (val << 8) >>> 31; - out[currentPos++] = (val << 9) >>> 31; - out[currentPos++] = (val << 10) >>> 31; - out[currentPos++] = (val << 11) >>> 31; - out[currentPos++] = (val << 12) >>> 31; - out[currentPos++] = (val << 13) >>> 31; // 10 - out[currentPos++] = (val << 14) >>> 31; - out[currentPos++] = (val << 15) >>> 31; - out[currentPos++] = (val << 16) >>> 31; - out[currentPos++] = (val << 17) >>> 31; - out[currentPos++] = (val << 18) >>> 31; - out[currentPos++] = (val << 19) >>> 31; - out[currentPos++] = (val << 20) >>> 31; - out[currentPos++] = (val << 21) >>> 31; - out[currentPos++] = (val << 22) >>> 31; - out[currentPos++] = (val << 23) >>> 31; // 20 - out[currentPos++] = (val << 24) >>> 31; - out[currentPos++] = (val << 25) >>> 31; - out[currentPos++] = (val << 26) >>> 31; - out[currentPos++] = (val << 27) >>> 31; - out[currentPos++] = (val << 28) >>> 31; - out[currentPos++] = (val << 29) >>> 31; - out[currentPos++] = (val << 30) >>> 31; - out[currentPos++] = (val << 31) >>> 31; - break; - } - case 1: { // number : 14, bitwidth : 2 - out[currentPos++] = (val << 4) >>> 30; - out[currentPos++] = (val << 6) >>> 30; - out[currentPos++] = (val << 8) >>> 30; - out[currentPos++] = (val << 10) >>> 30; - out[currentPos++] = (val << 12) >>> 30; - out[currentPos++] = (val << 14) >>> 30; - out[currentPos++] = (val << 16) >>> 30; - out[currentPos++] = (val << 18) >>> 30; - out[currentPos++] = (val << 20) >>> 30; - out[currentPos++] = (val << 22) >>> 30; // 10 - out[currentPos++] = (val << 24) >>> 30; - out[currentPos++] = (val << 26) >>> 30; - out[currentPos++] = (val << 28) >>> 30; - out[currentPos++] = (val << 30) >>> 30; - break; - } - case 2: { // number : 9, bitwidth : 3 - out[currentPos++] = (val << 5) >>> 29; - out[currentPos++] = (val << 8) >>> 29; - out[currentPos++] = (val << 11) >>> 29; - out[currentPos++] = (val << 14) >>> 29; - out[currentPos++] = (val << 17) >>> 29; - out[currentPos++] = (val << 20) >>> 29; - out[currentPos++] = (val << 23) >>> 29; - out[currentPos++] = (val << 26) >>> 29; - out[currentPos++] = (val << 29) >>> 29; - break; - } - case 3: { // number : 7, bitwidth : 4 - out[currentPos++] = (val << 4) >>> 28; - out[currentPos++] = (val << 8) >>> 28; - out[currentPos++] = (val << 12) >>> 28; - out[currentPos++] = (val << 16) >>> 28; - out[currentPos++] = (val << 20) >>> 28; - out[currentPos++] = (val << 24) >>> 28; - out[currentPos++] = (val << 28) >>> 28; - break; - } - case 4: { // number : 5, bitwidth : 5 - out[currentPos++] = (val << 7) >>> 27; - out[currentPos++] = (val << 12) >>> 27; - out[currentPos++] = (val << 17) >>> 27; - out[currentPos++] = (val << 22) >>> 27; - out[currentPos++] = (val << 27) >>> 27; - break; - } - case 5: { // number : 4, bitwidth : 7 - out[currentPos++] = (val << 4) >>> 25; - out[currentPos++] = (val << 11) >>> 25; - out[currentPos++] = (val << 18) >>> 25; - out[currentPos++] = (val << 25) >>> 25; - break; - } - case 6: { // number : 3, bitwidth : 9 - out[currentPos++] = (val << 5) >>> 23; - out[currentPos++] = (val << 14) >>> 23; - out[currentPos++] = (val << 23) >>> 23; - break; - } - case 7: { // number : 2, bitwidth : 14 - out[currentPos++] = (val << 4) >>> 18; - out[currentPos++] = (val << 18) >>> 18; - break; - } - case 8: { // number : 1, bitwidth : 28 - out[currentPos++] = (val << 4) >>> 4; - break; - } - default: { - throw new RuntimeException("shouldn't happen: limited to 28-bit integers"); - } - } - } - while (currentPos < finalout) { - int val = in[tmpinpos++]; - int header = val >>> 28; - switch (header) { - case 0: { // number : 28, bitwidth : 1 - final int howmany = finalout - currentPos; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (k + 4)) >>> 31; - } - break; - } - case 1: { // number : 14, bitwidth : 2 - final int howmany = finalout - currentPos < 14 ? finalout - currentPos : 14; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (2 * k + 4)) >>> 30; - } - break; - } - case 2: { // number : 9, bitwidth : 3 - final int howmany = finalout - currentPos < 9 ? finalout - currentPos : 9; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (3 * k + 5)) >>> 29; - } - break; - } - case 3: { // number : 7, bitwidth : 4 - final int howmany = finalout - currentPos < 7 ? finalout - currentPos : 7; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (4 * k + 4)) >>> 28; - } - break; - } - case 4: { // number : 5, bitwidth : 5 - final int howmany = finalout - currentPos < 5 ? finalout - currentPos : 5; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (5 * k + 7)) >>> 27; - } - break; - } - case 5: { // number : 4, bitwidth : 7 - final int howmany = finalout - currentPos < 4 ? finalout - currentPos : 4; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (7 * k + 4)) >>> 25; - } - break; - } - case 6: { // number : 3, bitwidth : 9 - final int howmany = finalout - currentPos < 3 ? finalout - currentPos : 3; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (9 * k + 5)) >>> 23; - } - break; - } - case 7: { // number : 2, bitwidth : 14 - final int howmany = finalout - currentPos < 2 ? finalout - currentPos : 2; - for (int k = 0; k < howmany; ++k) { - out[currentPos++] = (val << (14 * k + 4)) >>> 18; - } - break; - } - case 8: { // number : 1, bitwidth : 28 - out[currentPos++] = (val << 4) >>> 4; - break; - } - default: { - throw new RuntimeException("shouldn't happen"); - } - } - } - outpos.set(currentPos); - inpos.set(tmpinpos); + @Override + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, + int outlength) { + int currentPos = outpos.get(); + int tmpinpos = inpos.get(); + final int finalout = currentPos + outlength; + while (currentPos < finalout - 28) { + int val = in[tmpinpos++]; + int header = val >>> 28; + switch (header) { + case 0: { // number : 28, bitwidth : 1 + out[currentPos++] = (val << 4) >>> 31; + out[currentPos++] = (val << 5) >>> 31; + out[currentPos++] = (val << 6) >>> 31; + out[currentPos++] = (val << 7) >>> 31; + out[currentPos++] = (val << 8) >>> 31; + out[currentPos++] = (val << 9) >>> 31; + out[currentPos++] = (val << 10) >>> 31; + out[currentPos++] = (val << 11) >>> 31; + out[currentPos++] = (val << 12) >>> 31; + out[currentPos++] = (val << 13) >>> 31; // 10 + out[currentPos++] = (val << 14) >>> 31; + out[currentPos++] = (val << 15) >>> 31; + out[currentPos++] = (val << 16) >>> 31; + out[currentPos++] = (val << 17) >>> 31; + out[currentPos++] = (val << 18) >>> 31; + out[currentPos++] = (val << 19) >>> 31; + out[currentPos++] = (val << 20) >>> 31; + out[currentPos++] = (val << 21) >>> 31; + out[currentPos++] = (val << 22) >>> 31; + out[currentPos++] = (val << 23) >>> 31; // 20 + out[currentPos++] = (val << 24) >>> 31; + out[currentPos++] = (val << 25) >>> 31; + out[currentPos++] = (val << 26) >>> 31; + out[currentPos++] = (val << 27) >>> 31; + out[currentPos++] = (val << 28) >>> 31; + out[currentPos++] = (val << 29) >>> 31; + out[currentPos++] = (val << 30) >>> 31; + out[currentPos++] = (val << 31) >>> 31; + break; + } + case 1: { // number : 14, bitwidth : 2 + out[currentPos++] = (val << 4) >>> 30; + out[currentPos++] = (val << 6) >>> 30; + out[currentPos++] = (val << 8) >>> 30; + out[currentPos++] = (val << 10) >>> 30; + out[currentPos++] = (val << 12) >>> 30; + out[currentPos++] = (val << 14) >>> 30; + out[currentPos++] = (val << 16) >>> 30; + out[currentPos++] = (val << 18) >>> 30; + out[currentPos++] = (val << 20) >>> 30; + out[currentPos++] = (val << 22) >>> 30; // 10 + out[currentPos++] = (val << 24) >>> 30; + out[currentPos++] = (val << 26) >>> 30; + out[currentPos++] = (val << 28) >>> 30; + out[currentPos++] = (val << 30) >>> 30; + break; + } + case 2: { // number : 9, bitwidth : 3 + out[currentPos++] = (val << 5) >>> 29; + out[currentPos++] = (val << 8) >>> 29; + out[currentPos++] = (val << 11) >>> 29; + out[currentPos++] = (val << 14) >>> 29; + out[currentPos++] = (val << 17) >>> 29; + out[currentPos++] = (val << 20) >>> 29; + out[currentPos++] = (val << 23) >>> 29; + out[currentPos++] = (val << 26) >>> 29; + out[currentPos++] = (val << 29) >>> 29; + break; + } + case 3: { // number : 7, bitwidth : 4 + out[currentPos++] = (val << 4) >>> 28; + out[currentPos++] = (val << 8) >>> 28; + out[currentPos++] = (val << 12) >>> 28; + out[currentPos++] = (val << 16) >>> 28; + out[currentPos++] = (val << 20) >>> 28; + out[currentPos++] = (val << 24) >>> 28; + out[currentPos++] = (val << 28) >>> 28; + break; + } + case 4: { // number : 5, bitwidth : 5 + out[currentPos++] = (val << 7) >>> 27; + out[currentPos++] = (val << 12) >>> 27; + out[currentPos++] = (val << 17) >>> 27; + out[currentPos++] = (val << 22) >>> 27; + out[currentPos++] = (val << 27) >>> 27; + break; + } + case 5: { // number : 4, bitwidth : 7 + out[currentPos++] = (val << 4) >>> 25; + out[currentPos++] = (val << 11) >>> 25; + out[currentPos++] = (val << 18) >>> 25; + out[currentPos++] = (val << 25) >>> 25; + break; + } + case 6: { // number : 3, bitwidth : 9 + out[currentPos++] = (val << 5) >>> 23; + out[currentPos++] = (val << 14) >>> 23; + out[currentPos++] = (val << 23) >>> 23; + break; + } + case 7: { // number : 2, bitwidth : 14 + out[currentPos++] = (val << 4) >>> 18; + out[currentPos++] = (val << 18) >>> 18; + break; + } + case 8: { // number : 1, bitwidth : 28 + out[currentPos++] = (val << 4) >>> 4; + break; + } + default: { + throw new RuntimeException("shouldn't happen: limited to 28-bit integers"); + } + } + } + while (currentPos < finalout) { + int val = in[tmpinpos++]; + int header = val >>> 28; + switch (header) { + case 0: { // number : 28, bitwidth : 1 + final int howmany = finalout - currentPos; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (k + 4)) >>> 31; + } + break; + } + case 1: { // number : 14, bitwidth : 2 + final int howmany = finalout - currentPos < 14 ? finalout - currentPos : 14; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (2 * k + 4)) >>> 30; + } + break; + } + case 2: { // number : 9, bitwidth : 3 + final int howmany = finalout - currentPos < 9 ? finalout - currentPos : 9; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (3 * k + 5)) >>> 29; + } + break; + } + case 3: { // number : 7, bitwidth : 4 + final int howmany = finalout - currentPos < 7 ? finalout - currentPos : 7; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (4 * k + 4)) >>> 28; + } + break; + } + case 4: { // number : 5, bitwidth : 5 + final int howmany = finalout - currentPos < 5 ? finalout - currentPos : 5; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (5 * k + 7)) >>> 27; + } + break; + } + case 5: { // number : 4, bitwidth : 7 + final int howmany = finalout - currentPos < 4 ? finalout - currentPos : 4; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (7 * k + 4)) >>> 25; + } + break; + } + case 6: { // number : 3, bitwidth : 9 + final int howmany = finalout - currentPos < 3 ? finalout - currentPos : 3; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (9 * k + 5)) >>> 23; + } + break; + } + case 7: { // number : 2, bitwidth : 14 + final int howmany = finalout - currentPos < 2 ? finalout - currentPos : 2; + for (int k = 0; k < howmany; ++k) { + out[currentPos++] = (val << (14 * k + 4)) >>> 18; + } + break; + } + case 8: { // number : 1, bitwidth : 28 + out[currentPos++] = (val << 4) >>> 4; + break; + } + default: { + throw new RuntimeException("shouldn't happen"); + } + } + } + outpos.set(currentPos); + inpos.set(tmpinpos); - } + } - @Override - public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - if (inlength == 0) - return; - out[outpos.get()] = inlength; - outpos.increment(); - headlessCompress(in, inpos, inlength, out, outpos); - } + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + if (inlength == 0) + return; + out[outpos.get()] = inlength; + outpos.increment(); + headlessCompress(in, inpos, inlength, out, outpos); + } - @Override - public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { - if (inlength == 0) - return; - final int outlength = in[inpos.get()]; - inpos.increment(); - headlessUncompress(in, inpos, inlength, out, outpos, outlength); + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + if (inlength == 0) + return; + final int outlength = in[inpos.get()]; + inpos.increment(); + headlessUncompress(in, inpos, inlength, out, outpos, outlength); - } + } - private final static int bitLength[] = { 1, 2, 3, 4, 5, 7, 9, 14, 28 }; + private final static int bitLength[] = { 1, 2, 3, 4, 5, 7, 9, 14, 28 }; - private final static int codeNum[] = { 28, 14, 9, 7, 5, 4, 3, 2, 1 }; + private final static int codeNum[] = { 28, 14, 9, 7, 5, 4, 3, 2, 1 }; - @Override - public String toString() { - return this.getClass().getSimpleName(); - } + @Override + public String toString() { + return this.getClass().getSimpleName(); + } } diff --git a/src/main/java/me/lemire/integercompression/SkippableComposition.java b/src/main/java/me/lemire/integercompression/SkippableComposition.java index a235c47..5faf7c2 100644 --- a/src/main/java/me/lemire/integercompression/SkippableComposition.java +++ b/src/main/java/me/lemire/integercompression/SkippableComposition.java @@ -54,7 +54,7 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] o int init = inpos.get(); F1.headlessUncompress(in, inpos, inlength, out, outpos, num); if (inpos.get() == init) { - inpos.increment(); + inpos.increment(); } inlength -= inpos.get() - init; num -= outpos.get(); diff --git a/src/main/java/me/lemire/integercompression/UncompressibleInputException.java b/src/main/java/me/lemire/integercompression/UncompressibleInputException.java index c490946..c0ed41f 100644 --- a/src/main/java/me/lemire/integercompression/UncompressibleInputException.java +++ b/src/main/java/me/lemire/integercompression/UncompressibleInputException.java @@ -6,14 +6,14 @@ */ public class UncompressibleInputException extends RuntimeException { - /** - * Create new exception - * @param string explanation for the exception - */ - public UncompressibleInputException(String string) { - super(string); - } + /** + * Create new exception + * @param string explanation for the exception + */ + public UncompressibleInputException(String string) { + super(string); + } - private static final long serialVersionUID = -798583799846489873L; + private static final long serialVersionUID = -798583799846489873L; } diff --git a/src/main/java/me/lemire/integercompression/Util.java b/src/main/java/me/lemire/integercompression/Util.java index 346e3b2..63fc918 100644 --- a/src/main/java/me/lemire/integercompression/Util.java +++ b/src/main/java/me/lemire/integercompression/Util.java @@ -15,13 +15,13 @@ public final class Util { - - // check whether x is small than y as unsigned ints (supported by Java 8 natively); - protected static final boolean smallerorequalthan(int x, int y) { - return (x + Integer.MIN_VALUE) <= (y + Integer.MIN_VALUE); - } - - /** + + // check whether x is small than y as unsigned ints (supported by Java 8 natively); + protected static final boolean smallerorequalthan(int x, int y) { + return (x + Integer.MIN_VALUE) <= (y + Integer.MIN_VALUE); + } + + /** * Compute the maximum of the integer logarithms (ceil(log(x+1)) of a range * of value * diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java b/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java index c5fee69..ef4a386 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/Benchmark.java @@ -308,10 +308,10 @@ private static void testByteCodec(PrintWriter csvLog, int sparsity, public static void main(String args[]) throws FileNotFoundException { System.out .println("# benchmark based on the ClusterData model from:"); - System.out.println("# Vo Ngoc Anh and Alistair Moffat. "); - System.out.println("# Index compression using 64-bit words."); + System.out.println("# Vo Ngoc Anh and Alistair Moffat. "); + System.out.println("# Index compression using 64-bit words."); System.out - .println("# Softw. Pract. Exper.40, 2 (February 2010), 131-147. "); + .println("# Softw. Pract. Exper.40, 2 (February 2010), 131-147. "); System.out.println(); PrintWriter writer = null; diff --git a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java index 363b841..b930568 100644 --- a/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java +++ b/src/main/java/me/lemire/integercompression/benchmarktools/BenchmarkSkippable.java @@ -241,10 +241,10 @@ private static void testCodec(PrintWriter csvLog, int sparsity, Object c, */ public static void main(String args[]) throws FileNotFoundException { System.out.println("# benchmark based on the ClusterData model from:"); - System.out.println("# Vo Ngoc Anh and Alistair Moffat. "); - System.out.println("# Index compression using 64-bit words."); + System.out.println("# Vo Ngoc Anh and Alistair Moffat. "); + System.out.println("# Index compression using 64-bit words."); System.out - .println("# Softw. Pract. Exper.40, 2 (February 2010), 131-147. "); + .println("# Softw. Pract. Exper.40, 2 (February 2010), 131-147. "); System.out.println(); PrintWriter writer = null; diff --git a/src/main/java/me/lemire/integercompression/differential/IntegratedIntCompressor.java b/src/main/java/me/lemire/integercompression/differential/IntegratedIntCompressor.java index 5808bdd..72159ba 100644 --- a/src/main/java/me/lemire/integercompression/differential/IntegratedIntCompressor.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedIntCompressor.java @@ -43,12 +43,12 @@ public int[] compress(int[] input) { compressed[0] = input.length; IntWrapper outpos = new IntWrapper(1); IntWrapper initvalue = new IntWrapper(0); - try { - codec.headlessCompress(input, new IntWrapper(0), input.length, compressed, outpos, initvalue); - } catch (IndexOutOfBoundsException ioebe) { - throw new UncompressibleInputException( - "Your input is too poorly compressible with the current codec : " + codec); - } + try { + codec.headlessCompress(input, new IntWrapper(0), input.length, compressed, outpos, initvalue); + } catch (IndexOutOfBoundsException ioebe) { + throw new UncompressibleInputException( + "Your input is too poorly compressible with the current codec : " + codec); + } compressed = Arrays.copyOf(compressed,outpos.intValue()); return compressed; } diff --git a/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedComposition.java b/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedComposition.java index 09c4dd8..abcc027 100644 --- a/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedComposition.java +++ b/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedComposition.java @@ -68,7 +68,7 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int init = inpos.get(); F1.headlessUncompress(in, inpos, inlength, out, outpos,num,initvalue); if (inpos.get() == init) { - inpos.increment(); + inpos.increment(); } inlength -= inpos.get() - init; diff --git a/src/main/java/me/lemire/longcompression/ByteLongCODEC.java b/src/main/java/me/lemire/longcompression/ByteLongCODEC.java index e405370..dbc6864 100644 --- a/src/main/java/me/lemire/longcompression/ByteLongCODEC.java +++ b/src/main/java/me/lemire/longcompression/ByteLongCODEC.java @@ -57,6 +57,6 @@ public void compress(long[] in, IntWrapper inpos, int inlength, * where to write the compressed output in out */ public void uncompress(byte[] in, IntWrapper inpos, int inlength, - long[] out, IntWrapper outpos); + long[] out, IntWrapper outpos); } diff --git a/src/main/java/me/lemire/longcompression/LongAs2IntsCodec.java b/src/main/java/me/lemire/longcompression/LongAs2IntsCodec.java index 3b2bc76..35c1166 100644 --- a/src/main/java/me/lemire/longcompression/LongAs2IntsCodec.java +++ b/src/main/java/me/lemire/longcompression/LongAs2IntsCodec.java @@ -16,174 +16,174 @@ * */ public class LongAs2IntsCodec implements LongCODEC { - final IntegerCODEC highPartsCodec; - final IntegerCODEC lowPartsCodec; - - public LongAs2IntsCodec(IntegerCODEC highPartsCodec, IntegerCODEC lowPartsCodec) { - this.highPartsCodec = highPartsCodec; - this.lowPartsCodec = lowPartsCodec; - } - - /** - * By default, we expect longs to be slightly above Integer.MAX_VALUE. Hence highParts to be small and positive - * integers. For lowParts, we rely on {@link IntCompressor} default IntegerCODEC - */ - public LongAs2IntsCodec() { - this(new VariableByte(), new Composition(new BinaryPacking(), new VariableByte())); - } - - @Override - public void compress(long[] in, IntWrapper inpos, int inlength, long[] out, IntWrapper outpos) { - if (inlength == 0) { - return; - } - - int[] highParts = new int[inlength]; - int[] lowParts = new int[inlength]; - - for (int i = 0; i < inlength; i++) { - int inPosition = inpos.get() + i; - - highParts[i] = RoaringIntPacking.high(in[inPosition]); - lowParts[i] = RoaringIntPacking.low(in[inPosition]); - } - - // TODO What would be a relevant buffer size? - int[] buffer = new int[inlength * 16]; - - int outPosition = outpos.get(); - - boolean hasLeftover; - { - // The first integer is reserved to hold the number of compressed ints - IntWrapper highPartsOutPosition = new IntWrapper(1); - - highPartsCodec.compress(highParts, new IntWrapper(), inlength, buffer, highPartsOutPosition); - - // Record the compressedHighparts length - buffer[0] = highPartsOutPosition.get() - 1; - - for (int i = 0; i < highPartsOutPosition.get() / 2; i++) { - long pack = RoaringIntPacking.pack(buffer[i * 2], buffer[i * 2 + 1]); - out[outPosition++] = pack; - } - - if (1 == highPartsOutPosition.get() % 2) { - // Shift the trailing integer as first in the buffer - hasLeftover = true; - buffer[0] = buffer[highPartsOutPosition.get() - 1]; - } else { - hasLeftover = false; - } - } - - { - // The first integer is reserved to hold the number of compressed ints - IntWrapper lowPartsOutPosition = new IntWrapper(1); - if (hasLeftover) { - // Keep the trailing int from highParts before the reserved int from lowParts compressed length - lowPartsOutPosition.set(2); - } - - lowPartsCodec.compress(lowParts, new IntWrapper(0), inlength, buffer, lowPartsOutPosition); - - // Record the compressedHighparts length - buffer[hasLeftover ? 1 : 0] = lowPartsOutPosition.get() - (hasLeftover ? 2 : 1); - - for (int i = 0; i < lowPartsOutPosition.get() / 2; i++) { - long pack = RoaringIntPacking.pack(buffer[i * 2], buffer[i * 2 + 1]); - out[outPosition++] = pack; - } - - if (1 == lowPartsOutPosition.get() % 2) { - // The trailing integer is packed with a 0 - long pack = RoaringIntPacking.pack(buffer[lowPartsOutPosition.get() - 1], 0); - out[outPosition++] = pack; - } - } - - inpos.add(inlength); - outpos.set(outPosition); - } - - /** - * inlength is ignored by this codec. We may rely on it instead of storing the compressedLowPart length - */ - @Override - public void uncompress(long[] in, IntWrapper inpos, int inlength, long[] out, IntWrapper outpos) { - if (inlength == 0) { - return; - } - - int longIndex = inpos.get(); - - int nbCompressedHighParts = RoaringIntPacking.high(in[longIndex]); - int[] compressedHighParts = new int[nbCompressedHighParts]; - - // !highPart as we just read the highPart for nbCompressedHighParts - boolean highPart = false; - for (int i = 0; i < nbCompressedHighParts; i++) { - int nextInt; - if (highPart) { - nextInt = RoaringIntPacking.high(in[longIndex + (i + 1) / 2]); - } else { - nextInt = RoaringIntPacking.low(in[longIndex + (i + 1) / 2]); - } - compressedHighParts[i] = nextInt; - - highPart = !highPart; - } - - // TODO What would be a relevant buffer size? - int[] buffer = new int[inlength * 16]; - - IntWrapper highPartsOutPosition = new IntWrapper(); - highPartsCodec.uncompress(compressedHighParts, - new IntWrapper(), - compressedHighParts.length, - buffer, - highPartsOutPosition); - int[] highParts = Arrays.copyOf(buffer, highPartsOutPosition.get()); - - // +1 as we initially read nbCompressedHighParts - int intIndexNbCompressedLowParts = longIndex * 2 + 1 + nbCompressedHighParts; - int nbCompressedLowParts; - if (highPart) { - nbCompressedLowParts = RoaringIntPacking.high(in[intIndexNbCompressedLowParts / 2]); - } else { - nbCompressedLowParts = RoaringIntPacking.low(in[intIndexNbCompressedLowParts / 2]); - } - highPart = !highPart; - - int[] compressedLowParts = new int[nbCompressedLowParts]; - for (int i = 0; i < nbCompressedLowParts; i++) { - int nextInt; - if (highPart) { - nextInt = RoaringIntPacking.high(in[(intIndexNbCompressedLowParts + 1 + i) / 2]); - } else { - nextInt = RoaringIntPacking.low(in[(intIndexNbCompressedLowParts + 1 + i) / 2]); - } - compressedLowParts[i] = nextInt; - - highPart = !highPart; - } - - IntWrapper lowPartsOutPosition = new IntWrapper(); - lowPartsCodec.uncompress(compressedLowParts, - new IntWrapper(), - compressedLowParts.length, - buffer, - lowPartsOutPosition); - int[] lowParts = Arrays.copyOf(buffer, lowPartsOutPosition.get()); - assert highParts.length == lowParts.length; - - int outposition = outpos.get(); - for (int i = 0; i < highParts.length; i++) { - out[outposition++] = RoaringIntPacking.pack(highParts[i], lowParts[i]); - } - - inpos.add(inlength); - outpos.set(outposition); - } + final IntegerCODEC highPartsCodec; + final IntegerCODEC lowPartsCodec; + + public LongAs2IntsCodec(IntegerCODEC highPartsCodec, IntegerCODEC lowPartsCodec) { + this.highPartsCodec = highPartsCodec; + this.lowPartsCodec = lowPartsCodec; + } + + /** + * By default, we expect longs to be slightly above Integer.MAX_VALUE. Hence highParts to be small and positive + * integers. For lowParts, we rely on {@link IntCompressor} default IntegerCODEC + */ + public LongAs2IntsCodec() { + this(new VariableByte(), new Composition(new BinaryPacking(), new VariableByte())); + } + + @Override + public void compress(long[] in, IntWrapper inpos, int inlength, long[] out, IntWrapper outpos) { + if (inlength == 0) { + return; + } + + int[] highParts = new int[inlength]; + int[] lowParts = new int[inlength]; + + for (int i = 0; i < inlength; i++) { + int inPosition = inpos.get() + i; + + highParts[i] = RoaringIntPacking.high(in[inPosition]); + lowParts[i] = RoaringIntPacking.low(in[inPosition]); + } + + // TODO What would be a relevant buffer size? + int[] buffer = new int[inlength * 16]; + + int outPosition = outpos.get(); + + boolean hasLeftover; + { + // The first integer is reserved to hold the number of compressed ints + IntWrapper highPartsOutPosition = new IntWrapper(1); + + highPartsCodec.compress(highParts, new IntWrapper(), inlength, buffer, highPartsOutPosition); + + // Record the compressedHighparts length + buffer[0] = highPartsOutPosition.get() - 1; + + for (int i = 0; i < highPartsOutPosition.get() / 2; i++) { + long pack = RoaringIntPacking.pack(buffer[i * 2], buffer[i * 2 + 1]); + out[outPosition++] = pack; + } + + if (1 == highPartsOutPosition.get() % 2) { + // Shift the trailing integer as first in the buffer + hasLeftover = true; + buffer[0] = buffer[highPartsOutPosition.get() - 1]; + } else { + hasLeftover = false; + } + } + + { + // The first integer is reserved to hold the number of compressed ints + IntWrapper lowPartsOutPosition = new IntWrapper(1); + if (hasLeftover) { + // Keep the trailing int from highParts before the reserved int from lowParts compressed length + lowPartsOutPosition.set(2); + } + + lowPartsCodec.compress(lowParts, new IntWrapper(0), inlength, buffer, lowPartsOutPosition); + + // Record the compressedHighparts length + buffer[hasLeftover ? 1 : 0] = lowPartsOutPosition.get() - (hasLeftover ? 2 : 1); + + for (int i = 0; i < lowPartsOutPosition.get() / 2; i++) { + long pack = RoaringIntPacking.pack(buffer[i * 2], buffer[i * 2 + 1]); + out[outPosition++] = pack; + } + + if (1 == lowPartsOutPosition.get() % 2) { + // The trailing integer is packed with a 0 + long pack = RoaringIntPacking.pack(buffer[lowPartsOutPosition.get() - 1], 0); + out[outPosition++] = pack; + } + } + + inpos.add(inlength); + outpos.set(outPosition); + } + + /** + * inlength is ignored by this codec. We may rely on it instead of storing the compressedLowPart length + */ + @Override + public void uncompress(long[] in, IntWrapper inpos, int inlength, long[] out, IntWrapper outpos) { + if (inlength == 0) { + return; + } + + int longIndex = inpos.get(); + + int nbCompressedHighParts = RoaringIntPacking.high(in[longIndex]); + int[] compressedHighParts = new int[nbCompressedHighParts]; + + // !highPart as we just read the highPart for nbCompressedHighParts + boolean highPart = false; + for (int i = 0; i < nbCompressedHighParts; i++) { + int nextInt; + if (highPart) { + nextInt = RoaringIntPacking.high(in[longIndex + (i + 1) / 2]); + } else { + nextInt = RoaringIntPacking.low(in[longIndex + (i + 1) / 2]); + } + compressedHighParts[i] = nextInt; + + highPart = !highPart; + } + + // TODO What would be a relevant buffer size? + int[] buffer = new int[inlength * 16]; + + IntWrapper highPartsOutPosition = new IntWrapper(); + highPartsCodec.uncompress(compressedHighParts, + new IntWrapper(), + compressedHighParts.length, + buffer, + highPartsOutPosition); + int[] highParts = Arrays.copyOf(buffer, highPartsOutPosition.get()); + + // +1 as we initially read nbCompressedHighParts + int intIndexNbCompressedLowParts = longIndex * 2 + 1 + nbCompressedHighParts; + int nbCompressedLowParts; + if (highPart) { + nbCompressedLowParts = RoaringIntPacking.high(in[intIndexNbCompressedLowParts / 2]); + } else { + nbCompressedLowParts = RoaringIntPacking.low(in[intIndexNbCompressedLowParts / 2]); + } + highPart = !highPart; + + int[] compressedLowParts = new int[nbCompressedLowParts]; + for (int i = 0; i < nbCompressedLowParts; i++) { + int nextInt; + if (highPart) { + nextInt = RoaringIntPacking.high(in[(intIndexNbCompressedLowParts + 1 + i) / 2]); + } else { + nextInt = RoaringIntPacking.low(in[(intIndexNbCompressedLowParts + 1 + i) / 2]); + } + compressedLowParts[i] = nextInt; + + highPart = !highPart; + } + + IntWrapper lowPartsOutPosition = new IntWrapper(); + lowPartsCodec.uncompress(compressedLowParts, + new IntWrapper(), + compressedLowParts.length, + buffer, + lowPartsOutPosition); + int[] lowParts = Arrays.copyOf(buffer, lowPartsOutPosition.get()); + assert highParts.length == lowParts.length; + + int outposition = outpos.get(); + for (int i = 0; i < highParts.length; i++) { + out[outposition++] = RoaringIntPacking.pack(highParts[i], lowParts[i]); + } + + inpos.add(inlength); + outpos.set(outposition); + } } diff --git a/src/main/java/me/lemire/longcompression/LongCODEC.java b/src/main/java/me/lemire/longcompression/LongCODEC.java index c0f67b2..0b77a43 100644 --- a/src/main/java/me/lemire/longcompression/LongCODEC.java +++ b/src/main/java/me/lemire/longcompression/LongCODEC.java @@ -36,7 +36,7 @@ public interface LongCODEC { * where to write in the output array */ public void compress(long[] in, IntWrapper inpos, int inlength, - long[] out, IntWrapper outpos); + long[] out, IntWrapper outpos); /** * Uncompress data from an array to another array. @@ -57,6 +57,6 @@ public void compress(long[] in, IntWrapper inpos, int inlength, * where to write the compressed output in out */ public void uncompress(long[] in, IntWrapper inpos, int inlength, - long[] out, IntWrapper outpos); + long[] out, IntWrapper outpos); } diff --git a/src/main/java/me/lemire/longcompression/LongComposition.java b/src/main/java/me/lemire/longcompression/LongComposition.java index 1394a78..5111a51 100644 --- a/src/main/java/me/lemire/longcompression/LongComposition.java +++ b/src/main/java/me/lemire/longcompression/LongComposition.java @@ -37,7 +37,7 @@ public LongComposition(LongCODEC f1, LongCODEC f2) { @Override public void compress(long[] in, IntWrapper inpos, int inlength, - long[] out, IntWrapper outpos) { + long[] out, IntWrapper outpos) { if (inlength == 0) { return; } @@ -54,7 +54,7 @@ public void compress(long[] in, IntWrapper inpos, int inlength, @Override public void uncompress(long[] in, IntWrapper inpos, int inlength, - long[] out, IntWrapper outpos) { + long[] out, IntWrapper outpos) { if (inlength == 0) return; final int init = inpos.get(); diff --git a/src/main/java/me/lemire/longcompression/LongJustCopy.java b/src/main/java/me/lemire/longcompression/LongJustCopy.java index 7a5a67a..9b25f71 100644 --- a/src/main/java/me/lemire/longcompression/LongJustCopy.java +++ b/src/main/java/me/lemire/longcompression/LongJustCopy.java @@ -17,7 +17,7 @@ public final class LongJustCopy implements LongCODEC, SkippableLongCODEC { @Override public void headlessCompress(long[] in, IntWrapper inpos, int inlength, - long[] out, IntWrapper outpos) { + long[] out, IntWrapper outpos) { System.arraycopy(in, inpos.get(), out, outpos.get(), inlength); inpos.add(inlength); outpos.add(inlength); @@ -25,7 +25,7 @@ public void headlessCompress(long[] in, IntWrapper inpos, int inlength, @Override public void uncompress(long[] in, IntWrapper inpos, int inlength, - long[] out, IntWrapper outpos) { + long[] out, IntWrapper outpos) { headlessUncompress(in,inpos,inlength,out,outpos,inlength); } @@ -36,7 +36,7 @@ public String toString() { @Override public void headlessUncompress(long[] in, IntWrapper inpos, int inlength, - long[] out, IntWrapper outpos, int num) { + long[] out, IntWrapper outpos, int num) { System.arraycopy(in, inpos.get(), out, outpos.get(), num); inpos.add(num); outpos.add(num); @@ -45,7 +45,7 @@ public void headlessUncompress(long[] in, IntWrapper inpos, int inlength, @Override public void compress(long[] in, IntWrapper inpos, int inlength, - long[] out, IntWrapper outpos) { + long[] out, IntWrapper outpos) { headlessCompress(in,inpos,inlength,out,outpos); } diff --git a/src/main/java/me/lemire/longcompression/LongUtil.java b/src/main/java/me/lemire/longcompression/LongUtil.java index c06433f..abb8ab4 100644 --- a/src/main/java/me/lemire/longcompression/LongUtil.java +++ b/src/main/java/me/lemire/longcompression/LongUtil.java @@ -16,7 +16,7 @@ @Deprecated public class LongUtil { - protected static String longToBinaryWithLeading(long l) { - return String.format("%64s", Long.toBinaryString(l)).replace(' ', '0'); - } + protected static String longToBinaryWithLeading(long l) { + return String.format("%64s", Long.toBinaryString(l)).replace(' ', '0'); + } } diff --git a/src/main/java/me/lemire/longcompression/LongVariableByte.java b/src/main/java/me/lemire/longcompression/LongVariableByte.java index f3d10ee..6ac129c 100644 --- a/src/main/java/me/lemire/longcompression/LongVariableByte.java +++ b/src/main/java/me/lemire/longcompression/LongVariableByte.java @@ -234,7 +234,7 @@ public void uncompress(long[] in, IntWrapper inpos, int inlength, long[] out, @Override public void uncompress(byte[] in, IntWrapper inpos, int inlength, - long[] out, IntWrapper outpos) { + long[] out, IntWrapper outpos) { int p = inpos.get(); int finalp = inpos.get() + inlength; int tmpoutpos = outpos.get(); diff --git a/src/main/java/me/lemire/longcompression/SkippableLongComposition.java b/src/main/java/me/lemire/longcompression/SkippableLongComposition.java index 5568489..f2e9a55 100644 --- a/src/main/java/me/lemire/longcompression/SkippableLongComposition.java +++ b/src/main/java/me/lemire/longcompression/SkippableLongComposition.java @@ -55,7 +55,7 @@ public void headlessUncompress(long[] in, IntWrapper inpos, int inlength, long[] int init = inpos.get(); F1.headlessUncompress(in, inpos, inlength, out, outpos, num); if (inpos.get() == init) { - inpos.increment(); + inpos.increment(); } inlength -= inpos.get() - init; num -= outpos.get(); diff --git a/src/main/java/me/lemire/longcompression/differential/LongDelta.java b/src/main/java/me/lemire/longcompression/differential/LongDelta.java index 2b0e077..184e53c 100644 --- a/src/main/java/me/lemire/longcompression/differential/LongDelta.java +++ b/src/main/java/me/lemire/longcompression/differential/LongDelta.java @@ -66,7 +66,7 @@ public static long delta(long[] data, int start, int length, int init) { * @return next initial vale */ public static long delta(long[] data, int start, int length, int init, - long[] out) { + long[] out) { for (int i = length - 1; i > 0; --i) { out[i] = data[start + i] - data[start + i - 1]; } @@ -98,7 +98,7 @@ public static void fastinverseDelta(long[] data) { int sz0 = data.length / 4 * 4; int i = 1; if (sz0 >= 4) { - long a = data[0]; + long a = data[0]; for (; i < sz0 - 4; i += 4) { a = data[i] += a; a = data[i + 1] += a; @@ -132,7 +132,7 @@ public static long fastinverseDelta(long[] data, int start, int length, int sz0 = length / 4 * 4; int i = 1; if (sz0 >= 4) { - long a = data[start]; + long a = data[start]; for (; i < sz0 - 4; i += 4) { a = data[start + i] += a; a = data[start + i + 1] += a; diff --git a/src/test/java/me/lemire/integercompression/AdhocTest.java b/src/test/java/me/lemire/integercompression/AdhocTest.java index 8fd4049..aa6718b 100644 --- a/src/test/java/me/lemire/integercompression/AdhocTest.java +++ b/src/test/java/me/lemire/integercompression/AdhocTest.java @@ -22,13 +22,48 @@ @SuppressWarnings({ "static-method" }) public class AdhocTest { - - /** - * - */ + @Test + public void testIssue59() { + FastPFOR128 fastpfor = new FastPFOR128(); + + int N = 9984; + int[] data = new int[N]; + for (var i = 0; i < N; i += 150) { + data[i] = i; + } + + int[] compressedoutput1 = new int[N + 1024]; + + IntWrapper inputoffset1 = new IntWrapper(0); + IntWrapper outputoffset1 = new IntWrapper(0); + + fastpfor.compress(data, inputoffset1, N, compressedoutput1, outputoffset1); + int compressedsize1 = outputoffset1.get(); + + int[] recovered1 = new int[N]; + inputoffset1 = new IntWrapper(0); + outputoffset1 = new IntWrapper(0); + fastpfor.uncompress(compressedoutput1, outputoffset1, compressedsize1, recovered1, inputoffset1); + Assert.assertArrayEquals(data, recovered1); + + int[] compressedoutput2 = new int[N + 1024]; + + IntWrapper inputoffset2 = new IntWrapper(0); + IntWrapper outputoffset2 = new IntWrapper(0); + + fastpfor.compress(data, inputoffset2, N, compressedoutput2, outputoffset2); + int compressedsize2 = outputoffset2.get(); + + int[] recovered2 = new int[N]; + inputoffset2 = new IntWrapper(0); + outputoffset2 = new IntWrapper(0); + fastpfor.uncompress(compressedoutput2, outputoffset2, compressedsize2, recovered2, inputoffset2); + Assert.assertArrayEquals(data, recovered2); + } + @Test public void testIssue29() { - for(int x = 0; x < 64; x++) { + for(int x = 0; x < 64; x++) { int[] a = {2, 3, 4, 5}; int[] b = new int[90]; int[] c = new int[a.length]; @@ -42,7 +77,7 @@ public void testIssue29() { IntWrapper cOffset = new IntWrapper(0); codec.uncompress(b, bOffset, len, c, cOffset); Assert.assertArrayEquals(a,c); - } + } } /** @@ -50,20 +85,20 @@ public void testIssue29() { */ @Test public void testIssue29b() { - for(int x = 0; x < 64; x++) { - int[] a = {2, 3, 4, 5}; - int[] b = new int[90]; - int[] c = new int[a.length]; - SkippableIntegerCODEC codec = new SkippableComposition(new BinaryPacking(), new VariableByte()); - IntWrapper aOffset = new IntWrapper(0); - IntWrapper bOffset = new IntWrapper(x); - codec.headlessCompress(a, aOffset, a.length, b, bOffset); - int len = bOffset.get() - x; - bOffset.set(x); - IntWrapper cOffset = new IntWrapper(0); - codec.headlessUncompress(b, bOffset, len, c, cOffset, a.length); - Assert.assertArrayEquals(a,c); - } + for(int x = 0; x < 64; x++) { + int[] a = {2, 3, 4, 5}; + int[] b = new int[90]; + int[] c = new int[a.length]; + SkippableIntegerCODEC codec = new SkippableComposition(new BinaryPacking(), new VariableByte()); + IntWrapper aOffset = new IntWrapper(0); + IntWrapper bOffset = new IntWrapper(x); + codec.headlessCompress(a, aOffset, a.length, b, bOffset); + int len = bOffset.get() - x; + bOffset.set(x); + IntWrapper cOffset = new IntWrapper(0); + codec.headlessUncompress(b, bOffset, len, c, cOffset, a.length); + Assert.assertArrayEquals(a,c); + } } @@ -71,30 +106,27 @@ public void testIssue29b() { * */ @Test - public void testIssue41() { - for (int x = 0; x < 64; x++) { - int[] a = { 2, 3, 4, 5 }; - int[] b = new int[90]; - int[] c = new int[a.length]; - SkippableIntegratedIntegerCODEC codec = new SkippableIntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()); - IntWrapper aOffset = new IntWrapper(0); - IntWrapper bOffset = new IntWrapper(x); - IntWrapper initValue = new IntWrapper(0); - - codec.headlessCompress(a, aOffset, a.length, b, bOffset, initValue); - int len = bOffset.get() - x; - bOffset.set(x); - IntWrapper cOffset = new IntWrapper(0); - initValue = new IntWrapper(0); - codec.headlessUncompress(b, bOffset, len, c, cOffset, a.length, initValue); - Assert.assertArrayEquals(a, c); - } - } + public void testIssue41() { + for (int x = 0; x < 64; x++) { + int[] a = { 2, 3, 4, 5 }; + int[] b = new int[90]; + int[] c = new int[a.length]; + SkippableIntegratedIntegerCODEC codec = new SkippableIntegratedComposition(new IntegratedBinaryPacking(), + new IntegratedVariableByte()); + IntWrapper aOffset = new IntWrapper(0); + IntWrapper bOffset = new IntWrapper(x); + IntWrapper initValue = new IntWrapper(0); + + codec.headlessCompress(a, aOffset, a.length, b, bOffset, initValue); + int len = bOffset.get() - x; + bOffset.set(x); + IntWrapper cOffset = new IntWrapper(0); + initValue = new IntWrapper(0); + codec.headlessUncompress(b, bOffset, len, c, cOffset, a.length, initValue); + Assert.assertArrayEquals(a, c); + } + } - /** - * a test - */ @Test public void biggerCompressedArray0() { // No problem: for comparison. @@ -102,12 +134,8 @@ public void biggerCompressedArray0() { assertSymmetry(c, 0, 16384); c = new Composition(new FastPFOR(), new VariableByte()); assertSymmetry(c, 0, 16384); - } - /** - * a test - */ @Test public void biggerCompressedArray1() { // Compressed array is bigger than original, because of VariableByte. @@ -115,9 +143,6 @@ public void biggerCompressedArray1() { assertSymmetry(c, -1); } - /** - * a test - */ @Test public void biggerCompressedArray2() { // Compressed array is bigger than original, because of Composition. diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index b5f292e..b29ae0d 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -48,35 +48,35 @@ public class BasicTest { new GroupSimple9(), new Composition(new XorBinaryPacking(), new VariableByte()), new Composition(new DeltaZigzagBinaryPacking(), - new DeltaZigzagVariableByte()) }; + new DeltaZigzagVariableByte()) }; - /** + /** * This tests with a compressed array with various offset */ - @Test - public void saulTest() { - for (IntegerCODEC C : codecs) { - for (int x = 0; x < 50; ++x) { - int[] a = { 2, 3, 4, 5 }; - int[] b = new int[90]; - int[] c = new int[a.length]; - - IntWrapper aOffset = new IntWrapper(0); - IntWrapper bOffset = new IntWrapper(x); - C.compress(a, aOffset, a.length, b, bOffset); - int len = bOffset.get() - x; - - bOffset.set(x); - IntWrapper cOffset = new IntWrapper(0); - C.uncompress(b, bOffset, len, c, cOffset); - if(!Arrays.equals(a, c)) { - System.out.println("Problem with "+C); - } - assertArrayEquals(a, c); - - } - } - } + @Test + public void saulTest() { + for (IntegerCODEC C : codecs) { + for (int x = 0; x < 50; ++x) { + int[] a = { 2, 3, 4, 5 }; + int[] b = new int[90]; + int[] c = new int[a.length]; + + IntWrapper aOffset = new IntWrapper(0); + IntWrapper bOffset = new IntWrapper(x); + C.compress(a, aOffset, a.length, b, bOffset); + int len = bOffset.get() - x; + + bOffset.set(x); + IntWrapper cOffset = new IntWrapper(0); + C.uncompress(b, bOffset, len, c, cOffset); + if(!Arrays.equals(a, c)) { + System.out.println("Problem with "+C); + } + assertArrayEquals(a, c); + + } + } + } /** * */ diff --git a/src/test/java/me/lemire/integercompression/ByteBasicTest.java b/src/test/java/me/lemire/integercompression/ByteBasicTest.java index 93112c3..2b2d4f1 100644 --- a/src/test/java/me/lemire/integercompression/ByteBasicTest.java +++ b/src/test/java/me/lemire/integercompression/ByteBasicTest.java @@ -28,32 +28,32 @@ public class ByteBasicTest { new IntegratedVariableByte(), }; - /** + /** * */ - @Test - public void saulTest() { - for (ByteIntegerCODEC C : codecs) { - for (int x = 0; x < 50 * 4; ++x) { - int[] a = { 2, 3, 4, 5 }; - byte[] b = new byte[90*4]; - int[] c = new int[a.length]; + @Test + public void saulTest() { + for (ByteIntegerCODEC C : codecs) { + for (int x = 0; x < 50 * 4; ++x) { + int[] a = { 2, 3, 4, 5 }; + byte[] b = new byte[90*4]; + int[] c = new int[a.length]; - IntWrapper aOffset = new IntWrapper(0); - IntWrapper bOffset = new IntWrapper(x); - C.compress(a, aOffset, a.length, b, bOffset); - int len = bOffset.get() - x; + IntWrapper aOffset = new IntWrapper(0); + IntWrapper bOffset = new IntWrapper(x); + C.compress(a, aOffset, a.length, b, bOffset); + int len = bOffset.get() - x; - bOffset.set(x); - IntWrapper cOffset = new IntWrapper(0); - C.uncompress(b, bOffset, len, c, cOffset); - if(!Arrays.equals(a, c)) { - System.out.println("Problem with "+C); - } - assertArrayEquals(a, c); - } - } - } + bOffset.set(x); + IntWrapper cOffset = new IntWrapper(0); + C.uncompress(b, bOffset, len, c, cOffset); + if(!Arrays.equals(a, c)) { + System.out.println("Problem with "+C); + } + assertArrayEquals(a, c); + } + } + } /** * */ diff --git a/src/test/java/me/lemire/integercompression/ExampleTest.java b/src/test/java/me/lemire/integercompression/ExampleTest.java index f6038b8..ce10d18 100644 --- a/src/test/java/me/lemire/integercompression/ExampleTest.java +++ b/src/test/java/me/lemire/integercompression/ExampleTest.java @@ -17,305 +17,305 @@ * */ public class ExampleTest { - /** - * - */ - @Test - - public void superSimpleExample() { - IntegratedIntCompressor iic = new IntegratedIntCompressor(); - int[] data = new int[2342351]; - for (int k = 0; k < data.length; ++k) - data[k] = k; - System.out.println("Compressing " + data.length + " integers using friendly interface"); - int[] compressed = iic.compress(data); - int[] recov = iic.uncompress(compressed); - System.out - .println("compressed from " + data.length * 4 / 1024 + "KB to " + compressed.length * 4 / 1024 + "KB"); - if (!Arrays.equals(recov, data)) - throw new RuntimeException("bug"); - } - - /** - * - */ - @Test - - public void basicExample() { - int[] data = new int[2342351]; - System.out.println("Compressing " + data.length + " integers in one go"); - // data should be sorted for best - // results - for (int k = 0; k < data.length; ++k) - data[k] = k; - // Very important: the data is in sorted order!!! If not, you - // will get very poor compression with IntegratedBinaryPacking, - // you should use another CODEC. - - // next we compose a CODEC. Most of the processing - // will be done with binary packing, and leftovers will - // be processed using variable byte - IntegratedIntegerCODEC codec = new IntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()); - // output vector should be large enough... - int[] compressed = new int[data.length + 1024]; - // compressed might not be large enough in some cases - // if you get java.lang.ArrayIndexOutOfBoundsException, try - // allocating more memory - - /** - * - * compressing - * - */ - IntWrapper inputoffset = new IntWrapper(0); - IntWrapper outputoffset = new IntWrapper(0); - codec.compress(data, inputoffset, data.length, compressed, outputoffset); - // got it! - // inputoffset should be at data.length but outputoffset tells - // us where we are... - System.out.println( - "compressed from " + data.length * 4 / 1024 + "KB to " + outputoffset.intValue() * 4 / 1024 + "KB"); - // we can repack the data: (optional) - compressed = Arrays.copyOf(compressed, outputoffset.intValue()); - - /** - * - * now uncompressing - * - * This assumes that we otherwise know how many integers have been - * compressed. See basicExampleHeadless for a more general case. - */ - int[] recovered = new int[data.length]; - IntWrapper recoffset = new IntWrapper(0); - codec.uncompress(compressed, new IntWrapper(0), compressed.length, recovered, recoffset); - if (Arrays.equals(data, recovered)) - System.out.println("data is recovered without loss"); - else - throw new RuntimeException("bug"); // could use assert - System.out.println(); - } - - /** - * Like the basicExample, but we store the input array size manually. - */ - @Test - public void basicExampleHeadless() { - int[] data = new int[2342351]; - System.out.println("Compressing " + data.length + " integers in one go using the headless approach"); - // data should be sorted for best - // results - for (int k = 0; k < data.length; ++k) - data[k] = k; - // Very important: the data is in sorted order!!! If not, you - // will get very poor compression with IntegratedBinaryPacking, - // you should use another CODEC. - - // next we compose a CODEC. Most of the processing - // will be done with binary packing, and leftovers will - // be processed using variable byte - SkippableIntegratedComposition codec = new SkippableIntegratedComposition(new IntegratedBinaryPacking(), - new IntegratedVariableByte()); - // output vector should be large enough... - int[] compressed = new int[data.length + 1024]; - // compressed might not be large enough in some cases - // if you get java.lang.ArrayIndexOutOfBoundsException, try - // allocating more memory - - /** - * - * compressing - * - */ - IntWrapper inputoffset = new IntWrapper(0); - IntWrapper outputoffset = new IntWrapper(1); - compressed[0] = data.length; // we manually store how many integers we - codec.headlessCompress(data, inputoffset, data.length, compressed, outputoffset, new IntWrapper(0)); - // got it! - // inputoffset should be at data.length but outputoffset tells - // us where we are... - System.out.println( - "compressed from " + data.length * 4 / 1024 + "KB to " + outputoffset.intValue() * 4 / 1024 + "KB"); - // we can repack the data: (optional) - compressed = Arrays.copyOf(compressed, outputoffset.intValue()); - - /** - * - * now uncompressing - * - */ - int howmany = compressed[0];// we manually stored the number of - // compressed integers - int[] recovered = new int[howmany]; - IntWrapper recoffset = new IntWrapper(0); - codec.headlessUncompress(compressed, new IntWrapper(1), compressed.length, recovered, recoffset, howmany, new IntWrapper(0)); - if (Arrays.equals(data, recovered)) - System.out.println("data is recovered without loss"); - else - throw new RuntimeException("bug"); // could use assert - System.out.println(); - } - - /** - * This is an example to show you can compress unsorted integers as long as - * most are small. - */ - @Test - public void unsortedExample() { - final int N = 1333333; - int[] data = new int[N]; - // initialize the data (most will be small - for (int k = 0; k < N; k += 1) - data[k] = 3; - // throw some larger values - for (int k = 0; k < N; k += 5) - data[k] = 100; - for (int k = 0; k < N; k += 533) - data[k] = 10000; - int[] compressed = new int[N + 1024];// could need more - IntegerCODEC codec = new Composition(new FastPFOR(), new VariableByte()); - // compressing - IntWrapper inputoffset = new IntWrapper(0); - IntWrapper outputoffset = new IntWrapper(0); - codec.compress(data, inputoffset, data.length, compressed, outputoffset); - System.out.println("compressed unsorted integers from " + data.length * 4 / 1024 + "KB to " - + outputoffset.intValue() * 4 / 1024 + "KB"); - // we can repack the data: (optional) - compressed = Arrays.copyOf(compressed, outputoffset.intValue()); - - int[] recovered = new int[N]; - IntWrapper recoffset = new IntWrapper(0); - codec.uncompress(compressed, new IntWrapper(0), compressed.length, recovered, recoffset); - if (Arrays.equals(data, recovered)) - System.out.println("data is recovered without loss"); - else - throw new RuntimeException("bug"); // could use assert - System.out.println(); - - } - - /** - * This is like the basic example, but we show how to process larger arrays - * in chunks. - * - * Some of this code was written by Pavel Klinov. - */ - @Test - public void advancedExample() { - int TotalSize = 2342351; // some arbitrary number - int ChunkSize = 16384; // size of each chunk, choose a multiple of 128 - System.out.println("Compressing " + TotalSize + " integers using chunks of " + ChunkSize + " integers (" - + ChunkSize * 4 / 1024 + "KB)"); - System.out.println("(It is often better for applications to work in chunks fitting in CPU cache.)"); - int[] data = new int[TotalSize]; - // data should be sorted for best - // results - for (int k = 0; k < data.length; ++k) - data[k] = k; - // next we compose a CODEC. Most of the processing - // will be done with binary packing, and leftovers will - // be processed using variable byte, using variable byte - // only for the last chunk! - IntegratedIntegerCODEC regularcodec = new IntegratedBinaryPacking(); - IntegratedVariableByte ivb = new IntegratedVariableByte(); - IntegratedIntegerCODEC lastcodec = new IntegratedComposition(regularcodec, ivb); - // output vector should be large enough... - int[] compressed = new int[TotalSize + 1024]; - - /** - * - * compressing - * - */ - IntWrapper inputoffset = new IntWrapper(0); - IntWrapper outputoffset = new IntWrapper(0); - for (int k = 0; k < TotalSize / ChunkSize; ++k) - regularcodec.compress(data, inputoffset, ChunkSize, compressed, outputoffset); - lastcodec.compress(data, inputoffset, TotalSize % ChunkSize, compressed, outputoffset); - // got it! - // inputoffset should be at data.length but outputoffset tells - // us where we are... - System.out.println( - "compressed from " + data.length * 4 / 1024 + "KB to " + outputoffset.intValue() * 4 / 1024 + "KB"); - // we can repack the data: - compressed = Arrays.copyOf(compressed, outputoffset.intValue()); - - /** - * - * now uncompressing - * - * We are *not* assuming that the original array length is known, - * however we assume that the chunk size (ChunkSize) is known. - * - */ - int[] recovered = new int[ChunkSize]; - IntWrapper compoff = new IntWrapper(0); - IntWrapper recoffset; - int currentpos = 0; - - while (compoff.get() < compressed.length) { - recoffset = new IntWrapper(0); - regularcodec.uncompress(compressed, compoff, compressed.length - compoff.get(), recovered, recoffset); - - if (recoffset.get() < ChunkSize) {// last chunk detected - ivb.uncompress(compressed, compoff, compressed.length - compoff.get(), recovered, recoffset); - } - for (int i = 0; i < recoffset.get(); ++i) { - if (data[currentpos + i] != recovered[i]) - throw new RuntimeException("bug"); // could use assert - } - currentpos += recoffset.get(); - } - System.out.println("data is recovered without loss"); - System.out.println(); - - } - - /** - * Demo of the headless approach where we must supply the array length - */ - @Test - public void headlessDemo() { - System.out.println("Compressing arrays with minimal header..."); - int[] uncompressed1 = { 1, 2, 1, 3, 1 }; - int[] uncompressed2 = { 3, 2, 4, 6, 1 }; - - int[] compressed = new int[uncompressed1.length + uncompressed2.length + 1024]; - - SkippableIntegerCODEC codec = new SkippableComposition(new BinaryPacking(), new VariableByte()); - - // compressing - IntWrapper outPos = new IntWrapper(); - - IntWrapper previous = new IntWrapper(); - - codec.headlessCompress(uncompressed1, new IntWrapper(), uncompressed1.length, compressed, outPos); - int length1 = outPos.get() - previous.get(); - previous = new IntWrapper(outPos.get()); - codec.headlessCompress(uncompressed2, new IntWrapper(), uncompressed2.length, compressed, outPos); - int length2 = outPos.get() - previous.get(); - - compressed = Arrays.copyOf(compressed, length1 + length2); - System.out - .println("compressed unsorted integers from " + uncompressed1.length * 4 + "B to " + length1 * 4 + "B"); - System.out - .println("compressed unsorted integers from " + uncompressed2.length * 4 + "B to " + length2 * 4 + "B"); - System.out.println("Total compressed output " + compressed.length); - - int[] recovered1 = new int[uncompressed1.length]; - int[] recovered2 = new int[uncompressed1.length]; - IntWrapper inPos = new IntWrapper(); - System.out.println("Decoding first array starting at pos = " + inPos); - codec.headlessUncompress(compressed, inPos, compressed.length, recovered1, new IntWrapper(0), - uncompressed1.length); - System.out.println("Decoding second array starting at pos = " + inPos); - codec.headlessUncompress(compressed, inPos, compressed.length, recovered2, new IntWrapper(0), - uncompressed2.length); - if (!Arrays.equals(uncompressed1, recovered1)) - throw new RuntimeException("First array does not match."); - if (!Arrays.equals(uncompressed2, recovered2)) - throw new RuntimeException("Second array does not match."); - System.out.println("The arrays match, your code is probably ok."); - - } + /** + * + */ + @Test + + public void superSimpleExample() { + IntegratedIntCompressor iic = new IntegratedIntCompressor(); + int[] data = new int[2342351]; + for (int k = 0; k < data.length; ++k) + data[k] = k; + System.out.println("Compressing " + data.length + " integers using friendly interface"); + int[] compressed = iic.compress(data); + int[] recov = iic.uncompress(compressed); + System.out + .println("compressed from " + data.length * 4 / 1024 + "KB to " + compressed.length * 4 / 1024 + "KB"); + if (!Arrays.equals(recov, data)) + throw new RuntimeException("bug"); + } + + /** + * + */ + @Test + + public void basicExample() { + int[] data = new int[2342351]; + System.out.println("Compressing " + data.length + " integers in one go"); + // data should be sorted for best + // results + for (int k = 0; k < data.length; ++k) + data[k] = k; + // Very important: the data is in sorted order!!! If not, you + // will get very poor compression with IntegratedBinaryPacking, + // you should use another CODEC. + + // next we compose a CODEC. Most of the processing + // will be done with binary packing, and leftovers will + // be processed using variable byte + IntegratedIntegerCODEC codec = new IntegratedComposition(new IntegratedBinaryPacking(), + new IntegratedVariableByte()); + // output vector should be large enough... + int[] compressed = new int[data.length + 1024]; + // compressed might not be large enough in some cases + // if you get java.lang.ArrayIndexOutOfBoundsException, try + // allocating more memory + + /** + * + * compressing + * + */ + IntWrapper inputoffset = new IntWrapper(0); + IntWrapper outputoffset = new IntWrapper(0); + codec.compress(data, inputoffset, data.length, compressed, outputoffset); + // got it! + // inputoffset should be at data.length but outputoffset tells + // us where we are... + System.out.println( + "compressed from " + data.length * 4 / 1024 + "KB to " + outputoffset.intValue() * 4 / 1024 + "KB"); + // we can repack the data: (optional) + compressed = Arrays.copyOf(compressed, outputoffset.intValue()); + + /** + * + * now uncompressing + * + * This assumes that we otherwise know how many integers have been + * compressed. See basicExampleHeadless for a more general case. + */ + int[] recovered = new int[data.length]; + IntWrapper recoffset = new IntWrapper(0); + codec.uncompress(compressed, new IntWrapper(0), compressed.length, recovered, recoffset); + if (Arrays.equals(data, recovered)) + System.out.println("data is recovered without loss"); + else + throw new RuntimeException("bug"); // could use assert + System.out.println(); + } + + /** + * Like the basicExample, but we store the input array size manually. + */ + @Test + public void basicExampleHeadless() { + int[] data = new int[2342351]; + System.out.println("Compressing " + data.length + " integers in one go using the headless approach"); + // data should be sorted for best + // results + for (int k = 0; k < data.length; ++k) + data[k] = k; + // Very important: the data is in sorted order!!! If not, you + // will get very poor compression with IntegratedBinaryPacking, + // you should use another CODEC. + + // next we compose a CODEC. Most of the processing + // will be done with binary packing, and leftovers will + // be processed using variable byte + SkippableIntegratedComposition codec = new SkippableIntegratedComposition(new IntegratedBinaryPacking(), + new IntegratedVariableByte()); + // output vector should be large enough... + int[] compressed = new int[data.length + 1024]; + // compressed might not be large enough in some cases + // if you get java.lang.ArrayIndexOutOfBoundsException, try + // allocating more memory + + /** + * + * compressing + * + */ + IntWrapper inputoffset = new IntWrapper(0); + IntWrapper outputoffset = new IntWrapper(1); + compressed[0] = data.length; // we manually store how many integers we + codec.headlessCompress(data, inputoffset, data.length, compressed, outputoffset, new IntWrapper(0)); + // got it! + // inputoffset should be at data.length but outputoffset tells + // us where we are... + System.out.println( + "compressed from " + data.length * 4 / 1024 + "KB to " + outputoffset.intValue() * 4 / 1024 + "KB"); + // we can repack the data: (optional) + compressed = Arrays.copyOf(compressed, outputoffset.intValue()); + + /** + * + * now uncompressing + * + */ + int howmany = compressed[0];// we manually stored the number of + // compressed integers + int[] recovered = new int[howmany]; + IntWrapper recoffset = new IntWrapper(0); + codec.headlessUncompress(compressed, new IntWrapper(1), compressed.length, recovered, recoffset, howmany, new IntWrapper(0)); + if (Arrays.equals(data, recovered)) + System.out.println("data is recovered without loss"); + else + throw new RuntimeException("bug"); // could use assert + System.out.println(); + } + + /** + * This is an example to show you can compress unsorted integers as long as + * most are small. + */ + @Test + public void unsortedExample() { + final int N = 1333333; + int[] data = new int[N]; + // initialize the data (most will be small + for (int k = 0; k < N; k += 1) + data[k] = 3; + // throw some larger values + for (int k = 0; k < N; k += 5) + data[k] = 100; + for (int k = 0; k < N; k += 533) + data[k] = 10000; + int[] compressed = new int[N + 1024];// could need more + IntegerCODEC codec = new Composition(new FastPFOR(), new VariableByte()); + // compressing + IntWrapper inputoffset = new IntWrapper(0); + IntWrapper outputoffset = new IntWrapper(0); + codec.compress(data, inputoffset, data.length, compressed, outputoffset); + System.out.println("compressed unsorted integers from " + data.length * 4 / 1024 + "KB to " + + outputoffset.intValue() * 4 / 1024 + "KB"); + // we can repack the data: (optional) + compressed = Arrays.copyOf(compressed, outputoffset.intValue()); + + int[] recovered = new int[N]; + IntWrapper recoffset = new IntWrapper(0); + codec.uncompress(compressed, new IntWrapper(0), compressed.length, recovered, recoffset); + if (Arrays.equals(data, recovered)) + System.out.println("data is recovered without loss"); + else + throw new RuntimeException("bug"); // could use assert + System.out.println(); + + } + + /** + * This is like the basic example, but we show how to process larger arrays + * in chunks. + * + * Some of this code was written by Pavel Klinov. + */ + @Test + public void advancedExample() { + int TotalSize = 2342351; // some arbitrary number + int ChunkSize = 16384; // size of each chunk, choose a multiple of 128 + System.out.println("Compressing " + TotalSize + " integers using chunks of " + ChunkSize + " integers (" + + ChunkSize * 4 / 1024 + "KB)"); + System.out.println("(It is often better for applications to work in chunks fitting in CPU cache.)"); + int[] data = new int[TotalSize]; + // data should be sorted for best + // results + for (int k = 0; k < data.length; ++k) + data[k] = k; + // next we compose a CODEC. Most of the processing + // will be done with binary packing, and leftovers will + // be processed using variable byte, using variable byte + // only for the last chunk! + IntegratedIntegerCODEC regularcodec = new IntegratedBinaryPacking(); + IntegratedVariableByte ivb = new IntegratedVariableByte(); + IntegratedIntegerCODEC lastcodec = new IntegratedComposition(regularcodec, ivb); + // output vector should be large enough... + int[] compressed = new int[TotalSize + 1024]; + + /** + * + * compressing + * + */ + IntWrapper inputoffset = new IntWrapper(0); + IntWrapper outputoffset = new IntWrapper(0); + for (int k = 0; k < TotalSize / ChunkSize; ++k) + regularcodec.compress(data, inputoffset, ChunkSize, compressed, outputoffset); + lastcodec.compress(data, inputoffset, TotalSize % ChunkSize, compressed, outputoffset); + // got it! + // inputoffset should be at data.length but outputoffset tells + // us where we are... + System.out.println( + "compressed from " + data.length * 4 / 1024 + "KB to " + outputoffset.intValue() * 4 / 1024 + "KB"); + // we can repack the data: + compressed = Arrays.copyOf(compressed, outputoffset.intValue()); + + /** + * + * now uncompressing + * + * We are *not* assuming that the original array length is known, + * however we assume that the chunk size (ChunkSize) is known. + * + */ + int[] recovered = new int[ChunkSize]; + IntWrapper compoff = new IntWrapper(0); + IntWrapper recoffset; + int currentpos = 0; + + while (compoff.get() < compressed.length) { + recoffset = new IntWrapper(0); + regularcodec.uncompress(compressed, compoff, compressed.length - compoff.get(), recovered, recoffset); + + if (recoffset.get() < ChunkSize) {// last chunk detected + ivb.uncompress(compressed, compoff, compressed.length - compoff.get(), recovered, recoffset); + } + for (int i = 0; i < recoffset.get(); ++i) { + if (data[currentpos + i] != recovered[i]) + throw new RuntimeException("bug"); // could use assert + } + currentpos += recoffset.get(); + } + System.out.println("data is recovered without loss"); + System.out.println(); + + } + + /** + * Demo of the headless approach where we must supply the array length + */ + @Test + public void headlessDemo() { + System.out.println("Compressing arrays with minimal header..."); + int[] uncompressed1 = { 1, 2, 1, 3, 1 }; + int[] uncompressed2 = { 3, 2, 4, 6, 1 }; + + int[] compressed = new int[uncompressed1.length + uncompressed2.length + 1024]; + + SkippableIntegerCODEC codec = new SkippableComposition(new BinaryPacking(), new VariableByte()); + + // compressing + IntWrapper outPos = new IntWrapper(); + + IntWrapper previous = new IntWrapper(); + + codec.headlessCompress(uncompressed1, new IntWrapper(), uncompressed1.length, compressed, outPos); + int length1 = outPos.get() - previous.get(); + previous = new IntWrapper(outPos.get()); + codec.headlessCompress(uncompressed2, new IntWrapper(), uncompressed2.length, compressed, outPos); + int length2 = outPos.get() - previous.get(); + + compressed = Arrays.copyOf(compressed, length1 + length2); + System.out + .println("compressed unsorted integers from " + uncompressed1.length * 4 + "B to " + length1 * 4 + "B"); + System.out + .println("compressed unsorted integers from " + uncompressed2.length * 4 + "B to " + length2 * 4 + "B"); + System.out.println("Total compressed output " + compressed.length); + + int[] recovered1 = new int[uncompressed1.length]; + int[] recovered2 = new int[uncompressed1.length]; + IntWrapper inPos = new IntWrapper(); + System.out.println("Decoding first array starting at pos = " + inPos); + codec.headlessUncompress(compressed, inPos, compressed.length, recovered1, new IntWrapper(0), + uncompressed1.length); + System.out.println("Decoding second array starting at pos = " + inPos); + codec.headlessUncompress(compressed, inPos, compressed.length, recovered2, new IntWrapper(0), + uncompressed2.length); + if (!Arrays.equals(uncompressed1, recovered1)) + throw new RuntimeException("First array does not match."); + if (!Arrays.equals(uncompressed2, recovered2)) + throw new RuntimeException("Second array does not match."); + System.out.println("The arrays match, your code is probably ok."); + + } } diff --git a/src/test/java/me/lemire/integercompression/ResourcedTest.java b/src/test/java/me/lemire/integercompression/ResourcedTest.java index 34f1d05..8316129 100644 --- a/src/test/java/me/lemire/integercompression/ResourcedTest.java +++ b/src/test/java/me/lemire/integercompression/ResourcedTest.java @@ -24,65 +24,65 @@ * */ public class ResourcedTest { - SkippableIntegerCODEC[] codecs = { new JustCopy(), new VariableByte(), - new SkippableComposition(new BinaryPacking(), new VariableByte()), - new SkippableComposition(new NewPFD(), new VariableByte()), - new SkippableComposition(new NewPFDS9(), new VariableByte()), - new SkippableComposition(new NewPFDS16(), new VariableByte()), - new SkippableComposition(new OptPFD(), new VariableByte()), - new SkippableComposition(new OptPFDS9(), new VariableByte()), - new SkippableComposition(new OptPFDS16(), new VariableByte()), - new SkippableComposition(new FastPFOR128(), new VariableByte()), - new SkippableComposition(new FastPFOR(), new VariableByte()), new Simple9(), new Simple16() }; + SkippableIntegerCODEC[] codecs = { new JustCopy(), new VariableByte(), + new SkippableComposition(new BinaryPacking(), new VariableByte()), + new SkippableComposition(new NewPFD(), new VariableByte()), + new SkippableComposition(new NewPFDS9(), new VariableByte()), + new SkippableComposition(new NewPFDS16(), new VariableByte()), + new SkippableComposition(new OptPFD(), new VariableByte()), + new SkippableComposition(new OptPFDS9(), new VariableByte()), + new SkippableComposition(new OptPFDS16(), new VariableByte()), + new SkippableComposition(new FastPFOR128(), new VariableByte()), + new SkippableComposition(new FastPFOR(), new VariableByte()), new Simple9(), new Simple16() }; - /** - * @throws IOException - * if the resource cannot be accessed (should be considered a - * bug) - * - */ - @Test - public void IntCompressorTest() throws IOException { - // next line requires Java8? - // int[] data = - // Files.lines(Paths.get("integers.txt")).mapToInt(Integer::parseInt).toArray(); - File f = new File("src/test/resources/integers.txt"); - System.out.println("loading test data from "+ f.getAbsolutePath()); - BufferedReader bfr = new BufferedReader(new FileReader(f)); - String line; - ArrayList ai = new ArrayList(); - while ((line = bfr.readLine()) != null) { - ai.add(Integer.parseInt(line)); - } - bfr.close(); - int[] data = new int[ai.size()]; - for (int k = 0; k < data.length; ++k) - data[k] = ai.get(k).intValue(); - ai = null; - // finally! - { - IntegratedIntCompressor iic = new IntegratedIntCompressor(); - int[] compressed = iic.compress(data); - int[] recovered = iic.uncompress(compressed); - Assert.assertArrayEquals(recovered, data); - } - for (SkippableIntegerCODEC C : codecs) { - IntCompressor iic = new IntCompressor(C); - int[] compressed = iic.compress(data); - int[] recovered = iic.uncompress(compressed); - Assert.assertArrayEquals(recovered, data); + /** + * @throws IOException + * if the resource cannot be accessed (should be considered a + * bug) + * + */ + @Test + public void IntCompressorTest() throws IOException { + // next line requires Java8? + // int[] data = + // Files.lines(Paths.get("integers.txt")).mapToInt(Integer::parseInt).toArray(); + File f = new File("src/test/resources/integers.txt"); + System.out.println("loading test data from "+ f.getAbsolutePath()); + BufferedReader bfr = new BufferedReader(new FileReader(f)); + String line; + ArrayList ai = new ArrayList(); + while ((line = bfr.readLine()) != null) { + ai.add(Integer.parseInt(line)); + } + bfr.close(); + int[] data = new int[ai.size()]; + for (int k = 0; k < data.length; ++k) + data[k] = ai.get(k).intValue(); + ai = null; + // finally! + { + IntegratedIntCompressor iic = new IntegratedIntCompressor(); + int[] compressed = iic.compress(data); + int[] recovered = iic.uncompress(compressed); + Assert.assertArrayEquals(recovered, data); + } + for (SkippableIntegerCODEC C : codecs) { + IntCompressor iic = new IntCompressor(C); + int[] compressed = iic.compress(data); + int[] recovered = iic.uncompress(compressed); + Assert.assertArrayEquals(recovered, data); - } - for (SkippableIntegerCODEC C : codecs) { - if (C instanceof SkippableIntegratedIntegerCODEC) { - IntegratedIntCompressor iic = new IntegratedIntCompressor((SkippableIntegratedIntegerCODEC) C); - int[] compressed = iic.compress(data); - int[] recovered = iic.uncompress(compressed); - Assert.assertArrayEquals(recovered, data); - } + } + for (SkippableIntegerCODEC C : codecs) { + if (C instanceof SkippableIntegratedIntegerCODEC) { + IntegratedIntCompressor iic = new IntegratedIntCompressor((SkippableIntegratedIntegerCODEC) C); + int[] compressed = iic.compress(data); + int[] recovered = iic.uncompress(compressed); + Assert.assertArrayEquals(recovered, data); + } - } + } - } + } } diff --git a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java index 93c1784..9018229 100644 --- a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java +++ b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java @@ -19,7 +19,7 @@ */ @SuppressWarnings({ "static-method" }) public class SkippableBasicTest { - final SkippableIntegerCODEC[] codecs = { + final SkippableIntegerCODEC[] codecs = { new JustCopy(), new VariableByte(), new SkippableComposition(new BinaryPacking(), new VariableByte()), diff --git a/src/test/java/me/lemire/longcompression/LongBasicTest.java b/src/test/java/me/lemire/longcompression/LongBasicTest.java index 5aa3551..ab306d4 100644 --- a/src/test/java/me/lemire/longcompression/LongBasicTest.java +++ b/src/test/java/me/lemire/longcompression/LongBasicTest.java @@ -47,33 +47,33 @@ public class LongBasicTest { new LongVariableByte(), new LongAs2IntsCodec()}; - /** + /** * This tests with a compressed array with various offset */ - @Test - public void saulTest() { - for (LongCODEC C : codecs) { - for (int x = 0; x < 50; ++x) { - long[] a = { 2, 3, 4, 5 }; - long[] b = new long[90]; - long[] c = new long[a.length]; - - IntWrapper aOffset = new IntWrapper(0); - IntWrapper bOffset = new IntWrapper(x); - C.compress(a, aOffset, a.length, b, bOffset); - int len = bOffset.get() - x; - - bOffset.set(x); - IntWrapper cOffset = new IntWrapper(0); - C.uncompress(b, bOffset, len, c, cOffset); - if(!Arrays.equals(a, c)) { - System.out.println("Problem with "+C); - } - assertArrayEquals(a, c); - - } - } - } + @Test + public void saulTest() { + for (LongCODEC C : codecs) { + for (int x = 0; x < 50; ++x) { + long[] a = { 2, 3, 4, 5 }; + long[] b = new long[90]; + long[] c = new long[a.length]; + + IntWrapper aOffset = new IntWrapper(0); + IntWrapper bOffset = new IntWrapper(x); + C.compress(a, aOffset, a.length, b, bOffset); + int len = bOffset.get() - x; + + bOffset.set(x); + IntWrapper cOffset = new IntWrapper(0); + C.uncompress(b, bOffset, len, c, cOffset); + if(!Arrays.equals(a, c)) { + System.out.println("Problem with "+C); + } + assertArrayEquals(a, c); + + } + } + } /** * */ @@ -167,16 +167,16 @@ public void varyingLengthTest2() { @Test public void checkVariousCases() { for (LongCODEC c : codecs) { - testZeroInZeroOut(c); - test(c, c, 5, 10); - test(c, c, 5, 14); - test(c, c, 2, 18); - // TODO Unclear which codec should manage an empty output array or not - // Some IntegerCodec does not output anything if the input is smaller than some block size - // testSpurious(c); - testUnsorted(c); - testUnsorted2(c); - testUnsorted3(c); + testZeroInZeroOut(c); + test(c, c, 5, 10); + test(c, c, 5, 14); + test(c, c, 2, 18); + // TODO Unclear which codec should manage an empty output array or not + // Some IntegerCodec does not output anything if the input is smaller than some block size + // testSpurious(c); + testUnsorted(c); + testUnsorted2(c); + testUnsorted3(c); } } @@ -273,7 +273,7 @@ private static void testCodec(LongCODEC c, LongCODEC co, buffer[0] = backupdata[0]; co.uncompress(dataout, inpos, thiscompsize - 1, buffer, outpos); if (!(c instanceof IntegratedLongCODEC)) - LongDelta.fastinverseDelta(buffer); + LongDelta.fastinverseDelta(buffer); // Check assertions. assertEquals("length is not match", outpos.get(), data[k].length); @@ -357,19 +357,19 @@ private void testUnsorted3(LongCODEC codec) { @Test public void fastPforTest() { // proposed by Stefan Ackermann (https://github.com/Stivo) - for (LongCODEC codec : codecs) { - int N = FastPFOR.BLOCK_SIZE; - long[] data = new long[N]; - for (int i = 0; i < N; i++) - data[i] = 0; - data[126] = -1; - long[] comp = LongTestUtils.compress(codec, Arrays.copyOf(data, N)); - long[] answer = LongTestUtils.uncompress(codec, comp, N); - for (int k = 0; k < N; ++k) - if (answer[k] != data[k]) - throw new RuntimeException("bug " + k + " " + answer[k] - + " != " + data[k]); - } + for (LongCODEC codec : codecs) { + int N = FastPFOR.BLOCK_SIZE; + long[] data = new long[N]; + for (int i = 0; i < N; i++) + data[i] = 0; + data[126] = -1; + long[] comp = LongTestUtils.compress(codec, Arrays.copyOf(data, N)); + long[] answer = LongTestUtils.uncompress(codec, comp, N); + for (int k = 0; k < N; ++k) + if (answer[k] != data[k]) + throw new RuntimeException("bug " + k + " " + answer[k] + + " != " + data[k]); + } } /** @@ -378,19 +378,19 @@ public void fastPforTest() { @Test public void fastPfor128Test() { // proposed by Stefan Ackermann (https://github.com/Stivo) - for (LongCODEC codec : codecs) { - int N = FastPFOR128.BLOCK_SIZE; - long[] data = new long[N]; - for (int i = 0; i < N; i++) - data[i] = 0; - data[126] = -1; - long[] comp = LongTestUtils.compress(codec, Arrays.copyOf(data, N)); - long[] answer = LongTestUtils.uncompress(codec, comp, N); - for (int k = 0; k < N; ++k) - if (answer[k] != data[k]) - throw new RuntimeException("bug " + k + " " + answer[k] - + " != " + data[k]); - } + for (LongCODEC codec : codecs) { + int N = FastPFOR128.BLOCK_SIZE; + long[] data = new long[N]; + for (int i = 0; i < N; i++) + data[i] = 0; + data[126] = -1; + long[] comp = LongTestUtils.compress(codec, Arrays.copyOf(data, N)); + long[] answer = LongTestUtils.uncompress(codec, comp, N); + for (int k = 0; k < N; ++k) + if (answer[k] != data[k]) + throw new RuntimeException("bug " + k + " " + answer[k] + + " != " + data[k]); + } } } diff --git a/src/test/java/me/lemire/longcompression/LongTestUtils.java b/src/test/java/me/lemire/longcompression/LongTestUtils.java index a44e665..4a30b41 100644 --- a/src/test/java/me/lemire/longcompression/LongTestUtils.java +++ b/src/test/java/me/lemire/longcompression/LongTestUtils.java @@ -127,7 +127,7 @@ protected static long[] uncompressHeadless(SkippableLongCODEC codec, long[] data return Arrays.copyOf(outBuf, outPos.get()); } - public static String longToBinaryWithLeading(long l) { - return String.format("%64s", Long.toBinaryString(l)).replace(' ', '0'); - } + public static String longToBinaryWithLeading(long l) { + return String.format("%64s", Long.toBinaryString(l)).replace(' ', '0'); + } } diff --git a/src/test/java/me/lemire/longcompression/SkippableLongBasicTest.java b/src/test/java/me/lemire/longcompression/SkippableLongBasicTest.java index e900c9c..d7f6f2c 100644 --- a/src/test/java/me/lemire/longcompression/SkippableLongBasicTest.java +++ b/src/test/java/me/lemire/longcompression/SkippableLongBasicTest.java @@ -78,15 +78,15 @@ public void varyingLengthTest() { for (SkippableLongCODEC c : codecs) { System.out.println("[SkippeableBasicTest.varyingLengthTest] codec = "+c); for (int L = 1; L <= 128; L++) { - long[] comp = LongTestUtils.compressHeadless(c, Arrays.copyOf(data, L)); - long[] answer = LongTestUtils.uncompressHeadless(c, comp, L); + long[] comp = LongTestUtils.compressHeadless(c, Arrays.copyOf(data, L)); + long[] answer = LongTestUtils.uncompressHeadless(c, comp, L); for (int k = 0; k < L; ++k) if (answer[k] != data[k]) throw new RuntimeException("bug "+c.toString()+" "+k+" "+answer[k]+" "+data[k]); } for (int L = 128; L <= N; L *= 2) { - long[] comp = LongTestUtils.compressHeadless(c, Arrays.copyOf(data, L)); - long[] answer = LongTestUtils.uncompressHeadless(c, comp, L); + long[] comp = LongTestUtils.compressHeadless(c, Arrays.copyOf(data, L)); + long[] answer = LongTestUtils.uncompressHeadless(c, comp, L); for (int k = 0; k < L; ++k) if (answer[k] != data[k]) throw new RuntimeException("bug"); @@ -123,16 +123,16 @@ public void varyingLengthTest2() { e.printStackTrace(); } for (int L = 1; L <= 128; L++) { - long[] comp = LongTestUtils.compressHeadless(c, Arrays.copyOf(data, L)); - long[] answer = LongTestUtils.uncompressHeadless(c, comp, L); + long[] comp = LongTestUtils.compressHeadless(c, Arrays.copyOf(data, L)); + long[] answer = LongTestUtils.uncompressHeadless(c, comp, L); for (int k = 0; k < L; ++k) if (answer[k] != data[k]) { - throw new RuntimeException("L=" + L + ": bug at k = "+k+" "+answer[k]+" "+data[k]+" for "+c.toString()); + throw new RuntimeException("L=" + L + ": bug at k = "+k+" "+answer[k]+" "+data[k]+" for "+c.toString()); } } for (int L = 128; L <= N; L *= 2) { - long[] comp = LongTestUtils.compressHeadless(c, Arrays.copyOf(data, L)); - long[] answer = LongTestUtils.uncompressHeadless(c, comp, L); + long[] comp = LongTestUtils.compressHeadless(c, Arrays.copyOf(data, L)); + long[] answer = LongTestUtils.uncompressHeadless(c, comp, L); for (int k = 0; k < L; ++k) if (answer[k] != data[k]) throw new RuntimeException("bug"); diff --git a/src/test/java/me/lemire/longcompression/TestLongAs2IntsCodec.java b/src/test/java/me/lemire/longcompression/TestLongAs2IntsCodec.java index 00bb52a..b247ed8 100644 --- a/src/test/java/me/lemire/longcompression/TestLongAs2IntsCodec.java +++ b/src/test/java/me/lemire/longcompression/TestLongAs2IntsCodec.java @@ -18,89 +18,89 @@ * @author Benoit Lacelle */ public class TestLongAs2IntsCodec { - final LongAs2IntsCodec codec = new LongAs2IntsCodec(); - - private void checkConsistency(LongCODEC codec, long[] array) { - { - long[] compressed = LongTestUtils.compress(codec, array); - long[] uncompressed = LongTestUtils.uncompress(codec, compressed, array.length); - - Assert.assertArrayEquals(array, uncompressed); - } - - if (codec instanceof ByteLongCODEC) { - byte[] compressed = LongTestUtils.compress((ByteLongCODEC) codec, array); - long[] uncompressed = LongTestUtils.uncompress((ByteLongCODEC) codec, compressed, array.length); - - Assert.assertArrayEquals(array, uncompressed); - } - - if (codec instanceof SkippableLongCODEC) { - long[] compressed = LongTestUtils.compressHeadless((SkippableLongCODEC) codec, array); - long[] uncompressed = - LongTestUtils.uncompressHeadless((SkippableLongCODEC) codec, compressed, array.length); - - Assert.assertArrayEquals(array, uncompressed); - } - } - - @Test - public void testCodec_Zero() { - checkConsistency(codec, new long[] { 0 }); - } - - @Test - public void testCodec_Minus1() { - checkConsistency(codec, new long[] { -1 }); - } - - @Test - public void testCodec_ZeroTimes8Minus1() { - checkConsistency(codec, new long[] { 0, 0, 0, 0, 0, 0, 0, 0, -1 }); - } - - @Test - public void testCodec_ZeroTimes127Minus1() { - long[] array = LongStream.concat(LongStream.range(0, 127).map(l -> 0), LongStream.of(-1)).toArray(); - - checkConsistency(codec, array); - } - - @Test - public void testCodec_ZeroTimes128Minus1() { - long[] array = LongStream.concat(LongStream.range(0, 128).map(l -> 0), LongStream.of(-1)).toArray(); - - checkConsistency(codec, array); - } - - @Test - public void testCodec_MinValue() { - checkConsistency(codec, new long[] { Long.MIN_VALUE }); - } - - @Test - public void testCodec_ZeroMinValue() { - checkConsistency(codec, new long[] { 0, Long.MIN_VALUE }); - } - - @Test - public void testCodec_allPowerOfTwo() { - checkConsistency(codec, new long[] { 1L << 42 }); - for (int i = 0; i < 64; i++) { - checkConsistency(codec, new long[] { 1L << i }); - } - } - - @Test - public void testCodec_ZeroThenAllPowerOfTwo() { - for (int i = 0; i < 64; i++) { - checkConsistency(codec, new long[] { 0, 1L << i }); - } - } - - @Test - public void testCodec_intermediateHighPowerOfTwo() { - Assert.assertEquals(3, LongTestUtils.compress((LongCODEC) codec, new long[] { 1L << 42 }).length); - } + final LongAs2IntsCodec codec = new LongAs2IntsCodec(); + + private void checkConsistency(LongCODEC codec, long[] array) { + { + long[] compressed = LongTestUtils.compress(codec, array); + long[] uncompressed = LongTestUtils.uncompress(codec, compressed, array.length); + + Assert.assertArrayEquals(array, uncompressed); + } + + if (codec instanceof ByteLongCODEC) { + byte[] compressed = LongTestUtils.compress((ByteLongCODEC) codec, array); + long[] uncompressed = LongTestUtils.uncompress((ByteLongCODEC) codec, compressed, array.length); + + Assert.assertArrayEquals(array, uncompressed); + } + + if (codec instanceof SkippableLongCODEC) { + long[] compressed = LongTestUtils.compressHeadless((SkippableLongCODEC) codec, array); + long[] uncompressed = + LongTestUtils.uncompressHeadless((SkippableLongCODEC) codec, compressed, array.length); + + Assert.assertArrayEquals(array, uncompressed); + } + } + + @Test + public void testCodec_Zero() { + checkConsistency(codec, new long[] { 0 }); + } + + @Test + public void testCodec_Minus1() { + checkConsistency(codec, new long[] { -1 }); + } + + @Test + public void testCodec_ZeroTimes8Minus1() { + checkConsistency(codec, new long[] { 0, 0, 0, 0, 0, 0, 0, 0, -1 }); + } + + @Test + public void testCodec_ZeroTimes127Minus1() { + long[] array = LongStream.concat(LongStream.range(0, 127).map(l -> 0), LongStream.of(-1)).toArray(); + + checkConsistency(codec, array); + } + + @Test + public void testCodec_ZeroTimes128Minus1() { + long[] array = LongStream.concat(LongStream.range(0, 128).map(l -> 0), LongStream.of(-1)).toArray(); + + checkConsistency(codec, array); + } + + @Test + public void testCodec_MinValue() { + checkConsistency(codec, new long[] { Long.MIN_VALUE }); + } + + @Test + public void testCodec_ZeroMinValue() { + checkConsistency(codec, new long[] { 0, Long.MIN_VALUE }); + } + + @Test + public void testCodec_allPowerOfTwo() { + checkConsistency(codec, new long[] { 1L << 42 }); + for (int i = 0; i < 64; i++) { + checkConsistency(codec, new long[] { 1L << i }); + } + } + + @Test + public void testCodec_ZeroThenAllPowerOfTwo() { + for (int i = 0; i < 64; i++) { + checkConsistency(codec, new long[] { 0, 1L << i }); + } + } + + @Test + public void testCodec_intermediateHighPowerOfTwo() { + Assert.assertEquals(3, LongTestUtils.compress((LongCODEC) codec, new long[] { 1L << 42 }).length); + } } diff --git a/src/test/java/me/lemire/longcompression/TestLongVariableByte.java b/src/test/java/me/lemire/longcompression/TestLongVariableByte.java index 15613f2..9ba3818 100644 --- a/src/test/java/me/lemire/longcompression/TestLongVariableByte.java +++ b/src/test/java/me/lemire/longcompression/TestLongVariableByte.java @@ -18,86 +18,86 @@ * @author Benoit Lacelle */ public class TestLongVariableByte { - final LongVariableByte codec = new LongVariableByte(); - - private void checkConsistency(LongCODEC codec, long[] array) { - { - long[] compressed = LongTestUtils.compress(codec, array); - long[] uncompressed = LongTestUtils.uncompress(codec, compressed, array.length); - - Assert.assertArrayEquals(array, uncompressed); - } - - if (codec instanceof ByteLongCODEC) { - byte[] compressed = LongTestUtils.compress((ByteLongCODEC) codec, array); - long[] uncompressed = LongTestUtils.uncompress((ByteLongCODEC) codec, compressed, array.length); - - Assert.assertArrayEquals(array, uncompressed); - } - - if (codec instanceof SkippableLongCODEC) { - long[] compressed = LongTestUtils.compressHeadless((SkippableLongCODEC) codec, array); - long[] uncompressed = - LongTestUtils.uncompressHeadless((SkippableLongCODEC) codec, compressed, array.length); - - Assert.assertArrayEquals(array, uncompressed); - } - } - - @Test - public void testCodec_ZeroMinus1() { - checkConsistency(codec, new long[] { -1 }); - } - - @Test - public void testCodec_ZeroTimes8Minus1() { - checkConsistency(codec, new long[] { 0, 0, 0, 0, 0, 0, 0, 0, -1 }); - } - - @Test - public void testCodec_ZeroTimes127Minus1() { - long[] array = LongStream.concat(LongStream.range(0, 127).map(l -> 0), LongStream.of(-1)).toArray(); - - checkConsistency(codec, array); - } - - @Test - public void testCodec_ZeroTimes128Minus1() { - long[] array = LongStream.concat(LongStream.range(0, 128).map(l -> 0), LongStream.of(-1)).toArray(); - - checkConsistency(codec, array); - } - - @Test - public void testCodec_MinValue() { - checkConsistency(codec, new long[] { Long.MIN_VALUE }); - } - - @Test - public void testCodec_ZeroMinValue() { - checkConsistency(codec, new long[] { 0, Long.MIN_VALUE }); - } - - @Test - public void testCodec_allPowerOfTwo() { - checkConsistency(codec, new long[] { 1L << 42 }); - for (int i = 0; i < 64; i++) { - checkConsistency(codec, new long[] { 1L << i }); - } - } - - @Test - public void testCodec_ZeroThenAllPowerOfTwo() { - for (int i = 0; i < 64; i++) { - checkConsistency(codec, new long[] { 0, 1L << i }); - } - } - - @Test - public void testCodec_intermediateHighPowerOfTwo() { - Assert.assertEquals(1, LongTestUtils.compress((LongCODEC) codec, new long[] { 1L << 42 }).length); - Assert.assertEquals(7, LongTestUtils.compress((ByteLongCODEC) codec, new long[] { 1L << 42 }).length); - Assert.assertEquals(1, LongTestUtils.compressHeadless((SkippableLongCODEC) codec, new long[] { 1L << 42 }).length); - } + final LongVariableByte codec = new LongVariableByte(); + + private void checkConsistency(LongCODEC codec, long[] array) { + { + long[] compressed = LongTestUtils.compress(codec, array); + long[] uncompressed = LongTestUtils.uncompress(codec, compressed, array.length); + + Assert.assertArrayEquals(array, uncompressed); + } + + if (codec instanceof ByteLongCODEC) { + byte[] compressed = LongTestUtils.compress((ByteLongCODEC) codec, array); + long[] uncompressed = LongTestUtils.uncompress((ByteLongCODEC) codec, compressed, array.length); + + Assert.assertArrayEquals(array, uncompressed); + } + + if (codec instanceof SkippableLongCODEC) { + long[] compressed = LongTestUtils.compressHeadless((SkippableLongCODEC) codec, array); + long[] uncompressed = + LongTestUtils.uncompressHeadless((SkippableLongCODEC) codec, compressed, array.length); + + Assert.assertArrayEquals(array, uncompressed); + } + } + + @Test + public void testCodec_ZeroMinus1() { + checkConsistency(codec, new long[] { -1 }); + } + + @Test + public void testCodec_ZeroTimes8Minus1() { + checkConsistency(codec, new long[] { 0, 0, 0, 0, 0, 0, 0, 0, -1 }); + } + + @Test + public void testCodec_ZeroTimes127Minus1() { + long[] array = LongStream.concat(LongStream.range(0, 127).map(l -> 0), LongStream.of(-1)).toArray(); + + checkConsistency(codec, array); + } + + @Test + public void testCodec_ZeroTimes128Minus1() { + long[] array = LongStream.concat(LongStream.range(0, 128).map(l -> 0), LongStream.of(-1)).toArray(); + + checkConsistency(codec, array); + } + + @Test + public void testCodec_MinValue() { + checkConsistency(codec, new long[] { Long.MIN_VALUE }); + } + + @Test + public void testCodec_ZeroMinValue() { + checkConsistency(codec, new long[] { 0, Long.MIN_VALUE }); + } + + @Test + public void testCodec_allPowerOfTwo() { + checkConsistency(codec, new long[] { 1L << 42 }); + for (int i = 0; i < 64; i++) { + checkConsistency(codec, new long[] { 1L << i }); + } + } + + @Test + public void testCodec_ZeroThenAllPowerOfTwo() { + for (int i = 0; i < 64; i++) { + checkConsistency(codec, new long[] { 0, 1L << i }); + } + } + + @Test + public void testCodec_intermediateHighPowerOfTwo() { + Assert.assertEquals(1, LongTestUtils.compress((LongCODEC) codec, new long[] { 1L << 42 }).length); + Assert.assertEquals(7, LongTestUtils.compress((ByteLongCODEC) codec, new long[] { 1L << 42 }).length); + Assert.assertEquals(1, LongTestUtils.compressHeadless((SkippableLongCODEC) codec, new long[] { 1L << 42 }).length); + } } diff --git a/src/test/java/me/lemire/longcompression/synth/LongClusteredDataGenerator.java b/src/test/java/me/lemire/longcompression/synth/LongClusteredDataGenerator.java index 5b90ee0..c964f6f 100644 --- a/src/test/java/me/lemire/longcompression/synth/LongClusteredDataGenerator.java +++ b/src/test/java/me/lemire/longcompression/synth/LongClusteredDataGenerator.java @@ -29,7 +29,7 @@ public LongClusteredDataGenerator() { } void fillUniform(long[] array, int offset, int length, long Min, long Max) { - long[] v = this.unidg.generateUniform(length, Max - Min); + long[] v = this.unidg.generateUniform(length, Max - Min); for (int k = 0; k < v.length; ++k) array[k + offset] = Min + v[k]; } @@ -70,7 +70,7 @@ void fillClustered(long[] array, int offset, int length, long Min, long Max) { * @return array containing the integers */ public long[] generateClustered(int N, long Max) { - long[] array = new long[N]; + long[] array = new long[N]; fillClustered(array, 0, N, 0, Max); return array; } @@ -82,7 +82,7 @@ public long[] generateClustered(int N, long Max) { * arguments are ignored */ public static void main(final String[] args) { - long[] example = (new LongClusteredDataGenerator()) + long[] example = (new LongClusteredDataGenerator()) .generateClustered(20, 1000); for (int k = 0; k < example.length; ++k) System.out.println(example[k]); diff --git a/src/test/java/me/lemire/longcompression/synth/LongUniformDataGenerator.java b/src/test/java/me/lemire/longcompression/synth/LongUniformDataGenerator.java index 4d435f2..4aa797b 100644 --- a/src/test/java/me/lemire/longcompression/synth/LongUniformDataGenerator.java +++ b/src/test/java/me/lemire/longcompression/synth/LongUniformDataGenerator.java @@ -59,12 +59,12 @@ long[] generateUniformHash(int N, long Max) { * output all longs from the range [0,Max) that are not in the array */ static long[] negate(long[] x, long Max) { - int newLength = saturatedCast(Max - x.length); - long[] ans = new long[newLength]; + int newLength = saturatedCast(Max - x.length); + long[] ans = new long[newLength]; int i = 0; int c = 0; for (int j = 0; j < x.length; ++j) { - long v = x[j]; + long v = x[j]; for (; i < v; ++i) ans[c++] = i; ++i; @@ -74,13 +74,13 @@ static long[] negate(long[] x, long Max) { return ans; } - private static int saturatedCast(long toInt) { - if (toInt > Integer.MAX_VALUE) { - return Integer.MAX_VALUE; - } else { - return (int) toInt; - } - } + private static int saturatedCast(long toInt) { + if (toInt > Integer.MAX_VALUE) { + return Integer.MAX_VALUE; + } else { + return (int) toInt; + } + } /** * generates randomly N distinct longs from 0 to Max. @@ -92,7 +92,7 @@ private static int saturatedCast(long toInt) { * @return an array containing randomly selected longs */ public long[] generateUniform(int N, long Max) { - assert N >= 0; + assert N >= 0; assert Max >= 0; if (N * 2 > Max) { return negate(generateUniform(saturatedCast(Max - N), Max), Max); From 9640566814326385a73c0f794f4c6d36050200d5 Mon Sep 17 00:00:00 2001 From: Piotr Rzysko Date: Mon, 29 Sep 2025 18:21:32 +0200 Subject: [PATCH 336/412] Fix variable-byte encoding of large longs Previously, the branch encoding longs in 9 bytes was unreachable because the condition `val < (1L << 63)` is always false. Only negative longs should be encoded using 10 bytes. --- .../longcompression/LongVariableByte.java | 4 ++-- .../longcompression/TestLongVariableByte.java | 18 ++++++++++++------ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/main/java/me/lemire/longcompression/LongVariableByte.java b/src/main/java/me/lemire/longcompression/LongVariableByte.java index ad2b0eb..884d538 100644 --- a/src/main/java/me/lemire/longcompression/LongVariableByte.java +++ b/src/main/java/me/lemire/longcompression/LongVariableByte.java @@ -90,7 +90,7 @@ public void headlessCompress(long[] in, IntWrapper inpos, int inlength, long[] o buf.put((byte) extract7bits(5, val)); buf.put((byte) extract7bits(6, val)); buf.put((byte) (extract7bitsmaskless(7, (val)) | (1 << 7))); - } else if (val >= 0 && val < (1L << 63)) { + } else if (val >= 0) { buf.put((byte) extract7bits(0, val)); buf.put((byte) extract7bits(1, val)); buf.put((byte) extract7bits(2, val)); @@ -175,7 +175,7 @@ public void compress(long[] in, IntWrapper inpos, int inlength, byte[] out, out[outpostmp++] = (byte) extract7bits(5, val); out[outpostmp++] = (byte) extract7bits(6, val); out[outpostmp++] = (byte) (extract7bitsmaskless(7, (val)) | (1 << 7)); - } else if (val >= 0 && val < (1L << 63)) { + } else if (val >= 0) { out[outpostmp++] = (byte) extract7bits(0, val); out[outpostmp++] = (byte) extract7bits(1, val); out[outpostmp++] = (byte) extract7bits(2, val); diff --git a/src/test/java/me/lemire/longcompression/TestLongVariableByte.java b/src/test/java/me/lemire/longcompression/TestLongVariableByte.java index ee1755a..3cb2a49 100644 --- a/src/test/java/me/lemire/longcompression/TestLongVariableByte.java +++ b/src/test/java/me/lemire/longcompression/TestLongVariableByte.java @@ -24,11 +24,17 @@ public LongCODEC getCodec() { } @Test - public void testCodec_intermediateHighPowerOfTwo() { - Assert.assertEquals(1, LongTestUtils.compress((LongCODEC) codec, new long[] { 1L << 42 }).length); - Assert.assertEquals(7, LongTestUtils.compress((ByteLongCODEC) codec, new long[] { 1L << 42 }).length); - Assert.assertEquals(1, - LongTestUtils.compressHeadless((SkippableLongCODEC) codec, new long[] { 1L << 42 }).length); - } + public void testCodec_allBitWidths() { + for (int bitWidth = 0; bitWidth <= 64; bitWidth++) { + long value = bitWidth == 0 ? 0 : 1L << (bitWidth - 1); + + int expectedSizeInBytes = Math.max(1, (bitWidth + 6) / 7); + int expectedSizeInLongs = (expectedSizeInBytes > 8) ? 2 : 1; + Assert.assertEquals(expectedSizeInLongs, LongTestUtils.compress((LongCODEC) codec, new long[] { value }).length); + Assert.assertEquals(expectedSizeInBytes, LongTestUtils.compress((ByteLongCODEC) codec, new long[] { value }).length); + Assert.assertEquals(expectedSizeInLongs, + LongTestUtils.compressHeadless((SkippableLongCODEC) codec, new long[] { value }).length); + } + } } From e19e01874753ca8492d76e50340d69fb796259d6 Mon Sep 17 00:00:00 2001 From: Piotr Rzysko Date: Mon, 29 Sep 2025 11:55:17 +0200 Subject: [PATCH 337/412] Compute max compressed length for SkippableIntegratedIntegerCODEC --- example.java | 6 +--- .../differential/IntegratedBinaryPacking.java | 12 ++++++- .../differential/IntegratedIntCompressor.java | 3 +- .../differential/IntegratedVariableByte.java | 10 ++++++ .../SkippableIntegratedComposition.java | 9 +++++ .../SkippableIntegratedIntegerCODEC.java | 17 ++++++++++ .../lemire/integercompression/AdhocTest.java | 6 ++-- .../integercompression/ExampleTest.java | 6 +--- .../SkippableBasicTest.java | 33 +++++++++++++++++++ 9 files changed, 87 insertions(+), 15 deletions(-) diff --git a/example.java b/example.java index 71ccd63..25acc0c 100644 --- a/example.java +++ b/example.java @@ -104,11 +104,7 @@ public static void basicExampleHeadless() { // be processed using variable byte SkippableIntegratedComposition codec = new SkippableIntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte()); - // output vector should be large enough... - int[] compressed = new int[data.length + 1024]; - // compressed might not be large enough in some cases - // if you get java.lang.ArrayIndexOutOfBoundsException, try - // allocating more memory + int[] compressed = new int[codec.maxHeadlessCompressedLength(new IntWrapper(0), data.length)]; /** * diff --git a/src/main/java/me/lemire/integercompression/differential/IntegratedBinaryPacking.java b/src/main/java/me/lemire/integercompression/differential/IntegratedBinaryPacking.java index 7e1c161..f50a367 100644 --- a/src/main/java/me/lemire/integercompression/differential/IntegratedBinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedBinaryPacking.java @@ -49,7 +49,8 @@ public class IntegratedBinaryPacking implements IntegratedIntegerCODEC, SkippableIntegratedIntegerCODEC { - static final int BLOCK_SIZE = 32; + public static final int BLOCK_SIZE = 32; + private static final int MAX_BIT_WIDTH = Integer.SIZE; @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, @@ -170,4 +171,13 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, initvalue.set(initoffset); inpos.set(tmpinpos); } + + @Override + public int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength) { + int blockCount = inlength / BLOCK_SIZE; + int headersSizeInInts = blockCount / Integer.BYTES + (blockCount % Integer.BYTES); + int blocksSizeInInts = blockCount * MAX_BIT_WIDTH; + compressedPositions.add(blockCount * BLOCK_SIZE); + return headersSizeInInts + blocksSizeInInts; + } } diff --git a/src/main/java/me/lemire/integercompression/differential/IntegratedIntCompressor.java b/src/main/java/me/lemire/integercompression/differential/IntegratedIntCompressor.java index 72159ba..ad6467a 100644 --- a/src/main/java/me/lemire/integercompression/differential/IntegratedIntCompressor.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedIntCompressor.java @@ -39,7 +39,8 @@ public IntegratedIntCompressor() { * @throws UncompressibleInputException if the data is too poorly compressible */ public int[] compress(int[] input) { - int [] compressed = new int[input.length + input.length / 100 + 1024]; + int maxCompressedLength = codec.maxHeadlessCompressedLength(new IntWrapper(0), input.length); + int [] compressed = new int[maxCompressedLength + 1]; // +1 to store the length of the input compressed[0] = input.length; IntWrapper outpos = new IntWrapper(1); IntWrapper initvalue = new IntWrapper(0); diff --git a/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java b/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java index 918a900..a577031 100644 --- a/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedVariableByte.java @@ -24,6 +24,8 @@ public class IntegratedVariableByte implements IntegratedIntegerCODEC, IntegratedByteIntegerCODEC, SkippableIntegratedIntegerCODEC { + private static final int MAX_BYTES_PER_INT = 5; + private static byte extract7bits(int i, long val) { return (byte)((val >> (7 * i)) & ((1 << 7) - 1)); } @@ -257,6 +259,14 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, inpos.set(p + (s!=0 ? 1 : 0)); } + @Override + public int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength) { + int maxLengthInBytes = inlength * MAX_BYTES_PER_INT; + int maxLengthInInts = (maxLengthInBytes + Integer.BYTES - 1) / Integer.BYTES; + compressedPositions.add(inlength); + return maxLengthInInts; + } + /** * Creates a new buffer of the requested size. * diff --git a/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedComposition.java b/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedComposition.java index abcc027..a1379ad 100644 --- a/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedComposition.java +++ b/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedComposition.java @@ -76,4 +76,13 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, F2.headlessUncompress(in, inpos, inlength, out, outpos,num,initvalue); } + @Override + public int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength) { + int init = compressedPositions.get(); + int maxLength = F1.maxHeadlessCompressedLength(compressedPositions, inlength); + maxLength += 1; // Add +1 for the potential F2 header. Question: is this header actually needed in the headless version? + inlength -= compressedPositions.get() - init; + maxLength += F2.maxHeadlessCompressedLength(compressedPositions, inlength); + return maxLength; + } } diff --git a/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedIntegerCODEC.java b/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedIntegerCODEC.java index 8b7fd4b..e2df754 100644 --- a/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedIntegerCODEC.java +++ b/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedIntegerCODEC.java @@ -71,4 +71,21 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num, IntWrapper initvalue); + /** + * Compute the maximum number of integers that might be required to store + * the compressed form of a given input array segment, without headers. + *

    + * This is useful to pre-allocate the output buffer before calling + * {@link #headlessCompress(int[], IntWrapper, int, int[], IntWrapper, IntWrapper)}. + *

    + * + * @param compressedPositions + * since not all schemes compress every input integer, this parameter + * returns how many input integers will actually be compressed. + * This is useful when composing multiple schemes. + * @param inlength + * number of integers to be compressed + * @return the maximum number of integers needed in the output array + */ + int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength); } diff --git a/src/test/java/me/lemire/integercompression/AdhocTest.java b/src/test/java/me/lemire/integercompression/AdhocTest.java index aa6718b..ea7800b 100644 --- a/src/test/java/me/lemire/integercompression/AdhocTest.java +++ b/src/test/java/me/lemire/integercompression/AdhocTest.java @@ -108,11 +108,11 @@ public void testIssue29b() { @Test public void testIssue41() { for (int x = 0; x < 64; x++) { - int[] a = { 2, 3, 4, 5 }; - int[] b = new int[90]; - int[] c = new int[a.length]; SkippableIntegratedIntegerCODEC codec = new SkippableIntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte()); + int[] a = { 2, 3, 4, 5 }; + int[] b = new int[x + codec.maxHeadlessCompressedLength(new IntWrapper(0), a.length)]; + int[] c = new int[a.length]; IntWrapper aOffset = new IntWrapper(0); IntWrapper bOffset = new IntWrapper(x); IntWrapper initValue = new IntWrapper(0); diff --git a/src/test/java/me/lemire/integercompression/ExampleTest.java b/src/test/java/me/lemire/integercompression/ExampleTest.java index ce10d18..62eb6f6 100644 --- a/src/test/java/me/lemire/integercompression/ExampleTest.java +++ b/src/test/java/me/lemire/integercompression/ExampleTest.java @@ -116,11 +116,7 @@ public void basicExampleHeadless() { // be processed using variable byte SkippableIntegratedComposition codec = new SkippableIntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte()); - // output vector should be large enough... - int[] compressed = new int[data.length + 1024]; - // compressed might not be large enough in some cases - // if you get java.lang.ArrayIndexOutOfBoundsException, try - // allocating more memory + int[] compressed = new int[codec.maxHeadlessCompressedLength(new IntWrapper(0), data.length)]; /** * diff --git a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java index 9018229..3c31305 100644 --- a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java +++ b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java @@ -9,8 +9,13 @@ import java.util.Arrays; +import me.lemire.integercompression.differential.IntegratedBinaryPacking; +import me.lemire.integercompression.differential.IntegratedVariableByte; +import me.lemire.integercompression.differential.SkippableIntegratedComposition; +import me.lemire.integercompression.differential.SkippableIntegratedIntegerCODEC; import org.junit.Test; +import static org.junit.Assert.assertTrue; /** * Just some basic sanity tests. @@ -147,5 +152,33 @@ public void varyingLengthTest2() { } } + @Test + public void testMaxHeadlessCompressedLength() { + testMaxHeadlessCompressedLength(new IntegratedBinaryPacking(), 16 * IntegratedBinaryPacking.BLOCK_SIZE); + testMaxHeadlessCompressedLength(new IntegratedVariableByte(), 128); + testMaxHeadlessCompressedLength(new SkippableIntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte()), 16 * IntegratedBinaryPacking.BLOCK_SIZE + 10); + } + + private static void testMaxHeadlessCompressedLength(SkippableIntegratedIntegerCODEC codec, int inlengthTo) { + // We test the worst-case scenario by making all deltas and the initial value negative. + int delta = -1; + int value = delta; + + for (int inlength = 0; inlength < inlengthTo; ++inlength) { + int[] input = new int[inlength]; + for (int i = 0; i < inlength; i++) { + input[i] = value; + value += delta; + } + int maxOutputLength = codec.maxHeadlessCompressedLength(new IntWrapper(), inlength); + int[] output = new int[maxOutputLength]; + IntWrapper outPos = new IntWrapper(); + + codec.headlessCompress(input, new IntWrapper(), inlength, output, outPos, new IntWrapper()); + // If we reach this point, no exception was thrown, which means the calculated output length was sufficient. + + assertTrue(maxOutputLength <= outPos.get() + 1); // +1 because SkippableIntegratedComposition always adds one extra integer for the potential header + } + } } From 32e374a350ccfa0764f5860b412028f2f3887231 Mon Sep 17 00:00:00 2001 From: Piotr Rzysko Date: Mon, 29 Sep 2025 13:36:07 +0200 Subject: [PATCH 338/412] Compute max compressed length for SkippableIntegerCODEC MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Calculating the maximum compressed length is now implemented for all schemes except: * Kamikaze — as stated in the Javadoc, it is not intended for production use. * VectorFastPFOR — it does not appear to be supported for production yet, as it is not included in the release package. --- example.java | 6 +- .../integercompression/BinaryPacking.java | 16 +++++- .../lemire/integercompression/FastPFOR.java | 21 ++++++- .../integercompression/FastPFOR128.java | 19 +++++++ .../integercompression/GroupSimple9.java | 8 ++- .../integercompression/IntCompressor.java | 3 +- .../lemire/integercompression/JustCopy.java | 6 ++ .../lemire/integercompression/Kamikaze.java | 7 ++- .../me/lemire/integercompression/NewPFD.java | 11 ++++ .../lemire/integercompression/NewPFDS16.java | 11 ++++ .../lemire/integercompression/NewPFDS9.java | 11 ++++ .../me/lemire/integercompression/OptPFD.java | 11 ++++ .../lemire/integercompression/OptPFDS16.java | 13 ++++- .../lemire/integercompression/OptPFDS9.java | 13 ++++- .../lemire/integercompression/Simple16.java | 8 ++- .../me/lemire/integercompression/Simple9.java | 6 ++ .../SkippableComposition.java | 10 ++++ .../SkippableIntegerCODEC.java | 17 ++++++ .../integercompression/VariableByte.java | 10 ++++ .../vector/VectorFastPFOR.java | 5 ++ .../lemire/integercompression/AdhocTest.java | 4 +- .../integercompression/ExampleTest.java | 6 +- .../SkippableBasicTest.java | 57 ++++++++++++++++++- .../lemire/integercompression/TestUtils.java | 2 +- 24 files changed, 263 insertions(+), 18 deletions(-) diff --git a/example.java b/example.java index 25acc0c..75dfb05 100644 --- a/example.java +++ b/example.java @@ -263,10 +263,12 @@ public static void headlessDemo() { int[] uncompressed1 = {1,2,1,3,1}; int[] uncompressed2 = {3,2,4,6,1}; - int[] compressed = new int[uncompressed1.length+uncompressed2.length+1024]; - SkippableIntegerCODEC codec = new SkippableComposition(new BinaryPacking(), new VariableByte()); + int maxCompressedLength = codec.maxHeadlessCompressedLength(new IntWrapper(0), uncompressed1.length) + + codec.maxHeadlessCompressedLength(new IntWrapper(0), uncompressed2.length); + int[] compressed = new int[maxCompressedLength]; + // compressing IntWrapper outPos = new IntWrapper(); diff --git a/src/main/java/me/lemire/integercompression/BinaryPacking.java b/src/main/java/me/lemire/integercompression/BinaryPacking.java index 8d5ff90..ce37ff0 100644 --- a/src/main/java/me/lemire/integercompression/BinaryPacking.java +++ b/src/main/java/me/lemire/integercompression/BinaryPacking.java @@ -37,8 +37,9 @@ * @author Daniel Lemire */ public final class BinaryPacking implements IntegerCODEC, SkippableIntegerCODEC { - final static int BLOCK_SIZE = 32; - + public final static int BLOCK_SIZE = 32; + private static final int MAX_BIT_WIDTH = Integer.SIZE; + @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { @@ -131,7 +132,16 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, outpos.add(outlength); inpos.set(tmpinpos); } - + + @Override + public int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength) { + int blockCount = inlength / BLOCK_SIZE; + int headersSizeInInts = blockCount / Integer.BYTES + (blockCount % Integer.BYTES); + int blocksSizeInInts = blockCount * MAX_BIT_WIDTH; + compressedPositions.add(blockCount * BLOCK_SIZE); + return headersSizeInInts + blocksSizeInInts; + } + @Override public String toString() { return this.getClass().getSimpleName(); diff --git a/src/main/java/me/lemire/integercompression/FastPFOR.java b/src/main/java/me/lemire/integercompression/FastPFOR.java index 47969f4..5475496 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR.java @@ -40,6 +40,13 @@ */ public class FastPFOR implements IntegerCODEC,SkippableIntegerCODEC { final static int OVERHEAD_OF_EACH_EXCEPT = 8; + private static final int OVERHEAD_OF_EACH_PAGE_IN_INTS = 36; // 1 int for the header + // 1 int for the byte array size + // 1 int for the bitmap + // 1 int for byte array padding (to align to 4 bytes) + // 32 to have enough space to bit-pack the exceptions + private static final int OVERHEAD_OF_EACH_BLOCK_IN_INTS = 1; // 1 byte for the number of bits allocated per truncated integer + // 1 byte for the number of exceptions /** * */ @@ -65,7 +72,7 @@ public class FastPFOR implements IntegerCODEC,SkippableIntegerCODEC { * @param pagesize * the desired page size (recommended value is FastPFOR.DEFAULT_PAGE_SIZE) */ - private FastPFOR(int pagesize) { + FastPFOR(int pagesize) { pageSize = pagesize; // Initiate arrrays. byteContainer = makeBuffer(3 * pageSize @@ -230,6 +237,18 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, } } + @Override + public int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength) { + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); + + int pageCount = (inlength + pageSize - 1) / pageSize; + int blockCount = inlength / BLOCK_SIZE; + + // getBestBFromData limits the memory used for exceptions so that the total size of the block does not exceed BLOCK_SIZE integers. + int blockSizeInInts = OVERHEAD_OF_EACH_BLOCK_IN_INTS + BLOCK_SIZE; + return OVERHEAD_OF_EACH_PAGE_IN_INTS * pageCount + blockSizeInInts * blockCount + 24; + } + private void decodePage(int[] in, IntWrapper inpos, int[] out, IntWrapper outpos, int thissize) { final int initpos = inpos.get(); diff --git a/src/main/java/me/lemire/integercompression/FastPFOR128.java b/src/main/java/me/lemire/integercompression/FastPFOR128.java index 83a3e1f..0557c62 100644 --- a/src/main/java/me/lemire/integercompression/FastPFOR128.java +++ b/src/main/java/me/lemire/integercompression/FastPFOR128.java @@ -23,6 +23,13 @@ */ public class FastPFOR128 implements IntegerCODEC,SkippableIntegerCODEC { final static int OVERHEAD_OF_EACH_EXCEPT = 8; + private static final int OVERHEAD_OF_EACH_PAGE_IN_INTS = 36; // 1 int for the header + // 1 int for the byte array size + // 1 int for the bitmap + // 1 int for byte array padding (to align to 4 bytes) + // 32 to have enough space to bit-pack the exceptions + private static final int OVERHEAD_OF_EACH_BLOCK_IN_INTS = 1; // 1 byte for the number of bits allocated per truncated integer + // 1 byte for the number of exceptions /** * */ @@ -209,6 +216,18 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, } } + @Override + public int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength) { + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); + + int pageCount = (inlength + pageSize - 1) / pageSize; + int blockCount = inlength / BLOCK_SIZE; + + // getBestBFromData limits the memory used for exceptions so that the total size of the block does not exceed BLOCK_SIZE integers. + int blockSizeInInts = OVERHEAD_OF_EACH_BLOCK_IN_INTS + BLOCK_SIZE; + return OVERHEAD_OF_EACH_PAGE_IN_INTS * pageCount + blockSizeInInts * blockCount + 24; + } + private void decodePage(int[] in, IntWrapper inpos, int[] out, IntWrapper outpos, int thissize) { final int initpos = inpos.get(); diff --git a/src/main/java/me/lemire/integercompression/GroupSimple9.java b/src/main/java/me/lemire/integercompression/GroupSimple9.java index a294080..bd8acfa 100644 --- a/src/main/java/me/lemire/integercompression/GroupSimple9.java +++ b/src/main/java/me/lemire/integercompression/GroupSimple9.java @@ -3549,4 +3549,10 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] o inpos.set(tmpinpos); } -} \ No newline at end of file + + @Override + public int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength) { + compressedPositions.add(inlength); + return inlength; + } +} diff --git a/src/main/java/me/lemire/integercompression/IntCompressor.java b/src/main/java/me/lemire/integercompression/IntCompressor.java index abaeea9..57b29f6 100644 --- a/src/main/java/me/lemire/integercompression/IntCompressor.java +++ b/src/main/java/me/lemire/integercompression/IntCompressor.java @@ -36,7 +36,8 @@ public IntCompressor() { * @throws UncompressibleInputException if the data is too poorly compressible */ public int[] compress(int[] input) { - int[] compressed = new int[input.length + input.length / 100 + 1024]; + int maxCompressedLength = codec.maxHeadlessCompressedLength(new IntWrapper(0), input.length); + int[] compressed = new int[maxCompressedLength + 1]; // +1 to store the length of the input // Store at index=0 the length of the input, hence enabling .headlessCompress compressed[0] = input.length; IntWrapper outpos = new IntWrapper(1); diff --git a/src/main/java/me/lemire/integercompression/JustCopy.java b/src/main/java/me/lemire/integercompression/JustCopy.java index 709b86a..f57282c 100644 --- a/src/main/java/me/lemire/integercompression/JustCopy.java +++ b/src/main/java/me/lemire/integercompression/JustCopy.java @@ -42,6 +42,12 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, } + @Override + public int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength) { + compressedPositions.add(inlength); + return inlength; + } + @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { diff --git a/src/main/java/me/lemire/integercompression/Kamikaze.java b/src/main/java/me/lemire/integercompression/Kamikaze.java index fd1ac82..4cab30b 100644 --- a/src/main/java/me/lemire/integercompression/Kamikaze.java +++ b/src/main/java/me/lemire/integercompression/Kamikaze.java @@ -38,6 +38,11 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] o } } + @Override + public int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength) { + throw new UnsupportedOperationException("Calculating the max compressed length is not supported yet."); + } + @Override public String toString() { return "Kamikaze's PForDelta"; @@ -64,4 +69,4 @@ public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, headlessUncompress(in, inpos, inlength, out, outpos, outlength); } -} \ No newline at end of file +} diff --git a/src/main/java/me/lemire/integercompression/NewPFD.java b/src/main/java/me/lemire/integercompression/NewPFD.java index 6dd01aa..3da3002 100644 --- a/src/main/java/me/lemire/integercompression/NewPFD.java +++ b/src/main/java/me/lemire/integercompression/NewPFD.java @@ -132,6 +132,17 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, decodePage(in, inpos, out, outpos, mynvalue); } + @Override + public int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength) { + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); + int blockCount = inlength / BLOCK_SIZE; + // +1 for the header + // getBestBFromData limits the memory used for exceptions so that the total size of the block does not exceed BLOCK_SIZE integers. + int maxBlockSizeInInts = 1 + BLOCK_SIZE; + compressedPositions.add(inlength); + return maxBlockSizeInInts * blockCount; + } + private void decodePage(int[] in, IntWrapper inpos, int[] out, IntWrapper outpos, int thissize) { int tmpoutpos = outpos.get(); diff --git a/src/main/java/me/lemire/integercompression/NewPFDS16.java b/src/main/java/me/lemire/integercompression/NewPFDS16.java index 98370d2..526b8fb 100644 --- a/src/main/java/me/lemire/integercompression/NewPFDS16.java +++ b/src/main/java/me/lemire/integercompression/NewPFDS16.java @@ -131,6 +131,17 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, decodePage(in, inpos, out, outpos, mynvalue); } + @Override + public int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength) { + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); + int blockCount = inlength / BLOCK_SIZE; + // +1 for the header + // getBestBFromData limits the memory used for exceptions so that the total size of the block does not exceed BLOCK_SIZE integers. + int maxBlockSizeInInts = 1 + BLOCK_SIZE; + compressedPositions.add(inlength); + return maxBlockSizeInInts * blockCount; + } + private void decodePage(int[] in, IntWrapper inpos, int[] out, IntWrapper outpos, int thissize) { int tmpoutpos = outpos.get(); diff --git a/src/main/java/me/lemire/integercompression/NewPFDS9.java b/src/main/java/me/lemire/integercompression/NewPFDS9.java index c8389c1..bd802b6 100644 --- a/src/main/java/me/lemire/integercompression/NewPFDS9.java +++ b/src/main/java/me/lemire/integercompression/NewPFDS9.java @@ -130,6 +130,17 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, decodePage(in, inpos, out, outpos, mynvalue); } + @Override + public int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength) { + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); + int blockCount = inlength / BLOCK_SIZE; + // +1 for the header + // getBestBFromData limits the memory used for exceptions so that the total size of the block does not exceed BLOCK_SIZE integers. + int maxBlockSizeInInts = 1 + BLOCK_SIZE; + compressedPositions.add(inlength); + return maxBlockSizeInInts * blockCount; + } + private void decodePage(int[] in, IntWrapper inpos, int[] out, IntWrapper outpos, int thissize) { int tmpoutpos = outpos.get(); diff --git a/src/main/java/me/lemire/integercompression/OptPFD.java b/src/main/java/me/lemire/integercompression/OptPFD.java index 8c90586..cfda92e 100644 --- a/src/main/java/me/lemire/integercompression/OptPFD.java +++ b/src/main/java/me/lemire/integercompression/OptPFD.java @@ -147,6 +147,17 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, decodePage(in, inpos, out, outpos, mynvalue); } + @Override + public int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength) { + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); + int blockCount = inlength / BLOCK_SIZE; + // +1 for the header + // getBestBFromData limits the memory used for exceptions so that the total size of the block does not exceed BLOCK_SIZE integers. + int maxBlockSizeInInts = 1 + BLOCK_SIZE; + compressedPositions.add(inlength); + return maxBlockSizeInInts * blockCount; + } + private void decodePage(int[] in, IntWrapper inpos, int[] out, IntWrapper outpos, int thissize) { int tmpoutpos = outpos.get(); diff --git a/src/main/java/me/lemire/integercompression/OptPFDS16.java b/src/main/java/me/lemire/integercompression/OptPFDS16.java index 8574b10..95c4f62 100644 --- a/src/main/java/me/lemire/integercompression/OptPFDS16.java +++ b/src/main/java/me/lemire/integercompression/OptPFDS16.java @@ -147,6 +147,17 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, decodePage(in, inpos, out, outpos, mynvalue); } + @Override + public int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength) { + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); + int blockCount = inlength / BLOCK_SIZE; + // +1 for the header + // getBestBFromData limits the memory used for exceptions so that the total size of the block does not exceed BLOCK_SIZE integers. + int maxBlockSizeInInts = 1 + BLOCK_SIZE; + compressedPositions.add(inlength); + return maxBlockSizeInInts * blockCount; + } + private void decodePage(int[] in, IntWrapper inpos, int[] out, IntWrapper outpos, int thissize) { int tmpoutpos = outpos.get(); @@ -197,4 +208,4 @@ public String toString() { return this.getClass().getSimpleName(); } -} \ No newline at end of file +} diff --git a/src/main/java/me/lemire/integercompression/OptPFDS9.java b/src/main/java/me/lemire/integercompression/OptPFDS9.java index 34f4206..0e2563b 100644 --- a/src/main/java/me/lemire/integercompression/OptPFDS9.java +++ b/src/main/java/me/lemire/integercompression/OptPFDS9.java @@ -146,6 +146,17 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, decodePage(in, inpos, out, outpos, mynvalue); } + @Override + public int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength) { + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); + int blockCount = inlength / BLOCK_SIZE; + // +1 for the header + // getBestBFromData limits the memory used for exceptions so that the total size of the block does not exceed BLOCK_SIZE integers. + int maxBlockSizeInInts = 1 + BLOCK_SIZE; + compressedPositions.add(inlength); + return maxBlockSizeInInts * blockCount; + } + private void decodePage(int[] in, IntWrapper inpos, int[] out, IntWrapper outpos, int thissize) { int tmpoutpos = outpos.get(); @@ -197,4 +208,4 @@ public String toString() { return this.getClass().getSimpleName(); } -} \ No newline at end of file +} diff --git a/src/main/java/me/lemire/integercompression/Simple16.java b/src/main/java/me/lemire/integercompression/Simple16.java index cdc7308..2b7f27f 100644 --- a/src/main/java/me/lemire/integercompression/Simple16.java +++ b/src/main/java/me/lemire/integercompression/Simple16.java @@ -103,6 +103,12 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] o outpos.set(i_outpos); } + @Override + public int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength) { + compressedPositions.add(inlength); + return inlength; + } + /** * Uncompress data from an array to another array. * @@ -182,4 +188,4 @@ public String toString() { { 7, 7, 7, 7 }, { 10, 9, 9, }, { 14, 14 }, { 28 } }; private static final int[][] SHIFTED_S16_BITS = shiftme(S16_BITS); -} \ No newline at end of file +} diff --git a/src/main/java/me/lemire/integercompression/Simple9.java b/src/main/java/me/lemire/integercompression/Simple9.java index 4864756..fd5194d 100644 --- a/src/main/java/me/lemire/integercompression/Simple9.java +++ b/src/main/java/me/lemire/integercompression/Simple9.java @@ -268,6 +268,12 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] o } + @Override + public int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength) { + compressedPositions.add(inlength); + return inlength; + } + @Override public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { if (inlength == 0) diff --git a/src/main/java/me/lemire/integercompression/SkippableComposition.java b/src/main/java/me/lemire/integercompression/SkippableComposition.java index 5faf7c2..7dd4736 100644 --- a/src/main/java/me/lemire/integercompression/SkippableComposition.java +++ b/src/main/java/me/lemire/integercompression/SkippableComposition.java @@ -61,6 +61,16 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] o F2.headlessUncompress(in, inpos, inlength, out, outpos, num); } + @Override + public int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength) { + int init = compressedPositions.get(); + int maxLength = F1.maxHeadlessCompressedLength(compressedPositions, inlength); + maxLength += 1; // Add +1 for the potential F2 header. Question: is this header actually needed in the headless version? + inlength -= compressedPositions.get() - init; + maxLength += F2.maxHeadlessCompressedLength(compressedPositions, inlength); + return maxLength; + } + @Override public String toString() { return F1.toString() + "+" + F2.toString(); diff --git a/src/main/java/me/lemire/integercompression/SkippableIntegerCODEC.java b/src/main/java/me/lemire/integercompression/SkippableIntegerCODEC.java index 66143b9..b9bdc04 100644 --- a/src/main/java/me/lemire/integercompression/SkippableIntegerCODEC.java +++ b/src/main/java/me/lemire/integercompression/SkippableIntegerCODEC.java @@ -69,4 +69,21 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num); + /** + * Compute the maximum number of integers that might be required to store + * the compressed form of a given input array segment, without headers. + *

    + * This is useful to pre-allocate the output buffer before calling + * {@link #headlessCompress(int[], IntWrapper, int, int[], IntWrapper)}. + *

    + * + * @param compressedPositions + * since not all schemes compress every input integer, this parameter + * returns how many input integers will actually be compressed. + * This is useful when composing multiple schemes. + * @param inlength + * number of integers to be compressed + * @return the maximum number of integers needed in the output array + */ + int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength); } diff --git a/src/main/java/me/lemire/integercompression/VariableByte.java b/src/main/java/me/lemire/integercompression/VariableByte.java index 92cfaeb..c9b04d0 100644 --- a/src/main/java/me/lemire/integercompression/VariableByte.java +++ b/src/main/java/me/lemire/integercompression/VariableByte.java @@ -21,6 +21,8 @@ */ public class VariableByte implements IntegerCODEC, ByteIntegerCODEC, SkippableIntegerCODEC { + private static final int MAX_BYTES_PER_INT = 5; + private static byte extract7bits(int i, long val) { return (byte) ((val >> (7 * i)) & ((1 << 7) - 1)); } @@ -208,6 +210,14 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] o inpos.set(p + (s!=0 ? 1 : 0)); } + @Override + public int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength) { + int maxLengthInBytes = inlength * MAX_BYTES_PER_INT; + int maxLengthInInts = (maxLengthInBytes + Integer.BYTES - 1) / Integer.BYTES; + compressedPositions.add(inlength); + return maxLengthInInts; + } + /** * Creates a new buffer of the requested size. * diff --git a/src/main/java/me/lemire/integercompression/vector/VectorFastPFOR.java b/src/main/java/me/lemire/integercompression/vector/VectorFastPFOR.java index 0b6ca17..7374fa5 100644 --- a/src/main/java/me/lemire/integercompression/vector/VectorFastPFOR.java +++ b/src/main/java/me/lemire/integercompression/vector/VectorFastPFOR.java @@ -229,6 +229,11 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, } } + @Override + public int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength) { + throw new UnsupportedOperationException("Calculating the max compressed length is not supported yet."); + } + private void loadMetaData(int[] in, int inexcept, int bytesize) { // Arrays.fill(bem, (byte)0); int len = (bytesize + 3) / 4; diff --git a/src/test/java/me/lemire/integercompression/AdhocTest.java b/src/test/java/me/lemire/integercompression/AdhocTest.java index ea7800b..ee911b3 100644 --- a/src/test/java/me/lemire/integercompression/AdhocTest.java +++ b/src/test/java/me/lemire/integercompression/AdhocTest.java @@ -86,10 +86,10 @@ public void testIssue29() { @Test public void testIssue29b() { for(int x = 0; x < 64; x++) { + SkippableIntegerCODEC codec = new SkippableComposition(new BinaryPacking(), new VariableByte()); int[] a = {2, 3, 4, 5}; - int[] b = new int[90]; + int[] b = new int[x + codec.maxHeadlessCompressedLength(new IntWrapper(0), a.length)]; int[] c = new int[a.length]; - SkippableIntegerCODEC codec = new SkippableComposition(new BinaryPacking(), new VariableByte()); IntWrapper aOffset = new IntWrapper(0); IntWrapper bOffset = new IntWrapper(x); codec.headlessCompress(a, aOffset, a.length, b, bOffset); diff --git a/src/test/java/me/lemire/integercompression/ExampleTest.java b/src/test/java/me/lemire/integercompression/ExampleTest.java index 62eb6f6..c63c69b 100644 --- a/src/test/java/me/lemire/integercompression/ExampleTest.java +++ b/src/test/java/me/lemire/integercompression/ExampleTest.java @@ -276,10 +276,12 @@ public void headlessDemo() { int[] uncompressed1 = { 1, 2, 1, 3, 1 }; int[] uncompressed2 = { 3, 2, 4, 6, 1 }; - int[] compressed = new int[uncompressed1.length + uncompressed2.length + 1024]; - SkippableIntegerCODEC codec = new SkippableComposition(new BinaryPacking(), new VariableByte()); + int maxCompressedLength = codec.maxHeadlessCompressedLength(new IntWrapper(0), uncompressed1.length) + + codec.maxHeadlessCompressedLength(new IntWrapper(0), uncompressed2.length); + int[] compressed = new int[maxCompressedLength]; + // compressing IntWrapper outPos = new IntWrapper(); diff --git a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java index 3c31305..57a07e3 100644 --- a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java +++ b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java @@ -53,10 +53,11 @@ public void consistentTest() { for (SkippableIntegerCODEC c : codecs) { System.out.println("[SkippeableBasicTest.consistentTest] codec = " + c); - int[] outBuf = new int[N + 1024]; for (int n = 0; n <= N; ++n) { IntWrapper inPos = new IntWrapper(); IntWrapper outPos = new IntWrapper(); + int[] outBuf = new int[c.maxHeadlessCompressedLength(new IntWrapper(0), n)]; + c.headlessCompress(data, inPos, n, outBuf, outPos); IntWrapper inPoso = new IntWrapper(); @@ -157,6 +158,33 @@ public void testMaxHeadlessCompressedLength() { testMaxHeadlessCompressedLength(new IntegratedBinaryPacking(), 16 * IntegratedBinaryPacking.BLOCK_SIZE); testMaxHeadlessCompressedLength(new IntegratedVariableByte(), 128); testMaxHeadlessCompressedLength(new SkippableIntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte()), 16 * IntegratedBinaryPacking.BLOCK_SIZE + 10); + + testMaxHeadlessCompressedLength(new BinaryPacking(), 16 * BinaryPacking.BLOCK_SIZE, 32); + testMaxHeadlessCompressedLength(new VariableByte(), 128, 32); + testMaxHeadlessCompressedLength(new SkippableComposition(new BinaryPacking(), new VariableByte()), 16 * BinaryPacking.BLOCK_SIZE + 10, 32); + testMaxHeadlessCompressedLength(new JustCopy(), 128, 32); + testMaxHeadlessCompressedLength(new Simple9(), 128, 28); + testMaxHeadlessCompressedLength(new Simple16(), 128, 28); + testMaxHeadlessCompressedLength(new GroupSimple9(), 128, 28); + testMaxHeadlessCompressedLength(new OptPFD(), 4 * OptPFD.BLOCK_SIZE, 32); + testMaxHeadlessCompressedLength(new SkippableComposition(new OptPFD(), new VariableByte()), 4 * OptPFD.BLOCK_SIZE + 10, 32); + testMaxHeadlessCompressedLength(new OptPFDS9(), 4 * OptPFDS9.BLOCK_SIZE, 32); + testMaxHeadlessCompressedLength(new SkippableComposition(new OptPFDS9(), new VariableByte()), 4 * OptPFDS9.BLOCK_SIZE + 10, 32); + testMaxHeadlessCompressedLength(new OptPFDS16(), 4 * OptPFDS16.BLOCK_SIZE, 32); + testMaxHeadlessCompressedLength(new SkippableComposition(new OptPFDS9(), new VariableByte()), 4 * OptPFDS16.BLOCK_SIZE + 10, 32); + testMaxHeadlessCompressedLength(new NewPFD(), 4 * NewPFD.BLOCK_SIZE, 32); + testMaxHeadlessCompressedLength(new SkippableComposition(new NewPFD(), new VariableByte()), 4 * NewPFD.BLOCK_SIZE + 10, 32); + testMaxHeadlessCompressedLength(new NewPFDS9(), 4 * NewPFDS9.BLOCK_SIZE, 32); + testMaxHeadlessCompressedLength(new SkippableComposition(new NewPFDS9(), new VariableByte()), 4 * NewPFDS9.BLOCK_SIZE + 10, 32); + testMaxHeadlessCompressedLength(new NewPFDS16(), 4 * NewPFDS16.BLOCK_SIZE, 32); + testMaxHeadlessCompressedLength(new SkippableComposition(new NewPFDS16(), new VariableByte()), 4 * NewPFDS16.BLOCK_SIZE + 10, 32); + + int fastPfor128PageSize = FastPFOR128.BLOCK_SIZE * 4; // smaller page size than the default to speed up the test + testMaxHeadlessCompressedLength(new FastPFOR128(fastPfor128PageSize), 2 * fastPfor128PageSize, 32); + testMaxHeadlessCompressedLength(new SkippableComposition(new FastPFOR128(fastPfor128PageSize), new VariableByte()), 2 * fastPfor128PageSize + 10, 32); + int fastPforPageSize = FastPFOR.BLOCK_SIZE * 4; // smaller page size than the default to speed up the test + testMaxHeadlessCompressedLength(new FastPFOR(fastPforPageSize), 2 * fastPforPageSize, 32); + testMaxHeadlessCompressedLength(new SkippableComposition(new FastPFOR(fastPforPageSize), new VariableByte()), 2 * fastPforPageSize + 10, 32); } private static void testMaxHeadlessCompressedLength(SkippableIntegratedIntegerCODEC codec, int inlengthTo) { @@ -181,4 +209,31 @@ private static void testMaxHeadlessCompressedLength(SkippableIntegratedIntegerCO assertTrue(maxOutputLength <= outPos.get() + 1); // +1 because SkippableIntegratedComposition always adds one extra integer for the potential header } } + + private static void testMaxHeadlessCompressedLength(SkippableIntegerCODEC codec, int inlengthTo, int maxBitWidth) { + // Some schemes ignore bit widths between 21 and 31. Therefore, in addition to maxBitWidth - 1, we also test 20. + assertTrue(maxBitWidth >= 20); + int[] regularValueBitWidths = { 20, maxBitWidth - 1 }; + + for (int inlength = 0; inlength < inlengthTo; ++inlength) { + int[] input = new int[inlength]; + + int maxOutputLength = codec.maxHeadlessCompressedLength(new IntWrapper(), inlength); + int[] output = new int[maxOutputLength]; + + for (int exceptionCount = 0; exceptionCount < inlength; exceptionCount++) { + int exception = maxBitWidth == 32 ? -1 : (1 << maxBitWidth) - 1; + + for (int regularValueBitWidth : regularValueBitWidths) { + int regularValue = regularValueBitWidth == 32 ? -1 : (1 << regularValueBitWidth) - 1; + + Arrays.fill(input, 0, exceptionCount, exception); + Arrays.fill(input, exceptionCount, input.length, regularValue); + + codec.headlessCompress(input, new IntWrapper(), inlength, output, new IntWrapper()); + // If we reach this point, no exception was thrown, which means the calculated output length was sufficient. + } + } + } + } } diff --git a/src/test/java/me/lemire/integercompression/TestUtils.java b/src/test/java/me/lemire/integercompression/TestUtils.java index 7ce51b3..b3cbff3 100644 --- a/src/test/java/me/lemire/integercompression/TestUtils.java +++ b/src/test/java/me/lemire/integercompression/TestUtils.java @@ -165,7 +165,7 @@ protected static int[] uncompress(ByteIntegerCODEC codec, byte[] data, int len) } protected static int[] compressHeadless(SkippableIntegerCODEC codec, int[] data) { - int[] outBuf = new int[data.length * 4]; + int[] outBuf = new int[codec.maxHeadlessCompressedLength(new IntWrapper(0), data.length)]; IntWrapper inPos = new IntWrapper(); IntWrapper outPos = new IntWrapper(); codec.headlessCompress(data, inPos, data.length, outBuf, outPos); From 6b86ee3dd0ce92545d07ef722209c49a1eb59ff3 Mon Sep 17 00:00:00 2001 From: Piotr Rzysko Date: Mon, 29 Sep 2025 14:11:33 +0200 Subject: [PATCH 339/412] Compute max compressed length for SkippableLongCODEC --- .../longcompression/LongBinaryPacking.java | 14 ++++++++-- .../longcompression/LongCompressor.java | 3 ++- .../lemire/longcompression/LongJustCopy.java | 6 +++++ .../longcompression/LongVariableByte.java | 9 +++++++ .../longcompression/SkippableLongCODEC.java | 17 ++++++++++++ .../SkippableLongComposition.java | 10 +++++++ .../lemire/longcompression/LongTestUtils.java | 2 +- .../SkippableLongBasicTest.java | 26 ++++++++++++++++++- 8 files changed, 82 insertions(+), 5 deletions(-) diff --git a/src/main/java/me/lemire/longcompression/LongBinaryPacking.java b/src/main/java/me/lemire/longcompression/LongBinaryPacking.java index 33bb8f1..b6ea58f 100644 --- a/src/main/java/me/lemire/longcompression/LongBinaryPacking.java +++ b/src/main/java/me/lemire/longcompression/LongBinaryPacking.java @@ -23,8 +23,9 @@ * @author Benoit Lacelle */ public final class LongBinaryPacking implements LongCODEC, SkippableLongCODEC { - final static int BLOCK_SIZE = 64; - + public final static int BLOCK_SIZE = 64; + private static final int MAX_BIT_WIDTH = Long.SIZE; + @Override public void compress(long[] in, IntWrapper inpos, int inlength, long[] out, IntWrapper outpos) { @@ -136,6 +137,15 @@ public void headlessUncompress(long[] in, IntWrapper inpos, int inlength, inpos.set(tmpinpos); } + @Override + public int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength) { + int blockCount = inlength / BLOCK_SIZE; + int headersSizeInLongs = blockCount / Long.BYTES + (blockCount % Long.BYTES); + int blocksSizeInLongs = blockCount * MAX_BIT_WIDTH; + compressedPositions.add(blockCount * BLOCK_SIZE); + return headersSizeInLongs + blocksSizeInLongs; + } + @Override public String toString() { return this.getClass().getSimpleName(); diff --git a/src/main/java/me/lemire/longcompression/LongCompressor.java b/src/main/java/me/lemire/longcompression/LongCompressor.java index a2c79fd..ae1dd1a 100644 --- a/src/main/java/me/lemire/longcompression/LongCompressor.java +++ b/src/main/java/me/lemire/longcompression/LongCompressor.java @@ -40,7 +40,8 @@ public LongCompressor() { * @throws UncompressibleInputException if the data is too poorly compressible */ public long[] compress(long[] input) { - long[] compressed = new long[input.length + input.length / 100 + 1024]; + int maxCompressedLength = codec.maxHeadlessCompressedLength(new IntWrapper(0), input.length); + long[] compressed = new long[maxCompressedLength + 1]; // +1 to store the length of the input // Store at index=0 the length of the input, hence enabling .headlessCompress compressed[0] = input.length; IntWrapper outpos = new IntWrapper(1); diff --git a/src/main/java/me/lemire/longcompression/LongJustCopy.java b/src/main/java/me/lemire/longcompression/LongJustCopy.java index 9b25f71..95abc1e 100644 --- a/src/main/java/me/lemire/longcompression/LongJustCopy.java +++ b/src/main/java/me/lemire/longcompression/LongJustCopy.java @@ -43,6 +43,12 @@ public void headlessUncompress(long[] in, IntWrapper inpos, int inlength, } + @Override + public int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength) { + compressedPositions.add(inlength); + return inlength; + } + @Override public void compress(long[] in, IntWrapper inpos, int inlength, long[] out, IntWrapper outpos) { diff --git a/src/main/java/me/lemire/longcompression/LongVariableByte.java b/src/main/java/me/lemire/longcompression/LongVariableByte.java index ad2b0eb..e60ebd0 100644 --- a/src/main/java/me/lemire/longcompression/LongVariableByte.java +++ b/src/main/java/me/lemire/longcompression/LongVariableByte.java @@ -22,6 +22,7 @@ * @author Benoit Lacelle */ public class LongVariableByte implements LongCODEC, ByteLongCODEC, SkippableLongCODEC { + private static final int MAX_BYTES_PER_INT = 10; private static byte extract7bits(int i, long val) { return (byte) ((val >>> (7 * i)) & ((1 << 7) - 1)); @@ -326,6 +327,14 @@ public void headlessUncompress(long[] in, IntWrapper inpos, int inlength, long[] inpos.set(p + (s!=0 ? 1 : 0)); } + @Override + public int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength) { + int maxLengthInBytes = inlength * MAX_BYTES_PER_INT; + int maxLengthInLongs = (maxLengthInBytes + Long.BYTES - 1) / Long.BYTES; + compressedPositions.add(inlength); + return maxLengthInLongs; + } + /** * Creates a new buffer of the requested size. * diff --git a/src/main/java/me/lemire/longcompression/SkippableLongCODEC.java b/src/main/java/me/lemire/longcompression/SkippableLongCODEC.java index 7fe1fe5..33fd562 100644 --- a/src/main/java/me/lemire/longcompression/SkippableLongCODEC.java +++ b/src/main/java/me/lemire/longcompression/SkippableLongCODEC.java @@ -67,4 +67,21 @@ public void headlessCompress(long[] in, IntWrapper inpos, int inlength, long[] o public void headlessUncompress(long[] in, IntWrapper inpos, int inlength, long[] out, IntWrapper outpos, int num); + /** + * Compute the maximum number of longs that might be required to store + * the compressed form of a given input array segment, without headers. + *

    + * This is useful to pre-allocate the output buffer before calling + * {@link #headlessCompress(long[], IntWrapper, int, long[], IntWrapper)}. + *

    + * + * @param compressedPositions + * since not all schemes compress every input integer, this parameter + * returns how many input integers will actually be compressed. + * This is useful when composing multiple schemes. + * @param inlength + * number of longs to be compressed + * @return the maximum number of longs needed in the output array + */ + int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength); } diff --git a/src/main/java/me/lemire/longcompression/SkippableLongComposition.java b/src/main/java/me/lemire/longcompression/SkippableLongComposition.java index f2e9a55..0f9800e 100644 --- a/src/main/java/me/lemire/longcompression/SkippableLongComposition.java +++ b/src/main/java/me/lemire/longcompression/SkippableLongComposition.java @@ -62,6 +62,16 @@ public void headlessUncompress(long[] in, IntWrapper inpos, int inlength, long[] F2.headlessUncompress(in, inpos, inlength, out, outpos, num); } + @Override + public int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength) { + int init = compressedPositions.get(); + int maxLength = F1.maxHeadlessCompressedLength(compressedPositions, inlength); + maxLength += 1; // Add +1 for the potential F2 header. Question: is this header actually needed in the headless version? + inlength -= compressedPositions.get() - init; + maxLength += F2.maxHeadlessCompressedLength(compressedPositions, inlength); + return maxLength; + } + @Override public String toString() { return F1.toString() + "+" + F2.toString(); diff --git a/src/test/java/me/lemire/longcompression/LongTestUtils.java b/src/test/java/me/lemire/longcompression/LongTestUtils.java index 4a30b41..b7d9c63 100644 --- a/src/test/java/me/lemire/longcompression/LongTestUtils.java +++ b/src/test/java/me/lemire/longcompression/LongTestUtils.java @@ -111,7 +111,7 @@ protected static long[] uncompress(ByteLongCODEC codec, byte[] data, int len) { } protected static long[] compressHeadless(SkippableLongCODEC codec, long[] data) { - long[] outBuf = new long[data.length * 4]; + long[] outBuf = new long[codec.maxHeadlessCompressedLength(new IntWrapper(0), data.length)]; IntWrapper inPos = new IntWrapper(); IntWrapper outPos = new IntWrapper(); codec.headlessCompress(data, inPos, data.length, outBuf, outPos); diff --git a/src/test/java/me/lemire/longcompression/SkippableLongBasicTest.java b/src/test/java/me/lemire/longcompression/SkippableLongBasicTest.java index b317d4f..4309e9d 100644 --- a/src/test/java/me/lemire/longcompression/SkippableLongBasicTest.java +++ b/src/test/java/me/lemire/longcompression/SkippableLongBasicTest.java @@ -15,6 +15,7 @@ import me.lemire.integercompression.TestUtils; import me.lemire.integercompression.VariableByte; +import static org.junit.Assert.assertTrue; /** * Just some basic sanity tests. @@ -42,10 +43,11 @@ public void consistentTest() { for (SkippableLongCODEC c : codecs) { System.out.println("[SkippeableBasicTest.consistentTest] codec = " + c); - long[] outBuf = new long[N + 1024]; for (int n = 0; n <= N; ++n) { IntWrapper inPos = new IntWrapper(); IntWrapper outPos = new IntWrapper(); + long[] outBuf = new long[c.maxHeadlessCompressedLength(new IntWrapper(0), n)]; + c.headlessCompress(data, inPos, n, outBuf, outPos); IntWrapper inPoso = new IntWrapper(); @@ -142,5 +144,27 @@ public void varyingLengthTest2() { } } + @Test + public void testMaxHeadlessCompressedLength() { + testMaxHeadlessCompressedLength(new LongJustCopy(), 128); + testMaxHeadlessCompressedLength(new LongBinaryPacking(), 16 * LongBinaryPacking.BLOCK_SIZE); + testMaxHeadlessCompressedLength(new LongVariableByte(), 128); + testMaxHeadlessCompressedLength(new SkippableLongComposition(new LongBinaryPacking(), new LongVariableByte()), 16 * LongBinaryPacking.BLOCK_SIZE + 10); + } + + private static void testMaxHeadlessCompressedLength(SkippableLongCODEC codec, int inlengthTo) { + for (int inlength = 0; inlength < inlengthTo; ++inlength) { + long[] input = new long[inlength]; + Arrays.fill(input, -1L); + int maxOutputLength = codec.maxHeadlessCompressedLength(new IntWrapper(), inlength); + long[] output = new long[maxOutputLength]; + IntWrapper outPos = new IntWrapper(); + + codec.headlessCompress(input, new IntWrapper(), inlength, output, outPos); + // If we reach this point, no exception was thrown, which means the calculated output length was sufficient. + + assertTrue(maxOutputLength <= outPos.get() + 1); // +1 because SkippableLongComposition always adds one extra integer for the potential header + } + } } From 1d2749faafb30d401a6daf24d225d5693aed5730 Mon Sep 17 00:00:00 2001 From: Piotr Rzysko Date: Mon, 29 Sep 2025 14:16:03 +0200 Subject: [PATCH 340/412] Remove UncompressibleInputException Since we can now calculate the maximum compressed length, there is no longer a need to handle underestimated output array lengths by throwing this exception. --- .../integercompression/IntCompressor.java | 10 +--------- .../UncompressibleInputException.java | 19 ------------------- .../differential/IntegratedIntCompressor.java | 9 +-------- .../longcompression/LongCompressor.java | 10 +--------- 4 files changed, 3 insertions(+), 45 deletions(-) delete mode 100644 src/main/java/me/lemire/integercompression/UncompressibleInputException.java diff --git a/src/main/java/me/lemire/integercompression/IntCompressor.java b/src/main/java/me/lemire/integercompression/IntCompressor.java index 57b29f6..30f755c 100644 --- a/src/main/java/me/lemire/integercompression/IntCompressor.java +++ b/src/main/java/me/lemire/integercompression/IntCompressor.java @@ -33,7 +33,6 @@ public IntCompressor() { * * @param input array to be compressed * @return compressed array - * @throws UncompressibleInputException if the data is too poorly compressible */ public int[] compress(int[] input) { int maxCompressedLength = codec.maxHeadlessCompressedLength(new IntWrapper(0), input.length); @@ -41,14 +40,7 @@ public int[] compress(int[] input) { // Store at index=0 the length of the input, hence enabling .headlessCompress compressed[0] = input.length; IntWrapper outpos = new IntWrapper(1); - try { - codec.headlessCompress(input, new IntWrapper(0), - input.length, compressed, outpos); - } catch (IndexOutOfBoundsException ioebe) { - throw new - UncompressibleInputException("Your input is too poorly compressible " - + "with the current codec : "+codec); - } + codec.headlessCompress(input, new IntWrapper(0), input.length, compressed, outpos); compressed = Arrays.copyOf(compressed,outpos.intValue()); return compressed; } diff --git a/src/main/java/me/lemire/integercompression/UncompressibleInputException.java b/src/main/java/me/lemire/integercompression/UncompressibleInputException.java deleted file mode 100644 index c0ed41f..0000000 --- a/src/main/java/me/lemire/integercompression/UncompressibleInputException.java +++ /dev/null @@ -1,19 +0,0 @@ -package me.lemire.integercompression; - -/** - * This exception might be thrown if the input is poorly compressible. - * - */ -public class UncompressibleInputException extends RuntimeException { - - /** - * Create new exception - * @param string explanation for the exception - */ - public UncompressibleInputException(String string) { - super(string); - } - - private static final long serialVersionUID = -798583799846489873L; - -} diff --git a/src/main/java/me/lemire/integercompression/differential/IntegratedIntCompressor.java b/src/main/java/me/lemire/integercompression/differential/IntegratedIntCompressor.java index ad6467a..1d935c4 100644 --- a/src/main/java/me/lemire/integercompression/differential/IntegratedIntCompressor.java +++ b/src/main/java/me/lemire/integercompression/differential/IntegratedIntCompressor.java @@ -3,7 +3,6 @@ import java.util.Arrays; import me.lemire.integercompression.IntWrapper; -import me.lemire.integercompression.UncompressibleInputException; /** * This is a convenience class that wraps a codec to provide @@ -36,7 +35,6 @@ public IntegratedIntCompressor() { * * @param input array to be compressed * @return compressed array - * @throws UncompressibleInputException if the data is too poorly compressible */ public int[] compress(int[] input) { int maxCompressedLength = codec.maxHeadlessCompressedLength(new IntWrapper(0), input.length); @@ -44,12 +42,7 @@ public int[] compress(int[] input) { compressed[0] = input.length; IntWrapper outpos = new IntWrapper(1); IntWrapper initvalue = new IntWrapper(0); - try { - codec.headlessCompress(input, new IntWrapper(0), input.length, compressed, outpos, initvalue); - } catch (IndexOutOfBoundsException ioebe) { - throw new UncompressibleInputException( - "Your input is too poorly compressible with the current codec : " + codec); - } + codec.headlessCompress(input, new IntWrapper(0), input.length, compressed, outpos, initvalue); compressed = Arrays.copyOf(compressed,outpos.intValue()); return compressed; } diff --git a/src/main/java/me/lemire/longcompression/LongCompressor.java b/src/main/java/me/lemire/longcompression/LongCompressor.java index ae1dd1a..246647f 100644 --- a/src/main/java/me/lemire/longcompression/LongCompressor.java +++ b/src/main/java/me/lemire/longcompression/LongCompressor.java @@ -3,7 +3,6 @@ import java.util.Arrays; import me.lemire.integercompression.IntWrapper; -import me.lemire.integercompression.UncompressibleInputException; /** * This is a convenience class that wraps a codec to provide @@ -37,7 +36,6 @@ public LongCompressor() { * * @param input array to be compressed * @return compressed array - * @throws UncompressibleInputException if the data is too poorly compressible */ public long[] compress(long[] input) { int maxCompressedLength = codec.maxHeadlessCompressedLength(new IntWrapper(0), input.length); @@ -45,13 +43,7 @@ public long[] compress(long[] input) { // Store at index=0 the length of the input, hence enabling .headlessCompress compressed[0] = input.length; IntWrapper outpos = new IntWrapper(1); - try { - codec.headlessCompress(input, new IntWrapper(0), - input.length, compressed, outpos); - } catch (IndexOutOfBoundsException ioebe) { - throw new UncompressibleInputException("Your input is too poorly compressible " - + "with the current codec : "+codec); - } + codec.headlessCompress(input, new IntWrapper(0), input.length, compressed, outpos); compressed = Arrays.copyOf(compressed,outpos.intValue()); return compressed; } From e322d8ae643ebfa5fb3ab427837a400878016374 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 3 Oct 2025 19:44:22 -0400 Subject: [PATCH 341/412] minor updates to maven --- jitpack.yml | 5 +++++ pom.xml | 37 +++++++++++++++---------------------- 2 files changed, 20 insertions(+), 22 deletions(-) create mode 100644 jitpack.yml diff --git a/jitpack.yml b/jitpack.yml new file mode 100644 index 0000000..255e0f4 --- /dev/null +++ b/jitpack.yml @@ -0,0 +1,5 @@ +jdk: + - openjdk21 +before_install: + - sdk install java 21-open + - sdk use java 21-open diff --git a/pom.xml b/pom.xml index 5240577..c21680c 100644 --- a/pom.xml +++ b/pom.xml @@ -5,8 +5,9 @@ 0.2.2-SNAPSHOT jar - 1.8 - 1.8 + 21 + 21 + 21 UTF-8 @@ -18,18 +19,16 @@ - scm:git:git@github.com:lemire/JavaFastPFOR.git - scm:git:git@github.com:lemire/JavaFastPFOR.git - scm:git:git@github.com:lemire/JavaFastPFOR.git + scm:git:git@github.com:fastpack/JavaFastPFOR.git + scm:git:git@github.com:fastpack/JavaFastPFOR.git + scm:git:git@github.com:fastpack/JavaFastPFOR.git lemire Daniel Lemire - lemire@gmail.com + daniel@lemire.me http://lemire.me/en/ - LICEF Research Center - http://licef.ca architect developer @@ -57,13 +56,8 @@ GitHub Issue Tracking - https://github.com/lemire/JavaFastPFOR/issues + https://github.com/fastpack/JavaFastPFOR/issues - - org.sonatype.oss - oss-parent - 9 - @@ -71,8 +65,8 @@ maven-compiler-plugin 3.12.1 - 17 - 17 + 21 + 21 @@ -88,7 +82,7 @@ - + @@ -233,9 +227,8 @@ JavaFastPFOR - https://github.com/lemire/JavaFastPFOR/ + https://github.com/fastpack/JavaFastPFOR/ -It is a library to compress and uncompress arrays of integers -very fast. The assumption is that most (but not all) values in -your array use less than 32 bits. +A library to compress and uncompress arrays of integers +very quickly. From 762fdb1942a4987709ac60b5fa92d2bd439df988 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 3 Oct 2025 19:47:09 -0400 Subject: [PATCH 342/412] updating jacoco --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c21680c..bd26590 100644 --- a/pom.xml +++ b/pom.xml @@ -161,7 +161,7 @@ org.jacoco jacoco-maven-plugin - 0.8.8 + 0.8.13 me/lemire/integercompression/Kamikaze From 7efa9327eee6104ec69c439f4dc08fb09f590d5c Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 3 Oct 2025 19:51:18 -0400 Subject: [PATCH 343/412] removing gpg --- pom.xml | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/pom.xml b/pom.xml index bd26590..113c99a 100644 --- a/pom.xml +++ b/pom.xml @@ -115,20 +115,6 @@ me.lemire.integercompression.benchmarktools.Benchmark - - org.apache.maven.plugins - maven-gpg-plugin - 1.4 - - - sign-artifacts - verify - - sign - - - - org.apache.maven.plugins maven-javadoc-plugin From 309b37618c899c8ed3aa67d46e4f0f3d6662adf0 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 3 Oct 2025 19:53:32 -0400 Subject: [PATCH 344/412] fix name --- pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 113c99a..6975671 100644 --- a/pom.xml +++ b/pom.xml @@ -19,9 +19,9 @@ - scm:git:git@github.com:fastpack/JavaFastPFOR.git - scm:git:git@github.com:fastpack/JavaFastPFOR.git - scm:git:git@github.com:fastpack/JavaFastPFOR.git + scm:git:git@github.com:fast-pack/JavaFastPFOR.git + scm:git:git@github.com:fast-pack/JavaFastPFOR.git + scm:git:git@github.com:fast-pack/JavaFastPFOR.git @@ -56,7 +56,7 @@ GitHub Issue Tracking - https://github.com/fastpack/JavaFastPFOR/issues + https://github.com/fast-pack/JavaFastPFOR/issues @@ -213,7 +213,7 @@ JavaFastPFOR - https://github.com/fastpack/JavaFastPFOR/ + https://github.com/fast-pack/JavaFastPFOR/ A library to compress and uncompress arrays of integers very quickly. From 5b8e8aef9a0d3ac11eaafe3665c6608858d416de Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 3 Oct 2025 20:01:17 -0400 Subject: [PATCH 345/412] [maven-release-plugin] prepare release JavaFastPFOR-0.3.0 --- pom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6975671..56f7cdf 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.2.2-SNAPSHOT + 0.3.0 jar 21 @@ -22,6 +22,7 @@ scm:git:git@github.com:fast-pack/JavaFastPFOR.git scm:git:git@github.com:fast-pack/JavaFastPFOR.git scm:git:git@github.com:fast-pack/JavaFastPFOR.git + JavaFastPFOR-0.3.0 From 443210a34d6f9a8d4c6da4e2550db71a84f305e2 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 3 Oct 2025 20:05:59 -0400 Subject: [PATCH 346/412] Update Java version in workflow to 21 --- .github/workflows/basic.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml index 4688fa2..7f12ed7 100644 --- a/.github/workflows/basic.yml +++ b/.github/workflows/basic.yml @@ -8,7 +8,7 @@ jobs: strategy: fail-fast: false matrix: - java: [ 17, 21 ] + java: [ 21 ] steps: - uses: actions/checkout@v4.1.1 - name: Set up JDK From 8834bd4042f366c0a638451edb569e74c485bea9 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 3 Oct 2025 20:06:46 -0400 Subject: [PATCH 347/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 56f7cdf..b0d3657 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.0 + 0.3.1-SNAPSHOT jar 21 From 511e2ca24b3ff01b5e70d0f85c5657d2de8b1433 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 3 Oct 2025 20:09:26 -0400 Subject: [PATCH 348/412] up --- pom.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index b0d3657..a1b9d5f 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.1-SNAPSHOT + 0.3.0-SNAPSHOT jar 21 @@ -22,7 +22,6 @@ scm:git:git@github.com:fast-pack/JavaFastPFOR.git scm:git:git@github.com:fast-pack/JavaFastPFOR.git scm:git:git@github.com:fast-pack/JavaFastPFOR.git - JavaFastPFOR-0.3.0 From 1d79fc23f93a425a65e19f16cd737e6eb51d3ddd Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 3 Oct 2025 20:09:46 -0400 Subject: [PATCH 349/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a1b9d5f..82ad7f1 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.0-SNAPSHOT + 0.3.1-SNAPSHOT jar 21 @@ -22,6 +22,7 @@ scm:git:git@github.com:fast-pack/JavaFastPFOR.git scm:git:git@github.com:fast-pack/JavaFastPFOR.git scm:git:git@github.com:fast-pack/JavaFastPFOR.git + HEAD From 4470b9f718ad2444d89ee96bafeb0251b7dfe97d Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 3 Oct 2025 20:18:02 -0400 Subject: [PATCH 350/412] Revise dependency instructions for JitPack usage Updated Maven and Gradle instructions to use JitPack and the latest version of JavaFastPFor. --- README.md | 54 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 5d3fc30..59be8cd 100644 --- a/README.md +++ b/README.md @@ -72,31 +72,65 @@ non-vectorized implementation. For an example usage, see examples/vector/Example.java. The feature requires JDK 19+ and is currently for advanced users. -Maven central repository +JitPack ------------------------ +1. **Maven** + Using this code in your own project is easy with maven, just add the following code in your pom.xml file: ```xml - - - me.lemire.integercompression - JavaFastPFOR - [0.2,) - - + + com.github.fast-pack + JavaFastPFor + JavaFastPFOR-0.3.0 + +``` + +as well as jitpack as a repository... + +```xml + + + jitpack.io + https://jitpack.io + + ``` Naturally, you should replace "version" by the version you desire. +2. **Gradle (groovy)** + + +Then all you need is to edit your `build.gradle` file like so: + -You can also download JavaFastPFOR from the Maven central repository: -http://repo1.maven.org/maven2/me/lemire/integercompression/JavaFastPFOR/ +```groovy +plugins { + id 'java' +} +repositories { + mavenCentral() + maven { + url 'https://jitpack.io' + } +} + +dependencies { + implementation 'com.github.fast-pack:JavaFastPFor:JavaFastPFOR-0.3.0' +} +``` + + +Naturally, you should replace "version" by the version +you desire. + Why? ---- From 5f7e77e2a897f1caaa552c53eeb9680e553cdfe6 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 3 Oct 2025 20:35:36 -0400 Subject: [PATCH 351/412] Add JitPack version badge to README Added a JitPack version badge to the README. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 59be8cd..38f6baf 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ JavaFastPFOR: A simple integer compression library in Java ========================================================== +[![](https://jitpack.io/v/fast-pack/JavaFastPFor.svg)](https://jitpack.io/#fast-pack/JavaFastPFor) [![][maven img]][maven] [![][license img]][license] [![docs-badge][]][docs] [![Java CI](https://github.com/lemire/JavaFastPFOR/actions/workflows/basic.yml/badge.svg)](https://github.com/lemire/JavaFastPFOR/actions/workflows/basic.yml) From 760efdbf6db9078100d1514777ace9dc1f4b22da Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 3 Oct 2025 20:46:46 -0400 Subject: [PATCH 352/412] updating pom --- pom.xml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 82ad7f1..227409f 100644 --- a/pom.xml +++ b/pom.xml @@ -166,9 +166,13 @@
    - org.eluder.coveralls - coveralls-maven-plugin - 3.2.1 + org.apache.maven.plugins + maven-release-plugin + 3.0.1 + + install + true + From 015084e2f6e86b5af831615d7fbcc3473c52f407 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 3 Oct 2025 20:49:17 -0400 Subject: [PATCH 353/412] [maven-release-plugin] prepare release JavaFastPFOR-0.3.1 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 227409f..e88e3f8 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.1-SNAPSHOT + 0.3.1 jar 21 @@ -22,7 +22,7 @@ scm:git:git@github.com:fast-pack/JavaFastPFOR.git scm:git:git@github.com:fast-pack/JavaFastPFOR.git scm:git:git@github.com:fast-pack/JavaFastPFOR.git - HEAD + JavaFastPFOR-0.3.1 From a0a5affd5eb0e7b16186fd38fa8a19ff466f317d Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 3 Oct 2025 20:49:19 -0400 Subject: [PATCH 354/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index e88e3f8..e873dab 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.1 + 0.3.2-SNAPSHOT jar 21 @@ -22,7 +22,7 @@ scm:git:git@github.com:fast-pack/JavaFastPFOR.git scm:git:git@github.com:fast-pack/JavaFastPFOR.git scm:git:git@github.com:fast-pack/JavaFastPFOR.git - JavaFastPFOR-0.3.1 + HEAD From f92dc36074b43c3f7daf053f91de6bfc4a3abd5e Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 3 Oct 2025 21:08:07 -0400 Subject: [PATCH 355/412] Update JavaFastPFOR version to 0.3.1 Updated the dependency version for JavaFastPFOR in both Maven and Gradle sections of the README. --- README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 38f6baf..b738fea 100644 --- a/README.md +++ b/README.md @@ -73,9 +73,13 @@ non-vectorized implementation. For an example usage, see examples/vector/Example.java. The feature requires JDK 19+ and is currently for advanced users. -JitPack +JavaFastPFOR as a dependency (JitPack) ------------------------ +We have a demo project using JavaFastPFOR as a dependency (both Maven and Gradle). See... + +https://github.com/fast-pack/JavaFastPFORDemo + 1. **Maven** Using this code in your own project is easy with maven, just add @@ -85,7 +89,7 @@ the following code in your pom.xml file: com.github.fast-pack JavaFastPFor - JavaFastPFOR-0.3.0 + JavaFastPFOR-0.3.1 ``` @@ -124,7 +128,7 @@ repositories { } dependencies { - implementation 'com.github.fast-pack:JavaFastPFor:JavaFastPFOR-0.3.0' + implementation 'com.github.fast-pack:JavaFastPFor:JavaFastPFOR-0.3.1' } ``` From 597a7ef18931c8986580abbecce08343d3926efb Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 3 Oct 2025 21:09:41 -0400 Subject: [PATCH 356/412] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index b738fea..f073db3 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ JavaFastPFOR: A simple integer compression library in Java ========================================================== -[![](https://jitpack.io/v/fast-pack/JavaFastPFor.svg)](https://jitpack.io/#fast-pack/JavaFastPFor) - [![][maven img]][maven] [![][license img]][license] [![docs-badge][]][docs] +[![](https://jitpack.io/v/fast-pack/JavaFastPFor.svg)](https://jitpack.io/#fast-pack/JavaFastPFor) [![][license img]][license] [![docs-badge][]][docs] [![Java CI](https://github.com/lemire/JavaFastPFOR/actions/workflows/basic.yml/badge.svg)](https://github.com/lemire/JavaFastPFOR/actions/workflows/basic.yml) From bc4478110417dba21de19de3b8e313b4e10ef1f5 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 3 Oct 2025 21:10:44 -0400 Subject: [PATCH 357/412] Update README by removing authors and changing JDK version Removed author section and updated JDK version requirement. --- README.md | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/README.md b/README.md index f073db3..2e6853a 100644 --- a/README.md +++ b/README.md @@ -153,20 +153,6 @@ Nevertheless, if you want to reuse codec instances, note that by convention, unless the documentation of a codec specify that it is not thread-safe, then it can be assumed to be thread-safe. -Authors -------- - -Main contributors -* Daniel Lemire, http://lemire.me/en/ -* Muraoka Taro, https://github.com/koron - -with contributions by -* the Terrier team (Matteo Catena, Craig Macdonald, Saúl Vargas and Iadh Ounis) -* Di Wu, http://www.facebook.com/diwu1989 -* Stefan Ackermann, https://github.com/Stivo -* Samit Roy, https://github.com/roysamit -* Mulugeta Mammo, https://github.com/mulugetam (for VectorFastPFOR) - How does it compare to the Kamikaze PForDelta library? ------------------------------------------------------ @@ -186,7 +172,7 @@ Requirements Releases up to 0.1.12 require Java 7 or better. -The current development versions assume JDK 11 or better. +The current development versions assume JDK 21 or better. @@ -270,8 +256,6 @@ Funding This work was supported by NSERC grant number 26143. -[maven img]:https://maven-badges.herokuapp.com/maven-central/me.lemire.integercompression/JavaFastPFOR/badge.svg -[maven]:http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22me.lemire.integercompression%22%20 [license]:LICENSE [license img]:https://img.shields.io/badge/License-Apache%202-blue.svg From 73f164beea740c9609336f20c1eed70841dc0a5b Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 3 Oct 2025 21:12:11 -0400 Subject: [PATCH 358/412] Revise README with Java example for compression Updated usage section with a complete Java example demonstrating the compression and uncompression process using FastPFOR128. --- README.md | 47 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 2e6853a..63193e9 100644 --- a/README.md +++ b/README.md @@ -48,13 +48,50 @@ as well as in GMAP and GSNAP (http://research-pub.gene.com/gmap/). Usage ------ -Really simple usage: ```java - IntegratedIntCompressor iic = new IntegratedIntCompressor(); - int[] data = ... ; // to be compressed - int[] compressed = iic.compress(data); // compressed array - int[] recov = iic.uncompress(compressed); // equals to data +package org.example; + +import me.lemire.integercompression.FastPFOR128; +import me.lemire.integercompression.IntWrapper; + +import java.util.Arrays; + +public class Main { + public static void main(String[] args) { + FastPFOR128 fastpfor = new FastPFOR128(); + + int N = 9984; + int[] data = new int[N]; + for (var i = 0; i < N; i += 150) { + data[i] = i; + } + + int[] compressedoutput1 = new int[N + 1024]; + + IntWrapper inputoffset1 = new IntWrapper(0); + IntWrapper outputoffset1 = new IntWrapper(0); + + fastpfor.compress(data, inputoffset1, N, compressedoutput1, outputoffset1); + int compressedsize1 = outputoffset1.get(); + + int[] recovered1 = new int[N]; + inputoffset1 = new IntWrapper(0); + outputoffset1 = new IntWrapper(0); + fastpfor.uncompress(compressedoutput1, outputoffset1, compressedsize1, recovered1, inputoffset1); + + // quick verification: count mismatches + int mismatches = 0; + for (int i = 0; i < N; i++) { + if (data[i] != recovered1[i]) mismatches++; + } + + System.out.println("N=" + N + " compressedSizeWords=" + compressedsize1 + " mismatches=" + mismatches); + System.out.println("first 20 original: " + Arrays.toString(Arrays.copyOf(data, 20))); + System.out.println("first 20 recovered: " + Arrays.toString(Arrays.copyOf(recovered1, 20))); + } +} + ``` For more examples, see example.java or the examples folder. From 1414beb03b85f0568c088937367219c57ff953fd Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 3 Oct 2025 21:13:20 -0400 Subject: [PATCH 359/412] Remove license information from README Removed license section from README. --- README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/README.md b/README.md index 63193e9..77a86dc 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,6 @@ JavaFastPFOR: A simple integer compression library in Java [![Java CI](https://github.com/lemire/JavaFastPFOR/actions/workflows/basic.yml/badge.svg)](https://github.com/lemire/JavaFastPFOR/actions/workflows/basic.yml) -License -------- - -This code is released under the -Apache License Version 2.0 http://www.apache.org/licenses/. What does this do? From 43888441156c73e6bcf7fcf4897e399fbec5ccdd Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 3 Oct 2025 22:33:57 -0400 Subject: [PATCH 360/412] [maven-release-plugin] prepare release JavaFastPFOR-0.3.2 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index e873dab..dd1665e 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.2-SNAPSHOT + 0.3.2 jar 21 @@ -22,7 +22,7 @@ scm:git:git@github.com:fast-pack/JavaFastPFOR.git scm:git:git@github.com:fast-pack/JavaFastPFOR.git scm:git:git@github.com:fast-pack/JavaFastPFOR.git - HEAD + JavaFastPFOR-0.3.2 From 75093a3f636c79287977bc63ac4994eba16f58cb Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 3 Oct 2025 22:33:59 -0400 Subject: [PATCH 361/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index dd1665e..928a3d2 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.2 + 0.3.3-SNAPSHOT jar 21 @@ -22,7 +22,7 @@ scm:git:git@github.com:fast-pack/JavaFastPFOR.git scm:git:git@github.com:fast-pack/JavaFastPFOR.git scm:git:git@github.com:fast-pack/JavaFastPFOR.git - JavaFastPFOR-0.3.2 + HEAD From beb74608ff996e209a856b3373c99a2f4b187839 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Fri, 3 Oct 2025 22:36:34 -0400 Subject: [PATCH 362/412] Update README.md --- README.md | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 77a86dc..2ef8fc5 100644 --- a/README.md +++ b/README.md @@ -120,7 +120,7 @@ the following code in your pom.xml file: com.github.fast-pack JavaFastPFor - JavaFastPFOR-0.3.1 + JavaFastPFOR-0.3.2 ``` @@ -159,7 +159,7 @@ repositories { } dependencies { - implementation 'com.github.fast-pack:JavaFastPFor:JavaFastPFOR-0.3.1' + implementation 'com.github.fast-pack:JavaFastPFor:JavaFastPFOR-0.3.2' } ``` @@ -167,12 +167,6 @@ dependencies { Naturally, you should replace "version" by the version you desire. -Why? ----- - -We found no library that implemented state-of-the-art integer coding techniques -such as Binary Packing, NewPFD, OptPFD, Variable Byte, Simple 9 and so on in Java. -We wrote one. Thread safety ---- From 3eef81bc6551a304e415f9af625ac365c96e8f11 Mon Sep 17 00:00:00 2001 From: Piotr Rzysko Date: Sat, 4 Oct 2025 21:40:52 +0200 Subject: [PATCH 363/412] Fix handling of output offset in SkippableComposition classes Previously, when outpos passed to headlessUncompress was greater than zero, the second scheme would receive an incorrect number of remaining integers to decode. --- .../SkippableComposition.java | 4 +- .../SkippableIntegratedComposition.java | 4 +- .../SkippableLongComposition.java | 4 +- .../SkippableBasicTest.java | 49 +++++++++++++++++++ .../SkippableLongBasicTest.java | 24 +++++++++ 5 files changed, 82 insertions(+), 3 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/SkippableComposition.java b/src/main/java/me/lemire/integercompression/SkippableComposition.java index 7dd4736..fc3c18e 100644 --- a/src/main/java/me/lemire/integercompression/SkippableComposition.java +++ b/src/main/java/me/lemire/integercompression/SkippableComposition.java @@ -52,12 +52,14 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num) { int init = inpos.get(); + int outposInit = outpos.get(); + F1.headlessUncompress(in, inpos, inlength, out, outpos, num); if (inpos.get() == init) { inpos.increment(); } inlength -= inpos.get() - init; - num -= outpos.get(); + num -= outpos.get() - outposInit; F2.headlessUncompress(in, inpos, inlength, out, outpos, num); } diff --git a/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedComposition.java b/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedComposition.java index a1379ad..4786ec5 100644 --- a/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedComposition.java +++ b/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedComposition.java @@ -66,13 +66,15 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, if (inlength == 0) return; int init = inpos.get(); + int outposInit = outpos.get(); + F1.headlessUncompress(in, inpos, inlength, out, outpos,num,initvalue); if (inpos.get() == init) { inpos.increment(); } inlength -= inpos.get() - init; - num -= outpos.get(); + num -= outpos.get() - outposInit; F2.headlessUncompress(in, inpos, inlength, out, outpos,num,initvalue); } diff --git a/src/main/java/me/lemire/longcompression/SkippableLongComposition.java b/src/main/java/me/lemire/longcompression/SkippableLongComposition.java index 0f9800e..eb03b72 100644 --- a/src/main/java/me/lemire/longcompression/SkippableLongComposition.java +++ b/src/main/java/me/lemire/longcompression/SkippableLongComposition.java @@ -53,12 +53,14 @@ public void headlessCompress(long[] in, IntWrapper inpos, int inlength, long[] o public void headlessUncompress(long[] in, IntWrapper inpos, int inlength, long[] out, IntWrapper outpos, int num) { int init = inpos.get(); + int outposInit = outpos.get(); + F1.headlessUncompress(in, inpos, inlength, out, outpos, num); if (inpos.get() == init) { inpos.increment(); } inlength -= inpos.get() - init; - num -= outpos.get(); + num -= outpos.get() - outposInit; F2.headlessUncompress(in, inpos, inlength, out, outpos, num); } diff --git a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java index 57a07e3..881dada 100644 --- a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java +++ b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java @@ -15,6 +15,7 @@ import me.lemire.integercompression.differential.SkippableIntegratedIntegerCODEC; import org.junit.Test; +import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertTrue; /** @@ -236,4 +237,52 @@ private static void testMaxHeadlessCompressedLength(SkippableIntegerCODEC codec, } } } + + @Test + public void testUncompressOutputOffset_SkippableComposition() { + for (int offset : new int[] {0, 1, 6}) { + SkippableComposition codec = new SkippableComposition(new BinaryPacking(), new VariableByte()); + + int[] input = { 2, 3, 4, 5 }; + int[] compressed = new int[codec.maxHeadlessCompressedLength(new IntWrapper(0), input.length)]; + int[] uncompressed = new int[offset + input.length]; + + IntWrapper inputOffset = new IntWrapper(0); + IntWrapper compressedOffset = new IntWrapper(0); + + codec.headlessCompress(input, inputOffset, input.length, compressed, compressedOffset); + + int compressedLength = compressedOffset.get(); + IntWrapper uncompressedOffset = new IntWrapper(offset); + compressedOffset = new IntWrapper(0); + codec.headlessUncompress(compressed, compressedOffset, compressedLength, uncompressed, uncompressedOffset, input.length); + + assertArrayEquals(input, Arrays.copyOfRange(uncompressed, offset, offset + input.length)); + } + } + + @Test + public void testUncompressOutputOffset_SkippableIntegratedComposition() { + for (int offset : new int[] {0, 1, 6}) { + SkippableIntegratedComposition codec = new SkippableIntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte()); + + int[] input = { 2, 3, 4, 5 }; + int[] compressed = new int[codec.maxHeadlessCompressedLength(new IntWrapper(0), input.length)]; + int[] uncompressed = new int[offset + input.length]; + + IntWrapper inputOffset = new IntWrapper(0); + IntWrapper compressedOffset = new IntWrapper(0); + IntWrapper initValue = new IntWrapper(0); + + codec.headlessCompress(input, inputOffset, input.length, compressed, compressedOffset, initValue); + + int compressedLength = compressedOffset.get(); + IntWrapper uncompressedOffset = new IntWrapper(offset); + compressedOffset = new IntWrapper(0); + initValue = new IntWrapper(0); + codec.headlessUncompress(compressed, compressedOffset, compressedLength, uncompressed, uncompressedOffset, input.length, initValue); + + assertArrayEquals(input, Arrays.copyOfRange(uncompressed, offset, offset + input.length)); + } + } } diff --git a/src/test/java/me/lemire/longcompression/SkippableLongBasicTest.java b/src/test/java/me/lemire/longcompression/SkippableLongBasicTest.java index 4309e9d..c4b7e01 100644 --- a/src/test/java/me/lemire/longcompression/SkippableLongBasicTest.java +++ b/src/test/java/me/lemire/longcompression/SkippableLongBasicTest.java @@ -15,6 +15,7 @@ import me.lemire.integercompression.TestUtils; import me.lemire.integercompression.VariableByte; +import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertTrue; /** @@ -167,4 +168,27 @@ private static void testMaxHeadlessCompressedLength(SkippableLongCODEC codec, in assertTrue(maxOutputLength <= outPos.get() + 1); // +1 because SkippableLongComposition always adds one extra integer for the potential header } } + + @Test + public void testUncompressOutputOffset_SkippableLongComposition() { + for (int offset : new int[] {0, 1, 6}) { + SkippableLongComposition codec = new SkippableLongComposition(new LongBinaryPacking(), new LongVariableByte()); + + long[] input = { 2, 3, 4, 5 }; + long[] compressed = new long[codec.maxHeadlessCompressedLength(new IntWrapper(0), input.length)]; + long[] uncompressed = new long[offset + input.length]; + + IntWrapper inputOffset = new IntWrapper(0); + IntWrapper compressedOffset = new IntWrapper(0); + + codec.headlessCompress(input, inputOffset, input.length, compressed, compressedOffset); + + int compressedLength = compressedOffset.get(); + IntWrapper uncompressedOffset = new IntWrapper(offset); + compressedOffset = new IntWrapper(0); + codec.headlessUncompress(compressed, compressedOffset, compressedLength, uncompressed, uncompressedOffset, input.length); + + assertArrayEquals(input, Arrays.copyOfRange(uncompressed, offset, offset + input.length)); + } + } } From 182f19168793be444c7336a59210247ab63558bb Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Sun, 5 Oct 2025 13:02:31 -0400 Subject: [PATCH 364/412] [maven-release-plugin] prepare release JavaFastPFOR-0.3.3 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 928a3d2..a76e4aa 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.3-SNAPSHOT + 0.3.3 jar 21 @@ -22,7 +22,7 @@ scm:git:git@github.com:fast-pack/JavaFastPFOR.git scm:git:git@github.com:fast-pack/JavaFastPFOR.git scm:git:git@github.com:fast-pack/JavaFastPFOR.git - HEAD + JavaFastPFOR-0.3.3 From 0e6bab01c5f1b4103138afd83aa505322b40a224 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Sun, 5 Oct 2025 13:02:33 -0400 Subject: [PATCH 365/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index a76e4aa..09e48fa 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.3 + 0.3.4-SNAPSHOT jar 21 @@ -22,7 +22,7 @@ scm:git:git@github.com:fast-pack/JavaFastPFOR.git scm:git:git@github.com:fast-pack/JavaFastPFOR.git scm:git:git@github.com:fast-pack/JavaFastPFOR.git - JavaFastPFOR-0.3.3 + HEAD From 21252a7008ecb9c1cf13df0015eb6aa9d9dd3ce3 Mon Sep 17 00:00:00 2001 From: Piotr Rzysko Date: Sun, 19 Oct 2025 10:03:08 +0200 Subject: [PATCH 366/412] Include IntelliJ files in .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 88b3320..5a78c84 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,5 @@ tags target/ tmp/ /bin +.idea +*.iml From aac18eee72ac1c6c6e72a765c9ff906561c6d1d9 Mon Sep 17 00:00:00 2001 From: Piotr Rzysko Date: Sun, 19 Oct 2025 10:05:00 +0200 Subject: [PATCH 367/412] Add release action --- .github/release-settings.xml | 20 ++++++++++ .github/workflows/release.yml | 75 +++++++++++++++++++++++++++++++++++ pom.xml | 47 ++++++++++++++++++++-- 3 files changed, 139 insertions(+), 3 deletions(-) create mode 100644 .github/release-settings.xml create mode 100644 .github/workflows/release.yml diff --git a/.github/release-settings.xml b/.github/release-settings.xml new file mode 100644 index 0000000..be56a53 --- /dev/null +++ b/.github/release-settings.xml @@ -0,0 +1,20 @@ + + + + eu.maveniverse.maven.plugins + + + + + sonatype-central-portal + ${env.MAVEN_USER} + ${env.MAVEN_PASSWORD} + + sonatype-cp + njord:template:release-sca + + + + + diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..12e1db6 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,75 @@ +name: Release + +on: + workflow_dispatch: + inputs: + releaseVersion: + description: "Release version, e.g. 0.3.6 (optional — auto-detected from the current POM)" + required: false + +jobs: + release: + runs-on: ubuntu-latest + + steps: + - name: Validate release version + if: ${{ github.event.inputs.releaseVersion != '' }} + run: | + RELEASE=${{ github.event.inputs.releaseVersion }} + if [[ ! $RELEASE =~ ^[0-9]+\.[0-9]+\.[0-9]+(-SNAPSHOT)?$ ]]; then + echo "Error: releaseVersion '$RELEASE' is not in the correct format x.y.z or x.y.z-SNAPSHOT" + exit 1 + fi + + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Java + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'adopt' + + - name: Configure git + run: | + git config user.email "actions@github.com" + git config user.name "GitHub Actions" + + - name: Prepare Release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + MVN_ARGS="" + if [ -n "${{ github.event.inputs.releaseVersion }}" ]; then + MVN_ARGS="$MVN_ARGS -DreleaseVersion=${{ github.event.inputs.releaseVersion }}" + fi + mvn -B release:prepare $MVN_ARGS + + - name: Determine release version + id: version + run: | + export TAG=$(grep 'scm.tag=' release.properties | cut -d'=' -f2) + export VERSION=${TAG#JavaFastPFOR-} + + echo "released_tag=${TAG}" >> $GITHUB_OUTPUT + echo "released_version=${VERSION}" >> $GITHUB_OUTPUT + + echo "Releasing tag: ${TAG}" + echo "Releasing version: ${VERSION}" + + - name: Release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + MAVEN_GPG_KEY: ${{ secrets.GPG_PRIVATE_KEY }} + MAVEN_USER: ${{ secrets.MAVEN_USER }} + MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} + run: | + mvn -B release:perform -Darguments="-DskipTests -Dnjord.autoPublish -s .github/release-settings.xml" + + - name: Create GitHub Release + run: gh release create "${{ steps.version.outputs.released_tag }}" --generate-notes --title "Version ${{ steps.version.outputs.released_version }}" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/pom.xml b/pom.xml index 09e48fa..2bfe5e8 100644 --- a/pom.xml +++ b/pom.xml @@ -9,6 +9,7 @@ 21 21 UTF-8 + 0.8.5 @@ -19,11 +20,25 @@ - scm:git:git@github.com:fast-pack/JavaFastPFOR.git - scm:git:git@github.com:fast-pack/JavaFastPFOR.git - scm:git:git@github.com:fast-pack/JavaFastPFOR.git + scm:git:https://github.com/fast-pack/JavaFastPFOR.git + scm:git:https://github.com/fast-pack/JavaFastPFOR.git + scm:git:https://github.com/fast-pack/JavaFastPFOR.git HEAD + + + + sonatype-central-portal + Sonatype Central Portal + https://central.sonatype.com/repository/maven-snapshots/ + + + sonatype-central-portal + Sonatype Central Portal + https://repo.maven.apache.org/maven2/ + + + lemire @@ -60,6 +75,13 @@ https://github.com/fast-pack/JavaFastPFOR/issues
    + + + eu.maveniverse.maven.njord + extension3 + ${njord.version} + + org.apache.maven.plugins @@ -174,10 +196,29 @@ true + + org.apache.maven.plugins + maven-gpg-plugin + 3.2.8 + + + sign-artifacts + verify + + sign + + + + + + eu.maveniverse.maven.plugins + njord + ${njord.version} + maven-clean-plugin 2.5 From 729b2603f6589327df672631d8f46b8689e85cf1 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 20 Oct 2025 05:30:22 +0000 Subject: [PATCH 368/412] [maven-release-plugin] prepare release JavaFastPFOR-0.3.4 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 2bfe5e8..113cbc1 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.4-SNAPSHOT + 0.3.4 jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - HEAD + JavaFastPFOR-0.3.4 From 53fa8e8fe8afbf8f7bd8354dc7adff5c8f6d74fe Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 20 Oct 2025 05:30:23 +0000 Subject: [PATCH 369/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 113cbc1..139a82d 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.4 + 0.3.5-SNAPSHOT jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - JavaFastPFOR-0.3.4 + HEAD From b1be2d85b9474764cfe9368d402fc5772e49513e Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 20 Oct 2025 08:58:56 +0000 Subject: [PATCH 370/412] [maven-release-plugin] prepare release JavaFastPFOR-0.3.5 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 139a82d..6ad5a19 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.5-SNAPSHOT + 0.3.5 jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - HEAD + JavaFastPFOR-0.3.5 From 077c0a2055f6873ba7f9bc84158777886adb4663 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 20 Oct 2025 08:58:58 +0000 Subject: [PATCH 371/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 6ad5a19..67e904f 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.5 + 0.3.6-SNAPSHOT jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - JavaFastPFOR-0.3.5 + HEAD From 5504fcbe0dcfcb37319e1ebf3d1990932beff3df Mon Sep 17 00:00:00 2001 From: Piotr Rzysko Date: Mon, 20 Oct 2025 11:50:26 +0200 Subject: [PATCH 372/412] Set maven-release-plugin goals to deploy --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 67e904f..26864d0 100644 --- a/pom.xml +++ b/pom.xml @@ -192,7 +192,7 @@ maven-release-plugin 3.0.1 - install + deploy true From 806a712b063ef14643f554909a127e5bb79fa2b8 Mon Sep 17 00:00:00 2001 From: Piotr Rzysko Date: Mon, 20 Oct 2025 06:42:52 +0200 Subject: [PATCH 373/412] Add missing env variables in release action --- .github/workflows/release.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 12e1db6..8630f07 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -31,6 +31,8 @@ jobs: with: java-version: '21' distribution: 'adopt' + gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }} + gpg-passphrase: MAVEN_GPG_PASSPHRASE - name: Configure git run: | @@ -40,6 +42,7 @@ jobs: - name: Prepare Release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} run: | MVN_ARGS="" if [ -n "${{ github.event.inputs.releaseVersion }}" ]; then From dd8461908ec33cd35fca97e6031b9f11e790109a Mon Sep 17 00:00:00 2001 From: Piotr Rzysko Date: Mon, 20 Oct 2025 07:27:13 +0200 Subject: [PATCH 374/412] Allow release action to create tags --- .github/workflows/release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8630f07..79a9686 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,6 +10,8 @@ on: jobs: release: runs-on: ubuntu-latest + permissions: + contents: write # to automatically create tags steps: - name: Validate release version From 6b167c42a5c24bbca4768a6ffde3db86d0d77e33 Mon Sep 17 00:00:00 2001 From: Piotr Rzysko Date: Mon, 20 Oct 2025 10:51:53 +0200 Subject: [PATCH 375/412] Fix njord configuration --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 79a9686..0b2f1c4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -72,7 +72,7 @@ jobs: MAVEN_USER: ${{ secrets.MAVEN_USER }} MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} run: | - mvn -B release:perform -Darguments="-DskipTests -Dnjord.autoPublish -s .github/release-settings.xml" + mvn -B release:perform -Darguments="-DskipTests -DaltDeploymentRepository=id::default::njord: -Dnjord.autoPublish" -s .github/release-settings.xml - name: Create GitHub Release run: gh release create "${{ steps.version.outputs.released_tag }}" --generate-notes --title "Version ${{ steps.version.outputs.released_version }}" From 12177805238aa06cf1a217bc8837c2b9175b34c1 Mon Sep 17 00:00:00 2001 From: Piotr Rzysko Date: Mon, 20 Oct 2025 10:20:58 +0200 Subject: [PATCH 376/412] [tmp] checkout master --- .github/workflows/release.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0b2f1c4..291318f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -27,6 +27,7 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 + ref: master - name: Set up Java uses: actions/setup-java@v4 @@ -74,7 +75,7 @@ jobs: run: | mvn -B release:perform -Darguments="-DskipTests -DaltDeploymentRepository=id::default::njord: -Dnjord.autoPublish" -s .github/release-settings.xml - - name: Create GitHub Release - run: gh release create "${{ steps.version.outputs.released_tag }}" --generate-notes --title "Version ${{ steps.version.outputs.released_version }}" - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} +# - name: Create GitHub Release +# run: gh release create "${{ steps.version.outputs.released_tag }}" --generate-notes --title "Version ${{ steps.version.outputs.released_version }}" +# env: +# GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 9caa716d489848a928279264f585ab66d5e19b3c Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 20 Oct 2025 09:55:40 +0000 Subject: [PATCH 377/412] [maven-release-plugin] prepare release JavaFastPFOR-0.3.6 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 26864d0..d8d30c1 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.6-SNAPSHOT + 0.3.6 jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - HEAD + JavaFastPFOR-0.3.6 From f7ff2bd53b513fa6a82d6f0d02ad598fb9c9c5ff Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 20 Oct 2025 09:55:42 +0000 Subject: [PATCH 378/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index d8d30c1..00de0dc 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.6 + 0.3.7-SNAPSHOT jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - JavaFastPFOR-0.3.6 + HEAD From 1ca1e014e8fe7a1e74bb729944dd95f567bcb710 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 20 Oct 2025 17:44:06 +0000 Subject: [PATCH 379/412] [maven-release-plugin] prepare release JavaFastPFOR-0.3.7 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 00de0dc..1c80152 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.7-SNAPSHOT + 0.3.7 jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - HEAD + JavaFastPFOR-0.3.7 From 6d5b4c926c7ed81edfe4167c118422675c7f7009 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 20 Oct 2025 17:44:07 +0000 Subject: [PATCH 380/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 1c80152..f240455 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.7 + 0.3.8-SNAPSHOT jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - JavaFastPFOR-0.3.7 + HEAD From 1fcfa0b41cb7bd8b8c47a6ae29693f77d9e77273 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 20 Oct 2025 14:08:49 -0400 Subject: [PATCH 381/412] can we make publishing automated ? --- .github/workflows/release.yml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 291318f..ac28c0f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -73,9 +73,4 @@ jobs: MAVEN_USER: ${{ secrets.MAVEN_USER }} MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} run: | - mvn -B release:perform -Darguments="-DskipTests -DaltDeploymentRepository=id::default::njord: -Dnjord.autoPublish" -s .github/release-settings.xml - -# - name: Create GitHub Release -# run: gh release create "${{ steps.version.outputs.released_tag }}" --generate-notes --title "Version ${{ steps.version.outputs.released_version }}" -# env: -# GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + mvn -B release:perform -Darguments="-DskipTests -DaltDeploymentRepository=id::default::njord: -Dnjord.autoPublish=true -Dnjord.publishingType=automatic" -s .github/release-settings.xml \ No newline at end of file From eb8f27fdc585aa6b4a570303a288ca8b0bf88690 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 20 Oct 2025 19:30:07 -0400 Subject: [PATCH 382/412] minor change to the random generator (excuse to trigger a release). --- .../lemire/integercompression/synth/UniformDataGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java b/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java index bbd386a..a50497c 100644 --- a/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java +++ b/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java @@ -42,7 +42,7 @@ int[] generateUniformHash(int N, int Max) { int[] ans = new int[N]; HashSet s = new HashSet(); while (s.size() < N) - s.add(new Integer(this.rand.nextInt(Max))); + s.add(this.rand.nextInt(Max)); Iterator i = s.iterator(); for (int k = 0; k < N; ++k) ans[k] = i.next().intValue(); From 7e7567fda5eb20c7b1df6ea8d2ea33bb1ec6dbf1 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 20 Oct 2025 19:37:00 -0400 Subject: [PATCH 383/412] putting back GitHub Release --- .github/workflows/release.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ac28c0f..29bc28a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -73,4 +73,9 @@ jobs: MAVEN_USER: ${{ secrets.MAVEN_USER }} MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} run: | - mvn -B release:perform -Darguments="-DskipTests -DaltDeploymentRepository=id::default::njord: -Dnjord.autoPublish=true -Dnjord.publishingType=automatic" -s .github/release-settings.xml \ No newline at end of file + mvn -B release:perform -Darguments="-DskipTests -DaltDeploymentRepository=id::default::njord: -Dnjord.autoPublish=true -Dnjord.publishingType=automatic" -s .github/release-settings.xml + + - name: Create GitHub Release + run: gh release create "${{ steps.version.outputs.released_tag }}" --generate-notes --title "Version ${{ steps.version.outputs.released_version }}" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file From 78c5799dcdd2fac1b11f159f024b4f29562da01e Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 20 Oct 2025 23:49:55 +0000 Subject: [PATCH 384/412] [maven-release-plugin] prepare release JavaFastPFOR-0.3.8 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index f240455..ac78f6d 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.8-SNAPSHOT + 0.3.8 jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - HEAD + JavaFastPFOR-0.3.8 From 41fa4c03d500870955db901209d19305e787a5e5 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 20 Oct 2025 23:49:56 +0000 Subject: [PATCH 385/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index ac78f6d..9b53d0e 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.8 + 0.3.9-SNAPSHOT jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - JavaFastPFOR-0.3.8 + HEAD From 763bd2ddc61a8e66d39c62bea1b43b0a815e80b4 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 20 Oct 2025 21:42:16 -0400 Subject: [PATCH 386/412] update name --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 29bc28a..ec0e674 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -76,6 +76,6 @@ jobs: mvn -B release:perform -Darguments="-DskipTests -DaltDeploymentRepository=id::default::njord: -Dnjord.autoPublish=true -Dnjord.publishingType=automatic" -s .github/release-settings.xml - name: Create GitHub Release - run: gh release create "${{ steps.version.outputs.released_tag }}" --generate-notes --title "Version ${{ steps.version.outputs.released_version }}" + run: gh release create "${{ steps.version.outputs.released_tag }}" --generate-notes --title "${{ steps.version.outputs.released_version }}" env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file From 6025cd079eb932617a09b18abbbcbd053e8e17cc Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 20 Oct 2025 21:43:46 -0400 Subject: [PATCH 387/412] adding a check --- .github/workflows/release.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ec0e674..2098fe9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -53,6 +53,15 @@ jobs: fi mvn -B release:prepare $MVN_ARGS + - name: Check release.properties + run: | + if [ ! -f release.properties ]; then + echo "release.properties not found" + exit 1 + fi + echo "Contents of release.properties:" + cat release.properties + - name: Determine release version id: version run: | From 58b142eaa1795003d54d85c8d872549783af2eff Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 20 Oct 2025 21:47:58 -0400 Subject: [PATCH 388/412] undoing --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2098fe9..d6ad167 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -85,6 +85,6 @@ jobs: mvn -B release:perform -Darguments="-DskipTests -DaltDeploymentRepository=id::default::njord: -Dnjord.autoPublish=true -Dnjord.publishingType=automatic" -s .github/release-settings.xml - name: Create GitHub Release - run: gh release create "${{ steps.version.outputs.released_tag }}" --generate-notes --title "${{ steps.version.outputs.released_version }}" + run: gh release create "${{ steps.version.outputs.released_tag }}" --generate-notes --title "Version ${{ steps.version.outputs.released_version }}" env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file From 8b59184298825781dffb46c6fcb50f3dbd5a055c Mon Sep 17 00:00:00 2001 From: Piotr Rzysko Date: Tue, 21 Oct 2025 06:49:54 +0200 Subject: [PATCH 389/412] Add information about Maven Central to README --- README.md | 66 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 2ef8fc5..8fcd32c 100644 --- a/README.md +++ b/README.md @@ -104,53 +104,62 @@ non-vectorized implementation. For an example usage, see examples/vector/Example.java. The feature requires JDK 19+ and is currently for advanced users. -JavaFastPFOR as a dependency (JitPack) +JavaFastPFOR as a dependency ------------------------ +JavaFastPFOR is available both on Maven Central and JitPack, so you can easily +include it in your project using either source. + We have a demo project using JavaFastPFOR as a dependency (both Maven and Gradle). See... https://github.com/fast-pack/JavaFastPFORDemo -1. **Maven** +### Maven Central + +You can add JavaFastPFOR directly from Maven Central — no extra repository configuration needed: -Using this code in your own project is easy with maven, just add -the following code in your pom.xml file: +**Maven** ```xml - - com.github.fast-pack - JavaFastPFor - JavaFastPFOR-0.3.2 - + + me.lemire.integercompression + JavaFastPFOR + 0.3.8 + ``` -as well as jitpack as a repository... +**Gradle (Groovy)** -```xml - - - jitpack.io - https://jitpack.io - - +```groovy +dependencies { + implementation 'me.lemire.integercompression:JavaFastPFOR:0.3.8' +} ``` -Naturally, you should replace "version" by the version -you desire. +### JitPack +If you prefer or need to use JitPack, you can include the dependency like this: -2. **Gradle (groovy)** +**Maven** +```xml + + + jitpack.io + https://jitpack.io + + + + + com.github.fast-pack + JavaFastPFOR + JavaFastPFOR-0.3.8 + +``` -Then all you need is to edit your `build.gradle` file like so: - +**Gradle (groovy)** ```groovy -plugins { - id 'java' -} - - repositories { mavenCentral() maven { @@ -159,11 +168,10 @@ repositories { } dependencies { - implementation 'com.github.fast-pack:JavaFastPFor:JavaFastPFOR-0.3.2' + implementation 'com.github.fast-pack:JavaFastPFOR:JavaFastPFOR-0.3.8' } ``` - Naturally, you should replace "version" by the version you desire. From 7f2f5fcdf074bc7c5d1c32119d5d32f0320ed34b Mon Sep 17 00:00:00 2001 From: lifeinwild <49356704+lifeinwild@users.noreply.github.com> Date: Sun, 23 Nov 2025 00:02:35 +0900 Subject: [PATCH 390/412] bugfix of LongDelta fix(longdelta): Add support for empty arrays in fastInverseDelta --- .../differential/LongDelta.java | 2 +- .../lemire/longcompression/LongDeltaTest.java | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 src/test/java/me/lemire/longcompression/LongDeltaTest.java diff --git a/src/main/java/me/lemire/longcompression/differential/LongDelta.java b/src/main/java/me/lemire/longcompression/differential/LongDelta.java index 184e53c..8399f94 100644 --- a/src/main/java/me/lemire/longcompression/differential/LongDelta.java +++ b/src/main/java/me/lemire/longcompression/differential/LongDelta.java @@ -107,7 +107,7 @@ public static void fastinverseDelta(long[] data) { } } - for (; i != data.length; ++i) { + for (; i < data.length; ++i) { data[i] += data[i - 1]; } } diff --git a/src/test/java/me/lemire/longcompression/LongDeltaTest.java b/src/test/java/me/lemire/longcompression/LongDeltaTest.java new file mode 100644 index 0000000..bfa1e6f --- /dev/null +++ b/src/test/java/me/lemire/longcompression/LongDeltaTest.java @@ -0,0 +1,23 @@ +package me.lemire.longcompression; + +import me.lemire.longcompression.differential.LongDelta; +import org.junit.Test; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertNotNull; + +public class LongDeltaTest { + @Test + public void testEmptyArrayFastInverseDelta() { + LongCompressor compressor = new LongCompressor(); + long[] input = new long[0]; + + LongDelta.delta(input); + long[] compressed = compressor.compress(input); + long[] result = compressor.uncompress(compressed); + LongDelta.fastinverseDelta(result); + + assertNotNull(result); + assertArrayEquals(input, result); + } +} From a4ded943814aa28d26466e821788cbc3b7121a05 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Tue, 25 Nov 2025 16:31:26 +0000 Subject: [PATCH 391/412] [maven-release-plugin] prepare release JavaFastPFOR-0.3.9 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 9b53d0e..769bd98 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.9-SNAPSHOT + 0.3.9 jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - HEAD + JavaFastPFOR-0.3.9 From 5eb542b2c35dfab1d9a3bb1f8b2e61f0cb4335b2 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Tue, 25 Nov 2025 16:31:27 +0000 Subject: [PATCH 392/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 769bd98..2efc724 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.9 + 0.3.10-SNAPSHOT jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - JavaFastPFOR-0.3.9 + HEAD From 6559221f3c5df38b9e2407294653c19a715e874a Mon Sep 17 00:00:00 2001 From: lifeinwild <49356704+lifeinwild@users.noreply.github.com> Date: Wed, 17 Dec 2025 19:41:32 +0900 Subject: [PATCH 393/412] Export differential packages for JPMS This change makes differential compression algorithms accessible to other JPMS modules, allowing external projects to directly use these variants. --- src/main/java/module-info.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index d254c12..f134601 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -6,5 +6,7 @@ // requires jdk.incubator.vector; exports me.lemire.integercompression; exports me.lemire.longcompression; + exports me.lemire.longcompression.differential; + exports me.lemire.integercompression.differential; // exports me.lemire.integercompression.vector; } From f033dcf93620f9f7afb2170b11da50c5c215345c Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Thu, 18 Dec 2025 04:57:54 +0000 Subject: [PATCH 394/412] [maven-release-plugin] prepare release JavaFastPFOR-0.3.10 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 2efc724..31d6f61 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.10-SNAPSHOT + 0.3.10 jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - HEAD + JavaFastPFOR-0.3.10 From babc646de163d9b36c852f978d6cc0c30428efa8 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Thu, 18 Dec 2025 04:57:55 +0000 Subject: [PATCH 395/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 31d6f61..33db8e6 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.10 + 0.3.11-SNAPSHOT jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - JavaFastPFOR-0.3.10 + HEAD From d74e397c35eb70cba8394b0aeedea21500e5d59f Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 22 Dec 2025 16:10:07 -0500 Subject: [PATCH 396/412] adding ref --- README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/README.md b/README.md index 2ef8fc5..490b93c 100644 --- a/README.md +++ b/README.md @@ -244,6 +244,21 @@ API Documentation http://www.javadoc.io/doc/me.lemire.integercompression/JavaFastPFOR/ + +Citing this work +----------------- + +If you use JavaFastPFOR in your work, please consider citing the project. A recommended BibTeX entry is: + +```bibtex +@misc{lemire2025_javafastpfor, + author = {Daniel Lemire}, + title = {{JavaFastPFOR: A simple integer compression library in Java}}, + year = {2025}, + howpublished = {\url{https://github.com/fast-pack/JavaFastPFOR}}, +} +``` + Want to read more? ------------------ From c87474eda15b13bfd0477d756ac46fc368b7cfc1 Mon Sep 17 00:00:00 2001 From: Benoit Lacelle Date: Sun, 15 Mar 2026 19:58:33 +0400 Subject: [PATCH 397/412] Add Automatic-Module-Name in MANIFEST.MF --- pom.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pom.xml b/pom.xml index 33db8e6..f55759c 100644 --- a/pom.xml +++ b/pom.xml @@ -234,6 +234,13 @@ maven-jar-plugin 2.4 + + + + me.lemire.integercompression + + + maven-javadoc-plugin From dee14e3faeb491593fb9efc64153fca4bbc6fd10 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Sun, 15 Mar 2026 22:43:34 +0000 Subject: [PATCH 398/412] [maven-release-plugin] prepare release JavaFastPFOR-0.3.11 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index f55759c..ec9d0e8 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.11-SNAPSHOT + 0.3.11 jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - HEAD + JavaFastPFOR-0.3.11 From 5b473c7aca2d0da05d8d5e6220e8a49a86184c8f Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Sun, 15 Mar 2026 22:43:36 +0000 Subject: [PATCH 399/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index ec9d0e8..7783d45 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.11 + 0.3.12-SNAPSHOT jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - JavaFastPFOR-0.3.11 + HEAD From 4beeed0385bb730343911dfce3fb8211db015c6d Mon Sep 17 00:00:00 2001 From: Raunaq Morarka Date: Wed, 17 Jun 2026 12:53:54 +0530 Subject: [PATCH 400/412] Add unrolled bit-packing kernels for longs (widths 1..63) Branch-free unrolled fastpackwithoutmask/fastunpack for all widths, mirroring the 32-bit BitPacking. Measured on Graviton (aarch64), Corretto 21, median over widths 1..63: pack 1.93x, unpack 2.66x. --- .../BenchmarkLongBitPacking.java | 87 + .../longcompression/LongBitPacking.java | 12564 +++++++++++++++- .../longcompression/TestLongBitPacking.java | 140 + 3 files changed, 12775 insertions(+), 16 deletions(-) create mode 100644 src/main/java/me/lemire/longcompression/BenchmarkLongBitPacking.java create mode 100644 src/test/java/me/lemire/longcompression/TestLongBitPacking.java diff --git a/src/main/java/me/lemire/longcompression/BenchmarkLongBitPacking.java b/src/main/java/me/lemire/longcompression/BenchmarkLongBitPacking.java new file mode 100644 index 0000000..d0486a8 --- /dev/null +++ b/src/main/java/me/lemire/longcompression/BenchmarkLongBitPacking.java @@ -0,0 +1,87 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ +package me.lemire.longcompression; + +import java.text.DecimalFormat; +import java.util.Random; + +/** + * Class used to benchmark the speed of long bit packing, comparing the + * generic and unrolled {@link LongBitPacking} kernels. (For expert use.) + * + * @author Daniel Lemire + * + */ +public class BenchmarkLongBitPacking { + + private static void test(boolean verbose) { + DecimalFormat dfspeed = new DecimalFormat("0"); + final int N = 64; + final int times = 100000; + Random r = new Random(0); + long[] data = new long[N]; + long[] compressed = new long[N]; + long[] uncompressed = new long[N]; + for (int bit = 1; bit < 64; ++bit) { + long mask = (1L << bit) - 1; + long slowcomp = 0; + long slowdecomp = 0; + long fastcomp = 0; + long fastdecomp = 0; + for (int t = 0; t < times; ++t) { + for (int k = 0; k < N; ++k) { + data[k] = r.nextLong() & mask; + } + long time1 = System.nanoTime(); + LongBitPacking.slowpackwithoutmask(data, 0, + compressed, 0, bit); + long time2 = System.nanoTime(); + LongBitPacking.slowunpack(compressed, 0, + uncompressed, 0, bit); + long time3 = System.nanoTime(); + LongBitPacking.fastpackwithoutmask(data, 0, + compressed, 0, bit); + long time4 = System.nanoTime(); + LongBitPacking.fastunpack(compressed, 0, + uncompressed, 0, bit); + long time5 = System.nanoTime(); + slowcomp += time2 - time1; + slowdecomp += time3 - time2; + fastcomp += time4 - time3; + fastdecomp += time5 - time4; + } + if (verbose) + System.out.println("bit = " + + bit + + " slow comp. speed = " + + dfspeed.format(N * times * 1000.0 + / (slowcomp)) + + " slow decomp. speed = " + + dfspeed.format(N * times * 1000.0 + / (slowdecomp)) + + " unrolled comp. speed = " + + dfspeed.format(N * times * 1000.0 + / (fastcomp)) + + " unrolled decomp. speed = " + + dfspeed.format(N * times * 1000.0 + / (fastdecomp))); + } + } + + /** + * Main method + * + * @param args + * command-line arguments + */ + public static void main(String[] args) { + System.out.println("Testing long packing (slow vs unrolled) "); + test(false); + test(true); + } + +} diff --git a/src/main/java/me/lemire/longcompression/LongBitPacking.java b/src/main/java/me/lemire/longcompression/LongBitPacking.java index 2d282ec..4b5426f 100644 --- a/src/main/java/me/lemire/longcompression/LongBitPacking.java +++ b/src/main/java/me/lemire/longcompression/LongBitPacking.java @@ -41,14 +41,204 @@ public final class LongBitPacking { */ public static void fastpackwithoutmask(final long[] in, final int inpos, final long[] out, final int outpos, final int bit) { - if (bit == 0) { - fastpackwithoutmask0(in, inpos, out, outpos); - } else if (bit == 64) { - fastpackwithoutmask64(in, inpos, out, outpos); - } else if (bit > 0 && bit < 64) { - slowpackwithoutmask(in, inpos, out, outpos, bit); - } else { - throw new IllegalArgumentException("Unsupported bit width: " + bit); + switch (bit) { + case 0: + fastpackwithoutmask0(in, inpos, out, outpos); + break; + case 1: + fastpackwithoutmask1(in, inpos, out, outpos); + break; + case 2: + fastpackwithoutmask2(in, inpos, out, outpos); + break; + case 3: + fastpackwithoutmask3(in, inpos, out, outpos); + break; + case 4: + fastpackwithoutmask4(in, inpos, out, outpos); + break; + case 5: + fastpackwithoutmask5(in, inpos, out, outpos); + break; + case 6: + fastpackwithoutmask6(in, inpos, out, outpos); + break; + case 7: + fastpackwithoutmask7(in, inpos, out, outpos); + break; + case 8: + fastpackwithoutmask8(in, inpos, out, outpos); + break; + case 9: + fastpackwithoutmask9(in, inpos, out, outpos); + break; + case 10: + fastpackwithoutmask10(in, inpos, out, outpos); + break; + case 11: + fastpackwithoutmask11(in, inpos, out, outpos); + break; + case 12: + fastpackwithoutmask12(in, inpos, out, outpos); + break; + case 13: + fastpackwithoutmask13(in, inpos, out, outpos); + break; + case 14: + fastpackwithoutmask14(in, inpos, out, outpos); + break; + case 15: + fastpackwithoutmask15(in, inpos, out, outpos); + break; + case 16: + fastpackwithoutmask16(in, inpos, out, outpos); + break; + case 17: + fastpackwithoutmask17(in, inpos, out, outpos); + break; + case 18: + fastpackwithoutmask18(in, inpos, out, outpos); + break; + case 19: + fastpackwithoutmask19(in, inpos, out, outpos); + break; + case 20: + fastpackwithoutmask20(in, inpos, out, outpos); + break; + case 21: + fastpackwithoutmask21(in, inpos, out, outpos); + break; + case 22: + fastpackwithoutmask22(in, inpos, out, outpos); + break; + case 23: + fastpackwithoutmask23(in, inpos, out, outpos); + break; + case 24: + fastpackwithoutmask24(in, inpos, out, outpos); + break; + case 25: + fastpackwithoutmask25(in, inpos, out, outpos); + break; + case 26: + fastpackwithoutmask26(in, inpos, out, outpos); + break; + case 27: + fastpackwithoutmask27(in, inpos, out, outpos); + break; + case 28: + fastpackwithoutmask28(in, inpos, out, outpos); + break; + case 29: + fastpackwithoutmask29(in, inpos, out, outpos); + break; + case 30: + fastpackwithoutmask30(in, inpos, out, outpos); + break; + case 31: + fastpackwithoutmask31(in, inpos, out, outpos); + break; + case 32: + fastpackwithoutmask32(in, inpos, out, outpos); + break; + case 33: + fastpackwithoutmask33(in, inpos, out, outpos); + break; + case 34: + fastpackwithoutmask34(in, inpos, out, outpos); + break; + case 35: + fastpackwithoutmask35(in, inpos, out, outpos); + break; + case 36: + fastpackwithoutmask36(in, inpos, out, outpos); + break; + case 37: + fastpackwithoutmask37(in, inpos, out, outpos); + break; + case 38: + fastpackwithoutmask38(in, inpos, out, outpos); + break; + case 39: + fastpackwithoutmask39(in, inpos, out, outpos); + break; + case 40: + fastpackwithoutmask40(in, inpos, out, outpos); + break; + case 41: + fastpackwithoutmask41(in, inpos, out, outpos); + break; + case 42: + fastpackwithoutmask42(in, inpos, out, outpos); + break; + case 43: + fastpackwithoutmask43(in, inpos, out, outpos); + break; + case 44: + fastpackwithoutmask44(in, inpos, out, outpos); + break; + case 45: + fastpackwithoutmask45(in, inpos, out, outpos); + break; + case 46: + fastpackwithoutmask46(in, inpos, out, outpos); + break; + case 47: + fastpackwithoutmask47(in, inpos, out, outpos); + break; + case 48: + fastpackwithoutmask48(in, inpos, out, outpos); + break; + case 49: + fastpackwithoutmask49(in, inpos, out, outpos); + break; + case 50: + fastpackwithoutmask50(in, inpos, out, outpos); + break; + case 51: + fastpackwithoutmask51(in, inpos, out, outpos); + break; + case 52: + fastpackwithoutmask52(in, inpos, out, outpos); + break; + case 53: + fastpackwithoutmask53(in, inpos, out, outpos); + break; + case 54: + fastpackwithoutmask54(in, inpos, out, outpos); + break; + case 55: + fastpackwithoutmask55(in, inpos, out, outpos); + break; + case 56: + fastpackwithoutmask56(in, inpos, out, outpos); + break; + case 57: + fastpackwithoutmask57(in, inpos, out, outpos); + break; + case 58: + fastpackwithoutmask58(in, inpos, out, outpos); + break; + case 59: + fastpackwithoutmask59(in, inpos, out, outpos); + break; + case 60: + fastpackwithoutmask60(in, inpos, out, outpos); + break; + case 61: + fastpackwithoutmask61(in, inpos, out, outpos); + break; + case 62: + fastpackwithoutmask62(in, inpos, out, outpos); + break; + case 63: + fastpackwithoutmask63(in, inpos, out, outpos); + break; + case 64: + fastpackwithoutmask64(in, inpos, out, outpos); + break; + default: + throw new IllegalArgumentException("Unsupported bit width: " + bit); } } @@ -57,6 +247,6050 @@ protected static void fastpackwithoutmask0(final long[] in, int inpos, // nothing } + protected static void fastpackwithoutmask1(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 1) + | ((in[2 + inpos]) << 2) + | ((in[3 + inpos]) << 3) + | ((in[4 + inpos]) << 4) + | ((in[5 + inpos]) << 5) + | ((in[6 + inpos]) << 6) + | ((in[7 + inpos]) << 7) + | ((in[8 + inpos]) << 8) + | ((in[9 + inpos]) << 9) + | ((in[10 + inpos]) << 10) + | ((in[11 + inpos]) << 11) + | ((in[12 + inpos]) << 12) + | ((in[13 + inpos]) << 13) + | ((in[14 + inpos]) << 14) + | ((in[15 + inpos]) << 15) + | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 17) + | ((in[18 + inpos]) << 18) + | ((in[19 + inpos]) << 19) + | ((in[20 + inpos]) << 20) + | ((in[21 + inpos]) << 21) + | ((in[22 + inpos]) << 22) + | ((in[23 + inpos]) << 23) + | ((in[24 + inpos]) << 24) + | ((in[25 + inpos]) << 25) + | ((in[26 + inpos]) << 26) + | ((in[27 + inpos]) << 27) + | ((in[28 + inpos]) << 28) + | ((in[29 + inpos]) << 29) + | ((in[30 + inpos]) << 30) + | ((in[31 + inpos]) << 31) + | ((in[32 + inpos]) << 32) + | ((in[33 + inpos]) << 33) + | ((in[34 + inpos]) << 34) + | ((in[35 + inpos]) << 35) + | ((in[36 + inpos]) << 36) + | ((in[37 + inpos]) << 37) + | ((in[38 + inpos]) << 38) + | ((in[39 + inpos]) << 39) + | ((in[40 + inpos]) << 40) + | ((in[41 + inpos]) << 41) + | ((in[42 + inpos]) << 42) + | ((in[43 + inpos]) << 43) + | ((in[44 + inpos]) << 44) + | ((in[45 + inpos]) << 45) + | ((in[46 + inpos]) << 46) + | ((in[47 + inpos]) << 47) + | ((in[48 + inpos]) << 48) + | ((in[49 + inpos]) << 49) + | ((in[50 + inpos]) << 50) + | ((in[51 + inpos]) << 51) + | ((in[52 + inpos]) << 52) + | ((in[53 + inpos]) << 53) + | ((in[54 + inpos]) << 54) + | ((in[55 + inpos]) << 55) + | ((in[56 + inpos]) << 56) + | ((in[57 + inpos]) << 57) + | ((in[58 + inpos]) << 58) + | ((in[59 + inpos]) << 59) + | ((in[60 + inpos]) << 60) + | ((in[61 + inpos]) << 61) + | ((in[62 + inpos]) << 62) + | ((in[63 + inpos]) << 63); + } + + protected static void fastpackwithoutmask2(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 2) + | ((in[2 + inpos]) << 4) + | ((in[3 + inpos]) << 6) + | ((in[4 + inpos]) << 8) + | ((in[5 + inpos]) << 10) + | ((in[6 + inpos]) << 12) + | ((in[7 + inpos]) << 14) + | ((in[8 + inpos]) << 16) + | ((in[9 + inpos]) << 18) + | ((in[10 + inpos]) << 20) + | ((in[11 + inpos]) << 22) + | ((in[12 + inpos]) << 24) + | ((in[13 + inpos]) << 26) + | ((in[14 + inpos]) << 28) + | ((in[15 + inpos]) << 30) + | ((in[16 + inpos]) << 32) + | ((in[17 + inpos]) << 34) + | ((in[18 + inpos]) << 36) + | ((in[19 + inpos]) << 38) + | ((in[20 + inpos]) << 40) + | ((in[21 + inpos]) << 42) + | ((in[22 + inpos]) << 44) + | ((in[23 + inpos]) << 46) + | ((in[24 + inpos]) << 48) + | ((in[25 + inpos]) << 50) + | ((in[26 + inpos]) << 52) + | ((in[27 + inpos]) << 54) + | ((in[28 + inpos]) << 56) + | ((in[29 + inpos]) << 58) + | ((in[30 + inpos]) << 60) + | ((in[31 + inpos]) << 62); + out[1 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 2) + | ((in[34 + inpos]) << 4) + | ((in[35 + inpos]) << 6) + | ((in[36 + inpos]) << 8) + | ((in[37 + inpos]) << 10) + | ((in[38 + inpos]) << 12) + | ((in[39 + inpos]) << 14) + | ((in[40 + inpos]) << 16) + | ((in[41 + inpos]) << 18) + | ((in[42 + inpos]) << 20) + | ((in[43 + inpos]) << 22) + | ((in[44 + inpos]) << 24) + | ((in[45 + inpos]) << 26) + | ((in[46 + inpos]) << 28) + | ((in[47 + inpos]) << 30) + | ((in[48 + inpos]) << 32) + | ((in[49 + inpos]) << 34) + | ((in[50 + inpos]) << 36) + | ((in[51 + inpos]) << 38) + | ((in[52 + inpos]) << 40) + | ((in[53 + inpos]) << 42) + | ((in[54 + inpos]) << 44) + | ((in[55 + inpos]) << 46) + | ((in[56 + inpos]) << 48) + | ((in[57 + inpos]) << 50) + | ((in[58 + inpos]) << 52) + | ((in[59 + inpos]) << 54) + | ((in[60 + inpos]) << 56) + | ((in[61 + inpos]) << 58) + | ((in[62 + inpos]) << 60) + | ((in[63 + inpos]) << 62); + } + + protected static void fastpackwithoutmask3(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 3) + | ((in[2 + inpos]) << 6) + | ((in[3 + inpos]) << 9) + | ((in[4 + inpos]) << 12) + | ((in[5 + inpos]) << 15) + | ((in[6 + inpos]) << 18) + | ((in[7 + inpos]) << 21) + | ((in[8 + inpos]) << 24) + | ((in[9 + inpos]) << 27) + | ((in[10 + inpos]) << 30) + | ((in[11 + inpos]) << 33) + | ((in[12 + inpos]) << 36) + | ((in[13 + inpos]) << 39) + | ((in[14 + inpos]) << 42) + | ((in[15 + inpos]) << 45) + | ((in[16 + inpos]) << 48) + | ((in[17 + inpos]) << 51) + | ((in[18 + inpos]) << 54) + | ((in[19 + inpos]) << 57) + | ((in[20 + inpos]) << 60) + | ((in[21 + inpos]) << 63); + out[1 + outpos] = ((in[21 + inpos]) >>> (3 - 2)) + | ((in[22 + inpos]) << 2) + | ((in[23 + inpos]) << 5) + | ((in[24 + inpos]) << 8) + | ((in[25 + inpos]) << 11) + | ((in[26 + inpos]) << 14) + | ((in[27 + inpos]) << 17) + | ((in[28 + inpos]) << 20) + | ((in[29 + inpos]) << 23) + | ((in[30 + inpos]) << 26) + | ((in[31 + inpos]) << 29) + | ((in[32 + inpos]) << 32) + | ((in[33 + inpos]) << 35) + | ((in[34 + inpos]) << 38) + | ((in[35 + inpos]) << 41) + | ((in[36 + inpos]) << 44) + | ((in[37 + inpos]) << 47) + | ((in[38 + inpos]) << 50) + | ((in[39 + inpos]) << 53) + | ((in[40 + inpos]) << 56) + | ((in[41 + inpos]) << 59) + | ((in[42 + inpos]) << 62); + out[2 + outpos] = ((in[42 + inpos]) >>> (3 - 1)) + | ((in[43 + inpos]) << 1) + | ((in[44 + inpos]) << 4) + | ((in[45 + inpos]) << 7) + | ((in[46 + inpos]) << 10) + | ((in[47 + inpos]) << 13) + | ((in[48 + inpos]) << 16) + | ((in[49 + inpos]) << 19) + | ((in[50 + inpos]) << 22) + | ((in[51 + inpos]) << 25) + | ((in[52 + inpos]) << 28) + | ((in[53 + inpos]) << 31) + | ((in[54 + inpos]) << 34) + | ((in[55 + inpos]) << 37) + | ((in[56 + inpos]) << 40) + | ((in[57 + inpos]) << 43) + | ((in[58 + inpos]) << 46) + | ((in[59 + inpos]) << 49) + | ((in[60 + inpos]) << 52) + | ((in[61 + inpos]) << 55) + | ((in[62 + inpos]) << 58) + | ((in[63 + inpos]) << 61); + } + + protected static void fastpackwithoutmask4(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 4) + | ((in[2 + inpos]) << 8) + | ((in[3 + inpos]) << 12) + | ((in[4 + inpos]) << 16) + | ((in[5 + inpos]) << 20) + | ((in[6 + inpos]) << 24) + | ((in[7 + inpos]) << 28) + | ((in[8 + inpos]) << 32) + | ((in[9 + inpos]) << 36) + | ((in[10 + inpos]) << 40) + | ((in[11 + inpos]) << 44) + | ((in[12 + inpos]) << 48) + | ((in[13 + inpos]) << 52) + | ((in[14 + inpos]) << 56) + | ((in[15 + inpos]) << 60); + out[1 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 4) + | ((in[18 + inpos]) << 8) + | ((in[19 + inpos]) << 12) + | ((in[20 + inpos]) << 16) + | ((in[21 + inpos]) << 20) + | ((in[22 + inpos]) << 24) + | ((in[23 + inpos]) << 28) + | ((in[24 + inpos]) << 32) + | ((in[25 + inpos]) << 36) + | ((in[26 + inpos]) << 40) + | ((in[27 + inpos]) << 44) + | ((in[28 + inpos]) << 48) + | ((in[29 + inpos]) << 52) + | ((in[30 + inpos]) << 56) + | ((in[31 + inpos]) << 60); + out[2 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 4) + | ((in[34 + inpos]) << 8) + | ((in[35 + inpos]) << 12) + | ((in[36 + inpos]) << 16) + | ((in[37 + inpos]) << 20) + | ((in[38 + inpos]) << 24) + | ((in[39 + inpos]) << 28) + | ((in[40 + inpos]) << 32) + | ((in[41 + inpos]) << 36) + | ((in[42 + inpos]) << 40) + | ((in[43 + inpos]) << 44) + | ((in[44 + inpos]) << 48) + | ((in[45 + inpos]) << 52) + | ((in[46 + inpos]) << 56) + | ((in[47 + inpos]) << 60); + out[3 + outpos] = in[48 + inpos] + | ((in[49 + inpos]) << 4) + | ((in[50 + inpos]) << 8) + | ((in[51 + inpos]) << 12) + | ((in[52 + inpos]) << 16) + | ((in[53 + inpos]) << 20) + | ((in[54 + inpos]) << 24) + | ((in[55 + inpos]) << 28) + | ((in[56 + inpos]) << 32) + | ((in[57 + inpos]) << 36) + | ((in[58 + inpos]) << 40) + | ((in[59 + inpos]) << 44) + | ((in[60 + inpos]) << 48) + | ((in[61 + inpos]) << 52) + | ((in[62 + inpos]) << 56) + | ((in[63 + inpos]) << 60); + } + + protected static void fastpackwithoutmask5(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 5) + | ((in[2 + inpos]) << 10) + | ((in[3 + inpos]) << 15) + | ((in[4 + inpos]) << 20) + | ((in[5 + inpos]) << 25) + | ((in[6 + inpos]) << 30) + | ((in[7 + inpos]) << 35) + | ((in[8 + inpos]) << 40) + | ((in[9 + inpos]) << 45) + | ((in[10 + inpos]) << 50) + | ((in[11 + inpos]) << 55) + | ((in[12 + inpos]) << 60); + out[1 + outpos] = ((in[12 + inpos]) >>> (5 - 1)) + | ((in[13 + inpos]) << 1) + | ((in[14 + inpos]) << 6) + | ((in[15 + inpos]) << 11) + | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 21) + | ((in[18 + inpos]) << 26) + | ((in[19 + inpos]) << 31) + | ((in[20 + inpos]) << 36) + | ((in[21 + inpos]) << 41) + | ((in[22 + inpos]) << 46) + | ((in[23 + inpos]) << 51) + | ((in[24 + inpos]) << 56) + | ((in[25 + inpos]) << 61); + out[2 + outpos] = ((in[25 + inpos]) >>> (5 - 2)) + | ((in[26 + inpos]) << 2) + | ((in[27 + inpos]) << 7) + | ((in[28 + inpos]) << 12) + | ((in[29 + inpos]) << 17) + | ((in[30 + inpos]) << 22) + | ((in[31 + inpos]) << 27) + | ((in[32 + inpos]) << 32) + | ((in[33 + inpos]) << 37) + | ((in[34 + inpos]) << 42) + | ((in[35 + inpos]) << 47) + | ((in[36 + inpos]) << 52) + | ((in[37 + inpos]) << 57) + | ((in[38 + inpos]) << 62); + out[3 + outpos] = ((in[38 + inpos]) >>> (5 - 3)) + | ((in[39 + inpos]) << 3) + | ((in[40 + inpos]) << 8) + | ((in[41 + inpos]) << 13) + | ((in[42 + inpos]) << 18) + | ((in[43 + inpos]) << 23) + | ((in[44 + inpos]) << 28) + | ((in[45 + inpos]) << 33) + | ((in[46 + inpos]) << 38) + | ((in[47 + inpos]) << 43) + | ((in[48 + inpos]) << 48) + | ((in[49 + inpos]) << 53) + | ((in[50 + inpos]) << 58) + | ((in[51 + inpos]) << 63); + out[4 + outpos] = ((in[51 + inpos]) >>> (5 - 4)) + | ((in[52 + inpos]) << 4) + | ((in[53 + inpos]) << 9) + | ((in[54 + inpos]) << 14) + | ((in[55 + inpos]) << 19) + | ((in[56 + inpos]) << 24) + | ((in[57 + inpos]) << 29) + | ((in[58 + inpos]) << 34) + | ((in[59 + inpos]) << 39) + | ((in[60 + inpos]) << 44) + | ((in[61 + inpos]) << 49) + | ((in[62 + inpos]) << 54) + | ((in[63 + inpos]) << 59); + } + + protected static void fastpackwithoutmask6(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 6) + | ((in[2 + inpos]) << 12) + | ((in[3 + inpos]) << 18) + | ((in[4 + inpos]) << 24) + | ((in[5 + inpos]) << 30) + | ((in[6 + inpos]) << 36) + | ((in[7 + inpos]) << 42) + | ((in[8 + inpos]) << 48) + | ((in[9 + inpos]) << 54) + | ((in[10 + inpos]) << 60); + out[1 + outpos] = ((in[10 + inpos]) >>> (6 - 2)) + | ((in[11 + inpos]) << 2) + | ((in[12 + inpos]) << 8) + | ((in[13 + inpos]) << 14) + | ((in[14 + inpos]) << 20) + | ((in[15 + inpos]) << 26) + | ((in[16 + inpos]) << 32) + | ((in[17 + inpos]) << 38) + | ((in[18 + inpos]) << 44) + | ((in[19 + inpos]) << 50) + | ((in[20 + inpos]) << 56) + | ((in[21 + inpos]) << 62); + out[2 + outpos] = ((in[21 + inpos]) >>> (6 - 4)) + | ((in[22 + inpos]) << 4) + | ((in[23 + inpos]) << 10) + | ((in[24 + inpos]) << 16) + | ((in[25 + inpos]) << 22) + | ((in[26 + inpos]) << 28) + | ((in[27 + inpos]) << 34) + | ((in[28 + inpos]) << 40) + | ((in[29 + inpos]) << 46) + | ((in[30 + inpos]) << 52) + | ((in[31 + inpos]) << 58); + out[3 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 6) + | ((in[34 + inpos]) << 12) + | ((in[35 + inpos]) << 18) + | ((in[36 + inpos]) << 24) + | ((in[37 + inpos]) << 30) + | ((in[38 + inpos]) << 36) + | ((in[39 + inpos]) << 42) + | ((in[40 + inpos]) << 48) + | ((in[41 + inpos]) << 54) + | ((in[42 + inpos]) << 60); + out[4 + outpos] = ((in[42 + inpos]) >>> (6 - 2)) + | ((in[43 + inpos]) << 2) + | ((in[44 + inpos]) << 8) + | ((in[45 + inpos]) << 14) + | ((in[46 + inpos]) << 20) + | ((in[47 + inpos]) << 26) + | ((in[48 + inpos]) << 32) + | ((in[49 + inpos]) << 38) + | ((in[50 + inpos]) << 44) + | ((in[51 + inpos]) << 50) + | ((in[52 + inpos]) << 56) + | ((in[53 + inpos]) << 62); + out[5 + outpos] = ((in[53 + inpos]) >>> (6 - 4)) + | ((in[54 + inpos]) << 4) + | ((in[55 + inpos]) << 10) + | ((in[56 + inpos]) << 16) + | ((in[57 + inpos]) << 22) + | ((in[58 + inpos]) << 28) + | ((in[59 + inpos]) << 34) + | ((in[60 + inpos]) << 40) + | ((in[61 + inpos]) << 46) + | ((in[62 + inpos]) << 52) + | ((in[63 + inpos]) << 58); + } + + protected static void fastpackwithoutmask7(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 7) + | ((in[2 + inpos]) << 14) + | ((in[3 + inpos]) << 21) + | ((in[4 + inpos]) << 28) + | ((in[5 + inpos]) << 35) + | ((in[6 + inpos]) << 42) + | ((in[7 + inpos]) << 49) + | ((in[8 + inpos]) << 56) + | ((in[9 + inpos]) << 63); + out[1 + outpos] = ((in[9 + inpos]) >>> (7 - 6)) + | ((in[10 + inpos]) << 6) + | ((in[11 + inpos]) << 13) + | ((in[12 + inpos]) << 20) + | ((in[13 + inpos]) << 27) + | ((in[14 + inpos]) << 34) + | ((in[15 + inpos]) << 41) + | ((in[16 + inpos]) << 48) + | ((in[17 + inpos]) << 55) + | ((in[18 + inpos]) << 62); + out[2 + outpos] = ((in[18 + inpos]) >>> (7 - 5)) + | ((in[19 + inpos]) << 5) + | ((in[20 + inpos]) << 12) + | ((in[21 + inpos]) << 19) + | ((in[22 + inpos]) << 26) + | ((in[23 + inpos]) << 33) + | ((in[24 + inpos]) << 40) + | ((in[25 + inpos]) << 47) + | ((in[26 + inpos]) << 54) + | ((in[27 + inpos]) << 61); + out[3 + outpos] = ((in[27 + inpos]) >>> (7 - 4)) + | ((in[28 + inpos]) << 4) + | ((in[29 + inpos]) << 11) + | ((in[30 + inpos]) << 18) + | ((in[31 + inpos]) << 25) + | ((in[32 + inpos]) << 32) + | ((in[33 + inpos]) << 39) + | ((in[34 + inpos]) << 46) + | ((in[35 + inpos]) << 53) + | ((in[36 + inpos]) << 60); + out[4 + outpos] = ((in[36 + inpos]) >>> (7 - 3)) + | ((in[37 + inpos]) << 3) + | ((in[38 + inpos]) << 10) + | ((in[39 + inpos]) << 17) + | ((in[40 + inpos]) << 24) + | ((in[41 + inpos]) << 31) + | ((in[42 + inpos]) << 38) + | ((in[43 + inpos]) << 45) + | ((in[44 + inpos]) << 52) + | ((in[45 + inpos]) << 59); + out[5 + outpos] = ((in[45 + inpos]) >>> (7 - 2)) + | ((in[46 + inpos]) << 2) + | ((in[47 + inpos]) << 9) + | ((in[48 + inpos]) << 16) + | ((in[49 + inpos]) << 23) + | ((in[50 + inpos]) << 30) + | ((in[51 + inpos]) << 37) + | ((in[52 + inpos]) << 44) + | ((in[53 + inpos]) << 51) + | ((in[54 + inpos]) << 58); + out[6 + outpos] = ((in[54 + inpos]) >>> (7 - 1)) + | ((in[55 + inpos]) << 1) + | ((in[56 + inpos]) << 8) + | ((in[57 + inpos]) << 15) + | ((in[58 + inpos]) << 22) + | ((in[59 + inpos]) << 29) + | ((in[60 + inpos]) << 36) + | ((in[61 + inpos]) << 43) + | ((in[62 + inpos]) << 50) + | ((in[63 + inpos]) << 57); + } + + protected static void fastpackwithoutmask8(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 8) + | ((in[2 + inpos]) << 16) + | ((in[3 + inpos]) << 24) + | ((in[4 + inpos]) << 32) + | ((in[5 + inpos]) << 40) + | ((in[6 + inpos]) << 48) + | ((in[7 + inpos]) << 56); + out[1 + outpos] = in[8 + inpos] | ((in[9 + inpos]) << 8) + | ((in[10 + inpos]) << 16) + | ((in[11 + inpos]) << 24) + | ((in[12 + inpos]) << 32) + | ((in[13 + inpos]) << 40) + | ((in[14 + inpos]) << 48) + | ((in[15 + inpos]) << 56); + out[2 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 8) + | ((in[18 + inpos]) << 16) + | ((in[19 + inpos]) << 24) + | ((in[20 + inpos]) << 32) + | ((in[21 + inpos]) << 40) + | ((in[22 + inpos]) << 48) + | ((in[23 + inpos]) << 56); + out[3 + outpos] = in[24 + inpos] + | ((in[25 + inpos]) << 8) + | ((in[26 + inpos]) << 16) + | ((in[27 + inpos]) << 24) + | ((in[28 + inpos]) << 32) + | ((in[29 + inpos]) << 40) + | ((in[30 + inpos]) << 48) + | ((in[31 + inpos]) << 56); + out[4 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 8) + | ((in[34 + inpos]) << 16) + | ((in[35 + inpos]) << 24) + | ((in[36 + inpos]) << 32) + | ((in[37 + inpos]) << 40) + | ((in[38 + inpos]) << 48) + | ((in[39 + inpos]) << 56); + out[5 + outpos] = in[40 + inpos] + | ((in[41 + inpos]) << 8) + | ((in[42 + inpos]) << 16) + | ((in[43 + inpos]) << 24) + | ((in[44 + inpos]) << 32) + | ((in[45 + inpos]) << 40) + | ((in[46 + inpos]) << 48) + | ((in[47 + inpos]) << 56); + out[6 + outpos] = in[48 + inpos] + | ((in[49 + inpos]) << 8) + | ((in[50 + inpos]) << 16) + | ((in[51 + inpos]) << 24) + | ((in[52 + inpos]) << 32) + | ((in[53 + inpos]) << 40) + | ((in[54 + inpos]) << 48) + | ((in[55 + inpos]) << 56); + out[7 + outpos] = in[56 + inpos] + | ((in[57 + inpos]) << 8) + | ((in[58 + inpos]) << 16) + | ((in[59 + inpos]) << 24) + | ((in[60 + inpos]) << 32) + | ((in[61 + inpos]) << 40) + | ((in[62 + inpos]) << 48) + | ((in[63 + inpos]) << 56); + } + + protected static void fastpackwithoutmask9(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 9) + | ((in[2 + inpos]) << 18) + | ((in[3 + inpos]) << 27) + | ((in[4 + inpos]) << 36) + | ((in[5 + inpos]) << 45) + | ((in[6 + inpos]) << 54) + | ((in[7 + inpos]) << 63); + out[1 + outpos] = ((in[7 + inpos]) >>> (9 - 8)) + | ((in[8 + inpos]) << 8) + | ((in[9 + inpos]) << 17) + | ((in[10 + inpos]) << 26) + | ((in[11 + inpos]) << 35) + | ((in[12 + inpos]) << 44) + | ((in[13 + inpos]) << 53) + | ((in[14 + inpos]) << 62); + out[2 + outpos] = ((in[14 + inpos]) >>> (9 - 7)) + | ((in[15 + inpos]) << 7) + | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 25) + | ((in[18 + inpos]) << 34) + | ((in[19 + inpos]) << 43) + | ((in[20 + inpos]) << 52) + | ((in[21 + inpos]) << 61); + out[3 + outpos] = ((in[21 + inpos]) >>> (9 - 6)) + | ((in[22 + inpos]) << 6) + | ((in[23 + inpos]) << 15) + | ((in[24 + inpos]) << 24) + | ((in[25 + inpos]) << 33) + | ((in[26 + inpos]) << 42) + | ((in[27 + inpos]) << 51) + | ((in[28 + inpos]) << 60); + out[4 + outpos] = ((in[28 + inpos]) >>> (9 - 5)) + | ((in[29 + inpos]) << 5) + | ((in[30 + inpos]) << 14) + | ((in[31 + inpos]) << 23) + | ((in[32 + inpos]) << 32) + | ((in[33 + inpos]) << 41) + | ((in[34 + inpos]) << 50) + | ((in[35 + inpos]) << 59); + out[5 + outpos] = ((in[35 + inpos]) >>> (9 - 4)) + | ((in[36 + inpos]) << 4) + | ((in[37 + inpos]) << 13) + | ((in[38 + inpos]) << 22) + | ((in[39 + inpos]) << 31) + | ((in[40 + inpos]) << 40) + | ((in[41 + inpos]) << 49) + | ((in[42 + inpos]) << 58); + out[6 + outpos] = ((in[42 + inpos]) >>> (9 - 3)) + | ((in[43 + inpos]) << 3) + | ((in[44 + inpos]) << 12) + | ((in[45 + inpos]) << 21) + | ((in[46 + inpos]) << 30) + | ((in[47 + inpos]) << 39) + | ((in[48 + inpos]) << 48) + | ((in[49 + inpos]) << 57); + out[7 + outpos] = ((in[49 + inpos]) >>> (9 - 2)) + | ((in[50 + inpos]) << 2) + | ((in[51 + inpos]) << 11) + | ((in[52 + inpos]) << 20) + | ((in[53 + inpos]) << 29) + | ((in[54 + inpos]) << 38) + | ((in[55 + inpos]) << 47) + | ((in[56 + inpos]) << 56); + out[8 + outpos] = ((in[56 + inpos]) >>> (9 - 1)) + | ((in[57 + inpos]) << 1) + | ((in[58 + inpos]) << 10) + | ((in[59 + inpos]) << 19) + | ((in[60 + inpos]) << 28) + | ((in[61 + inpos]) << 37) + | ((in[62 + inpos]) << 46) + | ((in[63 + inpos]) << 55); + } + + protected static void fastpackwithoutmask10(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 10) + | ((in[2 + inpos]) << 20) + | ((in[3 + inpos]) << 30) + | ((in[4 + inpos]) << 40) + | ((in[5 + inpos]) << 50) + | ((in[6 + inpos]) << 60); + out[1 + outpos] = ((in[6 + inpos]) >>> (10 - 6)) + | ((in[7 + inpos]) << 6) + | ((in[8 + inpos]) << 16) + | ((in[9 + inpos]) << 26) + | ((in[10 + inpos]) << 36) + | ((in[11 + inpos]) << 46) + | ((in[12 + inpos]) << 56); + out[2 + outpos] = ((in[12 + inpos]) >>> (10 - 2)) + | ((in[13 + inpos]) << 2) + | ((in[14 + inpos]) << 12) + | ((in[15 + inpos]) << 22) + | ((in[16 + inpos]) << 32) + | ((in[17 + inpos]) << 42) + | ((in[18 + inpos]) << 52) + | ((in[19 + inpos]) << 62); + out[3 + outpos] = ((in[19 + inpos]) >>> (10 - 8)) + | ((in[20 + inpos]) << 8) + | ((in[21 + inpos]) << 18) + | ((in[22 + inpos]) << 28) + | ((in[23 + inpos]) << 38) + | ((in[24 + inpos]) << 48) + | ((in[25 + inpos]) << 58); + out[4 + outpos] = ((in[25 + inpos]) >>> (10 - 4)) + | ((in[26 + inpos]) << 4) + | ((in[27 + inpos]) << 14) + | ((in[28 + inpos]) << 24) + | ((in[29 + inpos]) << 34) + | ((in[30 + inpos]) << 44) + | ((in[31 + inpos]) << 54); + out[5 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 10) + | ((in[34 + inpos]) << 20) + | ((in[35 + inpos]) << 30) + | ((in[36 + inpos]) << 40) + | ((in[37 + inpos]) << 50) + | ((in[38 + inpos]) << 60); + out[6 + outpos] = ((in[38 + inpos]) >>> (10 - 6)) + | ((in[39 + inpos]) << 6) + | ((in[40 + inpos]) << 16) + | ((in[41 + inpos]) << 26) + | ((in[42 + inpos]) << 36) + | ((in[43 + inpos]) << 46) + | ((in[44 + inpos]) << 56); + out[7 + outpos] = ((in[44 + inpos]) >>> (10 - 2)) + | ((in[45 + inpos]) << 2) + | ((in[46 + inpos]) << 12) + | ((in[47 + inpos]) << 22) + | ((in[48 + inpos]) << 32) + | ((in[49 + inpos]) << 42) + | ((in[50 + inpos]) << 52) + | ((in[51 + inpos]) << 62); + out[8 + outpos] = ((in[51 + inpos]) >>> (10 - 8)) + | ((in[52 + inpos]) << 8) + | ((in[53 + inpos]) << 18) + | ((in[54 + inpos]) << 28) + | ((in[55 + inpos]) << 38) + | ((in[56 + inpos]) << 48) + | ((in[57 + inpos]) << 58); + out[9 + outpos] = ((in[57 + inpos]) >>> (10 - 4)) + | ((in[58 + inpos]) << 4) + | ((in[59 + inpos]) << 14) + | ((in[60 + inpos]) << 24) + | ((in[61 + inpos]) << 34) + | ((in[62 + inpos]) << 44) + | ((in[63 + inpos]) << 54); + } + + protected static void fastpackwithoutmask11(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 11) + | ((in[2 + inpos]) << 22) + | ((in[3 + inpos]) << 33) + | ((in[4 + inpos]) << 44) + | ((in[5 + inpos]) << 55); + out[1 + outpos] = ((in[5 + inpos]) >>> (11 - 2)) + | ((in[6 + inpos]) << 2) + | ((in[7 + inpos]) << 13) + | ((in[8 + inpos]) << 24) + | ((in[9 + inpos]) << 35) + | ((in[10 + inpos]) << 46) + | ((in[11 + inpos]) << 57); + out[2 + outpos] = ((in[11 + inpos]) >>> (11 - 4)) + | ((in[12 + inpos]) << 4) + | ((in[13 + inpos]) << 15) + | ((in[14 + inpos]) << 26) + | ((in[15 + inpos]) << 37) + | ((in[16 + inpos]) << 48) + | ((in[17 + inpos]) << 59); + out[3 + outpos] = ((in[17 + inpos]) >>> (11 - 6)) + | ((in[18 + inpos]) << 6) + | ((in[19 + inpos]) << 17) + | ((in[20 + inpos]) << 28) + | ((in[21 + inpos]) << 39) + | ((in[22 + inpos]) << 50) + | ((in[23 + inpos]) << 61); + out[4 + outpos] = ((in[23 + inpos]) >>> (11 - 8)) + | ((in[24 + inpos]) << 8) + | ((in[25 + inpos]) << 19) + | ((in[26 + inpos]) << 30) + | ((in[27 + inpos]) << 41) + | ((in[28 + inpos]) << 52) + | ((in[29 + inpos]) << 63); + out[5 + outpos] = ((in[29 + inpos]) >>> (11 - 10)) + | ((in[30 + inpos]) << 10) + | ((in[31 + inpos]) << 21) + | ((in[32 + inpos]) << 32) + | ((in[33 + inpos]) << 43) + | ((in[34 + inpos]) << 54); + out[6 + outpos] = ((in[34 + inpos]) >>> (11 - 1)) + | ((in[35 + inpos]) << 1) + | ((in[36 + inpos]) << 12) + | ((in[37 + inpos]) << 23) + | ((in[38 + inpos]) << 34) + | ((in[39 + inpos]) << 45) + | ((in[40 + inpos]) << 56); + out[7 + outpos] = ((in[40 + inpos]) >>> (11 - 3)) + | ((in[41 + inpos]) << 3) + | ((in[42 + inpos]) << 14) + | ((in[43 + inpos]) << 25) + | ((in[44 + inpos]) << 36) + | ((in[45 + inpos]) << 47) + | ((in[46 + inpos]) << 58); + out[8 + outpos] = ((in[46 + inpos]) >>> (11 - 5)) + | ((in[47 + inpos]) << 5) + | ((in[48 + inpos]) << 16) + | ((in[49 + inpos]) << 27) + | ((in[50 + inpos]) << 38) + | ((in[51 + inpos]) << 49) + | ((in[52 + inpos]) << 60); + out[9 + outpos] = ((in[52 + inpos]) >>> (11 - 7)) + | ((in[53 + inpos]) << 7) + | ((in[54 + inpos]) << 18) + | ((in[55 + inpos]) << 29) + | ((in[56 + inpos]) << 40) + | ((in[57 + inpos]) << 51) + | ((in[58 + inpos]) << 62); + out[10 + outpos] = ((in[58 + inpos]) >>> (11 - 9)) + | ((in[59 + inpos]) << 9) + | ((in[60 + inpos]) << 20) + | ((in[61 + inpos]) << 31) + | ((in[62 + inpos]) << 42) + | ((in[63 + inpos]) << 53); + } + + protected static void fastpackwithoutmask12(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 12) + | ((in[2 + inpos]) << 24) + | ((in[3 + inpos]) << 36) + | ((in[4 + inpos]) << 48) + | ((in[5 + inpos]) << 60); + out[1 + outpos] = ((in[5 + inpos]) >>> (12 - 8)) + | ((in[6 + inpos]) << 8) + | ((in[7 + inpos]) << 20) + | ((in[8 + inpos]) << 32) + | ((in[9 + inpos]) << 44) + | ((in[10 + inpos]) << 56); + out[2 + outpos] = ((in[10 + inpos]) >>> (12 - 4)) + | ((in[11 + inpos]) << 4) + | ((in[12 + inpos]) << 16) + | ((in[13 + inpos]) << 28) + | ((in[14 + inpos]) << 40) + | ((in[15 + inpos]) << 52); + out[3 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 12) + | ((in[18 + inpos]) << 24) + | ((in[19 + inpos]) << 36) + | ((in[20 + inpos]) << 48) + | ((in[21 + inpos]) << 60); + out[4 + outpos] = ((in[21 + inpos]) >>> (12 - 8)) + | ((in[22 + inpos]) << 8) + | ((in[23 + inpos]) << 20) + | ((in[24 + inpos]) << 32) + | ((in[25 + inpos]) << 44) + | ((in[26 + inpos]) << 56); + out[5 + outpos] = ((in[26 + inpos]) >>> (12 - 4)) + | ((in[27 + inpos]) << 4) + | ((in[28 + inpos]) << 16) + | ((in[29 + inpos]) << 28) + | ((in[30 + inpos]) << 40) + | ((in[31 + inpos]) << 52); + out[6 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 12) + | ((in[34 + inpos]) << 24) + | ((in[35 + inpos]) << 36) + | ((in[36 + inpos]) << 48) + | ((in[37 + inpos]) << 60); + out[7 + outpos] = ((in[37 + inpos]) >>> (12 - 8)) + | ((in[38 + inpos]) << 8) + | ((in[39 + inpos]) << 20) + | ((in[40 + inpos]) << 32) + | ((in[41 + inpos]) << 44) + | ((in[42 + inpos]) << 56); + out[8 + outpos] = ((in[42 + inpos]) >>> (12 - 4)) + | ((in[43 + inpos]) << 4) + | ((in[44 + inpos]) << 16) + | ((in[45 + inpos]) << 28) + | ((in[46 + inpos]) << 40) + | ((in[47 + inpos]) << 52); + out[9 + outpos] = in[48 + inpos] + | ((in[49 + inpos]) << 12) + | ((in[50 + inpos]) << 24) + | ((in[51 + inpos]) << 36) + | ((in[52 + inpos]) << 48) + | ((in[53 + inpos]) << 60); + out[10 + outpos] = ((in[53 + inpos]) >>> (12 - 8)) + | ((in[54 + inpos]) << 8) + | ((in[55 + inpos]) << 20) + | ((in[56 + inpos]) << 32) + | ((in[57 + inpos]) << 44) + | ((in[58 + inpos]) << 56); + out[11 + outpos] = ((in[58 + inpos]) >>> (12 - 4)) + | ((in[59 + inpos]) << 4) + | ((in[60 + inpos]) << 16) + | ((in[61 + inpos]) << 28) + | ((in[62 + inpos]) << 40) + | ((in[63 + inpos]) << 52); + } + + protected static void fastpackwithoutmask13(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 13) + | ((in[2 + inpos]) << 26) + | ((in[3 + inpos]) << 39) + | ((in[4 + inpos]) << 52); + out[1 + outpos] = ((in[4 + inpos]) >>> (13 - 1)) + | ((in[5 + inpos]) << 1) + | ((in[6 + inpos]) << 14) + | ((in[7 + inpos]) << 27) + | ((in[8 + inpos]) << 40) + | ((in[9 + inpos]) << 53); + out[2 + outpos] = ((in[9 + inpos]) >>> (13 - 2)) + | ((in[10 + inpos]) << 2) + | ((in[11 + inpos]) << 15) + | ((in[12 + inpos]) << 28) + | ((in[13 + inpos]) << 41) + | ((in[14 + inpos]) << 54); + out[3 + outpos] = ((in[14 + inpos]) >>> (13 - 3)) + | ((in[15 + inpos]) << 3) + | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 29) + | ((in[18 + inpos]) << 42) + | ((in[19 + inpos]) << 55); + out[4 + outpos] = ((in[19 + inpos]) >>> (13 - 4)) + | ((in[20 + inpos]) << 4) + | ((in[21 + inpos]) << 17) + | ((in[22 + inpos]) << 30) + | ((in[23 + inpos]) << 43) + | ((in[24 + inpos]) << 56); + out[5 + outpos] = ((in[24 + inpos]) >>> (13 - 5)) + | ((in[25 + inpos]) << 5) + | ((in[26 + inpos]) << 18) + | ((in[27 + inpos]) << 31) + | ((in[28 + inpos]) << 44) + | ((in[29 + inpos]) << 57); + out[6 + outpos] = ((in[29 + inpos]) >>> (13 - 6)) + | ((in[30 + inpos]) << 6) + | ((in[31 + inpos]) << 19) + | ((in[32 + inpos]) << 32) + | ((in[33 + inpos]) << 45) + | ((in[34 + inpos]) << 58); + out[7 + outpos] = ((in[34 + inpos]) >>> (13 - 7)) + | ((in[35 + inpos]) << 7) + | ((in[36 + inpos]) << 20) + | ((in[37 + inpos]) << 33) + | ((in[38 + inpos]) << 46) + | ((in[39 + inpos]) << 59); + out[8 + outpos] = ((in[39 + inpos]) >>> (13 - 8)) + | ((in[40 + inpos]) << 8) + | ((in[41 + inpos]) << 21) + | ((in[42 + inpos]) << 34) + | ((in[43 + inpos]) << 47) + | ((in[44 + inpos]) << 60); + out[9 + outpos] = ((in[44 + inpos]) >>> (13 - 9)) + | ((in[45 + inpos]) << 9) + | ((in[46 + inpos]) << 22) + | ((in[47 + inpos]) << 35) + | ((in[48 + inpos]) << 48) + | ((in[49 + inpos]) << 61); + out[10 + outpos] = ((in[49 + inpos]) >>> (13 - 10)) + | ((in[50 + inpos]) << 10) + | ((in[51 + inpos]) << 23) + | ((in[52 + inpos]) << 36) + | ((in[53 + inpos]) << 49) + | ((in[54 + inpos]) << 62); + out[11 + outpos] = ((in[54 + inpos]) >>> (13 - 11)) + | ((in[55 + inpos]) << 11) + | ((in[56 + inpos]) << 24) + | ((in[57 + inpos]) << 37) + | ((in[58 + inpos]) << 50) + | ((in[59 + inpos]) << 63); + out[12 + outpos] = ((in[59 + inpos]) >>> (13 - 12)) + | ((in[60 + inpos]) << 12) + | ((in[61 + inpos]) << 25) + | ((in[62 + inpos]) << 38) + | ((in[63 + inpos]) << 51); + } + + protected static void fastpackwithoutmask14(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 14) + | ((in[2 + inpos]) << 28) + | ((in[3 + inpos]) << 42) + | ((in[4 + inpos]) << 56); + out[1 + outpos] = ((in[4 + inpos]) >>> (14 - 6)) + | ((in[5 + inpos]) << 6) + | ((in[6 + inpos]) << 20) + | ((in[7 + inpos]) << 34) + | ((in[8 + inpos]) << 48) + | ((in[9 + inpos]) << 62); + out[2 + outpos] = ((in[9 + inpos]) >>> (14 - 12)) + | ((in[10 + inpos]) << 12) + | ((in[11 + inpos]) << 26) + | ((in[12 + inpos]) << 40) + | ((in[13 + inpos]) << 54); + out[3 + outpos] = ((in[13 + inpos]) >>> (14 - 4)) + | ((in[14 + inpos]) << 4) + | ((in[15 + inpos]) << 18) + | ((in[16 + inpos]) << 32) + | ((in[17 + inpos]) << 46) + | ((in[18 + inpos]) << 60); + out[4 + outpos] = ((in[18 + inpos]) >>> (14 - 10)) + | ((in[19 + inpos]) << 10) + | ((in[20 + inpos]) << 24) + | ((in[21 + inpos]) << 38) + | ((in[22 + inpos]) << 52); + out[5 + outpos] = ((in[22 + inpos]) >>> (14 - 2)) + | ((in[23 + inpos]) << 2) + | ((in[24 + inpos]) << 16) + | ((in[25 + inpos]) << 30) + | ((in[26 + inpos]) << 44) + | ((in[27 + inpos]) << 58); + out[6 + outpos] = ((in[27 + inpos]) >>> (14 - 8)) + | ((in[28 + inpos]) << 8) + | ((in[29 + inpos]) << 22) + | ((in[30 + inpos]) << 36) + | ((in[31 + inpos]) << 50); + out[7 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 14) + | ((in[34 + inpos]) << 28) + | ((in[35 + inpos]) << 42) + | ((in[36 + inpos]) << 56); + out[8 + outpos] = ((in[36 + inpos]) >>> (14 - 6)) + | ((in[37 + inpos]) << 6) + | ((in[38 + inpos]) << 20) + | ((in[39 + inpos]) << 34) + | ((in[40 + inpos]) << 48) + | ((in[41 + inpos]) << 62); + out[9 + outpos] = ((in[41 + inpos]) >>> (14 - 12)) + | ((in[42 + inpos]) << 12) + | ((in[43 + inpos]) << 26) + | ((in[44 + inpos]) << 40) + | ((in[45 + inpos]) << 54); + out[10 + outpos] = ((in[45 + inpos]) >>> (14 - 4)) + | ((in[46 + inpos]) << 4) + | ((in[47 + inpos]) << 18) + | ((in[48 + inpos]) << 32) + | ((in[49 + inpos]) << 46) + | ((in[50 + inpos]) << 60); + out[11 + outpos] = ((in[50 + inpos]) >>> (14 - 10)) + | ((in[51 + inpos]) << 10) + | ((in[52 + inpos]) << 24) + | ((in[53 + inpos]) << 38) + | ((in[54 + inpos]) << 52); + out[12 + outpos] = ((in[54 + inpos]) >>> (14 - 2)) + | ((in[55 + inpos]) << 2) + | ((in[56 + inpos]) << 16) + | ((in[57 + inpos]) << 30) + | ((in[58 + inpos]) << 44) + | ((in[59 + inpos]) << 58); + out[13 + outpos] = ((in[59 + inpos]) >>> (14 - 8)) + | ((in[60 + inpos]) << 8) + | ((in[61 + inpos]) << 22) + | ((in[62 + inpos]) << 36) + | ((in[63 + inpos]) << 50); + } + + protected static void fastpackwithoutmask15(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 15) + | ((in[2 + inpos]) << 30) + | ((in[3 + inpos]) << 45) + | ((in[4 + inpos]) << 60); + out[1 + outpos] = ((in[4 + inpos]) >>> (15 - 11)) + | ((in[5 + inpos]) << 11) + | ((in[6 + inpos]) << 26) + | ((in[7 + inpos]) << 41) + | ((in[8 + inpos]) << 56); + out[2 + outpos] = ((in[8 + inpos]) >>> (15 - 7)) + | ((in[9 + inpos]) << 7) + | ((in[10 + inpos]) << 22) + | ((in[11 + inpos]) << 37) + | ((in[12 + inpos]) << 52); + out[3 + outpos] = ((in[12 + inpos]) >>> (15 - 3)) + | ((in[13 + inpos]) << 3) + | ((in[14 + inpos]) << 18) + | ((in[15 + inpos]) << 33) + | ((in[16 + inpos]) << 48) + | ((in[17 + inpos]) << 63); + out[4 + outpos] = ((in[17 + inpos]) >>> (15 - 14)) + | ((in[18 + inpos]) << 14) + | ((in[19 + inpos]) << 29) + | ((in[20 + inpos]) << 44) + | ((in[21 + inpos]) << 59); + out[5 + outpos] = ((in[21 + inpos]) >>> (15 - 10)) + | ((in[22 + inpos]) << 10) + | ((in[23 + inpos]) << 25) + | ((in[24 + inpos]) << 40) + | ((in[25 + inpos]) << 55); + out[6 + outpos] = ((in[25 + inpos]) >>> (15 - 6)) + | ((in[26 + inpos]) << 6) + | ((in[27 + inpos]) << 21) + | ((in[28 + inpos]) << 36) + | ((in[29 + inpos]) << 51); + out[7 + outpos] = ((in[29 + inpos]) >>> (15 - 2)) + | ((in[30 + inpos]) << 2) + | ((in[31 + inpos]) << 17) + | ((in[32 + inpos]) << 32) + | ((in[33 + inpos]) << 47) + | ((in[34 + inpos]) << 62); + out[8 + outpos] = ((in[34 + inpos]) >>> (15 - 13)) + | ((in[35 + inpos]) << 13) + | ((in[36 + inpos]) << 28) + | ((in[37 + inpos]) << 43) + | ((in[38 + inpos]) << 58); + out[9 + outpos] = ((in[38 + inpos]) >>> (15 - 9)) + | ((in[39 + inpos]) << 9) + | ((in[40 + inpos]) << 24) + | ((in[41 + inpos]) << 39) + | ((in[42 + inpos]) << 54); + out[10 + outpos] = ((in[42 + inpos]) >>> (15 - 5)) + | ((in[43 + inpos]) << 5) + | ((in[44 + inpos]) << 20) + | ((in[45 + inpos]) << 35) + | ((in[46 + inpos]) << 50); + out[11 + outpos] = ((in[46 + inpos]) >>> (15 - 1)) + | ((in[47 + inpos]) << 1) + | ((in[48 + inpos]) << 16) + | ((in[49 + inpos]) << 31) + | ((in[50 + inpos]) << 46) + | ((in[51 + inpos]) << 61); + out[12 + outpos] = ((in[51 + inpos]) >>> (15 - 12)) + | ((in[52 + inpos]) << 12) + | ((in[53 + inpos]) << 27) + | ((in[54 + inpos]) << 42) + | ((in[55 + inpos]) << 57); + out[13 + outpos] = ((in[55 + inpos]) >>> (15 - 8)) + | ((in[56 + inpos]) << 8) + | ((in[57 + inpos]) << 23) + | ((in[58 + inpos]) << 38) + | ((in[59 + inpos]) << 53); + out[14 + outpos] = ((in[59 + inpos]) >>> (15 - 4)) + | ((in[60 + inpos]) << 4) + | ((in[61 + inpos]) << 19) + | ((in[62 + inpos]) << 34) + | ((in[63 + inpos]) << 49); + } + + protected static void fastpackwithoutmask16(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 16) + | ((in[2 + inpos]) << 32) + | ((in[3 + inpos]) << 48); + out[1 + outpos] = in[4 + inpos] + | ((in[5 + inpos]) << 16) + | ((in[6 + inpos]) << 32) + | ((in[7 + inpos]) << 48); + out[2 + outpos] = in[8 + inpos] + | ((in[9 + inpos]) << 16) + | ((in[10 + inpos]) << 32) + | ((in[11 + inpos]) << 48); + out[3 + outpos] = in[12 + inpos] + | ((in[13 + inpos]) << 16) + | ((in[14 + inpos]) << 32) + | ((in[15 + inpos]) << 48); + out[4 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 16) + | ((in[18 + inpos]) << 32) + | ((in[19 + inpos]) << 48); + out[5 + outpos] = in[20 + inpos] + | ((in[21 + inpos]) << 16) + | ((in[22 + inpos]) << 32) + | ((in[23 + inpos]) << 48); + out[6 + outpos] = in[24 + inpos] + | ((in[25 + inpos]) << 16) + | ((in[26 + inpos]) << 32) + | ((in[27 + inpos]) << 48); + out[7 + outpos] = in[28 + inpos] + | ((in[29 + inpos]) << 16) + | ((in[30 + inpos]) << 32) + | ((in[31 + inpos]) << 48); + out[8 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 16) + | ((in[34 + inpos]) << 32) + | ((in[35 + inpos]) << 48); + out[9 + outpos] = in[36 + inpos] + | ((in[37 + inpos]) << 16) + | ((in[38 + inpos]) << 32) + | ((in[39 + inpos]) << 48); + out[10 + outpos] = in[40 + inpos] + | ((in[41 + inpos]) << 16) + | ((in[42 + inpos]) << 32) + | ((in[43 + inpos]) << 48); + out[11 + outpos] = in[44 + inpos] + | ((in[45 + inpos]) << 16) + | ((in[46 + inpos]) << 32) + | ((in[47 + inpos]) << 48); + out[12 + outpos] = in[48 + inpos] + | ((in[49 + inpos]) << 16) + | ((in[50 + inpos]) << 32) + | ((in[51 + inpos]) << 48); + out[13 + outpos] = in[52 + inpos] + | ((in[53 + inpos]) << 16) + | ((in[54 + inpos]) << 32) + | ((in[55 + inpos]) << 48); + out[14 + outpos] = in[56 + inpos] + | ((in[57 + inpos]) << 16) + | ((in[58 + inpos]) << 32) + | ((in[59 + inpos]) << 48); + out[15 + outpos] = in[60 + inpos] + | ((in[61 + inpos]) << 16) + | ((in[62 + inpos]) << 32) + | ((in[63 + inpos]) << 48); + } + + protected static void fastpackwithoutmask17(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 17) + | ((in[2 + inpos]) << 34) + | ((in[3 + inpos]) << 51); + out[1 + outpos] = ((in[3 + inpos]) >>> (17 - 4)) + | ((in[4 + inpos]) << 4) + | ((in[5 + inpos]) << 21) + | ((in[6 + inpos]) << 38) + | ((in[7 + inpos]) << 55); + out[2 + outpos] = ((in[7 + inpos]) >>> (17 - 8)) + | ((in[8 + inpos]) << 8) + | ((in[9 + inpos]) << 25) + | ((in[10 + inpos]) << 42) + | ((in[11 + inpos]) << 59); + out[3 + outpos] = ((in[11 + inpos]) >>> (17 - 12)) + | ((in[12 + inpos]) << 12) + | ((in[13 + inpos]) << 29) + | ((in[14 + inpos]) << 46) + | ((in[15 + inpos]) << 63); + out[4 + outpos] = ((in[15 + inpos]) >>> (17 - 16)) + | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 33) + | ((in[18 + inpos]) << 50); + out[5 + outpos] = ((in[18 + inpos]) >>> (17 - 3)) + | ((in[19 + inpos]) << 3) + | ((in[20 + inpos]) << 20) + | ((in[21 + inpos]) << 37) + | ((in[22 + inpos]) << 54); + out[6 + outpos] = ((in[22 + inpos]) >>> (17 - 7)) + | ((in[23 + inpos]) << 7) + | ((in[24 + inpos]) << 24) + | ((in[25 + inpos]) << 41) + | ((in[26 + inpos]) << 58); + out[7 + outpos] = ((in[26 + inpos]) >>> (17 - 11)) + | ((in[27 + inpos]) << 11) + | ((in[28 + inpos]) << 28) + | ((in[29 + inpos]) << 45) + | ((in[30 + inpos]) << 62); + out[8 + outpos] = ((in[30 + inpos]) >>> (17 - 15)) + | ((in[31 + inpos]) << 15) + | ((in[32 + inpos]) << 32) + | ((in[33 + inpos]) << 49); + out[9 + outpos] = ((in[33 + inpos]) >>> (17 - 2)) + | ((in[34 + inpos]) << 2) + | ((in[35 + inpos]) << 19) + | ((in[36 + inpos]) << 36) + | ((in[37 + inpos]) << 53); + out[10 + outpos] = ((in[37 + inpos]) >>> (17 - 6)) + | ((in[38 + inpos]) << 6) + | ((in[39 + inpos]) << 23) + | ((in[40 + inpos]) << 40) + | ((in[41 + inpos]) << 57); + out[11 + outpos] = ((in[41 + inpos]) >>> (17 - 10)) + | ((in[42 + inpos]) << 10) + | ((in[43 + inpos]) << 27) + | ((in[44 + inpos]) << 44) + | ((in[45 + inpos]) << 61); + out[12 + outpos] = ((in[45 + inpos]) >>> (17 - 14)) + | ((in[46 + inpos]) << 14) + | ((in[47 + inpos]) << 31) + | ((in[48 + inpos]) << 48); + out[13 + outpos] = ((in[48 + inpos]) >>> (17 - 1)) + | ((in[49 + inpos]) << 1) + | ((in[50 + inpos]) << 18) + | ((in[51 + inpos]) << 35) + | ((in[52 + inpos]) << 52); + out[14 + outpos] = ((in[52 + inpos]) >>> (17 - 5)) + | ((in[53 + inpos]) << 5) + | ((in[54 + inpos]) << 22) + | ((in[55 + inpos]) << 39) + | ((in[56 + inpos]) << 56); + out[15 + outpos] = ((in[56 + inpos]) >>> (17 - 9)) + | ((in[57 + inpos]) << 9) + | ((in[58 + inpos]) << 26) + | ((in[59 + inpos]) << 43) + | ((in[60 + inpos]) << 60); + out[16 + outpos] = ((in[60 + inpos]) >>> (17 - 13)) + | ((in[61 + inpos]) << 13) + | ((in[62 + inpos]) << 30) + | ((in[63 + inpos]) << 47); + } + + protected static void fastpackwithoutmask18(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 18) + | ((in[2 + inpos]) << 36) + | ((in[3 + inpos]) << 54); + out[1 + outpos] = ((in[3 + inpos]) >>> (18 - 8)) + | ((in[4 + inpos]) << 8) + | ((in[5 + inpos]) << 26) + | ((in[6 + inpos]) << 44) + | ((in[7 + inpos]) << 62); + out[2 + outpos] = ((in[7 + inpos]) >>> (18 - 16)) + | ((in[8 + inpos]) << 16) + | ((in[9 + inpos]) << 34) + | ((in[10 + inpos]) << 52); + out[3 + outpos] = ((in[10 + inpos]) >>> (18 - 6)) + | ((in[11 + inpos]) << 6) + | ((in[12 + inpos]) << 24) + | ((in[13 + inpos]) << 42) + | ((in[14 + inpos]) << 60); + out[4 + outpos] = ((in[14 + inpos]) >>> (18 - 14)) + | ((in[15 + inpos]) << 14) + | ((in[16 + inpos]) << 32) + | ((in[17 + inpos]) << 50); + out[5 + outpos] = ((in[17 + inpos]) >>> (18 - 4)) + | ((in[18 + inpos]) << 4) + | ((in[19 + inpos]) << 22) + | ((in[20 + inpos]) << 40) + | ((in[21 + inpos]) << 58); + out[6 + outpos] = ((in[21 + inpos]) >>> (18 - 12)) + | ((in[22 + inpos]) << 12) + | ((in[23 + inpos]) << 30) + | ((in[24 + inpos]) << 48); + out[7 + outpos] = ((in[24 + inpos]) >>> (18 - 2)) + | ((in[25 + inpos]) << 2) + | ((in[26 + inpos]) << 20) + | ((in[27 + inpos]) << 38) + | ((in[28 + inpos]) << 56); + out[8 + outpos] = ((in[28 + inpos]) >>> (18 - 10)) + | ((in[29 + inpos]) << 10) + | ((in[30 + inpos]) << 28) + | ((in[31 + inpos]) << 46); + out[9 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 18) + | ((in[34 + inpos]) << 36) + | ((in[35 + inpos]) << 54); + out[10 + outpos] = ((in[35 + inpos]) >>> (18 - 8)) + | ((in[36 + inpos]) << 8) + | ((in[37 + inpos]) << 26) + | ((in[38 + inpos]) << 44) + | ((in[39 + inpos]) << 62); + out[11 + outpos] = ((in[39 + inpos]) >>> (18 - 16)) + | ((in[40 + inpos]) << 16) + | ((in[41 + inpos]) << 34) + | ((in[42 + inpos]) << 52); + out[12 + outpos] = ((in[42 + inpos]) >>> (18 - 6)) + | ((in[43 + inpos]) << 6) + | ((in[44 + inpos]) << 24) + | ((in[45 + inpos]) << 42) + | ((in[46 + inpos]) << 60); + out[13 + outpos] = ((in[46 + inpos]) >>> (18 - 14)) + | ((in[47 + inpos]) << 14) + | ((in[48 + inpos]) << 32) + | ((in[49 + inpos]) << 50); + out[14 + outpos] = ((in[49 + inpos]) >>> (18 - 4)) + | ((in[50 + inpos]) << 4) + | ((in[51 + inpos]) << 22) + | ((in[52 + inpos]) << 40) + | ((in[53 + inpos]) << 58); + out[15 + outpos] = ((in[53 + inpos]) >>> (18 - 12)) + | ((in[54 + inpos]) << 12) + | ((in[55 + inpos]) << 30) + | ((in[56 + inpos]) << 48); + out[16 + outpos] = ((in[56 + inpos]) >>> (18 - 2)) + | ((in[57 + inpos]) << 2) + | ((in[58 + inpos]) << 20) + | ((in[59 + inpos]) << 38) + | ((in[60 + inpos]) << 56); + out[17 + outpos] = ((in[60 + inpos]) >>> (18 - 10)) + | ((in[61 + inpos]) << 10) + | ((in[62 + inpos]) << 28) + | ((in[63 + inpos]) << 46); + } + + protected static void fastpackwithoutmask19(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 19) + | ((in[2 + inpos]) << 38) + | ((in[3 + inpos]) << 57); + out[1 + outpos] = ((in[3 + inpos]) >>> (19 - 12)) + | ((in[4 + inpos]) << 12) + | ((in[5 + inpos]) << 31) + | ((in[6 + inpos]) << 50); + out[2 + outpos] = ((in[6 + inpos]) >>> (19 - 5)) + | ((in[7 + inpos]) << 5) + | ((in[8 + inpos]) << 24) + | ((in[9 + inpos]) << 43) + | ((in[10 + inpos]) << 62); + out[3 + outpos] = ((in[10 + inpos]) >>> (19 - 17)) + | ((in[11 + inpos]) << 17) + | ((in[12 + inpos]) << 36) + | ((in[13 + inpos]) << 55); + out[4 + outpos] = ((in[13 + inpos]) >>> (19 - 10)) + | ((in[14 + inpos]) << 10) + | ((in[15 + inpos]) << 29) + | ((in[16 + inpos]) << 48); + out[5 + outpos] = ((in[16 + inpos]) >>> (19 - 3)) + | ((in[17 + inpos]) << 3) + | ((in[18 + inpos]) << 22) + | ((in[19 + inpos]) << 41) + | ((in[20 + inpos]) << 60); + out[6 + outpos] = ((in[20 + inpos]) >>> (19 - 15)) + | ((in[21 + inpos]) << 15) + | ((in[22 + inpos]) << 34) + | ((in[23 + inpos]) << 53); + out[7 + outpos] = ((in[23 + inpos]) >>> (19 - 8)) + | ((in[24 + inpos]) << 8) + | ((in[25 + inpos]) << 27) + | ((in[26 + inpos]) << 46); + out[8 + outpos] = ((in[26 + inpos]) >>> (19 - 1)) + | ((in[27 + inpos]) << 1) + | ((in[28 + inpos]) << 20) + | ((in[29 + inpos]) << 39) + | ((in[30 + inpos]) << 58); + out[9 + outpos] = ((in[30 + inpos]) >>> (19 - 13)) + | ((in[31 + inpos]) << 13) + | ((in[32 + inpos]) << 32) + | ((in[33 + inpos]) << 51); + out[10 + outpos] = ((in[33 + inpos]) >>> (19 - 6)) + | ((in[34 + inpos]) << 6) + | ((in[35 + inpos]) << 25) + | ((in[36 + inpos]) << 44) + | ((in[37 + inpos]) << 63); + out[11 + outpos] = ((in[37 + inpos]) >>> (19 - 18)) + | ((in[38 + inpos]) << 18) + | ((in[39 + inpos]) << 37) + | ((in[40 + inpos]) << 56); + out[12 + outpos] = ((in[40 + inpos]) >>> (19 - 11)) + | ((in[41 + inpos]) << 11) + | ((in[42 + inpos]) << 30) + | ((in[43 + inpos]) << 49); + out[13 + outpos] = ((in[43 + inpos]) >>> (19 - 4)) + | ((in[44 + inpos]) << 4) + | ((in[45 + inpos]) << 23) + | ((in[46 + inpos]) << 42) + | ((in[47 + inpos]) << 61); + out[14 + outpos] = ((in[47 + inpos]) >>> (19 - 16)) + | ((in[48 + inpos]) << 16) + | ((in[49 + inpos]) << 35) + | ((in[50 + inpos]) << 54); + out[15 + outpos] = ((in[50 + inpos]) >>> (19 - 9)) + | ((in[51 + inpos]) << 9) + | ((in[52 + inpos]) << 28) + | ((in[53 + inpos]) << 47); + out[16 + outpos] = ((in[53 + inpos]) >>> (19 - 2)) + | ((in[54 + inpos]) << 2) + | ((in[55 + inpos]) << 21) + | ((in[56 + inpos]) << 40) + | ((in[57 + inpos]) << 59); + out[17 + outpos] = ((in[57 + inpos]) >>> (19 - 14)) + | ((in[58 + inpos]) << 14) + | ((in[59 + inpos]) << 33) + | ((in[60 + inpos]) << 52); + out[18 + outpos] = ((in[60 + inpos]) >>> (19 - 7)) + | ((in[61 + inpos]) << 7) + | ((in[62 + inpos]) << 26) + | ((in[63 + inpos]) << 45); + } + + protected static void fastpackwithoutmask20(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 20) + | ((in[2 + inpos]) << 40) + | ((in[3 + inpos]) << 60); + out[1 + outpos] = ((in[3 + inpos]) >>> (20 - 16)) + | ((in[4 + inpos]) << 16) + | ((in[5 + inpos]) << 36) + | ((in[6 + inpos]) << 56); + out[2 + outpos] = ((in[6 + inpos]) >>> (20 - 12)) + | ((in[7 + inpos]) << 12) + | ((in[8 + inpos]) << 32) + | ((in[9 + inpos]) << 52); + out[3 + outpos] = ((in[9 + inpos]) >>> (20 - 8)) + | ((in[10 + inpos]) << 8) + | ((in[11 + inpos]) << 28) + | ((in[12 + inpos]) << 48); + out[4 + outpos] = ((in[12 + inpos]) >>> (20 - 4)) + | ((in[13 + inpos]) << 4) + | ((in[14 + inpos]) << 24) + | ((in[15 + inpos]) << 44); + out[5 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 20) + | ((in[18 + inpos]) << 40) + | ((in[19 + inpos]) << 60); + out[6 + outpos] = ((in[19 + inpos]) >>> (20 - 16)) + | ((in[20 + inpos]) << 16) + | ((in[21 + inpos]) << 36) + | ((in[22 + inpos]) << 56); + out[7 + outpos] = ((in[22 + inpos]) >>> (20 - 12)) + | ((in[23 + inpos]) << 12) + | ((in[24 + inpos]) << 32) + | ((in[25 + inpos]) << 52); + out[8 + outpos] = ((in[25 + inpos]) >>> (20 - 8)) + | ((in[26 + inpos]) << 8) + | ((in[27 + inpos]) << 28) + | ((in[28 + inpos]) << 48); + out[9 + outpos] = ((in[28 + inpos]) >>> (20 - 4)) + | ((in[29 + inpos]) << 4) + | ((in[30 + inpos]) << 24) + | ((in[31 + inpos]) << 44); + out[10 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 20) + | ((in[34 + inpos]) << 40) + | ((in[35 + inpos]) << 60); + out[11 + outpos] = ((in[35 + inpos]) >>> (20 - 16)) + | ((in[36 + inpos]) << 16) + | ((in[37 + inpos]) << 36) + | ((in[38 + inpos]) << 56); + out[12 + outpos] = ((in[38 + inpos]) >>> (20 - 12)) + | ((in[39 + inpos]) << 12) + | ((in[40 + inpos]) << 32) + | ((in[41 + inpos]) << 52); + out[13 + outpos] = ((in[41 + inpos]) >>> (20 - 8)) + | ((in[42 + inpos]) << 8) + | ((in[43 + inpos]) << 28) + | ((in[44 + inpos]) << 48); + out[14 + outpos] = ((in[44 + inpos]) >>> (20 - 4)) + | ((in[45 + inpos]) << 4) + | ((in[46 + inpos]) << 24) + | ((in[47 + inpos]) << 44); + out[15 + outpos] = in[48 + inpos] + | ((in[49 + inpos]) << 20) + | ((in[50 + inpos]) << 40) + | ((in[51 + inpos]) << 60); + out[16 + outpos] = ((in[51 + inpos]) >>> (20 - 16)) + | ((in[52 + inpos]) << 16) + | ((in[53 + inpos]) << 36) + | ((in[54 + inpos]) << 56); + out[17 + outpos] = ((in[54 + inpos]) >>> (20 - 12)) + | ((in[55 + inpos]) << 12) + | ((in[56 + inpos]) << 32) + | ((in[57 + inpos]) << 52); + out[18 + outpos] = ((in[57 + inpos]) >>> (20 - 8)) + | ((in[58 + inpos]) << 8) + | ((in[59 + inpos]) << 28) + | ((in[60 + inpos]) << 48); + out[19 + outpos] = ((in[60 + inpos]) >>> (20 - 4)) + | ((in[61 + inpos]) << 4) + | ((in[62 + inpos]) << 24) + | ((in[63 + inpos]) << 44); + } + + protected static void fastpackwithoutmask21(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 21) + | ((in[2 + inpos]) << 42) + | ((in[3 + inpos]) << 63); + out[1 + outpos] = ((in[3 + inpos]) >>> (21 - 20)) + | ((in[4 + inpos]) << 20) + | ((in[5 + inpos]) << 41) + | ((in[6 + inpos]) << 62); + out[2 + outpos] = ((in[6 + inpos]) >>> (21 - 19)) + | ((in[7 + inpos]) << 19) + | ((in[8 + inpos]) << 40) + | ((in[9 + inpos]) << 61); + out[3 + outpos] = ((in[9 + inpos]) >>> (21 - 18)) + | ((in[10 + inpos]) << 18) + | ((in[11 + inpos]) << 39) + | ((in[12 + inpos]) << 60); + out[4 + outpos] = ((in[12 + inpos]) >>> (21 - 17)) + | ((in[13 + inpos]) << 17) + | ((in[14 + inpos]) << 38) + | ((in[15 + inpos]) << 59); + out[5 + outpos] = ((in[15 + inpos]) >>> (21 - 16)) + | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 37) + | ((in[18 + inpos]) << 58); + out[6 + outpos] = ((in[18 + inpos]) >>> (21 - 15)) + | ((in[19 + inpos]) << 15) + | ((in[20 + inpos]) << 36) + | ((in[21 + inpos]) << 57); + out[7 + outpos] = ((in[21 + inpos]) >>> (21 - 14)) + | ((in[22 + inpos]) << 14) + | ((in[23 + inpos]) << 35) + | ((in[24 + inpos]) << 56); + out[8 + outpos] = ((in[24 + inpos]) >>> (21 - 13)) + | ((in[25 + inpos]) << 13) + | ((in[26 + inpos]) << 34) + | ((in[27 + inpos]) << 55); + out[9 + outpos] = ((in[27 + inpos]) >>> (21 - 12)) + | ((in[28 + inpos]) << 12) + | ((in[29 + inpos]) << 33) + | ((in[30 + inpos]) << 54); + out[10 + outpos] = ((in[30 + inpos]) >>> (21 - 11)) + | ((in[31 + inpos]) << 11) + | ((in[32 + inpos]) << 32) + | ((in[33 + inpos]) << 53); + out[11 + outpos] = ((in[33 + inpos]) >>> (21 - 10)) + | ((in[34 + inpos]) << 10) + | ((in[35 + inpos]) << 31) + | ((in[36 + inpos]) << 52); + out[12 + outpos] = ((in[36 + inpos]) >>> (21 - 9)) + | ((in[37 + inpos]) << 9) + | ((in[38 + inpos]) << 30) + | ((in[39 + inpos]) << 51); + out[13 + outpos] = ((in[39 + inpos]) >>> (21 - 8)) + | ((in[40 + inpos]) << 8) + | ((in[41 + inpos]) << 29) + | ((in[42 + inpos]) << 50); + out[14 + outpos] = ((in[42 + inpos]) >>> (21 - 7)) + | ((in[43 + inpos]) << 7) + | ((in[44 + inpos]) << 28) + | ((in[45 + inpos]) << 49); + out[15 + outpos] = ((in[45 + inpos]) >>> (21 - 6)) + | ((in[46 + inpos]) << 6) + | ((in[47 + inpos]) << 27) + | ((in[48 + inpos]) << 48); + out[16 + outpos] = ((in[48 + inpos]) >>> (21 - 5)) + | ((in[49 + inpos]) << 5) + | ((in[50 + inpos]) << 26) + | ((in[51 + inpos]) << 47); + out[17 + outpos] = ((in[51 + inpos]) >>> (21 - 4)) + | ((in[52 + inpos]) << 4) + | ((in[53 + inpos]) << 25) + | ((in[54 + inpos]) << 46); + out[18 + outpos] = ((in[54 + inpos]) >>> (21 - 3)) + | ((in[55 + inpos]) << 3) + | ((in[56 + inpos]) << 24) + | ((in[57 + inpos]) << 45); + out[19 + outpos] = ((in[57 + inpos]) >>> (21 - 2)) + | ((in[58 + inpos]) << 2) + | ((in[59 + inpos]) << 23) + | ((in[60 + inpos]) << 44); + out[20 + outpos] = ((in[60 + inpos]) >>> (21 - 1)) + | ((in[61 + inpos]) << 1) + | ((in[62 + inpos]) << 22) + | ((in[63 + inpos]) << 43); + } + + protected static void fastpackwithoutmask22(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 22) + | ((in[2 + inpos]) << 44); + out[1 + outpos] = ((in[2 + inpos]) >>> (22 - 2)) + | ((in[3 + inpos]) << 2) + | ((in[4 + inpos]) << 24) + | ((in[5 + inpos]) << 46); + out[2 + outpos] = ((in[5 + inpos]) >>> (22 - 4)) + | ((in[6 + inpos]) << 4) + | ((in[7 + inpos]) << 26) + | ((in[8 + inpos]) << 48); + out[3 + outpos] = ((in[8 + inpos]) >>> (22 - 6)) + | ((in[9 + inpos]) << 6) + | ((in[10 + inpos]) << 28) + | ((in[11 + inpos]) << 50); + out[4 + outpos] = ((in[11 + inpos]) >>> (22 - 8)) + | ((in[12 + inpos]) << 8) + | ((in[13 + inpos]) << 30) + | ((in[14 + inpos]) << 52); + out[5 + outpos] = ((in[14 + inpos]) >>> (22 - 10)) + | ((in[15 + inpos]) << 10) + | ((in[16 + inpos]) << 32) + | ((in[17 + inpos]) << 54); + out[6 + outpos] = ((in[17 + inpos]) >>> (22 - 12)) + | ((in[18 + inpos]) << 12) + | ((in[19 + inpos]) << 34) + | ((in[20 + inpos]) << 56); + out[7 + outpos] = ((in[20 + inpos]) >>> (22 - 14)) + | ((in[21 + inpos]) << 14) + | ((in[22 + inpos]) << 36) + | ((in[23 + inpos]) << 58); + out[8 + outpos] = ((in[23 + inpos]) >>> (22 - 16)) + | ((in[24 + inpos]) << 16) + | ((in[25 + inpos]) << 38) + | ((in[26 + inpos]) << 60); + out[9 + outpos] = ((in[26 + inpos]) >>> (22 - 18)) + | ((in[27 + inpos]) << 18) + | ((in[28 + inpos]) << 40) + | ((in[29 + inpos]) << 62); + out[10 + outpos] = ((in[29 + inpos]) >>> (22 - 20)) + | ((in[30 + inpos]) << 20) + | ((in[31 + inpos]) << 42); + out[11 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 22) + | ((in[34 + inpos]) << 44); + out[12 + outpos] = ((in[34 + inpos]) >>> (22 - 2)) + | ((in[35 + inpos]) << 2) + | ((in[36 + inpos]) << 24) + | ((in[37 + inpos]) << 46); + out[13 + outpos] = ((in[37 + inpos]) >>> (22 - 4)) + | ((in[38 + inpos]) << 4) + | ((in[39 + inpos]) << 26) + | ((in[40 + inpos]) << 48); + out[14 + outpos] = ((in[40 + inpos]) >>> (22 - 6)) + | ((in[41 + inpos]) << 6) + | ((in[42 + inpos]) << 28) + | ((in[43 + inpos]) << 50); + out[15 + outpos] = ((in[43 + inpos]) >>> (22 - 8)) + | ((in[44 + inpos]) << 8) + | ((in[45 + inpos]) << 30) + | ((in[46 + inpos]) << 52); + out[16 + outpos] = ((in[46 + inpos]) >>> (22 - 10)) + | ((in[47 + inpos]) << 10) + | ((in[48 + inpos]) << 32) + | ((in[49 + inpos]) << 54); + out[17 + outpos] = ((in[49 + inpos]) >>> (22 - 12)) + | ((in[50 + inpos]) << 12) + | ((in[51 + inpos]) << 34) + | ((in[52 + inpos]) << 56); + out[18 + outpos] = ((in[52 + inpos]) >>> (22 - 14)) + | ((in[53 + inpos]) << 14) + | ((in[54 + inpos]) << 36) + | ((in[55 + inpos]) << 58); + out[19 + outpos] = ((in[55 + inpos]) >>> (22 - 16)) + | ((in[56 + inpos]) << 16) + | ((in[57 + inpos]) << 38) + | ((in[58 + inpos]) << 60); + out[20 + outpos] = ((in[58 + inpos]) >>> (22 - 18)) + | ((in[59 + inpos]) << 18) + | ((in[60 + inpos]) << 40) + | ((in[61 + inpos]) << 62); + out[21 + outpos] = ((in[61 + inpos]) >>> (22 - 20)) + | ((in[62 + inpos]) << 20) + | ((in[63 + inpos]) << 42); + } + + protected static void fastpackwithoutmask23(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 23) + | ((in[2 + inpos]) << 46); + out[1 + outpos] = ((in[2 + inpos]) >>> (23 - 5)) + | ((in[3 + inpos]) << 5) + | ((in[4 + inpos]) << 28) + | ((in[5 + inpos]) << 51); + out[2 + outpos] = ((in[5 + inpos]) >>> (23 - 10)) + | ((in[6 + inpos]) << 10) + | ((in[7 + inpos]) << 33) + | ((in[8 + inpos]) << 56); + out[3 + outpos] = ((in[8 + inpos]) >>> (23 - 15)) + | ((in[9 + inpos]) << 15) + | ((in[10 + inpos]) << 38) + | ((in[11 + inpos]) << 61); + out[4 + outpos] = ((in[11 + inpos]) >>> (23 - 20)) + | ((in[12 + inpos]) << 20) + | ((in[13 + inpos]) << 43); + out[5 + outpos] = ((in[13 + inpos]) >>> (23 - 2)) + | ((in[14 + inpos]) << 2) + | ((in[15 + inpos]) << 25) + | ((in[16 + inpos]) << 48); + out[6 + outpos] = ((in[16 + inpos]) >>> (23 - 7)) + | ((in[17 + inpos]) << 7) + | ((in[18 + inpos]) << 30) + | ((in[19 + inpos]) << 53); + out[7 + outpos] = ((in[19 + inpos]) >>> (23 - 12)) + | ((in[20 + inpos]) << 12) + | ((in[21 + inpos]) << 35) + | ((in[22 + inpos]) << 58); + out[8 + outpos] = ((in[22 + inpos]) >>> (23 - 17)) + | ((in[23 + inpos]) << 17) + | ((in[24 + inpos]) << 40) + | ((in[25 + inpos]) << 63); + out[9 + outpos] = ((in[25 + inpos]) >>> (23 - 22)) + | ((in[26 + inpos]) << 22) + | ((in[27 + inpos]) << 45); + out[10 + outpos] = ((in[27 + inpos]) >>> (23 - 4)) + | ((in[28 + inpos]) << 4) + | ((in[29 + inpos]) << 27) + | ((in[30 + inpos]) << 50); + out[11 + outpos] = ((in[30 + inpos]) >>> (23 - 9)) + | ((in[31 + inpos]) << 9) + | ((in[32 + inpos]) << 32) + | ((in[33 + inpos]) << 55); + out[12 + outpos] = ((in[33 + inpos]) >>> (23 - 14)) + | ((in[34 + inpos]) << 14) + | ((in[35 + inpos]) << 37) + | ((in[36 + inpos]) << 60); + out[13 + outpos] = ((in[36 + inpos]) >>> (23 - 19)) + | ((in[37 + inpos]) << 19) + | ((in[38 + inpos]) << 42); + out[14 + outpos] = ((in[38 + inpos]) >>> (23 - 1)) + | ((in[39 + inpos]) << 1) + | ((in[40 + inpos]) << 24) + | ((in[41 + inpos]) << 47); + out[15 + outpos] = ((in[41 + inpos]) >>> (23 - 6)) + | ((in[42 + inpos]) << 6) + | ((in[43 + inpos]) << 29) + | ((in[44 + inpos]) << 52); + out[16 + outpos] = ((in[44 + inpos]) >>> (23 - 11)) + | ((in[45 + inpos]) << 11) + | ((in[46 + inpos]) << 34) + | ((in[47 + inpos]) << 57); + out[17 + outpos] = ((in[47 + inpos]) >>> (23 - 16)) + | ((in[48 + inpos]) << 16) + | ((in[49 + inpos]) << 39) + | ((in[50 + inpos]) << 62); + out[18 + outpos] = ((in[50 + inpos]) >>> (23 - 21)) + | ((in[51 + inpos]) << 21) + | ((in[52 + inpos]) << 44); + out[19 + outpos] = ((in[52 + inpos]) >>> (23 - 3)) + | ((in[53 + inpos]) << 3) + | ((in[54 + inpos]) << 26) + | ((in[55 + inpos]) << 49); + out[20 + outpos] = ((in[55 + inpos]) >>> (23 - 8)) + | ((in[56 + inpos]) << 8) + | ((in[57 + inpos]) << 31) + | ((in[58 + inpos]) << 54); + out[21 + outpos] = ((in[58 + inpos]) >>> (23 - 13)) + | ((in[59 + inpos]) << 13) + | ((in[60 + inpos]) << 36) + | ((in[61 + inpos]) << 59); + out[22 + outpos] = ((in[61 + inpos]) >>> (23 - 18)) + | ((in[62 + inpos]) << 18) + | ((in[63 + inpos]) << 41); + } + + protected static void fastpackwithoutmask24(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 24) + | ((in[2 + inpos]) << 48); + out[1 + outpos] = ((in[2 + inpos]) >>> (24 - 8)) + | ((in[3 + inpos]) << 8) + | ((in[4 + inpos]) << 32) + | ((in[5 + inpos]) << 56); + out[2 + outpos] = ((in[5 + inpos]) >>> (24 - 16)) + | ((in[6 + inpos]) << 16) + | ((in[7 + inpos]) << 40); + out[3 + outpos] = in[8 + inpos] + | ((in[9 + inpos]) << 24) + | ((in[10 + inpos]) << 48); + out[4 + outpos] = ((in[10 + inpos]) >>> (24 - 8)) + | ((in[11 + inpos]) << 8) + | ((in[12 + inpos]) << 32) + | ((in[13 + inpos]) << 56); + out[5 + outpos] = ((in[13 + inpos]) >>> (24 - 16)) + | ((in[14 + inpos]) << 16) + | ((in[15 + inpos]) << 40); + out[6 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 24) + | ((in[18 + inpos]) << 48); + out[7 + outpos] = ((in[18 + inpos]) >>> (24 - 8)) + | ((in[19 + inpos]) << 8) + | ((in[20 + inpos]) << 32) + | ((in[21 + inpos]) << 56); + out[8 + outpos] = ((in[21 + inpos]) >>> (24 - 16)) + | ((in[22 + inpos]) << 16) + | ((in[23 + inpos]) << 40); + out[9 + outpos] = in[24 + inpos] + | ((in[25 + inpos]) << 24) + | ((in[26 + inpos]) << 48); + out[10 + outpos] = ((in[26 + inpos]) >>> (24 - 8)) + | ((in[27 + inpos]) << 8) + | ((in[28 + inpos]) << 32) + | ((in[29 + inpos]) << 56); + out[11 + outpos] = ((in[29 + inpos]) >>> (24 - 16)) + | ((in[30 + inpos]) << 16) + | ((in[31 + inpos]) << 40); + out[12 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 24) + | ((in[34 + inpos]) << 48); + out[13 + outpos] = ((in[34 + inpos]) >>> (24 - 8)) + | ((in[35 + inpos]) << 8) + | ((in[36 + inpos]) << 32) + | ((in[37 + inpos]) << 56); + out[14 + outpos] = ((in[37 + inpos]) >>> (24 - 16)) + | ((in[38 + inpos]) << 16) + | ((in[39 + inpos]) << 40); + out[15 + outpos] = in[40 + inpos] + | ((in[41 + inpos]) << 24) + | ((in[42 + inpos]) << 48); + out[16 + outpos] = ((in[42 + inpos]) >>> (24 - 8)) + | ((in[43 + inpos]) << 8) + | ((in[44 + inpos]) << 32) + | ((in[45 + inpos]) << 56); + out[17 + outpos] = ((in[45 + inpos]) >>> (24 - 16)) + | ((in[46 + inpos]) << 16) + | ((in[47 + inpos]) << 40); + out[18 + outpos] = in[48 + inpos] + | ((in[49 + inpos]) << 24) + | ((in[50 + inpos]) << 48); + out[19 + outpos] = ((in[50 + inpos]) >>> (24 - 8)) + | ((in[51 + inpos]) << 8) + | ((in[52 + inpos]) << 32) + | ((in[53 + inpos]) << 56); + out[20 + outpos] = ((in[53 + inpos]) >>> (24 - 16)) + | ((in[54 + inpos]) << 16) + | ((in[55 + inpos]) << 40); + out[21 + outpos] = in[56 + inpos] + | ((in[57 + inpos]) << 24) + | ((in[58 + inpos]) << 48); + out[22 + outpos] = ((in[58 + inpos]) >>> (24 - 8)) + | ((in[59 + inpos]) << 8) + | ((in[60 + inpos]) << 32) + | ((in[61 + inpos]) << 56); + out[23 + outpos] = ((in[61 + inpos]) >>> (24 - 16)) + | ((in[62 + inpos]) << 16) + | ((in[63 + inpos]) << 40); + } + + protected static void fastpackwithoutmask25(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 25) + | ((in[2 + inpos]) << 50); + out[1 + outpos] = ((in[2 + inpos]) >>> (25 - 11)) + | ((in[3 + inpos]) << 11) + | ((in[4 + inpos]) << 36) + | ((in[5 + inpos]) << 61); + out[2 + outpos] = ((in[5 + inpos]) >>> (25 - 22)) + | ((in[6 + inpos]) << 22) + | ((in[7 + inpos]) << 47); + out[3 + outpos] = ((in[7 + inpos]) >>> (25 - 8)) + | ((in[8 + inpos]) << 8) + | ((in[9 + inpos]) << 33) + | ((in[10 + inpos]) << 58); + out[4 + outpos] = ((in[10 + inpos]) >>> (25 - 19)) + | ((in[11 + inpos]) << 19) + | ((in[12 + inpos]) << 44); + out[5 + outpos] = ((in[12 + inpos]) >>> (25 - 5)) + | ((in[13 + inpos]) << 5) + | ((in[14 + inpos]) << 30) + | ((in[15 + inpos]) << 55); + out[6 + outpos] = ((in[15 + inpos]) >>> (25 - 16)) + | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 41); + out[7 + outpos] = ((in[17 + inpos]) >>> (25 - 2)) + | ((in[18 + inpos]) << 2) + | ((in[19 + inpos]) << 27) + | ((in[20 + inpos]) << 52); + out[8 + outpos] = ((in[20 + inpos]) >>> (25 - 13)) + | ((in[21 + inpos]) << 13) + | ((in[22 + inpos]) << 38) + | ((in[23 + inpos]) << 63); + out[9 + outpos] = ((in[23 + inpos]) >>> (25 - 24)) + | ((in[24 + inpos]) << 24) + | ((in[25 + inpos]) << 49); + out[10 + outpos] = ((in[25 + inpos]) >>> (25 - 10)) + | ((in[26 + inpos]) << 10) + | ((in[27 + inpos]) << 35) + | ((in[28 + inpos]) << 60); + out[11 + outpos] = ((in[28 + inpos]) >>> (25 - 21)) + | ((in[29 + inpos]) << 21) + | ((in[30 + inpos]) << 46); + out[12 + outpos] = ((in[30 + inpos]) >>> (25 - 7)) + | ((in[31 + inpos]) << 7) + | ((in[32 + inpos]) << 32) + | ((in[33 + inpos]) << 57); + out[13 + outpos] = ((in[33 + inpos]) >>> (25 - 18)) + | ((in[34 + inpos]) << 18) + | ((in[35 + inpos]) << 43); + out[14 + outpos] = ((in[35 + inpos]) >>> (25 - 4)) + | ((in[36 + inpos]) << 4) + | ((in[37 + inpos]) << 29) + | ((in[38 + inpos]) << 54); + out[15 + outpos] = ((in[38 + inpos]) >>> (25 - 15)) + | ((in[39 + inpos]) << 15) + | ((in[40 + inpos]) << 40); + out[16 + outpos] = ((in[40 + inpos]) >>> (25 - 1)) + | ((in[41 + inpos]) << 1) + | ((in[42 + inpos]) << 26) + | ((in[43 + inpos]) << 51); + out[17 + outpos] = ((in[43 + inpos]) >>> (25 - 12)) + | ((in[44 + inpos]) << 12) + | ((in[45 + inpos]) << 37) + | ((in[46 + inpos]) << 62); + out[18 + outpos] = ((in[46 + inpos]) >>> (25 - 23)) + | ((in[47 + inpos]) << 23) + | ((in[48 + inpos]) << 48); + out[19 + outpos] = ((in[48 + inpos]) >>> (25 - 9)) + | ((in[49 + inpos]) << 9) + | ((in[50 + inpos]) << 34) + | ((in[51 + inpos]) << 59); + out[20 + outpos] = ((in[51 + inpos]) >>> (25 - 20)) + | ((in[52 + inpos]) << 20) + | ((in[53 + inpos]) << 45); + out[21 + outpos] = ((in[53 + inpos]) >>> (25 - 6)) + | ((in[54 + inpos]) << 6) + | ((in[55 + inpos]) << 31) + | ((in[56 + inpos]) << 56); + out[22 + outpos] = ((in[56 + inpos]) >>> (25 - 17)) + | ((in[57 + inpos]) << 17) + | ((in[58 + inpos]) << 42); + out[23 + outpos] = ((in[58 + inpos]) >>> (25 - 3)) + | ((in[59 + inpos]) << 3) + | ((in[60 + inpos]) << 28) + | ((in[61 + inpos]) << 53); + out[24 + outpos] = ((in[61 + inpos]) >>> (25 - 14)) + | ((in[62 + inpos]) << 14) + | ((in[63 + inpos]) << 39); + } + + protected static void fastpackwithoutmask26(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 26) + | ((in[2 + inpos]) << 52); + out[1 + outpos] = ((in[2 + inpos]) >>> (26 - 14)) + | ((in[3 + inpos]) << 14) + | ((in[4 + inpos]) << 40); + out[2 + outpos] = ((in[4 + inpos]) >>> (26 - 2)) + | ((in[5 + inpos]) << 2) + | ((in[6 + inpos]) << 28) + | ((in[7 + inpos]) << 54); + out[3 + outpos] = ((in[7 + inpos]) >>> (26 - 16)) + | ((in[8 + inpos]) << 16) + | ((in[9 + inpos]) << 42); + out[4 + outpos] = ((in[9 + inpos]) >>> (26 - 4)) + | ((in[10 + inpos]) << 4) + | ((in[11 + inpos]) << 30) + | ((in[12 + inpos]) << 56); + out[5 + outpos] = ((in[12 + inpos]) >>> (26 - 18)) + | ((in[13 + inpos]) << 18) + | ((in[14 + inpos]) << 44); + out[6 + outpos] = ((in[14 + inpos]) >>> (26 - 6)) + | ((in[15 + inpos]) << 6) + | ((in[16 + inpos]) << 32) + | ((in[17 + inpos]) << 58); + out[7 + outpos] = ((in[17 + inpos]) >>> (26 - 20)) + | ((in[18 + inpos]) << 20) + | ((in[19 + inpos]) << 46); + out[8 + outpos] = ((in[19 + inpos]) >>> (26 - 8)) + | ((in[20 + inpos]) << 8) + | ((in[21 + inpos]) << 34) + | ((in[22 + inpos]) << 60); + out[9 + outpos] = ((in[22 + inpos]) >>> (26 - 22)) + | ((in[23 + inpos]) << 22) + | ((in[24 + inpos]) << 48); + out[10 + outpos] = ((in[24 + inpos]) >>> (26 - 10)) + | ((in[25 + inpos]) << 10) + | ((in[26 + inpos]) << 36) + | ((in[27 + inpos]) << 62); + out[11 + outpos] = ((in[27 + inpos]) >>> (26 - 24)) + | ((in[28 + inpos]) << 24) + | ((in[29 + inpos]) << 50); + out[12 + outpos] = ((in[29 + inpos]) >>> (26 - 12)) + | ((in[30 + inpos]) << 12) + | ((in[31 + inpos]) << 38); + out[13 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 26) + | ((in[34 + inpos]) << 52); + out[14 + outpos] = ((in[34 + inpos]) >>> (26 - 14)) + | ((in[35 + inpos]) << 14) + | ((in[36 + inpos]) << 40); + out[15 + outpos] = ((in[36 + inpos]) >>> (26 - 2)) + | ((in[37 + inpos]) << 2) + | ((in[38 + inpos]) << 28) + | ((in[39 + inpos]) << 54); + out[16 + outpos] = ((in[39 + inpos]) >>> (26 - 16)) + | ((in[40 + inpos]) << 16) + | ((in[41 + inpos]) << 42); + out[17 + outpos] = ((in[41 + inpos]) >>> (26 - 4)) + | ((in[42 + inpos]) << 4) + | ((in[43 + inpos]) << 30) + | ((in[44 + inpos]) << 56); + out[18 + outpos] = ((in[44 + inpos]) >>> (26 - 18)) + | ((in[45 + inpos]) << 18) + | ((in[46 + inpos]) << 44); + out[19 + outpos] = ((in[46 + inpos]) >>> (26 - 6)) + | ((in[47 + inpos]) << 6) + | ((in[48 + inpos]) << 32) + | ((in[49 + inpos]) << 58); + out[20 + outpos] = ((in[49 + inpos]) >>> (26 - 20)) + | ((in[50 + inpos]) << 20) + | ((in[51 + inpos]) << 46); + out[21 + outpos] = ((in[51 + inpos]) >>> (26 - 8)) + | ((in[52 + inpos]) << 8) + | ((in[53 + inpos]) << 34) + | ((in[54 + inpos]) << 60); + out[22 + outpos] = ((in[54 + inpos]) >>> (26 - 22)) + | ((in[55 + inpos]) << 22) + | ((in[56 + inpos]) << 48); + out[23 + outpos] = ((in[56 + inpos]) >>> (26 - 10)) + | ((in[57 + inpos]) << 10) + | ((in[58 + inpos]) << 36) + | ((in[59 + inpos]) << 62); + out[24 + outpos] = ((in[59 + inpos]) >>> (26 - 24)) + | ((in[60 + inpos]) << 24) + | ((in[61 + inpos]) << 50); + out[25 + outpos] = ((in[61 + inpos]) >>> (26 - 12)) + | ((in[62 + inpos]) << 12) + | ((in[63 + inpos]) << 38); + } + + protected static void fastpackwithoutmask27(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 27) + | ((in[2 + inpos]) << 54); + out[1 + outpos] = ((in[2 + inpos]) >>> (27 - 17)) + | ((in[3 + inpos]) << 17) + | ((in[4 + inpos]) << 44); + out[2 + outpos] = ((in[4 + inpos]) >>> (27 - 7)) + | ((in[5 + inpos]) << 7) + | ((in[6 + inpos]) << 34) + | ((in[7 + inpos]) << 61); + out[3 + outpos] = ((in[7 + inpos]) >>> (27 - 24)) + | ((in[8 + inpos]) << 24) + | ((in[9 + inpos]) << 51); + out[4 + outpos] = ((in[9 + inpos]) >>> (27 - 14)) + | ((in[10 + inpos]) << 14) + | ((in[11 + inpos]) << 41); + out[5 + outpos] = ((in[11 + inpos]) >>> (27 - 4)) + | ((in[12 + inpos]) << 4) + | ((in[13 + inpos]) << 31) + | ((in[14 + inpos]) << 58); + out[6 + outpos] = ((in[14 + inpos]) >>> (27 - 21)) + | ((in[15 + inpos]) << 21) + | ((in[16 + inpos]) << 48); + out[7 + outpos] = ((in[16 + inpos]) >>> (27 - 11)) + | ((in[17 + inpos]) << 11) + | ((in[18 + inpos]) << 38); + out[8 + outpos] = ((in[18 + inpos]) >>> (27 - 1)) + | ((in[19 + inpos]) << 1) + | ((in[20 + inpos]) << 28) + | ((in[21 + inpos]) << 55); + out[9 + outpos] = ((in[21 + inpos]) >>> (27 - 18)) + | ((in[22 + inpos]) << 18) + | ((in[23 + inpos]) << 45); + out[10 + outpos] = ((in[23 + inpos]) >>> (27 - 8)) + | ((in[24 + inpos]) << 8) + | ((in[25 + inpos]) << 35) + | ((in[26 + inpos]) << 62); + out[11 + outpos] = ((in[26 + inpos]) >>> (27 - 25)) + | ((in[27 + inpos]) << 25) + | ((in[28 + inpos]) << 52); + out[12 + outpos] = ((in[28 + inpos]) >>> (27 - 15)) + | ((in[29 + inpos]) << 15) + | ((in[30 + inpos]) << 42); + out[13 + outpos] = ((in[30 + inpos]) >>> (27 - 5)) + | ((in[31 + inpos]) << 5) + | ((in[32 + inpos]) << 32) + | ((in[33 + inpos]) << 59); + out[14 + outpos] = ((in[33 + inpos]) >>> (27 - 22)) + | ((in[34 + inpos]) << 22) + | ((in[35 + inpos]) << 49); + out[15 + outpos] = ((in[35 + inpos]) >>> (27 - 12)) + | ((in[36 + inpos]) << 12) + | ((in[37 + inpos]) << 39); + out[16 + outpos] = ((in[37 + inpos]) >>> (27 - 2)) + | ((in[38 + inpos]) << 2) + | ((in[39 + inpos]) << 29) + | ((in[40 + inpos]) << 56); + out[17 + outpos] = ((in[40 + inpos]) >>> (27 - 19)) + | ((in[41 + inpos]) << 19) + | ((in[42 + inpos]) << 46); + out[18 + outpos] = ((in[42 + inpos]) >>> (27 - 9)) + | ((in[43 + inpos]) << 9) + | ((in[44 + inpos]) << 36) + | ((in[45 + inpos]) << 63); + out[19 + outpos] = ((in[45 + inpos]) >>> (27 - 26)) + | ((in[46 + inpos]) << 26) + | ((in[47 + inpos]) << 53); + out[20 + outpos] = ((in[47 + inpos]) >>> (27 - 16)) + | ((in[48 + inpos]) << 16) + | ((in[49 + inpos]) << 43); + out[21 + outpos] = ((in[49 + inpos]) >>> (27 - 6)) + | ((in[50 + inpos]) << 6) + | ((in[51 + inpos]) << 33) + | ((in[52 + inpos]) << 60); + out[22 + outpos] = ((in[52 + inpos]) >>> (27 - 23)) + | ((in[53 + inpos]) << 23) + | ((in[54 + inpos]) << 50); + out[23 + outpos] = ((in[54 + inpos]) >>> (27 - 13)) + | ((in[55 + inpos]) << 13) + | ((in[56 + inpos]) << 40); + out[24 + outpos] = ((in[56 + inpos]) >>> (27 - 3)) + | ((in[57 + inpos]) << 3) + | ((in[58 + inpos]) << 30) + | ((in[59 + inpos]) << 57); + out[25 + outpos] = ((in[59 + inpos]) >>> (27 - 20)) + | ((in[60 + inpos]) << 20) + | ((in[61 + inpos]) << 47); + out[26 + outpos] = ((in[61 + inpos]) >>> (27 - 10)) + | ((in[62 + inpos]) << 10) + | ((in[63 + inpos]) << 37); + } + + protected static void fastpackwithoutmask28(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 28) + | ((in[2 + inpos]) << 56); + out[1 + outpos] = ((in[2 + inpos]) >>> (28 - 20)) + | ((in[3 + inpos]) << 20) + | ((in[4 + inpos]) << 48); + out[2 + outpos] = ((in[4 + inpos]) >>> (28 - 12)) + | ((in[5 + inpos]) << 12) + | ((in[6 + inpos]) << 40); + out[3 + outpos] = ((in[6 + inpos]) >>> (28 - 4)) + | ((in[7 + inpos]) << 4) + | ((in[8 + inpos]) << 32) + | ((in[9 + inpos]) << 60); + out[4 + outpos] = ((in[9 + inpos]) >>> (28 - 24)) + | ((in[10 + inpos]) << 24) + | ((in[11 + inpos]) << 52); + out[5 + outpos] = ((in[11 + inpos]) >>> (28 - 16)) + | ((in[12 + inpos]) << 16) + | ((in[13 + inpos]) << 44); + out[6 + outpos] = ((in[13 + inpos]) >>> (28 - 8)) + | ((in[14 + inpos]) << 8) + | ((in[15 + inpos]) << 36); + out[7 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 28) + | ((in[18 + inpos]) << 56); + out[8 + outpos] = ((in[18 + inpos]) >>> (28 - 20)) + | ((in[19 + inpos]) << 20) + | ((in[20 + inpos]) << 48); + out[9 + outpos] = ((in[20 + inpos]) >>> (28 - 12)) + | ((in[21 + inpos]) << 12) + | ((in[22 + inpos]) << 40); + out[10 + outpos] = ((in[22 + inpos]) >>> (28 - 4)) + | ((in[23 + inpos]) << 4) + | ((in[24 + inpos]) << 32) + | ((in[25 + inpos]) << 60); + out[11 + outpos] = ((in[25 + inpos]) >>> (28 - 24)) + | ((in[26 + inpos]) << 24) + | ((in[27 + inpos]) << 52); + out[12 + outpos] = ((in[27 + inpos]) >>> (28 - 16)) + | ((in[28 + inpos]) << 16) + | ((in[29 + inpos]) << 44); + out[13 + outpos] = ((in[29 + inpos]) >>> (28 - 8)) + | ((in[30 + inpos]) << 8) + | ((in[31 + inpos]) << 36); + out[14 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 28) + | ((in[34 + inpos]) << 56); + out[15 + outpos] = ((in[34 + inpos]) >>> (28 - 20)) + | ((in[35 + inpos]) << 20) + | ((in[36 + inpos]) << 48); + out[16 + outpos] = ((in[36 + inpos]) >>> (28 - 12)) + | ((in[37 + inpos]) << 12) + | ((in[38 + inpos]) << 40); + out[17 + outpos] = ((in[38 + inpos]) >>> (28 - 4)) + | ((in[39 + inpos]) << 4) + | ((in[40 + inpos]) << 32) + | ((in[41 + inpos]) << 60); + out[18 + outpos] = ((in[41 + inpos]) >>> (28 - 24)) + | ((in[42 + inpos]) << 24) + | ((in[43 + inpos]) << 52); + out[19 + outpos] = ((in[43 + inpos]) >>> (28 - 16)) + | ((in[44 + inpos]) << 16) + | ((in[45 + inpos]) << 44); + out[20 + outpos] = ((in[45 + inpos]) >>> (28 - 8)) + | ((in[46 + inpos]) << 8) + | ((in[47 + inpos]) << 36); + out[21 + outpos] = in[48 + inpos] + | ((in[49 + inpos]) << 28) + | ((in[50 + inpos]) << 56); + out[22 + outpos] = ((in[50 + inpos]) >>> (28 - 20)) + | ((in[51 + inpos]) << 20) + | ((in[52 + inpos]) << 48); + out[23 + outpos] = ((in[52 + inpos]) >>> (28 - 12)) + | ((in[53 + inpos]) << 12) + | ((in[54 + inpos]) << 40); + out[24 + outpos] = ((in[54 + inpos]) >>> (28 - 4)) + | ((in[55 + inpos]) << 4) + | ((in[56 + inpos]) << 32) + | ((in[57 + inpos]) << 60); + out[25 + outpos] = ((in[57 + inpos]) >>> (28 - 24)) + | ((in[58 + inpos]) << 24) + | ((in[59 + inpos]) << 52); + out[26 + outpos] = ((in[59 + inpos]) >>> (28 - 16)) + | ((in[60 + inpos]) << 16) + | ((in[61 + inpos]) << 44); + out[27 + outpos] = ((in[61 + inpos]) >>> (28 - 8)) + | ((in[62 + inpos]) << 8) + | ((in[63 + inpos]) << 36); + } + + protected static void fastpackwithoutmask29(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 29) + | ((in[2 + inpos]) << 58); + out[1 + outpos] = ((in[2 + inpos]) >>> (29 - 23)) + | ((in[3 + inpos]) << 23) + | ((in[4 + inpos]) << 52); + out[2 + outpos] = ((in[4 + inpos]) >>> (29 - 17)) + | ((in[5 + inpos]) << 17) + | ((in[6 + inpos]) << 46); + out[3 + outpos] = ((in[6 + inpos]) >>> (29 - 11)) + | ((in[7 + inpos]) << 11) + | ((in[8 + inpos]) << 40); + out[4 + outpos] = ((in[8 + inpos]) >>> (29 - 5)) + | ((in[9 + inpos]) << 5) + | ((in[10 + inpos]) << 34) + | ((in[11 + inpos]) << 63); + out[5 + outpos] = ((in[11 + inpos]) >>> (29 - 28)) + | ((in[12 + inpos]) << 28) + | ((in[13 + inpos]) << 57); + out[6 + outpos] = ((in[13 + inpos]) >>> (29 - 22)) + | ((in[14 + inpos]) << 22) + | ((in[15 + inpos]) << 51); + out[7 + outpos] = ((in[15 + inpos]) >>> (29 - 16)) + | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 45); + out[8 + outpos] = ((in[17 + inpos]) >>> (29 - 10)) + | ((in[18 + inpos]) << 10) + | ((in[19 + inpos]) << 39); + out[9 + outpos] = ((in[19 + inpos]) >>> (29 - 4)) + | ((in[20 + inpos]) << 4) + | ((in[21 + inpos]) << 33) + | ((in[22 + inpos]) << 62); + out[10 + outpos] = ((in[22 + inpos]) >>> (29 - 27)) + | ((in[23 + inpos]) << 27) + | ((in[24 + inpos]) << 56); + out[11 + outpos] = ((in[24 + inpos]) >>> (29 - 21)) + | ((in[25 + inpos]) << 21) + | ((in[26 + inpos]) << 50); + out[12 + outpos] = ((in[26 + inpos]) >>> (29 - 15)) + | ((in[27 + inpos]) << 15) + | ((in[28 + inpos]) << 44); + out[13 + outpos] = ((in[28 + inpos]) >>> (29 - 9)) + | ((in[29 + inpos]) << 9) + | ((in[30 + inpos]) << 38); + out[14 + outpos] = ((in[30 + inpos]) >>> (29 - 3)) + | ((in[31 + inpos]) << 3) + | ((in[32 + inpos]) << 32) + | ((in[33 + inpos]) << 61); + out[15 + outpos] = ((in[33 + inpos]) >>> (29 - 26)) + | ((in[34 + inpos]) << 26) + | ((in[35 + inpos]) << 55); + out[16 + outpos] = ((in[35 + inpos]) >>> (29 - 20)) + | ((in[36 + inpos]) << 20) + | ((in[37 + inpos]) << 49); + out[17 + outpos] = ((in[37 + inpos]) >>> (29 - 14)) + | ((in[38 + inpos]) << 14) + | ((in[39 + inpos]) << 43); + out[18 + outpos] = ((in[39 + inpos]) >>> (29 - 8)) + | ((in[40 + inpos]) << 8) + | ((in[41 + inpos]) << 37); + out[19 + outpos] = ((in[41 + inpos]) >>> (29 - 2)) + | ((in[42 + inpos]) << 2) + | ((in[43 + inpos]) << 31) + | ((in[44 + inpos]) << 60); + out[20 + outpos] = ((in[44 + inpos]) >>> (29 - 25)) + | ((in[45 + inpos]) << 25) + | ((in[46 + inpos]) << 54); + out[21 + outpos] = ((in[46 + inpos]) >>> (29 - 19)) + | ((in[47 + inpos]) << 19) + | ((in[48 + inpos]) << 48); + out[22 + outpos] = ((in[48 + inpos]) >>> (29 - 13)) + | ((in[49 + inpos]) << 13) + | ((in[50 + inpos]) << 42); + out[23 + outpos] = ((in[50 + inpos]) >>> (29 - 7)) + | ((in[51 + inpos]) << 7) + | ((in[52 + inpos]) << 36); + out[24 + outpos] = ((in[52 + inpos]) >>> (29 - 1)) + | ((in[53 + inpos]) << 1) + | ((in[54 + inpos]) << 30) + | ((in[55 + inpos]) << 59); + out[25 + outpos] = ((in[55 + inpos]) >>> (29 - 24)) + | ((in[56 + inpos]) << 24) + | ((in[57 + inpos]) << 53); + out[26 + outpos] = ((in[57 + inpos]) >>> (29 - 18)) + | ((in[58 + inpos]) << 18) + | ((in[59 + inpos]) << 47); + out[27 + outpos] = ((in[59 + inpos]) >>> (29 - 12)) + | ((in[60 + inpos]) << 12) + | ((in[61 + inpos]) << 41); + out[28 + outpos] = ((in[61 + inpos]) >>> (29 - 6)) + | ((in[62 + inpos]) << 6) + | ((in[63 + inpos]) << 35); + } + + protected static void fastpackwithoutmask30(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 30) + | ((in[2 + inpos]) << 60); + out[1 + outpos] = ((in[2 + inpos]) >>> (30 - 26)) + | ((in[3 + inpos]) << 26) + | ((in[4 + inpos]) << 56); + out[2 + outpos] = ((in[4 + inpos]) >>> (30 - 22)) + | ((in[5 + inpos]) << 22) + | ((in[6 + inpos]) << 52); + out[3 + outpos] = ((in[6 + inpos]) >>> (30 - 18)) + | ((in[7 + inpos]) << 18) + | ((in[8 + inpos]) << 48); + out[4 + outpos] = ((in[8 + inpos]) >>> (30 - 14)) + | ((in[9 + inpos]) << 14) + | ((in[10 + inpos]) << 44); + out[5 + outpos] = ((in[10 + inpos]) >>> (30 - 10)) + | ((in[11 + inpos]) << 10) + | ((in[12 + inpos]) << 40); + out[6 + outpos] = ((in[12 + inpos]) >>> (30 - 6)) + | ((in[13 + inpos]) << 6) + | ((in[14 + inpos]) << 36); + out[7 + outpos] = ((in[14 + inpos]) >>> (30 - 2)) + | ((in[15 + inpos]) << 2) + | ((in[16 + inpos]) << 32) + | ((in[17 + inpos]) << 62); + out[8 + outpos] = ((in[17 + inpos]) >>> (30 - 28)) + | ((in[18 + inpos]) << 28) + | ((in[19 + inpos]) << 58); + out[9 + outpos] = ((in[19 + inpos]) >>> (30 - 24)) + | ((in[20 + inpos]) << 24) + | ((in[21 + inpos]) << 54); + out[10 + outpos] = ((in[21 + inpos]) >>> (30 - 20)) + | ((in[22 + inpos]) << 20) + | ((in[23 + inpos]) << 50); + out[11 + outpos] = ((in[23 + inpos]) >>> (30 - 16)) + | ((in[24 + inpos]) << 16) + | ((in[25 + inpos]) << 46); + out[12 + outpos] = ((in[25 + inpos]) >>> (30 - 12)) + | ((in[26 + inpos]) << 12) + | ((in[27 + inpos]) << 42); + out[13 + outpos] = ((in[27 + inpos]) >>> (30 - 8)) + | ((in[28 + inpos]) << 8) + | ((in[29 + inpos]) << 38); + out[14 + outpos] = ((in[29 + inpos]) >>> (30 - 4)) + | ((in[30 + inpos]) << 4) + | ((in[31 + inpos]) << 34); + out[15 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 30) + | ((in[34 + inpos]) << 60); + out[16 + outpos] = ((in[34 + inpos]) >>> (30 - 26)) + | ((in[35 + inpos]) << 26) + | ((in[36 + inpos]) << 56); + out[17 + outpos] = ((in[36 + inpos]) >>> (30 - 22)) + | ((in[37 + inpos]) << 22) + | ((in[38 + inpos]) << 52); + out[18 + outpos] = ((in[38 + inpos]) >>> (30 - 18)) + | ((in[39 + inpos]) << 18) + | ((in[40 + inpos]) << 48); + out[19 + outpos] = ((in[40 + inpos]) >>> (30 - 14)) + | ((in[41 + inpos]) << 14) + | ((in[42 + inpos]) << 44); + out[20 + outpos] = ((in[42 + inpos]) >>> (30 - 10)) + | ((in[43 + inpos]) << 10) + | ((in[44 + inpos]) << 40); + out[21 + outpos] = ((in[44 + inpos]) >>> (30 - 6)) + | ((in[45 + inpos]) << 6) + | ((in[46 + inpos]) << 36); + out[22 + outpos] = ((in[46 + inpos]) >>> (30 - 2)) + | ((in[47 + inpos]) << 2) + | ((in[48 + inpos]) << 32) + | ((in[49 + inpos]) << 62); + out[23 + outpos] = ((in[49 + inpos]) >>> (30 - 28)) + | ((in[50 + inpos]) << 28) + | ((in[51 + inpos]) << 58); + out[24 + outpos] = ((in[51 + inpos]) >>> (30 - 24)) + | ((in[52 + inpos]) << 24) + | ((in[53 + inpos]) << 54); + out[25 + outpos] = ((in[53 + inpos]) >>> (30 - 20)) + | ((in[54 + inpos]) << 20) + | ((in[55 + inpos]) << 50); + out[26 + outpos] = ((in[55 + inpos]) >>> (30 - 16)) + | ((in[56 + inpos]) << 16) + | ((in[57 + inpos]) << 46); + out[27 + outpos] = ((in[57 + inpos]) >>> (30 - 12)) + | ((in[58 + inpos]) << 12) + | ((in[59 + inpos]) << 42); + out[28 + outpos] = ((in[59 + inpos]) >>> (30 - 8)) + | ((in[60 + inpos]) << 8) + | ((in[61 + inpos]) << 38); + out[29 + outpos] = ((in[61 + inpos]) >>> (30 - 4)) + | ((in[62 + inpos]) << 4) + | ((in[63 + inpos]) << 34); + } + + protected static void fastpackwithoutmask31(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 31) + | ((in[2 + inpos]) << 62); + out[1 + outpos] = ((in[2 + inpos]) >>> (31 - 29)) + | ((in[3 + inpos]) << 29) + | ((in[4 + inpos]) << 60); + out[2 + outpos] = ((in[4 + inpos]) >>> (31 - 27)) + | ((in[5 + inpos]) << 27) + | ((in[6 + inpos]) << 58); + out[3 + outpos] = ((in[6 + inpos]) >>> (31 - 25)) + | ((in[7 + inpos]) << 25) + | ((in[8 + inpos]) << 56); + out[4 + outpos] = ((in[8 + inpos]) >>> (31 - 23)) + | ((in[9 + inpos]) << 23) + | ((in[10 + inpos]) << 54); + out[5 + outpos] = ((in[10 + inpos]) >>> (31 - 21)) + | ((in[11 + inpos]) << 21) + | ((in[12 + inpos]) << 52); + out[6 + outpos] = ((in[12 + inpos]) >>> (31 - 19)) + | ((in[13 + inpos]) << 19) + | ((in[14 + inpos]) << 50); + out[7 + outpos] = ((in[14 + inpos]) >>> (31 - 17)) + | ((in[15 + inpos]) << 17) + | ((in[16 + inpos]) << 48); + out[8 + outpos] = ((in[16 + inpos]) >>> (31 - 15)) + | ((in[17 + inpos]) << 15) + | ((in[18 + inpos]) << 46); + out[9 + outpos] = ((in[18 + inpos]) >>> (31 - 13)) + | ((in[19 + inpos]) << 13) + | ((in[20 + inpos]) << 44); + out[10 + outpos] = ((in[20 + inpos]) >>> (31 - 11)) + | ((in[21 + inpos]) << 11) + | ((in[22 + inpos]) << 42); + out[11 + outpos] = ((in[22 + inpos]) >>> (31 - 9)) + | ((in[23 + inpos]) << 9) + | ((in[24 + inpos]) << 40); + out[12 + outpos] = ((in[24 + inpos]) >>> (31 - 7)) + | ((in[25 + inpos]) << 7) + | ((in[26 + inpos]) << 38); + out[13 + outpos] = ((in[26 + inpos]) >>> (31 - 5)) + | ((in[27 + inpos]) << 5) + | ((in[28 + inpos]) << 36); + out[14 + outpos] = ((in[28 + inpos]) >>> (31 - 3)) + | ((in[29 + inpos]) << 3) + | ((in[30 + inpos]) << 34); + out[15 + outpos] = ((in[30 + inpos]) >>> (31 - 1)) + | ((in[31 + inpos]) << 1) + | ((in[32 + inpos]) << 32) + | ((in[33 + inpos]) << 63); + out[16 + outpos] = ((in[33 + inpos]) >>> (31 - 30)) + | ((in[34 + inpos]) << 30) + | ((in[35 + inpos]) << 61); + out[17 + outpos] = ((in[35 + inpos]) >>> (31 - 28)) + | ((in[36 + inpos]) << 28) + | ((in[37 + inpos]) << 59); + out[18 + outpos] = ((in[37 + inpos]) >>> (31 - 26)) + | ((in[38 + inpos]) << 26) + | ((in[39 + inpos]) << 57); + out[19 + outpos] = ((in[39 + inpos]) >>> (31 - 24)) + | ((in[40 + inpos]) << 24) + | ((in[41 + inpos]) << 55); + out[20 + outpos] = ((in[41 + inpos]) >>> (31 - 22)) + | ((in[42 + inpos]) << 22) + | ((in[43 + inpos]) << 53); + out[21 + outpos] = ((in[43 + inpos]) >>> (31 - 20)) + | ((in[44 + inpos]) << 20) + | ((in[45 + inpos]) << 51); + out[22 + outpos] = ((in[45 + inpos]) >>> (31 - 18)) + | ((in[46 + inpos]) << 18) + | ((in[47 + inpos]) << 49); + out[23 + outpos] = ((in[47 + inpos]) >>> (31 - 16)) + | ((in[48 + inpos]) << 16) + | ((in[49 + inpos]) << 47); + out[24 + outpos] = ((in[49 + inpos]) >>> (31 - 14)) + | ((in[50 + inpos]) << 14) + | ((in[51 + inpos]) << 45); + out[25 + outpos] = ((in[51 + inpos]) >>> (31 - 12)) + | ((in[52 + inpos]) << 12) + | ((in[53 + inpos]) << 43); + out[26 + outpos] = ((in[53 + inpos]) >>> (31 - 10)) + | ((in[54 + inpos]) << 10) + | ((in[55 + inpos]) << 41); + out[27 + outpos] = ((in[55 + inpos]) >>> (31 - 8)) + | ((in[56 + inpos]) << 8) + | ((in[57 + inpos]) << 39); + out[28 + outpos] = ((in[57 + inpos]) >>> (31 - 6)) + | ((in[58 + inpos]) << 6) + | ((in[59 + inpos]) << 37); + out[29 + outpos] = ((in[59 + inpos]) >>> (31 - 4)) + | ((in[60 + inpos]) << 4) + | ((in[61 + inpos]) << 35); + out[30 + outpos] = ((in[61 + inpos]) >>> (31 - 2)) + | ((in[62 + inpos]) << 2) + | ((in[63 + inpos]) << 33); + } + + protected static void fastpackwithoutmask32(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 32); + out[1 + outpos] = in[2 + inpos] + | ((in[3 + inpos]) << 32); + out[2 + outpos] = in[4 + inpos] + | ((in[5 + inpos]) << 32); + out[3 + outpos] = in[6 + inpos] + | ((in[7 + inpos]) << 32); + out[4 + outpos] = in[8 + inpos] + | ((in[9 + inpos]) << 32); + out[5 + outpos] = in[10 + inpos] + | ((in[11 + inpos]) << 32); + out[6 + outpos] = in[12 + inpos] + | ((in[13 + inpos]) << 32); + out[7 + outpos] = in[14 + inpos] + | ((in[15 + inpos]) << 32); + out[8 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 32); + out[9 + outpos] = in[18 + inpos] + | ((in[19 + inpos]) << 32); + out[10 + outpos] = in[20 + inpos] + | ((in[21 + inpos]) << 32); + out[11 + outpos] = in[22 + inpos] + | ((in[23 + inpos]) << 32); + out[12 + outpos] = in[24 + inpos] + | ((in[25 + inpos]) << 32); + out[13 + outpos] = in[26 + inpos] + | ((in[27 + inpos]) << 32); + out[14 + outpos] = in[28 + inpos] + | ((in[29 + inpos]) << 32); + out[15 + outpos] = in[30 + inpos] + | ((in[31 + inpos]) << 32); + out[16 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 32); + out[17 + outpos] = in[34 + inpos] + | ((in[35 + inpos]) << 32); + out[18 + outpos] = in[36 + inpos] + | ((in[37 + inpos]) << 32); + out[19 + outpos] = in[38 + inpos] + | ((in[39 + inpos]) << 32); + out[20 + outpos] = in[40 + inpos] + | ((in[41 + inpos]) << 32); + out[21 + outpos] = in[42 + inpos] + | ((in[43 + inpos]) << 32); + out[22 + outpos] = in[44 + inpos] + | ((in[45 + inpos]) << 32); + out[23 + outpos] = in[46 + inpos] + | ((in[47 + inpos]) << 32); + out[24 + outpos] = in[48 + inpos] + | ((in[49 + inpos]) << 32); + out[25 + outpos] = in[50 + inpos] + | ((in[51 + inpos]) << 32); + out[26 + outpos] = in[52 + inpos] + | ((in[53 + inpos]) << 32); + out[27 + outpos] = in[54 + inpos] + | ((in[55 + inpos]) << 32); + out[28 + outpos] = in[56 + inpos] + | ((in[57 + inpos]) << 32); + out[29 + outpos] = in[58 + inpos] + | ((in[59 + inpos]) << 32); + out[30 + outpos] = in[60 + inpos] + | ((in[61 + inpos]) << 32); + out[31 + outpos] = in[62 + inpos] + | ((in[63 + inpos]) << 32); + } + + protected static void fastpackwithoutmask33(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 33); + out[1 + outpos] = ((in[1 + inpos]) >>> (33 - 2)) + | ((in[2 + inpos]) << 2) + | ((in[3 + inpos]) << 35); + out[2 + outpos] = ((in[3 + inpos]) >>> (33 - 4)) + | ((in[4 + inpos]) << 4) + | ((in[5 + inpos]) << 37); + out[3 + outpos] = ((in[5 + inpos]) >>> (33 - 6)) + | ((in[6 + inpos]) << 6) + | ((in[7 + inpos]) << 39); + out[4 + outpos] = ((in[7 + inpos]) >>> (33 - 8)) + | ((in[8 + inpos]) << 8) + | ((in[9 + inpos]) << 41); + out[5 + outpos] = ((in[9 + inpos]) >>> (33 - 10)) + | ((in[10 + inpos]) << 10) + | ((in[11 + inpos]) << 43); + out[6 + outpos] = ((in[11 + inpos]) >>> (33 - 12)) + | ((in[12 + inpos]) << 12) + | ((in[13 + inpos]) << 45); + out[7 + outpos] = ((in[13 + inpos]) >>> (33 - 14)) + | ((in[14 + inpos]) << 14) + | ((in[15 + inpos]) << 47); + out[8 + outpos] = ((in[15 + inpos]) >>> (33 - 16)) + | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 49); + out[9 + outpos] = ((in[17 + inpos]) >>> (33 - 18)) + | ((in[18 + inpos]) << 18) + | ((in[19 + inpos]) << 51); + out[10 + outpos] = ((in[19 + inpos]) >>> (33 - 20)) + | ((in[20 + inpos]) << 20) + | ((in[21 + inpos]) << 53); + out[11 + outpos] = ((in[21 + inpos]) >>> (33 - 22)) + | ((in[22 + inpos]) << 22) + | ((in[23 + inpos]) << 55); + out[12 + outpos] = ((in[23 + inpos]) >>> (33 - 24)) + | ((in[24 + inpos]) << 24) + | ((in[25 + inpos]) << 57); + out[13 + outpos] = ((in[25 + inpos]) >>> (33 - 26)) + | ((in[26 + inpos]) << 26) + | ((in[27 + inpos]) << 59); + out[14 + outpos] = ((in[27 + inpos]) >>> (33 - 28)) + | ((in[28 + inpos]) << 28) + | ((in[29 + inpos]) << 61); + out[15 + outpos] = ((in[29 + inpos]) >>> (33 - 30)) + | ((in[30 + inpos]) << 30) + | ((in[31 + inpos]) << 63); + out[16 + outpos] = ((in[31 + inpos]) >>> (33 - 32)) + | ((in[32 + inpos]) << 32); + out[17 + outpos] = ((in[32 + inpos]) >>> (33 - 1)) + | ((in[33 + inpos]) << 1) + | ((in[34 + inpos]) << 34); + out[18 + outpos] = ((in[34 + inpos]) >>> (33 - 3)) + | ((in[35 + inpos]) << 3) + | ((in[36 + inpos]) << 36); + out[19 + outpos] = ((in[36 + inpos]) >>> (33 - 5)) + | ((in[37 + inpos]) << 5) + | ((in[38 + inpos]) << 38); + out[20 + outpos] = ((in[38 + inpos]) >>> (33 - 7)) + | ((in[39 + inpos]) << 7) + | ((in[40 + inpos]) << 40); + out[21 + outpos] = ((in[40 + inpos]) >>> (33 - 9)) + | ((in[41 + inpos]) << 9) + | ((in[42 + inpos]) << 42); + out[22 + outpos] = ((in[42 + inpos]) >>> (33 - 11)) + | ((in[43 + inpos]) << 11) + | ((in[44 + inpos]) << 44); + out[23 + outpos] = ((in[44 + inpos]) >>> (33 - 13)) + | ((in[45 + inpos]) << 13) + | ((in[46 + inpos]) << 46); + out[24 + outpos] = ((in[46 + inpos]) >>> (33 - 15)) + | ((in[47 + inpos]) << 15) + | ((in[48 + inpos]) << 48); + out[25 + outpos] = ((in[48 + inpos]) >>> (33 - 17)) + | ((in[49 + inpos]) << 17) + | ((in[50 + inpos]) << 50); + out[26 + outpos] = ((in[50 + inpos]) >>> (33 - 19)) + | ((in[51 + inpos]) << 19) + | ((in[52 + inpos]) << 52); + out[27 + outpos] = ((in[52 + inpos]) >>> (33 - 21)) + | ((in[53 + inpos]) << 21) + | ((in[54 + inpos]) << 54); + out[28 + outpos] = ((in[54 + inpos]) >>> (33 - 23)) + | ((in[55 + inpos]) << 23) + | ((in[56 + inpos]) << 56); + out[29 + outpos] = ((in[56 + inpos]) >>> (33 - 25)) + | ((in[57 + inpos]) << 25) + | ((in[58 + inpos]) << 58); + out[30 + outpos] = ((in[58 + inpos]) >>> (33 - 27)) + | ((in[59 + inpos]) << 27) + | ((in[60 + inpos]) << 60); + out[31 + outpos] = ((in[60 + inpos]) >>> (33 - 29)) + | ((in[61 + inpos]) << 29) + | ((in[62 + inpos]) << 62); + out[32 + outpos] = ((in[62 + inpos]) >>> (33 - 31)) + | ((in[63 + inpos]) << 31); + } + + protected static void fastpackwithoutmask34(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 34); + out[1 + outpos] = ((in[1 + inpos]) >>> (34 - 4)) + | ((in[2 + inpos]) << 4) + | ((in[3 + inpos]) << 38); + out[2 + outpos] = ((in[3 + inpos]) >>> (34 - 8)) + | ((in[4 + inpos]) << 8) + | ((in[5 + inpos]) << 42); + out[3 + outpos] = ((in[5 + inpos]) >>> (34 - 12)) + | ((in[6 + inpos]) << 12) + | ((in[7 + inpos]) << 46); + out[4 + outpos] = ((in[7 + inpos]) >>> (34 - 16)) + | ((in[8 + inpos]) << 16) + | ((in[9 + inpos]) << 50); + out[5 + outpos] = ((in[9 + inpos]) >>> (34 - 20)) + | ((in[10 + inpos]) << 20) + | ((in[11 + inpos]) << 54); + out[6 + outpos] = ((in[11 + inpos]) >>> (34 - 24)) + | ((in[12 + inpos]) << 24) + | ((in[13 + inpos]) << 58); + out[7 + outpos] = ((in[13 + inpos]) >>> (34 - 28)) + | ((in[14 + inpos]) << 28) + | ((in[15 + inpos]) << 62); + out[8 + outpos] = ((in[15 + inpos]) >>> (34 - 32)) + | ((in[16 + inpos]) << 32); + out[9 + outpos] = ((in[16 + inpos]) >>> (34 - 2)) + | ((in[17 + inpos]) << 2) + | ((in[18 + inpos]) << 36); + out[10 + outpos] = ((in[18 + inpos]) >>> (34 - 6)) + | ((in[19 + inpos]) << 6) + | ((in[20 + inpos]) << 40); + out[11 + outpos] = ((in[20 + inpos]) >>> (34 - 10)) + | ((in[21 + inpos]) << 10) + | ((in[22 + inpos]) << 44); + out[12 + outpos] = ((in[22 + inpos]) >>> (34 - 14)) + | ((in[23 + inpos]) << 14) + | ((in[24 + inpos]) << 48); + out[13 + outpos] = ((in[24 + inpos]) >>> (34 - 18)) + | ((in[25 + inpos]) << 18) + | ((in[26 + inpos]) << 52); + out[14 + outpos] = ((in[26 + inpos]) >>> (34 - 22)) + | ((in[27 + inpos]) << 22) + | ((in[28 + inpos]) << 56); + out[15 + outpos] = ((in[28 + inpos]) >>> (34 - 26)) + | ((in[29 + inpos]) << 26) + | ((in[30 + inpos]) << 60); + out[16 + outpos] = ((in[30 + inpos]) >>> (34 - 30)) + | ((in[31 + inpos]) << 30); + out[17 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 34); + out[18 + outpos] = ((in[33 + inpos]) >>> (34 - 4)) + | ((in[34 + inpos]) << 4) + | ((in[35 + inpos]) << 38); + out[19 + outpos] = ((in[35 + inpos]) >>> (34 - 8)) + | ((in[36 + inpos]) << 8) + | ((in[37 + inpos]) << 42); + out[20 + outpos] = ((in[37 + inpos]) >>> (34 - 12)) + | ((in[38 + inpos]) << 12) + | ((in[39 + inpos]) << 46); + out[21 + outpos] = ((in[39 + inpos]) >>> (34 - 16)) + | ((in[40 + inpos]) << 16) + | ((in[41 + inpos]) << 50); + out[22 + outpos] = ((in[41 + inpos]) >>> (34 - 20)) + | ((in[42 + inpos]) << 20) + | ((in[43 + inpos]) << 54); + out[23 + outpos] = ((in[43 + inpos]) >>> (34 - 24)) + | ((in[44 + inpos]) << 24) + | ((in[45 + inpos]) << 58); + out[24 + outpos] = ((in[45 + inpos]) >>> (34 - 28)) + | ((in[46 + inpos]) << 28) + | ((in[47 + inpos]) << 62); + out[25 + outpos] = ((in[47 + inpos]) >>> (34 - 32)) + | ((in[48 + inpos]) << 32); + out[26 + outpos] = ((in[48 + inpos]) >>> (34 - 2)) + | ((in[49 + inpos]) << 2) + | ((in[50 + inpos]) << 36); + out[27 + outpos] = ((in[50 + inpos]) >>> (34 - 6)) + | ((in[51 + inpos]) << 6) + | ((in[52 + inpos]) << 40); + out[28 + outpos] = ((in[52 + inpos]) >>> (34 - 10)) + | ((in[53 + inpos]) << 10) + | ((in[54 + inpos]) << 44); + out[29 + outpos] = ((in[54 + inpos]) >>> (34 - 14)) + | ((in[55 + inpos]) << 14) + | ((in[56 + inpos]) << 48); + out[30 + outpos] = ((in[56 + inpos]) >>> (34 - 18)) + | ((in[57 + inpos]) << 18) + | ((in[58 + inpos]) << 52); + out[31 + outpos] = ((in[58 + inpos]) >>> (34 - 22)) + | ((in[59 + inpos]) << 22) + | ((in[60 + inpos]) << 56); + out[32 + outpos] = ((in[60 + inpos]) >>> (34 - 26)) + | ((in[61 + inpos]) << 26) + | ((in[62 + inpos]) << 60); + out[33 + outpos] = ((in[62 + inpos]) >>> (34 - 30)) + | ((in[63 + inpos]) << 30); + } + + protected static void fastpackwithoutmask35(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 35); + out[1 + outpos] = ((in[1 + inpos]) >>> (35 - 6)) + | ((in[2 + inpos]) << 6) + | ((in[3 + inpos]) << 41); + out[2 + outpos] = ((in[3 + inpos]) >>> (35 - 12)) + | ((in[4 + inpos]) << 12) + | ((in[5 + inpos]) << 47); + out[3 + outpos] = ((in[5 + inpos]) >>> (35 - 18)) + | ((in[6 + inpos]) << 18) + | ((in[7 + inpos]) << 53); + out[4 + outpos] = ((in[7 + inpos]) >>> (35 - 24)) + | ((in[8 + inpos]) << 24) + | ((in[9 + inpos]) << 59); + out[5 + outpos] = ((in[9 + inpos]) >>> (35 - 30)) + | ((in[10 + inpos]) << 30); + out[6 + outpos] = ((in[10 + inpos]) >>> (35 - 1)) + | ((in[11 + inpos]) << 1) + | ((in[12 + inpos]) << 36); + out[7 + outpos] = ((in[12 + inpos]) >>> (35 - 7)) + | ((in[13 + inpos]) << 7) + | ((in[14 + inpos]) << 42); + out[8 + outpos] = ((in[14 + inpos]) >>> (35 - 13)) + | ((in[15 + inpos]) << 13) + | ((in[16 + inpos]) << 48); + out[9 + outpos] = ((in[16 + inpos]) >>> (35 - 19)) + | ((in[17 + inpos]) << 19) + | ((in[18 + inpos]) << 54); + out[10 + outpos] = ((in[18 + inpos]) >>> (35 - 25)) + | ((in[19 + inpos]) << 25) + | ((in[20 + inpos]) << 60); + out[11 + outpos] = ((in[20 + inpos]) >>> (35 - 31)) + | ((in[21 + inpos]) << 31); + out[12 + outpos] = ((in[21 + inpos]) >>> (35 - 2)) + | ((in[22 + inpos]) << 2) + | ((in[23 + inpos]) << 37); + out[13 + outpos] = ((in[23 + inpos]) >>> (35 - 8)) + | ((in[24 + inpos]) << 8) + | ((in[25 + inpos]) << 43); + out[14 + outpos] = ((in[25 + inpos]) >>> (35 - 14)) + | ((in[26 + inpos]) << 14) + | ((in[27 + inpos]) << 49); + out[15 + outpos] = ((in[27 + inpos]) >>> (35 - 20)) + | ((in[28 + inpos]) << 20) + | ((in[29 + inpos]) << 55); + out[16 + outpos] = ((in[29 + inpos]) >>> (35 - 26)) + | ((in[30 + inpos]) << 26) + | ((in[31 + inpos]) << 61); + out[17 + outpos] = ((in[31 + inpos]) >>> (35 - 32)) + | ((in[32 + inpos]) << 32); + out[18 + outpos] = ((in[32 + inpos]) >>> (35 - 3)) + | ((in[33 + inpos]) << 3) + | ((in[34 + inpos]) << 38); + out[19 + outpos] = ((in[34 + inpos]) >>> (35 - 9)) + | ((in[35 + inpos]) << 9) + | ((in[36 + inpos]) << 44); + out[20 + outpos] = ((in[36 + inpos]) >>> (35 - 15)) + | ((in[37 + inpos]) << 15) + | ((in[38 + inpos]) << 50); + out[21 + outpos] = ((in[38 + inpos]) >>> (35 - 21)) + | ((in[39 + inpos]) << 21) + | ((in[40 + inpos]) << 56); + out[22 + outpos] = ((in[40 + inpos]) >>> (35 - 27)) + | ((in[41 + inpos]) << 27) + | ((in[42 + inpos]) << 62); + out[23 + outpos] = ((in[42 + inpos]) >>> (35 - 33)) + | ((in[43 + inpos]) << 33); + out[24 + outpos] = ((in[43 + inpos]) >>> (35 - 4)) + | ((in[44 + inpos]) << 4) + | ((in[45 + inpos]) << 39); + out[25 + outpos] = ((in[45 + inpos]) >>> (35 - 10)) + | ((in[46 + inpos]) << 10) + | ((in[47 + inpos]) << 45); + out[26 + outpos] = ((in[47 + inpos]) >>> (35 - 16)) + | ((in[48 + inpos]) << 16) + | ((in[49 + inpos]) << 51); + out[27 + outpos] = ((in[49 + inpos]) >>> (35 - 22)) + | ((in[50 + inpos]) << 22) + | ((in[51 + inpos]) << 57); + out[28 + outpos] = ((in[51 + inpos]) >>> (35 - 28)) + | ((in[52 + inpos]) << 28) + | ((in[53 + inpos]) << 63); + out[29 + outpos] = ((in[53 + inpos]) >>> (35 - 34)) + | ((in[54 + inpos]) << 34); + out[30 + outpos] = ((in[54 + inpos]) >>> (35 - 5)) + | ((in[55 + inpos]) << 5) + | ((in[56 + inpos]) << 40); + out[31 + outpos] = ((in[56 + inpos]) >>> (35 - 11)) + | ((in[57 + inpos]) << 11) + | ((in[58 + inpos]) << 46); + out[32 + outpos] = ((in[58 + inpos]) >>> (35 - 17)) + | ((in[59 + inpos]) << 17) + | ((in[60 + inpos]) << 52); + out[33 + outpos] = ((in[60 + inpos]) >>> (35 - 23)) + | ((in[61 + inpos]) << 23) + | ((in[62 + inpos]) << 58); + out[34 + outpos] = ((in[62 + inpos]) >>> (35 - 29)) + | ((in[63 + inpos]) << 29); + } + + protected static void fastpackwithoutmask36(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 36); + out[1 + outpos] = ((in[1 + inpos]) >>> (36 - 8)) + | ((in[2 + inpos]) << 8) + | ((in[3 + inpos]) << 44); + out[2 + outpos] = ((in[3 + inpos]) >>> (36 - 16)) + | ((in[4 + inpos]) << 16) + | ((in[5 + inpos]) << 52); + out[3 + outpos] = ((in[5 + inpos]) >>> (36 - 24)) + | ((in[6 + inpos]) << 24) + | ((in[7 + inpos]) << 60); + out[4 + outpos] = ((in[7 + inpos]) >>> (36 - 32)) + | ((in[8 + inpos]) << 32); + out[5 + outpos] = ((in[8 + inpos]) >>> (36 - 4)) + | ((in[9 + inpos]) << 4) + | ((in[10 + inpos]) << 40); + out[6 + outpos] = ((in[10 + inpos]) >>> (36 - 12)) + | ((in[11 + inpos]) << 12) + | ((in[12 + inpos]) << 48); + out[7 + outpos] = ((in[12 + inpos]) >>> (36 - 20)) + | ((in[13 + inpos]) << 20) + | ((in[14 + inpos]) << 56); + out[8 + outpos] = ((in[14 + inpos]) >>> (36 - 28)) + | ((in[15 + inpos]) << 28); + out[9 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 36); + out[10 + outpos] = ((in[17 + inpos]) >>> (36 - 8)) + | ((in[18 + inpos]) << 8) + | ((in[19 + inpos]) << 44); + out[11 + outpos] = ((in[19 + inpos]) >>> (36 - 16)) + | ((in[20 + inpos]) << 16) + | ((in[21 + inpos]) << 52); + out[12 + outpos] = ((in[21 + inpos]) >>> (36 - 24)) + | ((in[22 + inpos]) << 24) + | ((in[23 + inpos]) << 60); + out[13 + outpos] = ((in[23 + inpos]) >>> (36 - 32)) + | ((in[24 + inpos]) << 32); + out[14 + outpos] = ((in[24 + inpos]) >>> (36 - 4)) + | ((in[25 + inpos]) << 4) + | ((in[26 + inpos]) << 40); + out[15 + outpos] = ((in[26 + inpos]) >>> (36 - 12)) + | ((in[27 + inpos]) << 12) + | ((in[28 + inpos]) << 48); + out[16 + outpos] = ((in[28 + inpos]) >>> (36 - 20)) + | ((in[29 + inpos]) << 20) + | ((in[30 + inpos]) << 56); + out[17 + outpos] = ((in[30 + inpos]) >>> (36 - 28)) + | ((in[31 + inpos]) << 28); + out[18 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 36); + out[19 + outpos] = ((in[33 + inpos]) >>> (36 - 8)) + | ((in[34 + inpos]) << 8) + | ((in[35 + inpos]) << 44); + out[20 + outpos] = ((in[35 + inpos]) >>> (36 - 16)) + | ((in[36 + inpos]) << 16) + | ((in[37 + inpos]) << 52); + out[21 + outpos] = ((in[37 + inpos]) >>> (36 - 24)) + | ((in[38 + inpos]) << 24) + | ((in[39 + inpos]) << 60); + out[22 + outpos] = ((in[39 + inpos]) >>> (36 - 32)) + | ((in[40 + inpos]) << 32); + out[23 + outpos] = ((in[40 + inpos]) >>> (36 - 4)) + | ((in[41 + inpos]) << 4) + | ((in[42 + inpos]) << 40); + out[24 + outpos] = ((in[42 + inpos]) >>> (36 - 12)) + | ((in[43 + inpos]) << 12) + | ((in[44 + inpos]) << 48); + out[25 + outpos] = ((in[44 + inpos]) >>> (36 - 20)) + | ((in[45 + inpos]) << 20) + | ((in[46 + inpos]) << 56); + out[26 + outpos] = ((in[46 + inpos]) >>> (36 - 28)) + | ((in[47 + inpos]) << 28); + out[27 + outpos] = in[48 + inpos] + | ((in[49 + inpos]) << 36); + out[28 + outpos] = ((in[49 + inpos]) >>> (36 - 8)) + | ((in[50 + inpos]) << 8) + | ((in[51 + inpos]) << 44); + out[29 + outpos] = ((in[51 + inpos]) >>> (36 - 16)) + | ((in[52 + inpos]) << 16) + | ((in[53 + inpos]) << 52); + out[30 + outpos] = ((in[53 + inpos]) >>> (36 - 24)) + | ((in[54 + inpos]) << 24) + | ((in[55 + inpos]) << 60); + out[31 + outpos] = ((in[55 + inpos]) >>> (36 - 32)) + | ((in[56 + inpos]) << 32); + out[32 + outpos] = ((in[56 + inpos]) >>> (36 - 4)) + | ((in[57 + inpos]) << 4) + | ((in[58 + inpos]) << 40); + out[33 + outpos] = ((in[58 + inpos]) >>> (36 - 12)) + | ((in[59 + inpos]) << 12) + | ((in[60 + inpos]) << 48); + out[34 + outpos] = ((in[60 + inpos]) >>> (36 - 20)) + | ((in[61 + inpos]) << 20) + | ((in[62 + inpos]) << 56); + out[35 + outpos] = ((in[62 + inpos]) >>> (36 - 28)) + | ((in[63 + inpos]) << 28); + } + + protected static void fastpackwithoutmask37(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 37); + out[1 + outpos] = ((in[1 + inpos]) >>> (37 - 10)) + | ((in[2 + inpos]) << 10) + | ((in[3 + inpos]) << 47); + out[2 + outpos] = ((in[3 + inpos]) >>> (37 - 20)) + | ((in[4 + inpos]) << 20) + | ((in[5 + inpos]) << 57); + out[3 + outpos] = ((in[5 + inpos]) >>> (37 - 30)) + | ((in[6 + inpos]) << 30); + out[4 + outpos] = ((in[6 + inpos]) >>> (37 - 3)) + | ((in[7 + inpos]) << 3) + | ((in[8 + inpos]) << 40); + out[5 + outpos] = ((in[8 + inpos]) >>> (37 - 13)) + | ((in[9 + inpos]) << 13) + | ((in[10 + inpos]) << 50); + out[6 + outpos] = ((in[10 + inpos]) >>> (37 - 23)) + | ((in[11 + inpos]) << 23) + | ((in[12 + inpos]) << 60); + out[7 + outpos] = ((in[12 + inpos]) >>> (37 - 33)) + | ((in[13 + inpos]) << 33); + out[8 + outpos] = ((in[13 + inpos]) >>> (37 - 6)) + | ((in[14 + inpos]) << 6) + | ((in[15 + inpos]) << 43); + out[9 + outpos] = ((in[15 + inpos]) >>> (37 - 16)) + | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 53); + out[10 + outpos] = ((in[17 + inpos]) >>> (37 - 26)) + | ((in[18 + inpos]) << 26) + | ((in[19 + inpos]) << 63); + out[11 + outpos] = ((in[19 + inpos]) >>> (37 - 36)) + | ((in[20 + inpos]) << 36); + out[12 + outpos] = ((in[20 + inpos]) >>> (37 - 9)) + | ((in[21 + inpos]) << 9) + | ((in[22 + inpos]) << 46); + out[13 + outpos] = ((in[22 + inpos]) >>> (37 - 19)) + | ((in[23 + inpos]) << 19) + | ((in[24 + inpos]) << 56); + out[14 + outpos] = ((in[24 + inpos]) >>> (37 - 29)) + | ((in[25 + inpos]) << 29); + out[15 + outpos] = ((in[25 + inpos]) >>> (37 - 2)) + | ((in[26 + inpos]) << 2) + | ((in[27 + inpos]) << 39); + out[16 + outpos] = ((in[27 + inpos]) >>> (37 - 12)) + | ((in[28 + inpos]) << 12) + | ((in[29 + inpos]) << 49); + out[17 + outpos] = ((in[29 + inpos]) >>> (37 - 22)) + | ((in[30 + inpos]) << 22) + | ((in[31 + inpos]) << 59); + out[18 + outpos] = ((in[31 + inpos]) >>> (37 - 32)) + | ((in[32 + inpos]) << 32); + out[19 + outpos] = ((in[32 + inpos]) >>> (37 - 5)) + | ((in[33 + inpos]) << 5) + | ((in[34 + inpos]) << 42); + out[20 + outpos] = ((in[34 + inpos]) >>> (37 - 15)) + | ((in[35 + inpos]) << 15) + | ((in[36 + inpos]) << 52); + out[21 + outpos] = ((in[36 + inpos]) >>> (37 - 25)) + | ((in[37 + inpos]) << 25) + | ((in[38 + inpos]) << 62); + out[22 + outpos] = ((in[38 + inpos]) >>> (37 - 35)) + | ((in[39 + inpos]) << 35); + out[23 + outpos] = ((in[39 + inpos]) >>> (37 - 8)) + | ((in[40 + inpos]) << 8) + | ((in[41 + inpos]) << 45); + out[24 + outpos] = ((in[41 + inpos]) >>> (37 - 18)) + | ((in[42 + inpos]) << 18) + | ((in[43 + inpos]) << 55); + out[25 + outpos] = ((in[43 + inpos]) >>> (37 - 28)) + | ((in[44 + inpos]) << 28); + out[26 + outpos] = ((in[44 + inpos]) >>> (37 - 1)) + | ((in[45 + inpos]) << 1) + | ((in[46 + inpos]) << 38); + out[27 + outpos] = ((in[46 + inpos]) >>> (37 - 11)) + | ((in[47 + inpos]) << 11) + | ((in[48 + inpos]) << 48); + out[28 + outpos] = ((in[48 + inpos]) >>> (37 - 21)) + | ((in[49 + inpos]) << 21) + | ((in[50 + inpos]) << 58); + out[29 + outpos] = ((in[50 + inpos]) >>> (37 - 31)) + | ((in[51 + inpos]) << 31); + out[30 + outpos] = ((in[51 + inpos]) >>> (37 - 4)) + | ((in[52 + inpos]) << 4) + | ((in[53 + inpos]) << 41); + out[31 + outpos] = ((in[53 + inpos]) >>> (37 - 14)) + | ((in[54 + inpos]) << 14) + | ((in[55 + inpos]) << 51); + out[32 + outpos] = ((in[55 + inpos]) >>> (37 - 24)) + | ((in[56 + inpos]) << 24) + | ((in[57 + inpos]) << 61); + out[33 + outpos] = ((in[57 + inpos]) >>> (37 - 34)) + | ((in[58 + inpos]) << 34); + out[34 + outpos] = ((in[58 + inpos]) >>> (37 - 7)) + | ((in[59 + inpos]) << 7) + | ((in[60 + inpos]) << 44); + out[35 + outpos] = ((in[60 + inpos]) >>> (37 - 17)) + | ((in[61 + inpos]) << 17) + | ((in[62 + inpos]) << 54); + out[36 + outpos] = ((in[62 + inpos]) >>> (37 - 27)) + | ((in[63 + inpos]) << 27); + } + + protected static void fastpackwithoutmask38(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 38); + out[1 + outpos] = ((in[1 + inpos]) >>> (38 - 12)) + | ((in[2 + inpos]) << 12) + | ((in[3 + inpos]) << 50); + out[2 + outpos] = ((in[3 + inpos]) >>> (38 - 24)) + | ((in[4 + inpos]) << 24) + | ((in[5 + inpos]) << 62); + out[3 + outpos] = ((in[5 + inpos]) >>> (38 - 36)) + | ((in[6 + inpos]) << 36); + out[4 + outpos] = ((in[6 + inpos]) >>> (38 - 10)) + | ((in[7 + inpos]) << 10) + | ((in[8 + inpos]) << 48); + out[5 + outpos] = ((in[8 + inpos]) >>> (38 - 22)) + | ((in[9 + inpos]) << 22) + | ((in[10 + inpos]) << 60); + out[6 + outpos] = ((in[10 + inpos]) >>> (38 - 34)) + | ((in[11 + inpos]) << 34); + out[7 + outpos] = ((in[11 + inpos]) >>> (38 - 8)) + | ((in[12 + inpos]) << 8) + | ((in[13 + inpos]) << 46); + out[8 + outpos] = ((in[13 + inpos]) >>> (38 - 20)) + | ((in[14 + inpos]) << 20) + | ((in[15 + inpos]) << 58); + out[9 + outpos] = ((in[15 + inpos]) >>> (38 - 32)) + | ((in[16 + inpos]) << 32); + out[10 + outpos] = ((in[16 + inpos]) >>> (38 - 6)) + | ((in[17 + inpos]) << 6) + | ((in[18 + inpos]) << 44); + out[11 + outpos] = ((in[18 + inpos]) >>> (38 - 18)) + | ((in[19 + inpos]) << 18) + | ((in[20 + inpos]) << 56); + out[12 + outpos] = ((in[20 + inpos]) >>> (38 - 30)) + | ((in[21 + inpos]) << 30); + out[13 + outpos] = ((in[21 + inpos]) >>> (38 - 4)) + | ((in[22 + inpos]) << 4) + | ((in[23 + inpos]) << 42); + out[14 + outpos] = ((in[23 + inpos]) >>> (38 - 16)) + | ((in[24 + inpos]) << 16) + | ((in[25 + inpos]) << 54); + out[15 + outpos] = ((in[25 + inpos]) >>> (38 - 28)) + | ((in[26 + inpos]) << 28); + out[16 + outpos] = ((in[26 + inpos]) >>> (38 - 2)) + | ((in[27 + inpos]) << 2) + | ((in[28 + inpos]) << 40); + out[17 + outpos] = ((in[28 + inpos]) >>> (38 - 14)) + | ((in[29 + inpos]) << 14) + | ((in[30 + inpos]) << 52); + out[18 + outpos] = ((in[30 + inpos]) >>> (38 - 26)) + | ((in[31 + inpos]) << 26); + out[19 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 38); + out[20 + outpos] = ((in[33 + inpos]) >>> (38 - 12)) + | ((in[34 + inpos]) << 12) + | ((in[35 + inpos]) << 50); + out[21 + outpos] = ((in[35 + inpos]) >>> (38 - 24)) + | ((in[36 + inpos]) << 24) + | ((in[37 + inpos]) << 62); + out[22 + outpos] = ((in[37 + inpos]) >>> (38 - 36)) + | ((in[38 + inpos]) << 36); + out[23 + outpos] = ((in[38 + inpos]) >>> (38 - 10)) + | ((in[39 + inpos]) << 10) + | ((in[40 + inpos]) << 48); + out[24 + outpos] = ((in[40 + inpos]) >>> (38 - 22)) + | ((in[41 + inpos]) << 22) + | ((in[42 + inpos]) << 60); + out[25 + outpos] = ((in[42 + inpos]) >>> (38 - 34)) + | ((in[43 + inpos]) << 34); + out[26 + outpos] = ((in[43 + inpos]) >>> (38 - 8)) + | ((in[44 + inpos]) << 8) + | ((in[45 + inpos]) << 46); + out[27 + outpos] = ((in[45 + inpos]) >>> (38 - 20)) + | ((in[46 + inpos]) << 20) + | ((in[47 + inpos]) << 58); + out[28 + outpos] = ((in[47 + inpos]) >>> (38 - 32)) + | ((in[48 + inpos]) << 32); + out[29 + outpos] = ((in[48 + inpos]) >>> (38 - 6)) + | ((in[49 + inpos]) << 6) + | ((in[50 + inpos]) << 44); + out[30 + outpos] = ((in[50 + inpos]) >>> (38 - 18)) + | ((in[51 + inpos]) << 18) + | ((in[52 + inpos]) << 56); + out[31 + outpos] = ((in[52 + inpos]) >>> (38 - 30)) + | ((in[53 + inpos]) << 30); + out[32 + outpos] = ((in[53 + inpos]) >>> (38 - 4)) + | ((in[54 + inpos]) << 4) + | ((in[55 + inpos]) << 42); + out[33 + outpos] = ((in[55 + inpos]) >>> (38 - 16)) + | ((in[56 + inpos]) << 16) + | ((in[57 + inpos]) << 54); + out[34 + outpos] = ((in[57 + inpos]) >>> (38 - 28)) + | ((in[58 + inpos]) << 28); + out[35 + outpos] = ((in[58 + inpos]) >>> (38 - 2)) + | ((in[59 + inpos]) << 2) + | ((in[60 + inpos]) << 40); + out[36 + outpos] = ((in[60 + inpos]) >>> (38 - 14)) + | ((in[61 + inpos]) << 14) + | ((in[62 + inpos]) << 52); + out[37 + outpos] = ((in[62 + inpos]) >>> (38 - 26)) + | ((in[63 + inpos]) << 26); + } + + protected static void fastpackwithoutmask39(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 39); + out[1 + outpos] = ((in[1 + inpos]) >>> (39 - 14)) + | ((in[2 + inpos]) << 14) + | ((in[3 + inpos]) << 53); + out[2 + outpos] = ((in[3 + inpos]) >>> (39 - 28)) + | ((in[4 + inpos]) << 28); + out[3 + outpos] = ((in[4 + inpos]) >>> (39 - 3)) + | ((in[5 + inpos]) << 3) + | ((in[6 + inpos]) << 42); + out[4 + outpos] = ((in[6 + inpos]) >>> (39 - 17)) + | ((in[7 + inpos]) << 17) + | ((in[8 + inpos]) << 56); + out[5 + outpos] = ((in[8 + inpos]) >>> (39 - 31)) + | ((in[9 + inpos]) << 31); + out[6 + outpos] = ((in[9 + inpos]) >>> (39 - 6)) + | ((in[10 + inpos]) << 6) + | ((in[11 + inpos]) << 45); + out[7 + outpos] = ((in[11 + inpos]) >>> (39 - 20)) + | ((in[12 + inpos]) << 20) + | ((in[13 + inpos]) << 59); + out[8 + outpos] = ((in[13 + inpos]) >>> (39 - 34)) + | ((in[14 + inpos]) << 34); + out[9 + outpos] = ((in[14 + inpos]) >>> (39 - 9)) + | ((in[15 + inpos]) << 9) + | ((in[16 + inpos]) << 48); + out[10 + outpos] = ((in[16 + inpos]) >>> (39 - 23)) + | ((in[17 + inpos]) << 23) + | ((in[18 + inpos]) << 62); + out[11 + outpos] = ((in[18 + inpos]) >>> (39 - 37)) + | ((in[19 + inpos]) << 37); + out[12 + outpos] = ((in[19 + inpos]) >>> (39 - 12)) + | ((in[20 + inpos]) << 12) + | ((in[21 + inpos]) << 51); + out[13 + outpos] = ((in[21 + inpos]) >>> (39 - 26)) + | ((in[22 + inpos]) << 26); + out[14 + outpos] = ((in[22 + inpos]) >>> (39 - 1)) + | ((in[23 + inpos]) << 1) + | ((in[24 + inpos]) << 40); + out[15 + outpos] = ((in[24 + inpos]) >>> (39 - 15)) + | ((in[25 + inpos]) << 15) + | ((in[26 + inpos]) << 54); + out[16 + outpos] = ((in[26 + inpos]) >>> (39 - 29)) + | ((in[27 + inpos]) << 29); + out[17 + outpos] = ((in[27 + inpos]) >>> (39 - 4)) + | ((in[28 + inpos]) << 4) + | ((in[29 + inpos]) << 43); + out[18 + outpos] = ((in[29 + inpos]) >>> (39 - 18)) + | ((in[30 + inpos]) << 18) + | ((in[31 + inpos]) << 57); + out[19 + outpos] = ((in[31 + inpos]) >>> (39 - 32)) + | ((in[32 + inpos]) << 32); + out[20 + outpos] = ((in[32 + inpos]) >>> (39 - 7)) + | ((in[33 + inpos]) << 7) + | ((in[34 + inpos]) << 46); + out[21 + outpos] = ((in[34 + inpos]) >>> (39 - 21)) + | ((in[35 + inpos]) << 21) + | ((in[36 + inpos]) << 60); + out[22 + outpos] = ((in[36 + inpos]) >>> (39 - 35)) + | ((in[37 + inpos]) << 35); + out[23 + outpos] = ((in[37 + inpos]) >>> (39 - 10)) + | ((in[38 + inpos]) << 10) + | ((in[39 + inpos]) << 49); + out[24 + outpos] = ((in[39 + inpos]) >>> (39 - 24)) + | ((in[40 + inpos]) << 24) + | ((in[41 + inpos]) << 63); + out[25 + outpos] = ((in[41 + inpos]) >>> (39 - 38)) + | ((in[42 + inpos]) << 38); + out[26 + outpos] = ((in[42 + inpos]) >>> (39 - 13)) + | ((in[43 + inpos]) << 13) + | ((in[44 + inpos]) << 52); + out[27 + outpos] = ((in[44 + inpos]) >>> (39 - 27)) + | ((in[45 + inpos]) << 27); + out[28 + outpos] = ((in[45 + inpos]) >>> (39 - 2)) + | ((in[46 + inpos]) << 2) + | ((in[47 + inpos]) << 41); + out[29 + outpos] = ((in[47 + inpos]) >>> (39 - 16)) + | ((in[48 + inpos]) << 16) + | ((in[49 + inpos]) << 55); + out[30 + outpos] = ((in[49 + inpos]) >>> (39 - 30)) + | ((in[50 + inpos]) << 30); + out[31 + outpos] = ((in[50 + inpos]) >>> (39 - 5)) + | ((in[51 + inpos]) << 5) + | ((in[52 + inpos]) << 44); + out[32 + outpos] = ((in[52 + inpos]) >>> (39 - 19)) + | ((in[53 + inpos]) << 19) + | ((in[54 + inpos]) << 58); + out[33 + outpos] = ((in[54 + inpos]) >>> (39 - 33)) + | ((in[55 + inpos]) << 33); + out[34 + outpos] = ((in[55 + inpos]) >>> (39 - 8)) + | ((in[56 + inpos]) << 8) + | ((in[57 + inpos]) << 47); + out[35 + outpos] = ((in[57 + inpos]) >>> (39 - 22)) + | ((in[58 + inpos]) << 22) + | ((in[59 + inpos]) << 61); + out[36 + outpos] = ((in[59 + inpos]) >>> (39 - 36)) + | ((in[60 + inpos]) << 36); + out[37 + outpos] = ((in[60 + inpos]) >>> (39 - 11)) + | ((in[61 + inpos]) << 11) + | ((in[62 + inpos]) << 50); + out[38 + outpos] = ((in[62 + inpos]) >>> (39 - 25)) + | ((in[63 + inpos]) << 25); + } + + protected static void fastpackwithoutmask40(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 40); + out[1 + outpos] = ((in[1 + inpos]) >>> (40 - 16)) + | ((in[2 + inpos]) << 16) + | ((in[3 + inpos]) << 56); + out[2 + outpos] = ((in[3 + inpos]) >>> (40 - 32)) + | ((in[4 + inpos]) << 32); + out[3 + outpos] = ((in[4 + inpos]) >>> (40 - 8)) + | ((in[5 + inpos]) << 8) + | ((in[6 + inpos]) << 48); + out[4 + outpos] = ((in[6 + inpos]) >>> (40 - 24)) + | ((in[7 + inpos]) << 24); + out[5 + outpos] = in[8 + inpos] + | ((in[9 + inpos]) << 40); + out[6 + outpos] = ((in[9 + inpos]) >>> (40 - 16)) + | ((in[10 + inpos]) << 16) + | ((in[11 + inpos]) << 56); + out[7 + outpos] = ((in[11 + inpos]) >>> (40 - 32)) + | ((in[12 + inpos]) << 32); + out[8 + outpos] = ((in[12 + inpos]) >>> (40 - 8)) + | ((in[13 + inpos]) << 8) + | ((in[14 + inpos]) << 48); + out[9 + outpos] = ((in[14 + inpos]) >>> (40 - 24)) + | ((in[15 + inpos]) << 24); + out[10 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 40); + out[11 + outpos] = ((in[17 + inpos]) >>> (40 - 16)) + | ((in[18 + inpos]) << 16) + | ((in[19 + inpos]) << 56); + out[12 + outpos] = ((in[19 + inpos]) >>> (40 - 32)) + | ((in[20 + inpos]) << 32); + out[13 + outpos] = ((in[20 + inpos]) >>> (40 - 8)) + | ((in[21 + inpos]) << 8) + | ((in[22 + inpos]) << 48); + out[14 + outpos] = ((in[22 + inpos]) >>> (40 - 24)) + | ((in[23 + inpos]) << 24); + out[15 + outpos] = in[24 + inpos] + | ((in[25 + inpos]) << 40); + out[16 + outpos] = ((in[25 + inpos]) >>> (40 - 16)) + | ((in[26 + inpos]) << 16) + | ((in[27 + inpos]) << 56); + out[17 + outpos] = ((in[27 + inpos]) >>> (40 - 32)) + | ((in[28 + inpos]) << 32); + out[18 + outpos] = ((in[28 + inpos]) >>> (40 - 8)) + | ((in[29 + inpos]) << 8) + | ((in[30 + inpos]) << 48); + out[19 + outpos] = ((in[30 + inpos]) >>> (40 - 24)) + | ((in[31 + inpos]) << 24); + out[20 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 40); + out[21 + outpos] = ((in[33 + inpos]) >>> (40 - 16)) + | ((in[34 + inpos]) << 16) + | ((in[35 + inpos]) << 56); + out[22 + outpos] = ((in[35 + inpos]) >>> (40 - 32)) + | ((in[36 + inpos]) << 32); + out[23 + outpos] = ((in[36 + inpos]) >>> (40 - 8)) + | ((in[37 + inpos]) << 8) + | ((in[38 + inpos]) << 48); + out[24 + outpos] = ((in[38 + inpos]) >>> (40 - 24)) + | ((in[39 + inpos]) << 24); + out[25 + outpos] = in[40 + inpos] + | ((in[41 + inpos]) << 40); + out[26 + outpos] = ((in[41 + inpos]) >>> (40 - 16)) + | ((in[42 + inpos]) << 16) + | ((in[43 + inpos]) << 56); + out[27 + outpos] = ((in[43 + inpos]) >>> (40 - 32)) + | ((in[44 + inpos]) << 32); + out[28 + outpos] = ((in[44 + inpos]) >>> (40 - 8)) + | ((in[45 + inpos]) << 8) + | ((in[46 + inpos]) << 48); + out[29 + outpos] = ((in[46 + inpos]) >>> (40 - 24)) + | ((in[47 + inpos]) << 24); + out[30 + outpos] = in[48 + inpos] + | ((in[49 + inpos]) << 40); + out[31 + outpos] = ((in[49 + inpos]) >>> (40 - 16)) + | ((in[50 + inpos]) << 16) + | ((in[51 + inpos]) << 56); + out[32 + outpos] = ((in[51 + inpos]) >>> (40 - 32)) + | ((in[52 + inpos]) << 32); + out[33 + outpos] = ((in[52 + inpos]) >>> (40 - 8)) + | ((in[53 + inpos]) << 8) + | ((in[54 + inpos]) << 48); + out[34 + outpos] = ((in[54 + inpos]) >>> (40 - 24)) + | ((in[55 + inpos]) << 24); + out[35 + outpos] = in[56 + inpos] + | ((in[57 + inpos]) << 40); + out[36 + outpos] = ((in[57 + inpos]) >>> (40 - 16)) + | ((in[58 + inpos]) << 16) + | ((in[59 + inpos]) << 56); + out[37 + outpos] = ((in[59 + inpos]) >>> (40 - 32)) + | ((in[60 + inpos]) << 32); + out[38 + outpos] = ((in[60 + inpos]) >>> (40 - 8)) + | ((in[61 + inpos]) << 8) + | ((in[62 + inpos]) << 48); + out[39 + outpos] = ((in[62 + inpos]) >>> (40 - 24)) + | ((in[63 + inpos]) << 24); + } + + protected static void fastpackwithoutmask41(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 41); + out[1 + outpos] = ((in[1 + inpos]) >>> (41 - 18)) + | ((in[2 + inpos]) << 18) + | ((in[3 + inpos]) << 59); + out[2 + outpos] = ((in[3 + inpos]) >>> (41 - 36)) + | ((in[4 + inpos]) << 36); + out[3 + outpos] = ((in[4 + inpos]) >>> (41 - 13)) + | ((in[5 + inpos]) << 13) + | ((in[6 + inpos]) << 54); + out[4 + outpos] = ((in[6 + inpos]) >>> (41 - 31)) + | ((in[7 + inpos]) << 31); + out[5 + outpos] = ((in[7 + inpos]) >>> (41 - 8)) + | ((in[8 + inpos]) << 8) + | ((in[9 + inpos]) << 49); + out[6 + outpos] = ((in[9 + inpos]) >>> (41 - 26)) + | ((in[10 + inpos]) << 26); + out[7 + outpos] = ((in[10 + inpos]) >>> (41 - 3)) + | ((in[11 + inpos]) << 3) + | ((in[12 + inpos]) << 44); + out[8 + outpos] = ((in[12 + inpos]) >>> (41 - 21)) + | ((in[13 + inpos]) << 21) + | ((in[14 + inpos]) << 62); + out[9 + outpos] = ((in[14 + inpos]) >>> (41 - 39)) + | ((in[15 + inpos]) << 39); + out[10 + outpos] = ((in[15 + inpos]) >>> (41 - 16)) + | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 57); + out[11 + outpos] = ((in[17 + inpos]) >>> (41 - 34)) + | ((in[18 + inpos]) << 34); + out[12 + outpos] = ((in[18 + inpos]) >>> (41 - 11)) + | ((in[19 + inpos]) << 11) + | ((in[20 + inpos]) << 52); + out[13 + outpos] = ((in[20 + inpos]) >>> (41 - 29)) + | ((in[21 + inpos]) << 29); + out[14 + outpos] = ((in[21 + inpos]) >>> (41 - 6)) + | ((in[22 + inpos]) << 6) + | ((in[23 + inpos]) << 47); + out[15 + outpos] = ((in[23 + inpos]) >>> (41 - 24)) + | ((in[24 + inpos]) << 24); + out[16 + outpos] = ((in[24 + inpos]) >>> (41 - 1)) + | ((in[25 + inpos]) << 1) + | ((in[26 + inpos]) << 42); + out[17 + outpos] = ((in[26 + inpos]) >>> (41 - 19)) + | ((in[27 + inpos]) << 19) + | ((in[28 + inpos]) << 60); + out[18 + outpos] = ((in[28 + inpos]) >>> (41 - 37)) + | ((in[29 + inpos]) << 37); + out[19 + outpos] = ((in[29 + inpos]) >>> (41 - 14)) + | ((in[30 + inpos]) << 14) + | ((in[31 + inpos]) << 55); + out[20 + outpos] = ((in[31 + inpos]) >>> (41 - 32)) + | ((in[32 + inpos]) << 32); + out[21 + outpos] = ((in[32 + inpos]) >>> (41 - 9)) + | ((in[33 + inpos]) << 9) + | ((in[34 + inpos]) << 50); + out[22 + outpos] = ((in[34 + inpos]) >>> (41 - 27)) + | ((in[35 + inpos]) << 27); + out[23 + outpos] = ((in[35 + inpos]) >>> (41 - 4)) + | ((in[36 + inpos]) << 4) + | ((in[37 + inpos]) << 45); + out[24 + outpos] = ((in[37 + inpos]) >>> (41 - 22)) + | ((in[38 + inpos]) << 22) + | ((in[39 + inpos]) << 63); + out[25 + outpos] = ((in[39 + inpos]) >>> (41 - 40)) + | ((in[40 + inpos]) << 40); + out[26 + outpos] = ((in[40 + inpos]) >>> (41 - 17)) + | ((in[41 + inpos]) << 17) + | ((in[42 + inpos]) << 58); + out[27 + outpos] = ((in[42 + inpos]) >>> (41 - 35)) + | ((in[43 + inpos]) << 35); + out[28 + outpos] = ((in[43 + inpos]) >>> (41 - 12)) + | ((in[44 + inpos]) << 12) + | ((in[45 + inpos]) << 53); + out[29 + outpos] = ((in[45 + inpos]) >>> (41 - 30)) + | ((in[46 + inpos]) << 30); + out[30 + outpos] = ((in[46 + inpos]) >>> (41 - 7)) + | ((in[47 + inpos]) << 7) + | ((in[48 + inpos]) << 48); + out[31 + outpos] = ((in[48 + inpos]) >>> (41 - 25)) + | ((in[49 + inpos]) << 25); + out[32 + outpos] = ((in[49 + inpos]) >>> (41 - 2)) + | ((in[50 + inpos]) << 2) + | ((in[51 + inpos]) << 43); + out[33 + outpos] = ((in[51 + inpos]) >>> (41 - 20)) + | ((in[52 + inpos]) << 20) + | ((in[53 + inpos]) << 61); + out[34 + outpos] = ((in[53 + inpos]) >>> (41 - 38)) + | ((in[54 + inpos]) << 38); + out[35 + outpos] = ((in[54 + inpos]) >>> (41 - 15)) + | ((in[55 + inpos]) << 15) + | ((in[56 + inpos]) << 56); + out[36 + outpos] = ((in[56 + inpos]) >>> (41 - 33)) + | ((in[57 + inpos]) << 33); + out[37 + outpos] = ((in[57 + inpos]) >>> (41 - 10)) + | ((in[58 + inpos]) << 10) + | ((in[59 + inpos]) << 51); + out[38 + outpos] = ((in[59 + inpos]) >>> (41 - 28)) + | ((in[60 + inpos]) << 28); + out[39 + outpos] = ((in[60 + inpos]) >>> (41 - 5)) + | ((in[61 + inpos]) << 5) + | ((in[62 + inpos]) << 46); + out[40 + outpos] = ((in[62 + inpos]) >>> (41 - 23)) + | ((in[63 + inpos]) << 23); + } + + protected static void fastpackwithoutmask42(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 42); + out[1 + outpos] = ((in[1 + inpos]) >>> (42 - 20)) + | ((in[2 + inpos]) << 20) + | ((in[3 + inpos]) << 62); + out[2 + outpos] = ((in[3 + inpos]) >>> (42 - 40)) + | ((in[4 + inpos]) << 40); + out[3 + outpos] = ((in[4 + inpos]) >>> (42 - 18)) + | ((in[5 + inpos]) << 18) + | ((in[6 + inpos]) << 60); + out[4 + outpos] = ((in[6 + inpos]) >>> (42 - 38)) + | ((in[7 + inpos]) << 38); + out[5 + outpos] = ((in[7 + inpos]) >>> (42 - 16)) + | ((in[8 + inpos]) << 16) + | ((in[9 + inpos]) << 58); + out[6 + outpos] = ((in[9 + inpos]) >>> (42 - 36)) + | ((in[10 + inpos]) << 36); + out[7 + outpos] = ((in[10 + inpos]) >>> (42 - 14)) + | ((in[11 + inpos]) << 14) + | ((in[12 + inpos]) << 56); + out[8 + outpos] = ((in[12 + inpos]) >>> (42 - 34)) + | ((in[13 + inpos]) << 34); + out[9 + outpos] = ((in[13 + inpos]) >>> (42 - 12)) + | ((in[14 + inpos]) << 12) + | ((in[15 + inpos]) << 54); + out[10 + outpos] = ((in[15 + inpos]) >>> (42 - 32)) + | ((in[16 + inpos]) << 32); + out[11 + outpos] = ((in[16 + inpos]) >>> (42 - 10)) + | ((in[17 + inpos]) << 10) + | ((in[18 + inpos]) << 52); + out[12 + outpos] = ((in[18 + inpos]) >>> (42 - 30)) + | ((in[19 + inpos]) << 30); + out[13 + outpos] = ((in[19 + inpos]) >>> (42 - 8)) + | ((in[20 + inpos]) << 8) + | ((in[21 + inpos]) << 50); + out[14 + outpos] = ((in[21 + inpos]) >>> (42 - 28)) + | ((in[22 + inpos]) << 28); + out[15 + outpos] = ((in[22 + inpos]) >>> (42 - 6)) + | ((in[23 + inpos]) << 6) + | ((in[24 + inpos]) << 48); + out[16 + outpos] = ((in[24 + inpos]) >>> (42 - 26)) + | ((in[25 + inpos]) << 26); + out[17 + outpos] = ((in[25 + inpos]) >>> (42 - 4)) + | ((in[26 + inpos]) << 4) + | ((in[27 + inpos]) << 46); + out[18 + outpos] = ((in[27 + inpos]) >>> (42 - 24)) + | ((in[28 + inpos]) << 24); + out[19 + outpos] = ((in[28 + inpos]) >>> (42 - 2)) + | ((in[29 + inpos]) << 2) + | ((in[30 + inpos]) << 44); + out[20 + outpos] = ((in[30 + inpos]) >>> (42 - 22)) + | ((in[31 + inpos]) << 22); + out[21 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 42); + out[22 + outpos] = ((in[33 + inpos]) >>> (42 - 20)) + | ((in[34 + inpos]) << 20) + | ((in[35 + inpos]) << 62); + out[23 + outpos] = ((in[35 + inpos]) >>> (42 - 40)) + | ((in[36 + inpos]) << 40); + out[24 + outpos] = ((in[36 + inpos]) >>> (42 - 18)) + | ((in[37 + inpos]) << 18) + | ((in[38 + inpos]) << 60); + out[25 + outpos] = ((in[38 + inpos]) >>> (42 - 38)) + | ((in[39 + inpos]) << 38); + out[26 + outpos] = ((in[39 + inpos]) >>> (42 - 16)) + | ((in[40 + inpos]) << 16) + | ((in[41 + inpos]) << 58); + out[27 + outpos] = ((in[41 + inpos]) >>> (42 - 36)) + | ((in[42 + inpos]) << 36); + out[28 + outpos] = ((in[42 + inpos]) >>> (42 - 14)) + | ((in[43 + inpos]) << 14) + | ((in[44 + inpos]) << 56); + out[29 + outpos] = ((in[44 + inpos]) >>> (42 - 34)) + | ((in[45 + inpos]) << 34); + out[30 + outpos] = ((in[45 + inpos]) >>> (42 - 12)) + | ((in[46 + inpos]) << 12) + | ((in[47 + inpos]) << 54); + out[31 + outpos] = ((in[47 + inpos]) >>> (42 - 32)) + | ((in[48 + inpos]) << 32); + out[32 + outpos] = ((in[48 + inpos]) >>> (42 - 10)) + | ((in[49 + inpos]) << 10) + | ((in[50 + inpos]) << 52); + out[33 + outpos] = ((in[50 + inpos]) >>> (42 - 30)) + | ((in[51 + inpos]) << 30); + out[34 + outpos] = ((in[51 + inpos]) >>> (42 - 8)) + | ((in[52 + inpos]) << 8) + | ((in[53 + inpos]) << 50); + out[35 + outpos] = ((in[53 + inpos]) >>> (42 - 28)) + | ((in[54 + inpos]) << 28); + out[36 + outpos] = ((in[54 + inpos]) >>> (42 - 6)) + | ((in[55 + inpos]) << 6) + | ((in[56 + inpos]) << 48); + out[37 + outpos] = ((in[56 + inpos]) >>> (42 - 26)) + | ((in[57 + inpos]) << 26); + out[38 + outpos] = ((in[57 + inpos]) >>> (42 - 4)) + | ((in[58 + inpos]) << 4) + | ((in[59 + inpos]) << 46); + out[39 + outpos] = ((in[59 + inpos]) >>> (42 - 24)) + | ((in[60 + inpos]) << 24); + out[40 + outpos] = ((in[60 + inpos]) >>> (42 - 2)) + | ((in[61 + inpos]) << 2) + | ((in[62 + inpos]) << 44); + out[41 + outpos] = ((in[62 + inpos]) >>> (42 - 22)) + | ((in[63 + inpos]) << 22); + } + + protected static void fastpackwithoutmask43(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 43); + out[1 + outpos] = ((in[1 + inpos]) >>> (43 - 22)) + | ((in[2 + inpos]) << 22); + out[2 + outpos] = ((in[2 + inpos]) >>> (43 - 1)) + | ((in[3 + inpos]) << 1) + | ((in[4 + inpos]) << 44); + out[3 + outpos] = ((in[4 + inpos]) >>> (43 - 23)) + | ((in[5 + inpos]) << 23); + out[4 + outpos] = ((in[5 + inpos]) >>> (43 - 2)) + | ((in[6 + inpos]) << 2) + | ((in[7 + inpos]) << 45); + out[5 + outpos] = ((in[7 + inpos]) >>> (43 - 24)) + | ((in[8 + inpos]) << 24); + out[6 + outpos] = ((in[8 + inpos]) >>> (43 - 3)) + | ((in[9 + inpos]) << 3) + | ((in[10 + inpos]) << 46); + out[7 + outpos] = ((in[10 + inpos]) >>> (43 - 25)) + | ((in[11 + inpos]) << 25); + out[8 + outpos] = ((in[11 + inpos]) >>> (43 - 4)) + | ((in[12 + inpos]) << 4) + | ((in[13 + inpos]) << 47); + out[9 + outpos] = ((in[13 + inpos]) >>> (43 - 26)) + | ((in[14 + inpos]) << 26); + out[10 + outpos] = ((in[14 + inpos]) >>> (43 - 5)) + | ((in[15 + inpos]) << 5) + | ((in[16 + inpos]) << 48); + out[11 + outpos] = ((in[16 + inpos]) >>> (43 - 27)) + | ((in[17 + inpos]) << 27); + out[12 + outpos] = ((in[17 + inpos]) >>> (43 - 6)) + | ((in[18 + inpos]) << 6) + | ((in[19 + inpos]) << 49); + out[13 + outpos] = ((in[19 + inpos]) >>> (43 - 28)) + | ((in[20 + inpos]) << 28); + out[14 + outpos] = ((in[20 + inpos]) >>> (43 - 7)) + | ((in[21 + inpos]) << 7) + | ((in[22 + inpos]) << 50); + out[15 + outpos] = ((in[22 + inpos]) >>> (43 - 29)) + | ((in[23 + inpos]) << 29); + out[16 + outpos] = ((in[23 + inpos]) >>> (43 - 8)) + | ((in[24 + inpos]) << 8) + | ((in[25 + inpos]) << 51); + out[17 + outpos] = ((in[25 + inpos]) >>> (43 - 30)) + | ((in[26 + inpos]) << 30); + out[18 + outpos] = ((in[26 + inpos]) >>> (43 - 9)) + | ((in[27 + inpos]) << 9) + | ((in[28 + inpos]) << 52); + out[19 + outpos] = ((in[28 + inpos]) >>> (43 - 31)) + | ((in[29 + inpos]) << 31); + out[20 + outpos] = ((in[29 + inpos]) >>> (43 - 10)) + | ((in[30 + inpos]) << 10) + | ((in[31 + inpos]) << 53); + out[21 + outpos] = ((in[31 + inpos]) >>> (43 - 32)) + | ((in[32 + inpos]) << 32); + out[22 + outpos] = ((in[32 + inpos]) >>> (43 - 11)) + | ((in[33 + inpos]) << 11) + | ((in[34 + inpos]) << 54); + out[23 + outpos] = ((in[34 + inpos]) >>> (43 - 33)) + | ((in[35 + inpos]) << 33); + out[24 + outpos] = ((in[35 + inpos]) >>> (43 - 12)) + | ((in[36 + inpos]) << 12) + | ((in[37 + inpos]) << 55); + out[25 + outpos] = ((in[37 + inpos]) >>> (43 - 34)) + | ((in[38 + inpos]) << 34); + out[26 + outpos] = ((in[38 + inpos]) >>> (43 - 13)) + | ((in[39 + inpos]) << 13) + | ((in[40 + inpos]) << 56); + out[27 + outpos] = ((in[40 + inpos]) >>> (43 - 35)) + | ((in[41 + inpos]) << 35); + out[28 + outpos] = ((in[41 + inpos]) >>> (43 - 14)) + | ((in[42 + inpos]) << 14) + | ((in[43 + inpos]) << 57); + out[29 + outpos] = ((in[43 + inpos]) >>> (43 - 36)) + | ((in[44 + inpos]) << 36); + out[30 + outpos] = ((in[44 + inpos]) >>> (43 - 15)) + | ((in[45 + inpos]) << 15) + | ((in[46 + inpos]) << 58); + out[31 + outpos] = ((in[46 + inpos]) >>> (43 - 37)) + | ((in[47 + inpos]) << 37); + out[32 + outpos] = ((in[47 + inpos]) >>> (43 - 16)) + | ((in[48 + inpos]) << 16) + | ((in[49 + inpos]) << 59); + out[33 + outpos] = ((in[49 + inpos]) >>> (43 - 38)) + | ((in[50 + inpos]) << 38); + out[34 + outpos] = ((in[50 + inpos]) >>> (43 - 17)) + | ((in[51 + inpos]) << 17) + | ((in[52 + inpos]) << 60); + out[35 + outpos] = ((in[52 + inpos]) >>> (43 - 39)) + | ((in[53 + inpos]) << 39); + out[36 + outpos] = ((in[53 + inpos]) >>> (43 - 18)) + | ((in[54 + inpos]) << 18) + | ((in[55 + inpos]) << 61); + out[37 + outpos] = ((in[55 + inpos]) >>> (43 - 40)) + | ((in[56 + inpos]) << 40); + out[38 + outpos] = ((in[56 + inpos]) >>> (43 - 19)) + | ((in[57 + inpos]) << 19) + | ((in[58 + inpos]) << 62); + out[39 + outpos] = ((in[58 + inpos]) >>> (43 - 41)) + | ((in[59 + inpos]) << 41); + out[40 + outpos] = ((in[59 + inpos]) >>> (43 - 20)) + | ((in[60 + inpos]) << 20) + | ((in[61 + inpos]) << 63); + out[41 + outpos] = ((in[61 + inpos]) >>> (43 - 42)) + | ((in[62 + inpos]) << 42); + out[42 + outpos] = ((in[62 + inpos]) >>> (43 - 21)) + | ((in[63 + inpos]) << 21); + } + + protected static void fastpackwithoutmask44(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 44); + out[1 + outpos] = ((in[1 + inpos]) >>> (44 - 24)) + | ((in[2 + inpos]) << 24); + out[2 + outpos] = ((in[2 + inpos]) >>> (44 - 4)) + | ((in[3 + inpos]) << 4) + | ((in[4 + inpos]) << 48); + out[3 + outpos] = ((in[4 + inpos]) >>> (44 - 28)) + | ((in[5 + inpos]) << 28); + out[4 + outpos] = ((in[5 + inpos]) >>> (44 - 8)) + | ((in[6 + inpos]) << 8) + | ((in[7 + inpos]) << 52); + out[5 + outpos] = ((in[7 + inpos]) >>> (44 - 32)) + | ((in[8 + inpos]) << 32); + out[6 + outpos] = ((in[8 + inpos]) >>> (44 - 12)) + | ((in[9 + inpos]) << 12) + | ((in[10 + inpos]) << 56); + out[7 + outpos] = ((in[10 + inpos]) >>> (44 - 36)) + | ((in[11 + inpos]) << 36); + out[8 + outpos] = ((in[11 + inpos]) >>> (44 - 16)) + | ((in[12 + inpos]) << 16) + | ((in[13 + inpos]) << 60); + out[9 + outpos] = ((in[13 + inpos]) >>> (44 - 40)) + | ((in[14 + inpos]) << 40); + out[10 + outpos] = ((in[14 + inpos]) >>> (44 - 20)) + | ((in[15 + inpos]) << 20); + out[11 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 44); + out[12 + outpos] = ((in[17 + inpos]) >>> (44 - 24)) + | ((in[18 + inpos]) << 24); + out[13 + outpos] = ((in[18 + inpos]) >>> (44 - 4)) + | ((in[19 + inpos]) << 4) + | ((in[20 + inpos]) << 48); + out[14 + outpos] = ((in[20 + inpos]) >>> (44 - 28)) + | ((in[21 + inpos]) << 28); + out[15 + outpos] = ((in[21 + inpos]) >>> (44 - 8)) + | ((in[22 + inpos]) << 8) + | ((in[23 + inpos]) << 52); + out[16 + outpos] = ((in[23 + inpos]) >>> (44 - 32)) + | ((in[24 + inpos]) << 32); + out[17 + outpos] = ((in[24 + inpos]) >>> (44 - 12)) + | ((in[25 + inpos]) << 12) + | ((in[26 + inpos]) << 56); + out[18 + outpos] = ((in[26 + inpos]) >>> (44 - 36)) + | ((in[27 + inpos]) << 36); + out[19 + outpos] = ((in[27 + inpos]) >>> (44 - 16)) + | ((in[28 + inpos]) << 16) + | ((in[29 + inpos]) << 60); + out[20 + outpos] = ((in[29 + inpos]) >>> (44 - 40)) + | ((in[30 + inpos]) << 40); + out[21 + outpos] = ((in[30 + inpos]) >>> (44 - 20)) + | ((in[31 + inpos]) << 20); + out[22 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 44); + out[23 + outpos] = ((in[33 + inpos]) >>> (44 - 24)) + | ((in[34 + inpos]) << 24); + out[24 + outpos] = ((in[34 + inpos]) >>> (44 - 4)) + | ((in[35 + inpos]) << 4) + | ((in[36 + inpos]) << 48); + out[25 + outpos] = ((in[36 + inpos]) >>> (44 - 28)) + | ((in[37 + inpos]) << 28); + out[26 + outpos] = ((in[37 + inpos]) >>> (44 - 8)) + | ((in[38 + inpos]) << 8) + | ((in[39 + inpos]) << 52); + out[27 + outpos] = ((in[39 + inpos]) >>> (44 - 32)) + | ((in[40 + inpos]) << 32); + out[28 + outpos] = ((in[40 + inpos]) >>> (44 - 12)) + | ((in[41 + inpos]) << 12) + | ((in[42 + inpos]) << 56); + out[29 + outpos] = ((in[42 + inpos]) >>> (44 - 36)) + | ((in[43 + inpos]) << 36); + out[30 + outpos] = ((in[43 + inpos]) >>> (44 - 16)) + | ((in[44 + inpos]) << 16) + | ((in[45 + inpos]) << 60); + out[31 + outpos] = ((in[45 + inpos]) >>> (44 - 40)) + | ((in[46 + inpos]) << 40); + out[32 + outpos] = ((in[46 + inpos]) >>> (44 - 20)) + | ((in[47 + inpos]) << 20); + out[33 + outpos] = in[48 + inpos] + | ((in[49 + inpos]) << 44); + out[34 + outpos] = ((in[49 + inpos]) >>> (44 - 24)) + | ((in[50 + inpos]) << 24); + out[35 + outpos] = ((in[50 + inpos]) >>> (44 - 4)) + | ((in[51 + inpos]) << 4) + | ((in[52 + inpos]) << 48); + out[36 + outpos] = ((in[52 + inpos]) >>> (44 - 28)) + | ((in[53 + inpos]) << 28); + out[37 + outpos] = ((in[53 + inpos]) >>> (44 - 8)) + | ((in[54 + inpos]) << 8) + | ((in[55 + inpos]) << 52); + out[38 + outpos] = ((in[55 + inpos]) >>> (44 - 32)) + | ((in[56 + inpos]) << 32); + out[39 + outpos] = ((in[56 + inpos]) >>> (44 - 12)) + | ((in[57 + inpos]) << 12) + | ((in[58 + inpos]) << 56); + out[40 + outpos] = ((in[58 + inpos]) >>> (44 - 36)) + | ((in[59 + inpos]) << 36); + out[41 + outpos] = ((in[59 + inpos]) >>> (44 - 16)) + | ((in[60 + inpos]) << 16) + | ((in[61 + inpos]) << 60); + out[42 + outpos] = ((in[61 + inpos]) >>> (44 - 40)) + | ((in[62 + inpos]) << 40); + out[43 + outpos] = ((in[62 + inpos]) >>> (44 - 20)) + | ((in[63 + inpos]) << 20); + } + + protected static void fastpackwithoutmask45(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 45); + out[1 + outpos] = ((in[1 + inpos]) >>> (45 - 26)) + | ((in[2 + inpos]) << 26); + out[2 + outpos] = ((in[2 + inpos]) >>> (45 - 7)) + | ((in[3 + inpos]) << 7) + | ((in[4 + inpos]) << 52); + out[3 + outpos] = ((in[4 + inpos]) >>> (45 - 33)) + | ((in[5 + inpos]) << 33); + out[4 + outpos] = ((in[5 + inpos]) >>> (45 - 14)) + | ((in[6 + inpos]) << 14) + | ((in[7 + inpos]) << 59); + out[5 + outpos] = ((in[7 + inpos]) >>> (45 - 40)) + | ((in[8 + inpos]) << 40); + out[6 + outpos] = ((in[8 + inpos]) >>> (45 - 21)) + | ((in[9 + inpos]) << 21); + out[7 + outpos] = ((in[9 + inpos]) >>> (45 - 2)) + | ((in[10 + inpos]) << 2) + | ((in[11 + inpos]) << 47); + out[8 + outpos] = ((in[11 + inpos]) >>> (45 - 28)) + | ((in[12 + inpos]) << 28); + out[9 + outpos] = ((in[12 + inpos]) >>> (45 - 9)) + | ((in[13 + inpos]) << 9) + | ((in[14 + inpos]) << 54); + out[10 + outpos] = ((in[14 + inpos]) >>> (45 - 35)) + | ((in[15 + inpos]) << 35); + out[11 + outpos] = ((in[15 + inpos]) >>> (45 - 16)) + | ((in[16 + inpos]) << 16) + | ((in[17 + inpos]) << 61); + out[12 + outpos] = ((in[17 + inpos]) >>> (45 - 42)) + | ((in[18 + inpos]) << 42); + out[13 + outpos] = ((in[18 + inpos]) >>> (45 - 23)) + | ((in[19 + inpos]) << 23); + out[14 + outpos] = ((in[19 + inpos]) >>> (45 - 4)) + | ((in[20 + inpos]) << 4) + | ((in[21 + inpos]) << 49); + out[15 + outpos] = ((in[21 + inpos]) >>> (45 - 30)) + | ((in[22 + inpos]) << 30); + out[16 + outpos] = ((in[22 + inpos]) >>> (45 - 11)) + | ((in[23 + inpos]) << 11) + | ((in[24 + inpos]) << 56); + out[17 + outpos] = ((in[24 + inpos]) >>> (45 - 37)) + | ((in[25 + inpos]) << 37); + out[18 + outpos] = ((in[25 + inpos]) >>> (45 - 18)) + | ((in[26 + inpos]) << 18) + | ((in[27 + inpos]) << 63); + out[19 + outpos] = ((in[27 + inpos]) >>> (45 - 44)) + | ((in[28 + inpos]) << 44); + out[20 + outpos] = ((in[28 + inpos]) >>> (45 - 25)) + | ((in[29 + inpos]) << 25); + out[21 + outpos] = ((in[29 + inpos]) >>> (45 - 6)) + | ((in[30 + inpos]) << 6) + | ((in[31 + inpos]) << 51); + out[22 + outpos] = ((in[31 + inpos]) >>> (45 - 32)) + | ((in[32 + inpos]) << 32); + out[23 + outpos] = ((in[32 + inpos]) >>> (45 - 13)) + | ((in[33 + inpos]) << 13) + | ((in[34 + inpos]) << 58); + out[24 + outpos] = ((in[34 + inpos]) >>> (45 - 39)) + | ((in[35 + inpos]) << 39); + out[25 + outpos] = ((in[35 + inpos]) >>> (45 - 20)) + | ((in[36 + inpos]) << 20); + out[26 + outpos] = ((in[36 + inpos]) >>> (45 - 1)) + | ((in[37 + inpos]) << 1) + | ((in[38 + inpos]) << 46); + out[27 + outpos] = ((in[38 + inpos]) >>> (45 - 27)) + | ((in[39 + inpos]) << 27); + out[28 + outpos] = ((in[39 + inpos]) >>> (45 - 8)) + | ((in[40 + inpos]) << 8) + | ((in[41 + inpos]) << 53); + out[29 + outpos] = ((in[41 + inpos]) >>> (45 - 34)) + | ((in[42 + inpos]) << 34); + out[30 + outpos] = ((in[42 + inpos]) >>> (45 - 15)) + | ((in[43 + inpos]) << 15) + | ((in[44 + inpos]) << 60); + out[31 + outpos] = ((in[44 + inpos]) >>> (45 - 41)) + | ((in[45 + inpos]) << 41); + out[32 + outpos] = ((in[45 + inpos]) >>> (45 - 22)) + | ((in[46 + inpos]) << 22); + out[33 + outpos] = ((in[46 + inpos]) >>> (45 - 3)) + | ((in[47 + inpos]) << 3) + | ((in[48 + inpos]) << 48); + out[34 + outpos] = ((in[48 + inpos]) >>> (45 - 29)) + | ((in[49 + inpos]) << 29); + out[35 + outpos] = ((in[49 + inpos]) >>> (45 - 10)) + | ((in[50 + inpos]) << 10) + | ((in[51 + inpos]) << 55); + out[36 + outpos] = ((in[51 + inpos]) >>> (45 - 36)) + | ((in[52 + inpos]) << 36); + out[37 + outpos] = ((in[52 + inpos]) >>> (45 - 17)) + | ((in[53 + inpos]) << 17) + | ((in[54 + inpos]) << 62); + out[38 + outpos] = ((in[54 + inpos]) >>> (45 - 43)) + | ((in[55 + inpos]) << 43); + out[39 + outpos] = ((in[55 + inpos]) >>> (45 - 24)) + | ((in[56 + inpos]) << 24); + out[40 + outpos] = ((in[56 + inpos]) >>> (45 - 5)) + | ((in[57 + inpos]) << 5) + | ((in[58 + inpos]) << 50); + out[41 + outpos] = ((in[58 + inpos]) >>> (45 - 31)) + | ((in[59 + inpos]) << 31); + out[42 + outpos] = ((in[59 + inpos]) >>> (45 - 12)) + | ((in[60 + inpos]) << 12) + | ((in[61 + inpos]) << 57); + out[43 + outpos] = ((in[61 + inpos]) >>> (45 - 38)) + | ((in[62 + inpos]) << 38); + out[44 + outpos] = ((in[62 + inpos]) >>> (45 - 19)) + | ((in[63 + inpos]) << 19); + } + + protected static void fastpackwithoutmask46(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 46); + out[1 + outpos] = ((in[1 + inpos]) >>> (46 - 28)) + | ((in[2 + inpos]) << 28); + out[2 + outpos] = ((in[2 + inpos]) >>> (46 - 10)) + | ((in[3 + inpos]) << 10) + | ((in[4 + inpos]) << 56); + out[3 + outpos] = ((in[4 + inpos]) >>> (46 - 38)) + | ((in[5 + inpos]) << 38); + out[4 + outpos] = ((in[5 + inpos]) >>> (46 - 20)) + | ((in[6 + inpos]) << 20); + out[5 + outpos] = ((in[6 + inpos]) >>> (46 - 2)) + | ((in[7 + inpos]) << 2) + | ((in[8 + inpos]) << 48); + out[6 + outpos] = ((in[8 + inpos]) >>> (46 - 30)) + | ((in[9 + inpos]) << 30); + out[7 + outpos] = ((in[9 + inpos]) >>> (46 - 12)) + | ((in[10 + inpos]) << 12) + | ((in[11 + inpos]) << 58); + out[8 + outpos] = ((in[11 + inpos]) >>> (46 - 40)) + | ((in[12 + inpos]) << 40); + out[9 + outpos] = ((in[12 + inpos]) >>> (46 - 22)) + | ((in[13 + inpos]) << 22); + out[10 + outpos] = ((in[13 + inpos]) >>> (46 - 4)) + | ((in[14 + inpos]) << 4) + | ((in[15 + inpos]) << 50); + out[11 + outpos] = ((in[15 + inpos]) >>> (46 - 32)) + | ((in[16 + inpos]) << 32); + out[12 + outpos] = ((in[16 + inpos]) >>> (46 - 14)) + | ((in[17 + inpos]) << 14) + | ((in[18 + inpos]) << 60); + out[13 + outpos] = ((in[18 + inpos]) >>> (46 - 42)) + | ((in[19 + inpos]) << 42); + out[14 + outpos] = ((in[19 + inpos]) >>> (46 - 24)) + | ((in[20 + inpos]) << 24); + out[15 + outpos] = ((in[20 + inpos]) >>> (46 - 6)) + | ((in[21 + inpos]) << 6) + | ((in[22 + inpos]) << 52); + out[16 + outpos] = ((in[22 + inpos]) >>> (46 - 34)) + | ((in[23 + inpos]) << 34); + out[17 + outpos] = ((in[23 + inpos]) >>> (46 - 16)) + | ((in[24 + inpos]) << 16) + | ((in[25 + inpos]) << 62); + out[18 + outpos] = ((in[25 + inpos]) >>> (46 - 44)) + | ((in[26 + inpos]) << 44); + out[19 + outpos] = ((in[26 + inpos]) >>> (46 - 26)) + | ((in[27 + inpos]) << 26); + out[20 + outpos] = ((in[27 + inpos]) >>> (46 - 8)) + | ((in[28 + inpos]) << 8) + | ((in[29 + inpos]) << 54); + out[21 + outpos] = ((in[29 + inpos]) >>> (46 - 36)) + | ((in[30 + inpos]) << 36); + out[22 + outpos] = ((in[30 + inpos]) >>> (46 - 18)) + | ((in[31 + inpos]) << 18); + out[23 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 46); + out[24 + outpos] = ((in[33 + inpos]) >>> (46 - 28)) + | ((in[34 + inpos]) << 28); + out[25 + outpos] = ((in[34 + inpos]) >>> (46 - 10)) + | ((in[35 + inpos]) << 10) + | ((in[36 + inpos]) << 56); + out[26 + outpos] = ((in[36 + inpos]) >>> (46 - 38)) + | ((in[37 + inpos]) << 38); + out[27 + outpos] = ((in[37 + inpos]) >>> (46 - 20)) + | ((in[38 + inpos]) << 20); + out[28 + outpos] = ((in[38 + inpos]) >>> (46 - 2)) + | ((in[39 + inpos]) << 2) + | ((in[40 + inpos]) << 48); + out[29 + outpos] = ((in[40 + inpos]) >>> (46 - 30)) + | ((in[41 + inpos]) << 30); + out[30 + outpos] = ((in[41 + inpos]) >>> (46 - 12)) + | ((in[42 + inpos]) << 12) + | ((in[43 + inpos]) << 58); + out[31 + outpos] = ((in[43 + inpos]) >>> (46 - 40)) + | ((in[44 + inpos]) << 40); + out[32 + outpos] = ((in[44 + inpos]) >>> (46 - 22)) + | ((in[45 + inpos]) << 22); + out[33 + outpos] = ((in[45 + inpos]) >>> (46 - 4)) + | ((in[46 + inpos]) << 4) + | ((in[47 + inpos]) << 50); + out[34 + outpos] = ((in[47 + inpos]) >>> (46 - 32)) + | ((in[48 + inpos]) << 32); + out[35 + outpos] = ((in[48 + inpos]) >>> (46 - 14)) + | ((in[49 + inpos]) << 14) + | ((in[50 + inpos]) << 60); + out[36 + outpos] = ((in[50 + inpos]) >>> (46 - 42)) + | ((in[51 + inpos]) << 42); + out[37 + outpos] = ((in[51 + inpos]) >>> (46 - 24)) + | ((in[52 + inpos]) << 24); + out[38 + outpos] = ((in[52 + inpos]) >>> (46 - 6)) + | ((in[53 + inpos]) << 6) + | ((in[54 + inpos]) << 52); + out[39 + outpos] = ((in[54 + inpos]) >>> (46 - 34)) + | ((in[55 + inpos]) << 34); + out[40 + outpos] = ((in[55 + inpos]) >>> (46 - 16)) + | ((in[56 + inpos]) << 16) + | ((in[57 + inpos]) << 62); + out[41 + outpos] = ((in[57 + inpos]) >>> (46 - 44)) + | ((in[58 + inpos]) << 44); + out[42 + outpos] = ((in[58 + inpos]) >>> (46 - 26)) + | ((in[59 + inpos]) << 26); + out[43 + outpos] = ((in[59 + inpos]) >>> (46 - 8)) + | ((in[60 + inpos]) << 8) + | ((in[61 + inpos]) << 54); + out[44 + outpos] = ((in[61 + inpos]) >>> (46 - 36)) + | ((in[62 + inpos]) << 36); + out[45 + outpos] = ((in[62 + inpos]) >>> (46 - 18)) + | ((in[63 + inpos]) << 18); + } + + protected static void fastpackwithoutmask47(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 47); + out[1 + outpos] = ((in[1 + inpos]) >>> (47 - 30)) + | ((in[2 + inpos]) << 30); + out[2 + outpos] = ((in[2 + inpos]) >>> (47 - 13)) + | ((in[3 + inpos]) << 13) + | ((in[4 + inpos]) << 60); + out[3 + outpos] = ((in[4 + inpos]) >>> (47 - 43)) + | ((in[5 + inpos]) << 43); + out[4 + outpos] = ((in[5 + inpos]) >>> (47 - 26)) + | ((in[6 + inpos]) << 26); + out[5 + outpos] = ((in[6 + inpos]) >>> (47 - 9)) + | ((in[7 + inpos]) << 9) + | ((in[8 + inpos]) << 56); + out[6 + outpos] = ((in[8 + inpos]) >>> (47 - 39)) + | ((in[9 + inpos]) << 39); + out[7 + outpos] = ((in[9 + inpos]) >>> (47 - 22)) + | ((in[10 + inpos]) << 22); + out[8 + outpos] = ((in[10 + inpos]) >>> (47 - 5)) + | ((in[11 + inpos]) << 5) + | ((in[12 + inpos]) << 52); + out[9 + outpos] = ((in[12 + inpos]) >>> (47 - 35)) + | ((in[13 + inpos]) << 35); + out[10 + outpos] = ((in[13 + inpos]) >>> (47 - 18)) + | ((in[14 + inpos]) << 18); + out[11 + outpos] = ((in[14 + inpos]) >>> (47 - 1)) + | ((in[15 + inpos]) << 1) + | ((in[16 + inpos]) << 48); + out[12 + outpos] = ((in[16 + inpos]) >>> (47 - 31)) + | ((in[17 + inpos]) << 31); + out[13 + outpos] = ((in[17 + inpos]) >>> (47 - 14)) + | ((in[18 + inpos]) << 14) + | ((in[19 + inpos]) << 61); + out[14 + outpos] = ((in[19 + inpos]) >>> (47 - 44)) + | ((in[20 + inpos]) << 44); + out[15 + outpos] = ((in[20 + inpos]) >>> (47 - 27)) + | ((in[21 + inpos]) << 27); + out[16 + outpos] = ((in[21 + inpos]) >>> (47 - 10)) + | ((in[22 + inpos]) << 10) + | ((in[23 + inpos]) << 57); + out[17 + outpos] = ((in[23 + inpos]) >>> (47 - 40)) + | ((in[24 + inpos]) << 40); + out[18 + outpos] = ((in[24 + inpos]) >>> (47 - 23)) + | ((in[25 + inpos]) << 23); + out[19 + outpos] = ((in[25 + inpos]) >>> (47 - 6)) + | ((in[26 + inpos]) << 6) + | ((in[27 + inpos]) << 53); + out[20 + outpos] = ((in[27 + inpos]) >>> (47 - 36)) + | ((in[28 + inpos]) << 36); + out[21 + outpos] = ((in[28 + inpos]) >>> (47 - 19)) + | ((in[29 + inpos]) << 19); + out[22 + outpos] = ((in[29 + inpos]) >>> (47 - 2)) + | ((in[30 + inpos]) << 2) + | ((in[31 + inpos]) << 49); + out[23 + outpos] = ((in[31 + inpos]) >>> (47 - 32)) + | ((in[32 + inpos]) << 32); + out[24 + outpos] = ((in[32 + inpos]) >>> (47 - 15)) + | ((in[33 + inpos]) << 15) + | ((in[34 + inpos]) << 62); + out[25 + outpos] = ((in[34 + inpos]) >>> (47 - 45)) + | ((in[35 + inpos]) << 45); + out[26 + outpos] = ((in[35 + inpos]) >>> (47 - 28)) + | ((in[36 + inpos]) << 28); + out[27 + outpos] = ((in[36 + inpos]) >>> (47 - 11)) + | ((in[37 + inpos]) << 11) + | ((in[38 + inpos]) << 58); + out[28 + outpos] = ((in[38 + inpos]) >>> (47 - 41)) + | ((in[39 + inpos]) << 41); + out[29 + outpos] = ((in[39 + inpos]) >>> (47 - 24)) + | ((in[40 + inpos]) << 24); + out[30 + outpos] = ((in[40 + inpos]) >>> (47 - 7)) + | ((in[41 + inpos]) << 7) + | ((in[42 + inpos]) << 54); + out[31 + outpos] = ((in[42 + inpos]) >>> (47 - 37)) + | ((in[43 + inpos]) << 37); + out[32 + outpos] = ((in[43 + inpos]) >>> (47 - 20)) + | ((in[44 + inpos]) << 20); + out[33 + outpos] = ((in[44 + inpos]) >>> (47 - 3)) + | ((in[45 + inpos]) << 3) + | ((in[46 + inpos]) << 50); + out[34 + outpos] = ((in[46 + inpos]) >>> (47 - 33)) + | ((in[47 + inpos]) << 33); + out[35 + outpos] = ((in[47 + inpos]) >>> (47 - 16)) + | ((in[48 + inpos]) << 16) + | ((in[49 + inpos]) << 63); + out[36 + outpos] = ((in[49 + inpos]) >>> (47 - 46)) + | ((in[50 + inpos]) << 46); + out[37 + outpos] = ((in[50 + inpos]) >>> (47 - 29)) + | ((in[51 + inpos]) << 29); + out[38 + outpos] = ((in[51 + inpos]) >>> (47 - 12)) + | ((in[52 + inpos]) << 12) + | ((in[53 + inpos]) << 59); + out[39 + outpos] = ((in[53 + inpos]) >>> (47 - 42)) + | ((in[54 + inpos]) << 42); + out[40 + outpos] = ((in[54 + inpos]) >>> (47 - 25)) + | ((in[55 + inpos]) << 25); + out[41 + outpos] = ((in[55 + inpos]) >>> (47 - 8)) + | ((in[56 + inpos]) << 8) + | ((in[57 + inpos]) << 55); + out[42 + outpos] = ((in[57 + inpos]) >>> (47 - 38)) + | ((in[58 + inpos]) << 38); + out[43 + outpos] = ((in[58 + inpos]) >>> (47 - 21)) + | ((in[59 + inpos]) << 21); + out[44 + outpos] = ((in[59 + inpos]) >>> (47 - 4)) + | ((in[60 + inpos]) << 4) + | ((in[61 + inpos]) << 51); + out[45 + outpos] = ((in[61 + inpos]) >>> (47 - 34)) + | ((in[62 + inpos]) << 34); + out[46 + outpos] = ((in[62 + inpos]) >>> (47 - 17)) + | ((in[63 + inpos]) << 17); + } + + protected static void fastpackwithoutmask48(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 48); + out[1 + outpos] = ((in[1 + inpos]) >>> (48 - 32)) + | ((in[2 + inpos]) << 32); + out[2 + outpos] = ((in[2 + inpos]) >>> (48 - 16)) + | ((in[3 + inpos]) << 16); + out[3 + outpos] = in[4 + inpos] + | ((in[5 + inpos]) << 48); + out[4 + outpos] = ((in[5 + inpos]) >>> (48 - 32)) + | ((in[6 + inpos]) << 32); + out[5 + outpos] = ((in[6 + inpos]) >>> (48 - 16)) + | ((in[7 + inpos]) << 16); + out[6 + outpos] = in[8 + inpos] + | ((in[9 + inpos]) << 48); + out[7 + outpos] = ((in[9 + inpos]) >>> (48 - 32)) + | ((in[10 + inpos]) << 32); + out[8 + outpos] = ((in[10 + inpos]) >>> (48 - 16)) + | ((in[11 + inpos]) << 16); + out[9 + outpos] = in[12 + inpos] + | ((in[13 + inpos]) << 48); + out[10 + outpos] = ((in[13 + inpos]) >>> (48 - 32)) + | ((in[14 + inpos]) << 32); + out[11 + outpos] = ((in[14 + inpos]) >>> (48 - 16)) + | ((in[15 + inpos]) << 16); + out[12 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 48); + out[13 + outpos] = ((in[17 + inpos]) >>> (48 - 32)) + | ((in[18 + inpos]) << 32); + out[14 + outpos] = ((in[18 + inpos]) >>> (48 - 16)) + | ((in[19 + inpos]) << 16); + out[15 + outpos] = in[20 + inpos] + | ((in[21 + inpos]) << 48); + out[16 + outpos] = ((in[21 + inpos]) >>> (48 - 32)) + | ((in[22 + inpos]) << 32); + out[17 + outpos] = ((in[22 + inpos]) >>> (48 - 16)) + | ((in[23 + inpos]) << 16); + out[18 + outpos] = in[24 + inpos] + | ((in[25 + inpos]) << 48); + out[19 + outpos] = ((in[25 + inpos]) >>> (48 - 32)) + | ((in[26 + inpos]) << 32); + out[20 + outpos] = ((in[26 + inpos]) >>> (48 - 16)) + | ((in[27 + inpos]) << 16); + out[21 + outpos] = in[28 + inpos] + | ((in[29 + inpos]) << 48); + out[22 + outpos] = ((in[29 + inpos]) >>> (48 - 32)) + | ((in[30 + inpos]) << 32); + out[23 + outpos] = ((in[30 + inpos]) >>> (48 - 16)) + | ((in[31 + inpos]) << 16); + out[24 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 48); + out[25 + outpos] = ((in[33 + inpos]) >>> (48 - 32)) + | ((in[34 + inpos]) << 32); + out[26 + outpos] = ((in[34 + inpos]) >>> (48 - 16)) + | ((in[35 + inpos]) << 16); + out[27 + outpos] = in[36 + inpos] + | ((in[37 + inpos]) << 48); + out[28 + outpos] = ((in[37 + inpos]) >>> (48 - 32)) + | ((in[38 + inpos]) << 32); + out[29 + outpos] = ((in[38 + inpos]) >>> (48 - 16)) + | ((in[39 + inpos]) << 16); + out[30 + outpos] = in[40 + inpos] + | ((in[41 + inpos]) << 48); + out[31 + outpos] = ((in[41 + inpos]) >>> (48 - 32)) + | ((in[42 + inpos]) << 32); + out[32 + outpos] = ((in[42 + inpos]) >>> (48 - 16)) + | ((in[43 + inpos]) << 16); + out[33 + outpos] = in[44 + inpos] + | ((in[45 + inpos]) << 48); + out[34 + outpos] = ((in[45 + inpos]) >>> (48 - 32)) + | ((in[46 + inpos]) << 32); + out[35 + outpos] = ((in[46 + inpos]) >>> (48 - 16)) + | ((in[47 + inpos]) << 16); + out[36 + outpos] = in[48 + inpos] + | ((in[49 + inpos]) << 48); + out[37 + outpos] = ((in[49 + inpos]) >>> (48 - 32)) + | ((in[50 + inpos]) << 32); + out[38 + outpos] = ((in[50 + inpos]) >>> (48 - 16)) + | ((in[51 + inpos]) << 16); + out[39 + outpos] = in[52 + inpos] + | ((in[53 + inpos]) << 48); + out[40 + outpos] = ((in[53 + inpos]) >>> (48 - 32)) + | ((in[54 + inpos]) << 32); + out[41 + outpos] = ((in[54 + inpos]) >>> (48 - 16)) + | ((in[55 + inpos]) << 16); + out[42 + outpos] = in[56 + inpos] + | ((in[57 + inpos]) << 48); + out[43 + outpos] = ((in[57 + inpos]) >>> (48 - 32)) + | ((in[58 + inpos]) << 32); + out[44 + outpos] = ((in[58 + inpos]) >>> (48 - 16)) + | ((in[59 + inpos]) << 16); + out[45 + outpos] = in[60 + inpos] + | ((in[61 + inpos]) << 48); + out[46 + outpos] = ((in[61 + inpos]) >>> (48 - 32)) + | ((in[62 + inpos]) << 32); + out[47 + outpos] = ((in[62 + inpos]) >>> (48 - 16)) + | ((in[63 + inpos]) << 16); + } + + protected static void fastpackwithoutmask49(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 49); + out[1 + outpos] = ((in[1 + inpos]) >>> (49 - 34)) + | ((in[2 + inpos]) << 34); + out[2 + outpos] = ((in[2 + inpos]) >>> (49 - 19)) + | ((in[3 + inpos]) << 19); + out[3 + outpos] = ((in[3 + inpos]) >>> (49 - 4)) + | ((in[4 + inpos]) << 4) + | ((in[5 + inpos]) << 53); + out[4 + outpos] = ((in[5 + inpos]) >>> (49 - 38)) + | ((in[6 + inpos]) << 38); + out[5 + outpos] = ((in[6 + inpos]) >>> (49 - 23)) + | ((in[7 + inpos]) << 23); + out[6 + outpos] = ((in[7 + inpos]) >>> (49 - 8)) + | ((in[8 + inpos]) << 8) + | ((in[9 + inpos]) << 57); + out[7 + outpos] = ((in[9 + inpos]) >>> (49 - 42)) + | ((in[10 + inpos]) << 42); + out[8 + outpos] = ((in[10 + inpos]) >>> (49 - 27)) + | ((in[11 + inpos]) << 27); + out[9 + outpos] = ((in[11 + inpos]) >>> (49 - 12)) + | ((in[12 + inpos]) << 12) + | ((in[13 + inpos]) << 61); + out[10 + outpos] = ((in[13 + inpos]) >>> (49 - 46)) + | ((in[14 + inpos]) << 46); + out[11 + outpos] = ((in[14 + inpos]) >>> (49 - 31)) + | ((in[15 + inpos]) << 31); + out[12 + outpos] = ((in[15 + inpos]) >>> (49 - 16)) + | ((in[16 + inpos]) << 16); + out[13 + outpos] = ((in[16 + inpos]) >>> (49 - 1)) + | ((in[17 + inpos]) << 1) + | ((in[18 + inpos]) << 50); + out[14 + outpos] = ((in[18 + inpos]) >>> (49 - 35)) + | ((in[19 + inpos]) << 35); + out[15 + outpos] = ((in[19 + inpos]) >>> (49 - 20)) + | ((in[20 + inpos]) << 20); + out[16 + outpos] = ((in[20 + inpos]) >>> (49 - 5)) + | ((in[21 + inpos]) << 5) + | ((in[22 + inpos]) << 54); + out[17 + outpos] = ((in[22 + inpos]) >>> (49 - 39)) + | ((in[23 + inpos]) << 39); + out[18 + outpos] = ((in[23 + inpos]) >>> (49 - 24)) + | ((in[24 + inpos]) << 24); + out[19 + outpos] = ((in[24 + inpos]) >>> (49 - 9)) + | ((in[25 + inpos]) << 9) + | ((in[26 + inpos]) << 58); + out[20 + outpos] = ((in[26 + inpos]) >>> (49 - 43)) + | ((in[27 + inpos]) << 43); + out[21 + outpos] = ((in[27 + inpos]) >>> (49 - 28)) + | ((in[28 + inpos]) << 28); + out[22 + outpos] = ((in[28 + inpos]) >>> (49 - 13)) + | ((in[29 + inpos]) << 13) + | ((in[30 + inpos]) << 62); + out[23 + outpos] = ((in[30 + inpos]) >>> (49 - 47)) + | ((in[31 + inpos]) << 47); + out[24 + outpos] = ((in[31 + inpos]) >>> (49 - 32)) + | ((in[32 + inpos]) << 32); + out[25 + outpos] = ((in[32 + inpos]) >>> (49 - 17)) + | ((in[33 + inpos]) << 17); + out[26 + outpos] = ((in[33 + inpos]) >>> (49 - 2)) + | ((in[34 + inpos]) << 2) + | ((in[35 + inpos]) << 51); + out[27 + outpos] = ((in[35 + inpos]) >>> (49 - 36)) + | ((in[36 + inpos]) << 36); + out[28 + outpos] = ((in[36 + inpos]) >>> (49 - 21)) + | ((in[37 + inpos]) << 21); + out[29 + outpos] = ((in[37 + inpos]) >>> (49 - 6)) + | ((in[38 + inpos]) << 6) + | ((in[39 + inpos]) << 55); + out[30 + outpos] = ((in[39 + inpos]) >>> (49 - 40)) + | ((in[40 + inpos]) << 40); + out[31 + outpos] = ((in[40 + inpos]) >>> (49 - 25)) + | ((in[41 + inpos]) << 25); + out[32 + outpos] = ((in[41 + inpos]) >>> (49 - 10)) + | ((in[42 + inpos]) << 10) + | ((in[43 + inpos]) << 59); + out[33 + outpos] = ((in[43 + inpos]) >>> (49 - 44)) + | ((in[44 + inpos]) << 44); + out[34 + outpos] = ((in[44 + inpos]) >>> (49 - 29)) + | ((in[45 + inpos]) << 29); + out[35 + outpos] = ((in[45 + inpos]) >>> (49 - 14)) + | ((in[46 + inpos]) << 14) + | ((in[47 + inpos]) << 63); + out[36 + outpos] = ((in[47 + inpos]) >>> (49 - 48)) + | ((in[48 + inpos]) << 48); + out[37 + outpos] = ((in[48 + inpos]) >>> (49 - 33)) + | ((in[49 + inpos]) << 33); + out[38 + outpos] = ((in[49 + inpos]) >>> (49 - 18)) + | ((in[50 + inpos]) << 18); + out[39 + outpos] = ((in[50 + inpos]) >>> (49 - 3)) + | ((in[51 + inpos]) << 3) + | ((in[52 + inpos]) << 52); + out[40 + outpos] = ((in[52 + inpos]) >>> (49 - 37)) + | ((in[53 + inpos]) << 37); + out[41 + outpos] = ((in[53 + inpos]) >>> (49 - 22)) + | ((in[54 + inpos]) << 22); + out[42 + outpos] = ((in[54 + inpos]) >>> (49 - 7)) + | ((in[55 + inpos]) << 7) + | ((in[56 + inpos]) << 56); + out[43 + outpos] = ((in[56 + inpos]) >>> (49 - 41)) + | ((in[57 + inpos]) << 41); + out[44 + outpos] = ((in[57 + inpos]) >>> (49 - 26)) + | ((in[58 + inpos]) << 26); + out[45 + outpos] = ((in[58 + inpos]) >>> (49 - 11)) + | ((in[59 + inpos]) << 11) + | ((in[60 + inpos]) << 60); + out[46 + outpos] = ((in[60 + inpos]) >>> (49 - 45)) + | ((in[61 + inpos]) << 45); + out[47 + outpos] = ((in[61 + inpos]) >>> (49 - 30)) + | ((in[62 + inpos]) << 30); + out[48 + outpos] = ((in[62 + inpos]) >>> (49 - 15)) + | ((in[63 + inpos]) << 15); + } + + protected static void fastpackwithoutmask50(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 50); + out[1 + outpos] = ((in[1 + inpos]) >>> (50 - 36)) + | ((in[2 + inpos]) << 36); + out[2 + outpos] = ((in[2 + inpos]) >>> (50 - 22)) + | ((in[3 + inpos]) << 22); + out[3 + outpos] = ((in[3 + inpos]) >>> (50 - 8)) + | ((in[4 + inpos]) << 8) + | ((in[5 + inpos]) << 58); + out[4 + outpos] = ((in[5 + inpos]) >>> (50 - 44)) + | ((in[6 + inpos]) << 44); + out[5 + outpos] = ((in[6 + inpos]) >>> (50 - 30)) + | ((in[7 + inpos]) << 30); + out[6 + outpos] = ((in[7 + inpos]) >>> (50 - 16)) + | ((in[8 + inpos]) << 16); + out[7 + outpos] = ((in[8 + inpos]) >>> (50 - 2)) + | ((in[9 + inpos]) << 2) + | ((in[10 + inpos]) << 52); + out[8 + outpos] = ((in[10 + inpos]) >>> (50 - 38)) + | ((in[11 + inpos]) << 38); + out[9 + outpos] = ((in[11 + inpos]) >>> (50 - 24)) + | ((in[12 + inpos]) << 24); + out[10 + outpos] = ((in[12 + inpos]) >>> (50 - 10)) + | ((in[13 + inpos]) << 10) + | ((in[14 + inpos]) << 60); + out[11 + outpos] = ((in[14 + inpos]) >>> (50 - 46)) + | ((in[15 + inpos]) << 46); + out[12 + outpos] = ((in[15 + inpos]) >>> (50 - 32)) + | ((in[16 + inpos]) << 32); + out[13 + outpos] = ((in[16 + inpos]) >>> (50 - 18)) + | ((in[17 + inpos]) << 18); + out[14 + outpos] = ((in[17 + inpos]) >>> (50 - 4)) + | ((in[18 + inpos]) << 4) + | ((in[19 + inpos]) << 54); + out[15 + outpos] = ((in[19 + inpos]) >>> (50 - 40)) + | ((in[20 + inpos]) << 40); + out[16 + outpos] = ((in[20 + inpos]) >>> (50 - 26)) + | ((in[21 + inpos]) << 26); + out[17 + outpos] = ((in[21 + inpos]) >>> (50 - 12)) + | ((in[22 + inpos]) << 12) + | ((in[23 + inpos]) << 62); + out[18 + outpos] = ((in[23 + inpos]) >>> (50 - 48)) + | ((in[24 + inpos]) << 48); + out[19 + outpos] = ((in[24 + inpos]) >>> (50 - 34)) + | ((in[25 + inpos]) << 34); + out[20 + outpos] = ((in[25 + inpos]) >>> (50 - 20)) + | ((in[26 + inpos]) << 20); + out[21 + outpos] = ((in[26 + inpos]) >>> (50 - 6)) + | ((in[27 + inpos]) << 6) + | ((in[28 + inpos]) << 56); + out[22 + outpos] = ((in[28 + inpos]) >>> (50 - 42)) + | ((in[29 + inpos]) << 42); + out[23 + outpos] = ((in[29 + inpos]) >>> (50 - 28)) + | ((in[30 + inpos]) << 28); + out[24 + outpos] = ((in[30 + inpos]) >>> (50 - 14)) + | ((in[31 + inpos]) << 14); + out[25 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 50); + out[26 + outpos] = ((in[33 + inpos]) >>> (50 - 36)) + | ((in[34 + inpos]) << 36); + out[27 + outpos] = ((in[34 + inpos]) >>> (50 - 22)) + | ((in[35 + inpos]) << 22); + out[28 + outpos] = ((in[35 + inpos]) >>> (50 - 8)) + | ((in[36 + inpos]) << 8) + | ((in[37 + inpos]) << 58); + out[29 + outpos] = ((in[37 + inpos]) >>> (50 - 44)) + | ((in[38 + inpos]) << 44); + out[30 + outpos] = ((in[38 + inpos]) >>> (50 - 30)) + | ((in[39 + inpos]) << 30); + out[31 + outpos] = ((in[39 + inpos]) >>> (50 - 16)) + | ((in[40 + inpos]) << 16); + out[32 + outpos] = ((in[40 + inpos]) >>> (50 - 2)) + | ((in[41 + inpos]) << 2) + | ((in[42 + inpos]) << 52); + out[33 + outpos] = ((in[42 + inpos]) >>> (50 - 38)) + | ((in[43 + inpos]) << 38); + out[34 + outpos] = ((in[43 + inpos]) >>> (50 - 24)) + | ((in[44 + inpos]) << 24); + out[35 + outpos] = ((in[44 + inpos]) >>> (50 - 10)) + | ((in[45 + inpos]) << 10) + | ((in[46 + inpos]) << 60); + out[36 + outpos] = ((in[46 + inpos]) >>> (50 - 46)) + | ((in[47 + inpos]) << 46); + out[37 + outpos] = ((in[47 + inpos]) >>> (50 - 32)) + | ((in[48 + inpos]) << 32); + out[38 + outpos] = ((in[48 + inpos]) >>> (50 - 18)) + | ((in[49 + inpos]) << 18); + out[39 + outpos] = ((in[49 + inpos]) >>> (50 - 4)) + | ((in[50 + inpos]) << 4) + | ((in[51 + inpos]) << 54); + out[40 + outpos] = ((in[51 + inpos]) >>> (50 - 40)) + | ((in[52 + inpos]) << 40); + out[41 + outpos] = ((in[52 + inpos]) >>> (50 - 26)) + | ((in[53 + inpos]) << 26); + out[42 + outpos] = ((in[53 + inpos]) >>> (50 - 12)) + | ((in[54 + inpos]) << 12) + | ((in[55 + inpos]) << 62); + out[43 + outpos] = ((in[55 + inpos]) >>> (50 - 48)) + | ((in[56 + inpos]) << 48); + out[44 + outpos] = ((in[56 + inpos]) >>> (50 - 34)) + | ((in[57 + inpos]) << 34); + out[45 + outpos] = ((in[57 + inpos]) >>> (50 - 20)) + | ((in[58 + inpos]) << 20); + out[46 + outpos] = ((in[58 + inpos]) >>> (50 - 6)) + | ((in[59 + inpos]) << 6) + | ((in[60 + inpos]) << 56); + out[47 + outpos] = ((in[60 + inpos]) >>> (50 - 42)) + | ((in[61 + inpos]) << 42); + out[48 + outpos] = ((in[61 + inpos]) >>> (50 - 28)) + | ((in[62 + inpos]) << 28); + out[49 + outpos] = ((in[62 + inpos]) >>> (50 - 14)) + | ((in[63 + inpos]) << 14); + } + + protected static void fastpackwithoutmask51(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 51); + out[1 + outpos] = ((in[1 + inpos]) >>> (51 - 38)) + | ((in[2 + inpos]) << 38); + out[2 + outpos] = ((in[2 + inpos]) >>> (51 - 25)) + | ((in[3 + inpos]) << 25); + out[3 + outpos] = ((in[3 + inpos]) >>> (51 - 12)) + | ((in[4 + inpos]) << 12) + | ((in[5 + inpos]) << 63); + out[4 + outpos] = ((in[5 + inpos]) >>> (51 - 50)) + | ((in[6 + inpos]) << 50); + out[5 + outpos] = ((in[6 + inpos]) >>> (51 - 37)) + | ((in[7 + inpos]) << 37); + out[6 + outpos] = ((in[7 + inpos]) >>> (51 - 24)) + | ((in[8 + inpos]) << 24); + out[7 + outpos] = ((in[8 + inpos]) >>> (51 - 11)) + | ((in[9 + inpos]) << 11) + | ((in[10 + inpos]) << 62); + out[8 + outpos] = ((in[10 + inpos]) >>> (51 - 49)) + | ((in[11 + inpos]) << 49); + out[9 + outpos] = ((in[11 + inpos]) >>> (51 - 36)) + | ((in[12 + inpos]) << 36); + out[10 + outpos] = ((in[12 + inpos]) >>> (51 - 23)) + | ((in[13 + inpos]) << 23); + out[11 + outpos] = ((in[13 + inpos]) >>> (51 - 10)) + | ((in[14 + inpos]) << 10) + | ((in[15 + inpos]) << 61); + out[12 + outpos] = ((in[15 + inpos]) >>> (51 - 48)) + | ((in[16 + inpos]) << 48); + out[13 + outpos] = ((in[16 + inpos]) >>> (51 - 35)) + | ((in[17 + inpos]) << 35); + out[14 + outpos] = ((in[17 + inpos]) >>> (51 - 22)) + | ((in[18 + inpos]) << 22); + out[15 + outpos] = ((in[18 + inpos]) >>> (51 - 9)) + | ((in[19 + inpos]) << 9) + | ((in[20 + inpos]) << 60); + out[16 + outpos] = ((in[20 + inpos]) >>> (51 - 47)) + | ((in[21 + inpos]) << 47); + out[17 + outpos] = ((in[21 + inpos]) >>> (51 - 34)) + | ((in[22 + inpos]) << 34); + out[18 + outpos] = ((in[22 + inpos]) >>> (51 - 21)) + | ((in[23 + inpos]) << 21); + out[19 + outpos] = ((in[23 + inpos]) >>> (51 - 8)) + | ((in[24 + inpos]) << 8) + | ((in[25 + inpos]) << 59); + out[20 + outpos] = ((in[25 + inpos]) >>> (51 - 46)) + | ((in[26 + inpos]) << 46); + out[21 + outpos] = ((in[26 + inpos]) >>> (51 - 33)) + | ((in[27 + inpos]) << 33); + out[22 + outpos] = ((in[27 + inpos]) >>> (51 - 20)) + | ((in[28 + inpos]) << 20); + out[23 + outpos] = ((in[28 + inpos]) >>> (51 - 7)) + | ((in[29 + inpos]) << 7) + | ((in[30 + inpos]) << 58); + out[24 + outpos] = ((in[30 + inpos]) >>> (51 - 45)) + | ((in[31 + inpos]) << 45); + out[25 + outpos] = ((in[31 + inpos]) >>> (51 - 32)) + | ((in[32 + inpos]) << 32); + out[26 + outpos] = ((in[32 + inpos]) >>> (51 - 19)) + | ((in[33 + inpos]) << 19); + out[27 + outpos] = ((in[33 + inpos]) >>> (51 - 6)) + | ((in[34 + inpos]) << 6) + | ((in[35 + inpos]) << 57); + out[28 + outpos] = ((in[35 + inpos]) >>> (51 - 44)) + | ((in[36 + inpos]) << 44); + out[29 + outpos] = ((in[36 + inpos]) >>> (51 - 31)) + | ((in[37 + inpos]) << 31); + out[30 + outpos] = ((in[37 + inpos]) >>> (51 - 18)) + | ((in[38 + inpos]) << 18); + out[31 + outpos] = ((in[38 + inpos]) >>> (51 - 5)) + | ((in[39 + inpos]) << 5) + | ((in[40 + inpos]) << 56); + out[32 + outpos] = ((in[40 + inpos]) >>> (51 - 43)) + | ((in[41 + inpos]) << 43); + out[33 + outpos] = ((in[41 + inpos]) >>> (51 - 30)) + | ((in[42 + inpos]) << 30); + out[34 + outpos] = ((in[42 + inpos]) >>> (51 - 17)) + | ((in[43 + inpos]) << 17); + out[35 + outpos] = ((in[43 + inpos]) >>> (51 - 4)) + | ((in[44 + inpos]) << 4) + | ((in[45 + inpos]) << 55); + out[36 + outpos] = ((in[45 + inpos]) >>> (51 - 42)) + | ((in[46 + inpos]) << 42); + out[37 + outpos] = ((in[46 + inpos]) >>> (51 - 29)) + | ((in[47 + inpos]) << 29); + out[38 + outpos] = ((in[47 + inpos]) >>> (51 - 16)) + | ((in[48 + inpos]) << 16); + out[39 + outpos] = ((in[48 + inpos]) >>> (51 - 3)) + | ((in[49 + inpos]) << 3) + | ((in[50 + inpos]) << 54); + out[40 + outpos] = ((in[50 + inpos]) >>> (51 - 41)) + | ((in[51 + inpos]) << 41); + out[41 + outpos] = ((in[51 + inpos]) >>> (51 - 28)) + | ((in[52 + inpos]) << 28); + out[42 + outpos] = ((in[52 + inpos]) >>> (51 - 15)) + | ((in[53 + inpos]) << 15); + out[43 + outpos] = ((in[53 + inpos]) >>> (51 - 2)) + | ((in[54 + inpos]) << 2) + | ((in[55 + inpos]) << 53); + out[44 + outpos] = ((in[55 + inpos]) >>> (51 - 40)) + | ((in[56 + inpos]) << 40); + out[45 + outpos] = ((in[56 + inpos]) >>> (51 - 27)) + | ((in[57 + inpos]) << 27); + out[46 + outpos] = ((in[57 + inpos]) >>> (51 - 14)) + | ((in[58 + inpos]) << 14); + out[47 + outpos] = ((in[58 + inpos]) >>> (51 - 1)) + | ((in[59 + inpos]) << 1) + | ((in[60 + inpos]) << 52); + out[48 + outpos] = ((in[60 + inpos]) >>> (51 - 39)) + | ((in[61 + inpos]) << 39); + out[49 + outpos] = ((in[61 + inpos]) >>> (51 - 26)) + | ((in[62 + inpos]) << 26); + out[50 + outpos] = ((in[62 + inpos]) >>> (51 - 13)) + | ((in[63 + inpos]) << 13); + } + + protected static void fastpackwithoutmask52(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 52); + out[1 + outpos] = ((in[1 + inpos]) >>> (52 - 40)) + | ((in[2 + inpos]) << 40); + out[2 + outpos] = ((in[2 + inpos]) >>> (52 - 28)) + | ((in[3 + inpos]) << 28); + out[3 + outpos] = ((in[3 + inpos]) >>> (52 - 16)) + | ((in[4 + inpos]) << 16); + out[4 + outpos] = ((in[4 + inpos]) >>> (52 - 4)) + | ((in[5 + inpos]) << 4) + | ((in[6 + inpos]) << 56); + out[5 + outpos] = ((in[6 + inpos]) >>> (52 - 44)) + | ((in[7 + inpos]) << 44); + out[6 + outpos] = ((in[7 + inpos]) >>> (52 - 32)) + | ((in[8 + inpos]) << 32); + out[7 + outpos] = ((in[8 + inpos]) >>> (52 - 20)) + | ((in[9 + inpos]) << 20); + out[8 + outpos] = ((in[9 + inpos]) >>> (52 - 8)) + | ((in[10 + inpos]) << 8) + | ((in[11 + inpos]) << 60); + out[9 + outpos] = ((in[11 + inpos]) >>> (52 - 48)) + | ((in[12 + inpos]) << 48); + out[10 + outpos] = ((in[12 + inpos]) >>> (52 - 36)) + | ((in[13 + inpos]) << 36); + out[11 + outpos] = ((in[13 + inpos]) >>> (52 - 24)) + | ((in[14 + inpos]) << 24); + out[12 + outpos] = ((in[14 + inpos]) >>> (52 - 12)) + | ((in[15 + inpos]) << 12); + out[13 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 52); + out[14 + outpos] = ((in[17 + inpos]) >>> (52 - 40)) + | ((in[18 + inpos]) << 40); + out[15 + outpos] = ((in[18 + inpos]) >>> (52 - 28)) + | ((in[19 + inpos]) << 28); + out[16 + outpos] = ((in[19 + inpos]) >>> (52 - 16)) + | ((in[20 + inpos]) << 16); + out[17 + outpos] = ((in[20 + inpos]) >>> (52 - 4)) + | ((in[21 + inpos]) << 4) + | ((in[22 + inpos]) << 56); + out[18 + outpos] = ((in[22 + inpos]) >>> (52 - 44)) + | ((in[23 + inpos]) << 44); + out[19 + outpos] = ((in[23 + inpos]) >>> (52 - 32)) + | ((in[24 + inpos]) << 32); + out[20 + outpos] = ((in[24 + inpos]) >>> (52 - 20)) + | ((in[25 + inpos]) << 20); + out[21 + outpos] = ((in[25 + inpos]) >>> (52 - 8)) + | ((in[26 + inpos]) << 8) + | ((in[27 + inpos]) << 60); + out[22 + outpos] = ((in[27 + inpos]) >>> (52 - 48)) + | ((in[28 + inpos]) << 48); + out[23 + outpos] = ((in[28 + inpos]) >>> (52 - 36)) + | ((in[29 + inpos]) << 36); + out[24 + outpos] = ((in[29 + inpos]) >>> (52 - 24)) + | ((in[30 + inpos]) << 24); + out[25 + outpos] = ((in[30 + inpos]) >>> (52 - 12)) + | ((in[31 + inpos]) << 12); + out[26 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 52); + out[27 + outpos] = ((in[33 + inpos]) >>> (52 - 40)) + | ((in[34 + inpos]) << 40); + out[28 + outpos] = ((in[34 + inpos]) >>> (52 - 28)) + | ((in[35 + inpos]) << 28); + out[29 + outpos] = ((in[35 + inpos]) >>> (52 - 16)) + | ((in[36 + inpos]) << 16); + out[30 + outpos] = ((in[36 + inpos]) >>> (52 - 4)) + | ((in[37 + inpos]) << 4) + | ((in[38 + inpos]) << 56); + out[31 + outpos] = ((in[38 + inpos]) >>> (52 - 44)) + | ((in[39 + inpos]) << 44); + out[32 + outpos] = ((in[39 + inpos]) >>> (52 - 32)) + | ((in[40 + inpos]) << 32); + out[33 + outpos] = ((in[40 + inpos]) >>> (52 - 20)) + | ((in[41 + inpos]) << 20); + out[34 + outpos] = ((in[41 + inpos]) >>> (52 - 8)) + | ((in[42 + inpos]) << 8) + | ((in[43 + inpos]) << 60); + out[35 + outpos] = ((in[43 + inpos]) >>> (52 - 48)) + | ((in[44 + inpos]) << 48); + out[36 + outpos] = ((in[44 + inpos]) >>> (52 - 36)) + | ((in[45 + inpos]) << 36); + out[37 + outpos] = ((in[45 + inpos]) >>> (52 - 24)) + | ((in[46 + inpos]) << 24); + out[38 + outpos] = ((in[46 + inpos]) >>> (52 - 12)) + | ((in[47 + inpos]) << 12); + out[39 + outpos] = in[48 + inpos] + | ((in[49 + inpos]) << 52); + out[40 + outpos] = ((in[49 + inpos]) >>> (52 - 40)) + | ((in[50 + inpos]) << 40); + out[41 + outpos] = ((in[50 + inpos]) >>> (52 - 28)) + | ((in[51 + inpos]) << 28); + out[42 + outpos] = ((in[51 + inpos]) >>> (52 - 16)) + | ((in[52 + inpos]) << 16); + out[43 + outpos] = ((in[52 + inpos]) >>> (52 - 4)) + | ((in[53 + inpos]) << 4) + | ((in[54 + inpos]) << 56); + out[44 + outpos] = ((in[54 + inpos]) >>> (52 - 44)) + | ((in[55 + inpos]) << 44); + out[45 + outpos] = ((in[55 + inpos]) >>> (52 - 32)) + | ((in[56 + inpos]) << 32); + out[46 + outpos] = ((in[56 + inpos]) >>> (52 - 20)) + | ((in[57 + inpos]) << 20); + out[47 + outpos] = ((in[57 + inpos]) >>> (52 - 8)) + | ((in[58 + inpos]) << 8) + | ((in[59 + inpos]) << 60); + out[48 + outpos] = ((in[59 + inpos]) >>> (52 - 48)) + | ((in[60 + inpos]) << 48); + out[49 + outpos] = ((in[60 + inpos]) >>> (52 - 36)) + | ((in[61 + inpos]) << 36); + out[50 + outpos] = ((in[61 + inpos]) >>> (52 - 24)) + | ((in[62 + inpos]) << 24); + out[51 + outpos] = ((in[62 + inpos]) >>> (52 - 12)) + | ((in[63 + inpos]) << 12); + } + + protected static void fastpackwithoutmask53(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 53); + out[1 + outpos] = ((in[1 + inpos]) >>> (53 - 42)) + | ((in[2 + inpos]) << 42); + out[2 + outpos] = ((in[2 + inpos]) >>> (53 - 31)) + | ((in[3 + inpos]) << 31); + out[3 + outpos] = ((in[3 + inpos]) >>> (53 - 20)) + | ((in[4 + inpos]) << 20); + out[4 + outpos] = ((in[4 + inpos]) >>> (53 - 9)) + | ((in[5 + inpos]) << 9) + | ((in[6 + inpos]) << 62); + out[5 + outpos] = ((in[6 + inpos]) >>> (53 - 51)) + | ((in[7 + inpos]) << 51); + out[6 + outpos] = ((in[7 + inpos]) >>> (53 - 40)) + | ((in[8 + inpos]) << 40); + out[7 + outpos] = ((in[8 + inpos]) >>> (53 - 29)) + | ((in[9 + inpos]) << 29); + out[8 + outpos] = ((in[9 + inpos]) >>> (53 - 18)) + | ((in[10 + inpos]) << 18); + out[9 + outpos] = ((in[10 + inpos]) >>> (53 - 7)) + | ((in[11 + inpos]) << 7) + | ((in[12 + inpos]) << 60); + out[10 + outpos] = ((in[12 + inpos]) >>> (53 - 49)) + | ((in[13 + inpos]) << 49); + out[11 + outpos] = ((in[13 + inpos]) >>> (53 - 38)) + | ((in[14 + inpos]) << 38); + out[12 + outpos] = ((in[14 + inpos]) >>> (53 - 27)) + | ((in[15 + inpos]) << 27); + out[13 + outpos] = ((in[15 + inpos]) >>> (53 - 16)) + | ((in[16 + inpos]) << 16); + out[14 + outpos] = ((in[16 + inpos]) >>> (53 - 5)) + | ((in[17 + inpos]) << 5) + | ((in[18 + inpos]) << 58); + out[15 + outpos] = ((in[18 + inpos]) >>> (53 - 47)) + | ((in[19 + inpos]) << 47); + out[16 + outpos] = ((in[19 + inpos]) >>> (53 - 36)) + | ((in[20 + inpos]) << 36); + out[17 + outpos] = ((in[20 + inpos]) >>> (53 - 25)) + | ((in[21 + inpos]) << 25); + out[18 + outpos] = ((in[21 + inpos]) >>> (53 - 14)) + | ((in[22 + inpos]) << 14); + out[19 + outpos] = ((in[22 + inpos]) >>> (53 - 3)) + | ((in[23 + inpos]) << 3) + | ((in[24 + inpos]) << 56); + out[20 + outpos] = ((in[24 + inpos]) >>> (53 - 45)) + | ((in[25 + inpos]) << 45); + out[21 + outpos] = ((in[25 + inpos]) >>> (53 - 34)) + | ((in[26 + inpos]) << 34); + out[22 + outpos] = ((in[26 + inpos]) >>> (53 - 23)) + | ((in[27 + inpos]) << 23); + out[23 + outpos] = ((in[27 + inpos]) >>> (53 - 12)) + | ((in[28 + inpos]) << 12); + out[24 + outpos] = ((in[28 + inpos]) >>> (53 - 1)) + | ((in[29 + inpos]) << 1) + | ((in[30 + inpos]) << 54); + out[25 + outpos] = ((in[30 + inpos]) >>> (53 - 43)) + | ((in[31 + inpos]) << 43); + out[26 + outpos] = ((in[31 + inpos]) >>> (53 - 32)) + | ((in[32 + inpos]) << 32); + out[27 + outpos] = ((in[32 + inpos]) >>> (53 - 21)) + | ((in[33 + inpos]) << 21); + out[28 + outpos] = ((in[33 + inpos]) >>> (53 - 10)) + | ((in[34 + inpos]) << 10) + | ((in[35 + inpos]) << 63); + out[29 + outpos] = ((in[35 + inpos]) >>> (53 - 52)) + | ((in[36 + inpos]) << 52); + out[30 + outpos] = ((in[36 + inpos]) >>> (53 - 41)) + | ((in[37 + inpos]) << 41); + out[31 + outpos] = ((in[37 + inpos]) >>> (53 - 30)) + | ((in[38 + inpos]) << 30); + out[32 + outpos] = ((in[38 + inpos]) >>> (53 - 19)) + | ((in[39 + inpos]) << 19); + out[33 + outpos] = ((in[39 + inpos]) >>> (53 - 8)) + | ((in[40 + inpos]) << 8) + | ((in[41 + inpos]) << 61); + out[34 + outpos] = ((in[41 + inpos]) >>> (53 - 50)) + | ((in[42 + inpos]) << 50); + out[35 + outpos] = ((in[42 + inpos]) >>> (53 - 39)) + | ((in[43 + inpos]) << 39); + out[36 + outpos] = ((in[43 + inpos]) >>> (53 - 28)) + | ((in[44 + inpos]) << 28); + out[37 + outpos] = ((in[44 + inpos]) >>> (53 - 17)) + | ((in[45 + inpos]) << 17); + out[38 + outpos] = ((in[45 + inpos]) >>> (53 - 6)) + | ((in[46 + inpos]) << 6) + | ((in[47 + inpos]) << 59); + out[39 + outpos] = ((in[47 + inpos]) >>> (53 - 48)) + | ((in[48 + inpos]) << 48); + out[40 + outpos] = ((in[48 + inpos]) >>> (53 - 37)) + | ((in[49 + inpos]) << 37); + out[41 + outpos] = ((in[49 + inpos]) >>> (53 - 26)) + | ((in[50 + inpos]) << 26); + out[42 + outpos] = ((in[50 + inpos]) >>> (53 - 15)) + | ((in[51 + inpos]) << 15); + out[43 + outpos] = ((in[51 + inpos]) >>> (53 - 4)) + | ((in[52 + inpos]) << 4) + | ((in[53 + inpos]) << 57); + out[44 + outpos] = ((in[53 + inpos]) >>> (53 - 46)) + | ((in[54 + inpos]) << 46); + out[45 + outpos] = ((in[54 + inpos]) >>> (53 - 35)) + | ((in[55 + inpos]) << 35); + out[46 + outpos] = ((in[55 + inpos]) >>> (53 - 24)) + | ((in[56 + inpos]) << 24); + out[47 + outpos] = ((in[56 + inpos]) >>> (53 - 13)) + | ((in[57 + inpos]) << 13); + out[48 + outpos] = ((in[57 + inpos]) >>> (53 - 2)) + | ((in[58 + inpos]) << 2) + | ((in[59 + inpos]) << 55); + out[49 + outpos] = ((in[59 + inpos]) >>> (53 - 44)) + | ((in[60 + inpos]) << 44); + out[50 + outpos] = ((in[60 + inpos]) >>> (53 - 33)) + | ((in[61 + inpos]) << 33); + out[51 + outpos] = ((in[61 + inpos]) >>> (53 - 22)) + | ((in[62 + inpos]) << 22); + out[52 + outpos] = ((in[62 + inpos]) >>> (53 - 11)) + | ((in[63 + inpos]) << 11); + } + + protected static void fastpackwithoutmask54(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 54); + out[1 + outpos] = ((in[1 + inpos]) >>> (54 - 44)) + | ((in[2 + inpos]) << 44); + out[2 + outpos] = ((in[2 + inpos]) >>> (54 - 34)) + | ((in[3 + inpos]) << 34); + out[3 + outpos] = ((in[3 + inpos]) >>> (54 - 24)) + | ((in[4 + inpos]) << 24); + out[4 + outpos] = ((in[4 + inpos]) >>> (54 - 14)) + | ((in[5 + inpos]) << 14); + out[5 + outpos] = ((in[5 + inpos]) >>> (54 - 4)) + | ((in[6 + inpos]) << 4) + | ((in[7 + inpos]) << 58); + out[6 + outpos] = ((in[7 + inpos]) >>> (54 - 48)) + | ((in[8 + inpos]) << 48); + out[7 + outpos] = ((in[8 + inpos]) >>> (54 - 38)) + | ((in[9 + inpos]) << 38); + out[8 + outpos] = ((in[9 + inpos]) >>> (54 - 28)) + | ((in[10 + inpos]) << 28); + out[9 + outpos] = ((in[10 + inpos]) >>> (54 - 18)) + | ((in[11 + inpos]) << 18); + out[10 + outpos] = ((in[11 + inpos]) >>> (54 - 8)) + | ((in[12 + inpos]) << 8) + | ((in[13 + inpos]) << 62); + out[11 + outpos] = ((in[13 + inpos]) >>> (54 - 52)) + | ((in[14 + inpos]) << 52); + out[12 + outpos] = ((in[14 + inpos]) >>> (54 - 42)) + | ((in[15 + inpos]) << 42); + out[13 + outpos] = ((in[15 + inpos]) >>> (54 - 32)) + | ((in[16 + inpos]) << 32); + out[14 + outpos] = ((in[16 + inpos]) >>> (54 - 22)) + | ((in[17 + inpos]) << 22); + out[15 + outpos] = ((in[17 + inpos]) >>> (54 - 12)) + | ((in[18 + inpos]) << 12); + out[16 + outpos] = ((in[18 + inpos]) >>> (54 - 2)) + | ((in[19 + inpos]) << 2) + | ((in[20 + inpos]) << 56); + out[17 + outpos] = ((in[20 + inpos]) >>> (54 - 46)) + | ((in[21 + inpos]) << 46); + out[18 + outpos] = ((in[21 + inpos]) >>> (54 - 36)) + | ((in[22 + inpos]) << 36); + out[19 + outpos] = ((in[22 + inpos]) >>> (54 - 26)) + | ((in[23 + inpos]) << 26); + out[20 + outpos] = ((in[23 + inpos]) >>> (54 - 16)) + | ((in[24 + inpos]) << 16); + out[21 + outpos] = ((in[24 + inpos]) >>> (54 - 6)) + | ((in[25 + inpos]) << 6) + | ((in[26 + inpos]) << 60); + out[22 + outpos] = ((in[26 + inpos]) >>> (54 - 50)) + | ((in[27 + inpos]) << 50); + out[23 + outpos] = ((in[27 + inpos]) >>> (54 - 40)) + | ((in[28 + inpos]) << 40); + out[24 + outpos] = ((in[28 + inpos]) >>> (54 - 30)) + | ((in[29 + inpos]) << 30); + out[25 + outpos] = ((in[29 + inpos]) >>> (54 - 20)) + | ((in[30 + inpos]) << 20); + out[26 + outpos] = ((in[30 + inpos]) >>> (54 - 10)) + | ((in[31 + inpos]) << 10); + out[27 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 54); + out[28 + outpos] = ((in[33 + inpos]) >>> (54 - 44)) + | ((in[34 + inpos]) << 44); + out[29 + outpos] = ((in[34 + inpos]) >>> (54 - 34)) + | ((in[35 + inpos]) << 34); + out[30 + outpos] = ((in[35 + inpos]) >>> (54 - 24)) + | ((in[36 + inpos]) << 24); + out[31 + outpos] = ((in[36 + inpos]) >>> (54 - 14)) + | ((in[37 + inpos]) << 14); + out[32 + outpos] = ((in[37 + inpos]) >>> (54 - 4)) + | ((in[38 + inpos]) << 4) + | ((in[39 + inpos]) << 58); + out[33 + outpos] = ((in[39 + inpos]) >>> (54 - 48)) + | ((in[40 + inpos]) << 48); + out[34 + outpos] = ((in[40 + inpos]) >>> (54 - 38)) + | ((in[41 + inpos]) << 38); + out[35 + outpos] = ((in[41 + inpos]) >>> (54 - 28)) + | ((in[42 + inpos]) << 28); + out[36 + outpos] = ((in[42 + inpos]) >>> (54 - 18)) + | ((in[43 + inpos]) << 18); + out[37 + outpos] = ((in[43 + inpos]) >>> (54 - 8)) + | ((in[44 + inpos]) << 8) + | ((in[45 + inpos]) << 62); + out[38 + outpos] = ((in[45 + inpos]) >>> (54 - 52)) + | ((in[46 + inpos]) << 52); + out[39 + outpos] = ((in[46 + inpos]) >>> (54 - 42)) + | ((in[47 + inpos]) << 42); + out[40 + outpos] = ((in[47 + inpos]) >>> (54 - 32)) + | ((in[48 + inpos]) << 32); + out[41 + outpos] = ((in[48 + inpos]) >>> (54 - 22)) + | ((in[49 + inpos]) << 22); + out[42 + outpos] = ((in[49 + inpos]) >>> (54 - 12)) + | ((in[50 + inpos]) << 12); + out[43 + outpos] = ((in[50 + inpos]) >>> (54 - 2)) + | ((in[51 + inpos]) << 2) + | ((in[52 + inpos]) << 56); + out[44 + outpos] = ((in[52 + inpos]) >>> (54 - 46)) + | ((in[53 + inpos]) << 46); + out[45 + outpos] = ((in[53 + inpos]) >>> (54 - 36)) + | ((in[54 + inpos]) << 36); + out[46 + outpos] = ((in[54 + inpos]) >>> (54 - 26)) + | ((in[55 + inpos]) << 26); + out[47 + outpos] = ((in[55 + inpos]) >>> (54 - 16)) + | ((in[56 + inpos]) << 16); + out[48 + outpos] = ((in[56 + inpos]) >>> (54 - 6)) + | ((in[57 + inpos]) << 6) + | ((in[58 + inpos]) << 60); + out[49 + outpos] = ((in[58 + inpos]) >>> (54 - 50)) + | ((in[59 + inpos]) << 50); + out[50 + outpos] = ((in[59 + inpos]) >>> (54 - 40)) + | ((in[60 + inpos]) << 40); + out[51 + outpos] = ((in[60 + inpos]) >>> (54 - 30)) + | ((in[61 + inpos]) << 30); + out[52 + outpos] = ((in[61 + inpos]) >>> (54 - 20)) + | ((in[62 + inpos]) << 20); + out[53 + outpos] = ((in[62 + inpos]) >>> (54 - 10)) + | ((in[63 + inpos]) << 10); + } + + protected static void fastpackwithoutmask55(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 55); + out[1 + outpos] = ((in[1 + inpos]) >>> (55 - 46)) + | ((in[2 + inpos]) << 46); + out[2 + outpos] = ((in[2 + inpos]) >>> (55 - 37)) + | ((in[3 + inpos]) << 37); + out[3 + outpos] = ((in[3 + inpos]) >>> (55 - 28)) + | ((in[4 + inpos]) << 28); + out[4 + outpos] = ((in[4 + inpos]) >>> (55 - 19)) + | ((in[5 + inpos]) << 19); + out[5 + outpos] = ((in[5 + inpos]) >>> (55 - 10)) + | ((in[6 + inpos]) << 10); + out[6 + outpos] = ((in[6 + inpos]) >>> (55 - 1)) + | ((in[7 + inpos]) << 1) + | ((in[8 + inpos]) << 56); + out[7 + outpos] = ((in[8 + inpos]) >>> (55 - 47)) + | ((in[9 + inpos]) << 47); + out[8 + outpos] = ((in[9 + inpos]) >>> (55 - 38)) + | ((in[10 + inpos]) << 38); + out[9 + outpos] = ((in[10 + inpos]) >>> (55 - 29)) + | ((in[11 + inpos]) << 29); + out[10 + outpos] = ((in[11 + inpos]) >>> (55 - 20)) + | ((in[12 + inpos]) << 20); + out[11 + outpos] = ((in[12 + inpos]) >>> (55 - 11)) + | ((in[13 + inpos]) << 11); + out[12 + outpos] = ((in[13 + inpos]) >>> (55 - 2)) + | ((in[14 + inpos]) << 2) + | ((in[15 + inpos]) << 57); + out[13 + outpos] = ((in[15 + inpos]) >>> (55 - 48)) + | ((in[16 + inpos]) << 48); + out[14 + outpos] = ((in[16 + inpos]) >>> (55 - 39)) + | ((in[17 + inpos]) << 39); + out[15 + outpos] = ((in[17 + inpos]) >>> (55 - 30)) + | ((in[18 + inpos]) << 30); + out[16 + outpos] = ((in[18 + inpos]) >>> (55 - 21)) + | ((in[19 + inpos]) << 21); + out[17 + outpos] = ((in[19 + inpos]) >>> (55 - 12)) + | ((in[20 + inpos]) << 12); + out[18 + outpos] = ((in[20 + inpos]) >>> (55 - 3)) + | ((in[21 + inpos]) << 3) + | ((in[22 + inpos]) << 58); + out[19 + outpos] = ((in[22 + inpos]) >>> (55 - 49)) + | ((in[23 + inpos]) << 49); + out[20 + outpos] = ((in[23 + inpos]) >>> (55 - 40)) + | ((in[24 + inpos]) << 40); + out[21 + outpos] = ((in[24 + inpos]) >>> (55 - 31)) + | ((in[25 + inpos]) << 31); + out[22 + outpos] = ((in[25 + inpos]) >>> (55 - 22)) + | ((in[26 + inpos]) << 22); + out[23 + outpos] = ((in[26 + inpos]) >>> (55 - 13)) + | ((in[27 + inpos]) << 13); + out[24 + outpos] = ((in[27 + inpos]) >>> (55 - 4)) + | ((in[28 + inpos]) << 4) + | ((in[29 + inpos]) << 59); + out[25 + outpos] = ((in[29 + inpos]) >>> (55 - 50)) + | ((in[30 + inpos]) << 50); + out[26 + outpos] = ((in[30 + inpos]) >>> (55 - 41)) + | ((in[31 + inpos]) << 41); + out[27 + outpos] = ((in[31 + inpos]) >>> (55 - 32)) + | ((in[32 + inpos]) << 32); + out[28 + outpos] = ((in[32 + inpos]) >>> (55 - 23)) + | ((in[33 + inpos]) << 23); + out[29 + outpos] = ((in[33 + inpos]) >>> (55 - 14)) + | ((in[34 + inpos]) << 14); + out[30 + outpos] = ((in[34 + inpos]) >>> (55 - 5)) + | ((in[35 + inpos]) << 5) + | ((in[36 + inpos]) << 60); + out[31 + outpos] = ((in[36 + inpos]) >>> (55 - 51)) + | ((in[37 + inpos]) << 51); + out[32 + outpos] = ((in[37 + inpos]) >>> (55 - 42)) + | ((in[38 + inpos]) << 42); + out[33 + outpos] = ((in[38 + inpos]) >>> (55 - 33)) + | ((in[39 + inpos]) << 33); + out[34 + outpos] = ((in[39 + inpos]) >>> (55 - 24)) + | ((in[40 + inpos]) << 24); + out[35 + outpos] = ((in[40 + inpos]) >>> (55 - 15)) + | ((in[41 + inpos]) << 15); + out[36 + outpos] = ((in[41 + inpos]) >>> (55 - 6)) + | ((in[42 + inpos]) << 6) + | ((in[43 + inpos]) << 61); + out[37 + outpos] = ((in[43 + inpos]) >>> (55 - 52)) + | ((in[44 + inpos]) << 52); + out[38 + outpos] = ((in[44 + inpos]) >>> (55 - 43)) + | ((in[45 + inpos]) << 43); + out[39 + outpos] = ((in[45 + inpos]) >>> (55 - 34)) + | ((in[46 + inpos]) << 34); + out[40 + outpos] = ((in[46 + inpos]) >>> (55 - 25)) + | ((in[47 + inpos]) << 25); + out[41 + outpos] = ((in[47 + inpos]) >>> (55 - 16)) + | ((in[48 + inpos]) << 16); + out[42 + outpos] = ((in[48 + inpos]) >>> (55 - 7)) + | ((in[49 + inpos]) << 7) + | ((in[50 + inpos]) << 62); + out[43 + outpos] = ((in[50 + inpos]) >>> (55 - 53)) + | ((in[51 + inpos]) << 53); + out[44 + outpos] = ((in[51 + inpos]) >>> (55 - 44)) + | ((in[52 + inpos]) << 44); + out[45 + outpos] = ((in[52 + inpos]) >>> (55 - 35)) + | ((in[53 + inpos]) << 35); + out[46 + outpos] = ((in[53 + inpos]) >>> (55 - 26)) + | ((in[54 + inpos]) << 26); + out[47 + outpos] = ((in[54 + inpos]) >>> (55 - 17)) + | ((in[55 + inpos]) << 17); + out[48 + outpos] = ((in[55 + inpos]) >>> (55 - 8)) + | ((in[56 + inpos]) << 8) + | ((in[57 + inpos]) << 63); + out[49 + outpos] = ((in[57 + inpos]) >>> (55 - 54)) + | ((in[58 + inpos]) << 54); + out[50 + outpos] = ((in[58 + inpos]) >>> (55 - 45)) + | ((in[59 + inpos]) << 45); + out[51 + outpos] = ((in[59 + inpos]) >>> (55 - 36)) + | ((in[60 + inpos]) << 36); + out[52 + outpos] = ((in[60 + inpos]) >>> (55 - 27)) + | ((in[61 + inpos]) << 27); + out[53 + outpos] = ((in[61 + inpos]) >>> (55 - 18)) + | ((in[62 + inpos]) << 18); + out[54 + outpos] = ((in[62 + inpos]) >>> (55 - 9)) + | ((in[63 + inpos]) << 9); + } + + protected static void fastpackwithoutmask56(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 56); + out[1 + outpos] = ((in[1 + inpos]) >>> (56 - 48)) + | ((in[2 + inpos]) << 48); + out[2 + outpos] = ((in[2 + inpos]) >>> (56 - 40)) + | ((in[3 + inpos]) << 40); + out[3 + outpos] = ((in[3 + inpos]) >>> (56 - 32)) + | ((in[4 + inpos]) << 32); + out[4 + outpos] = ((in[4 + inpos]) >>> (56 - 24)) + | ((in[5 + inpos]) << 24); + out[5 + outpos] = ((in[5 + inpos]) >>> (56 - 16)) + | ((in[6 + inpos]) << 16); + out[6 + outpos] = ((in[6 + inpos]) >>> (56 - 8)) + | ((in[7 + inpos]) << 8); + out[7 + outpos] = in[8 + inpos] + | ((in[9 + inpos]) << 56); + out[8 + outpos] = ((in[9 + inpos]) >>> (56 - 48)) + | ((in[10 + inpos]) << 48); + out[9 + outpos] = ((in[10 + inpos]) >>> (56 - 40)) + | ((in[11 + inpos]) << 40); + out[10 + outpos] = ((in[11 + inpos]) >>> (56 - 32)) + | ((in[12 + inpos]) << 32); + out[11 + outpos] = ((in[12 + inpos]) >>> (56 - 24)) + | ((in[13 + inpos]) << 24); + out[12 + outpos] = ((in[13 + inpos]) >>> (56 - 16)) + | ((in[14 + inpos]) << 16); + out[13 + outpos] = ((in[14 + inpos]) >>> (56 - 8)) + | ((in[15 + inpos]) << 8); + out[14 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 56); + out[15 + outpos] = ((in[17 + inpos]) >>> (56 - 48)) + | ((in[18 + inpos]) << 48); + out[16 + outpos] = ((in[18 + inpos]) >>> (56 - 40)) + | ((in[19 + inpos]) << 40); + out[17 + outpos] = ((in[19 + inpos]) >>> (56 - 32)) + | ((in[20 + inpos]) << 32); + out[18 + outpos] = ((in[20 + inpos]) >>> (56 - 24)) + | ((in[21 + inpos]) << 24); + out[19 + outpos] = ((in[21 + inpos]) >>> (56 - 16)) + | ((in[22 + inpos]) << 16); + out[20 + outpos] = ((in[22 + inpos]) >>> (56 - 8)) + | ((in[23 + inpos]) << 8); + out[21 + outpos] = in[24 + inpos] + | ((in[25 + inpos]) << 56); + out[22 + outpos] = ((in[25 + inpos]) >>> (56 - 48)) + | ((in[26 + inpos]) << 48); + out[23 + outpos] = ((in[26 + inpos]) >>> (56 - 40)) + | ((in[27 + inpos]) << 40); + out[24 + outpos] = ((in[27 + inpos]) >>> (56 - 32)) + | ((in[28 + inpos]) << 32); + out[25 + outpos] = ((in[28 + inpos]) >>> (56 - 24)) + | ((in[29 + inpos]) << 24); + out[26 + outpos] = ((in[29 + inpos]) >>> (56 - 16)) + | ((in[30 + inpos]) << 16); + out[27 + outpos] = ((in[30 + inpos]) >>> (56 - 8)) + | ((in[31 + inpos]) << 8); + out[28 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 56); + out[29 + outpos] = ((in[33 + inpos]) >>> (56 - 48)) + | ((in[34 + inpos]) << 48); + out[30 + outpos] = ((in[34 + inpos]) >>> (56 - 40)) + | ((in[35 + inpos]) << 40); + out[31 + outpos] = ((in[35 + inpos]) >>> (56 - 32)) + | ((in[36 + inpos]) << 32); + out[32 + outpos] = ((in[36 + inpos]) >>> (56 - 24)) + | ((in[37 + inpos]) << 24); + out[33 + outpos] = ((in[37 + inpos]) >>> (56 - 16)) + | ((in[38 + inpos]) << 16); + out[34 + outpos] = ((in[38 + inpos]) >>> (56 - 8)) + | ((in[39 + inpos]) << 8); + out[35 + outpos] = in[40 + inpos] + | ((in[41 + inpos]) << 56); + out[36 + outpos] = ((in[41 + inpos]) >>> (56 - 48)) + | ((in[42 + inpos]) << 48); + out[37 + outpos] = ((in[42 + inpos]) >>> (56 - 40)) + | ((in[43 + inpos]) << 40); + out[38 + outpos] = ((in[43 + inpos]) >>> (56 - 32)) + | ((in[44 + inpos]) << 32); + out[39 + outpos] = ((in[44 + inpos]) >>> (56 - 24)) + | ((in[45 + inpos]) << 24); + out[40 + outpos] = ((in[45 + inpos]) >>> (56 - 16)) + | ((in[46 + inpos]) << 16); + out[41 + outpos] = ((in[46 + inpos]) >>> (56 - 8)) + | ((in[47 + inpos]) << 8); + out[42 + outpos] = in[48 + inpos] + | ((in[49 + inpos]) << 56); + out[43 + outpos] = ((in[49 + inpos]) >>> (56 - 48)) + | ((in[50 + inpos]) << 48); + out[44 + outpos] = ((in[50 + inpos]) >>> (56 - 40)) + | ((in[51 + inpos]) << 40); + out[45 + outpos] = ((in[51 + inpos]) >>> (56 - 32)) + | ((in[52 + inpos]) << 32); + out[46 + outpos] = ((in[52 + inpos]) >>> (56 - 24)) + | ((in[53 + inpos]) << 24); + out[47 + outpos] = ((in[53 + inpos]) >>> (56 - 16)) + | ((in[54 + inpos]) << 16); + out[48 + outpos] = ((in[54 + inpos]) >>> (56 - 8)) + | ((in[55 + inpos]) << 8); + out[49 + outpos] = in[56 + inpos] + | ((in[57 + inpos]) << 56); + out[50 + outpos] = ((in[57 + inpos]) >>> (56 - 48)) + | ((in[58 + inpos]) << 48); + out[51 + outpos] = ((in[58 + inpos]) >>> (56 - 40)) + | ((in[59 + inpos]) << 40); + out[52 + outpos] = ((in[59 + inpos]) >>> (56 - 32)) + | ((in[60 + inpos]) << 32); + out[53 + outpos] = ((in[60 + inpos]) >>> (56 - 24)) + | ((in[61 + inpos]) << 24); + out[54 + outpos] = ((in[61 + inpos]) >>> (56 - 16)) + | ((in[62 + inpos]) << 16); + out[55 + outpos] = ((in[62 + inpos]) >>> (56 - 8)) + | ((in[63 + inpos]) << 8); + } + + protected static void fastpackwithoutmask57(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 57); + out[1 + outpos] = ((in[1 + inpos]) >>> (57 - 50)) + | ((in[2 + inpos]) << 50); + out[2 + outpos] = ((in[2 + inpos]) >>> (57 - 43)) + | ((in[3 + inpos]) << 43); + out[3 + outpos] = ((in[3 + inpos]) >>> (57 - 36)) + | ((in[4 + inpos]) << 36); + out[4 + outpos] = ((in[4 + inpos]) >>> (57 - 29)) + | ((in[5 + inpos]) << 29); + out[5 + outpos] = ((in[5 + inpos]) >>> (57 - 22)) + | ((in[6 + inpos]) << 22); + out[6 + outpos] = ((in[6 + inpos]) >>> (57 - 15)) + | ((in[7 + inpos]) << 15); + out[7 + outpos] = ((in[7 + inpos]) >>> (57 - 8)) + | ((in[8 + inpos]) << 8); + out[8 + outpos] = ((in[8 + inpos]) >>> (57 - 1)) + | ((in[9 + inpos]) << 1) + | ((in[10 + inpos]) << 58); + out[9 + outpos] = ((in[10 + inpos]) >>> (57 - 51)) + | ((in[11 + inpos]) << 51); + out[10 + outpos] = ((in[11 + inpos]) >>> (57 - 44)) + | ((in[12 + inpos]) << 44); + out[11 + outpos] = ((in[12 + inpos]) >>> (57 - 37)) + | ((in[13 + inpos]) << 37); + out[12 + outpos] = ((in[13 + inpos]) >>> (57 - 30)) + | ((in[14 + inpos]) << 30); + out[13 + outpos] = ((in[14 + inpos]) >>> (57 - 23)) + | ((in[15 + inpos]) << 23); + out[14 + outpos] = ((in[15 + inpos]) >>> (57 - 16)) + | ((in[16 + inpos]) << 16); + out[15 + outpos] = ((in[16 + inpos]) >>> (57 - 9)) + | ((in[17 + inpos]) << 9); + out[16 + outpos] = ((in[17 + inpos]) >>> (57 - 2)) + | ((in[18 + inpos]) << 2) + | ((in[19 + inpos]) << 59); + out[17 + outpos] = ((in[19 + inpos]) >>> (57 - 52)) + | ((in[20 + inpos]) << 52); + out[18 + outpos] = ((in[20 + inpos]) >>> (57 - 45)) + | ((in[21 + inpos]) << 45); + out[19 + outpos] = ((in[21 + inpos]) >>> (57 - 38)) + | ((in[22 + inpos]) << 38); + out[20 + outpos] = ((in[22 + inpos]) >>> (57 - 31)) + | ((in[23 + inpos]) << 31); + out[21 + outpos] = ((in[23 + inpos]) >>> (57 - 24)) + | ((in[24 + inpos]) << 24); + out[22 + outpos] = ((in[24 + inpos]) >>> (57 - 17)) + | ((in[25 + inpos]) << 17); + out[23 + outpos] = ((in[25 + inpos]) >>> (57 - 10)) + | ((in[26 + inpos]) << 10); + out[24 + outpos] = ((in[26 + inpos]) >>> (57 - 3)) + | ((in[27 + inpos]) << 3) + | ((in[28 + inpos]) << 60); + out[25 + outpos] = ((in[28 + inpos]) >>> (57 - 53)) + | ((in[29 + inpos]) << 53); + out[26 + outpos] = ((in[29 + inpos]) >>> (57 - 46)) + | ((in[30 + inpos]) << 46); + out[27 + outpos] = ((in[30 + inpos]) >>> (57 - 39)) + | ((in[31 + inpos]) << 39); + out[28 + outpos] = ((in[31 + inpos]) >>> (57 - 32)) + | ((in[32 + inpos]) << 32); + out[29 + outpos] = ((in[32 + inpos]) >>> (57 - 25)) + | ((in[33 + inpos]) << 25); + out[30 + outpos] = ((in[33 + inpos]) >>> (57 - 18)) + | ((in[34 + inpos]) << 18); + out[31 + outpos] = ((in[34 + inpos]) >>> (57 - 11)) + | ((in[35 + inpos]) << 11); + out[32 + outpos] = ((in[35 + inpos]) >>> (57 - 4)) + | ((in[36 + inpos]) << 4) + | ((in[37 + inpos]) << 61); + out[33 + outpos] = ((in[37 + inpos]) >>> (57 - 54)) + | ((in[38 + inpos]) << 54); + out[34 + outpos] = ((in[38 + inpos]) >>> (57 - 47)) + | ((in[39 + inpos]) << 47); + out[35 + outpos] = ((in[39 + inpos]) >>> (57 - 40)) + | ((in[40 + inpos]) << 40); + out[36 + outpos] = ((in[40 + inpos]) >>> (57 - 33)) + | ((in[41 + inpos]) << 33); + out[37 + outpos] = ((in[41 + inpos]) >>> (57 - 26)) + | ((in[42 + inpos]) << 26); + out[38 + outpos] = ((in[42 + inpos]) >>> (57 - 19)) + | ((in[43 + inpos]) << 19); + out[39 + outpos] = ((in[43 + inpos]) >>> (57 - 12)) + | ((in[44 + inpos]) << 12); + out[40 + outpos] = ((in[44 + inpos]) >>> (57 - 5)) + | ((in[45 + inpos]) << 5) + | ((in[46 + inpos]) << 62); + out[41 + outpos] = ((in[46 + inpos]) >>> (57 - 55)) + | ((in[47 + inpos]) << 55); + out[42 + outpos] = ((in[47 + inpos]) >>> (57 - 48)) + | ((in[48 + inpos]) << 48); + out[43 + outpos] = ((in[48 + inpos]) >>> (57 - 41)) + | ((in[49 + inpos]) << 41); + out[44 + outpos] = ((in[49 + inpos]) >>> (57 - 34)) + | ((in[50 + inpos]) << 34); + out[45 + outpos] = ((in[50 + inpos]) >>> (57 - 27)) + | ((in[51 + inpos]) << 27); + out[46 + outpos] = ((in[51 + inpos]) >>> (57 - 20)) + | ((in[52 + inpos]) << 20); + out[47 + outpos] = ((in[52 + inpos]) >>> (57 - 13)) + | ((in[53 + inpos]) << 13); + out[48 + outpos] = ((in[53 + inpos]) >>> (57 - 6)) + | ((in[54 + inpos]) << 6) + | ((in[55 + inpos]) << 63); + out[49 + outpos] = ((in[55 + inpos]) >>> (57 - 56)) + | ((in[56 + inpos]) << 56); + out[50 + outpos] = ((in[56 + inpos]) >>> (57 - 49)) + | ((in[57 + inpos]) << 49); + out[51 + outpos] = ((in[57 + inpos]) >>> (57 - 42)) + | ((in[58 + inpos]) << 42); + out[52 + outpos] = ((in[58 + inpos]) >>> (57 - 35)) + | ((in[59 + inpos]) << 35); + out[53 + outpos] = ((in[59 + inpos]) >>> (57 - 28)) + | ((in[60 + inpos]) << 28); + out[54 + outpos] = ((in[60 + inpos]) >>> (57 - 21)) + | ((in[61 + inpos]) << 21); + out[55 + outpos] = ((in[61 + inpos]) >>> (57 - 14)) + | ((in[62 + inpos]) << 14); + out[56 + outpos] = ((in[62 + inpos]) >>> (57 - 7)) + | ((in[63 + inpos]) << 7); + } + + protected static void fastpackwithoutmask58(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 58); + out[1 + outpos] = ((in[1 + inpos]) >>> (58 - 52)) + | ((in[2 + inpos]) << 52); + out[2 + outpos] = ((in[2 + inpos]) >>> (58 - 46)) + | ((in[3 + inpos]) << 46); + out[3 + outpos] = ((in[3 + inpos]) >>> (58 - 40)) + | ((in[4 + inpos]) << 40); + out[4 + outpos] = ((in[4 + inpos]) >>> (58 - 34)) + | ((in[5 + inpos]) << 34); + out[5 + outpos] = ((in[5 + inpos]) >>> (58 - 28)) + | ((in[6 + inpos]) << 28); + out[6 + outpos] = ((in[6 + inpos]) >>> (58 - 22)) + | ((in[7 + inpos]) << 22); + out[7 + outpos] = ((in[7 + inpos]) >>> (58 - 16)) + | ((in[8 + inpos]) << 16); + out[8 + outpos] = ((in[8 + inpos]) >>> (58 - 10)) + | ((in[9 + inpos]) << 10); + out[9 + outpos] = ((in[9 + inpos]) >>> (58 - 4)) + | ((in[10 + inpos]) << 4) + | ((in[11 + inpos]) << 62); + out[10 + outpos] = ((in[11 + inpos]) >>> (58 - 56)) + | ((in[12 + inpos]) << 56); + out[11 + outpos] = ((in[12 + inpos]) >>> (58 - 50)) + | ((in[13 + inpos]) << 50); + out[12 + outpos] = ((in[13 + inpos]) >>> (58 - 44)) + | ((in[14 + inpos]) << 44); + out[13 + outpos] = ((in[14 + inpos]) >>> (58 - 38)) + | ((in[15 + inpos]) << 38); + out[14 + outpos] = ((in[15 + inpos]) >>> (58 - 32)) + | ((in[16 + inpos]) << 32); + out[15 + outpos] = ((in[16 + inpos]) >>> (58 - 26)) + | ((in[17 + inpos]) << 26); + out[16 + outpos] = ((in[17 + inpos]) >>> (58 - 20)) + | ((in[18 + inpos]) << 20); + out[17 + outpos] = ((in[18 + inpos]) >>> (58 - 14)) + | ((in[19 + inpos]) << 14); + out[18 + outpos] = ((in[19 + inpos]) >>> (58 - 8)) + | ((in[20 + inpos]) << 8); + out[19 + outpos] = ((in[20 + inpos]) >>> (58 - 2)) + | ((in[21 + inpos]) << 2) + | ((in[22 + inpos]) << 60); + out[20 + outpos] = ((in[22 + inpos]) >>> (58 - 54)) + | ((in[23 + inpos]) << 54); + out[21 + outpos] = ((in[23 + inpos]) >>> (58 - 48)) + | ((in[24 + inpos]) << 48); + out[22 + outpos] = ((in[24 + inpos]) >>> (58 - 42)) + | ((in[25 + inpos]) << 42); + out[23 + outpos] = ((in[25 + inpos]) >>> (58 - 36)) + | ((in[26 + inpos]) << 36); + out[24 + outpos] = ((in[26 + inpos]) >>> (58 - 30)) + | ((in[27 + inpos]) << 30); + out[25 + outpos] = ((in[27 + inpos]) >>> (58 - 24)) + | ((in[28 + inpos]) << 24); + out[26 + outpos] = ((in[28 + inpos]) >>> (58 - 18)) + | ((in[29 + inpos]) << 18); + out[27 + outpos] = ((in[29 + inpos]) >>> (58 - 12)) + | ((in[30 + inpos]) << 12); + out[28 + outpos] = ((in[30 + inpos]) >>> (58 - 6)) + | ((in[31 + inpos]) << 6); + out[29 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 58); + out[30 + outpos] = ((in[33 + inpos]) >>> (58 - 52)) + | ((in[34 + inpos]) << 52); + out[31 + outpos] = ((in[34 + inpos]) >>> (58 - 46)) + | ((in[35 + inpos]) << 46); + out[32 + outpos] = ((in[35 + inpos]) >>> (58 - 40)) + | ((in[36 + inpos]) << 40); + out[33 + outpos] = ((in[36 + inpos]) >>> (58 - 34)) + | ((in[37 + inpos]) << 34); + out[34 + outpos] = ((in[37 + inpos]) >>> (58 - 28)) + | ((in[38 + inpos]) << 28); + out[35 + outpos] = ((in[38 + inpos]) >>> (58 - 22)) + | ((in[39 + inpos]) << 22); + out[36 + outpos] = ((in[39 + inpos]) >>> (58 - 16)) + | ((in[40 + inpos]) << 16); + out[37 + outpos] = ((in[40 + inpos]) >>> (58 - 10)) + | ((in[41 + inpos]) << 10); + out[38 + outpos] = ((in[41 + inpos]) >>> (58 - 4)) + | ((in[42 + inpos]) << 4) + | ((in[43 + inpos]) << 62); + out[39 + outpos] = ((in[43 + inpos]) >>> (58 - 56)) + | ((in[44 + inpos]) << 56); + out[40 + outpos] = ((in[44 + inpos]) >>> (58 - 50)) + | ((in[45 + inpos]) << 50); + out[41 + outpos] = ((in[45 + inpos]) >>> (58 - 44)) + | ((in[46 + inpos]) << 44); + out[42 + outpos] = ((in[46 + inpos]) >>> (58 - 38)) + | ((in[47 + inpos]) << 38); + out[43 + outpos] = ((in[47 + inpos]) >>> (58 - 32)) + | ((in[48 + inpos]) << 32); + out[44 + outpos] = ((in[48 + inpos]) >>> (58 - 26)) + | ((in[49 + inpos]) << 26); + out[45 + outpos] = ((in[49 + inpos]) >>> (58 - 20)) + | ((in[50 + inpos]) << 20); + out[46 + outpos] = ((in[50 + inpos]) >>> (58 - 14)) + | ((in[51 + inpos]) << 14); + out[47 + outpos] = ((in[51 + inpos]) >>> (58 - 8)) + | ((in[52 + inpos]) << 8); + out[48 + outpos] = ((in[52 + inpos]) >>> (58 - 2)) + | ((in[53 + inpos]) << 2) + | ((in[54 + inpos]) << 60); + out[49 + outpos] = ((in[54 + inpos]) >>> (58 - 54)) + | ((in[55 + inpos]) << 54); + out[50 + outpos] = ((in[55 + inpos]) >>> (58 - 48)) + | ((in[56 + inpos]) << 48); + out[51 + outpos] = ((in[56 + inpos]) >>> (58 - 42)) + | ((in[57 + inpos]) << 42); + out[52 + outpos] = ((in[57 + inpos]) >>> (58 - 36)) + | ((in[58 + inpos]) << 36); + out[53 + outpos] = ((in[58 + inpos]) >>> (58 - 30)) + | ((in[59 + inpos]) << 30); + out[54 + outpos] = ((in[59 + inpos]) >>> (58 - 24)) + | ((in[60 + inpos]) << 24); + out[55 + outpos] = ((in[60 + inpos]) >>> (58 - 18)) + | ((in[61 + inpos]) << 18); + out[56 + outpos] = ((in[61 + inpos]) >>> (58 - 12)) + | ((in[62 + inpos]) << 12); + out[57 + outpos] = ((in[62 + inpos]) >>> (58 - 6)) + | ((in[63 + inpos]) << 6); + } + + protected static void fastpackwithoutmask59(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 59); + out[1 + outpos] = ((in[1 + inpos]) >>> (59 - 54)) + | ((in[2 + inpos]) << 54); + out[2 + outpos] = ((in[2 + inpos]) >>> (59 - 49)) + | ((in[3 + inpos]) << 49); + out[3 + outpos] = ((in[3 + inpos]) >>> (59 - 44)) + | ((in[4 + inpos]) << 44); + out[4 + outpos] = ((in[4 + inpos]) >>> (59 - 39)) + | ((in[5 + inpos]) << 39); + out[5 + outpos] = ((in[5 + inpos]) >>> (59 - 34)) + | ((in[6 + inpos]) << 34); + out[6 + outpos] = ((in[6 + inpos]) >>> (59 - 29)) + | ((in[7 + inpos]) << 29); + out[7 + outpos] = ((in[7 + inpos]) >>> (59 - 24)) + | ((in[8 + inpos]) << 24); + out[8 + outpos] = ((in[8 + inpos]) >>> (59 - 19)) + | ((in[9 + inpos]) << 19); + out[9 + outpos] = ((in[9 + inpos]) >>> (59 - 14)) + | ((in[10 + inpos]) << 14); + out[10 + outpos] = ((in[10 + inpos]) >>> (59 - 9)) + | ((in[11 + inpos]) << 9); + out[11 + outpos] = ((in[11 + inpos]) >>> (59 - 4)) + | ((in[12 + inpos]) << 4) + | ((in[13 + inpos]) << 63); + out[12 + outpos] = ((in[13 + inpos]) >>> (59 - 58)) + | ((in[14 + inpos]) << 58); + out[13 + outpos] = ((in[14 + inpos]) >>> (59 - 53)) + | ((in[15 + inpos]) << 53); + out[14 + outpos] = ((in[15 + inpos]) >>> (59 - 48)) + | ((in[16 + inpos]) << 48); + out[15 + outpos] = ((in[16 + inpos]) >>> (59 - 43)) + | ((in[17 + inpos]) << 43); + out[16 + outpos] = ((in[17 + inpos]) >>> (59 - 38)) + | ((in[18 + inpos]) << 38); + out[17 + outpos] = ((in[18 + inpos]) >>> (59 - 33)) + | ((in[19 + inpos]) << 33); + out[18 + outpos] = ((in[19 + inpos]) >>> (59 - 28)) + | ((in[20 + inpos]) << 28); + out[19 + outpos] = ((in[20 + inpos]) >>> (59 - 23)) + | ((in[21 + inpos]) << 23); + out[20 + outpos] = ((in[21 + inpos]) >>> (59 - 18)) + | ((in[22 + inpos]) << 18); + out[21 + outpos] = ((in[22 + inpos]) >>> (59 - 13)) + | ((in[23 + inpos]) << 13); + out[22 + outpos] = ((in[23 + inpos]) >>> (59 - 8)) + | ((in[24 + inpos]) << 8); + out[23 + outpos] = ((in[24 + inpos]) >>> (59 - 3)) + | ((in[25 + inpos]) << 3) + | ((in[26 + inpos]) << 62); + out[24 + outpos] = ((in[26 + inpos]) >>> (59 - 57)) + | ((in[27 + inpos]) << 57); + out[25 + outpos] = ((in[27 + inpos]) >>> (59 - 52)) + | ((in[28 + inpos]) << 52); + out[26 + outpos] = ((in[28 + inpos]) >>> (59 - 47)) + | ((in[29 + inpos]) << 47); + out[27 + outpos] = ((in[29 + inpos]) >>> (59 - 42)) + | ((in[30 + inpos]) << 42); + out[28 + outpos] = ((in[30 + inpos]) >>> (59 - 37)) + | ((in[31 + inpos]) << 37); + out[29 + outpos] = ((in[31 + inpos]) >>> (59 - 32)) + | ((in[32 + inpos]) << 32); + out[30 + outpos] = ((in[32 + inpos]) >>> (59 - 27)) + | ((in[33 + inpos]) << 27); + out[31 + outpos] = ((in[33 + inpos]) >>> (59 - 22)) + | ((in[34 + inpos]) << 22); + out[32 + outpos] = ((in[34 + inpos]) >>> (59 - 17)) + | ((in[35 + inpos]) << 17); + out[33 + outpos] = ((in[35 + inpos]) >>> (59 - 12)) + | ((in[36 + inpos]) << 12); + out[34 + outpos] = ((in[36 + inpos]) >>> (59 - 7)) + | ((in[37 + inpos]) << 7); + out[35 + outpos] = ((in[37 + inpos]) >>> (59 - 2)) + | ((in[38 + inpos]) << 2) + | ((in[39 + inpos]) << 61); + out[36 + outpos] = ((in[39 + inpos]) >>> (59 - 56)) + | ((in[40 + inpos]) << 56); + out[37 + outpos] = ((in[40 + inpos]) >>> (59 - 51)) + | ((in[41 + inpos]) << 51); + out[38 + outpos] = ((in[41 + inpos]) >>> (59 - 46)) + | ((in[42 + inpos]) << 46); + out[39 + outpos] = ((in[42 + inpos]) >>> (59 - 41)) + | ((in[43 + inpos]) << 41); + out[40 + outpos] = ((in[43 + inpos]) >>> (59 - 36)) + | ((in[44 + inpos]) << 36); + out[41 + outpos] = ((in[44 + inpos]) >>> (59 - 31)) + | ((in[45 + inpos]) << 31); + out[42 + outpos] = ((in[45 + inpos]) >>> (59 - 26)) + | ((in[46 + inpos]) << 26); + out[43 + outpos] = ((in[46 + inpos]) >>> (59 - 21)) + | ((in[47 + inpos]) << 21); + out[44 + outpos] = ((in[47 + inpos]) >>> (59 - 16)) + | ((in[48 + inpos]) << 16); + out[45 + outpos] = ((in[48 + inpos]) >>> (59 - 11)) + | ((in[49 + inpos]) << 11); + out[46 + outpos] = ((in[49 + inpos]) >>> (59 - 6)) + | ((in[50 + inpos]) << 6); + out[47 + outpos] = ((in[50 + inpos]) >>> (59 - 1)) + | ((in[51 + inpos]) << 1) + | ((in[52 + inpos]) << 60); + out[48 + outpos] = ((in[52 + inpos]) >>> (59 - 55)) + | ((in[53 + inpos]) << 55); + out[49 + outpos] = ((in[53 + inpos]) >>> (59 - 50)) + | ((in[54 + inpos]) << 50); + out[50 + outpos] = ((in[54 + inpos]) >>> (59 - 45)) + | ((in[55 + inpos]) << 45); + out[51 + outpos] = ((in[55 + inpos]) >>> (59 - 40)) + | ((in[56 + inpos]) << 40); + out[52 + outpos] = ((in[56 + inpos]) >>> (59 - 35)) + | ((in[57 + inpos]) << 35); + out[53 + outpos] = ((in[57 + inpos]) >>> (59 - 30)) + | ((in[58 + inpos]) << 30); + out[54 + outpos] = ((in[58 + inpos]) >>> (59 - 25)) + | ((in[59 + inpos]) << 25); + out[55 + outpos] = ((in[59 + inpos]) >>> (59 - 20)) + | ((in[60 + inpos]) << 20); + out[56 + outpos] = ((in[60 + inpos]) >>> (59 - 15)) + | ((in[61 + inpos]) << 15); + out[57 + outpos] = ((in[61 + inpos]) >>> (59 - 10)) + | ((in[62 + inpos]) << 10); + out[58 + outpos] = ((in[62 + inpos]) >>> (59 - 5)) + | ((in[63 + inpos]) << 5); + } + + protected static void fastpackwithoutmask60(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 60); + out[1 + outpos] = ((in[1 + inpos]) >>> (60 - 56)) + | ((in[2 + inpos]) << 56); + out[2 + outpos] = ((in[2 + inpos]) >>> (60 - 52)) + | ((in[3 + inpos]) << 52); + out[3 + outpos] = ((in[3 + inpos]) >>> (60 - 48)) + | ((in[4 + inpos]) << 48); + out[4 + outpos] = ((in[4 + inpos]) >>> (60 - 44)) + | ((in[5 + inpos]) << 44); + out[5 + outpos] = ((in[5 + inpos]) >>> (60 - 40)) + | ((in[6 + inpos]) << 40); + out[6 + outpos] = ((in[6 + inpos]) >>> (60 - 36)) + | ((in[7 + inpos]) << 36); + out[7 + outpos] = ((in[7 + inpos]) >>> (60 - 32)) + | ((in[8 + inpos]) << 32); + out[8 + outpos] = ((in[8 + inpos]) >>> (60 - 28)) + | ((in[9 + inpos]) << 28); + out[9 + outpos] = ((in[9 + inpos]) >>> (60 - 24)) + | ((in[10 + inpos]) << 24); + out[10 + outpos] = ((in[10 + inpos]) >>> (60 - 20)) + | ((in[11 + inpos]) << 20); + out[11 + outpos] = ((in[11 + inpos]) >>> (60 - 16)) + | ((in[12 + inpos]) << 16); + out[12 + outpos] = ((in[12 + inpos]) >>> (60 - 12)) + | ((in[13 + inpos]) << 12); + out[13 + outpos] = ((in[13 + inpos]) >>> (60 - 8)) + | ((in[14 + inpos]) << 8); + out[14 + outpos] = ((in[14 + inpos]) >>> (60 - 4)) + | ((in[15 + inpos]) << 4); + out[15 + outpos] = in[16 + inpos] + | ((in[17 + inpos]) << 60); + out[16 + outpos] = ((in[17 + inpos]) >>> (60 - 56)) + | ((in[18 + inpos]) << 56); + out[17 + outpos] = ((in[18 + inpos]) >>> (60 - 52)) + | ((in[19 + inpos]) << 52); + out[18 + outpos] = ((in[19 + inpos]) >>> (60 - 48)) + | ((in[20 + inpos]) << 48); + out[19 + outpos] = ((in[20 + inpos]) >>> (60 - 44)) + | ((in[21 + inpos]) << 44); + out[20 + outpos] = ((in[21 + inpos]) >>> (60 - 40)) + | ((in[22 + inpos]) << 40); + out[21 + outpos] = ((in[22 + inpos]) >>> (60 - 36)) + | ((in[23 + inpos]) << 36); + out[22 + outpos] = ((in[23 + inpos]) >>> (60 - 32)) + | ((in[24 + inpos]) << 32); + out[23 + outpos] = ((in[24 + inpos]) >>> (60 - 28)) + | ((in[25 + inpos]) << 28); + out[24 + outpos] = ((in[25 + inpos]) >>> (60 - 24)) + | ((in[26 + inpos]) << 24); + out[25 + outpos] = ((in[26 + inpos]) >>> (60 - 20)) + | ((in[27 + inpos]) << 20); + out[26 + outpos] = ((in[27 + inpos]) >>> (60 - 16)) + | ((in[28 + inpos]) << 16); + out[27 + outpos] = ((in[28 + inpos]) >>> (60 - 12)) + | ((in[29 + inpos]) << 12); + out[28 + outpos] = ((in[29 + inpos]) >>> (60 - 8)) + | ((in[30 + inpos]) << 8); + out[29 + outpos] = ((in[30 + inpos]) >>> (60 - 4)) + | ((in[31 + inpos]) << 4); + out[30 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 60); + out[31 + outpos] = ((in[33 + inpos]) >>> (60 - 56)) + | ((in[34 + inpos]) << 56); + out[32 + outpos] = ((in[34 + inpos]) >>> (60 - 52)) + | ((in[35 + inpos]) << 52); + out[33 + outpos] = ((in[35 + inpos]) >>> (60 - 48)) + | ((in[36 + inpos]) << 48); + out[34 + outpos] = ((in[36 + inpos]) >>> (60 - 44)) + | ((in[37 + inpos]) << 44); + out[35 + outpos] = ((in[37 + inpos]) >>> (60 - 40)) + | ((in[38 + inpos]) << 40); + out[36 + outpos] = ((in[38 + inpos]) >>> (60 - 36)) + | ((in[39 + inpos]) << 36); + out[37 + outpos] = ((in[39 + inpos]) >>> (60 - 32)) + | ((in[40 + inpos]) << 32); + out[38 + outpos] = ((in[40 + inpos]) >>> (60 - 28)) + | ((in[41 + inpos]) << 28); + out[39 + outpos] = ((in[41 + inpos]) >>> (60 - 24)) + | ((in[42 + inpos]) << 24); + out[40 + outpos] = ((in[42 + inpos]) >>> (60 - 20)) + | ((in[43 + inpos]) << 20); + out[41 + outpos] = ((in[43 + inpos]) >>> (60 - 16)) + | ((in[44 + inpos]) << 16); + out[42 + outpos] = ((in[44 + inpos]) >>> (60 - 12)) + | ((in[45 + inpos]) << 12); + out[43 + outpos] = ((in[45 + inpos]) >>> (60 - 8)) + | ((in[46 + inpos]) << 8); + out[44 + outpos] = ((in[46 + inpos]) >>> (60 - 4)) + | ((in[47 + inpos]) << 4); + out[45 + outpos] = in[48 + inpos] + | ((in[49 + inpos]) << 60); + out[46 + outpos] = ((in[49 + inpos]) >>> (60 - 56)) + | ((in[50 + inpos]) << 56); + out[47 + outpos] = ((in[50 + inpos]) >>> (60 - 52)) + | ((in[51 + inpos]) << 52); + out[48 + outpos] = ((in[51 + inpos]) >>> (60 - 48)) + | ((in[52 + inpos]) << 48); + out[49 + outpos] = ((in[52 + inpos]) >>> (60 - 44)) + | ((in[53 + inpos]) << 44); + out[50 + outpos] = ((in[53 + inpos]) >>> (60 - 40)) + | ((in[54 + inpos]) << 40); + out[51 + outpos] = ((in[54 + inpos]) >>> (60 - 36)) + | ((in[55 + inpos]) << 36); + out[52 + outpos] = ((in[55 + inpos]) >>> (60 - 32)) + | ((in[56 + inpos]) << 32); + out[53 + outpos] = ((in[56 + inpos]) >>> (60 - 28)) + | ((in[57 + inpos]) << 28); + out[54 + outpos] = ((in[57 + inpos]) >>> (60 - 24)) + | ((in[58 + inpos]) << 24); + out[55 + outpos] = ((in[58 + inpos]) >>> (60 - 20)) + | ((in[59 + inpos]) << 20); + out[56 + outpos] = ((in[59 + inpos]) >>> (60 - 16)) + | ((in[60 + inpos]) << 16); + out[57 + outpos] = ((in[60 + inpos]) >>> (60 - 12)) + | ((in[61 + inpos]) << 12); + out[58 + outpos] = ((in[61 + inpos]) >>> (60 - 8)) + | ((in[62 + inpos]) << 8); + out[59 + outpos] = ((in[62 + inpos]) >>> (60 - 4)) + | ((in[63 + inpos]) << 4); + } + + protected static void fastpackwithoutmask61(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 61); + out[1 + outpos] = ((in[1 + inpos]) >>> (61 - 58)) + | ((in[2 + inpos]) << 58); + out[2 + outpos] = ((in[2 + inpos]) >>> (61 - 55)) + | ((in[3 + inpos]) << 55); + out[3 + outpos] = ((in[3 + inpos]) >>> (61 - 52)) + | ((in[4 + inpos]) << 52); + out[4 + outpos] = ((in[4 + inpos]) >>> (61 - 49)) + | ((in[5 + inpos]) << 49); + out[5 + outpos] = ((in[5 + inpos]) >>> (61 - 46)) + | ((in[6 + inpos]) << 46); + out[6 + outpos] = ((in[6 + inpos]) >>> (61 - 43)) + | ((in[7 + inpos]) << 43); + out[7 + outpos] = ((in[7 + inpos]) >>> (61 - 40)) + | ((in[8 + inpos]) << 40); + out[8 + outpos] = ((in[8 + inpos]) >>> (61 - 37)) + | ((in[9 + inpos]) << 37); + out[9 + outpos] = ((in[9 + inpos]) >>> (61 - 34)) + | ((in[10 + inpos]) << 34); + out[10 + outpos] = ((in[10 + inpos]) >>> (61 - 31)) + | ((in[11 + inpos]) << 31); + out[11 + outpos] = ((in[11 + inpos]) >>> (61 - 28)) + | ((in[12 + inpos]) << 28); + out[12 + outpos] = ((in[12 + inpos]) >>> (61 - 25)) + | ((in[13 + inpos]) << 25); + out[13 + outpos] = ((in[13 + inpos]) >>> (61 - 22)) + | ((in[14 + inpos]) << 22); + out[14 + outpos] = ((in[14 + inpos]) >>> (61 - 19)) + | ((in[15 + inpos]) << 19); + out[15 + outpos] = ((in[15 + inpos]) >>> (61 - 16)) + | ((in[16 + inpos]) << 16); + out[16 + outpos] = ((in[16 + inpos]) >>> (61 - 13)) + | ((in[17 + inpos]) << 13); + out[17 + outpos] = ((in[17 + inpos]) >>> (61 - 10)) + | ((in[18 + inpos]) << 10); + out[18 + outpos] = ((in[18 + inpos]) >>> (61 - 7)) + | ((in[19 + inpos]) << 7); + out[19 + outpos] = ((in[19 + inpos]) >>> (61 - 4)) + | ((in[20 + inpos]) << 4); + out[20 + outpos] = ((in[20 + inpos]) >>> (61 - 1)) + | ((in[21 + inpos]) << 1) + | ((in[22 + inpos]) << 62); + out[21 + outpos] = ((in[22 + inpos]) >>> (61 - 59)) + | ((in[23 + inpos]) << 59); + out[22 + outpos] = ((in[23 + inpos]) >>> (61 - 56)) + | ((in[24 + inpos]) << 56); + out[23 + outpos] = ((in[24 + inpos]) >>> (61 - 53)) + | ((in[25 + inpos]) << 53); + out[24 + outpos] = ((in[25 + inpos]) >>> (61 - 50)) + | ((in[26 + inpos]) << 50); + out[25 + outpos] = ((in[26 + inpos]) >>> (61 - 47)) + | ((in[27 + inpos]) << 47); + out[26 + outpos] = ((in[27 + inpos]) >>> (61 - 44)) + | ((in[28 + inpos]) << 44); + out[27 + outpos] = ((in[28 + inpos]) >>> (61 - 41)) + | ((in[29 + inpos]) << 41); + out[28 + outpos] = ((in[29 + inpos]) >>> (61 - 38)) + | ((in[30 + inpos]) << 38); + out[29 + outpos] = ((in[30 + inpos]) >>> (61 - 35)) + | ((in[31 + inpos]) << 35); + out[30 + outpos] = ((in[31 + inpos]) >>> (61 - 32)) + | ((in[32 + inpos]) << 32); + out[31 + outpos] = ((in[32 + inpos]) >>> (61 - 29)) + | ((in[33 + inpos]) << 29); + out[32 + outpos] = ((in[33 + inpos]) >>> (61 - 26)) + | ((in[34 + inpos]) << 26); + out[33 + outpos] = ((in[34 + inpos]) >>> (61 - 23)) + | ((in[35 + inpos]) << 23); + out[34 + outpos] = ((in[35 + inpos]) >>> (61 - 20)) + | ((in[36 + inpos]) << 20); + out[35 + outpos] = ((in[36 + inpos]) >>> (61 - 17)) + | ((in[37 + inpos]) << 17); + out[36 + outpos] = ((in[37 + inpos]) >>> (61 - 14)) + | ((in[38 + inpos]) << 14); + out[37 + outpos] = ((in[38 + inpos]) >>> (61 - 11)) + | ((in[39 + inpos]) << 11); + out[38 + outpos] = ((in[39 + inpos]) >>> (61 - 8)) + | ((in[40 + inpos]) << 8); + out[39 + outpos] = ((in[40 + inpos]) >>> (61 - 5)) + | ((in[41 + inpos]) << 5); + out[40 + outpos] = ((in[41 + inpos]) >>> (61 - 2)) + | ((in[42 + inpos]) << 2) + | ((in[43 + inpos]) << 63); + out[41 + outpos] = ((in[43 + inpos]) >>> (61 - 60)) + | ((in[44 + inpos]) << 60); + out[42 + outpos] = ((in[44 + inpos]) >>> (61 - 57)) + | ((in[45 + inpos]) << 57); + out[43 + outpos] = ((in[45 + inpos]) >>> (61 - 54)) + | ((in[46 + inpos]) << 54); + out[44 + outpos] = ((in[46 + inpos]) >>> (61 - 51)) + | ((in[47 + inpos]) << 51); + out[45 + outpos] = ((in[47 + inpos]) >>> (61 - 48)) + | ((in[48 + inpos]) << 48); + out[46 + outpos] = ((in[48 + inpos]) >>> (61 - 45)) + | ((in[49 + inpos]) << 45); + out[47 + outpos] = ((in[49 + inpos]) >>> (61 - 42)) + | ((in[50 + inpos]) << 42); + out[48 + outpos] = ((in[50 + inpos]) >>> (61 - 39)) + | ((in[51 + inpos]) << 39); + out[49 + outpos] = ((in[51 + inpos]) >>> (61 - 36)) + | ((in[52 + inpos]) << 36); + out[50 + outpos] = ((in[52 + inpos]) >>> (61 - 33)) + | ((in[53 + inpos]) << 33); + out[51 + outpos] = ((in[53 + inpos]) >>> (61 - 30)) + | ((in[54 + inpos]) << 30); + out[52 + outpos] = ((in[54 + inpos]) >>> (61 - 27)) + | ((in[55 + inpos]) << 27); + out[53 + outpos] = ((in[55 + inpos]) >>> (61 - 24)) + | ((in[56 + inpos]) << 24); + out[54 + outpos] = ((in[56 + inpos]) >>> (61 - 21)) + | ((in[57 + inpos]) << 21); + out[55 + outpos] = ((in[57 + inpos]) >>> (61 - 18)) + | ((in[58 + inpos]) << 18); + out[56 + outpos] = ((in[58 + inpos]) >>> (61 - 15)) + | ((in[59 + inpos]) << 15); + out[57 + outpos] = ((in[59 + inpos]) >>> (61 - 12)) + | ((in[60 + inpos]) << 12); + out[58 + outpos] = ((in[60 + inpos]) >>> (61 - 9)) + | ((in[61 + inpos]) << 9); + out[59 + outpos] = ((in[61 + inpos]) >>> (61 - 6)) + | ((in[62 + inpos]) << 6); + out[60 + outpos] = ((in[62 + inpos]) >>> (61 - 3)) + | ((in[63 + inpos]) << 3); + } + + protected static void fastpackwithoutmask62(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 62); + out[1 + outpos] = ((in[1 + inpos]) >>> (62 - 60)) + | ((in[2 + inpos]) << 60); + out[2 + outpos] = ((in[2 + inpos]) >>> (62 - 58)) + | ((in[3 + inpos]) << 58); + out[3 + outpos] = ((in[3 + inpos]) >>> (62 - 56)) + | ((in[4 + inpos]) << 56); + out[4 + outpos] = ((in[4 + inpos]) >>> (62 - 54)) + | ((in[5 + inpos]) << 54); + out[5 + outpos] = ((in[5 + inpos]) >>> (62 - 52)) + | ((in[6 + inpos]) << 52); + out[6 + outpos] = ((in[6 + inpos]) >>> (62 - 50)) + | ((in[7 + inpos]) << 50); + out[7 + outpos] = ((in[7 + inpos]) >>> (62 - 48)) + | ((in[8 + inpos]) << 48); + out[8 + outpos] = ((in[8 + inpos]) >>> (62 - 46)) + | ((in[9 + inpos]) << 46); + out[9 + outpos] = ((in[9 + inpos]) >>> (62 - 44)) + | ((in[10 + inpos]) << 44); + out[10 + outpos] = ((in[10 + inpos]) >>> (62 - 42)) + | ((in[11 + inpos]) << 42); + out[11 + outpos] = ((in[11 + inpos]) >>> (62 - 40)) + | ((in[12 + inpos]) << 40); + out[12 + outpos] = ((in[12 + inpos]) >>> (62 - 38)) + | ((in[13 + inpos]) << 38); + out[13 + outpos] = ((in[13 + inpos]) >>> (62 - 36)) + | ((in[14 + inpos]) << 36); + out[14 + outpos] = ((in[14 + inpos]) >>> (62 - 34)) + | ((in[15 + inpos]) << 34); + out[15 + outpos] = ((in[15 + inpos]) >>> (62 - 32)) + | ((in[16 + inpos]) << 32); + out[16 + outpos] = ((in[16 + inpos]) >>> (62 - 30)) + | ((in[17 + inpos]) << 30); + out[17 + outpos] = ((in[17 + inpos]) >>> (62 - 28)) + | ((in[18 + inpos]) << 28); + out[18 + outpos] = ((in[18 + inpos]) >>> (62 - 26)) + | ((in[19 + inpos]) << 26); + out[19 + outpos] = ((in[19 + inpos]) >>> (62 - 24)) + | ((in[20 + inpos]) << 24); + out[20 + outpos] = ((in[20 + inpos]) >>> (62 - 22)) + | ((in[21 + inpos]) << 22); + out[21 + outpos] = ((in[21 + inpos]) >>> (62 - 20)) + | ((in[22 + inpos]) << 20); + out[22 + outpos] = ((in[22 + inpos]) >>> (62 - 18)) + | ((in[23 + inpos]) << 18); + out[23 + outpos] = ((in[23 + inpos]) >>> (62 - 16)) + | ((in[24 + inpos]) << 16); + out[24 + outpos] = ((in[24 + inpos]) >>> (62 - 14)) + | ((in[25 + inpos]) << 14); + out[25 + outpos] = ((in[25 + inpos]) >>> (62 - 12)) + | ((in[26 + inpos]) << 12); + out[26 + outpos] = ((in[26 + inpos]) >>> (62 - 10)) + | ((in[27 + inpos]) << 10); + out[27 + outpos] = ((in[27 + inpos]) >>> (62 - 8)) + | ((in[28 + inpos]) << 8); + out[28 + outpos] = ((in[28 + inpos]) >>> (62 - 6)) + | ((in[29 + inpos]) << 6); + out[29 + outpos] = ((in[29 + inpos]) >>> (62 - 4)) + | ((in[30 + inpos]) << 4); + out[30 + outpos] = ((in[30 + inpos]) >>> (62 - 2)) + | ((in[31 + inpos]) << 2); + out[31 + outpos] = in[32 + inpos] + | ((in[33 + inpos]) << 62); + out[32 + outpos] = ((in[33 + inpos]) >>> (62 - 60)) + | ((in[34 + inpos]) << 60); + out[33 + outpos] = ((in[34 + inpos]) >>> (62 - 58)) + | ((in[35 + inpos]) << 58); + out[34 + outpos] = ((in[35 + inpos]) >>> (62 - 56)) + | ((in[36 + inpos]) << 56); + out[35 + outpos] = ((in[36 + inpos]) >>> (62 - 54)) + | ((in[37 + inpos]) << 54); + out[36 + outpos] = ((in[37 + inpos]) >>> (62 - 52)) + | ((in[38 + inpos]) << 52); + out[37 + outpos] = ((in[38 + inpos]) >>> (62 - 50)) + | ((in[39 + inpos]) << 50); + out[38 + outpos] = ((in[39 + inpos]) >>> (62 - 48)) + | ((in[40 + inpos]) << 48); + out[39 + outpos] = ((in[40 + inpos]) >>> (62 - 46)) + | ((in[41 + inpos]) << 46); + out[40 + outpos] = ((in[41 + inpos]) >>> (62 - 44)) + | ((in[42 + inpos]) << 44); + out[41 + outpos] = ((in[42 + inpos]) >>> (62 - 42)) + | ((in[43 + inpos]) << 42); + out[42 + outpos] = ((in[43 + inpos]) >>> (62 - 40)) + | ((in[44 + inpos]) << 40); + out[43 + outpos] = ((in[44 + inpos]) >>> (62 - 38)) + | ((in[45 + inpos]) << 38); + out[44 + outpos] = ((in[45 + inpos]) >>> (62 - 36)) + | ((in[46 + inpos]) << 36); + out[45 + outpos] = ((in[46 + inpos]) >>> (62 - 34)) + | ((in[47 + inpos]) << 34); + out[46 + outpos] = ((in[47 + inpos]) >>> (62 - 32)) + | ((in[48 + inpos]) << 32); + out[47 + outpos] = ((in[48 + inpos]) >>> (62 - 30)) + | ((in[49 + inpos]) << 30); + out[48 + outpos] = ((in[49 + inpos]) >>> (62 - 28)) + | ((in[50 + inpos]) << 28); + out[49 + outpos] = ((in[50 + inpos]) >>> (62 - 26)) + | ((in[51 + inpos]) << 26); + out[50 + outpos] = ((in[51 + inpos]) >>> (62 - 24)) + | ((in[52 + inpos]) << 24); + out[51 + outpos] = ((in[52 + inpos]) >>> (62 - 22)) + | ((in[53 + inpos]) << 22); + out[52 + outpos] = ((in[53 + inpos]) >>> (62 - 20)) + | ((in[54 + inpos]) << 20); + out[53 + outpos] = ((in[54 + inpos]) >>> (62 - 18)) + | ((in[55 + inpos]) << 18); + out[54 + outpos] = ((in[55 + inpos]) >>> (62 - 16)) + | ((in[56 + inpos]) << 16); + out[55 + outpos] = ((in[56 + inpos]) >>> (62 - 14)) + | ((in[57 + inpos]) << 14); + out[56 + outpos] = ((in[57 + inpos]) >>> (62 - 12)) + | ((in[58 + inpos]) << 12); + out[57 + outpos] = ((in[58 + inpos]) >>> (62 - 10)) + | ((in[59 + inpos]) << 10); + out[58 + outpos] = ((in[59 + inpos]) >>> (62 - 8)) + | ((in[60 + inpos]) << 8); + out[59 + outpos] = ((in[60 + inpos]) >>> (62 - 6)) + | ((in[61 + inpos]) << 6); + out[60 + outpos] = ((in[61 + inpos]) >>> (62 - 4)) + | ((in[62 + inpos]) << 4); + out[61 + outpos] = ((in[62 + inpos]) >>> (62 - 2)) + | ((in[63 + inpos]) << 2); + } + + protected static void fastpackwithoutmask63(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = in[inpos] | ((in[1 + inpos]) << 63); + out[1 + outpos] = ((in[1 + inpos]) >>> (63 - 62)) + | ((in[2 + inpos]) << 62); + out[2 + outpos] = ((in[2 + inpos]) >>> (63 - 61)) + | ((in[3 + inpos]) << 61); + out[3 + outpos] = ((in[3 + inpos]) >>> (63 - 60)) + | ((in[4 + inpos]) << 60); + out[4 + outpos] = ((in[4 + inpos]) >>> (63 - 59)) + | ((in[5 + inpos]) << 59); + out[5 + outpos] = ((in[5 + inpos]) >>> (63 - 58)) + | ((in[6 + inpos]) << 58); + out[6 + outpos] = ((in[6 + inpos]) >>> (63 - 57)) + | ((in[7 + inpos]) << 57); + out[7 + outpos] = ((in[7 + inpos]) >>> (63 - 56)) + | ((in[8 + inpos]) << 56); + out[8 + outpos] = ((in[8 + inpos]) >>> (63 - 55)) + | ((in[9 + inpos]) << 55); + out[9 + outpos] = ((in[9 + inpos]) >>> (63 - 54)) + | ((in[10 + inpos]) << 54); + out[10 + outpos] = ((in[10 + inpos]) >>> (63 - 53)) + | ((in[11 + inpos]) << 53); + out[11 + outpos] = ((in[11 + inpos]) >>> (63 - 52)) + | ((in[12 + inpos]) << 52); + out[12 + outpos] = ((in[12 + inpos]) >>> (63 - 51)) + | ((in[13 + inpos]) << 51); + out[13 + outpos] = ((in[13 + inpos]) >>> (63 - 50)) + | ((in[14 + inpos]) << 50); + out[14 + outpos] = ((in[14 + inpos]) >>> (63 - 49)) + | ((in[15 + inpos]) << 49); + out[15 + outpos] = ((in[15 + inpos]) >>> (63 - 48)) + | ((in[16 + inpos]) << 48); + out[16 + outpos] = ((in[16 + inpos]) >>> (63 - 47)) + | ((in[17 + inpos]) << 47); + out[17 + outpos] = ((in[17 + inpos]) >>> (63 - 46)) + | ((in[18 + inpos]) << 46); + out[18 + outpos] = ((in[18 + inpos]) >>> (63 - 45)) + | ((in[19 + inpos]) << 45); + out[19 + outpos] = ((in[19 + inpos]) >>> (63 - 44)) + | ((in[20 + inpos]) << 44); + out[20 + outpos] = ((in[20 + inpos]) >>> (63 - 43)) + | ((in[21 + inpos]) << 43); + out[21 + outpos] = ((in[21 + inpos]) >>> (63 - 42)) + | ((in[22 + inpos]) << 42); + out[22 + outpos] = ((in[22 + inpos]) >>> (63 - 41)) + | ((in[23 + inpos]) << 41); + out[23 + outpos] = ((in[23 + inpos]) >>> (63 - 40)) + | ((in[24 + inpos]) << 40); + out[24 + outpos] = ((in[24 + inpos]) >>> (63 - 39)) + | ((in[25 + inpos]) << 39); + out[25 + outpos] = ((in[25 + inpos]) >>> (63 - 38)) + | ((in[26 + inpos]) << 38); + out[26 + outpos] = ((in[26 + inpos]) >>> (63 - 37)) + | ((in[27 + inpos]) << 37); + out[27 + outpos] = ((in[27 + inpos]) >>> (63 - 36)) + | ((in[28 + inpos]) << 36); + out[28 + outpos] = ((in[28 + inpos]) >>> (63 - 35)) + | ((in[29 + inpos]) << 35); + out[29 + outpos] = ((in[29 + inpos]) >>> (63 - 34)) + | ((in[30 + inpos]) << 34); + out[30 + outpos] = ((in[30 + inpos]) >>> (63 - 33)) + | ((in[31 + inpos]) << 33); + out[31 + outpos] = ((in[31 + inpos]) >>> (63 - 32)) + | ((in[32 + inpos]) << 32); + out[32 + outpos] = ((in[32 + inpos]) >>> (63 - 31)) + | ((in[33 + inpos]) << 31); + out[33 + outpos] = ((in[33 + inpos]) >>> (63 - 30)) + | ((in[34 + inpos]) << 30); + out[34 + outpos] = ((in[34 + inpos]) >>> (63 - 29)) + | ((in[35 + inpos]) << 29); + out[35 + outpos] = ((in[35 + inpos]) >>> (63 - 28)) + | ((in[36 + inpos]) << 28); + out[36 + outpos] = ((in[36 + inpos]) >>> (63 - 27)) + | ((in[37 + inpos]) << 27); + out[37 + outpos] = ((in[37 + inpos]) >>> (63 - 26)) + | ((in[38 + inpos]) << 26); + out[38 + outpos] = ((in[38 + inpos]) >>> (63 - 25)) + | ((in[39 + inpos]) << 25); + out[39 + outpos] = ((in[39 + inpos]) >>> (63 - 24)) + | ((in[40 + inpos]) << 24); + out[40 + outpos] = ((in[40 + inpos]) >>> (63 - 23)) + | ((in[41 + inpos]) << 23); + out[41 + outpos] = ((in[41 + inpos]) >>> (63 - 22)) + | ((in[42 + inpos]) << 22); + out[42 + outpos] = ((in[42 + inpos]) >>> (63 - 21)) + | ((in[43 + inpos]) << 21); + out[43 + outpos] = ((in[43 + inpos]) >>> (63 - 20)) + | ((in[44 + inpos]) << 20); + out[44 + outpos] = ((in[44 + inpos]) >>> (63 - 19)) + | ((in[45 + inpos]) << 19); + out[45 + outpos] = ((in[45 + inpos]) >>> (63 - 18)) + | ((in[46 + inpos]) << 18); + out[46 + outpos] = ((in[46 + inpos]) >>> (63 - 17)) + | ((in[47 + inpos]) << 17); + out[47 + outpos] = ((in[47 + inpos]) >>> (63 - 16)) + | ((in[48 + inpos]) << 16); + out[48 + outpos] = ((in[48 + inpos]) >>> (63 - 15)) + | ((in[49 + inpos]) << 15); + out[49 + outpos] = ((in[49 + inpos]) >>> (63 - 14)) + | ((in[50 + inpos]) << 14); + out[50 + outpos] = ((in[50 + inpos]) >>> (63 - 13)) + | ((in[51 + inpos]) << 13); + out[51 + outpos] = ((in[51 + inpos]) >>> (63 - 12)) + | ((in[52 + inpos]) << 12); + out[52 + outpos] = ((in[52 + inpos]) >>> (63 - 11)) + | ((in[53 + inpos]) << 11); + out[53 + outpos] = ((in[53 + inpos]) >>> (63 - 10)) + | ((in[54 + inpos]) << 10); + out[54 + outpos] = ((in[54 + inpos]) >>> (63 - 9)) + | ((in[55 + inpos]) << 9); + out[55 + outpos] = ((in[55 + inpos]) >>> (63 - 8)) + | ((in[56 + inpos]) << 8); + out[56 + outpos] = ((in[56 + inpos]) >>> (63 - 7)) + | ((in[57 + inpos]) << 7); + out[57 + outpos] = ((in[57 + inpos]) >>> (63 - 6)) + | ((in[58 + inpos]) << 6); + out[58 + outpos] = ((in[58 + inpos]) >>> (63 - 5)) + | ((in[59 + inpos]) << 5); + out[59 + outpos] = ((in[59 + inpos]) >>> (63 - 4)) + | ((in[60 + inpos]) << 4); + out[60 + outpos] = ((in[60 + inpos]) >>> (63 - 3)) + | ((in[61 + inpos]) << 3); + out[61 + outpos] = ((in[61 + inpos]) >>> (63 - 2)) + | ((in[62 + inpos]) << 2); + out[62 + outpos] = ((in[62 + inpos]) >>> (63 - 1)) + | ((in[63 + inpos]) << 1); + } + protected static void fastpackwithoutmask64(final long[] in, int inpos, final long[] out, int outpos) { System.arraycopy(in, inpos, out, outpos, 64); @@ -102,14 +6336,204 @@ protected static void slowpackwithoutmask(final long[] in, int inpos, */ public static void fastunpack(final long[] in, final int inpos, final long[] out, final int outpos, final int bit) { - if (bit == 0) { - fastunpack0(in, inpos, out, outpos); - } else if (bit == 64) { - fastunpack64(in, inpos, out, outpos); - } else if (bit > 0 && bit < 64) { - slowunpack(in, inpos, out, outpos, bit); - } else { - throw new IllegalArgumentException("Unsupported bit width: " + bit); + switch (bit) { + case 0: + fastunpack0(in, inpos, out, outpos); + break; + case 1: + fastunpack1(in, inpos, out, outpos); + break; + case 2: + fastunpack2(in, inpos, out, outpos); + break; + case 3: + fastunpack3(in, inpos, out, outpos); + break; + case 4: + fastunpack4(in, inpos, out, outpos); + break; + case 5: + fastunpack5(in, inpos, out, outpos); + break; + case 6: + fastunpack6(in, inpos, out, outpos); + break; + case 7: + fastunpack7(in, inpos, out, outpos); + break; + case 8: + fastunpack8(in, inpos, out, outpos); + break; + case 9: + fastunpack9(in, inpos, out, outpos); + break; + case 10: + fastunpack10(in, inpos, out, outpos); + break; + case 11: + fastunpack11(in, inpos, out, outpos); + break; + case 12: + fastunpack12(in, inpos, out, outpos); + break; + case 13: + fastunpack13(in, inpos, out, outpos); + break; + case 14: + fastunpack14(in, inpos, out, outpos); + break; + case 15: + fastunpack15(in, inpos, out, outpos); + break; + case 16: + fastunpack16(in, inpos, out, outpos); + break; + case 17: + fastunpack17(in, inpos, out, outpos); + break; + case 18: + fastunpack18(in, inpos, out, outpos); + break; + case 19: + fastunpack19(in, inpos, out, outpos); + break; + case 20: + fastunpack20(in, inpos, out, outpos); + break; + case 21: + fastunpack21(in, inpos, out, outpos); + break; + case 22: + fastunpack22(in, inpos, out, outpos); + break; + case 23: + fastunpack23(in, inpos, out, outpos); + break; + case 24: + fastunpack24(in, inpos, out, outpos); + break; + case 25: + fastunpack25(in, inpos, out, outpos); + break; + case 26: + fastunpack26(in, inpos, out, outpos); + break; + case 27: + fastunpack27(in, inpos, out, outpos); + break; + case 28: + fastunpack28(in, inpos, out, outpos); + break; + case 29: + fastunpack29(in, inpos, out, outpos); + break; + case 30: + fastunpack30(in, inpos, out, outpos); + break; + case 31: + fastunpack31(in, inpos, out, outpos); + break; + case 32: + fastunpack32(in, inpos, out, outpos); + break; + case 33: + fastunpack33(in, inpos, out, outpos); + break; + case 34: + fastunpack34(in, inpos, out, outpos); + break; + case 35: + fastunpack35(in, inpos, out, outpos); + break; + case 36: + fastunpack36(in, inpos, out, outpos); + break; + case 37: + fastunpack37(in, inpos, out, outpos); + break; + case 38: + fastunpack38(in, inpos, out, outpos); + break; + case 39: + fastunpack39(in, inpos, out, outpos); + break; + case 40: + fastunpack40(in, inpos, out, outpos); + break; + case 41: + fastunpack41(in, inpos, out, outpos); + break; + case 42: + fastunpack42(in, inpos, out, outpos); + break; + case 43: + fastunpack43(in, inpos, out, outpos); + break; + case 44: + fastunpack44(in, inpos, out, outpos); + break; + case 45: + fastunpack45(in, inpos, out, outpos); + break; + case 46: + fastunpack46(in, inpos, out, outpos); + break; + case 47: + fastunpack47(in, inpos, out, outpos); + break; + case 48: + fastunpack48(in, inpos, out, outpos); + break; + case 49: + fastunpack49(in, inpos, out, outpos); + break; + case 50: + fastunpack50(in, inpos, out, outpos); + break; + case 51: + fastunpack51(in, inpos, out, outpos); + break; + case 52: + fastunpack52(in, inpos, out, outpos); + break; + case 53: + fastunpack53(in, inpos, out, outpos); + break; + case 54: + fastunpack54(in, inpos, out, outpos); + break; + case 55: + fastunpack55(in, inpos, out, outpos); + break; + case 56: + fastunpack56(in, inpos, out, outpos); + break; + case 57: + fastunpack57(in, inpos, out, outpos); + break; + case 58: + fastunpack58(in, inpos, out, outpos); + break; + case 59: + fastunpack59(in, inpos, out, outpos); + break; + case 60: + fastunpack60(in, inpos, out, outpos); + break; + case 61: + fastunpack61(in, inpos, out, outpos); + break; + case 62: + fastunpack62(in, inpos, out, outpos); + break; + case 63: + fastunpack63(in, inpos, out, outpos); + break; + case 64: + fastunpack64(in, inpos, out, outpos); + break; + default: + throw new IllegalArgumentException("Unsupported bit width: " + bit); } } @@ -118,6 +6542,6114 @@ protected static void fastunpack0(final long[] in, int inpos, final long[] out, int outpos) { Arrays.fill(out, outpos, outpos + 64, 0); } + + protected static void fastunpack1(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 1L); + out[1 + outpos] = ((in[inpos] >>> 1) & 1L); + out[2 + outpos] = ((in[inpos] >>> 2) & 1L); + out[3 + outpos] = ((in[inpos] >>> 3) & 1L); + out[4 + outpos] = ((in[inpos] >>> 4) & 1L); + out[5 + outpos] = ((in[inpos] >>> 5) & 1L); + out[6 + outpos] = ((in[inpos] >>> 6) & 1L); + out[7 + outpos] = ((in[inpos] >>> 7) & 1L); + out[8 + outpos] = ((in[inpos] >>> 8) & 1L); + out[9 + outpos] = ((in[inpos] >>> 9) & 1L); + out[10 + outpos] = ((in[inpos] >>> 10) & 1L); + out[11 + outpos] = ((in[inpos] >>> 11) & 1L); + out[12 + outpos] = ((in[inpos] >>> 12) & 1L); + out[13 + outpos] = ((in[inpos] >>> 13) & 1L); + out[14 + outpos] = ((in[inpos] >>> 14) & 1L); + out[15 + outpos] = ((in[inpos] >>> 15) & 1L); + out[16 + outpos] = ((in[inpos] >>> 16) & 1L); + out[17 + outpos] = ((in[inpos] >>> 17) & 1L); + out[18 + outpos] = ((in[inpos] >>> 18) & 1L); + out[19 + outpos] = ((in[inpos] >>> 19) & 1L); + out[20 + outpos] = ((in[inpos] >>> 20) & 1L); + out[21 + outpos] = ((in[inpos] >>> 21) & 1L); + out[22 + outpos] = ((in[inpos] >>> 22) & 1L); + out[23 + outpos] = ((in[inpos] >>> 23) & 1L); + out[24 + outpos] = ((in[inpos] >>> 24) & 1L); + out[25 + outpos] = ((in[inpos] >>> 25) & 1L); + out[26 + outpos] = ((in[inpos] >>> 26) & 1L); + out[27 + outpos] = ((in[inpos] >>> 27) & 1L); + out[28 + outpos] = ((in[inpos] >>> 28) & 1L); + out[29 + outpos] = ((in[inpos] >>> 29) & 1L); + out[30 + outpos] = ((in[inpos] >>> 30) & 1L); + out[31 + outpos] = ((in[inpos] >>> 31) & 1L); + out[32 + outpos] = ((in[inpos] >>> 32) & 1L); + out[33 + outpos] = ((in[inpos] >>> 33) & 1L); + out[34 + outpos] = ((in[inpos] >>> 34) & 1L); + out[35 + outpos] = ((in[inpos] >>> 35) & 1L); + out[36 + outpos] = ((in[inpos] >>> 36) & 1L); + out[37 + outpos] = ((in[inpos] >>> 37) & 1L); + out[38 + outpos] = ((in[inpos] >>> 38) & 1L); + out[39 + outpos] = ((in[inpos] >>> 39) & 1L); + out[40 + outpos] = ((in[inpos] >>> 40) & 1L); + out[41 + outpos] = ((in[inpos] >>> 41) & 1L); + out[42 + outpos] = ((in[inpos] >>> 42) & 1L); + out[43 + outpos] = ((in[inpos] >>> 43) & 1L); + out[44 + outpos] = ((in[inpos] >>> 44) & 1L); + out[45 + outpos] = ((in[inpos] >>> 45) & 1L); + out[46 + outpos] = ((in[inpos] >>> 46) & 1L); + out[47 + outpos] = ((in[inpos] >>> 47) & 1L); + out[48 + outpos] = ((in[inpos] >>> 48) & 1L); + out[49 + outpos] = ((in[inpos] >>> 49) & 1L); + out[50 + outpos] = ((in[inpos] >>> 50) & 1L); + out[51 + outpos] = ((in[inpos] >>> 51) & 1L); + out[52 + outpos] = ((in[inpos] >>> 52) & 1L); + out[53 + outpos] = ((in[inpos] >>> 53) & 1L); + out[54 + outpos] = ((in[inpos] >>> 54) & 1L); + out[55 + outpos] = ((in[inpos] >>> 55) & 1L); + out[56 + outpos] = ((in[inpos] >>> 56) & 1L); + out[57 + outpos] = ((in[inpos] >>> 57) & 1L); + out[58 + outpos] = ((in[inpos] >>> 58) & 1L); + out[59 + outpos] = ((in[inpos] >>> 59) & 1L); + out[60 + outpos] = ((in[inpos] >>> 60) & 1L); + out[61 + outpos] = ((in[inpos] >>> 61) & 1L); + out[62 + outpos] = ((in[inpos] >>> 62) & 1L); + out[63 + outpos] = (in[inpos] >>> 63); + } + + protected static void fastunpack2(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 3L); + out[1 + outpos] = ((in[inpos] >>> 2) & 3L); + out[2 + outpos] = ((in[inpos] >>> 4) & 3L); + out[3 + outpos] = ((in[inpos] >>> 6) & 3L); + out[4 + outpos] = ((in[inpos] >>> 8) & 3L); + out[5 + outpos] = ((in[inpos] >>> 10) & 3L); + out[6 + outpos] = ((in[inpos] >>> 12) & 3L); + out[7 + outpos] = ((in[inpos] >>> 14) & 3L); + out[8 + outpos] = ((in[inpos] >>> 16) & 3L); + out[9 + outpos] = ((in[inpos] >>> 18) & 3L); + out[10 + outpos] = ((in[inpos] >>> 20) & 3L); + out[11 + outpos] = ((in[inpos] >>> 22) & 3L); + out[12 + outpos] = ((in[inpos] >>> 24) & 3L); + out[13 + outpos] = ((in[inpos] >>> 26) & 3L); + out[14 + outpos] = ((in[inpos] >>> 28) & 3L); + out[15 + outpos] = ((in[inpos] >>> 30) & 3L); + out[16 + outpos] = ((in[inpos] >>> 32) & 3L); + out[17 + outpos] = ((in[inpos] >>> 34) & 3L); + out[18 + outpos] = ((in[inpos] >>> 36) & 3L); + out[19 + outpos] = ((in[inpos] >>> 38) & 3L); + out[20 + outpos] = ((in[inpos] >>> 40) & 3L); + out[21 + outpos] = ((in[inpos] >>> 42) & 3L); + out[22 + outpos] = ((in[inpos] >>> 44) & 3L); + out[23 + outpos] = ((in[inpos] >>> 46) & 3L); + out[24 + outpos] = ((in[inpos] >>> 48) & 3L); + out[25 + outpos] = ((in[inpos] >>> 50) & 3L); + out[26 + outpos] = ((in[inpos] >>> 52) & 3L); + out[27 + outpos] = ((in[inpos] >>> 54) & 3L); + out[28 + outpos] = ((in[inpos] >>> 56) & 3L); + out[29 + outpos] = ((in[inpos] >>> 58) & 3L); + out[30 + outpos] = ((in[inpos] >>> 60) & 3L); + out[31 + outpos] = (in[inpos] >>> 62); + out[32 + outpos] = (in[1 + inpos] & 3L); + out[33 + outpos] = ((in[1 + inpos] >>> 2) & 3L); + out[34 + outpos] = ((in[1 + inpos] >>> 4) & 3L); + out[35 + outpos] = ((in[1 + inpos] >>> 6) & 3L); + out[36 + outpos] = ((in[1 + inpos] >>> 8) & 3L); + out[37 + outpos] = ((in[1 + inpos] >>> 10) & 3L); + out[38 + outpos] = ((in[1 + inpos] >>> 12) & 3L); + out[39 + outpos] = ((in[1 + inpos] >>> 14) & 3L); + out[40 + outpos] = ((in[1 + inpos] >>> 16) & 3L); + out[41 + outpos] = ((in[1 + inpos] >>> 18) & 3L); + out[42 + outpos] = ((in[1 + inpos] >>> 20) & 3L); + out[43 + outpos] = ((in[1 + inpos] >>> 22) & 3L); + out[44 + outpos] = ((in[1 + inpos] >>> 24) & 3L); + out[45 + outpos] = ((in[1 + inpos] >>> 26) & 3L); + out[46 + outpos] = ((in[1 + inpos] >>> 28) & 3L); + out[47 + outpos] = ((in[1 + inpos] >>> 30) & 3L); + out[48 + outpos] = ((in[1 + inpos] >>> 32) & 3L); + out[49 + outpos] = ((in[1 + inpos] >>> 34) & 3L); + out[50 + outpos] = ((in[1 + inpos] >>> 36) & 3L); + out[51 + outpos] = ((in[1 + inpos] >>> 38) & 3L); + out[52 + outpos] = ((in[1 + inpos] >>> 40) & 3L); + out[53 + outpos] = ((in[1 + inpos] >>> 42) & 3L); + out[54 + outpos] = ((in[1 + inpos] >>> 44) & 3L); + out[55 + outpos] = ((in[1 + inpos] >>> 46) & 3L); + out[56 + outpos] = ((in[1 + inpos] >>> 48) & 3L); + out[57 + outpos] = ((in[1 + inpos] >>> 50) & 3L); + out[58 + outpos] = ((in[1 + inpos] >>> 52) & 3L); + out[59 + outpos] = ((in[1 + inpos] >>> 54) & 3L); + out[60 + outpos] = ((in[1 + inpos] >>> 56) & 3L); + out[61 + outpos] = ((in[1 + inpos] >>> 58) & 3L); + out[62 + outpos] = ((in[1 + inpos] >>> 60) & 3L); + out[63 + outpos] = (in[1 + inpos] >>> 62); + } + + protected static void fastunpack3(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 7L); + out[1 + outpos] = ((in[inpos] >>> 3) & 7L); + out[2 + outpos] = ((in[inpos] >>> 6) & 7L); + out[3 + outpos] = ((in[inpos] >>> 9) & 7L); + out[4 + outpos] = ((in[inpos] >>> 12) & 7L); + out[5 + outpos] = ((in[inpos] >>> 15) & 7L); + out[6 + outpos] = ((in[inpos] >>> 18) & 7L); + out[7 + outpos] = ((in[inpos] >>> 21) & 7L); + out[8 + outpos] = ((in[inpos] >>> 24) & 7L); + out[9 + outpos] = ((in[inpos] >>> 27) & 7L); + out[10 + outpos] = ((in[inpos] >>> 30) & 7L); + out[11 + outpos] = ((in[inpos] >>> 33) & 7L); + out[12 + outpos] = ((in[inpos] >>> 36) & 7L); + out[13 + outpos] = ((in[inpos] >>> 39) & 7L); + out[14 + outpos] = ((in[inpos] >>> 42) & 7L); + out[15 + outpos] = ((in[inpos] >>> 45) & 7L); + out[16 + outpos] = ((in[inpos] >>> 48) & 7L); + out[17 + outpos] = ((in[inpos] >>> 51) & 7L); + out[18 + outpos] = ((in[inpos] >>> 54) & 7L); + out[19 + outpos] = ((in[inpos] >>> 57) & 7L); + out[20 + outpos] = ((in[inpos] >>> 60) & 7L); + out[21 + outpos] = (in[inpos] >>> 63) + | ((in[1 + inpos] & 3L) << (3 - 2)); + out[22 + outpos] = ((in[1 + inpos] >>> 2) & 7L); + out[23 + outpos] = ((in[1 + inpos] >>> 5) & 7L); + out[24 + outpos] = ((in[1 + inpos] >>> 8) & 7L); + out[25 + outpos] = ((in[1 + inpos] >>> 11) & 7L); + out[26 + outpos] = ((in[1 + inpos] >>> 14) & 7L); + out[27 + outpos] = ((in[1 + inpos] >>> 17) & 7L); + out[28 + outpos] = ((in[1 + inpos] >>> 20) & 7L); + out[29 + outpos] = ((in[1 + inpos] >>> 23) & 7L); + out[30 + outpos] = ((in[1 + inpos] >>> 26) & 7L); + out[31 + outpos] = ((in[1 + inpos] >>> 29) & 7L); + out[32 + outpos] = ((in[1 + inpos] >>> 32) & 7L); + out[33 + outpos] = ((in[1 + inpos] >>> 35) & 7L); + out[34 + outpos] = ((in[1 + inpos] >>> 38) & 7L); + out[35 + outpos] = ((in[1 + inpos] >>> 41) & 7L); + out[36 + outpos] = ((in[1 + inpos] >>> 44) & 7L); + out[37 + outpos] = ((in[1 + inpos] >>> 47) & 7L); + out[38 + outpos] = ((in[1 + inpos] >>> 50) & 7L); + out[39 + outpos] = ((in[1 + inpos] >>> 53) & 7L); + out[40 + outpos] = ((in[1 + inpos] >>> 56) & 7L); + out[41 + outpos] = ((in[1 + inpos] >>> 59) & 7L); + out[42 + outpos] = (in[1 + inpos] >>> 62) + | ((in[2 + inpos] & 1L) << (3 - 1)); + out[43 + outpos] = ((in[2 + inpos] >>> 1) & 7L); + out[44 + outpos] = ((in[2 + inpos] >>> 4) & 7L); + out[45 + outpos] = ((in[2 + inpos] >>> 7) & 7L); + out[46 + outpos] = ((in[2 + inpos] >>> 10) & 7L); + out[47 + outpos] = ((in[2 + inpos] >>> 13) & 7L); + out[48 + outpos] = ((in[2 + inpos] >>> 16) & 7L); + out[49 + outpos] = ((in[2 + inpos] >>> 19) & 7L); + out[50 + outpos] = ((in[2 + inpos] >>> 22) & 7L); + out[51 + outpos] = ((in[2 + inpos] >>> 25) & 7L); + out[52 + outpos] = ((in[2 + inpos] >>> 28) & 7L); + out[53 + outpos] = ((in[2 + inpos] >>> 31) & 7L); + out[54 + outpos] = ((in[2 + inpos] >>> 34) & 7L); + out[55 + outpos] = ((in[2 + inpos] >>> 37) & 7L); + out[56 + outpos] = ((in[2 + inpos] >>> 40) & 7L); + out[57 + outpos] = ((in[2 + inpos] >>> 43) & 7L); + out[58 + outpos] = ((in[2 + inpos] >>> 46) & 7L); + out[59 + outpos] = ((in[2 + inpos] >>> 49) & 7L); + out[60 + outpos] = ((in[2 + inpos] >>> 52) & 7L); + out[61 + outpos] = ((in[2 + inpos] >>> 55) & 7L); + out[62 + outpos] = ((in[2 + inpos] >>> 58) & 7L); + out[63 + outpos] = (in[2 + inpos] >>> 61); + } + + protected static void fastunpack4(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 15L); + out[1 + outpos] = ((in[inpos] >>> 4) & 15L); + out[2 + outpos] = ((in[inpos] >>> 8) & 15L); + out[3 + outpos] = ((in[inpos] >>> 12) & 15L); + out[4 + outpos] = ((in[inpos] >>> 16) & 15L); + out[5 + outpos] = ((in[inpos] >>> 20) & 15L); + out[6 + outpos] = ((in[inpos] >>> 24) & 15L); + out[7 + outpos] = ((in[inpos] >>> 28) & 15L); + out[8 + outpos] = ((in[inpos] >>> 32) & 15L); + out[9 + outpos] = ((in[inpos] >>> 36) & 15L); + out[10 + outpos] = ((in[inpos] >>> 40) & 15L); + out[11 + outpos] = ((in[inpos] >>> 44) & 15L); + out[12 + outpos] = ((in[inpos] >>> 48) & 15L); + out[13 + outpos] = ((in[inpos] >>> 52) & 15L); + out[14 + outpos] = ((in[inpos] >>> 56) & 15L); + out[15 + outpos] = (in[inpos] >>> 60); + out[16 + outpos] = (in[1 + inpos] & 15L); + out[17 + outpos] = ((in[1 + inpos] >>> 4) & 15L); + out[18 + outpos] = ((in[1 + inpos] >>> 8) & 15L); + out[19 + outpos] = ((in[1 + inpos] >>> 12) & 15L); + out[20 + outpos] = ((in[1 + inpos] >>> 16) & 15L); + out[21 + outpos] = ((in[1 + inpos] >>> 20) & 15L); + out[22 + outpos] = ((in[1 + inpos] >>> 24) & 15L); + out[23 + outpos] = ((in[1 + inpos] >>> 28) & 15L); + out[24 + outpos] = ((in[1 + inpos] >>> 32) & 15L); + out[25 + outpos] = ((in[1 + inpos] >>> 36) & 15L); + out[26 + outpos] = ((in[1 + inpos] >>> 40) & 15L); + out[27 + outpos] = ((in[1 + inpos] >>> 44) & 15L); + out[28 + outpos] = ((in[1 + inpos] >>> 48) & 15L); + out[29 + outpos] = ((in[1 + inpos] >>> 52) & 15L); + out[30 + outpos] = ((in[1 + inpos] >>> 56) & 15L); + out[31 + outpos] = (in[1 + inpos] >>> 60); + out[32 + outpos] = (in[2 + inpos] & 15L); + out[33 + outpos] = ((in[2 + inpos] >>> 4) & 15L); + out[34 + outpos] = ((in[2 + inpos] >>> 8) & 15L); + out[35 + outpos] = ((in[2 + inpos] >>> 12) & 15L); + out[36 + outpos] = ((in[2 + inpos] >>> 16) & 15L); + out[37 + outpos] = ((in[2 + inpos] >>> 20) & 15L); + out[38 + outpos] = ((in[2 + inpos] >>> 24) & 15L); + out[39 + outpos] = ((in[2 + inpos] >>> 28) & 15L); + out[40 + outpos] = ((in[2 + inpos] >>> 32) & 15L); + out[41 + outpos] = ((in[2 + inpos] >>> 36) & 15L); + out[42 + outpos] = ((in[2 + inpos] >>> 40) & 15L); + out[43 + outpos] = ((in[2 + inpos] >>> 44) & 15L); + out[44 + outpos] = ((in[2 + inpos] >>> 48) & 15L); + out[45 + outpos] = ((in[2 + inpos] >>> 52) & 15L); + out[46 + outpos] = ((in[2 + inpos] >>> 56) & 15L); + out[47 + outpos] = (in[2 + inpos] >>> 60); + out[48 + outpos] = (in[3 + inpos] & 15L); + out[49 + outpos] = ((in[3 + inpos] >>> 4) & 15L); + out[50 + outpos] = ((in[3 + inpos] >>> 8) & 15L); + out[51 + outpos] = ((in[3 + inpos] >>> 12) & 15L); + out[52 + outpos] = ((in[3 + inpos] >>> 16) & 15L); + out[53 + outpos] = ((in[3 + inpos] >>> 20) & 15L); + out[54 + outpos] = ((in[3 + inpos] >>> 24) & 15L); + out[55 + outpos] = ((in[3 + inpos] >>> 28) & 15L); + out[56 + outpos] = ((in[3 + inpos] >>> 32) & 15L); + out[57 + outpos] = ((in[3 + inpos] >>> 36) & 15L); + out[58 + outpos] = ((in[3 + inpos] >>> 40) & 15L); + out[59 + outpos] = ((in[3 + inpos] >>> 44) & 15L); + out[60 + outpos] = ((in[3 + inpos] >>> 48) & 15L); + out[61 + outpos] = ((in[3 + inpos] >>> 52) & 15L); + out[62 + outpos] = ((in[3 + inpos] >>> 56) & 15L); + out[63 + outpos] = (in[3 + inpos] >>> 60); + } + + protected static void fastunpack5(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 31L); + out[1 + outpos] = ((in[inpos] >>> 5) & 31L); + out[2 + outpos] = ((in[inpos] >>> 10) & 31L); + out[3 + outpos] = ((in[inpos] >>> 15) & 31L); + out[4 + outpos] = ((in[inpos] >>> 20) & 31L); + out[5 + outpos] = ((in[inpos] >>> 25) & 31L); + out[6 + outpos] = ((in[inpos] >>> 30) & 31L); + out[7 + outpos] = ((in[inpos] >>> 35) & 31L); + out[8 + outpos] = ((in[inpos] >>> 40) & 31L); + out[9 + outpos] = ((in[inpos] >>> 45) & 31L); + out[10 + outpos] = ((in[inpos] >>> 50) & 31L); + out[11 + outpos] = ((in[inpos] >>> 55) & 31L); + out[12 + outpos] = (in[inpos] >>> 60) + | ((in[1 + inpos] & 1L) << (5 - 1)); + out[13 + outpos] = ((in[1 + inpos] >>> 1) & 31L); + out[14 + outpos] = ((in[1 + inpos] >>> 6) & 31L); + out[15 + outpos] = ((in[1 + inpos] >>> 11) & 31L); + out[16 + outpos] = ((in[1 + inpos] >>> 16) & 31L); + out[17 + outpos] = ((in[1 + inpos] >>> 21) & 31L); + out[18 + outpos] = ((in[1 + inpos] >>> 26) & 31L); + out[19 + outpos] = ((in[1 + inpos] >>> 31) & 31L); + out[20 + outpos] = ((in[1 + inpos] >>> 36) & 31L); + out[21 + outpos] = ((in[1 + inpos] >>> 41) & 31L); + out[22 + outpos] = ((in[1 + inpos] >>> 46) & 31L); + out[23 + outpos] = ((in[1 + inpos] >>> 51) & 31L); + out[24 + outpos] = ((in[1 + inpos] >>> 56) & 31L); + out[25 + outpos] = (in[1 + inpos] >>> 61) + | ((in[2 + inpos] & 3L) << (5 - 2)); + out[26 + outpos] = ((in[2 + inpos] >>> 2) & 31L); + out[27 + outpos] = ((in[2 + inpos] >>> 7) & 31L); + out[28 + outpos] = ((in[2 + inpos] >>> 12) & 31L); + out[29 + outpos] = ((in[2 + inpos] >>> 17) & 31L); + out[30 + outpos] = ((in[2 + inpos] >>> 22) & 31L); + out[31 + outpos] = ((in[2 + inpos] >>> 27) & 31L); + out[32 + outpos] = ((in[2 + inpos] >>> 32) & 31L); + out[33 + outpos] = ((in[2 + inpos] >>> 37) & 31L); + out[34 + outpos] = ((in[2 + inpos] >>> 42) & 31L); + out[35 + outpos] = ((in[2 + inpos] >>> 47) & 31L); + out[36 + outpos] = ((in[2 + inpos] >>> 52) & 31L); + out[37 + outpos] = ((in[2 + inpos] >>> 57) & 31L); + out[38 + outpos] = (in[2 + inpos] >>> 62) + | ((in[3 + inpos] & 7L) << (5 - 3)); + out[39 + outpos] = ((in[3 + inpos] >>> 3) & 31L); + out[40 + outpos] = ((in[3 + inpos] >>> 8) & 31L); + out[41 + outpos] = ((in[3 + inpos] >>> 13) & 31L); + out[42 + outpos] = ((in[3 + inpos] >>> 18) & 31L); + out[43 + outpos] = ((in[3 + inpos] >>> 23) & 31L); + out[44 + outpos] = ((in[3 + inpos] >>> 28) & 31L); + out[45 + outpos] = ((in[3 + inpos] >>> 33) & 31L); + out[46 + outpos] = ((in[3 + inpos] >>> 38) & 31L); + out[47 + outpos] = ((in[3 + inpos] >>> 43) & 31L); + out[48 + outpos] = ((in[3 + inpos] >>> 48) & 31L); + out[49 + outpos] = ((in[3 + inpos] >>> 53) & 31L); + out[50 + outpos] = ((in[3 + inpos] >>> 58) & 31L); + out[51 + outpos] = (in[3 + inpos] >>> 63) + | ((in[4 + inpos] & 15L) << (5 - 4)); + out[52 + outpos] = ((in[4 + inpos] >>> 4) & 31L); + out[53 + outpos] = ((in[4 + inpos] >>> 9) & 31L); + out[54 + outpos] = ((in[4 + inpos] >>> 14) & 31L); + out[55 + outpos] = ((in[4 + inpos] >>> 19) & 31L); + out[56 + outpos] = ((in[4 + inpos] >>> 24) & 31L); + out[57 + outpos] = ((in[4 + inpos] >>> 29) & 31L); + out[58 + outpos] = ((in[4 + inpos] >>> 34) & 31L); + out[59 + outpos] = ((in[4 + inpos] >>> 39) & 31L); + out[60 + outpos] = ((in[4 + inpos] >>> 44) & 31L); + out[61 + outpos] = ((in[4 + inpos] >>> 49) & 31L); + out[62 + outpos] = ((in[4 + inpos] >>> 54) & 31L); + out[63 + outpos] = (in[4 + inpos] >>> 59); + } + + protected static void fastunpack6(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 63L); + out[1 + outpos] = ((in[inpos] >>> 6) & 63L); + out[2 + outpos] = ((in[inpos] >>> 12) & 63L); + out[3 + outpos] = ((in[inpos] >>> 18) & 63L); + out[4 + outpos] = ((in[inpos] >>> 24) & 63L); + out[5 + outpos] = ((in[inpos] >>> 30) & 63L); + out[6 + outpos] = ((in[inpos] >>> 36) & 63L); + out[7 + outpos] = ((in[inpos] >>> 42) & 63L); + out[8 + outpos] = ((in[inpos] >>> 48) & 63L); + out[9 + outpos] = ((in[inpos] >>> 54) & 63L); + out[10 + outpos] = (in[inpos] >>> 60) + | ((in[1 + inpos] & 3L) << (6 - 2)); + out[11 + outpos] = ((in[1 + inpos] >>> 2) & 63L); + out[12 + outpos] = ((in[1 + inpos] >>> 8) & 63L); + out[13 + outpos] = ((in[1 + inpos] >>> 14) & 63L); + out[14 + outpos] = ((in[1 + inpos] >>> 20) & 63L); + out[15 + outpos] = ((in[1 + inpos] >>> 26) & 63L); + out[16 + outpos] = ((in[1 + inpos] >>> 32) & 63L); + out[17 + outpos] = ((in[1 + inpos] >>> 38) & 63L); + out[18 + outpos] = ((in[1 + inpos] >>> 44) & 63L); + out[19 + outpos] = ((in[1 + inpos] >>> 50) & 63L); + out[20 + outpos] = ((in[1 + inpos] >>> 56) & 63L); + out[21 + outpos] = (in[1 + inpos] >>> 62) + | ((in[2 + inpos] & 15L) << (6 - 4)); + out[22 + outpos] = ((in[2 + inpos] >>> 4) & 63L); + out[23 + outpos] = ((in[2 + inpos] >>> 10) & 63L); + out[24 + outpos] = ((in[2 + inpos] >>> 16) & 63L); + out[25 + outpos] = ((in[2 + inpos] >>> 22) & 63L); + out[26 + outpos] = ((in[2 + inpos] >>> 28) & 63L); + out[27 + outpos] = ((in[2 + inpos] >>> 34) & 63L); + out[28 + outpos] = ((in[2 + inpos] >>> 40) & 63L); + out[29 + outpos] = ((in[2 + inpos] >>> 46) & 63L); + out[30 + outpos] = ((in[2 + inpos] >>> 52) & 63L); + out[31 + outpos] = (in[2 + inpos] >>> 58); + out[32 + outpos] = (in[3 + inpos] & 63L); + out[33 + outpos] = ((in[3 + inpos] >>> 6) & 63L); + out[34 + outpos] = ((in[3 + inpos] >>> 12) & 63L); + out[35 + outpos] = ((in[3 + inpos] >>> 18) & 63L); + out[36 + outpos] = ((in[3 + inpos] >>> 24) & 63L); + out[37 + outpos] = ((in[3 + inpos] >>> 30) & 63L); + out[38 + outpos] = ((in[3 + inpos] >>> 36) & 63L); + out[39 + outpos] = ((in[3 + inpos] >>> 42) & 63L); + out[40 + outpos] = ((in[3 + inpos] >>> 48) & 63L); + out[41 + outpos] = ((in[3 + inpos] >>> 54) & 63L); + out[42 + outpos] = (in[3 + inpos] >>> 60) + | ((in[4 + inpos] & 3L) << (6 - 2)); + out[43 + outpos] = ((in[4 + inpos] >>> 2) & 63L); + out[44 + outpos] = ((in[4 + inpos] >>> 8) & 63L); + out[45 + outpos] = ((in[4 + inpos] >>> 14) & 63L); + out[46 + outpos] = ((in[4 + inpos] >>> 20) & 63L); + out[47 + outpos] = ((in[4 + inpos] >>> 26) & 63L); + out[48 + outpos] = ((in[4 + inpos] >>> 32) & 63L); + out[49 + outpos] = ((in[4 + inpos] >>> 38) & 63L); + out[50 + outpos] = ((in[4 + inpos] >>> 44) & 63L); + out[51 + outpos] = ((in[4 + inpos] >>> 50) & 63L); + out[52 + outpos] = ((in[4 + inpos] >>> 56) & 63L); + out[53 + outpos] = (in[4 + inpos] >>> 62) + | ((in[5 + inpos] & 15L) << (6 - 4)); + out[54 + outpos] = ((in[5 + inpos] >>> 4) & 63L); + out[55 + outpos] = ((in[5 + inpos] >>> 10) & 63L); + out[56 + outpos] = ((in[5 + inpos] >>> 16) & 63L); + out[57 + outpos] = ((in[5 + inpos] >>> 22) & 63L); + out[58 + outpos] = ((in[5 + inpos] >>> 28) & 63L); + out[59 + outpos] = ((in[5 + inpos] >>> 34) & 63L); + out[60 + outpos] = ((in[5 + inpos] >>> 40) & 63L); + out[61 + outpos] = ((in[5 + inpos] >>> 46) & 63L); + out[62 + outpos] = ((in[5 + inpos] >>> 52) & 63L); + out[63 + outpos] = (in[5 + inpos] >>> 58); + } + + protected static void fastunpack7(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 127L); + out[1 + outpos] = ((in[inpos] >>> 7) & 127L); + out[2 + outpos] = ((in[inpos] >>> 14) & 127L); + out[3 + outpos] = ((in[inpos] >>> 21) & 127L); + out[4 + outpos] = ((in[inpos] >>> 28) & 127L); + out[5 + outpos] = ((in[inpos] >>> 35) & 127L); + out[6 + outpos] = ((in[inpos] >>> 42) & 127L); + out[7 + outpos] = ((in[inpos] >>> 49) & 127L); + out[8 + outpos] = ((in[inpos] >>> 56) & 127L); + out[9 + outpos] = (in[inpos] >>> 63) + | ((in[1 + inpos] & 63L) << (7 - 6)); + out[10 + outpos] = ((in[1 + inpos] >>> 6) & 127L); + out[11 + outpos] = ((in[1 + inpos] >>> 13) & 127L); + out[12 + outpos] = ((in[1 + inpos] >>> 20) & 127L); + out[13 + outpos] = ((in[1 + inpos] >>> 27) & 127L); + out[14 + outpos] = ((in[1 + inpos] >>> 34) & 127L); + out[15 + outpos] = ((in[1 + inpos] >>> 41) & 127L); + out[16 + outpos] = ((in[1 + inpos] >>> 48) & 127L); + out[17 + outpos] = ((in[1 + inpos] >>> 55) & 127L); + out[18 + outpos] = (in[1 + inpos] >>> 62) + | ((in[2 + inpos] & 31L) << (7 - 5)); + out[19 + outpos] = ((in[2 + inpos] >>> 5) & 127L); + out[20 + outpos] = ((in[2 + inpos] >>> 12) & 127L); + out[21 + outpos] = ((in[2 + inpos] >>> 19) & 127L); + out[22 + outpos] = ((in[2 + inpos] >>> 26) & 127L); + out[23 + outpos] = ((in[2 + inpos] >>> 33) & 127L); + out[24 + outpos] = ((in[2 + inpos] >>> 40) & 127L); + out[25 + outpos] = ((in[2 + inpos] >>> 47) & 127L); + out[26 + outpos] = ((in[2 + inpos] >>> 54) & 127L); + out[27 + outpos] = (in[2 + inpos] >>> 61) + | ((in[3 + inpos] & 15L) << (7 - 4)); + out[28 + outpos] = ((in[3 + inpos] >>> 4) & 127L); + out[29 + outpos] = ((in[3 + inpos] >>> 11) & 127L); + out[30 + outpos] = ((in[3 + inpos] >>> 18) & 127L); + out[31 + outpos] = ((in[3 + inpos] >>> 25) & 127L); + out[32 + outpos] = ((in[3 + inpos] >>> 32) & 127L); + out[33 + outpos] = ((in[3 + inpos] >>> 39) & 127L); + out[34 + outpos] = ((in[3 + inpos] >>> 46) & 127L); + out[35 + outpos] = ((in[3 + inpos] >>> 53) & 127L); + out[36 + outpos] = (in[3 + inpos] >>> 60) + | ((in[4 + inpos] & 7L) << (7 - 3)); + out[37 + outpos] = ((in[4 + inpos] >>> 3) & 127L); + out[38 + outpos] = ((in[4 + inpos] >>> 10) & 127L); + out[39 + outpos] = ((in[4 + inpos] >>> 17) & 127L); + out[40 + outpos] = ((in[4 + inpos] >>> 24) & 127L); + out[41 + outpos] = ((in[4 + inpos] >>> 31) & 127L); + out[42 + outpos] = ((in[4 + inpos] >>> 38) & 127L); + out[43 + outpos] = ((in[4 + inpos] >>> 45) & 127L); + out[44 + outpos] = ((in[4 + inpos] >>> 52) & 127L); + out[45 + outpos] = (in[4 + inpos] >>> 59) + | ((in[5 + inpos] & 3L) << (7 - 2)); + out[46 + outpos] = ((in[5 + inpos] >>> 2) & 127L); + out[47 + outpos] = ((in[5 + inpos] >>> 9) & 127L); + out[48 + outpos] = ((in[5 + inpos] >>> 16) & 127L); + out[49 + outpos] = ((in[5 + inpos] >>> 23) & 127L); + out[50 + outpos] = ((in[5 + inpos] >>> 30) & 127L); + out[51 + outpos] = ((in[5 + inpos] >>> 37) & 127L); + out[52 + outpos] = ((in[5 + inpos] >>> 44) & 127L); + out[53 + outpos] = ((in[5 + inpos] >>> 51) & 127L); + out[54 + outpos] = (in[5 + inpos] >>> 58) + | ((in[6 + inpos] & 1L) << (7 - 1)); + out[55 + outpos] = ((in[6 + inpos] >>> 1) & 127L); + out[56 + outpos] = ((in[6 + inpos] >>> 8) & 127L); + out[57 + outpos] = ((in[6 + inpos] >>> 15) & 127L); + out[58 + outpos] = ((in[6 + inpos] >>> 22) & 127L); + out[59 + outpos] = ((in[6 + inpos] >>> 29) & 127L); + out[60 + outpos] = ((in[6 + inpos] >>> 36) & 127L); + out[61 + outpos] = ((in[6 + inpos] >>> 43) & 127L); + out[62 + outpos] = ((in[6 + inpos] >>> 50) & 127L); + out[63 + outpos] = (in[6 + inpos] >>> 57); + } + + protected static void fastunpack8(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 255L); + out[1 + outpos] = ((in[inpos] >>> 8) & 255L); + out[2 + outpos] = ((in[inpos] >>> 16) & 255L); + out[3 + outpos] = ((in[inpos] >>> 24) & 255L); + out[4 + outpos] = ((in[inpos] >>> 32) & 255L); + out[5 + outpos] = ((in[inpos] >>> 40) & 255L); + out[6 + outpos] = ((in[inpos] >>> 48) & 255L); + out[7 + outpos] = (in[inpos] >>> 56); + out[8 + outpos] = (in[1 + inpos] & 255L); + out[9 + outpos] = ((in[1 + inpos] >>> 8) & 255L); + out[10 + outpos] = ((in[1 + inpos] >>> 16) & 255L); + out[11 + outpos] = ((in[1 + inpos] >>> 24) & 255L); + out[12 + outpos] = ((in[1 + inpos] >>> 32) & 255L); + out[13 + outpos] = ((in[1 + inpos] >>> 40) & 255L); + out[14 + outpos] = ((in[1 + inpos] >>> 48) & 255L); + out[15 + outpos] = (in[1 + inpos] >>> 56); + out[16 + outpos] = (in[2 + inpos] & 255L); + out[17 + outpos] = ((in[2 + inpos] >>> 8) & 255L); + out[18 + outpos] = ((in[2 + inpos] >>> 16) & 255L); + out[19 + outpos] = ((in[2 + inpos] >>> 24) & 255L); + out[20 + outpos] = ((in[2 + inpos] >>> 32) & 255L); + out[21 + outpos] = ((in[2 + inpos] >>> 40) & 255L); + out[22 + outpos] = ((in[2 + inpos] >>> 48) & 255L); + out[23 + outpos] = (in[2 + inpos] >>> 56); + out[24 + outpos] = (in[3 + inpos] & 255L); + out[25 + outpos] = ((in[3 + inpos] >>> 8) & 255L); + out[26 + outpos] = ((in[3 + inpos] >>> 16) & 255L); + out[27 + outpos] = ((in[3 + inpos] >>> 24) & 255L); + out[28 + outpos] = ((in[3 + inpos] >>> 32) & 255L); + out[29 + outpos] = ((in[3 + inpos] >>> 40) & 255L); + out[30 + outpos] = ((in[3 + inpos] >>> 48) & 255L); + out[31 + outpos] = (in[3 + inpos] >>> 56); + out[32 + outpos] = (in[4 + inpos] & 255L); + out[33 + outpos] = ((in[4 + inpos] >>> 8) & 255L); + out[34 + outpos] = ((in[4 + inpos] >>> 16) & 255L); + out[35 + outpos] = ((in[4 + inpos] >>> 24) & 255L); + out[36 + outpos] = ((in[4 + inpos] >>> 32) & 255L); + out[37 + outpos] = ((in[4 + inpos] >>> 40) & 255L); + out[38 + outpos] = ((in[4 + inpos] >>> 48) & 255L); + out[39 + outpos] = (in[4 + inpos] >>> 56); + out[40 + outpos] = (in[5 + inpos] & 255L); + out[41 + outpos] = ((in[5 + inpos] >>> 8) & 255L); + out[42 + outpos] = ((in[5 + inpos] >>> 16) & 255L); + out[43 + outpos] = ((in[5 + inpos] >>> 24) & 255L); + out[44 + outpos] = ((in[5 + inpos] >>> 32) & 255L); + out[45 + outpos] = ((in[5 + inpos] >>> 40) & 255L); + out[46 + outpos] = ((in[5 + inpos] >>> 48) & 255L); + out[47 + outpos] = (in[5 + inpos] >>> 56); + out[48 + outpos] = (in[6 + inpos] & 255L); + out[49 + outpos] = ((in[6 + inpos] >>> 8) & 255L); + out[50 + outpos] = ((in[6 + inpos] >>> 16) & 255L); + out[51 + outpos] = ((in[6 + inpos] >>> 24) & 255L); + out[52 + outpos] = ((in[6 + inpos] >>> 32) & 255L); + out[53 + outpos] = ((in[6 + inpos] >>> 40) & 255L); + out[54 + outpos] = ((in[6 + inpos] >>> 48) & 255L); + out[55 + outpos] = (in[6 + inpos] >>> 56); + out[56 + outpos] = (in[7 + inpos] & 255L); + out[57 + outpos] = ((in[7 + inpos] >>> 8) & 255L); + out[58 + outpos] = ((in[7 + inpos] >>> 16) & 255L); + out[59 + outpos] = ((in[7 + inpos] >>> 24) & 255L); + out[60 + outpos] = ((in[7 + inpos] >>> 32) & 255L); + out[61 + outpos] = ((in[7 + inpos] >>> 40) & 255L); + out[62 + outpos] = ((in[7 + inpos] >>> 48) & 255L); + out[63 + outpos] = (in[7 + inpos] >>> 56); + } + + protected static void fastunpack9(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 511L); + out[1 + outpos] = ((in[inpos] >>> 9) & 511L); + out[2 + outpos] = ((in[inpos] >>> 18) & 511L); + out[3 + outpos] = ((in[inpos] >>> 27) & 511L); + out[4 + outpos] = ((in[inpos] >>> 36) & 511L); + out[5 + outpos] = ((in[inpos] >>> 45) & 511L); + out[6 + outpos] = ((in[inpos] >>> 54) & 511L); + out[7 + outpos] = (in[inpos] >>> 63) + | ((in[1 + inpos] & 255L) << (9 - 8)); + out[8 + outpos] = ((in[1 + inpos] >>> 8) & 511L); + out[9 + outpos] = ((in[1 + inpos] >>> 17) & 511L); + out[10 + outpos] = ((in[1 + inpos] >>> 26) & 511L); + out[11 + outpos] = ((in[1 + inpos] >>> 35) & 511L); + out[12 + outpos] = ((in[1 + inpos] >>> 44) & 511L); + out[13 + outpos] = ((in[1 + inpos] >>> 53) & 511L); + out[14 + outpos] = (in[1 + inpos] >>> 62) + | ((in[2 + inpos] & 127L) << (9 - 7)); + out[15 + outpos] = ((in[2 + inpos] >>> 7) & 511L); + out[16 + outpos] = ((in[2 + inpos] >>> 16) & 511L); + out[17 + outpos] = ((in[2 + inpos] >>> 25) & 511L); + out[18 + outpos] = ((in[2 + inpos] >>> 34) & 511L); + out[19 + outpos] = ((in[2 + inpos] >>> 43) & 511L); + out[20 + outpos] = ((in[2 + inpos] >>> 52) & 511L); + out[21 + outpos] = (in[2 + inpos] >>> 61) + | ((in[3 + inpos] & 63L) << (9 - 6)); + out[22 + outpos] = ((in[3 + inpos] >>> 6) & 511L); + out[23 + outpos] = ((in[3 + inpos] >>> 15) & 511L); + out[24 + outpos] = ((in[3 + inpos] >>> 24) & 511L); + out[25 + outpos] = ((in[3 + inpos] >>> 33) & 511L); + out[26 + outpos] = ((in[3 + inpos] >>> 42) & 511L); + out[27 + outpos] = ((in[3 + inpos] >>> 51) & 511L); + out[28 + outpos] = (in[3 + inpos] >>> 60) + | ((in[4 + inpos] & 31L) << (9 - 5)); + out[29 + outpos] = ((in[4 + inpos] >>> 5) & 511L); + out[30 + outpos] = ((in[4 + inpos] >>> 14) & 511L); + out[31 + outpos] = ((in[4 + inpos] >>> 23) & 511L); + out[32 + outpos] = ((in[4 + inpos] >>> 32) & 511L); + out[33 + outpos] = ((in[4 + inpos] >>> 41) & 511L); + out[34 + outpos] = ((in[4 + inpos] >>> 50) & 511L); + out[35 + outpos] = (in[4 + inpos] >>> 59) + | ((in[5 + inpos] & 15L) << (9 - 4)); + out[36 + outpos] = ((in[5 + inpos] >>> 4) & 511L); + out[37 + outpos] = ((in[5 + inpos] >>> 13) & 511L); + out[38 + outpos] = ((in[5 + inpos] >>> 22) & 511L); + out[39 + outpos] = ((in[5 + inpos] >>> 31) & 511L); + out[40 + outpos] = ((in[5 + inpos] >>> 40) & 511L); + out[41 + outpos] = ((in[5 + inpos] >>> 49) & 511L); + out[42 + outpos] = (in[5 + inpos] >>> 58) + | ((in[6 + inpos] & 7L) << (9 - 3)); + out[43 + outpos] = ((in[6 + inpos] >>> 3) & 511L); + out[44 + outpos] = ((in[6 + inpos] >>> 12) & 511L); + out[45 + outpos] = ((in[6 + inpos] >>> 21) & 511L); + out[46 + outpos] = ((in[6 + inpos] >>> 30) & 511L); + out[47 + outpos] = ((in[6 + inpos] >>> 39) & 511L); + out[48 + outpos] = ((in[6 + inpos] >>> 48) & 511L); + out[49 + outpos] = (in[6 + inpos] >>> 57) + | ((in[7 + inpos] & 3L) << (9 - 2)); + out[50 + outpos] = ((in[7 + inpos] >>> 2) & 511L); + out[51 + outpos] = ((in[7 + inpos] >>> 11) & 511L); + out[52 + outpos] = ((in[7 + inpos] >>> 20) & 511L); + out[53 + outpos] = ((in[7 + inpos] >>> 29) & 511L); + out[54 + outpos] = ((in[7 + inpos] >>> 38) & 511L); + out[55 + outpos] = ((in[7 + inpos] >>> 47) & 511L); + out[56 + outpos] = (in[7 + inpos] >>> 56) + | ((in[8 + inpos] & 1L) << (9 - 1)); + out[57 + outpos] = ((in[8 + inpos] >>> 1) & 511L); + out[58 + outpos] = ((in[8 + inpos] >>> 10) & 511L); + out[59 + outpos] = ((in[8 + inpos] >>> 19) & 511L); + out[60 + outpos] = ((in[8 + inpos] >>> 28) & 511L); + out[61 + outpos] = ((in[8 + inpos] >>> 37) & 511L); + out[62 + outpos] = ((in[8 + inpos] >>> 46) & 511L); + out[63 + outpos] = (in[8 + inpos] >>> 55); + } + + protected static void fastunpack10(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 1023L); + out[1 + outpos] = ((in[inpos] >>> 10) & 1023L); + out[2 + outpos] = ((in[inpos] >>> 20) & 1023L); + out[3 + outpos] = ((in[inpos] >>> 30) & 1023L); + out[4 + outpos] = ((in[inpos] >>> 40) & 1023L); + out[5 + outpos] = ((in[inpos] >>> 50) & 1023L); + out[6 + outpos] = (in[inpos] >>> 60) + | ((in[1 + inpos] & 63L) << (10 - 6)); + out[7 + outpos] = ((in[1 + inpos] >>> 6) & 1023L); + out[8 + outpos] = ((in[1 + inpos] >>> 16) & 1023L); + out[9 + outpos] = ((in[1 + inpos] >>> 26) & 1023L); + out[10 + outpos] = ((in[1 + inpos] >>> 36) & 1023L); + out[11 + outpos] = ((in[1 + inpos] >>> 46) & 1023L); + out[12 + outpos] = (in[1 + inpos] >>> 56) + | ((in[2 + inpos] & 3L) << (10 - 2)); + out[13 + outpos] = ((in[2 + inpos] >>> 2) & 1023L); + out[14 + outpos] = ((in[2 + inpos] >>> 12) & 1023L); + out[15 + outpos] = ((in[2 + inpos] >>> 22) & 1023L); + out[16 + outpos] = ((in[2 + inpos] >>> 32) & 1023L); + out[17 + outpos] = ((in[2 + inpos] >>> 42) & 1023L); + out[18 + outpos] = ((in[2 + inpos] >>> 52) & 1023L); + out[19 + outpos] = (in[2 + inpos] >>> 62) + | ((in[3 + inpos] & 255L) << (10 - 8)); + out[20 + outpos] = ((in[3 + inpos] >>> 8) & 1023L); + out[21 + outpos] = ((in[3 + inpos] >>> 18) & 1023L); + out[22 + outpos] = ((in[3 + inpos] >>> 28) & 1023L); + out[23 + outpos] = ((in[3 + inpos] >>> 38) & 1023L); + out[24 + outpos] = ((in[3 + inpos] >>> 48) & 1023L); + out[25 + outpos] = (in[3 + inpos] >>> 58) + | ((in[4 + inpos] & 15L) << (10 - 4)); + out[26 + outpos] = ((in[4 + inpos] >>> 4) & 1023L); + out[27 + outpos] = ((in[4 + inpos] >>> 14) & 1023L); + out[28 + outpos] = ((in[4 + inpos] >>> 24) & 1023L); + out[29 + outpos] = ((in[4 + inpos] >>> 34) & 1023L); + out[30 + outpos] = ((in[4 + inpos] >>> 44) & 1023L); + out[31 + outpos] = (in[4 + inpos] >>> 54); + out[32 + outpos] = (in[5 + inpos] & 1023L); + out[33 + outpos] = ((in[5 + inpos] >>> 10) & 1023L); + out[34 + outpos] = ((in[5 + inpos] >>> 20) & 1023L); + out[35 + outpos] = ((in[5 + inpos] >>> 30) & 1023L); + out[36 + outpos] = ((in[5 + inpos] >>> 40) & 1023L); + out[37 + outpos] = ((in[5 + inpos] >>> 50) & 1023L); + out[38 + outpos] = (in[5 + inpos] >>> 60) + | ((in[6 + inpos] & 63L) << (10 - 6)); + out[39 + outpos] = ((in[6 + inpos] >>> 6) & 1023L); + out[40 + outpos] = ((in[6 + inpos] >>> 16) & 1023L); + out[41 + outpos] = ((in[6 + inpos] >>> 26) & 1023L); + out[42 + outpos] = ((in[6 + inpos] >>> 36) & 1023L); + out[43 + outpos] = ((in[6 + inpos] >>> 46) & 1023L); + out[44 + outpos] = (in[6 + inpos] >>> 56) + | ((in[7 + inpos] & 3L) << (10 - 2)); + out[45 + outpos] = ((in[7 + inpos] >>> 2) & 1023L); + out[46 + outpos] = ((in[7 + inpos] >>> 12) & 1023L); + out[47 + outpos] = ((in[7 + inpos] >>> 22) & 1023L); + out[48 + outpos] = ((in[7 + inpos] >>> 32) & 1023L); + out[49 + outpos] = ((in[7 + inpos] >>> 42) & 1023L); + out[50 + outpos] = ((in[7 + inpos] >>> 52) & 1023L); + out[51 + outpos] = (in[7 + inpos] >>> 62) + | ((in[8 + inpos] & 255L) << (10 - 8)); + out[52 + outpos] = ((in[8 + inpos] >>> 8) & 1023L); + out[53 + outpos] = ((in[8 + inpos] >>> 18) & 1023L); + out[54 + outpos] = ((in[8 + inpos] >>> 28) & 1023L); + out[55 + outpos] = ((in[8 + inpos] >>> 38) & 1023L); + out[56 + outpos] = ((in[8 + inpos] >>> 48) & 1023L); + out[57 + outpos] = (in[8 + inpos] >>> 58) + | ((in[9 + inpos] & 15L) << (10 - 4)); + out[58 + outpos] = ((in[9 + inpos] >>> 4) & 1023L); + out[59 + outpos] = ((in[9 + inpos] >>> 14) & 1023L); + out[60 + outpos] = ((in[9 + inpos] >>> 24) & 1023L); + out[61 + outpos] = ((in[9 + inpos] >>> 34) & 1023L); + out[62 + outpos] = ((in[9 + inpos] >>> 44) & 1023L); + out[63 + outpos] = (in[9 + inpos] >>> 54); + } + + protected static void fastunpack11(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 2047L); + out[1 + outpos] = ((in[inpos] >>> 11) & 2047L); + out[2 + outpos] = ((in[inpos] >>> 22) & 2047L); + out[3 + outpos] = ((in[inpos] >>> 33) & 2047L); + out[4 + outpos] = ((in[inpos] >>> 44) & 2047L); + out[5 + outpos] = (in[inpos] >>> 55) + | ((in[1 + inpos] & 3L) << (11 - 2)); + out[6 + outpos] = ((in[1 + inpos] >>> 2) & 2047L); + out[7 + outpos] = ((in[1 + inpos] >>> 13) & 2047L); + out[8 + outpos] = ((in[1 + inpos] >>> 24) & 2047L); + out[9 + outpos] = ((in[1 + inpos] >>> 35) & 2047L); + out[10 + outpos] = ((in[1 + inpos] >>> 46) & 2047L); + out[11 + outpos] = (in[1 + inpos] >>> 57) + | ((in[2 + inpos] & 15L) << (11 - 4)); + out[12 + outpos] = ((in[2 + inpos] >>> 4) & 2047L); + out[13 + outpos] = ((in[2 + inpos] >>> 15) & 2047L); + out[14 + outpos] = ((in[2 + inpos] >>> 26) & 2047L); + out[15 + outpos] = ((in[2 + inpos] >>> 37) & 2047L); + out[16 + outpos] = ((in[2 + inpos] >>> 48) & 2047L); + out[17 + outpos] = (in[2 + inpos] >>> 59) + | ((in[3 + inpos] & 63L) << (11 - 6)); + out[18 + outpos] = ((in[3 + inpos] >>> 6) & 2047L); + out[19 + outpos] = ((in[3 + inpos] >>> 17) & 2047L); + out[20 + outpos] = ((in[3 + inpos] >>> 28) & 2047L); + out[21 + outpos] = ((in[3 + inpos] >>> 39) & 2047L); + out[22 + outpos] = ((in[3 + inpos] >>> 50) & 2047L); + out[23 + outpos] = (in[3 + inpos] >>> 61) + | ((in[4 + inpos] & 255L) << (11 - 8)); + out[24 + outpos] = ((in[4 + inpos] >>> 8) & 2047L); + out[25 + outpos] = ((in[4 + inpos] >>> 19) & 2047L); + out[26 + outpos] = ((in[4 + inpos] >>> 30) & 2047L); + out[27 + outpos] = ((in[4 + inpos] >>> 41) & 2047L); + out[28 + outpos] = ((in[4 + inpos] >>> 52) & 2047L); + out[29 + outpos] = (in[4 + inpos] >>> 63) + | ((in[5 + inpos] & 1023L) << (11 - 10)); + out[30 + outpos] = ((in[5 + inpos] >>> 10) & 2047L); + out[31 + outpos] = ((in[5 + inpos] >>> 21) & 2047L); + out[32 + outpos] = ((in[5 + inpos] >>> 32) & 2047L); + out[33 + outpos] = ((in[5 + inpos] >>> 43) & 2047L); + out[34 + outpos] = (in[5 + inpos] >>> 54) + | ((in[6 + inpos] & 1L) << (11 - 1)); + out[35 + outpos] = ((in[6 + inpos] >>> 1) & 2047L); + out[36 + outpos] = ((in[6 + inpos] >>> 12) & 2047L); + out[37 + outpos] = ((in[6 + inpos] >>> 23) & 2047L); + out[38 + outpos] = ((in[6 + inpos] >>> 34) & 2047L); + out[39 + outpos] = ((in[6 + inpos] >>> 45) & 2047L); + out[40 + outpos] = (in[6 + inpos] >>> 56) + | ((in[7 + inpos] & 7L) << (11 - 3)); + out[41 + outpos] = ((in[7 + inpos] >>> 3) & 2047L); + out[42 + outpos] = ((in[7 + inpos] >>> 14) & 2047L); + out[43 + outpos] = ((in[7 + inpos] >>> 25) & 2047L); + out[44 + outpos] = ((in[7 + inpos] >>> 36) & 2047L); + out[45 + outpos] = ((in[7 + inpos] >>> 47) & 2047L); + out[46 + outpos] = (in[7 + inpos] >>> 58) + | ((in[8 + inpos] & 31L) << (11 - 5)); + out[47 + outpos] = ((in[8 + inpos] >>> 5) & 2047L); + out[48 + outpos] = ((in[8 + inpos] >>> 16) & 2047L); + out[49 + outpos] = ((in[8 + inpos] >>> 27) & 2047L); + out[50 + outpos] = ((in[8 + inpos] >>> 38) & 2047L); + out[51 + outpos] = ((in[8 + inpos] >>> 49) & 2047L); + out[52 + outpos] = (in[8 + inpos] >>> 60) + | ((in[9 + inpos] & 127L) << (11 - 7)); + out[53 + outpos] = ((in[9 + inpos] >>> 7) & 2047L); + out[54 + outpos] = ((in[9 + inpos] >>> 18) & 2047L); + out[55 + outpos] = ((in[9 + inpos] >>> 29) & 2047L); + out[56 + outpos] = ((in[9 + inpos] >>> 40) & 2047L); + out[57 + outpos] = ((in[9 + inpos] >>> 51) & 2047L); + out[58 + outpos] = (in[9 + inpos] >>> 62) + | ((in[10 + inpos] & 511L) << (11 - 9)); + out[59 + outpos] = ((in[10 + inpos] >>> 9) & 2047L); + out[60 + outpos] = ((in[10 + inpos] >>> 20) & 2047L); + out[61 + outpos] = ((in[10 + inpos] >>> 31) & 2047L); + out[62 + outpos] = ((in[10 + inpos] >>> 42) & 2047L); + out[63 + outpos] = (in[10 + inpos] >>> 53); + } + + protected static void fastunpack12(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 4095L); + out[1 + outpos] = ((in[inpos] >>> 12) & 4095L); + out[2 + outpos] = ((in[inpos] >>> 24) & 4095L); + out[3 + outpos] = ((in[inpos] >>> 36) & 4095L); + out[4 + outpos] = ((in[inpos] >>> 48) & 4095L); + out[5 + outpos] = (in[inpos] >>> 60) + | ((in[1 + inpos] & 255L) << (12 - 8)); + out[6 + outpos] = ((in[1 + inpos] >>> 8) & 4095L); + out[7 + outpos] = ((in[1 + inpos] >>> 20) & 4095L); + out[8 + outpos] = ((in[1 + inpos] >>> 32) & 4095L); + out[9 + outpos] = ((in[1 + inpos] >>> 44) & 4095L); + out[10 + outpos] = (in[1 + inpos] >>> 56) + | ((in[2 + inpos] & 15L) << (12 - 4)); + out[11 + outpos] = ((in[2 + inpos] >>> 4) & 4095L); + out[12 + outpos] = ((in[2 + inpos] >>> 16) & 4095L); + out[13 + outpos] = ((in[2 + inpos] >>> 28) & 4095L); + out[14 + outpos] = ((in[2 + inpos] >>> 40) & 4095L); + out[15 + outpos] = (in[2 + inpos] >>> 52); + out[16 + outpos] = (in[3 + inpos] & 4095L); + out[17 + outpos] = ((in[3 + inpos] >>> 12) & 4095L); + out[18 + outpos] = ((in[3 + inpos] >>> 24) & 4095L); + out[19 + outpos] = ((in[3 + inpos] >>> 36) & 4095L); + out[20 + outpos] = ((in[3 + inpos] >>> 48) & 4095L); + out[21 + outpos] = (in[3 + inpos] >>> 60) + | ((in[4 + inpos] & 255L) << (12 - 8)); + out[22 + outpos] = ((in[4 + inpos] >>> 8) & 4095L); + out[23 + outpos] = ((in[4 + inpos] >>> 20) & 4095L); + out[24 + outpos] = ((in[4 + inpos] >>> 32) & 4095L); + out[25 + outpos] = ((in[4 + inpos] >>> 44) & 4095L); + out[26 + outpos] = (in[4 + inpos] >>> 56) + | ((in[5 + inpos] & 15L) << (12 - 4)); + out[27 + outpos] = ((in[5 + inpos] >>> 4) & 4095L); + out[28 + outpos] = ((in[5 + inpos] >>> 16) & 4095L); + out[29 + outpos] = ((in[5 + inpos] >>> 28) & 4095L); + out[30 + outpos] = ((in[5 + inpos] >>> 40) & 4095L); + out[31 + outpos] = (in[5 + inpos] >>> 52); + out[32 + outpos] = (in[6 + inpos] & 4095L); + out[33 + outpos] = ((in[6 + inpos] >>> 12) & 4095L); + out[34 + outpos] = ((in[6 + inpos] >>> 24) & 4095L); + out[35 + outpos] = ((in[6 + inpos] >>> 36) & 4095L); + out[36 + outpos] = ((in[6 + inpos] >>> 48) & 4095L); + out[37 + outpos] = (in[6 + inpos] >>> 60) + | ((in[7 + inpos] & 255L) << (12 - 8)); + out[38 + outpos] = ((in[7 + inpos] >>> 8) & 4095L); + out[39 + outpos] = ((in[7 + inpos] >>> 20) & 4095L); + out[40 + outpos] = ((in[7 + inpos] >>> 32) & 4095L); + out[41 + outpos] = ((in[7 + inpos] >>> 44) & 4095L); + out[42 + outpos] = (in[7 + inpos] >>> 56) + | ((in[8 + inpos] & 15L) << (12 - 4)); + out[43 + outpos] = ((in[8 + inpos] >>> 4) & 4095L); + out[44 + outpos] = ((in[8 + inpos] >>> 16) & 4095L); + out[45 + outpos] = ((in[8 + inpos] >>> 28) & 4095L); + out[46 + outpos] = ((in[8 + inpos] >>> 40) & 4095L); + out[47 + outpos] = (in[8 + inpos] >>> 52); + out[48 + outpos] = (in[9 + inpos] & 4095L); + out[49 + outpos] = ((in[9 + inpos] >>> 12) & 4095L); + out[50 + outpos] = ((in[9 + inpos] >>> 24) & 4095L); + out[51 + outpos] = ((in[9 + inpos] >>> 36) & 4095L); + out[52 + outpos] = ((in[9 + inpos] >>> 48) & 4095L); + out[53 + outpos] = (in[9 + inpos] >>> 60) + | ((in[10 + inpos] & 255L) << (12 - 8)); + out[54 + outpos] = ((in[10 + inpos] >>> 8) & 4095L); + out[55 + outpos] = ((in[10 + inpos] >>> 20) & 4095L); + out[56 + outpos] = ((in[10 + inpos] >>> 32) & 4095L); + out[57 + outpos] = ((in[10 + inpos] >>> 44) & 4095L); + out[58 + outpos] = (in[10 + inpos] >>> 56) + | ((in[11 + inpos] & 15L) << (12 - 4)); + out[59 + outpos] = ((in[11 + inpos] >>> 4) & 4095L); + out[60 + outpos] = ((in[11 + inpos] >>> 16) & 4095L); + out[61 + outpos] = ((in[11 + inpos] >>> 28) & 4095L); + out[62 + outpos] = ((in[11 + inpos] >>> 40) & 4095L); + out[63 + outpos] = (in[11 + inpos] >>> 52); + } + + protected static void fastunpack13(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 8191L); + out[1 + outpos] = ((in[inpos] >>> 13) & 8191L); + out[2 + outpos] = ((in[inpos] >>> 26) & 8191L); + out[3 + outpos] = ((in[inpos] >>> 39) & 8191L); + out[4 + outpos] = (in[inpos] >>> 52) + | ((in[1 + inpos] & 1L) << (13 - 1)); + out[5 + outpos] = ((in[1 + inpos] >>> 1) & 8191L); + out[6 + outpos] = ((in[1 + inpos] >>> 14) & 8191L); + out[7 + outpos] = ((in[1 + inpos] >>> 27) & 8191L); + out[8 + outpos] = ((in[1 + inpos] >>> 40) & 8191L); + out[9 + outpos] = (in[1 + inpos] >>> 53) + | ((in[2 + inpos] & 3L) << (13 - 2)); + out[10 + outpos] = ((in[2 + inpos] >>> 2) & 8191L); + out[11 + outpos] = ((in[2 + inpos] >>> 15) & 8191L); + out[12 + outpos] = ((in[2 + inpos] >>> 28) & 8191L); + out[13 + outpos] = ((in[2 + inpos] >>> 41) & 8191L); + out[14 + outpos] = (in[2 + inpos] >>> 54) + | ((in[3 + inpos] & 7L) << (13 - 3)); + out[15 + outpos] = ((in[3 + inpos] >>> 3) & 8191L); + out[16 + outpos] = ((in[3 + inpos] >>> 16) & 8191L); + out[17 + outpos] = ((in[3 + inpos] >>> 29) & 8191L); + out[18 + outpos] = ((in[3 + inpos] >>> 42) & 8191L); + out[19 + outpos] = (in[3 + inpos] >>> 55) + | ((in[4 + inpos] & 15L) << (13 - 4)); + out[20 + outpos] = ((in[4 + inpos] >>> 4) & 8191L); + out[21 + outpos] = ((in[4 + inpos] >>> 17) & 8191L); + out[22 + outpos] = ((in[4 + inpos] >>> 30) & 8191L); + out[23 + outpos] = ((in[4 + inpos] >>> 43) & 8191L); + out[24 + outpos] = (in[4 + inpos] >>> 56) + | ((in[5 + inpos] & 31L) << (13 - 5)); + out[25 + outpos] = ((in[5 + inpos] >>> 5) & 8191L); + out[26 + outpos] = ((in[5 + inpos] >>> 18) & 8191L); + out[27 + outpos] = ((in[5 + inpos] >>> 31) & 8191L); + out[28 + outpos] = ((in[5 + inpos] >>> 44) & 8191L); + out[29 + outpos] = (in[5 + inpos] >>> 57) + | ((in[6 + inpos] & 63L) << (13 - 6)); + out[30 + outpos] = ((in[6 + inpos] >>> 6) & 8191L); + out[31 + outpos] = ((in[6 + inpos] >>> 19) & 8191L); + out[32 + outpos] = ((in[6 + inpos] >>> 32) & 8191L); + out[33 + outpos] = ((in[6 + inpos] >>> 45) & 8191L); + out[34 + outpos] = (in[6 + inpos] >>> 58) + | ((in[7 + inpos] & 127L) << (13 - 7)); + out[35 + outpos] = ((in[7 + inpos] >>> 7) & 8191L); + out[36 + outpos] = ((in[7 + inpos] >>> 20) & 8191L); + out[37 + outpos] = ((in[7 + inpos] >>> 33) & 8191L); + out[38 + outpos] = ((in[7 + inpos] >>> 46) & 8191L); + out[39 + outpos] = (in[7 + inpos] >>> 59) + | ((in[8 + inpos] & 255L) << (13 - 8)); + out[40 + outpos] = ((in[8 + inpos] >>> 8) & 8191L); + out[41 + outpos] = ((in[8 + inpos] >>> 21) & 8191L); + out[42 + outpos] = ((in[8 + inpos] >>> 34) & 8191L); + out[43 + outpos] = ((in[8 + inpos] >>> 47) & 8191L); + out[44 + outpos] = (in[8 + inpos] >>> 60) + | ((in[9 + inpos] & 511L) << (13 - 9)); + out[45 + outpos] = ((in[9 + inpos] >>> 9) & 8191L); + out[46 + outpos] = ((in[9 + inpos] >>> 22) & 8191L); + out[47 + outpos] = ((in[9 + inpos] >>> 35) & 8191L); + out[48 + outpos] = ((in[9 + inpos] >>> 48) & 8191L); + out[49 + outpos] = (in[9 + inpos] >>> 61) + | ((in[10 + inpos] & 1023L) << (13 - 10)); + out[50 + outpos] = ((in[10 + inpos] >>> 10) & 8191L); + out[51 + outpos] = ((in[10 + inpos] >>> 23) & 8191L); + out[52 + outpos] = ((in[10 + inpos] >>> 36) & 8191L); + out[53 + outpos] = ((in[10 + inpos] >>> 49) & 8191L); + out[54 + outpos] = (in[10 + inpos] >>> 62) + | ((in[11 + inpos] & 2047L) << (13 - 11)); + out[55 + outpos] = ((in[11 + inpos] >>> 11) & 8191L); + out[56 + outpos] = ((in[11 + inpos] >>> 24) & 8191L); + out[57 + outpos] = ((in[11 + inpos] >>> 37) & 8191L); + out[58 + outpos] = ((in[11 + inpos] >>> 50) & 8191L); + out[59 + outpos] = (in[11 + inpos] >>> 63) + | ((in[12 + inpos] & 4095L) << (13 - 12)); + out[60 + outpos] = ((in[12 + inpos] >>> 12) & 8191L); + out[61 + outpos] = ((in[12 + inpos] >>> 25) & 8191L); + out[62 + outpos] = ((in[12 + inpos] >>> 38) & 8191L); + out[63 + outpos] = (in[12 + inpos] >>> 51); + } + + protected static void fastunpack14(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 16383L); + out[1 + outpos] = ((in[inpos] >>> 14) & 16383L); + out[2 + outpos] = ((in[inpos] >>> 28) & 16383L); + out[3 + outpos] = ((in[inpos] >>> 42) & 16383L); + out[4 + outpos] = (in[inpos] >>> 56) + | ((in[1 + inpos] & 63L) << (14 - 6)); + out[5 + outpos] = ((in[1 + inpos] >>> 6) & 16383L); + out[6 + outpos] = ((in[1 + inpos] >>> 20) & 16383L); + out[7 + outpos] = ((in[1 + inpos] >>> 34) & 16383L); + out[8 + outpos] = ((in[1 + inpos] >>> 48) & 16383L); + out[9 + outpos] = (in[1 + inpos] >>> 62) + | ((in[2 + inpos] & 4095L) << (14 - 12)); + out[10 + outpos] = ((in[2 + inpos] >>> 12) & 16383L); + out[11 + outpos] = ((in[2 + inpos] >>> 26) & 16383L); + out[12 + outpos] = ((in[2 + inpos] >>> 40) & 16383L); + out[13 + outpos] = (in[2 + inpos] >>> 54) + | ((in[3 + inpos] & 15L) << (14 - 4)); + out[14 + outpos] = ((in[3 + inpos] >>> 4) & 16383L); + out[15 + outpos] = ((in[3 + inpos] >>> 18) & 16383L); + out[16 + outpos] = ((in[3 + inpos] >>> 32) & 16383L); + out[17 + outpos] = ((in[3 + inpos] >>> 46) & 16383L); + out[18 + outpos] = (in[3 + inpos] >>> 60) + | ((in[4 + inpos] & 1023L) << (14 - 10)); + out[19 + outpos] = ((in[4 + inpos] >>> 10) & 16383L); + out[20 + outpos] = ((in[4 + inpos] >>> 24) & 16383L); + out[21 + outpos] = ((in[4 + inpos] >>> 38) & 16383L); + out[22 + outpos] = (in[4 + inpos] >>> 52) + | ((in[5 + inpos] & 3L) << (14 - 2)); + out[23 + outpos] = ((in[5 + inpos] >>> 2) & 16383L); + out[24 + outpos] = ((in[5 + inpos] >>> 16) & 16383L); + out[25 + outpos] = ((in[5 + inpos] >>> 30) & 16383L); + out[26 + outpos] = ((in[5 + inpos] >>> 44) & 16383L); + out[27 + outpos] = (in[5 + inpos] >>> 58) + | ((in[6 + inpos] & 255L) << (14 - 8)); + out[28 + outpos] = ((in[6 + inpos] >>> 8) & 16383L); + out[29 + outpos] = ((in[6 + inpos] >>> 22) & 16383L); + out[30 + outpos] = ((in[6 + inpos] >>> 36) & 16383L); + out[31 + outpos] = (in[6 + inpos] >>> 50); + out[32 + outpos] = (in[7 + inpos] & 16383L); + out[33 + outpos] = ((in[7 + inpos] >>> 14) & 16383L); + out[34 + outpos] = ((in[7 + inpos] >>> 28) & 16383L); + out[35 + outpos] = ((in[7 + inpos] >>> 42) & 16383L); + out[36 + outpos] = (in[7 + inpos] >>> 56) + | ((in[8 + inpos] & 63L) << (14 - 6)); + out[37 + outpos] = ((in[8 + inpos] >>> 6) & 16383L); + out[38 + outpos] = ((in[8 + inpos] >>> 20) & 16383L); + out[39 + outpos] = ((in[8 + inpos] >>> 34) & 16383L); + out[40 + outpos] = ((in[8 + inpos] >>> 48) & 16383L); + out[41 + outpos] = (in[8 + inpos] >>> 62) + | ((in[9 + inpos] & 4095L) << (14 - 12)); + out[42 + outpos] = ((in[9 + inpos] >>> 12) & 16383L); + out[43 + outpos] = ((in[9 + inpos] >>> 26) & 16383L); + out[44 + outpos] = ((in[9 + inpos] >>> 40) & 16383L); + out[45 + outpos] = (in[9 + inpos] >>> 54) + | ((in[10 + inpos] & 15L) << (14 - 4)); + out[46 + outpos] = ((in[10 + inpos] >>> 4) & 16383L); + out[47 + outpos] = ((in[10 + inpos] >>> 18) & 16383L); + out[48 + outpos] = ((in[10 + inpos] >>> 32) & 16383L); + out[49 + outpos] = ((in[10 + inpos] >>> 46) & 16383L); + out[50 + outpos] = (in[10 + inpos] >>> 60) + | ((in[11 + inpos] & 1023L) << (14 - 10)); + out[51 + outpos] = ((in[11 + inpos] >>> 10) & 16383L); + out[52 + outpos] = ((in[11 + inpos] >>> 24) & 16383L); + out[53 + outpos] = ((in[11 + inpos] >>> 38) & 16383L); + out[54 + outpos] = (in[11 + inpos] >>> 52) + | ((in[12 + inpos] & 3L) << (14 - 2)); + out[55 + outpos] = ((in[12 + inpos] >>> 2) & 16383L); + out[56 + outpos] = ((in[12 + inpos] >>> 16) & 16383L); + out[57 + outpos] = ((in[12 + inpos] >>> 30) & 16383L); + out[58 + outpos] = ((in[12 + inpos] >>> 44) & 16383L); + out[59 + outpos] = (in[12 + inpos] >>> 58) + | ((in[13 + inpos] & 255L) << (14 - 8)); + out[60 + outpos] = ((in[13 + inpos] >>> 8) & 16383L); + out[61 + outpos] = ((in[13 + inpos] >>> 22) & 16383L); + out[62 + outpos] = ((in[13 + inpos] >>> 36) & 16383L); + out[63 + outpos] = (in[13 + inpos] >>> 50); + } + + protected static void fastunpack15(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 32767L); + out[1 + outpos] = ((in[inpos] >>> 15) & 32767L); + out[2 + outpos] = ((in[inpos] >>> 30) & 32767L); + out[3 + outpos] = ((in[inpos] >>> 45) & 32767L); + out[4 + outpos] = (in[inpos] >>> 60) + | ((in[1 + inpos] & 2047L) << (15 - 11)); + out[5 + outpos] = ((in[1 + inpos] >>> 11) & 32767L); + out[6 + outpos] = ((in[1 + inpos] >>> 26) & 32767L); + out[7 + outpos] = ((in[1 + inpos] >>> 41) & 32767L); + out[8 + outpos] = (in[1 + inpos] >>> 56) + | ((in[2 + inpos] & 127L) << (15 - 7)); + out[9 + outpos] = ((in[2 + inpos] >>> 7) & 32767L); + out[10 + outpos] = ((in[2 + inpos] >>> 22) & 32767L); + out[11 + outpos] = ((in[2 + inpos] >>> 37) & 32767L); + out[12 + outpos] = (in[2 + inpos] >>> 52) + | ((in[3 + inpos] & 7L) << (15 - 3)); + out[13 + outpos] = ((in[3 + inpos] >>> 3) & 32767L); + out[14 + outpos] = ((in[3 + inpos] >>> 18) & 32767L); + out[15 + outpos] = ((in[3 + inpos] >>> 33) & 32767L); + out[16 + outpos] = ((in[3 + inpos] >>> 48) & 32767L); + out[17 + outpos] = (in[3 + inpos] >>> 63) + | ((in[4 + inpos] & 16383L) << (15 - 14)); + out[18 + outpos] = ((in[4 + inpos] >>> 14) & 32767L); + out[19 + outpos] = ((in[4 + inpos] >>> 29) & 32767L); + out[20 + outpos] = ((in[4 + inpos] >>> 44) & 32767L); + out[21 + outpos] = (in[4 + inpos] >>> 59) + | ((in[5 + inpos] & 1023L) << (15 - 10)); + out[22 + outpos] = ((in[5 + inpos] >>> 10) & 32767L); + out[23 + outpos] = ((in[5 + inpos] >>> 25) & 32767L); + out[24 + outpos] = ((in[5 + inpos] >>> 40) & 32767L); + out[25 + outpos] = (in[5 + inpos] >>> 55) + | ((in[6 + inpos] & 63L) << (15 - 6)); + out[26 + outpos] = ((in[6 + inpos] >>> 6) & 32767L); + out[27 + outpos] = ((in[6 + inpos] >>> 21) & 32767L); + out[28 + outpos] = ((in[6 + inpos] >>> 36) & 32767L); + out[29 + outpos] = (in[6 + inpos] >>> 51) + | ((in[7 + inpos] & 3L) << (15 - 2)); + out[30 + outpos] = ((in[7 + inpos] >>> 2) & 32767L); + out[31 + outpos] = ((in[7 + inpos] >>> 17) & 32767L); + out[32 + outpos] = ((in[7 + inpos] >>> 32) & 32767L); + out[33 + outpos] = ((in[7 + inpos] >>> 47) & 32767L); + out[34 + outpos] = (in[7 + inpos] >>> 62) + | ((in[8 + inpos] & 8191L) << (15 - 13)); + out[35 + outpos] = ((in[8 + inpos] >>> 13) & 32767L); + out[36 + outpos] = ((in[8 + inpos] >>> 28) & 32767L); + out[37 + outpos] = ((in[8 + inpos] >>> 43) & 32767L); + out[38 + outpos] = (in[8 + inpos] >>> 58) + | ((in[9 + inpos] & 511L) << (15 - 9)); + out[39 + outpos] = ((in[9 + inpos] >>> 9) & 32767L); + out[40 + outpos] = ((in[9 + inpos] >>> 24) & 32767L); + out[41 + outpos] = ((in[9 + inpos] >>> 39) & 32767L); + out[42 + outpos] = (in[9 + inpos] >>> 54) + | ((in[10 + inpos] & 31L) << (15 - 5)); + out[43 + outpos] = ((in[10 + inpos] >>> 5) & 32767L); + out[44 + outpos] = ((in[10 + inpos] >>> 20) & 32767L); + out[45 + outpos] = ((in[10 + inpos] >>> 35) & 32767L); + out[46 + outpos] = (in[10 + inpos] >>> 50) + | ((in[11 + inpos] & 1L) << (15 - 1)); + out[47 + outpos] = ((in[11 + inpos] >>> 1) & 32767L); + out[48 + outpos] = ((in[11 + inpos] >>> 16) & 32767L); + out[49 + outpos] = ((in[11 + inpos] >>> 31) & 32767L); + out[50 + outpos] = ((in[11 + inpos] >>> 46) & 32767L); + out[51 + outpos] = (in[11 + inpos] >>> 61) + | ((in[12 + inpos] & 4095L) << (15 - 12)); + out[52 + outpos] = ((in[12 + inpos] >>> 12) & 32767L); + out[53 + outpos] = ((in[12 + inpos] >>> 27) & 32767L); + out[54 + outpos] = ((in[12 + inpos] >>> 42) & 32767L); + out[55 + outpos] = (in[12 + inpos] >>> 57) + | ((in[13 + inpos] & 255L) << (15 - 8)); + out[56 + outpos] = ((in[13 + inpos] >>> 8) & 32767L); + out[57 + outpos] = ((in[13 + inpos] >>> 23) & 32767L); + out[58 + outpos] = ((in[13 + inpos] >>> 38) & 32767L); + out[59 + outpos] = (in[13 + inpos] >>> 53) + | ((in[14 + inpos] & 15L) << (15 - 4)); + out[60 + outpos] = ((in[14 + inpos] >>> 4) & 32767L); + out[61 + outpos] = ((in[14 + inpos] >>> 19) & 32767L); + out[62 + outpos] = ((in[14 + inpos] >>> 34) & 32767L); + out[63 + outpos] = (in[14 + inpos] >>> 49); + } + + protected static void fastunpack16(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 65535L); + out[1 + outpos] = ((in[inpos] >>> 16) & 65535L); + out[2 + outpos] = ((in[inpos] >>> 32) & 65535L); + out[3 + outpos] = (in[inpos] >>> 48); + out[4 + outpos] = (in[1 + inpos] & 65535L); + out[5 + outpos] = ((in[1 + inpos] >>> 16) & 65535L); + out[6 + outpos] = ((in[1 + inpos] >>> 32) & 65535L); + out[7 + outpos] = (in[1 + inpos] >>> 48); + out[8 + outpos] = (in[2 + inpos] & 65535L); + out[9 + outpos] = ((in[2 + inpos] >>> 16) & 65535L); + out[10 + outpos] = ((in[2 + inpos] >>> 32) & 65535L); + out[11 + outpos] = (in[2 + inpos] >>> 48); + out[12 + outpos] = (in[3 + inpos] & 65535L); + out[13 + outpos] = ((in[3 + inpos] >>> 16) & 65535L); + out[14 + outpos] = ((in[3 + inpos] >>> 32) & 65535L); + out[15 + outpos] = (in[3 + inpos] >>> 48); + out[16 + outpos] = (in[4 + inpos] & 65535L); + out[17 + outpos] = ((in[4 + inpos] >>> 16) & 65535L); + out[18 + outpos] = ((in[4 + inpos] >>> 32) & 65535L); + out[19 + outpos] = (in[4 + inpos] >>> 48); + out[20 + outpos] = (in[5 + inpos] & 65535L); + out[21 + outpos] = ((in[5 + inpos] >>> 16) & 65535L); + out[22 + outpos] = ((in[5 + inpos] >>> 32) & 65535L); + out[23 + outpos] = (in[5 + inpos] >>> 48); + out[24 + outpos] = (in[6 + inpos] & 65535L); + out[25 + outpos] = ((in[6 + inpos] >>> 16) & 65535L); + out[26 + outpos] = ((in[6 + inpos] >>> 32) & 65535L); + out[27 + outpos] = (in[6 + inpos] >>> 48); + out[28 + outpos] = (in[7 + inpos] & 65535L); + out[29 + outpos] = ((in[7 + inpos] >>> 16) & 65535L); + out[30 + outpos] = ((in[7 + inpos] >>> 32) & 65535L); + out[31 + outpos] = (in[7 + inpos] >>> 48); + out[32 + outpos] = (in[8 + inpos] & 65535L); + out[33 + outpos] = ((in[8 + inpos] >>> 16) & 65535L); + out[34 + outpos] = ((in[8 + inpos] >>> 32) & 65535L); + out[35 + outpos] = (in[8 + inpos] >>> 48); + out[36 + outpos] = (in[9 + inpos] & 65535L); + out[37 + outpos] = ((in[9 + inpos] >>> 16) & 65535L); + out[38 + outpos] = ((in[9 + inpos] >>> 32) & 65535L); + out[39 + outpos] = (in[9 + inpos] >>> 48); + out[40 + outpos] = (in[10 + inpos] & 65535L); + out[41 + outpos] = ((in[10 + inpos] >>> 16) & 65535L); + out[42 + outpos] = ((in[10 + inpos] >>> 32) & 65535L); + out[43 + outpos] = (in[10 + inpos] >>> 48); + out[44 + outpos] = (in[11 + inpos] & 65535L); + out[45 + outpos] = ((in[11 + inpos] >>> 16) & 65535L); + out[46 + outpos] = ((in[11 + inpos] >>> 32) & 65535L); + out[47 + outpos] = (in[11 + inpos] >>> 48); + out[48 + outpos] = (in[12 + inpos] & 65535L); + out[49 + outpos] = ((in[12 + inpos] >>> 16) & 65535L); + out[50 + outpos] = ((in[12 + inpos] >>> 32) & 65535L); + out[51 + outpos] = (in[12 + inpos] >>> 48); + out[52 + outpos] = (in[13 + inpos] & 65535L); + out[53 + outpos] = ((in[13 + inpos] >>> 16) & 65535L); + out[54 + outpos] = ((in[13 + inpos] >>> 32) & 65535L); + out[55 + outpos] = (in[13 + inpos] >>> 48); + out[56 + outpos] = (in[14 + inpos] & 65535L); + out[57 + outpos] = ((in[14 + inpos] >>> 16) & 65535L); + out[58 + outpos] = ((in[14 + inpos] >>> 32) & 65535L); + out[59 + outpos] = (in[14 + inpos] >>> 48); + out[60 + outpos] = (in[15 + inpos] & 65535L); + out[61 + outpos] = ((in[15 + inpos] >>> 16) & 65535L); + out[62 + outpos] = ((in[15 + inpos] >>> 32) & 65535L); + out[63 + outpos] = (in[15 + inpos] >>> 48); + } + + protected static void fastunpack17(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 131071L); + out[1 + outpos] = ((in[inpos] >>> 17) & 131071L); + out[2 + outpos] = ((in[inpos] >>> 34) & 131071L); + out[3 + outpos] = (in[inpos] >>> 51) + | ((in[1 + inpos] & 15L) << (17 - 4)); + out[4 + outpos] = ((in[1 + inpos] >>> 4) & 131071L); + out[5 + outpos] = ((in[1 + inpos] >>> 21) & 131071L); + out[6 + outpos] = ((in[1 + inpos] >>> 38) & 131071L); + out[7 + outpos] = (in[1 + inpos] >>> 55) + | ((in[2 + inpos] & 255L) << (17 - 8)); + out[8 + outpos] = ((in[2 + inpos] >>> 8) & 131071L); + out[9 + outpos] = ((in[2 + inpos] >>> 25) & 131071L); + out[10 + outpos] = ((in[2 + inpos] >>> 42) & 131071L); + out[11 + outpos] = (in[2 + inpos] >>> 59) + | ((in[3 + inpos] & 4095L) << (17 - 12)); + out[12 + outpos] = ((in[3 + inpos] >>> 12) & 131071L); + out[13 + outpos] = ((in[3 + inpos] >>> 29) & 131071L); + out[14 + outpos] = ((in[3 + inpos] >>> 46) & 131071L); + out[15 + outpos] = (in[3 + inpos] >>> 63) + | ((in[4 + inpos] & 65535L) << (17 - 16)); + out[16 + outpos] = ((in[4 + inpos] >>> 16) & 131071L); + out[17 + outpos] = ((in[4 + inpos] >>> 33) & 131071L); + out[18 + outpos] = (in[4 + inpos] >>> 50) + | ((in[5 + inpos] & 7L) << (17 - 3)); + out[19 + outpos] = ((in[5 + inpos] >>> 3) & 131071L); + out[20 + outpos] = ((in[5 + inpos] >>> 20) & 131071L); + out[21 + outpos] = ((in[5 + inpos] >>> 37) & 131071L); + out[22 + outpos] = (in[5 + inpos] >>> 54) + | ((in[6 + inpos] & 127L) << (17 - 7)); + out[23 + outpos] = ((in[6 + inpos] >>> 7) & 131071L); + out[24 + outpos] = ((in[6 + inpos] >>> 24) & 131071L); + out[25 + outpos] = ((in[6 + inpos] >>> 41) & 131071L); + out[26 + outpos] = (in[6 + inpos] >>> 58) + | ((in[7 + inpos] & 2047L) << (17 - 11)); + out[27 + outpos] = ((in[7 + inpos] >>> 11) & 131071L); + out[28 + outpos] = ((in[7 + inpos] >>> 28) & 131071L); + out[29 + outpos] = ((in[7 + inpos] >>> 45) & 131071L); + out[30 + outpos] = (in[7 + inpos] >>> 62) + | ((in[8 + inpos] & 32767L) << (17 - 15)); + out[31 + outpos] = ((in[8 + inpos] >>> 15) & 131071L); + out[32 + outpos] = ((in[8 + inpos] >>> 32) & 131071L); + out[33 + outpos] = (in[8 + inpos] >>> 49) + | ((in[9 + inpos] & 3L) << (17 - 2)); + out[34 + outpos] = ((in[9 + inpos] >>> 2) & 131071L); + out[35 + outpos] = ((in[9 + inpos] >>> 19) & 131071L); + out[36 + outpos] = ((in[9 + inpos] >>> 36) & 131071L); + out[37 + outpos] = (in[9 + inpos] >>> 53) + | ((in[10 + inpos] & 63L) << (17 - 6)); + out[38 + outpos] = ((in[10 + inpos] >>> 6) & 131071L); + out[39 + outpos] = ((in[10 + inpos] >>> 23) & 131071L); + out[40 + outpos] = ((in[10 + inpos] >>> 40) & 131071L); + out[41 + outpos] = (in[10 + inpos] >>> 57) + | ((in[11 + inpos] & 1023L) << (17 - 10)); + out[42 + outpos] = ((in[11 + inpos] >>> 10) & 131071L); + out[43 + outpos] = ((in[11 + inpos] >>> 27) & 131071L); + out[44 + outpos] = ((in[11 + inpos] >>> 44) & 131071L); + out[45 + outpos] = (in[11 + inpos] >>> 61) + | ((in[12 + inpos] & 16383L) << (17 - 14)); + out[46 + outpos] = ((in[12 + inpos] >>> 14) & 131071L); + out[47 + outpos] = ((in[12 + inpos] >>> 31) & 131071L); + out[48 + outpos] = (in[12 + inpos] >>> 48) + | ((in[13 + inpos] & 1L) << (17 - 1)); + out[49 + outpos] = ((in[13 + inpos] >>> 1) & 131071L); + out[50 + outpos] = ((in[13 + inpos] >>> 18) & 131071L); + out[51 + outpos] = ((in[13 + inpos] >>> 35) & 131071L); + out[52 + outpos] = (in[13 + inpos] >>> 52) + | ((in[14 + inpos] & 31L) << (17 - 5)); + out[53 + outpos] = ((in[14 + inpos] >>> 5) & 131071L); + out[54 + outpos] = ((in[14 + inpos] >>> 22) & 131071L); + out[55 + outpos] = ((in[14 + inpos] >>> 39) & 131071L); + out[56 + outpos] = (in[14 + inpos] >>> 56) + | ((in[15 + inpos] & 511L) << (17 - 9)); + out[57 + outpos] = ((in[15 + inpos] >>> 9) & 131071L); + out[58 + outpos] = ((in[15 + inpos] >>> 26) & 131071L); + out[59 + outpos] = ((in[15 + inpos] >>> 43) & 131071L); + out[60 + outpos] = (in[15 + inpos] >>> 60) + | ((in[16 + inpos] & 8191L) << (17 - 13)); + out[61 + outpos] = ((in[16 + inpos] >>> 13) & 131071L); + out[62 + outpos] = ((in[16 + inpos] >>> 30) & 131071L); + out[63 + outpos] = (in[16 + inpos] >>> 47); + } + + protected static void fastunpack18(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 262143L); + out[1 + outpos] = ((in[inpos] >>> 18) & 262143L); + out[2 + outpos] = ((in[inpos] >>> 36) & 262143L); + out[3 + outpos] = (in[inpos] >>> 54) + | ((in[1 + inpos] & 255L) << (18 - 8)); + out[4 + outpos] = ((in[1 + inpos] >>> 8) & 262143L); + out[5 + outpos] = ((in[1 + inpos] >>> 26) & 262143L); + out[6 + outpos] = ((in[1 + inpos] >>> 44) & 262143L); + out[7 + outpos] = (in[1 + inpos] >>> 62) + | ((in[2 + inpos] & 65535L) << (18 - 16)); + out[8 + outpos] = ((in[2 + inpos] >>> 16) & 262143L); + out[9 + outpos] = ((in[2 + inpos] >>> 34) & 262143L); + out[10 + outpos] = (in[2 + inpos] >>> 52) + | ((in[3 + inpos] & 63L) << (18 - 6)); + out[11 + outpos] = ((in[3 + inpos] >>> 6) & 262143L); + out[12 + outpos] = ((in[3 + inpos] >>> 24) & 262143L); + out[13 + outpos] = ((in[3 + inpos] >>> 42) & 262143L); + out[14 + outpos] = (in[3 + inpos] >>> 60) + | ((in[4 + inpos] & 16383L) << (18 - 14)); + out[15 + outpos] = ((in[4 + inpos] >>> 14) & 262143L); + out[16 + outpos] = ((in[4 + inpos] >>> 32) & 262143L); + out[17 + outpos] = (in[4 + inpos] >>> 50) + | ((in[5 + inpos] & 15L) << (18 - 4)); + out[18 + outpos] = ((in[5 + inpos] >>> 4) & 262143L); + out[19 + outpos] = ((in[5 + inpos] >>> 22) & 262143L); + out[20 + outpos] = ((in[5 + inpos] >>> 40) & 262143L); + out[21 + outpos] = (in[5 + inpos] >>> 58) + | ((in[6 + inpos] & 4095L) << (18 - 12)); + out[22 + outpos] = ((in[6 + inpos] >>> 12) & 262143L); + out[23 + outpos] = ((in[6 + inpos] >>> 30) & 262143L); + out[24 + outpos] = (in[6 + inpos] >>> 48) + | ((in[7 + inpos] & 3L) << (18 - 2)); + out[25 + outpos] = ((in[7 + inpos] >>> 2) & 262143L); + out[26 + outpos] = ((in[7 + inpos] >>> 20) & 262143L); + out[27 + outpos] = ((in[7 + inpos] >>> 38) & 262143L); + out[28 + outpos] = (in[7 + inpos] >>> 56) + | ((in[8 + inpos] & 1023L) << (18 - 10)); + out[29 + outpos] = ((in[8 + inpos] >>> 10) & 262143L); + out[30 + outpos] = ((in[8 + inpos] >>> 28) & 262143L); + out[31 + outpos] = (in[8 + inpos] >>> 46); + out[32 + outpos] = (in[9 + inpos] & 262143L); + out[33 + outpos] = ((in[9 + inpos] >>> 18) & 262143L); + out[34 + outpos] = ((in[9 + inpos] >>> 36) & 262143L); + out[35 + outpos] = (in[9 + inpos] >>> 54) + | ((in[10 + inpos] & 255L) << (18 - 8)); + out[36 + outpos] = ((in[10 + inpos] >>> 8) & 262143L); + out[37 + outpos] = ((in[10 + inpos] >>> 26) & 262143L); + out[38 + outpos] = ((in[10 + inpos] >>> 44) & 262143L); + out[39 + outpos] = (in[10 + inpos] >>> 62) + | ((in[11 + inpos] & 65535L) << (18 - 16)); + out[40 + outpos] = ((in[11 + inpos] >>> 16) & 262143L); + out[41 + outpos] = ((in[11 + inpos] >>> 34) & 262143L); + out[42 + outpos] = (in[11 + inpos] >>> 52) + | ((in[12 + inpos] & 63L) << (18 - 6)); + out[43 + outpos] = ((in[12 + inpos] >>> 6) & 262143L); + out[44 + outpos] = ((in[12 + inpos] >>> 24) & 262143L); + out[45 + outpos] = ((in[12 + inpos] >>> 42) & 262143L); + out[46 + outpos] = (in[12 + inpos] >>> 60) + | ((in[13 + inpos] & 16383L) << (18 - 14)); + out[47 + outpos] = ((in[13 + inpos] >>> 14) & 262143L); + out[48 + outpos] = ((in[13 + inpos] >>> 32) & 262143L); + out[49 + outpos] = (in[13 + inpos] >>> 50) + | ((in[14 + inpos] & 15L) << (18 - 4)); + out[50 + outpos] = ((in[14 + inpos] >>> 4) & 262143L); + out[51 + outpos] = ((in[14 + inpos] >>> 22) & 262143L); + out[52 + outpos] = ((in[14 + inpos] >>> 40) & 262143L); + out[53 + outpos] = (in[14 + inpos] >>> 58) + | ((in[15 + inpos] & 4095L) << (18 - 12)); + out[54 + outpos] = ((in[15 + inpos] >>> 12) & 262143L); + out[55 + outpos] = ((in[15 + inpos] >>> 30) & 262143L); + out[56 + outpos] = (in[15 + inpos] >>> 48) + | ((in[16 + inpos] & 3L) << (18 - 2)); + out[57 + outpos] = ((in[16 + inpos] >>> 2) & 262143L); + out[58 + outpos] = ((in[16 + inpos] >>> 20) & 262143L); + out[59 + outpos] = ((in[16 + inpos] >>> 38) & 262143L); + out[60 + outpos] = (in[16 + inpos] >>> 56) + | ((in[17 + inpos] & 1023L) << (18 - 10)); + out[61 + outpos] = ((in[17 + inpos] >>> 10) & 262143L); + out[62 + outpos] = ((in[17 + inpos] >>> 28) & 262143L); + out[63 + outpos] = (in[17 + inpos] >>> 46); + } + + protected static void fastunpack19(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 524287L); + out[1 + outpos] = ((in[inpos] >>> 19) & 524287L); + out[2 + outpos] = ((in[inpos] >>> 38) & 524287L); + out[3 + outpos] = (in[inpos] >>> 57) + | ((in[1 + inpos] & 4095L) << (19 - 12)); + out[4 + outpos] = ((in[1 + inpos] >>> 12) & 524287L); + out[5 + outpos] = ((in[1 + inpos] >>> 31) & 524287L); + out[6 + outpos] = (in[1 + inpos] >>> 50) + | ((in[2 + inpos] & 31L) << (19 - 5)); + out[7 + outpos] = ((in[2 + inpos] >>> 5) & 524287L); + out[8 + outpos] = ((in[2 + inpos] >>> 24) & 524287L); + out[9 + outpos] = ((in[2 + inpos] >>> 43) & 524287L); + out[10 + outpos] = (in[2 + inpos] >>> 62) + | ((in[3 + inpos] & 131071L) << (19 - 17)); + out[11 + outpos] = ((in[3 + inpos] >>> 17) & 524287L); + out[12 + outpos] = ((in[3 + inpos] >>> 36) & 524287L); + out[13 + outpos] = (in[3 + inpos] >>> 55) + | ((in[4 + inpos] & 1023L) << (19 - 10)); + out[14 + outpos] = ((in[4 + inpos] >>> 10) & 524287L); + out[15 + outpos] = ((in[4 + inpos] >>> 29) & 524287L); + out[16 + outpos] = (in[4 + inpos] >>> 48) + | ((in[5 + inpos] & 7L) << (19 - 3)); + out[17 + outpos] = ((in[5 + inpos] >>> 3) & 524287L); + out[18 + outpos] = ((in[5 + inpos] >>> 22) & 524287L); + out[19 + outpos] = ((in[5 + inpos] >>> 41) & 524287L); + out[20 + outpos] = (in[5 + inpos] >>> 60) + | ((in[6 + inpos] & 32767L) << (19 - 15)); + out[21 + outpos] = ((in[6 + inpos] >>> 15) & 524287L); + out[22 + outpos] = ((in[6 + inpos] >>> 34) & 524287L); + out[23 + outpos] = (in[6 + inpos] >>> 53) + | ((in[7 + inpos] & 255L) << (19 - 8)); + out[24 + outpos] = ((in[7 + inpos] >>> 8) & 524287L); + out[25 + outpos] = ((in[7 + inpos] >>> 27) & 524287L); + out[26 + outpos] = (in[7 + inpos] >>> 46) + | ((in[8 + inpos] & 1L) << (19 - 1)); + out[27 + outpos] = ((in[8 + inpos] >>> 1) & 524287L); + out[28 + outpos] = ((in[8 + inpos] >>> 20) & 524287L); + out[29 + outpos] = ((in[8 + inpos] >>> 39) & 524287L); + out[30 + outpos] = (in[8 + inpos] >>> 58) + | ((in[9 + inpos] & 8191L) << (19 - 13)); + out[31 + outpos] = ((in[9 + inpos] >>> 13) & 524287L); + out[32 + outpos] = ((in[9 + inpos] >>> 32) & 524287L); + out[33 + outpos] = (in[9 + inpos] >>> 51) + | ((in[10 + inpos] & 63L) << (19 - 6)); + out[34 + outpos] = ((in[10 + inpos] >>> 6) & 524287L); + out[35 + outpos] = ((in[10 + inpos] >>> 25) & 524287L); + out[36 + outpos] = ((in[10 + inpos] >>> 44) & 524287L); + out[37 + outpos] = (in[10 + inpos] >>> 63) + | ((in[11 + inpos] & 262143L) << (19 - 18)); + out[38 + outpos] = ((in[11 + inpos] >>> 18) & 524287L); + out[39 + outpos] = ((in[11 + inpos] >>> 37) & 524287L); + out[40 + outpos] = (in[11 + inpos] >>> 56) + | ((in[12 + inpos] & 2047L) << (19 - 11)); + out[41 + outpos] = ((in[12 + inpos] >>> 11) & 524287L); + out[42 + outpos] = ((in[12 + inpos] >>> 30) & 524287L); + out[43 + outpos] = (in[12 + inpos] >>> 49) + | ((in[13 + inpos] & 15L) << (19 - 4)); + out[44 + outpos] = ((in[13 + inpos] >>> 4) & 524287L); + out[45 + outpos] = ((in[13 + inpos] >>> 23) & 524287L); + out[46 + outpos] = ((in[13 + inpos] >>> 42) & 524287L); + out[47 + outpos] = (in[13 + inpos] >>> 61) + | ((in[14 + inpos] & 65535L) << (19 - 16)); + out[48 + outpos] = ((in[14 + inpos] >>> 16) & 524287L); + out[49 + outpos] = ((in[14 + inpos] >>> 35) & 524287L); + out[50 + outpos] = (in[14 + inpos] >>> 54) + | ((in[15 + inpos] & 511L) << (19 - 9)); + out[51 + outpos] = ((in[15 + inpos] >>> 9) & 524287L); + out[52 + outpos] = ((in[15 + inpos] >>> 28) & 524287L); + out[53 + outpos] = (in[15 + inpos] >>> 47) + | ((in[16 + inpos] & 3L) << (19 - 2)); + out[54 + outpos] = ((in[16 + inpos] >>> 2) & 524287L); + out[55 + outpos] = ((in[16 + inpos] >>> 21) & 524287L); + out[56 + outpos] = ((in[16 + inpos] >>> 40) & 524287L); + out[57 + outpos] = (in[16 + inpos] >>> 59) + | ((in[17 + inpos] & 16383L) << (19 - 14)); + out[58 + outpos] = ((in[17 + inpos] >>> 14) & 524287L); + out[59 + outpos] = ((in[17 + inpos] >>> 33) & 524287L); + out[60 + outpos] = (in[17 + inpos] >>> 52) + | ((in[18 + inpos] & 127L) << (19 - 7)); + out[61 + outpos] = ((in[18 + inpos] >>> 7) & 524287L); + out[62 + outpos] = ((in[18 + inpos] >>> 26) & 524287L); + out[63 + outpos] = (in[18 + inpos] >>> 45); + } + + protected static void fastunpack20(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 1048575L); + out[1 + outpos] = ((in[inpos] >>> 20) & 1048575L); + out[2 + outpos] = ((in[inpos] >>> 40) & 1048575L); + out[3 + outpos] = (in[inpos] >>> 60) + | ((in[1 + inpos] & 65535L) << (20 - 16)); + out[4 + outpos] = ((in[1 + inpos] >>> 16) & 1048575L); + out[5 + outpos] = ((in[1 + inpos] >>> 36) & 1048575L); + out[6 + outpos] = (in[1 + inpos] >>> 56) + | ((in[2 + inpos] & 4095L) << (20 - 12)); + out[7 + outpos] = ((in[2 + inpos] >>> 12) & 1048575L); + out[8 + outpos] = ((in[2 + inpos] >>> 32) & 1048575L); + out[9 + outpos] = (in[2 + inpos] >>> 52) + | ((in[3 + inpos] & 255L) << (20 - 8)); + out[10 + outpos] = ((in[3 + inpos] >>> 8) & 1048575L); + out[11 + outpos] = ((in[3 + inpos] >>> 28) & 1048575L); + out[12 + outpos] = (in[3 + inpos] >>> 48) + | ((in[4 + inpos] & 15L) << (20 - 4)); + out[13 + outpos] = ((in[4 + inpos] >>> 4) & 1048575L); + out[14 + outpos] = ((in[4 + inpos] >>> 24) & 1048575L); + out[15 + outpos] = (in[4 + inpos] >>> 44); + out[16 + outpos] = (in[5 + inpos] & 1048575L); + out[17 + outpos] = ((in[5 + inpos] >>> 20) & 1048575L); + out[18 + outpos] = ((in[5 + inpos] >>> 40) & 1048575L); + out[19 + outpos] = (in[5 + inpos] >>> 60) + | ((in[6 + inpos] & 65535L) << (20 - 16)); + out[20 + outpos] = ((in[6 + inpos] >>> 16) & 1048575L); + out[21 + outpos] = ((in[6 + inpos] >>> 36) & 1048575L); + out[22 + outpos] = (in[6 + inpos] >>> 56) + | ((in[7 + inpos] & 4095L) << (20 - 12)); + out[23 + outpos] = ((in[7 + inpos] >>> 12) & 1048575L); + out[24 + outpos] = ((in[7 + inpos] >>> 32) & 1048575L); + out[25 + outpos] = (in[7 + inpos] >>> 52) + | ((in[8 + inpos] & 255L) << (20 - 8)); + out[26 + outpos] = ((in[8 + inpos] >>> 8) & 1048575L); + out[27 + outpos] = ((in[8 + inpos] >>> 28) & 1048575L); + out[28 + outpos] = (in[8 + inpos] >>> 48) + | ((in[9 + inpos] & 15L) << (20 - 4)); + out[29 + outpos] = ((in[9 + inpos] >>> 4) & 1048575L); + out[30 + outpos] = ((in[9 + inpos] >>> 24) & 1048575L); + out[31 + outpos] = (in[9 + inpos] >>> 44); + out[32 + outpos] = (in[10 + inpos] & 1048575L); + out[33 + outpos] = ((in[10 + inpos] >>> 20) & 1048575L); + out[34 + outpos] = ((in[10 + inpos] >>> 40) & 1048575L); + out[35 + outpos] = (in[10 + inpos] >>> 60) + | ((in[11 + inpos] & 65535L) << (20 - 16)); + out[36 + outpos] = ((in[11 + inpos] >>> 16) & 1048575L); + out[37 + outpos] = ((in[11 + inpos] >>> 36) & 1048575L); + out[38 + outpos] = (in[11 + inpos] >>> 56) + | ((in[12 + inpos] & 4095L) << (20 - 12)); + out[39 + outpos] = ((in[12 + inpos] >>> 12) & 1048575L); + out[40 + outpos] = ((in[12 + inpos] >>> 32) & 1048575L); + out[41 + outpos] = (in[12 + inpos] >>> 52) + | ((in[13 + inpos] & 255L) << (20 - 8)); + out[42 + outpos] = ((in[13 + inpos] >>> 8) & 1048575L); + out[43 + outpos] = ((in[13 + inpos] >>> 28) & 1048575L); + out[44 + outpos] = (in[13 + inpos] >>> 48) + | ((in[14 + inpos] & 15L) << (20 - 4)); + out[45 + outpos] = ((in[14 + inpos] >>> 4) & 1048575L); + out[46 + outpos] = ((in[14 + inpos] >>> 24) & 1048575L); + out[47 + outpos] = (in[14 + inpos] >>> 44); + out[48 + outpos] = (in[15 + inpos] & 1048575L); + out[49 + outpos] = ((in[15 + inpos] >>> 20) & 1048575L); + out[50 + outpos] = ((in[15 + inpos] >>> 40) & 1048575L); + out[51 + outpos] = (in[15 + inpos] >>> 60) + | ((in[16 + inpos] & 65535L) << (20 - 16)); + out[52 + outpos] = ((in[16 + inpos] >>> 16) & 1048575L); + out[53 + outpos] = ((in[16 + inpos] >>> 36) & 1048575L); + out[54 + outpos] = (in[16 + inpos] >>> 56) + | ((in[17 + inpos] & 4095L) << (20 - 12)); + out[55 + outpos] = ((in[17 + inpos] >>> 12) & 1048575L); + out[56 + outpos] = ((in[17 + inpos] >>> 32) & 1048575L); + out[57 + outpos] = (in[17 + inpos] >>> 52) + | ((in[18 + inpos] & 255L) << (20 - 8)); + out[58 + outpos] = ((in[18 + inpos] >>> 8) & 1048575L); + out[59 + outpos] = ((in[18 + inpos] >>> 28) & 1048575L); + out[60 + outpos] = (in[18 + inpos] >>> 48) + | ((in[19 + inpos] & 15L) << (20 - 4)); + out[61 + outpos] = ((in[19 + inpos] >>> 4) & 1048575L); + out[62 + outpos] = ((in[19 + inpos] >>> 24) & 1048575L); + out[63 + outpos] = (in[19 + inpos] >>> 44); + } + + protected static void fastunpack21(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 2097151L); + out[1 + outpos] = ((in[inpos] >>> 21) & 2097151L); + out[2 + outpos] = ((in[inpos] >>> 42) & 2097151L); + out[3 + outpos] = (in[inpos] >>> 63) + | ((in[1 + inpos] & 1048575L) << (21 - 20)); + out[4 + outpos] = ((in[1 + inpos] >>> 20) & 2097151L); + out[5 + outpos] = ((in[1 + inpos] >>> 41) & 2097151L); + out[6 + outpos] = (in[1 + inpos] >>> 62) + | ((in[2 + inpos] & 524287L) << (21 - 19)); + out[7 + outpos] = ((in[2 + inpos] >>> 19) & 2097151L); + out[8 + outpos] = ((in[2 + inpos] >>> 40) & 2097151L); + out[9 + outpos] = (in[2 + inpos] >>> 61) + | ((in[3 + inpos] & 262143L) << (21 - 18)); + out[10 + outpos] = ((in[3 + inpos] >>> 18) & 2097151L); + out[11 + outpos] = ((in[3 + inpos] >>> 39) & 2097151L); + out[12 + outpos] = (in[3 + inpos] >>> 60) + | ((in[4 + inpos] & 131071L) << (21 - 17)); + out[13 + outpos] = ((in[4 + inpos] >>> 17) & 2097151L); + out[14 + outpos] = ((in[4 + inpos] >>> 38) & 2097151L); + out[15 + outpos] = (in[4 + inpos] >>> 59) + | ((in[5 + inpos] & 65535L) << (21 - 16)); + out[16 + outpos] = ((in[5 + inpos] >>> 16) & 2097151L); + out[17 + outpos] = ((in[5 + inpos] >>> 37) & 2097151L); + out[18 + outpos] = (in[5 + inpos] >>> 58) + | ((in[6 + inpos] & 32767L) << (21 - 15)); + out[19 + outpos] = ((in[6 + inpos] >>> 15) & 2097151L); + out[20 + outpos] = ((in[6 + inpos] >>> 36) & 2097151L); + out[21 + outpos] = (in[6 + inpos] >>> 57) + | ((in[7 + inpos] & 16383L) << (21 - 14)); + out[22 + outpos] = ((in[7 + inpos] >>> 14) & 2097151L); + out[23 + outpos] = ((in[7 + inpos] >>> 35) & 2097151L); + out[24 + outpos] = (in[7 + inpos] >>> 56) + | ((in[8 + inpos] & 8191L) << (21 - 13)); + out[25 + outpos] = ((in[8 + inpos] >>> 13) & 2097151L); + out[26 + outpos] = ((in[8 + inpos] >>> 34) & 2097151L); + out[27 + outpos] = (in[8 + inpos] >>> 55) + | ((in[9 + inpos] & 4095L) << (21 - 12)); + out[28 + outpos] = ((in[9 + inpos] >>> 12) & 2097151L); + out[29 + outpos] = ((in[9 + inpos] >>> 33) & 2097151L); + out[30 + outpos] = (in[9 + inpos] >>> 54) + | ((in[10 + inpos] & 2047L) << (21 - 11)); + out[31 + outpos] = ((in[10 + inpos] >>> 11) & 2097151L); + out[32 + outpos] = ((in[10 + inpos] >>> 32) & 2097151L); + out[33 + outpos] = (in[10 + inpos] >>> 53) + | ((in[11 + inpos] & 1023L) << (21 - 10)); + out[34 + outpos] = ((in[11 + inpos] >>> 10) & 2097151L); + out[35 + outpos] = ((in[11 + inpos] >>> 31) & 2097151L); + out[36 + outpos] = (in[11 + inpos] >>> 52) + | ((in[12 + inpos] & 511L) << (21 - 9)); + out[37 + outpos] = ((in[12 + inpos] >>> 9) & 2097151L); + out[38 + outpos] = ((in[12 + inpos] >>> 30) & 2097151L); + out[39 + outpos] = (in[12 + inpos] >>> 51) + | ((in[13 + inpos] & 255L) << (21 - 8)); + out[40 + outpos] = ((in[13 + inpos] >>> 8) & 2097151L); + out[41 + outpos] = ((in[13 + inpos] >>> 29) & 2097151L); + out[42 + outpos] = (in[13 + inpos] >>> 50) + | ((in[14 + inpos] & 127L) << (21 - 7)); + out[43 + outpos] = ((in[14 + inpos] >>> 7) & 2097151L); + out[44 + outpos] = ((in[14 + inpos] >>> 28) & 2097151L); + out[45 + outpos] = (in[14 + inpos] >>> 49) + | ((in[15 + inpos] & 63L) << (21 - 6)); + out[46 + outpos] = ((in[15 + inpos] >>> 6) & 2097151L); + out[47 + outpos] = ((in[15 + inpos] >>> 27) & 2097151L); + out[48 + outpos] = (in[15 + inpos] >>> 48) + | ((in[16 + inpos] & 31L) << (21 - 5)); + out[49 + outpos] = ((in[16 + inpos] >>> 5) & 2097151L); + out[50 + outpos] = ((in[16 + inpos] >>> 26) & 2097151L); + out[51 + outpos] = (in[16 + inpos] >>> 47) + | ((in[17 + inpos] & 15L) << (21 - 4)); + out[52 + outpos] = ((in[17 + inpos] >>> 4) & 2097151L); + out[53 + outpos] = ((in[17 + inpos] >>> 25) & 2097151L); + out[54 + outpos] = (in[17 + inpos] >>> 46) + | ((in[18 + inpos] & 7L) << (21 - 3)); + out[55 + outpos] = ((in[18 + inpos] >>> 3) & 2097151L); + out[56 + outpos] = ((in[18 + inpos] >>> 24) & 2097151L); + out[57 + outpos] = (in[18 + inpos] >>> 45) + | ((in[19 + inpos] & 3L) << (21 - 2)); + out[58 + outpos] = ((in[19 + inpos] >>> 2) & 2097151L); + out[59 + outpos] = ((in[19 + inpos] >>> 23) & 2097151L); + out[60 + outpos] = (in[19 + inpos] >>> 44) + | ((in[20 + inpos] & 1L) << (21 - 1)); + out[61 + outpos] = ((in[20 + inpos] >>> 1) & 2097151L); + out[62 + outpos] = ((in[20 + inpos] >>> 22) & 2097151L); + out[63 + outpos] = (in[20 + inpos] >>> 43); + } + + protected static void fastunpack22(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 4194303L); + out[1 + outpos] = ((in[inpos] >>> 22) & 4194303L); + out[2 + outpos] = (in[inpos] >>> 44) + | ((in[1 + inpos] & 3L) << (22 - 2)); + out[3 + outpos] = ((in[1 + inpos] >>> 2) & 4194303L); + out[4 + outpos] = ((in[1 + inpos] >>> 24) & 4194303L); + out[5 + outpos] = (in[1 + inpos] >>> 46) + | ((in[2 + inpos] & 15L) << (22 - 4)); + out[6 + outpos] = ((in[2 + inpos] >>> 4) & 4194303L); + out[7 + outpos] = ((in[2 + inpos] >>> 26) & 4194303L); + out[8 + outpos] = (in[2 + inpos] >>> 48) + | ((in[3 + inpos] & 63L) << (22 - 6)); + out[9 + outpos] = ((in[3 + inpos] >>> 6) & 4194303L); + out[10 + outpos] = ((in[3 + inpos] >>> 28) & 4194303L); + out[11 + outpos] = (in[3 + inpos] >>> 50) + | ((in[4 + inpos] & 255L) << (22 - 8)); + out[12 + outpos] = ((in[4 + inpos] >>> 8) & 4194303L); + out[13 + outpos] = ((in[4 + inpos] >>> 30) & 4194303L); + out[14 + outpos] = (in[4 + inpos] >>> 52) + | ((in[5 + inpos] & 1023L) << (22 - 10)); + out[15 + outpos] = ((in[5 + inpos] >>> 10) & 4194303L); + out[16 + outpos] = ((in[5 + inpos] >>> 32) & 4194303L); + out[17 + outpos] = (in[5 + inpos] >>> 54) + | ((in[6 + inpos] & 4095L) << (22 - 12)); + out[18 + outpos] = ((in[6 + inpos] >>> 12) & 4194303L); + out[19 + outpos] = ((in[6 + inpos] >>> 34) & 4194303L); + out[20 + outpos] = (in[6 + inpos] >>> 56) + | ((in[7 + inpos] & 16383L) << (22 - 14)); + out[21 + outpos] = ((in[7 + inpos] >>> 14) & 4194303L); + out[22 + outpos] = ((in[7 + inpos] >>> 36) & 4194303L); + out[23 + outpos] = (in[7 + inpos] >>> 58) + | ((in[8 + inpos] & 65535L) << (22 - 16)); + out[24 + outpos] = ((in[8 + inpos] >>> 16) & 4194303L); + out[25 + outpos] = ((in[8 + inpos] >>> 38) & 4194303L); + out[26 + outpos] = (in[8 + inpos] >>> 60) + | ((in[9 + inpos] & 262143L) << (22 - 18)); + out[27 + outpos] = ((in[9 + inpos] >>> 18) & 4194303L); + out[28 + outpos] = ((in[9 + inpos] >>> 40) & 4194303L); + out[29 + outpos] = (in[9 + inpos] >>> 62) + | ((in[10 + inpos] & 1048575L) << (22 - 20)); + out[30 + outpos] = ((in[10 + inpos] >>> 20) & 4194303L); + out[31 + outpos] = (in[10 + inpos] >>> 42); + out[32 + outpos] = (in[11 + inpos] & 4194303L); + out[33 + outpos] = ((in[11 + inpos] >>> 22) & 4194303L); + out[34 + outpos] = (in[11 + inpos] >>> 44) + | ((in[12 + inpos] & 3L) << (22 - 2)); + out[35 + outpos] = ((in[12 + inpos] >>> 2) & 4194303L); + out[36 + outpos] = ((in[12 + inpos] >>> 24) & 4194303L); + out[37 + outpos] = (in[12 + inpos] >>> 46) + | ((in[13 + inpos] & 15L) << (22 - 4)); + out[38 + outpos] = ((in[13 + inpos] >>> 4) & 4194303L); + out[39 + outpos] = ((in[13 + inpos] >>> 26) & 4194303L); + out[40 + outpos] = (in[13 + inpos] >>> 48) + | ((in[14 + inpos] & 63L) << (22 - 6)); + out[41 + outpos] = ((in[14 + inpos] >>> 6) & 4194303L); + out[42 + outpos] = ((in[14 + inpos] >>> 28) & 4194303L); + out[43 + outpos] = (in[14 + inpos] >>> 50) + | ((in[15 + inpos] & 255L) << (22 - 8)); + out[44 + outpos] = ((in[15 + inpos] >>> 8) & 4194303L); + out[45 + outpos] = ((in[15 + inpos] >>> 30) & 4194303L); + out[46 + outpos] = (in[15 + inpos] >>> 52) + | ((in[16 + inpos] & 1023L) << (22 - 10)); + out[47 + outpos] = ((in[16 + inpos] >>> 10) & 4194303L); + out[48 + outpos] = ((in[16 + inpos] >>> 32) & 4194303L); + out[49 + outpos] = (in[16 + inpos] >>> 54) + | ((in[17 + inpos] & 4095L) << (22 - 12)); + out[50 + outpos] = ((in[17 + inpos] >>> 12) & 4194303L); + out[51 + outpos] = ((in[17 + inpos] >>> 34) & 4194303L); + out[52 + outpos] = (in[17 + inpos] >>> 56) + | ((in[18 + inpos] & 16383L) << (22 - 14)); + out[53 + outpos] = ((in[18 + inpos] >>> 14) & 4194303L); + out[54 + outpos] = ((in[18 + inpos] >>> 36) & 4194303L); + out[55 + outpos] = (in[18 + inpos] >>> 58) + | ((in[19 + inpos] & 65535L) << (22 - 16)); + out[56 + outpos] = ((in[19 + inpos] >>> 16) & 4194303L); + out[57 + outpos] = ((in[19 + inpos] >>> 38) & 4194303L); + out[58 + outpos] = (in[19 + inpos] >>> 60) + | ((in[20 + inpos] & 262143L) << (22 - 18)); + out[59 + outpos] = ((in[20 + inpos] >>> 18) & 4194303L); + out[60 + outpos] = ((in[20 + inpos] >>> 40) & 4194303L); + out[61 + outpos] = (in[20 + inpos] >>> 62) + | ((in[21 + inpos] & 1048575L) << (22 - 20)); + out[62 + outpos] = ((in[21 + inpos] >>> 20) & 4194303L); + out[63 + outpos] = (in[21 + inpos] >>> 42); + } + + protected static void fastunpack23(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 8388607L); + out[1 + outpos] = ((in[inpos] >>> 23) & 8388607L); + out[2 + outpos] = (in[inpos] >>> 46) + | ((in[1 + inpos] & 31L) << (23 - 5)); + out[3 + outpos] = ((in[1 + inpos] >>> 5) & 8388607L); + out[4 + outpos] = ((in[1 + inpos] >>> 28) & 8388607L); + out[5 + outpos] = (in[1 + inpos] >>> 51) + | ((in[2 + inpos] & 1023L) << (23 - 10)); + out[6 + outpos] = ((in[2 + inpos] >>> 10) & 8388607L); + out[7 + outpos] = ((in[2 + inpos] >>> 33) & 8388607L); + out[8 + outpos] = (in[2 + inpos] >>> 56) + | ((in[3 + inpos] & 32767L) << (23 - 15)); + out[9 + outpos] = ((in[3 + inpos] >>> 15) & 8388607L); + out[10 + outpos] = ((in[3 + inpos] >>> 38) & 8388607L); + out[11 + outpos] = (in[3 + inpos] >>> 61) + | ((in[4 + inpos] & 1048575L) << (23 - 20)); + out[12 + outpos] = ((in[4 + inpos] >>> 20) & 8388607L); + out[13 + outpos] = (in[4 + inpos] >>> 43) + | ((in[5 + inpos] & 3L) << (23 - 2)); + out[14 + outpos] = ((in[5 + inpos] >>> 2) & 8388607L); + out[15 + outpos] = ((in[5 + inpos] >>> 25) & 8388607L); + out[16 + outpos] = (in[5 + inpos] >>> 48) + | ((in[6 + inpos] & 127L) << (23 - 7)); + out[17 + outpos] = ((in[6 + inpos] >>> 7) & 8388607L); + out[18 + outpos] = ((in[6 + inpos] >>> 30) & 8388607L); + out[19 + outpos] = (in[6 + inpos] >>> 53) + | ((in[7 + inpos] & 4095L) << (23 - 12)); + out[20 + outpos] = ((in[7 + inpos] >>> 12) & 8388607L); + out[21 + outpos] = ((in[7 + inpos] >>> 35) & 8388607L); + out[22 + outpos] = (in[7 + inpos] >>> 58) + | ((in[8 + inpos] & 131071L) << (23 - 17)); + out[23 + outpos] = ((in[8 + inpos] >>> 17) & 8388607L); + out[24 + outpos] = ((in[8 + inpos] >>> 40) & 8388607L); + out[25 + outpos] = (in[8 + inpos] >>> 63) + | ((in[9 + inpos] & 4194303L) << (23 - 22)); + out[26 + outpos] = ((in[9 + inpos] >>> 22) & 8388607L); + out[27 + outpos] = (in[9 + inpos] >>> 45) + | ((in[10 + inpos] & 15L) << (23 - 4)); + out[28 + outpos] = ((in[10 + inpos] >>> 4) & 8388607L); + out[29 + outpos] = ((in[10 + inpos] >>> 27) & 8388607L); + out[30 + outpos] = (in[10 + inpos] >>> 50) + | ((in[11 + inpos] & 511L) << (23 - 9)); + out[31 + outpos] = ((in[11 + inpos] >>> 9) & 8388607L); + out[32 + outpos] = ((in[11 + inpos] >>> 32) & 8388607L); + out[33 + outpos] = (in[11 + inpos] >>> 55) + | ((in[12 + inpos] & 16383L) << (23 - 14)); + out[34 + outpos] = ((in[12 + inpos] >>> 14) & 8388607L); + out[35 + outpos] = ((in[12 + inpos] >>> 37) & 8388607L); + out[36 + outpos] = (in[12 + inpos] >>> 60) + | ((in[13 + inpos] & 524287L) << (23 - 19)); + out[37 + outpos] = ((in[13 + inpos] >>> 19) & 8388607L); + out[38 + outpos] = (in[13 + inpos] >>> 42) + | ((in[14 + inpos] & 1L) << (23 - 1)); + out[39 + outpos] = ((in[14 + inpos] >>> 1) & 8388607L); + out[40 + outpos] = ((in[14 + inpos] >>> 24) & 8388607L); + out[41 + outpos] = (in[14 + inpos] >>> 47) + | ((in[15 + inpos] & 63L) << (23 - 6)); + out[42 + outpos] = ((in[15 + inpos] >>> 6) & 8388607L); + out[43 + outpos] = ((in[15 + inpos] >>> 29) & 8388607L); + out[44 + outpos] = (in[15 + inpos] >>> 52) + | ((in[16 + inpos] & 2047L) << (23 - 11)); + out[45 + outpos] = ((in[16 + inpos] >>> 11) & 8388607L); + out[46 + outpos] = ((in[16 + inpos] >>> 34) & 8388607L); + out[47 + outpos] = (in[16 + inpos] >>> 57) + | ((in[17 + inpos] & 65535L) << (23 - 16)); + out[48 + outpos] = ((in[17 + inpos] >>> 16) & 8388607L); + out[49 + outpos] = ((in[17 + inpos] >>> 39) & 8388607L); + out[50 + outpos] = (in[17 + inpos] >>> 62) + | ((in[18 + inpos] & 2097151L) << (23 - 21)); + out[51 + outpos] = ((in[18 + inpos] >>> 21) & 8388607L); + out[52 + outpos] = (in[18 + inpos] >>> 44) + | ((in[19 + inpos] & 7L) << (23 - 3)); + out[53 + outpos] = ((in[19 + inpos] >>> 3) & 8388607L); + out[54 + outpos] = ((in[19 + inpos] >>> 26) & 8388607L); + out[55 + outpos] = (in[19 + inpos] >>> 49) + | ((in[20 + inpos] & 255L) << (23 - 8)); + out[56 + outpos] = ((in[20 + inpos] >>> 8) & 8388607L); + out[57 + outpos] = ((in[20 + inpos] >>> 31) & 8388607L); + out[58 + outpos] = (in[20 + inpos] >>> 54) + | ((in[21 + inpos] & 8191L) << (23 - 13)); + out[59 + outpos] = ((in[21 + inpos] >>> 13) & 8388607L); + out[60 + outpos] = ((in[21 + inpos] >>> 36) & 8388607L); + out[61 + outpos] = (in[21 + inpos] >>> 59) + | ((in[22 + inpos] & 262143L) << (23 - 18)); + out[62 + outpos] = ((in[22 + inpos] >>> 18) & 8388607L); + out[63 + outpos] = (in[22 + inpos] >>> 41); + } + + protected static void fastunpack24(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 16777215L); + out[1 + outpos] = ((in[inpos] >>> 24) & 16777215L); + out[2 + outpos] = (in[inpos] >>> 48) + | ((in[1 + inpos] & 255L) << (24 - 8)); + out[3 + outpos] = ((in[1 + inpos] >>> 8) & 16777215L); + out[4 + outpos] = ((in[1 + inpos] >>> 32) & 16777215L); + out[5 + outpos] = (in[1 + inpos] >>> 56) + | ((in[2 + inpos] & 65535L) << (24 - 16)); + out[6 + outpos] = ((in[2 + inpos] >>> 16) & 16777215L); + out[7 + outpos] = (in[2 + inpos] >>> 40); + out[8 + outpos] = (in[3 + inpos] & 16777215L); + out[9 + outpos] = ((in[3 + inpos] >>> 24) & 16777215L); + out[10 + outpos] = (in[3 + inpos] >>> 48) + | ((in[4 + inpos] & 255L) << (24 - 8)); + out[11 + outpos] = ((in[4 + inpos] >>> 8) & 16777215L); + out[12 + outpos] = ((in[4 + inpos] >>> 32) & 16777215L); + out[13 + outpos] = (in[4 + inpos] >>> 56) + | ((in[5 + inpos] & 65535L) << (24 - 16)); + out[14 + outpos] = ((in[5 + inpos] >>> 16) & 16777215L); + out[15 + outpos] = (in[5 + inpos] >>> 40); + out[16 + outpos] = (in[6 + inpos] & 16777215L); + out[17 + outpos] = ((in[6 + inpos] >>> 24) & 16777215L); + out[18 + outpos] = (in[6 + inpos] >>> 48) + | ((in[7 + inpos] & 255L) << (24 - 8)); + out[19 + outpos] = ((in[7 + inpos] >>> 8) & 16777215L); + out[20 + outpos] = ((in[7 + inpos] >>> 32) & 16777215L); + out[21 + outpos] = (in[7 + inpos] >>> 56) + | ((in[8 + inpos] & 65535L) << (24 - 16)); + out[22 + outpos] = ((in[8 + inpos] >>> 16) & 16777215L); + out[23 + outpos] = (in[8 + inpos] >>> 40); + out[24 + outpos] = (in[9 + inpos] & 16777215L); + out[25 + outpos] = ((in[9 + inpos] >>> 24) & 16777215L); + out[26 + outpos] = (in[9 + inpos] >>> 48) + | ((in[10 + inpos] & 255L) << (24 - 8)); + out[27 + outpos] = ((in[10 + inpos] >>> 8) & 16777215L); + out[28 + outpos] = ((in[10 + inpos] >>> 32) & 16777215L); + out[29 + outpos] = (in[10 + inpos] >>> 56) + | ((in[11 + inpos] & 65535L) << (24 - 16)); + out[30 + outpos] = ((in[11 + inpos] >>> 16) & 16777215L); + out[31 + outpos] = (in[11 + inpos] >>> 40); + out[32 + outpos] = (in[12 + inpos] & 16777215L); + out[33 + outpos] = ((in[12 + inpos] >>> 24) & 16777215L); + out[34 + outpos] = (in[12 + inpos] >>> 48) + | ((in[13 + inpos] & 255L) << (24 - 8)); + out[35 + outpos] = ((in[13 + inpos] >>> 8) & 16777215L); + out[36 + outpos] = ((in[13 + inpos] >>> 32) & 16777215L); + out[37 + outpos] = (in[13 + inpos] >>> 56) + | ((in[14 + inpos] & 65535L) << (24 - 16)); + out[38 + outpos] = ((in[14 + inpos] >>> 16) & 16777215L); + out[39 + outpos] = (in[14 + inpos] >>> 40); + out[40 + outpos] = (in[15 + inpos] & 16777215L); + out[41 + outpos] = ((in[15 + inpos] >>> 24) & 16777215L); + out[42 + outpos] = (in[15 + inpos] >>> 48) + | ((in[16 + inpos] & 255L) << (24 - 8)); + out[43 + outpos] = ((in[16 + inpos] >>> 8) & 16777215L); + out[44 + outpos] = ((in[16 + inpos] >>> 32) & 16777215L); + out[45 + outpos] = (in[16 + inpos] >>> 56) + | ((in[17 + inpos] & 65535L) << (24 - 16)); + out[46 + outpos] = ((in[17 + inpos] >>> 16) & 16777215L); + out[47 + outpos] = (in[17 + inpos] >>> 40); + out[48 + outpos] = (in[18 + inpos] & 16777215L); + out[49 + outpos] = ((in[18 + inpos] >>> 24) & 16777215L); + out[50 + outpos] = (in[18 + inpos] >>> 48) + | ((in[19 + inpos] & 255L) << (24 - 8)); + out[51 + outpos] = ((in[19 + inpos] >>> 8) & 16777215L); + out[52 + outpos] = ((in[19 + inpos] >>> 32) & 16777215L); + out[53 + outpos] = (in[19 + inpos] >>> 56) + | ((in[20 + inpos] & 65535L) << (24 - 16)); + out[54 + outpos] = ((in[20 + inpos] >>> 16) & 16777215L); + out[55 + outpos] = (in[20 + inpos] >>> 40); + out[56 + outpos] = (in[21 + inpos] & 16777215L); + out[57 + outpos] = ((in[21 + inpos] >>> 24) & 16777215L); + out[58 + outpos] = (in[21 + inpos] >>> 48) + | ((in[22 + inpos] & 255L) << (24 - 8)); + out[59 + outpos] = ((in[22 + inpos] >>> 8) & 16777215L); + out[60 + outpos] = ((in[22 + inpos] >>> 32) & 16777215L); + out[61 + outpos] = (in[22 + inpos] >>> 56) + | ((in[23 + inpos] & 65535L) << (24 - 16)); + out[62 + outpos] = ((in[23 + inpos] >>> 16) & 16777215L); + out[63 + outpos] = (in[23 + inpos] >>> 40); + } + + protected static void fastunpack25(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 33554431L); + out[1 + outpos] = ((in[inpos] >>> 25) & 33554431L); + out[2 + outpos] = (in[inpos] >>> 50) + | ((in[1 + inpos] & 2047L) << (25 - 11)); + out[3 + outpos] = ((in[1 + inpos] >>> 11) & 33554431L); + out[4 + outpos] = ((in[1 + inpos] >>> 36) & 33554431L); + out[5 + outpos] = (in[1 + inpos] >>> 61) + | ((in[2 + inpos] & 4194303L) << (25 - 22)); + out[6 + outpos] = ((in[2 + inpos] >>> 22) & 33554431L); + out[7 + outpos] = (in[2 + inpos] >>> 47) + | ((in[3 + inpos] & 255L) << (25 - 8)); + out[8 + outpos] = ((in[3 + inpos] >>> 8) & 33554431L); + out[9 + outpos] = ((in[3 + inpos] >>> 33) & 33554431L); + out[10 + outpos] = (in[3 + inpos] >>> 58) + | ((in[4 + inpos] & 524287L) << (25 - 19)); + out[11 + outpos] = ((in[4 + inpos] >>> 19) & 33554431L); + out[12 + outpos] = (in[4 + inpos] >>> 44) + | ((in[5 + inpos] & 31L) << (25 - 5)); + out[13 + outpos] = ((in[5 + inpos] >>> 5) & 33554431L); + out[14 + outpos] = ((in[5 + inpos] >>> 30) & 33554431L); + out[15 + outpos] = (in[5 + inpos] >>> 55) + | ((in[6 + inpos] & 65535L) << (25 - 16)); + out[16 + outpos] = ((in[6 + inpos] >>> 16) & 33554431L); + out[17 + outpos] = (in[6 + inpos] >>> 41) + | ((in[7 + inpos] & 3L) << (25 - 2)); + out[18 + outpos] = ((in[7 + inpos] >>> 2) & 33554431L); + out[19 + outpos] = ((in[7 + inpos] >>> 27) & 33554431L); + out[20 + outpos] = (in[7 + inpos] >>> 52) + | ((in[8 + inpos] & 8191L) << (25 - 13)); + out[21 + outpos] = ((in[8 + inpos] >>> 13) & 33554431L); + out[22 + outpos] = ((in[8 + inpos] >>> 38) & 33554431L); + out[23 + outpos] = (in[8 + inpos] >>> 63) + | ((in[9 + inpos] & 16777215L) << (25 - 24)); + out[24 + outpos] = ((in[9 + inpos] >>> 24) & 33554431L); + out[25 + outpos] = (in[9 + inpos] >>> 49) + | ((in[10 + inpos] & 1023L) << (25 - 10)); + out[26 + outpos] = ((in[10 + inpos] >>> 10) & 33554431L); + out[27 + outpos] = ((in[10 + inpos] >>> 35) & 33554431L); + out[28 + outpos] = (in[10 + inpos] >>> 60) + | ((in[11 + inpos] & 2097151L) << (25 - 21)); + out[29 + outpos] = ((in[11 + inpos] >>> 21) & 33554431L); + out[30 + outpos] = (in[11 + inpos] >>> 46) + | ((in[12 + inpos] & 127L) << (25 - 7)); + out[31 + outpos] = ((in[12 + inpos] >>> 7) & 33554431L); + out[32 + outpos] = ((in[12 + inpos] >>> 32) & 33554431L); + out[33 + outpos] = (in[12 + inpos] >>> 57) + | ((in[13 + inpos] & 262143L) << (25 - 18)); + out[34 + outpos] = ((in[13 + inpos] >>> 18) & 33554431L); + out[35 + outpos] = (in[13 + inpos] >>> 43) + | ((in[14 + inpos] & 15L) << (25 - 4)); + out[36 + outpos] = ((in[14 + inpos] >>> 4) & 33554431L); + out[37 + outpos] = ((in[14 + inpos] >>> 29) & 33554431L); + out[38 + outpos] = (in[14 + inpos] >>> 54) + | ((in[15 + inpos] & 32767L) << (25 - 15)); + out[39 + outpos] = ((in[15 + inpos] >>> 15) & 33554431L); + out[40 + outpos] = (in[15 + inpos] >>> 40) + | ((in[16 + inpos] & 1L) << (25 - 1)); + out[41 + outpos] = ((in[16 + inpos] >>> 1) & 33554431L); + out[42 + outpos] = ((in[16 + inpos] >>> 26) & 33554431L); + out[43 + outpos] = (in[16 + inpos] >>> 51) + | ((in[17 + inpos] & 4095L) << (25 - 12)); + out[44 + outpos] = ((in[17 + inpos] >>> 12) & 33554431L); + out[45 + outpos] = ((in[17 + inpos] >>> 37) & 33554431L); + out[46 + outpos] = (in[17 + inpos] >>> 62) + | ((in[18 + inpos] & 8388607L) << (25 - 23)); + out[47 + outpos] = ((in[18 + inpos] >>> 23) & 33554431L); + out[48 + outpos] = (in[18 + inpos] >>> 48) + | ((in[19 + inpos] & 511L) << (25 - 9)); + out[49 + outpos] = ((in[19 + inpos] >>> 9) & 33554431L); + out[50 + outpos] = ((in[19 + inpos] >>> 34) & 33554431L); + out[51 + outpos] = (in[19 + inpos] >>> 59) + | ((in[20 + inpos] & 1048575L) << (25 - 20)); + out[52 + outpos] = ((in[20 + inpos] >>> 20) & 33554431L); + out[53 + outpos] = (in[20 + inpos] >>> 45) + | ((in[21 + inpos] & 63L) << (25 - 6)); + out[54 + outpos] = ((in[21 + inpos] >>> 6) & 33554431L); + out[55 + outpos] = ((in[21 + inpos] >>> 31) & 33554431L); + out[56 + outpos] = (in[21 + inpos] >>> 56) + | ((in[22 + inpos] & 131071L) << (25 - 17)); + out[57 + outpos] = ((in[22 + inpos] >>> 17) & 33554431L); + out[58 + outpos] = (in[22 + inpos] >>> 42) + | ((in[23 + inpos] & 7L) << (25 - 3)); + out[59 + outpos] = ((in[23 + inpos] >>> 3) & 33554431L); + out[60 + outpos] = ((in[23 + inpos] >>> 28) & 33554431L); + out[61 + outpos] = (in[23 + inpos] >>> 53) + | ((in[24 + inpos] & 16383L) << (25 - 14)); + out[62 + outpos] = ((in[24 + inpos] >>> 14) & 33554431L); + out[63 + outpos] = (in[24 + inpos] >>> 39); + } + + protected static void fastunpack26(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 67108863L); + out[1 + outpos] = ((in[inpos] >>> 26) & 67108863L); + out[2 + outpos] = (in[inpos] >>> 52) + | ((in[1 + inpos] & 16383L) << (26 - 14)); + out[3 + outpos] = ((in[1 + inpos] >>> 14) & 67108863L); + out[4 + outpos] = (in[1 + inpos] >>> 40) + | ((in[2 + inpos] & 3L) << (26 - 2)); + out[5 + outpos] = ((in[2 + inpos] >>> 2) & 67108863L); + out[6 + outpos] = ((in[2 + inpos] >>> 28) & 67108863L); + out[7 + outpos] = (in[2 + inpos] >>> 54) + | ((in[3 + inpos] & 65535L) << (26 - 16)); + out[8 + outpos] = ((in[3 + inpos] >>> 16) & 67108863L); + out[9 + outpos] = (in[3 + inpos] >>> 42) + | ((in[4 + inpos] & 15L) << (26 - 4)); + out[10 + outpos] = ((in[4 + inpos] >>> 4) & 67108863L); + out[11 + outpos] = ((in[4 + inpos] >>> 30) & 67108863L); + out[12 + outpos] = (in[4 + inpos] >>> 56) + | ((in[5 + inpos] & 262143L) << (26 - 18)); + out[13 + outpos] = ((in[5 + inpos] >>> 18) & 67108863L); + out[14 + outpos] = (in[5 + inpos] >>> 44) + | ((in[6 + inpos] & 63L) << (26 - 6)); + out[15 + outpos] = ((in[6 + inpos] >>> 6) & 67108863L); + out[16 + outpos] = ((in[6 + inpos] >>> 32) & 67108863L); + out[17 + outpos] = (in[6 + inpos] >>> 58) + | ((in[7 + inpos] & 1048575L) << (26 - 20)); + out[18 + outpos] = ((in[7 + inpos] >>> 20) & 67108863L); + out[19 + outpos] = (in[7 + inpos] >>> 46) + | ((in[8 + inpos] & 255L) << (26 - 8)); + out[20 + outpos] = ((in[8 + inpos] >>> 8) & 67108863L); + out[21 + outpos] = ((in[8 + inpos] >>> 34) & 67108863L); + out[22 + outpos] = (in[8 + inpos] >>> 60) + | ((in[9 + inpos] & 4194303L) << (26 - 22)); + out[23 + outpos] = ((in[9 + inpos] >>> 22) & 67108863L); + out[24 + outpos] = (in[9 + inpos] >>> 48) + | ((in[10 + inpos] & 1023L) << (26 - 10)); + out[25 + outpos] = ((in[10 + inpos] >>> 10) & 67108863L); + out[26 + outpos] = ((in[10 + inpos] >>> 36) & 67108863L); + out[27 + outpos] = (in[10 + inpos] >>> 62) + | ((in[11 + inpos] & 16777215L) << (26 - 24)); + out[28 + outpos] = ((in[11 + inpos] >>> 24) & 67108863L); + out[29 + outpos] = (in[11 + inpos] >>> 50) + | ((in[12 + inpos] & 4095L) << (26 - 12)); + out[30 + outpos] = ((in[12 + inpos] >>> 12) & 67108863L); + out[31 + outpos] = (in[12 + inpos] >>> 38); + out[32 + outpos] = (in[13 + inpos] & 67108863L); + out[33 + outpos] = ((in[13 + inpos] >>> 26) & 67108863L); + out[34 + outpos] = (in[13 + inpos] >>> 52) + | ((in[14 + inpos] & 16383L) << (26 - 14)); + out[35 + outpos] = ((in[14 + inpos] >>> 14) & 67108863L); + out[36 + outpos] = (in[14 + inpos] >>> 40) + | ((in[15 + inpos] & 3L) << (26 - 2)); + out[37 + outpos] = ((in[15 + inpos] >>> 2) & 67108863L); + out[38 + outpos] = ((in[15 + inpos] >>> 28) & 67108863L); + out[39 + outpos] = (in[15 + inpos] >>> 54) + | ((in[16 + inpos] & 65535L) << (26 - 16)); + out[40 + outpos] = ((in[16 + inpos] >>> 16) & 67108863L); + out[41 + outpos] = (in[16 + inpos] >>> 42) + | ((in[17 + inpos] & 15L) << (26 - 4)); + out[42 + outpos] = ((in[17 + inpos] >>> 4) & 67108863L); + out[43 + outpos] = ((in[17 + inpos] >>> 30) & 67108863L); + out[44 + outpos] = (in[17 + inpos] >>> 56) + | ((in[18 + inpos] & 262143L) << (26 - 18)); + out[45 + outpos] = ((in[18 + inpos] >>> 18) & 67108863L); + out[46 + outpos] = (in[18 + inpos] >>> 44) + | ((in[19 + inpos] & 63L) << (26 - 6)); + out[47 + outpos] = ((in[19 + inpos] >>> 6) & 67108863L); + out[48 + outpos] = ((in[19 + inpos] >>> 32) & 67108863L); + out[49 + outpos] = (in[19 + inpos] >>> 58) + | ((in[20 + inpos] & 1048575L) << (26 - 20)); + out[50 + outpos] = ((in[20 + inpos] >>> 20) & 67108863L); + out[51 + outpos] = (in[20 + inpos] >>> 46) + | ((in[21 + inpos] & 255L) << (26 - 8)); + out[52 + outpos] = ((in[21 + inpos] >>> 8) & 67108863L); + out[53 + outpos] = ((in[21 + inpos] >>> 34) & 67108863L); + out[54 + outpos] = (in[21 + inpos] >>> 60) + | ((in[22 + inpos] & 4194303L) << (26 - 22)); + out[55 + outpos] = ((in[22 + inpos] >>> 22) & 67108863L); + out[56 + outpos] = (in[22 + inpos] >>> 48) + | ((in[23 + inpos] & 1023L) << (26 - 10)); + out[57 + outpos] = ((in[23 + inpos] >>> 10) & 67108863L); + out[58 + outpos] = ((in[23 + inpos] >>> 36) & 67108863L); + out[59 + outpos] = (in[23 + inpos] >>> 62) + | ((in[24 + inpos] & 16777215L) << (26 - 24)); + out[60 + outpos] = ((in[24 + inpos] >>> 24) & 67108863L); + out[61 + outpos] = (in[24 + inpos] >>> 50) + | ((in[25 + inpos] & 4095L) << (26 - 12)); + out[62 + outpos] = ((in[25 + inpos] >>> 12) & 67108863L); + out[63 + outpos] = (in[25 + inpos] >>> 38); + } + + protected static void fastunpack27(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 134217727L); + out[1 + outpos] = ((in[inpos] >>> 27) & 134217727L); + out[2 + outpos] = (in[inpos] >>> 54) + | ((in[1 + inpos] & 131071L) << (27 - 17)); + out[3 + outpos] = ((in[1 + inpos] >>> 17) & 134217727L); + out[4 + outpos] = (in[1 + inpos] >>> 44) + | ((in[2 + inpos] & 127L) << (27 - 7)); + out[5 + outpos] = ((in[2 + inpos] >>> 7) & 134217727L); + out[6 + outpos] = ((in[2 + inpos] >>> 34) & 134217727L); + out[7 + outpos] = (in[2 + inpos] >>> 61) + | ((in[3 + inpos] & 16777215L) << (27 - 24)); + out[8 + outpos] = ((in[3 + inpos] >>> 24) & 134217727L); + out[9 + outpos] = (in[3 + inpos] >>> 51) + | ((in[4 + inpos] & 16383L) << (27 - 14)); + out[10 + outpos] = ((in[4 + inpos] >>> 14) & 134217727L); + out[11 + outpos] = (in[4 + inpos] >>> 41) + | ((in[5 + inpos] & 15L) << (27 - 4)); + out[12 + outpos] = ((in[5 + inpos] >>> 4) & 134217727L); + out[13 + outpos] = ((in[5 + inpos] >>> 31) & 134217727L); + out[14 + outpos] = (in[5 + inpos] >>> 58) + | ((in[6 + inpos] & 2097151L) << (27 - 21)); + out[15 + outpos] = ((in[6 + inpos] >>> 21) & 134217727L); + out[16 + outpos] = (in[6 + inpos] >>> 48) + | ((in[7 + inpos] & 2047L) << (27 - 11)); + out[17 + outpos] = ((in[7 + inpos] >>> 11) & 134217727L); + out[18 + outpos] = (in[7 + inpos] >>> 38) + | ((in[8 + inpos] & 1L) << (27 - 1)); + out[19 + outpos] = ((in[8 + inpos] >>> 1) & 134217727L); + out[20 + outpos] = ((in[8 + inpos] >>> 28) & 134217727L); + out[21 + outpos] = (in[8 + inpos] >>> 55) + | ((in[9 + inpos] & 262143L) << (27 - 18)); + out[22 + outpos] = ((in[9 + inpos] >>> 18) & 134217727L); + out[23 + outpos] = (in[9 + inpos] >>> 45) + | ((in[10 + inpos] & 255L) << (27 - 8)); + out[24 + outpos] = ((in[10 + inpos] >>> 8) & 134217727L); + out[25 + outpos] = ((in[10 + inpos] >>> 35) & 134217727L); + out[26 + outpos] = (in[10 + inpos] >>> 62) + | ((in[11 + inpos] & 33554431L) << (27 - 25)); + out[27 + outpos] = ((in[11 + inpos] >>> 25) & 134217727L); + out[28 + outpos] = (in[11 + inpos] >>> 52) + | ((in[12 + inpos] & 32767L) << (27 - 15)); + out[29 + outpos] = ((in[12 + inpos] >>> 15) & 134217727L); + out[30 + outpos] = (in[12 + inpos] >>> 42) + | ((in[13 + inpos] & 31L) << (27 - 5)); + out[31 + outpos] = ((in[13 + inpos] >>> 5) & 134217727L); + out[32 + outpos] = ((in[13 + inpos] >>> 32) & 134217727L); + out[33 + outpos] = (in[13 + inpos] >>> 59) + | ((in[14 + inpos] & 4194303L) << (27 - 22)); + out[34 + outpos] = ((in[14 + inpos] >>> 22) & 134217727L); + out[35 + outpos] = (in[14 + inpos] >>> 49) + | ((in[15 + inpos] & 4095L) << (27 - 12)); + out[36 + outpos] = ((in[15 + inpos] >>> 12) & 134217727L); + out[37 + outpos] = (in[15 + inpos] >>> 39) + | ((in[16 + inpos] & 3L) << (27 - 2)); + out[38 + outpos] = ((in[16 + inpos] >>> 2) & 134217727L); + out[39 + outpos] = ((in[16 + inpos] >>> 29) & 134217727L); + out[40 + outpos] = (in[16 + inpos] >>> 56) + | ((in[17 + inpos] & 524287L) << (27 - 19)); + out[41 + outpos] = ((in[17 + inpos] >>> 19) & 134217727L); + out[42 + outpos] = (in[17 + inpos] >>> 46) + | ((in[18 + inpos] & 511L) << (27 - 9)); + out[43 + outpos] = ((in[18 + inpos] >>> 9) & 134217727L); + out[44 + outpos] = ((in[18 + inpos] >>> 36) & 134217727L); + out[45 + outpos] = (in[18 + inpos] >>> 63) + | ((in[19 + inpos] & 67108863L) << (27 - 26)); + out[46 + outpos] = ((in[19 + inpos] >>> 26) & 134217727L); + out[47 + outpos] = (in[19 + inpos] >>> 53) + | ((in[20 + inpos] & 65535L) << (27 - 16)); + out[48 + outpos] = ((in[20 + inpos] >>> 16) & 134217727L); + out[49 + outpos] = (in[20 + inpos] >>> 43) + | ((in[21 + inpos] & 63L) << (27 - 6)); + out[50 + outpos] = ((in[21 + inpos] >>> 6) & 134217727L); + out[51 + outpos] = ((in[21 + inpos] >>> 33) & 134217727L); + out[52 + outpos] = (in[21 + inpos] >>> 60) + | ((in[22 + inpos] & 8388607L) << (27 - 23)); + out[53 + outpos] = ((in[22 + inpos] >>> 23) & 134217727L); + out[54 + outpos] = (in[22 + inpos] >>> 50) + | ((in[23 + inpos] & 8191L) << (27 - 13)); + out[55 + outpos] = ((in[23 + inpos] >>> 13) & 134217727L); + out[56 + outpos] = (in[23 + inpos] >>> 40) + | ((in[24 + inpos] & 7L) << (27 - 3)); + out[57 + outpos] = ((in[24 + inpos] >>> 3) & 134217727L); + out[58 + outpos] = ((in[24 + inpos] >>> 30) & 134217727L); + out[59 + outpos] = (in[24 + inpos] >>> 57) + | ((in[25 + inpos] & 1048575L) << (27 - 20)); + out[60 + outpos] = ((in[25 + inpos] >>> 20) & 134217727L); + out[61 + outpos] = (in[25 + inpos] >>> 47) + | ((in[26 + inpos] & 1023L) << (27 - 10)); + out[62 + outpos] = ((in[26 + inpos] >>> 10) & 134217727L); + out[63 + outpos] = (in[26 + inpos] >>> 37); + } + + protected static void fastunpack28(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 268435455L); + out[1 + outpos] = ((in[inpos] >>> 28) & 268435455L); + out[2 + outpos] = (in[inpos] >>> 56) + | ((in[1 + inpos] & 1048575L) << (28 - 20)); + out[3 + outpos] = ((in[1 + inpos] >>> 20) & 268435455L); + out[4 + outpos] = (in[1 + inpos] >>> 48) + | ((in[2 + inpos] & 4095L) << (28 - 12)); + out[5 + outpos] = ((in[2 + inpos] >>> 12) & 268435455L); + out[6 + outpos] = (in[2 + inpos] >>> 40) + | ((in[3 + inpos] & 15L) << (28 - 4)); + out[7 + outpos] = ((in[3 + inpos] >>> 4) & 268435455L); + out[8 + outpos] = ((in[3 + inpos] >>> 32) & 268435455L); + out[9 + outpos] = (in[3 + inpos] >>> 60) + | ((in[4 + inpos] & 16777215L) << (28 - 24)); + out[10 + outpos] = ((in[4 + inpos] >>> 24) & 268435455L); + out[11 + outpos] = (in[4 + inpos] >>> 52) + | ((in[5 + inpos] & 65535L) << (28 - 16)); + out[12 + outpos] = ((in[5 + inpos] >>> 16) & 268435455L); + out[13 + outpos] = (in[5 + inpos] >>> 44) + | ((in[6 + inpos] & 255L) << (28 - 8)); + out[14 + outpos] = ((in[6 + inpos] >>> 8) & 268435455L); + out[15 + outpos] = (in[6 + inpos] >>> 36); + out[16 + outpos] = (in[7 + inpos] & 268435455L); + out[17 + outpos] = ((in[7 + inpos] >>> 28) & 268435455L); + out[18 + outpos] = (in[7 + inpos] >>> 56) + | ((in[8 + inpos] & 1048575L) << (28 - 20)); + out[19 + outpos] = ((in[8 + inpos] >>> 20) & 268435455L); + out[20 + outpos] = (in[8 + inpos] >>> 48) + | ((in[9 + inpos] & 4095L) << (28 - 12)); + out[21 + outpos] = ((in[9 + inpos] >>> 12) & 268435455L); + out[22 + outpos] = (in[9 + inpos] >>> 40) + | ((in[10 + inpos] & 15L) << (28 - 4)); + out[23 + outpos] = ((in[10 + inpos] >>> 4) & 268435455L); + out[24 + outpos] = ((in[10 + inpos] >>> 32) & 268435455L); + out[25 + outpos] = (in[10 + inpos] >>> 60) + | ((in[11 + inpos] & 16777215L) << (28 - 24)); + out[26 + outpos] = ((in[11 + inpos] >>> 24) & 268435455L); + out[27 + outpos] = (in[11 + inpos] >>> 52) + | ((in[12 + inpos] & 65535L) << (28 - 16)); + out[28 + outpos] = ((in[12 + inpos] >>> 16) & 268435455L); + out[29 + outpos] = (in[12 + inpos] >>> 44) + | ((in[13 + inpos] & 255L) << (28 - 8)); + out[30 + outpos] = ((in[13 + inpos] >>> 8) & 268435455L); + out[31 + outpos] = (in[13 + inpos] >>> 36); + out[32 + outpos] = (in[14 + inpos] & 268435455L); + out[33 + outpos] = ((in[14 + inpos] >>> 28) & 268435455L); + out[34 + outpos] = (in[14 + inpos] >>> 56) + | ((in[15 + inpos] & 1048575L) << (28 - 20)); + out[35 + outpos] = ((in[15 + inpos] >>> 20) & 268435455L); + out[36 + outpos] = (in[15 + inpos] >>> 48) + | ((in[16 + inpos] & 4095L) << (28 - 12)); + out[37 + outpos] = ((in[16 + inpos] >>> 12) & 268435455L); + out[38 + outpos] = (in[16 + inpos] >>> 40) + | ((in[17 + inpos] & 15L) << (28 - 4)); + out[39 + outpos] = ((in[17 + inpos] >>> 4) & 268435455L); + out[40 + outpos] = ((in[17 + inpos] >>> 32) & 268435455L); + out[41 + outpos] = (in[17 + inpos] >>> 60) + | ((in[18 + inpos] & 16777215L) << (28 - 24)); + out[42 + outpos] = ((in[18 + inpos] >>> 24) & 268435455L); + out[43 + outpos] = (in[18 + inpos] >>> 52) + | ((in[19 + inpos] & 65535L) << (28 - 16)); + out[44 + outpos] = ((in[19 + inpos] >>> 16) & 268435455L); + out[45 + outpos] = (in[19 + inpos] >>> 44) + | ((in[20 + inpos] & 255L) << (28 - 8)); + out[46 + outpos] = ((in[20 + inpos] >>> 8) & 268435455L); + out[47 + outpos] = (in[20 + inpos] >>> 36); + out[48 + outpos] = (in[21 + inpos] & 268435455L); + out[49 + outpos] = ((in[21 + inpos] >>> 28) & 268435455L); + out[50 + outpos] = (in[21 + inpos] >>> 56) + | ((in[22 + inpos] & 1048575L) << (28 - 20)); + out[51 + outpos] = ((in[22 + inpos] >>> 20) & 268435455L); + out[52 + outpos] = (in[22 + inpos] >>> 48) + | ((in[23 + inpos] & 4095L) << (28 - 12)); + out[53 + outpos] = ((in[23 + inpos] >>> 12) & 268435455L); + out[54 + outpos] = (in[23 + inpos] >>> 40) + | ((in[24 + inpos] & 15L) << (28 - 4)); + out[55 + outpos] = ((in[24 + inpos] >>> 4) & 268435455L); + out[56 + outpos] = ((in[24 + inpos] >>> 32) & 268435455L); + out[57 + outpos] = (in[24 + inpos] >>> 60) + | ((in[25 + inpos] & 16777215L) << (28 - 24)); + out[58 + outpos] = ((in[25 + inpos] >>> 24) & 268435455L); + out[59 + outpos] = (in[25 + inpos] >>> 52) + | ((in[26 + inpos] & 65535L) << (28 - 16)); + out[60 + outpos] = ((in[26 + inpos] >>> 16) & 268435455L); + out[61 + outpos] = (in[26 + inpos] >>> 44) + | ((in[27 + inpos] & 255L) << (28 - 8)); + out[62 + outpos] = ((in[27 + inpos] >>> 8) & 268435455L); + out[63 + outpos] = (in[27 + inpos] >>> 36); + } + + protected static void fastunpack29(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 536870911L); + out[1 + outpos] = ((in[inpos] >>> 29) & 536870911L); + out[2 + outpos] = (in[inpos] >>> 58) + | ((in[1 + inpos] & 8388607L) << (29 - 23)); + out[3 + outpos] = ((in[1 + inpos] >>> 23) & 536870911L); + out[4 + outpos] = (in[1 + inpos] >>> 52) + | ((in[2 + inpos] & 131071L) << (29 - 17)); + out[5 + outpos] = ((in[2 + inpos] >>> 17) & 536870911L); + out[6 + outpos] = (in[2 + inpos] >>> 46) + | ((in[3 + inpos] & 2047L) << (29 - 11)); + out[7 + outpos] = ((in[3 + inpos] >>> 11) & 536870911L); + out[8 + outpos] = (in[3 + inpos] >>> 40) + | ((in[4 + inpos] & 31L) << (29 - 5)); + out[9 + outpos] = ((in[4 + inpos] >>> 5) & 536870911L); + out[10 + outpos] = ((in[4 + inpos] >>> 34) & 536870911L); + out[11 + outpos] = (in[4 + inpos] >>> 63) + | ((in[5 + inpos] & 268435455L) << (29 - 28)); + out[12 + outpos] = ((in[5 + inpos] >>> 28) & 536870911L); + out[13 + outpos] = (in[5 + inpos] >>> 57) + | ((in[6 + inpos] & 4194303L) << (29 - 22)); + out[14 + outpos] = ((in[6 + inpos] >>> 22) & 536870911L); + out[15 + outpos] = (in[6 + inpos] >>> 51) + | ((in[7 + inpos] & 65535L) << (29 - 16)); + out[16 + outpos] = ((in[7 + inpos] >>> 16) & 536870911L); + out[17 + outpos] = (in[7 + inpos] >>> 45) + | ((in[8 + inpos] & 1023L) << (29 - 10)); + out[18 + outpos] = ((in[8 + inpos] >>> 10) & 536870911L); + out[19 + outpos] = (in[8 + inpos] >>> 39) + | ((in[9 + inpos] & 15L) << (29 - 4)); + out[20 + outpos] = ((in[9 + inpos] >>> 4) & 536870911L); + out[21 + outpos] = ((in[9 + inpos] >>> 33) & 536870911L); + out[22 + outpos] = (in[9 + inpos] >>> 62) + | ((in[10 + inpos] & 134217727L) << (29 - 27)); + out[23 + outpos] = ((in[10 + inpos] >>> 27) & 536870911L); + out[24 + outpos] = (in[10 + inpos] >>> 56) + | ((in[11 + inpos] & 2097151L) << (29 - 21)); + out[25 + outpos] = ((in[11 + inpos] >>> 21) & 536870911L); + out[26 + outpos] = (in[11 + inpos] >>> 50) + | ((in[12 + inpos] & 32767L) << (29 - 15)); + out[27 + outpos] = ((in[12 + inpos] >>> 15) & 536870911L); + out[28 + outpos] = (in[12 + inpos] >>> 44) + | ((in[13 + inpos] & 511L) << (29 - 9)); + out[29 + outpos] = ((in[13 + inpos] >>> 9) & 536870911L); + out[30 + outpos] = (in[13 + inpos] >>> 38) + | ((in[14 + inpos] & 7L) << (29 - 3)); + out[31 + outpos] = ((in[14 + inpos] >>> 3) & 536870911L); + out[32 + outpos] = ((in[14 + inpos] >>> 32) & 536870911L); + out[33 + outpos] = (in[14 + inpos] >>> 61) + | ((in[15 + inpos] & 67108863L) << (29 - 26)); + out[34 + outpos] = ((in[15 + inpos] >>> 26) & 536870911L); + out[35 + outpos] = (in[15 + inpos] >>> 55) + | ((in[16 + inpos] & 1048575L) << (29 - 20)); + out[36 + outpos] = ((in[16 + inpos] >>> 20) & 536870911L); + out[37 + outpos] = (in[16 + inpos] >>> 49) + | ((in[17 + inpos] & 16383L) << (29 - 14)); + out[38 + outpos] = ((in[17 + inpos] >>> 14) & 536870911L); + out[39 + outpos] = (in[17 + inpos] >>> 43) + | ((in[18 + inpos] & 255L) << (29 - 8)); + out[40 + outpos] = ((in[18 + inpos] >>> 8) & 536870911L); + out[41 + outpos] = (in[18 + inpos] >>> 37) + | ((in[19 + inpos] & 3L) << (29 - 2)); + out[42 + outpos] = ((in[19 + inpos] >>> 2) & 536870911L); + out[43 + outpos] = ((in[19 + inpos] >>> 31) & 536870911L); + out[44 + outpos] = (in[19 + inpos] >>> 60) + | ((in[20 + inpos] & 33554431L) << (29 - 25)); + out[45 + outpos] = ((in[20 + inpos] >>> 25) & 536870911L); + out[46 + outpos] = (in[20 + inpos] >>> 54) + | ((in[21 + inpos] & 524287L) << (29 - 19)); + out[47 + outpos] = ((in[21 + inpos] >>> 19) & 536870911L); + out[48 + outpos] = (in[21 + inpos] >>> 48) + | ((in[22 + inpos] & 8191L) << (29 - 13)); + out[49 + outpos] = ((in[22 + inpos] >>> 13) & 536870911L); + out[50 + outpos] = (in[22 + inpos] >>> 42) + | ((in[23 + inpos] & 127L) << (29 - 7)); + out[51 + outpos] = ((in[23 + inpos] >>> 7) & 536870911L); + out[52 + outpos] = (in[23 + inpos] >>> 36) + | ((in[24 + inpos] & 1L) << (29 - 1)); + out[53 + outpos] = ((in[24 + inpos] >>> 1) & 536870911L); + out[54 + outpos] = ((in[24 + inpos] >>> 30) & 536870911L); + out[55 + outpos] = (in[24 + inpos] >>> 59) + | ((in[25 + inpos] & 16777215L) << (29 - 24)); + out[56 + outpos] = ((in[25 + inpos] >>> 24) & 536870911L); + out[57 + outpos] = (in[25 + inpos] >>> 53) + | ((in[26 + inpos] & 262143L) << (29 - 18)); + out[58 + outpos] = ((in[26 + inpos] >>> 18) & 536870911L); + out[59 + outpos] = (in[26 + inpos] >>> 47) + | ((in[27 + inpos] & 4095L) << (29 - 12)); + out[60 + outpos] = ((in[27 + inpos] >>> 12) & 536870911L); + out[61 + outpos] = (in[27 + inpos] >>> 41) + | ((in[28 + inpos] & 63L) << (29 - 6)); + out[62 + outpos] = ((in[28 + inpos] >>> 6) & 536870911L); + out[63 + outpos] = (in[28 + inpos] >>> 35); + } + + protected static void fastunpack30(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 1073741823L); + out[1 + outpos] = ((in[inpos] >>> 30) & 1073741823L); + out[2 + outpos] = (in[inpos] >>> 60) + | ((in[1 + inpos] & 67108863L) << (30 - 26)); + out[3 + outpos] = ((in[1 + inpos] >>> 26) & 1073741823L); + out[4 + outpos] = (in[1 + inpos] >>> 56) + | ((in[2 + inpos] & 4194303L) << (30 - 22)); + out[5 + outpos] = ((in[2 + inpos] >>> 22) & 1073741823L); + out[6 + outpos] = (in[2 + inpos] >>> 52) + | ((in[3 + inpos] & 262143L) << (30 - 18)); + out[7 + outpos] = ((in[3 + inpos] >>> 18) & 1073741823L); + out[8 + outpos] = (in[3 + inpos] >>> 48) + | ((in[4 + inpos] & 16383L) << (30 - 14)); + out[9 + outpos] = ((in[4 + inpos] >>> 14) & 1073741823L); + out[10 + outpos] = (in[4 + inpos] >>> 44) + | ((in[5 + inpos] & 1023L) << (30 - 10)); + out[11 + outpos] = ((in[5 + inpos] >>> 10) & 1073741823L); + out[12 + outpos] = (in[5 + inpos] >>> 40) + | ((in[6 + inpos] & 63L) << (30 - 6)); + out[13 + outpos] = ((in[6 + inpos] >>> 6) & 1073741823L); + out[14 + outpos] = (in[6 + inpos] >>> 36) + | ((in[7 + inpos] & 3L) << (30 - 2)); + out[15 + outpos] = ((in[7 + inpos] >>> 2) & 1073741823L); + out[16 + outpos] = ((in[7 + inpos] >>> 32) & 1073741823L); + out[17 + outpos] = (in[7 + inpos] >>> 62) + | ((in[8 + inpos] & 268435455L) << (30 - 28)); + out[18 + outpos] = ((in[8 + inpos] >>> 28) & 1073741823L); + out[19 + outpos] = (in[8 + inpos] >>> 58) + | ((in[9 + inpos] & 16777215L) << (30 - 24)); + out[20 + outpos] = ((in[9 + inpos] >>> 24) & 1073741823L); + out[21 + outpos] = (in[9 + inpos] >>> 54) + | ((in[10 + inpos] & 1048575L) << (30 - 20)); + out[22 + outpos] = ((in[10 + inpos] >>> 20) & 1073741823L); + out[23 + outpos] = (in[10 + inpos] >>> 50) + | ((in[11 + inpos] & 65535L) << (30 - 16)); + out[24 + outpos] = ((in[11 + inpos] >>> 16) & 1073741823L); + out[25 + outpos] = (in[11 + inpos] >>> 46) + | ((in[12 + inpos] & 4095L) << (30 - 12)); + out[26 + outpos] = ((in[12 + inpos] >>> 12) & 1073741823L); + out[27 + outpos] = (in[12 + inpos] >>> 42) + | ((in[13 + inpos] & 255L) << (30 - 8)); + out[28 + outpos] = ((in[13 + inpos] >>> 8) & 1073741823L); + out[29 + outpos] = (in[13 + inpos] >>> 38) + | ((in[14 + inpos] & 15L) << (30 - 4)); + out[30 + outpos] = ((in[14 + inpos] >>> 4) & 1073741823L); + out[31 + outpos] = (in[14 + inpos] >>> 34); + out[32 + outpos] = (in[15 + inpos] & 1073741823L); + out[33 + outpos] = ((in[15 + inpos] >>> 30) & 1073741823L); + out[34 + outpos] = (in[15 + inpos] >>> 60) + | ((in[16 + inpos] & 67108863L) << (30 - 26)); + out[35 + outpos] = ((in[16 + inpos] >>> 26) & 1073741823L); + out[36 + outpos] = (in[16 + inpos] >>> 56) + | ((in[17 + inpos] & 4194303L) << (30 - 22)); + out[37 + outpos] = ((in[17 + inpos] >>> 22) & 1073741823L); + out[38 + outpos] = (in[17 + inpos] >>> 52) + | ((in[18 + inpos] & 262143L) << (30 - 18)); + out[39 + outpos] = ((in[18 + inpos] >>> 18) & 1073741823L); + out[40 + outpos] = (in[18 + inpos] >>> 48) + | ((in[19 + inpos] & 16383L) << (30 - 14)); + out[41 + outpos] = ((in[19 + inpos] >>> 14) & 1073741823L); + out[42 + outpos] = (in[19 + inpos] >>> 44) + | ((in[20 + inpos] & 1023L) << (30 - 10)); + out[43 + outpos] = ((in[20 + inpos] >>> 10) & 1073741823L); + out[44 + outpos] = (in[20 + inpos] >>> 40) + | ((in[21 + inpos] & 63L) << (30 - 6)); + out[45 + outpos] = ((in[21 + inpos] >>> 6) & 1073741823L); + out[46 + outpos] = (in[21 + inpos] >>> 36) + | ((in[22 + inpos] & 3L) << (30 - 2)); + out[47 + outpos] = ((in[22 + inpos] >>> 2) & 1073741823L); + out[48 + outpos] = ((in[22 + inpos] >>> 32) & 1073741823L); + out[49 + outpos] = (in[22 + inpos] >>> 62) + | ((in[23 + inpos] & 268435455L) << (30 - 28)); + out[50 + outpos] = ((in[23 + inpos] >>> 28) & 1073741823L); + out[51 + outpos] = (in[23 + inpos] >>> 58) + | ((in[24 + inpos] & 16777215L) << (30 - 24)); + out[52 + outpos] = ((in[24 + inpos] >>> 24) & 1073741823L); + out[53 + outpos] = (in[24 + inpos] >>> 54) + | ((in[25 + inpos] & 1048575L) << (30 - 20)); + out[54 + outpos] = ((in[25 + inpos] >>> 20) & 1073741823L); + out[55 + outpos] = (in[25 + inpos] >>> 50) + | ((in[26 + inpos] & 65535L) << (30 - 16)); + out[56 + outpos] = ((in[26 + inpos] >>> 16) & 1073741823L); + out[57 + outpos] = (in[26 + inpos] >>> 46) + | ((in[27 + inpos] & 4095L) << (30 - 12)); + out[58 + outpos] = ((in[27 + inpos] >>> 12) & 1073741823L); + out[59 + outpos] = (in[27 + inpos] >>> 42) + | ((in[28 + inpos] & 255L) << (30 - 8)); + out[60 + outpos] = ((in[28 + inpos] >>> 8) & 1073741823L); + out[61 + outpos] = (in[28 + inpos] >>> 38) + | ((in[29 + inpos] & 15L) << (30 - 4)); + out[62 + outpos] = ((in[29 + inpos] >>> 4) & 1073741823L); + out[63 + outpos] = (in[29 + inpos] >>> 34); + } + + protected static void fastunpack31(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 2147483647L); + out[1 + outpos] = ((in[inpos] >>> 31) & 2147483647L); + out[2 + outpos] = (in[inpos] >>> 62) + | ((in[1 + inpos] & 536870911L) << (31 - 29)); + out[3 + outpos] = ((in[1 + inpos] >>> 29) & 2147483647L); + out[4 + outpos] = (in[1 + inpos] >>> 60) + | ((in[2 + inpos] & 134217727L) << (31 - 27)); + out[5 + outpos] = ((in[2 + inpos] >>> 27) & 2147483647L); + out[6 + outpos] = (in[2 + inpos] >>> 58) + | ((in[3 + inpos] & 33554431L) << (31 - 25)); + out[7 + outpos] = ((in[3 + inpos] >>> 25) & 2147483647L); + out[8 + outpos] = (in[3 + inpos] >>> 56) + | ((in[4 + inpos] & 8388607L) << (31 - 23)); + out[9 + outpos] = ((in[4 + inpos] >>> 23) & 2147483647L); + out[10 + outpos] = (in[4 + inpos] >>> 54) + | ((in[5 + inpos] & 2097151L) << (31 - 21)); + out[11 + outpos] = ((in[5 + inpos] >>> 21) & 2147483647L); + out[12 + outpos] = (in[5 + inpos] >>> 52) + | ((in[6 + inpos] & 524287L) << (31 - 19)); + out[13 + outpos] = ((in[6 + inpos] >>> 19) & 2147483647L); + out[14 + outpos] = (in[6 + inpos] >>> 50) + | ((in[7 + inpos] & 131071L) << (31 - 17)); + out[15 + outpos] = ((in[7 + inpos] >>> 17) & 2147483647L); + out[16 + outpos] = (in[7 + inpos] >>> 48) + | ((in[8 + inpos] & 32767L) << (31 - 15)); + out[17 + outpos] = ((in[8 + inpos] >>> 15) & 2147483647L); + out[18 + outpos] = (in[8 + inpos] >>> 46) + | ((in[9 + inpos] & 8191L) << (31 - 13)); + out[19 + outpos] = ((in[9 + inpos] >>> 13) & 2147483647L); + out[20 + outpos] = (in[9 + inpos] >>> 44) + | ((in[10 + inpos] & 2047L) << (31 - 11)); + out[21 + outpos] = ((in[10 + inpos] >>> 11) & 2147483647L); + out[22 + outpos] = (in[10 + inpos] >>> 42) + | ((in[11 + inpos] & 511L) << (31 - 9)); + out[23 + outpos] = ((in[11 + inpos] >>> 9) & 2147483647L); + out[24 + outpos] = (in[11 + inpos] >>> 40) + | ((in[12 + inpos] & 127L) << (31 - 7)); + out[25 + outpos] = ((in[12 + inpos] >>> 7) & 2147483647L); + out[26 + outpos] = (in[12 + inpos] >>> 38) + | ((in[13 + inpos] & 31L) << (31 - 5)); + out[27 + outpos] = ((in[13 + inpos] >>> 5) & 2147483647L); + out[28 + outpos] = (in[13 + inpos] >>> 36) + | ((in[14 + inpos] & 7L) << (31 - 3)); + out[29 + outpos] = ((in[14 + inpos] >>> 3) & 2147483647L); + out[30 + outpos] = (in[14 + inpos] >>> 34) + | ((in[15 + inpos] & 1L) << (31 - 1)); + out[31 + outpos] = ((in[15 + inpos] >>> 1) & 2147483647L); + out[32 + outpos] = ((in[15 + inpos] >>> 32) & 2147483647L); + out[33 + outpos] = (in[15 + inpos] >>> 63) + | ((in[16 + inpos] & 1073741823L) << (31 - 30)); + out[34 + outpos] = ((in[16 + inpos] >>> 30) & 2147483647L); + out[35 + outpos] = (in[16 + inpos] >>> 61) + | ((in[17 + inpos] & 268435455L) << (31 - 28)); + out[36 + outpos] = ((in[17 + inpos] >>> 28) & 2147483647L); + out[37 + outpos] = (in[17 + inpos] >>> 59) + | ((in[18 + inpos] & 67108863L) << (31 - 26)); + out[38 + outpos] = ((in[18 + inpos] >>> 26) & 2147483647L); + out[39 + outpos] = (in[18 + inpos] >>> 57) + | ((in[19 + inpos] & 16777215L) << (31 - 24)); + out[40 + outpos] = ((in[19 + inpos] >>> 24) & 2147483647L); + out[41 + outpos] = (in[19 + inpos] >>> 55) + | ((in[20 + inpos] & 4194303L) << (31 - 22)); + out[42 + outpos] = ((in[20 + inpos] >>> 22) & 2147483647L); + out[43 + outpos] = (in[20 + inpos] >>> 53) + | ((in[21 + inpos] & 1048575L) << (31 - 20)); + out[44 + outpos] = ((in[21 + inpos] >>> 20) & 2147483647L); + out[45 + outpos] = (in[21 + inpos] >>> 51) + | ((in[22 + inpos] & 262143L) << (31 - 18)); + out[46 + outpos] = ((in[22 + inpos] >>> 18) & 2147483647L); + out[47 + outpos] = (in[22 + inpos] >>> 49) + | ((in[23 + inpos] & 65535L) << (31 - 16)); + out[48 + outpos] = ((in[23 + inpos] >>> 16) & 2147483647L); + out[49 + outpos] = (in[23 + inpos] >>> 47) + | ((in[24 + inpos] & 16383L) << (31 - 14)); + out[50 + outpos] = ((in[24 + inpos] >>> 14) & 2147483647L); + out[51 + outpos] = (in[24 + inpos] >>> 45) + | ((in[25 + inpos] & 4095L) << (31 - 12)); + out[52 + outpos] = ((in[25 + inpos] >>> 12) & 2147483647L); + out[53 + outpos] = (in[25 + inpos] >>> 43) + | ((in[26 + inpos] & 1023L) << (31 - 10)); + out[54 + outpos] = ((in[26 + inpos] >>> 10) & 2147483647L); + out[55 + outpos] = (in[26 + inpos] >>> 41) + | ((in[27 + inpos] & 255L) << (31 - 8)); + out[56 + outpos] = ((in[27 + inpos] >>> 8) & 2147483647L); + out[57 + outpos] = (in[27 + inpos] >>> 39) + | ((in[28 + inpos] & 63L) << (31 - 6)); + out[58 + outpos] = ((in[28 + inpos] >>> 6) & 2147483647L); + out[59 + outpos] = (in[28 + inpos] >>> 37) + | ((in[29 + inpos] & 15L) << (31 - 4)); + out[60 + outpos] = ((in[29 + inpos] >>> 4) & 2147483647L); + out[61 + outpos] = (in[29 + inpos] >>> 35) + | ((in[30 + inpos] & 3L) << (31 - 2)); + out[62 + outpos] = ((in[30 + inpos] >>> 2) & 2147483647L); + out[63 + outpos] = (in[30 + inpos] >>> 33); + } + + protected static void fastunpack32(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 4294967295L); + out[1 + outpos] = (in[inpos] >>> 32); + out[2 + outpos] = (in[1 + inpos] & 4294967295L); + out[3 + outpos] = (in[1 + inpos] >>> 32); + out[4 + outpos] = (in[2 + inpos] & 4294967295L); + out[5 + outpos] = (in[2 + inpos] >>> 32); + out[6 + outpos] = (in[3 + inpos] & 4294967295L); + out[7 + outpos] = (in[3 + inpos] >>> 32); + out[8 + outpos] = (in[4 + inpos] & 4294967295L); + out[9 + outpos] = (in[4 + inpos] >>> 32); + out[10 + outpos] = (in[5 + inpos] & 4294967295L); + out[11 + outpos] = (in[5 + inpos] >>> 32); + out[12 + outpos] = (in[6 + inpos] & 4294967295L); + out[13 + outpos] = (in[6 + inpos] >>> 32); + out[14 + outpos] = (in[7 + inpos] & 4294967295L); + out[15 + outpos] = (in[7 + inpos] >>> 32); + out[16 + outpos] = (in[8 + inpos] & 4294967295L); + out[17 + outpos] = (in[8 + inpos] >>> 32); + out[18 + outpos] = (in[9 + inpos] & 4294967295L); + out[19 + outpos] = (in[9 + inpos] >>> 32); + out[20 + outpos] = (in[10 + inpos] & 4294967295L); + out[21 + outpos] = (in[10 + inpos] >>> 32); + out[22 + outpos] = (in[11 + inpos] & 4294967295L); + out[23 + outpos] = (in[11 + inpos] >>> 32); + out[24 + outpos] = (in[12 + inpos] & 4294967295L); + out[25 + outpos] = (in[12 + inpos] >>> 32); + out[26 + outpos] = (in[13 + inpos] & 4294967295L); + out[27 + outpos] = (in[13 + inpos] >>> 32); + out[28 + outpos] = (in[14 + inpos] & 4294967295L); + out[29 + outpos] = (in[14 + inpos] >>> 32); + out[30 + outpos] = (in[15 + inpos] & 4294967295L); + out[31 + outpos] = (in[15 + inpos] >>> 32); + out[32 + outpos] = (in[16 + inpos] & 4294967295L); + out[33 + outpos] = (in[16 + inpos] >>> 32); + out[34 + outpos] = (in[17 + inpos] & 4294967295L); + out[35 + outpos] = (in[17 + inpos] >>> 32); + out[36 + outpos] = (in[18 + inpos] & 4294967295L); + out[37 + outpos] = (in[18 + inpos] >>> 32); + out[38 + outpos] = (in[19 + inpos] & 4294967295L); + out[39 + outpos] = (in[19 + inpos] >>> 32); + out[40 + outpos] = (in[20 + inpos] & 4294967295L); + out[41 + outpos] = (in[20 + inpos] >>> 32); + out[42 + outpos] = (in[21 + inpos] & 4294967295L); + out[43 + outpos] = (in[21 + inpos] >>> 32); + out[44 + outpos] = (in[22 + inpos] & 4294967295L); + out[45 + outpos] = (in[22 + inpos] >>> 32); + out[46 + outpos] = (in[23 + inpos] & 4294967295L); + out[47 + outpos] = (in[23 + inpos] >>> 32); + out[48 + outpos] = (in[24 + inpos] & 4294967295L); + out[49 + outpos] = (in[24 + inpos] >>> 32); + out[50 + outpos] = (in[25 + inpos] & 4294967295L); + out[51 + outpos] = (in[25 + inpos] >>> 32); + out[52 + outpos] = (in[26 + inpos] & 4294967295L); + out[53 + outpos] = (in[26 + inpos] >>> 32); + out[54 + outpos] = (in[27 + inpos] & 4294967295L); + out[55 + outpos] = (in[27 + inpos] >>> 32); + out[56 + outpos] = (in[28 + inpos] & 4294967295L); + out[57 + outpos] = (in[28 + inpos] >>> 32); + out[58 + outpos] = (in[29 + inpos] & 4294967295L); + out[59 + outpos] = (in[29 + inpos] >>> 32); + out[60 + outpos] = (in[30 + inpos] & 4294967295L); + out[61 + outpos] = (in[30 + inpos] >>> 32); + out[62 + outpos] = (in[31 + inpos] & 4294967295L); + out[63 + outpos] = (in[31 + inpos] >>> 32); + } + + protected static void fastunpack33(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 8589934591L); + out[1 + outpos] = (in[inpos] >>> 33) + | ((in[1 + inpos] & 3L) << (33 - 2)); + out[2 + outpos] = ((in[1 + inpos] >>> 2) & 8589934591L); + out[3 + outpos] = (in[1 + inpos] >>> 35) + | ((in[2 + inpos] & 15L) << (33 - 4)); + out[4 + outpos] = ((in[2 + inpos] >>> 4) & 8589934591L); + out[5 + outpos] = (in[2 + inpos] >>> 37) + | ((in[3 + inpos] & 63L) << (33 - 6)); + out[6 + outpos] = ((in[3 + inpos] >>> 6) & 8589934591L); + out[7 + outpos] = (in[3 + inpos] >>> 39) + | ((in[4 + inpos] & 255L) << (33 - 8)); + out[8 + outpos] = ((in[4 + inpos] >>> 8) & 8589934591L); + out[9 + outpos] = (in[4 + inpos] >>> 41) + | ((in[5 + inpos] & 1023L) << (33 - 10)); + out[10 + outpos] = ((in[5 + inpos] >>> 10) & 8589934591L); + out[11 + outpos] = (in[5 + inpos] >>> 43) + | ((in[6 + inpos] & 4095L) << (33 - 12)); + out[12 + outpos] = ((in[6 + inpos] >>> 12) & 8589934591L); + out[13 + outpos] = (in[6 + inpos] >>> 45) + | ((in[7 + inpos] & 16383L) << (33 - 14)); + out[14 + outpos] = ((in[7 + inpos] >>> 14) & 8589934591L); + out[15 + outpos] = (in[7 + inpos] >>> 47) + | ((in[8 + inpos] & 65535L) << (33 - 16)); + out[16 + outpos] = ((in[8 + inpos] >>> 16) & 8589934591L); + out[17 + outpos] = (in[8 + inpos] >>> 49) + | ((in[9 + inpos] & 262143L) << (33 - 18)); + out[18 + outpos] = ((in[9 + inpos] >>> 18) & 8589934591L); + out[19 + outpos] = (in[9 + inpos] >>> 51) + | ((in[10 + inpos] & 1048575L) << (33 - 20)); + out[20 + outpos] = ((in[10 + inpos] >>> 20) & 8589934591L); + out[21 + outpos] = (in[10 + inpos] >>> 53) + | ((in[11 + inpos] & 4194303L) << (33 - 22)); + out[22 + outpos] = ((in[11 + inpos] >>> 22) & 8589934591L); + out[23 + outpos] = (in[11 + inpos] >>> 55) + | ((in[12 + inpos] & 16777215L) << (33 - 24)); + out[24 + outpos] = ((in[12 + inpos] >>> 24) & 8589934591L); + out[25 + outpos] = (in[12 + inpos] >>> 57) + | ((in[13 + inpos] & 67108863L) << (33 - 26)); + out[26 + outpos] = ((in[13 + inpos] >>> 26) & 8589934591L); + out[27 + outpos] = (in[13 + inpos] >>> 59) + | ((in[14 + inpos] & 268435455L) << (33 - 28)); + out[28 + outpos] = ((in[14 + inpos] >>> 28) & 8589934591L); + out[29 + outpos] = (in[14 + inpos] >>> 61) + | ((in[15 + inpos] & 1073741823L) << (33 - 30)); + out[30 + outpos] = ((in[15 + inpos] >>> 30) & 8589934591L); + out[31 + outpos] = (in[15 + inpos] >>> 63) + | ((in[16 + inpos] & 4294967295L) << (33 - 32)); + out[32 + outpos] = (in[16 + inpos] >>> 32) + | ((in[17 + inpos] & 1L) << (33 - 1)); + out[33 + outpos] = ((in[17 + inpos] >>> 1) & 8589934591L); + out[34 + outpos] = (in[17 + inpos] >>> 34) + | ((in[18 + inpos] & 7L) << (33 - 3)); + out[35 + outpos] = ((in[18 + inpos] >>> 3) & 8589934591L); + out[36 + outpos] = (in[18 + inpos] >>> 36) + | ((in[19 + inpos] & 31L) << (33 - 5)); + out[37 + outpos] = ((in[19 + inpos] >>> 5) & 8589934591L); + out[38 + outpos] = (in[19 + inpos] >>> 38) + | ((in[20 + inpos] & 127L) << (33 - 7)); + out[39 + outpos] = ((in[20 + inpos] >>> 7) & 8589934591L); + out[40 + outpos] = (in[20 + inpos] >>> 40) + | ((in[21 + inpos] & 511L) << (33 - 9)); + out[41 + outpos] = ((in[21 + inpos] >>> 9) & 8589934591L); + out[42 + outpos] = (in[21 + inpos] >>> 42) + | ((in[22 + inpos] & 2047L) << (33 - 11)); + out[43 + outpos] = ((in[22 + inpos] >>> 11) & 8589934591L); + out[44 + outpos] = (in[22 + inpos] >>> 44) + | ((in[23 + inpos] & 8191L) << (33 - 13)); + out[45 + outpos] = ((in[23 + inpos] >>> 13) & 8589934591L); + out[46 + outpos] = (in[23 + inpos] >>> 46) + | ((in[24 + inpos] & 32767L) << (33 - 15)); + out[47 + outpos] = ((in[24 + inpos] >>> 15) & 8589934591L); + out[48 + outpos] = (in[24 + inpos] >>> 48) + | ((in[25 + inpos] & 131071L) << (33 - 17)); + out[49 + outpos] = ((in[25 + inpos] >>> 17) & 8589934591L); + out[50 + outpos] = (in[25 + inpos] >>> 50) + | ((in[26 + inpos] & 524287L) << (33 - 19)); + out[51 + outpos] = ((in[26 + inpos] >>> 19) & 8589934591L); + out[52 + outpos] = (in[26 + inpos] >>> 52) + | ((in[27 + inpos] & 2097151L) << (33 - 21)); + out[53 + outpos] = ((in[27 + inpos] >>> 21) & 8589934591L); + out[54 + outpos] = (in[27 + inpos] >>> 54) + | ((in[28 + inpos] & 8388607L) << (33 - 23)); + out[55 + outpos] = ((in[28 + inpos] >>> 23) & 8589934591L); + out[56 + outpos] = (in[28 + inpos] >>> 56) + | ((in[29 + inpos] & 33554431L) << (33 - 25)); + out[57 + outpos] = ((in[29 + inpos] >>> 25) & 8589934591L); + out[58 + outpos] = (in[29 + inpos] >>> 58) + | ((in[30 + inpos] & 134217727L) << (33 - 27)); + out[59 + outpos] = ((in[30 + inpos] >>> 27) & 8589934591L); + out[60 + outpos] = (in[30 + inpos] >>> 60) + | ((in[31 + inpos] & 536870911L) << (33 - 29)); + out[61 + outpos] = ((in[31 + inpos] >>> 29) & 8589934591L); + out[62 + outpos] = (in[31 + inpos] >>> 62) + | ((in[32 + inpos] & 2147483647L) << (33 - 31)); + out[63 + outpos] = (in[32 + inpos] >>> 31); + } + + protected static void fastunpack34(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 17179869183L); + out[1 + outpos] = (in[inpos] >>> 34) + | ((in[1 + inpos] & 15L) << (34 - 4)); + out[2 + outpos] = ((in[1 + inpos] >>> 4) & 17179869183L); + out[3 + outpos] = (in[1 + inpos] >>> 38) + | ((in[2 + inpos] & 255L) << (34 - 8)); + out[4 + outpos] = ((in[2 + inpos] >>> 8) & 17179869183L); + out[5 + outpos] = (in[2 + inpos] >>> 42) + | ((in[3 + inpos] & 4095L) << (34 - 12)); + out[6 + outpos] = ((in[3 + inpos] >>> 12) & 17179869183L); + out[7 + outpos] = (in[3 + inpos] >>> 46) + | ((in[4 + inpos] & 65535L) << (34 - 16)); + out[8 + outpos] = ((in[4 + inpos] >>> 16) & 17179869183L); + out[9 + outpos] = (in[4 + inpos] >>> 50) + | ((in[5 + inpos] & 1048575L) << (34 - 20)); + out[10 + outpos] = ((in[5 + inpos] >>> 20) & 17179869183L); + out[11 + outpos] = (in[5 + inpos] >>> 54) + | ((in[6 + inpos] & 16777215L) << (34 - 24)); + out[12 + outpos] = ((in[6 + inpos] >>> 24) & 17179869183L); + out[13 + outpos] = (in[6 + inpos] >>> 58) + | ((in[7 + inpos] & 268435455L) << (34 - 28)); + out[14 + outpos] = ((in[7 + inpos] >>> 28) & 17179869183L); + out[15 + outpos] = (in[7 + inpos] >>> 62) + | ((in[8 + inpos] & 4294967295L) << (34 - 32)); + out[16 + outpos] = (in[8 + inpos] >>> 32) + | ((in[9 + inpos] & 3L) << (34 - 2)); + out[17 + outpos] = ((in[9 + inpos] >>> 2) & 17179869183L); + out[18 + outpos] = (in[9 + inpos] >>> 36) + | ((in[10 + inpos] & 63L) << (34 - 6)); + out[19 + outpos] = ((in[10 + inpos] >>> 6) & 17179869183L); + out[20 + outpos] = (in[10 + inpos] >>> 40) + | ((in[11 + inpos] & 1023L) << (34 - 10)); + out[21 + outpos] = ((in[11 + inpos] >>> 10) & 17179869183L); + out[22 + outpos] = (in[11 + inpos] >>> 44) + | ((in[12 + inpos] & 16383L) << (34 - 14)); + out[23 + outpos] = ((in[12 + inpos] >>> 14) & 17179869183L); + out[24 + outpos] = (in[12 + inpos] >>> 48) + | ((in[13 + inpos] & 262143L) << (34 - 18)); + out[25 + outpos] = ((in[13 + inpos] >>> 18) & 17179869183L); + out[26 + outpos] = (in[13 + inpos] >>> 52) + | ((in[14 + inpos] & 4194303L) << (34 - 22)); + out[27 + outpos] = ((in[14 + inpos] >>> 22) & 17179869183L); + out[28 + outpos] = (in[14 + inpos] >>> 56) + | ((in[15 + inpos] & 67108863L) << (34 - 26)); + out[29 + outpos] = ((in[15 + inpos] >>> 26) & 17179869183L); + out[30 + outpos] = (in[15 + inpos] >>> 60) + | ((in[16 + inpos] & 1073741823L) << (34 - 30)); + out[31 + outpos] = (in[16 + inpos] >>> 30); + out[32 + outpos] = (in[17 + inpos] & 17179869183L); + out[33 + outpos] = (in[17 + inpos] >>> 34) + | ((in[18 + inpos] & 15L) << (34 - 4)); + out[34 + outpos] = ((in[18 + inpos] >>> 4) & 17179869183L); + out[35 + outpos] = (in[18 + inpos] >>> 38) + | ((in[19 + inpos] & 255L) << (34 - 8)); + out[36 + outpos] = ((in[19 + inpos] >>> 8) & 17179869183L); + out[37 + outpos] = (in[19 + inpos] >>> 42) + | ((in[20 + inpos] & 4095L) << (34 - 12)); + out[38 + outpos] = ((in[20 + inpos] >>> 12) & 17179869183L); + out[39 + outpos] = (in[20 + inpos] >>> 46) + | ((in[21 + inpos] & 65535L) << (34 - 16)); + out[40 + outpos] = ((in[21 + inpos] >>> 16) & 17179869183L); + out[41 + outpos] = (in[21 + inpos] >>> 50) + | ((in[22 + inpos] & 1048575L) << (34 - 20)); + out[42 + outpos] = ((in[22 + inpos] >>> 20) & 17179869183L); + out[43 + outpos] = (in[22 + inpos] >>> 54) + | ((in[23 + inpos] & 16777215L) << (34 - 24)); + out[44 + outpos] = ((in[23 + inpos] >>> 24) & 17179869183L); + out[45 + outpos] = (in[23 + inpos] >>> 58) + | ((in[24 + inpos] & 268435455L) << (34 - 28)); + out[46 + outpos] = ((in[24 + inpos] >>> 28) & 17179869183L); + out[47 + outpos] = (in[24 + inpos] >>> 62) + | ((in[25 + inpos] & 4294967295L) << (34 - 32)); + out[48 + outpos] = (in[25 + inpos] >>> 32) + | ((in[26 + inpos] & 3L) << (34 - 2)); + out[49 + outpos] = ((in[26 + inpos] >>> 2) & 17179869183L); + out[50 + outpos] = (in[26 + inpos] >>> 36) + | ((in[27 + inpos] & 63L) << (34 - 6)); + out[51 + outpos] = ((in[27 + inpos] >>> 6) & 17179869183L); + out[52 + outpos] = (in[27 + inpos] >>> 40) + | ((in[28 + inpos] & 1023L) << (34 - 10)); + out[53 + outpos] = ((in[28 + inpos] >>> 10) & 17179869183L); + out[54 + outpos] = (in[28 + inpos] >>> 44) + | ((in[29 + inpos] & 16383L) << (34 - 14)); + out[55 + outpos] = ((in[29 + inpos] >>> 14) & 17179869183L); + out[56 + outpos] = (in[29 + inpos] >>> 48) + | ((in[30 + inpos] & 262143L) << (34 - 18)); + out[57 + outpos] = ((in[30 + inpos] >>> 18) & 17179869183L); + out[58 + outpos] = (in[30 + inpos] >>> 52) + | ((in[31 + inpos] & 4194303L) << (34 - 22)); + out[59 + outpos] = ((in[31 + inpos] >>> 22) & 17179869183L); + out[60 + outpos] = (in[31 + inpos] >>> 56) + | ((in[32 + inpos] & 67108863L) << (34 - 26)); + out[61 + outpos] = ((in[32 + inpos] >>> 26) & 17179869183L); + out[62 + outpos] = (in[32 + inpos] >>> 60) + | ((in[33 + inpos] & 1073741823L) << (34 - 30)); + out[63 + outpos] = (in[33 + inpos] >>> 30); + } + + protected static void fastunpack35(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 34359738367L); + out[1 + outpos] = (in[inpos] >>> 35) + | ((in[1 + inpos] & 63L) << (35 - 6)); + out[2 + outpos] = ((in[1 + inpos] >>> 6) & 34359738367L); + out[3 + outpos] = (in[1 + inpos] >>> 41) + | ((in[2 + inpos] & 4095L) << (35 - 12)); + out[4 + outpos] = ((in[2 + inpos] >>> 12) & 34359738367L); + out[5 + outpos] = (in[2 + inpos] >>> 47) + | ((in[3 + inpos] & 262143L) << (35 - 18)); + out[6 + outpos] = ((in[3 + inpos] >>> 18) & 34359738367L); + out[7 + outpos] = (in[3 + inpos] >>> 53) + | ((in[4 + inpos] & 16777215L) << (35 - 24)); + out[8 + outpos] = ((in[4 + inpos] >>> 24) & 34359738367L); + out[9 + outpos] = (in[4 + inpos] >>> 59) + | ((in[5 + inpos] & 1073741823L) << (35 - 30)); + out[10 + outpos] = (in[5 + inpos] >>> 30) + | ((in[6 + inpos] & 1L) << (35 - 1)); + out[11 + outpos] = ((in[6 + inpos] >>> 1) & 34359738367L); + out[12 + outpos] = (in[6 + inpos] >>> 36) + | ((in[7 + inpos] & 127L) << (35 - 7)); + out[13 + outpos] = ((in[7 + inpos] >>> 7) & 34359738367L); + out[14 + outpos] = (in[7 + inpos] >>> 42) + | ((in[8 + inpos] & 8191L) << (35 - 13)); + out[15 + outpos] = ((in[8 + inpos] >>> 13) & 34359738367L); + out[16 + outpos] = (in[8 + inpos] >>> 48) + | ((in[9 + inpos] & 524287L) << (35 - 19)); + out[17 + outpos] = ((in[9 + inpos] >>> 19) & 34359738367L); + out[18 + outpos] = (in[9 + inpos] >>> 54) + | ((in[10 + inpos] & 33554431L) << (35 - 25)); + out[19 + outpos] = ((in[10 + inpos] >>> 25) & 34359738367L); + out[20 + outpos] = (in[10 + inpos] >>> 60) + | ((in[11 + inpos] & 2147483647L) << (35 - 31)); + out[21 + outpos] = (in[11 + inpos] >>> 31) + | ((in[12 + inpos] & 3L) << (35 - 2)); + out[22 + outpos] = ((in[12 + inpos] >>> 2) & 34359738367L); + out[23 + outpos] = (in[12 + inpos] >>> 37) + | ((in[13 + inpos] & 255L) << (35 - 8)); + out[24 + outpos] = ((in[13 + inpos] >>> 8) & 34359738367L); + out[25 + outpos] = (in[13 + inpos] >>> 43) + | ((in[14 + inpos] & 16383L) << (35 - 14)); + out[26 + outpos] = ((in[14 + inpos] >>> 14) & 34359738367L); + out[27 + outpos] = (in[14 + inpos] >>> 49) + | ((in[15 + inpos] & 1048575L) << (35 - 20)); + out[28 + outpos] = ((in[15 + inpos] >>> 20) & 34359738367L); + out[29 + outpos] = (in[15 + inpos] >>> 55) + | ((in[16 + inpos] & 67108863L) << (35 - 26)); + out[30 + outpos] = ((in[16 + inpos] >>> 26) & 34359738367L); + out[31 + outpos] = (in[16 + inpos] >>> 61) + | ((in[17 + inpos] & 4294967295L) << (35 - 32)); + out[32 + outpos] = (in[17 + inpos] >>> 32) + | ((in[18 + inpos] & 7L) << (35 - 3)); + out[33 + outpos] = ((in[18 + inpos] >>> 3) & 34359738367L); + out[34 + outpos] = (in[18 + inpos] >>> 38) + | ((in[19 + inpos] & 511L) << (35 - 9)); + out[35 + outpos] = ((in[19 + inpos] >>> 9) & 34359738367L); + out[36 + outpos] = (in[19 + inpos] >>> 44) + | ((in[20 + inpos] & 32767L) << (35 - 15)); + out[37 + outpos] = ((in[20 + inpos] >>> 15) & 34359738367L); + out[38 + outpos] = (in[20 + inpos] >>> 50) + | ((in[21 + inpos] & 2097151L) << (35 - 21)); + out[39 + outpos] = ((in[21 + inpos] >>> 21) & 34359738367L); + out[40 + outpos] = (in[21 + inpos] >>> 56) + | ((in[22 + inpos] & 134217727L) << (35 - 27)); + out[41 + outpos] = ((in[22 + inpos] >>> 27) & 34359738367L); + out[42 + outpos] = (in[22 + inpos] >>> 62) + | ((in[23 + inpos] & 8589934591L) << (35 - 33)); + out[43 + outpos] = (in[23 + inpos] >>> 33) + | ((in[24 + inpos] & 15L) << (35 - 4)); + out[44 + outpos] = ((in[24 + inpos] >>> 4) & 34359738367L); + out[45 + outpos] = (in[24 + inpos] >>> 39) + | ((in[25 + inpos] & 1023L) << (35 - 10)); + out[46 + outpos] = ((in[25 + inpos] >>> 10) & 34359738367L); + out[47 + outpos] = (in[25 + inpos] >>> 45) + | ((in[26 + inpos] & 65535L) << (35 - 16)); + out[48 + outpos] = ((in[26 + inpos] >>> 16) & 34359738367L); + out[49 + outpos] = (in[26 + inpos] >>> 51) + | ((in[27 + inpos] & 4194303L) << (35 - 22)); + out[50 + outpos] = ((in[27 + inpos] >>> 22) & 34359738367L); + out[51 + outpos] = (in[27 + inpos] >>> 57) + | ((in[28 + inpos] & 268435455L) << (35 - 28)); + out[52 + outpos] = ((in[28 + inpos] >>> 28) & 34359738367L); + out[53 + outpos] = (in[28 + inpos] >>> 63) + | ((in[29 + inpos] & 17179869183L) << (35 - 34)); + out[54 + outpos] = (in[29 + inpos] >>> 34) + | ((in[30 + inpos] & 31L) << (35 - 5)); + out[55 + outpos] = ((in[30 + inpos] >>> 5) & 34359738367L); + out[56 + outpos] = (in[30 + inpos] >>> 40) + | ((in[31 + inpos] & 2047L) << (35 - 11)); + out[57 + outpos] = ((in[31 + inpos] >>> 11) & 34359738367L); + out[58 + outpos] = (in[31 + inpos] >>> 46) + | ((in[32 + inpos] & 131071L) << (35 - 17)); + out[59 + outpos] = ((in[32 + inpos] >>> 17) & 34359738367L); + out[60 + outpos] = (in[32 + inpos] >>> 52) + | ((in[33 + inpos] & 8388607L) << (35 - 23)); + out[61 + outpos] = ((in[33 + inpos] >>> 23) & 34359738367L); + out[62 + outpos] = (in[33 + inpos] >>> 58) + | ((in[34 + inpos] & 536870911L) << (35 - 29)); + out[63 + outpos] = (in[34 + inpos] >>> 29); + } + + protected static void fastunpack36(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 68719476735L); + out[1 + outpos] = (in[inpos] >>> 36) + | ((in[1 + inpos] & 255L) << (36 - 8)); + out[2 + outpos] = ((in[1 + inpos] >>> 8) & 68719476735L); + out[3 + outpos] = (in[1 + inpos] >>> 44) + | ((in[2 + inpos] & 65535L) << (36 - 16)); + out[4 + outpos] = ((in[2 + inpos] >>> 16) & 68719476735L); + out[5 + outpos] = (in[2 + inpos] >>> 52) + | ((in[3 + inpos] & 16777215L) << (36 - 24)); + out[6 + outpos] = ((in[3 + inpos] >>> 24) & 68719476735L); + out[7 + outpos] = (in[3 + inpos] >>> 60) + | ((in[4 + inpos] & 4294967295L) << (36 - 32)); + out[8 + outpos] = (in[4 + inpos] >>> 32) + | ((in[5 + inpos] & 15L) << (36 - 4)); + out[9 + outpos] = ((in[5 + inpos] >>> 4) & 68719476735L); + out[10 + outpos] = (in[5 + inpos] >>> 40) + | ((in[6 + inpos] & 4095L) << (36 - 12)); + out[11 + outpos] = ((in[6 + inpos] >>> 12) & 68719476735L); + out[12 + outpos] = (in[6 + inpos] >>> 48) + | ((in[7 + inpos] & 1048575L) << (36 - 20)); + out[13 + outpos] = ((in[7 + inpos] >>> 20) & 68719476735L); + out[14 + outpos] = (in[7 + inpos] >>> 56) + | ((in[8 + inpos] & 268435455L) << (36 - 28)); + out[15 + outpos] = (in[8 + inpos] >>> 28); + out[16 + outpos] = (in[9 + inpos] & 68719476735L); + out[17 + outpos] = (in[9 + inpos] >>> 36) + | ((in[10 + inpos] & 255L) << (36 - 8)); + out[18 + outpos] = ((in[10 + inpos] >>> 8) & 68719476735L); + out[19 + outpos] = (in[10 + inpos] >>> 44) + | ((in[11 + inpos] & 65535L) << (36 - 16)); + out[20 + outpos] = ((in[11 + inpos] >>> 16) & 68719476735L); + out[21 + outpos] = (in[11 + inpos] >>> 52) + | ((in[12 + inpos] & 16777215L) << (36 - 24)); + out[22 + outpos] = ((in[12 + inpos] >>> 24) & 68719476735L); + out[23 + outpos] = (in[12 + inpos] >>> 60) + | ((in[13 + inpos] & 4294967295L) << (36 - 32)); + out[24 + outpos] = (in[13 + inpos] >>> 32) + | ((in[14 + inpos] & 15L) << (36 - 4)); + out[25 + outpos] = ((in[14 + inpos] >>> 4) & 68719476735L); + out[26 + outpos] = (in[14 + inpos] >>> 40) + | ((in[15 + inpos] & 4095L) << (36 - 12)); + out[27 + outpos] = ((in[15 + inpos] >>> 12) & 68719476735L); + out[28 + outpos] = (in[15 + inpos] >>> 48) + | ((in[16 + inpos] & 1048575L) << (36 - 20)); + out[29 + outpos] = ((in[16 + inpos] >>> 20) & 68719476735L); + out[30 + outpos] = (in[16 + inpos] >>> 56) + | ((in[17 + inpos] & 268435455L) << (36 - 28)); + out[31 + outpos] = (in[17 + inpos] >>> 28); + out[32 + outpos] = (in[18 + inpos] & 68719476735L); + out[33 + outpos] = (in[18 + inpos] >>> 36) + | ((in[19 + inpos] & 255L) << (36 - 8)); + out[34 + outpos] = ((in[19 + inpos] >>> 8) & 68719476735L); + out[35 + outpos] = (in[19 + inpos] >>> 44) + | ((in[20 + inpos] & 65535L) << (36 - 16)); + out[36 + outpos] = ((in[20 + inpos] >>> 16) & 68719476735L); + out[37 + outpos] = (in[20 + inpos] >>> 52) + | ((in[21 + inpos] & 16777215L) << (36 - 24)); + out[38 + outpos] = ((in[21 + inpos] >>> 24) & 68719476735L); + out[39 + outpos] = (in[21 + inpos] >>> 60) + | ((in[22 + inpos] & 4294967295L) << (36 - 32)); + out[40 + outpos] = (in[22 + inpos] >>> 32) + | ((in[23 + inpos] & 15L) << (36 - 4)); + out[41 + outpos] = ((in[23 + inpos] >>> 4) & 68719476735L); + out[42 + outpos] = (in[23 + inpos] >>> 40) + | ((in[24 + inpos] & 4095L) << (36 - 12)); + out[43 + outpos] = ((in[24 + inpos] >>> 12) & 68719476735L); + out[44 + outpos] = (in[24 + inpos] >>> 48) + | ((in[25 + inpos] & 1048575L) << (36 - 20)); + out[45 + outpos] = ((in[25 + inpos] >>> 20) & 68719476735L); + out[46 + outpos] = (in[25 + inpos] >>> 56) + | ((in[26 + inpos] & 268435455L) << (36 - 28)); + out[47 + outpos] = (in[26 + inpos] >>> 28); + out[48 + outpos] = (in[27 + inpos] & 68719476735L); + out[49 + outpos] = (in[27 + inpos] >>> 36) + | ((in[28 + inpos] & 255L) << (36 - 8)); + out[50 + outpos] = ((in[28 + inpos] >>> 8) & 68719476735L); + out[51 + outpos] = (in[28 + inpos] >>> 44) + | ((in[29 + inpos] & 65535L) << (36 - 16)); + out[52 + outpos] = ((in[29 + inpos] >>> 16) & 68719476735L); + out[53 + outpos] = (in[29 + inpos] >>> 52) + | ((in[30 + inpos] & 16777215L) << (36 - 24)); + out[54 + outpos] = ((in[30 + inpos] >>> 24) & 68719476735L); + out[55 + outpos] = (in[30 + inpos] >>> 60) + | ((in[31 + inpos] & 4294967295L) << (36 - 32)); + out[56 + outpos] = (in[31 + inpos] >>> 32) + | ((in[32 + inpos] & 15L) << (36 - 4)); + out[57 + outpos] = ((in[32 + inpos] >>> 4) & 68719476735L); + out[58 + outpos] = (in[32 + inpos] >>> 40) + | ((in[33 + inpos] & 4095L) << (36 - 12)); + out[59 + outpos] = ((in[33 + inpos] >>> 12) & 68719476735L); + out[60 + outpos] = (in[33 + inpos] >>> 48) + | ((in[34 + inpos] & 1048575L) << (36 - 20)); + out[61 + outpos] = ((in[34 + inpos] >>> 20) & 68719476735L); + out[62 + outpos] = (in[34 + inpos] >>> 56) + | ((in[35 + inpos] & 268435455L) << (36 - 28)); + out[63 + outpos] = (in[35 + inpos] >>> 28); + } + + protected static void fastunpack37(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 137438953471L); + out[1 + outpos] = (in[inpos] >>> 37) + | ((in[1 + inpos] & 1023L) << (37 - 10)); + out[2 + outpos] = ((in[1 + inpos] >>> 10) & 137438953471L); + out[3 + outpos] = (in[1 + inpos] >>> 47) + | ((in[2 + inpos] & 1048575L) << (37 - 20)); + out[4 + outpos] = ((in[2 + inpos] >>> 20) & 137438953471L); + out[5 + outpos] = (in[2 + inpos] >>> 57) + | ((in[3 + inpos] & 1073741823L) << (37 - 30)); + out[6 + outpos] = (in[3 + inpos] >>> 30) + | ((in[4 + inpos] & 7L) << (37 - 3)); + out[7 + outpos] = ((in[4 + inpos] >>> 3) & 137438953471L); + out[8 + outpos] = (in[4 + inpos] >>> 40) + | ((in[5 + inpos] & 8191L) << (37 - 13)); + out[9 + outpos] = ((in[5 + inpos] >>> 13) & 137438953471L); + out[10 + outpos] = (in[5 + inpos] >>> 50) + | ((in[6 + inpos] & 8388607L) << (37 - 23)); + out[11 + outpos] = ((in[6 + inpos] >>> 23) & 137438953471L); + out[12 + outpos] = (in[6 + inpos] >>> 60) + | ((in[7 + inpos] & 8589934591L) << (37 - 33)); + out[13 + outpos] = (in[7 + inpos] >>> 33) + | ((in[8 + inpos] & 63L) << (37 - 6)); + out[14 + outpos] = ((in[8 + inpos] >>> 6) & 137438953471L); + out[15 + outpos] = (in[8 + inpos] >>> 43) + | ((in[9 + inpos] & 65535L) << (37 - 16)); + out[16 + outpos] = ((in[9 + inpos] >>> 16) & 137438953471L); + out[17 + outpos] = (in[9 + inpos] >>> 53) + | ((in[10 + inpos] & 67108863L) << (37 - 26)); + out[18 + outpos] = ((in[10 + inpos] >>> 26) & 137438953471L); + out[19 + outpos] = (in[10 + inpos] >>> 63) + | ((in[11 + inpos] & 68719476735L) << (37 - 36)); + out[20 + outpos] = (in[11 + inpos] >>> 36) + | ((in[12 + inpos] & 511L) << (37 - 9)); + out[21 + outpos] = ((in[12 + inpos] >>> 9) & 137438953471L); + out[22 + outpos] = (in[12 + inpos] >>> 46) + | ((in[13 + inpos] & 524287L) << (37 - 19)); + out[23 + outpos] = ((in[13 + inpos] >>> 19) & 137438953471L); + out[24 + outpos] = (in[13 + inpos] >>> 56) + | ((in[14 + inpos] & 536870911L) << (37 - 29)); + out[25 + outpos] = (in[14 + inpos] >>> 29) + | ((in[15 + inpos] & 3L) << (37 - 2)); + out[26 + outpos] = ((in[15 + inpos] >>> 2) & 137438953471L); + out[27 + outpos] = (in[15 + inpos] >>> 39) + | ((in[16 + inpos] & 4095L) << (37 - 12)); + out[28 + outpos] = ((in[16 + inpos] >>> 12) & 137438953471L); + out[29 + outpos] = (in[16 + inpos] >>> 49) + | ((in[17 + inpos] & 4194303L) << (37 - 22)); + out[30 + outpos] = ((in[17 + inpos] >>> 22) & 137438953471L); + out[31 + outpos] = (in[17 + inpos] >>> 59) + | ((in[18 + inpos] & 4294967295L) << (37 - 32)); + out[32 + outpos] = (in[18 + inpos] >>> 32) + | ((in[19 + inpos] & 31L) << (37 - 5)); + out[33 + outpos] = ((in[19 + inpos] >>> 5) & 137438953471L); + out[34 + outpos] = (in[19 + inpos] >>> 42) + | ((in[20 + inpos] & 32767L) << (37 - 15)); + out[35 + outpos] = ((in[20 + inpos] >>> 15) & 137438953471L); + out[36 + outpos] = (in[20 + inpos] >>> 52) + | ((in[21 + inpos] & 33554431L) << (37 - 25)); + out[37 + outpos] = ((in[21 + inpos] >>> 25) & 137438953471L); + out[38 + outpos] = (in[21 + inpos] >>> 62) + | ((in[22 + inpos] & 34359738367L) << (37 - 35)); + out[39 + outpos] = (in[22 + inpos] >>> 35) + | ((in[23 + inpos] & 255L) << (37 - 8)); + out[40 + outpos] = ((in[23 + inpos] >>> 8) & 137438953471L); + out[41 + outpos] = (in[23 + inpos] >>> 45) + | ((in[24 + inpos] & 262143L) << (37 - 18)); + out[42 + outpos] = ((in[24 + inpos] >>> 18) & 137438953471L); + out[43 + outpos] = (in[24 + inpos] >>> 55) + | ((in[25 + inpos] & 268435455L) << (37 - 28)); + out[44 + outpos] = (in[25 + inpos] >>> 28) + | ((in[26 + inpos] & 1L) << (37 - 1)); + out[45 + outpos] = ((in[26 + inpos] >>> 1) & 137438953471L); + out[46 + outpos] = (in[26 + inpos] >>> 38) + | ((in[27 + inpos] & 2047L) << (37 - 11)); + out[47 + outpos] = ((in[27 + inpos] >>> 11) & 137438953471L); + out[48 + outpos] = (in[27 + inpos] >>> 48) + | ((in[28 + inpos] & 2097151L) << (37 - 21)); + out[49 + outpos] = ((in[28 + inpos] >>> 21) & 137438953471L); + out[50 + outpos] = (in[28 + inpos] >>> 58) + | ((in[29 + inpos] & 2147483647L) << (37 - 31)); + out[51 + outpos] = (in[29 + inpos] >>> 31) + | ((in[30 + inpos] & 15L) << (37 - 4)); + out[52 + outpos] = ((in[30 + inpos] >>> 4) & 137438953471L); + out[53 + outpos] = (in[30 + inpos] >>> 41) + | ((in[31 + inpos] & 16383L) << (37 - 14)); + out[54 + outpos] = ((in[31 + inpos] >>> 14) & 137438953471L); + out[55 + outpos] = (in[31 + inpos] >>> 51) + | ((in[32 + inpos] & 16777215L) << (37 - 24)); + out[56 + outpos] = ((in[32 + inpos] >>> 24) & 137438953471L); + out[57 + outpos] = (in[32 + inpos] >>> 61) + | ((in[33 + inpos] & 17179869183L) << (37 - 34)); + out[58 + outpos] = (in[33 + inpos] >>> 34) + | ((in[34 + inpos] & 127L) << (37 - 7)); + out[59 + outpos] = ((in[34 + inpos] >>> 7) & 137438953471L); + out[60 + outpos] = (in[34 + inpos] >>> 44) + | ((in[35 + inpos] & 131071L) << (37 - 17)); + out[61 + outpos] = ((in[35 + inpos] >>> 17) & 137438953471L); + out[62 + outpos] = (in[35 + inpos] >>> 54) + | ((in[36 + inpos] & 134217727L) << (37 - 27)); + out[63 + outpos] = (in[36 + inpos] >>> 27); + } + + protected static void fastunpack38(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 274877906943L); + out[1 + outpos] = (in[inpos] >>> 38) + | ((in[1 + inpos] & 4095L) << (38 - 12)); + out[2 + outpos] = ((in[1 + inpos] >>> 12) & 274877906943L); + out[3 + outpos] = (in[1 + inpos] >>> 50) + | ((in[2 + inpos] & 16777215L) << (38 - 24)); + out[4 + outpos] = ((in[2 + inpos] >>> 24) & 274877906943L); + out[5 + outpos] = (in[2 + inpos] >>> 62) + | ((in[3 + inpos] & 68719476735L) << (38 - 36)); + out[6 + outpos] = (in[3 + inpos] >>> 36) + | ((in[4 + inpos] & 1023L) << (38 - 10)); + out[7 + outpos] = ((in[4 + inpos] >>> 10) & 274877906943L); + out[8 + outpos] = (in[4 + inpos] >>> 48) + | ((in[5 + inpos] & 4194303L) << (38 - 22)); + out[9 + outpos] = ((in[5 + inpos] >>> 22) & 274877906943L); + out[10 + outpos] = (in[5 + inpos] >>> 60) + | ((in[6 + inpos] & 17179869183L) << (38 - 34)); + out[11 + outpos] = (in[6 + inpos] >>> 34) + | ((in[7 + inpos] & 255L) << (38 - 8)); + out[12 + outpos] = ((in[7 + inpos] >>> 8) & 274877906943L); + out[13 + outpos] = (in[7 + inpos] >>> 46) + | ((in[8 + inpos] & 1048575L) << (38 - 20)); + out[14 + outpos] = ((in[8 + inpos] >>> 20) & 274877906943L); + out[15 + outpos] = (in[8 + inpos] >>> 58) + | ((in[9 + inpos] & 4294967295L) << (38 - 32)); + out[16 + outpos] = (in[9 + inpos] >>> 32) + | ((in[10 + inpos] & 63L) << (38 - 6)); + out[17 + outpos] = ((in[10 + inpos] >>> 6) & 274877906943L); + out[18 + outpos] = (in[10 + inpos] >>> 44) + | ((in[11 + inpos] & 262143L) << (38 - 18)); + out[19 + outpos] = ((in[11 + inpos] >>> 18) & 274877906943L); + out[20 + outpos] = (in[11 + inpos] >>> 56) + | ((in[12 + inpos] & 1073741823L) << (38 - 30)); + out[21 + outpos] = (in[12 + inpos] >>> 30) + | ((in[13 + inpos] & 15L) << (38 - 4)); + out[22 + outpos] = ((in[13 + inpos] >>> 4) & 274877906943L); + out[23 + outpos] = (in[13 + inpos] >>> 42) + | ((in[14 + inpos] & 65535L) << (38 - 16)); + out[24 + outpos] = ((in[14 + inpos] >>> 16) & 274877906943L); + out[25 + outpos] = (in[14 + inpos] >>> 54) + | ((in[15 + inpos] & 268435455L) << (38 - 28)); + out[26 + outpos] = (in[15 + inpos] >>> 28) + | ((in[16 + inpos] & 3L) << (38 - 2)); + out[27 + outpos] = ((in[16 + inpos] >>> 2) & 274877906943L); + out[28 + outpos] = (in[16 + inpos] >>> 40) + | ((in[17 + inpos] & 16383L) << (38 - 14)); + out[29 + outpos] = ((in[17 + inpos] >>> 14) & 274877906943L); + out[30 + outpos] = (in[17 + inpos] >>> 52) + | ((in[18 + inpos] & 67108863L) << (38 - 26)); + out[31 + outpos] = (in[18 + inpos] >>> 26); + out[32 + outpos] = (in[19 + inpos] & 274877906943L); + out[33 + outpos] = (in[19 + inpos] >>> 38) + | ((in[20 + inpos] & 4095L) << (38 - 12)); + out[34 + outpos] = ((in[20 + inpos] >>> 12) & 274877906943L); + out[35 + outpos] = (in[20 + inpos] >>> 50) + | ((in[21 + inpos] & 16777215L) << (38 - 24)); + out[36 + outpos] = ((in[21 + inpos] >>> 24) & 274877906943L); + out[37 + outpos] = (in[21 + inpos] >>> 62) + | ((in[22 + inpos] & 68719476735L) << (38 - 36)); + out[38 + outpos] = (in[22 + inpos] >>> 36) + | ((in[23 + inpos] & 1023L) << (38 - 10)); + out[39 + outpos] = ((in[23 + inpos] >>> 10) & 274877906943L); + out[40 + outpos] = (in[23 + inpos] >>> 48) + | ((in[24 + inpos] & 4194303L) << (38 - 22)); + out[41 + outpos] = ((in[24 + inpos] >>> 22) & 274877906943L); + out[42 + outpos] = (in[24 + inpos] >>> 60) + | ((in[25 + inpos] & 17179869183L) << (38 - 34)); + out[43 + outpos] = (in[25 + inpos] >>> 34) + | ((in[26 + inpos] & 255L) << (38 - 8)); + out[44 + outpos] = ((in[26 + inpos] >>> 8) & 274877906943L); + out[45 + outpos] = (in[26 + inpos] >>> 46) + | ((in[27 + inpos] & 1048575L) << (38 - 20)); + out[46 + outpos] = ((in[27 + inpos] >>> 20) & 274877906943L); + out[47 + outpos] = (in[27 + inpos] >>> 58) + | ((in[28 + inpos] & 4294967295L) << (38 - 32)); + out[48 + outpos] = (in[28 + inpos] >>> 32) + | ((in[29 + inpos] & 63L) << (38 - 6)); + out[49 + outpos] = ((in[29 + inpos] >>> 6) & 274877906943L); + out[50 + outpos] = (in[29 + inpos] >>> 44) + | ((in[30 + inpos] & 262143L) << (38 - 18)); + out[51 + outpos] = ((in[30 + inpos] >>> 18) & 274877906943L); + out[52 + outpos] = (in[30 + inpos] >>> 56) + | ((in[31 + inpos] & 1073741823L) << (38 - 30)); + out[53 + outpos] = (in[31 + inpos] >>> 30) + | ((in[32 + inpos] & 15L) << (38 - 4)); + out[54 + outpos] = ((in[32 + inpos] >>> 4) & 274877906943L); + out[55 + outpos] = (in[32 + inpos] >>> 42) + | ((in[33 + inpos] & 65535L) << (38 - 16)); + out[56 + outpos] = ((in[33 + inpos] >>> 16) & 274877906943L); + out[57 + outpos] = (in[33 + inpos] >>> 54) + | ((in[34 + inpos] & 268435455L) << (38 - 28)); + out[58 + outpos] = (in[34 + inpos] >>> 28) + | ((in[35 + inpos] & 3L) << (38 - 2)); + out[59 + outpos] = ((in[35 + inpos] >>> 2) & 274877906943L); + out[60 + outpos] = (in[35 + inpos] >>> 40) + | ((in[36 + inpos] & 16383L) << (38 - 14)); + out[61 + outpos] = ((in[36 + inpos] >>> 14) & 274877906943L); + out[62 + outpos] = (in[36 + inpos] >>> 52) + | ((in[37 + inpos] & 67108863L) << (38 - 26)); + out[63 + outpos] = (in[37 + inpos] >>> 26); + } + + protected static void fastunpack39(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 549755813887L); + out[1 + outpos] = (in[inpos] >>> 39) + | ((in[1 + inpos] & 16383L) << (39 - 14)); + out[2 + outpos] = ((in[1 + inpos] >>> 14) & 549755813887L); + out[3 + outpos] = (in[1 + inpos] >>> 53) + | ((in[2 + inpos] & 268435455L) << (39 - 28)); + out[4 + outpos] = (in[2 + inpos] >>> 28) + | ((in[3 + inpos] & 7L) << (39 - 3)); + out[5 + outpos] = ((in[3 + inpos] >>> 3) & 549755813887L); + out[6 + outpos] = (in[3 + inpos] >>> 42) + | ((in[4 + inpos] & 131071L) << (39 - 17)); + out[7 + outpos] = ((in[4 + inpos] >>> 17) & 549755813887L); + out[8 + outpos] = (in[4 + inpos] >>> 56) + | ((in[5 + inpos] & 2147483647L) << (39 - 31)); + out[9 + outpos] = (in[5 + inpos] >>> 31) + | ((in[6 + inpos] & 63L) << (39 - 6)); + out[10 + outpos] = ((in[6 + inpos] >>> 6) & 549755813887L); + out[11 + outpos] = (in[6 + inpos] >>> 45) + | ((in[7 + inpos] & 1048575L) << (39 - 20)); + out[12 + outpos] = ((in[7 + inpos] >>> 20) & 549755813887L); + out[13 + outpos] = (in[7 + inpos] >>> 59) + | ((in[8 + inpos] & 17179869183L) << (39 - 34)); + out[14 + outpos] = (in[8 + inpos] >>> 34) + | ((in[9 + inpos] & 511L) << (39 - 9)); + out[15 + outpos] = ((in[9 + inpos] >>> 9) & 549755813887L); + out[16 + outpos] = (in[9 + inpos] >>> 48) + | ((in[10 + inpos] & 8388607L) << (39 - 23)); + out[17 + outpos] = ((in[10 + inpos] >>> 23) & 549755813887L); + out[18 + outpos] = (in[10 + inpos] >>> 62) + | ((in[11 + inpos] & 137438953471L) << (39 - 37)); + out[19 + outpos] = (in[11 + inpos] >>> 37) + | ((in[12 + inpos] & 4095L) << (39 - 12)); + out[20 + outpos] = ((in[12 + inpos] >>> 12) & 549755813887L); + out[21 + outpos] = (in[12 + inpos] >>> 51) + | ((in[13 + inpos] & 67108863L) << (39 - 26)); + out[22 + outpos] = (in[13 + inpos] >>> 26) + | ((in[14 + inpos] & 1L) << (39 - 1)); + out[23 + outpos] = ((in[14 + inpos] >>> 1) & 549755813887L); + out[24 + outpos] = (in[14 + inpos] >>> 40) + | ((in[15 + inpos] & 32767L) << (39 - 15)); + out[25 + outpos] = ((in[15 + inpos] >>> 15) & 549755813887L); + out[26 + outpos] = (in[15 + inpos] >>> 54) + | ((in[16 + inpos] & 536870911L) << (39 - 29)); + out[27 + outpos] = (in[16 + inpos] >>> 29) + | ((in[17 + inpos] & 15L) << (39 - 4)); + out[28 + outpos] = ((in[17 + inpos] >>> 4) & 549755813887L); + out[29 + outpos] = (in[17 + inpos] >>> 43) + | ((in[18 + inpos] & 262143L) << (39 - 18)); + out[30 + outpos] = ((in[18 + inpos] >>> 18) & 549755813887L); + out[31 + outpos] = (in[18 + inpos] >>> 57) + | ((in[19 + inpos] & 4294967295L) << (39 - 32)); + out[32 + outpos] = (in[19 + inpos] >>> 32) + | ((in[20 + inpos] & 127L) << (39 - 7)); + out[33 + outpos] = ((in[20 + inpos] >>> 7) & 549755813887L); + out[34 + outpos] = (in[20 + inpos] >>> 46) + | ((in[21 + inpos] & 2097151L) << (39 - 21)); + out[35 + outpos] = ((in[21 + inpos] >>> 21) & 549755813887L); + out[36 + outpos] = (in[21 + inpos] >>> 60) + | ((in[22 + inpos] & 34359738367L) << (39 - 35)); + out[37 + outpos] = (in[22 + inpos] >>> 35) + | ((in[23 + inpos] & 1023L) << (39 - 10)); + out[38 + outpos] = ((in[23 + inpos] >>> 10) & 549755813887L); + out[39 + outpos] = (in[23 + inpos] >>> 49) + | ((in[24 + inpos] & 16777215L) << (39 - 24)); + out[40 + outpos] = ((in[24 + inpos] >>> 24) & 549755813887L); + out[41 + outpos] = (in[24 + inpos] >>> 63) + | ((in[25 + inpos] & 274877906943L) << (39 - 38)); + out[42 + outpos] = (in[25 + inpos] >>> 38) + | ((in[26 + inpos] & 8191L) << (39 - 13)); + out[43 + outpos] = ((in[26 + inpos] >>> 13) & 549755813887L); + out[44 + outpos] = (in[26 + inpos] >>> 52) + | ((in[27 + inpos] & 134217727L) << (39 - 27)); + out[45 + outpos] = (in[27 + inpos] >>> 27) + | ((in[28 + inpos] & 3L) << (39 - 2)); + out[46 + outpos] = ((in[28 + inpos] >>> 2) & 549755813887L); + out[47 + outpos] = (in[28 + inpos] >>> 41) + | ((in[29 + inpos] & 65535L) << (39 - 16)); + out[48 + outpos] = ((in[29 + inpos] >>> 16) & 549755813887L); + out[49 + outpos] = (in[29 + inpos] >>> 55) + | ((in[30 + inpos] & 1073741823L) << (39 - 30)); + out[50 + outpos] = (in[30 + inpos] >>> 30) + | ((in[31 + inpos] & 31L) << (39 - 5)); + out[51 + outpos] = ((in[31 + inpos] >>> 5) & 549755813887L); + out[52 + outpos] = (in[31 + inpos] >>> 44) + | ((in[32 + inpos] & 524287L) << (39 - 19)); + out[53 + outpos] = ((in[32 + inpos] >>> 19) & 549755813887L); + out[54 + outpos] = (in[32 + inpos] >>> 58) + | ((in[33 + inpos] & 8589934591L) << (39 - 33)); + out[55 + outpos] = (in[33 + inpos] >>> 33) + | ((in[34 + inpos] & 255L) << (39 - 8)); + out[56 + outpos] = ((in[34 + inpos] >>> 8) & 549755813887L); + out[57 + outpos] = (in[34 + inpos] >>> 47) + | ((in[35 + inpos] & 4194303L) << (39 - 22)); + out[58 + outpos] = ((in[35 + inpos] >>> 22) & 549755813887L); + out[59 + outpos] = (in[35 + inpos] >>> 61) + | ((in[36 + inpos] & 68719476735L) << (39 - 36)); + out[60 + outpos] = (in[36 + inpos] >>> 36) + | ((in[37 + inpos] & 2047L) << (39 - 11)); + out[61 + outpos] = ((in[37 + inpos] >>> 11) & 549755813887L); + out[62 + outpos] = (in[37 + inpos] >>> 50) + | ((in[38 + inpos] & 33554431L) << (39 - 25)); + out[63 + outpos] = (in[38 + inpos] >>> 25); + } + + protected static void fastunpack40(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 1099511627775L); + out[1 + outpos] = (in[inpos] >>> 40) + | ((in[1 + inpos] & 65535L) << (40 - 16)); + out[2 + outpos] = ((in[1 + inpos] >>> 16) & 1099511627775L); + out[3 + outpos] = (in[1 + inpos] >>> 56) + | ((in[2 + inpos] & 4294967295L) << (40 - 32)); + out[4 + outpos] = (in[2 + inpos] >>> 32) + | ((in[3 + inpos] & 255L) << (40 - 8)); + out[5 + outpos] = ((in[3 + inpos] >>> 8) & 1099511627775L); + out[6 + outpos] = (in[3 + inpos] >>> 48) + | ((in[4 + inpos] & 16777215L) << (40 - 24)); + out[7 + outpos] = (in[4 + inpos] >>> 24); + out[8 + outpos] = (in[5 + inpos] & 1099511627775L); + out[9 + outpos] = (in[5 + inpos] >>> 40) + | ((in[6 + inpos] & 65535L) << (40 - 16)); + out[10 + outpos] = ((in[6 + inpos] >>> 16) & 1099511627775L); + out[11 + outpos] = (in[6 + inpos] >>> 56) + | ((in[7 + inpos] & 4294967295L) << (40 - 32)); + out[12 + outpos] = (in[7 + inpos] >>> 32) + | ((in[8 + inpos] & 255L) << (40 - 8)); + out[13 + outpos] = ((in[8 + inpos] >>> 8) & 1099511627775L); + out[14 + outpos] = (in[8 + inpos] >>> 48) + | ((in[9 + inpos] & 16777215L) << (40 - 24)); + out[15 + outpos] = (in[9 + inpos] >>> 24); + out[16 + outpos] = (in[10 + inpos] & 1099511627775L); + out[17 + outpos] = (in[10 + inpos] >>> 40) + | ((in[11 + inpos] & 65535L) << (40 - 16)); + out[18 + outpos] = ((in[11 + inpos] >>> 16) & 1099511627775L); + out[19 + outpos] = (in[11 + inpos] >>> 56) + | ((in[12 + inpos] & 4294967295L) << (40 - 32)); + out[20 + outpos] = (in[12 + inpos] >>> 32) + | ((in[13 + inpos] & 255L) << (40 - 8)); + out[21 + outpos] = ((in[13 + inpos] >>> 8) & 1099511627775L); + out[22 + outpos] = (in[13 + inpos] >>> 48) + | ((in[14 + inpos] & 16777215L) << (40 - 24)); + out[23 + outpos] = (in[14 + inpos] >>> 24); + out[24 + outpos] = (in[15 + inpos] & 1099511627775L); + out[25 + outpos] = (in[15 + inpos] >>> 40) + | ((in[16 + inpos] & 65535L) << (40 - 16)); + out[26 + outpos] = ((in[16 + inpos] >>> 16) & 1099511627775L); + out[27 + outpos] = (in[16 + inpos] >>> 56) + | ((in[17 + inpos] & 4294967295L) << (40 - 32)); + out[28 + outpos] = (in[17 + inpos] >>> 32) + | ((in[18 + inpos] & 255L) << (40 - 8)); + out[29 + outpos] = ((in[18 + inpos] >>> 8) & 1099511627775L); + out[30 + outpos] = (in[18 + inpos] >>> 48) + | ((in[19 + inpos] & 16777215L) << (40 - 24)); + out[31 + outpos] = (in[19 + inpos] >>> 24); + out[32 + outpos] = (in[20 + inpos] & 1099511627775L); + out[33 + outpos] = (in[20 + inpos] >>> 40) + | ((in[21 + inpos] & 65535L) << (40 - 16)); + out[34 + outpos] = ((in[21 + inpos] >>> 16) & 1099511627775L); + out[35 + outpos] = (in[21 + inpos] >>> 56) + | ((in[22 + inpos] & 4294967295L) << (40 - 32)); + out[36 + outpos] = (in[22 + inpos] >>> 32) + | ((in[23 + inpos] & 255L) << (40 - 8)); + out[37 + outpos] = ((in[23 + inpos] >>> 8) & 1099511627775L); + out[38 + outpos] = (in[23 + inpos] >>> 48) + | ((in[24 + inpos] & 16777215L) << (40 - 24)); + out[39 + outpos] = (in[24 + inpos] >>> 24); + out[40 + outpos] = (in[25 + inpos] & 1099511627775L); + out[41 + outpos] = (in[25 + inpos] >>> 40) + | ((in[26 + inpos] & 65535L) << (40 - 16)); + out[42 + outpos] = ((in[26 + inpos] >>> 16) & 1099511627775L); + out[43 + outpos] = (in[26 + inpos] >>> 56) + | ((in[27 + inpos] & 4294967295L) << (40 - 32)); + out[44 + outpos] = (in[27 + inpos] >>> 32) + | ((in[28 + inpos] & 255L) << (40 - 8)); + out[45 + outpos] = ((in[28 + inpos] >>> 8) & 1099511627775L); + out[46 + outpos] = (in[28 + inpos] >>> 48) + | ((in[29 + inpos] & 16777215L) << (40 - 24)); + out[47 + outpos] = (in[29 + inpos] >>> 24); + out[48 + outpos] = (in[30 + inpos] & 1099511627775L); + out[49 + outpos] = (in[30 + inpos] >>> 40) + | ((in[31 + inpos] & 65535L) << (40 - 16)); + out[50 + outpos] = ((in[31 + inpos] >>> 16) & 1099511627775L); + out[51 + outpos] = (in[31 + inpos] >>> 56) + | ((in[32 + inpos] & 4294967295L) << (40 - 32)); + out[52 + outpos] = (in[32 + inpos] >>> 32) + | ((in[33 + inpos] & 255L) << (40 - 8)); + out[53 + outpos] = ((in[33 + inpos] >>> 8) & 1099511627775L); + out[54 + outpos] = (in[33 + inpos] >>> 48) + | ((in[34 + inpos] & 16777215L) << (40 - 24)); + out[55 + outpos] = (in[34 + inpos] >>> 24); + out[56 + outpos] = (in[35 + inpos] & 1099511627775L); + out[57 + outpos] = (in[35 + inpos] >>> 40) + | ((in[36 + inpos] & 65535L) << (40 - 16)); + out[58 + outpos] = ((in[36 + inpos] >>> 16) & 1099511627775L); + out[59 + outpos] = (in[36 + inpos] >>> 56) + | ((in[37 + inpos] & 4294967295L) << (40 - 32)); + out[60 + outpos] = (in[37 + inpos] >>> 32) + | ((in[38 + inpos] & 255L) << (40 - 8)); + out[61 + outpos] = ((in[38 + inpos] >>> 8) & 1099511627775L); + out[62 + outpos] = (in[38 + inpos] >>> 48) + | ((in[39 + inpos] & 16777215L) << (40 - 24)); + out[63 + outpos] = (in[39 + inpos] >>> 24); + } + + protected static void fastunpack41(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 2199023255551L); + out[1 + outpos] = (in[inpos] >>> 41) + | ((in[1 + inpos] & 262143L) << (41 - 18)); + out[2 + outpos] = ((in[1 + inpos] >>> 18) & 2199023255551L); + out[3 + outpos] = (in[1 + inpos] >>> 59) + | ((in[2 + inpos] & 68719476735L) << (41 - 36)); + out[4 + outpos] = (in[2 + inpos] >>> 36) + | ((in[3 + inpos] & 8191L) << (41 - 13)); + out[5 + outpos] = ((in[3 + inpos] >>> 13) & 2199023255551L); + out[6 + outpos] = (in[3 + inpos] >>> 54) + | ((in[4 + inpos] & 2147483647L) << (41 - 31)); + out[7 + outpos] = (in[4 + inpos] >>> 31) + | ((in[5 + inpos] & 255L) << (41 - 8)); + out[8 + outpos] = ((in[5 + inpos] >>> 8) & 2199023255551L); + out[9 + outpos] = (in[5 + inpos] >>> 49) + | ((in[6 + inpos] & 67108863L) << (41 - 26)); + out[10 + outpos] = (in[6 + inpos] >>> 26) + | ((in[7 + inpos] & 7L) << (41 - 3)); + out[11 + outpos] = ((in[7 + inpos] >>> 3) & 2199023255551L); + out[12 + outpos] = (in[7 + inpos] >>> 44) + | ((in[8 + inpos] & 2097151L) << (41 - 21)); + out[13 + outpos] = ((in[8 + inpos] >>> 21) & 2199023255551L); + out[14 + outpos] = (in[8 + inpos] >>> 62) + | ((in[9 + inpos] & 549755813887L) << (41 - 39)); + out[15 + outpos] = (in[9 + inpos] >>> 39) + | ((in[10 + inpos] & 65535L) << (41 - 16)); + out[16 + outpos] = ((in[10 + inpos] >>> 16) & 2199023255551L); + out[17 + outpos] = (in[10 + inpos] >>> 57) + | ((in[11 + inpos] & 17179869183L) << (41 - 34)); + out[18 + outpos] = (in[11 + inpos] >>> 34) + | ((in[12 + inpos] & 2047L) << (41 - 11)); + out[19 + outpos] = ((in[12 + inpos] >>> 11) & 2199023255551L); + out[20 + outpos] = (in[12 + inpos] >>> 52) + | ((in[13 + inpos] & 536870911L) << (41 - 29)); + out[21 + outpos] = (in[13 + inpos] >>> 29) + | ((in[14 + inpos] & 63L) << (41 - 6)); + out[22 + outpos] = ((in[14 + inpos] >>> 6) & 2199023255551L); + out[23 + outpos] = (in[14 + inpos] >>> 47) + | ((in[15 + inpos] & 16777215L) << (41 - 24)); + out[24 + outpos] = (in[15 + inpos] >>> 24) + | ((in[16 + inpos] & 1L) << (41 - 1)); + out[25 + outpos] = ((in[16 + inpos] >>> 1) & 2199023255551L); + out[26 + outpos] = (in[16 + inpos] >>> 42) + | ((in[17 + inpos] & 524287L) << (41 - 19)); + out[27 + outpos] = ((in[17 + inpos] >>> 19) & 2199023255551L); + out[28 + outpos] = (in[17 + inpos] >>> 60) + | ((in[18 + inpos] & 137438953471L) << (41 - 37)); + out[29 + outpos] = (in[18 + inpos] >>> 37) + | ((in[19 + inpos] & 16383L) << (41 - 14)); + out[30 + outpos] = ((in[19 + inpos] >>> 14) & 2199023255551L); + out[31 + outpos] = (in[19 + inpos] >>> 55) + | ((in[20 + inpos] & 4294967295L) << (41 - 32)); + out[32 + outpos] = (in[20 + inpos] >>> 32) + | ((in[21 + inpos] & 511L) << (41 - 9)); + out[33 + outpos] = ((in[21 + inpos] >>> 9) & 2199023255551L); + out[34 + outpos] = (in[21 + inpos] >>> 50) + | ((in[22 + inpos] & 134217727L) << (41 - 27)); + out[35 + outpos] = (in[22 + inpos] >>> 27) + | ((in[23 + inpos] & 15L) << (41 - 4)); + out[36 + outpos] = ((in[23 + inpos] >>> 4) & 2199023255551L); + out[37 + outpos] = (in[23 + inpos] >>> 45) + | ((in[24 + inpos] & 4194303L) << (41 - 22)); + out[38 + outpos] = ((in[24 + inpos] >>> 22) & 2199023255551L); + out[39 + outpos] = (in[24 + inpos] >>> 63) + | ((in[25 + inpos] & 1099511627775L) << (41 - 40)); + out[40 + outpos] = (in[25 + inpos] >>> 40) + | ((in[26 + inpos] & 131071L) << (41 - 17)); + out[41 + outpos] = ((in[26 + inpos] >>> 17) & 2199023255551L); + out[42 + outpos] = (in[26 + inpos] >>> 58) + | ((in[27 + inpos] & 34359738367L) << (41 - 35)); + out[43 + outpos] = (in[27 + inpos] >>> 35) + | ((in[28 + inpos] & 4095L) << (41 - 12)); + out[44 + outpos] = ((in[28 + inpos] >>> 12) & 2199023255551L); + out[45 + outpos] = (in[28 + inpos] >>> 53) + | ((in[29 + inpos] & 1073741823L) << (41 - 30)); + out[46 + outpos] = (in[29 + inpos] >>> 30) + | ((in[30 + inpos] & 127L) << (41 - 7)); + out[47 + outpos] = ((in[30 + inpos] >>> 7) & 2199023255551L); + out[48 + outpos] = (in[30 + inpos] >>> 48) + | ((in[31 + inpos] & 33554431L) << (41 - 25)); + out[49 + outpos] = (in[31 + inpos] >>> 25) + | ((in[32 + inpos] & 3L) << (41 - 2)); + out[50 + outpos] = ((in[32 + inpos] >>> 2) & 2199023255551L); + out[51 + outpos] = (in[32 + inpos] >>> 43) + | ((in[33 + inpos] & 1048575L) << (41 - 20)); + out[52 + outpos] = ((in[33 + inpos] >>> 20) & 2199023255551L); + out[53 + outpos] = (in[33 + inpos] >>> 61) + | ((in[34 + inpos] & 274877906943L) << (41 - 38)); + out[54 + outpos] = (in[34 + inpos] >>> 38) + | ((in[35 + inpos] & 32767L) << (41 - 15)); + out[55 + outpos] = ((in[35 + inpos] >>> 15) & 2199023255551L); + out[56 + outpos] = (in[35 + inpos] >>> 56) + | ((in[36 + inpos] & 8589934591L) << (41 - 33)); + out[57 + outpos] = (in[36 + inpos] >>> 33) + | ((in[37 + inpos] & 1023L) << (41 - 10)); + out[58 + outpos] = ((in[37 + inpos] >>> 10) & 2199023255551L); + out[59 + outpos] = (in[37 + inpos] >>> 51) + | ((in[38 + inpos] & 268435455L) << (41 - 28)); + out[60 + outpos] = (in[38 + inpos] >>> 28) + | ((in[39 + inpos] & 31L) << (41 - 5)); + out[61 + outpos] = ((in[39 + inpos] >>> 5) & 2199023255551L); + out[62 + outpos] = (in[39 + inpos] >>> 46) + | ((in[40 + inpos] & 8388607L) << (41 - 23)); + out[63 + outpos] = (in[40 + inpos] >>> 23); + } + + protected static void fastunpack42(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 4398046511103L); + out[1 + outpos] = (in[inpos] >>> 42) + | ((in[1 + inpos] & 1048575L) << (42 - 20)); + out[2 + outpos] = ((in[1 + inpos] >>> 20) & 4398046511103L); + out[3 + outpos] = (in[1 + inpos] >>> 62) + | ((in[2 + inpos] & 1099511627775L) << (42 - 40)); + out[4 + outpos] = (in[2 + inpos] >>> 40) + | ((in[3 + inpos] & 262143L) << (42 - 18)); + out[5 + outpos] = ((in[3 + inpos] >>> 18) & 4398046511103L); + out[6 + outpos] = (in[3 + inpos] >>> 60) + | ((in[4 + inpos] & 274877906943L) << (42 - 38)); + out[7 + outpos] = (in[4 + inpos] >>> 38) + | ((in[5 + inpos] & 65535L) << (42 - 16)); + out[8 + outpos] = ((in[5 + inpos] >>> 16) & 4398046511103L); + out[9 + outpos] = (in[5 + inpos] >>> 58) + | ((in[6 + inpos] & 68719476735L) << (42 - 36)); + out[10 + outpos] = (in[6 + inpos] >>> 36) + | ((in[7 + inpos] & 16383L) << (42 - 14)); + out[11 + outpos] = ((in[7 + inpos] >>> 14) & 4398046511103L); + out[12 + outpos] = (in[7 + inpos] >>> 56) + | ((in[8 + inpos] & 17179869183L) << (42 - 34)); + out[13 + outpos] = (in[8 + inpos] >>> 34) + | ((in[9 + inpos] & 4095L) << (42 - 12)); + out[14 + outpos] = ((in[9 + inpos] >>> 12) & 4398046511103L); + out[15 + outpos] = (in[9 + inpos] >>> 54) + | ((in[10 + inpos] & 4294967295L) << (42 - 32)); + out[16 + outpos] = (in[10 + inpos] >>> 32) + | ((in[11 + inpos] & 1023L) << (42 - 10)); + out[17 + outpos] = ((in[11 + inpos] >>> 10) & 4398046511103L); + out[18 + outpos] = (in[11 + inpos] >>> 52) + | ((in[12 + inpos] & 1073741823L) << (42 - 30)); + out[19 + outpos] = (in[12 + inpos] >>> 30) + | ((in[13 + inpos] & 255L) << (42 - 8)); + out[20 + outpos] = ((in[13 + inpos] >>> 8) & 4398046511103L); + out[21 + outpos] = (in[13 + inpos] >>> 50) + | ((in[14 + inpos] & 268435455L) << (42 - 28)); + out[22 + outpos] = (in[14 + inpos] >>> 28) + | ((in[15 + inpos] & 63L) << (42 - 6)); + out[23 + outpos] = ((in[15 + inpos] >>> 6) & 4398046511103L); + out[24 + outpos] = (in[15 + inpos] >>> 48) + | ((in[16 + inpos] & 67108863L) << (42 - 26)); + out[25 + outpos] = (in[16 + inpos] >>> 26) + | ((in[17 + inpos] & 15L) << (42 - 4)); + out[26 + outpos] = ((in[17 + inpos] >>> 4) & 4398046511103L); + out[27 + outpos] = (in[17 + inpos] >>> 46) + | ((in[18 + inpos] & 16777215L) << (42 - 24)); + out[28 + outpos] = (in[18 + inpos] >>> 24) + | ((in[19 + inpos] & 3L) << (42 - 2)); + out[29 + outpos] = ((in[19 + inpos] >>> 2) & 4398046511103L); + out[30 + outpos] = (in[19 + inpos] >>> 44) + | ((in[20 + inpos] & 4194303L) << (42 - 22)); + out[31 + outpos] = (in[20 + inpos] >>> 22); + out[32 + outpos] = (in[21 + inpos] & 4398046511103L); + out[33 + outpos] = (in[21 + inpos] >>> 42) + | ((in[22 + inpos] & 1048575L) << (42 - 20)); + out[34 + outpos] = ((in[22 + inpos] >>> 20) & 4398046511103L); + out[35 + outpos] = (in[22 + inpos] >>> 62) + | ((in[23 + inpos] & 1099511627775L) << (42 - 40)); + out[36 + outpos] = (in[23 + inpos] >>> 40) + | ((in[24 + inpos] & 262143L) << (42 - 18)); + out[37 + outpos] = ((in[24 + inpos] >>> 18) & 4398046511103L); + out[38 + outpos] = (in[24 + inpos] >>> 60) + | ((in[25 + inpos] & 274877906943L) << (42 - 38)); + out[39 + outpos] = (in[25 + inpos] >>> 38) + | ((in[26 + inpos] & 65535L) << (42 - 16)); + out[40 + outpos] = ((in[26 + inpos] >>> 16) & 4398046511103L); + out[41 + outpos] = (in[26 + inpos] >>> 58) + | ((in[27 + inpos] & 68719476735L) << (42 - 36)); + out[42 + outpos] = (in[27 + inpos] >>> 36) + | ((in[28 + inpos] & 16383L) << (42 - 14)); + out[43 + outpos] = ((in[28 + inpos] >>> 14) & 4398046511103L); + out[44 + outpos] = (in[28 + inpos] >>> 56) + | ((in[29 + inpos] & 17179869183L) << (42 - 34)); + out[45 + outpos] = (in[29 + inpos] >>> 34) + | ((in[30 + inpos] & 4095L) << (42 - 12)); + out[46 + outpos] = ((in[30 + inpos] >>> 12) & 4398046511103L); + out[47 + outpos] = (in[30 + inpos] >>> 54) + | ((in[31 + inpos] & 4294967295L) << (42 - 32)); + out[48 + outpos] = (in[31 + inpos] >>> 32) + | ((in[32 + inpos] & 1023L) << (42 - 10)); + out[49 + outpos] = ((in[32 + inpos] >>> 10) & 4398046511103L); + out[50 + outpos] = (in[32 + inpos] >>> 52) + | ((in[33 + inpos] & 1073741823L) << (42 - 30)); + out[51 + outpos] = (in[33 + inpos] >>> 30) + | ((in[34 + inpos] & 255L) << (42 - 8)); + out[52 + outpos] = ((in[34 + inpos] >>> 8) & 4398046511103L); + out[53 + outpos] = (in[34 + inpos] >>> 50) + | ((in[35 + inpos] & 268435455L) << (42 - 28)); + out[54 + outpos] = (in[35 + inpos] >>> 28) + | ((in[36 + inpos] & 63L) << (42 - 6)); + out[55 + outpos] = ((in[36 + inpos] >>> 6) & 4398046511103L); + out[56 + outpos] = (in[36 + inpos] >>> 48) + | ((in[37 + inpos] & 67108863L) << (42 - 26)); + out[57 + outpos] = (in[37 + inpos] >>> 26) + | ((in[38 + inpos] & 15L) << (42 - 4)); + out[58 + outpos] = ((in[38 + inpos] >>> 4) & 4398046511103L); + out[59 + outpos] = (in[38 + inpos] >>> 46) + | ((in[39 + inpos] & 16777215L) << (42 - 24)); + out[60 + outpos] = (in[39 + inpos] >>> 24) + | ((in[40 + inpos] & 3L) << (42 - 2)); + out[61 + outpos] = ((in[40 + inpos] >>> 2) & 4398046511103L); + out[62 + outpos] = (in[40 + inpos] >>> 44) + | ((in[41 + inpos] & 4194303L) << (42 - 22)); + out[63 + outpos] = (in[41 + inpos] >>> 22); + } + + protected static void fastunpack43(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 8796093022207L); + out[1 + outpos] = (in[inpos] >>> 43) + | ((in[1 + inpos] & 4194303L) << (43 - 22)); + out[2 + outpos] = (in[1 + inpos] >>> 22) + | ((in[2 + inpos] & 1L) << (43 - 1)); + out[3 + outpos] = ((in[2 + inpos] >>> 1) & 8796093022207L); + out[4 + outpos] = (in[2 + inpos] >>> 44) + | ((in[3 + inpos] & 8388607L) << (43 - 23)); + out[5 + outpos] = (in[3 + inpos] >>> 23) + | ((in[4 + inpos] & 3L) << (43 - 2)); + out[6 + outpos] = ((in[4 + inpos] >>> 2) & 8796093022207L); + out[7 + outpos] = (in[4 + inpos] >>> 45) + | ((in[5 + inpos] & 16777215L) << (43 - 24)); + out[8 + outpos] = (in[5 + inpos] >>> 24) + | ((in[6 + inpos] & 7L) << (43 - 3)); + out[9 + outpos] = ((in[6 + inpos] >>> 3) & 8796093022207L); + out[10 + outpos] = (in[6 + inpos] >>> 46) + | ((in[7 + inpos] & 33554431L) << (43 - 25)); + out[11 + outpos] = (in[7 + inpos] >>> 25) + | ((in[8 + inpos] & 15L) << (43 - 4)); + out[12 + outpos] = ((in[8 + inpos] >>> 4) & 8796093022207L); + out[13 + outpos] = (in[8 + inpos] >>> 47) + | ((in[9 + inpos] & 67108863L) << (43 - 26)); + out[14 + outpos] = (in[9 + inpos] >>> 26) + | ((in[10 + inpos] & 31L) << (43 - 5)); + out[15 + outpos] = ((in[10 + inpos] >>> 5) & 8796093022207L); + out[16 + outpos] = (in[10 + inpos] >>> 48) + | ((in[11 + inpos] & 134217727L) << (43 - 27)); + out[17 + outpos] = (in[11 + inpos] >>> 27) + | ((in[12 + inpos] & 63L) << (43 - 6)); + out[18 + outpos] = ((in[12 + inpos] >>> 6) & 8796093022207L); + out[19 + outpos] = (in[12 + inpos] >>> 49) + | ((in[13 + inpos] & 268435455L) << (43 - 28)); + out[20 + outpos] = (in[13 + inpos] >>> 28) + | ((in[14 + inpos] & 127L) << (43 - 7)); + out[21 + outpos] = ((in[14 + inpos] >>> 7) & 8796093022207L); + out[22 + outpos] = (in[14 + inpos] >>> 50) + | ((in[15 + inpos] & 536870911L) << (43 - 29)); + out[23 + outpos] = (in[15 + inpos] >>> 29) + | ((in[16 + inpos] & 255L) << (43 - 8)); + out[24 + outpos] = ((in[16 + inpos] >>> 8) & 8796093022207L); + out[25 + outpos] = (in[16 + inpos] >>> 51) + | ((in[17 + inpos] & 1073741823L) << (43 - 30)); + out[26 + outpos] = (in[17 + inpos] >>> 30) + | ((in[18 + inpos] & 511L) << (43 - 9)); + out[27 + outpos] = ((in[18 + inpos] >>> 9) & 8796093022207L); + out[28 + outpos] = (in[18 + inpos] >>> 52) + | ((in[19 + inpos] & 2147483647L) << (43 - 31)); + out[29 + outpos] = (in[19 + inpos] >>> 31) + | ((in[20 + inpos] & 1023L) << (43 - 10)); + out[30 + outpos] = ((in[20 + inpos] >>> 10) & 8796093022207L); + out[31 + outpos] = (in[20 + inpos] >>> 53) + | ((in[21 + inpos] & 4294967295L) << (43 - 32)); + out[32 + outpos] = (in[21 + inpos] >>> 32) + | ((in[22 + inpos] & 2047L) << (43 - 11)); + out[33 + outpos] = ((in[22 + inpos] >>> 11) & 8796093022207L); + out[34 + outpos] = (in[22 + inpos] >>> 54) + | ((in[23 + inpos] & 8589934591L) << (43 - 33)); + out[35 + outpos] = (in[23 + inpos] >>> 33) + | ((in[24 + inpos] & 4095L) << (43 - 12)); + out[36 + outpos] = ((in[24 + inpos] >>> 12) & 8796093022207L); + out[37 + outpos] = (in[24 + inpos] >>> 55) + | ((in[25 + inpos] & 17179869183L) << (43 - 34)); + out[38 + outpos] = (in[25 + inpos] >>> 34) + | ((in[26 + inpos] & 8191L) << (43 - 13)); + out[39 + outpos] = ((in[26 + inpos] >>> 13) & 8796093022207L); + out[40 + outpos] = (in[26 + inpos] >>> 56) + | ((in[27 + inpos] & 34359738367L) << (43 - 35)); + out[41 + outpos] = (in[27 + inpos] >>> 35) + | ((in[28 + inpos] & 16383L) << (43 - 14)); + out[42 + outpos] = ((in[28 + inpos] >>> 14) & 8796093022207L); + out[43 + outpos] = (in[28 + inpos] >>> 57) + | ((in[29 + inpos] & 68719476735L) << (43 - 36)); + out[44 + outpos] = (in[29 + inpos] >>> 36) + | ((in[30 + inpos] & 32767L) << (43 - 15)); + out[45 + outpos] = ((in[30 + inpos] >>> 15) & 8796093022207L); + out[46 + outpos] = (in[30 + inpos] >>> 58) + | ((in[31 + inpos] & 137438953471L) << (43 - 37)); + out[47 + outpos] = (in[31 + inpos] >>> 37) + | ((in[32 + inpos] & 65535L) << (43 - 16)); + out[48 + outpos] = ((in[32 + inpos] >>> 16) & 8796093022207L); + out[49 + outpos] = (in[32 + inpos] >>> 59) + | ((in[33 + inpos] & 274877906943L) << (43 - 38)); + out[50 + outpos] = (in[33 + inpos] >>> 38) + | ((in[34 + inpos] & 131071L) << (43 - 17)); + out[51 + outpos] = ((in[34 + inpos] >>> 17) & 8796093022207L); + out[52 + outpos] = (in[34 + inpos] >>> 60) + | ((in[35 + inpos] & 549755813887L) << (43 - 39)); + out[53 + outpos] = (in[35 + inpos] >>> 39) + | ((in[36 + inpos] & 262143L) << (43 - 18)); + out[54 + outpos] = ((in[36 + inpos] >>> 18) & 8796093022207L); + out[55 + outpos] = (in[36 + inpos] >>> 61) + | ((in[37 + inpos] & 1099511627775L) << (43 - 40)); + out[56 + outpos] = (in[37 + inpos] >>> 40) + | ((in[38 + inpos] & 524287L) << (43 - 19)); + out[57 + outpos] = ((in[38 + inpos] >>> 19) & 8796093022207L); + out[58 + outpos] = (in[38 + inpos] >>> 62) + | ((in[39 + inpos] & 2199023255551L) << (43 - 41)); + out[59 + outpos] = (in[39 + inpos] >>> 41) + | ((in[40 + inpos] & 1048575L) << (43 - 20)); + out[60 + outpos] = ((in[40 + inpos] >>> 20) & 8796093022207L); + out[61 + outpos] = (in[40 + inpos] >>> 63) + | ((in[41 + inpos] & 4398046511103L) << (43 - 42)); + out[62 + outpos] = (in[41 + inpos] >>> 42) + | ((in[42 + inpos] & 2097151L) << (43 - 21)); + out[63 + outpos] = (in[42 + inpos] >>> 21); + } + + protected static void fastunpack44(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 17592186044415L); + out[1 + outpos] = (in[inpos] >>> 44) + | ((in[1 + inpos] & 16777215L) << (44 - 24)); + out[2 + outpos] = (in[1 + inpos] >>> 24) + | ((in[2 + inpos] & 15L) << (44 - 4)); + out[3 + outpos] = ((in[2 + inpos] >>> 4) & 17592186044415L); + out[4 + outpos] = (in[2 + inpos] >>> 48) + | ((in[3 + inpos] & 268435455L) << (44 - 28)); + out[5 + outpos] = (in[3 + inpos] >>> 28) + | ((in[4 + inpos] & 255L) << (44 - 8)); + out[6 + outpos] = ((in[4 + inpos] >>> 8) & 17592186044415L); + out[7 + outpos] = (in[4 + inpos] >>> 52) + | ((in[5 + inpos] & 4294967295L) << (44 - 32)); + out[8 + outpos] = (in[5 + inpos] >>> 32) + | ((in[6 + inpos] & 4095L) << (44 - 12)); + out[9 + outpos] = ((in[6 + inpos] >>> 12) & 17592186044415L); + out[10 + outpos] = (in[6 + inpos] >>> 56) + | ((in[7 + inpos] & 68719476735L) << (44 - 36)); + out[11 + outpos] = (in[7 + inpos] >>> 36) + | ((in[8 + inpos] & 65535L) << (44 - 16)); + out[12 + outpos] = ((in[8 + inpos] >>> 16) & 17592186044415L); + out[13 + outpos] = (in[8 + inpos] >>> 60) + | ((in[9 + inpos] & 1099511627775L) << (44 - 40)); + out[14 + outpos] = (in[9 + inpos] >>> 40) + | ((in[10 + inpos] & 1048575L) << (44 - 20)); + out[15 + outpos] = (in[10 + inpos] >>> 20); + out[16 + outpos] = (in[11 + inpos] & 17592186044415L); + out[17 + outpos] = (in[11 + inpos] >>> 44) + | ((in[12 + inpos] & 16777215L) << (44 - 24)); + out[18 + outpos] = (in[12 + inpos] >>> 24) + | ((in[13 + inpos] & 15L) << (44 - 4)); + out[19 + outpos] = ((in[13 + inpos] >>> 4) & 17592186044415L); + out[20 + outpos] = (in[13 + inpos] >>> 48) + | ((in[14 + inpos] & 268435455L) << (44 - 28)); + out[21 + outpos] = (in[14 + inpos] >>> 28) + | ((in[15 + inpos] & 255L) << (44 - 8)); + out[22 + outpos] = ((in[15 + inpos] >>> 8) & 17592186044415L); + out[23 + outpos] = (in[15 + inpos] >>> 52) + | ((in[16 + inpos] & 4294967295L) << (44 - 32)); + out[24 + outpos] = (in[16 + inpos] >>> 32) + | ((in[17 + inpos] & 4095L) << (44 - 12)); + out[25 + outpos] = ((in[17 + inpos] >>> 12) & 17592186044415L); + out[26 + outpos] = (in[17 + inpos] >>> 56) + | ((in[18 + inpos] & 68719476735L) << (44 - 36)); + out[27 + outpos] = (in[18 + inpos] >>> 36) + | ((in[19 + inpos] & 65535L) << (44 - 16)); + out[28 + outpos] = ((in[19 + inpos] >>> 16) & 17592186044415L); + out[29 + outpos] = (in[19 + inpos] >>> 60) + | ((in[20 + inpos] & 1099511627775L) << (44 - 40)); + out[30 + outpos] = (in[20 + inpos] >>> 40) + | ((in[21 + inpos] & 1048575L) << (44 - 20)); + out[31 + outpos] = (in[21 + inpos] >>> 20); + out[32 + outpos] = (in[22 + inpos] & 17592186044415L); + out[33 + outpos] = (in[22 + inpos] >>> 44) + | ((in[23 + inpos] & 16777215L) << (44 - 24)); + out[34 + outpos] = (in[23 + inpos] >>> 24) + | ((in[24 + inpos] & 15L) << (44 - 4)); + out[35 + outpos] = ((in[24 + inpos] >>> 4) & 17592186044415L); + out[36 + outpos] = (in[24 + inpos] >>> 48) + | ((in[25 + inpos] & 268435455L) << (44 - 28)); + out[37 + outpos] = (in[25 + inpos] >>> 28) + | ((in[26 + inpos] & 255L) << (44 - 8)); + out[38 + outpos] = ((in[26 + inpos] >>> 8) & 17592186044415L); + out[39 + outpos] = (in[26 + inpos] >>> 52) + | ((in[27 + inpos] & 4294967295L) << (44 - 32)); + out[40 + outpos] = (in[27 + inpos] >>> 32) + | ((in[28 + inpos] & 4095L) << (44 - 12)); + out[41 + outpos] = ((in[28 + inpos] >>> 12) & 17592186044415L); + out[42 + outpos] = (in[28 + inpos] >>> 56) + | ((in[29 + inpos] & 68719476735L) << (44 - 36)); + out[43 + outpos] = (in[29 + inpos] >>> 36) + | ((in[30 + inpos] & 65535L) << (44 - 16)); + out[44 + outpos] = ((in[30 + inpos] >>> 16) & 17592186044415L); + out[45 + outpos] = (in[30 + inpos] >>> 60) + | ((in[31 + inpos] & 1099511627775L) << (44 - 40)); + out[46 + outpos] = (in[31 + inpos] >>> 40) + | ((in[32 + inpos] & 1048575L) << (44 - 20)); + out[47 + outpos] = (in[32 + inpos] >>> 20); + out[48 + outpos] = (in[33 + inpos] & 17592186044415L); + out[49 + outpos] = (in[33 + inpos] >>> 44) + | ((in[34 + inpos] & 16777215L) << (44 - 24)); + out[50 + outpos] = (in[34 + inpos] >>> 24) + | ((in[35 + inpos] & 15L) << (44 - 4)); + out[51 + outpos] = ((in[35 + inpos] >>> 4) & 17592186044415L); + out[52 + outpos] = (in[35 + inpos] >>> 48) + | ((in[36 + inpos] & 268435455L) << (44 - 28)); + out[53 + outpos] = (in[36 + inpos] >>> 28) + | ((in[37 + inpos] & 255L) << (44 - 8)); + out[54 + outpos] = ((in[37 + inpos] >>> 8) & 17592186044415L); + out[55 + outpos] = (in[37 + inpos] >>> 52) + | ((in[38 + inpos] & 4294967295L) << (44 - 32)); + out[56 + outpos] = (in[38 + inpos] >>> 32) + | ((in[39 + inpos] & 4095L) << (44 - 12)); + out[57 + outpos] = ((in[39 + inpos] >>> 12) & 17592186044415L); + out[58 + outpos] = (in[39 + inpos] >>> 56) + | ((in[40 + inpos] & 68719476735L) << (44 - 36)); + out[59 + outpos] = (in[40 + inpos] >>> 36) + | ((in[41 + inpos] & 65535L) << (44 - 16)); + out[60 + outpos] = ((in[41 + inpos] >>> 16) & 17592186044415L); + out[61 + outpos] = (in[41 + inpos] >>> 60) + | ((in[42 + inpos] & 1099511627775L) << (44 - 40)); + out[62 + outpos] = (in[42 + inpos] >>> 40) + | ((in[43 + inpos] & 1048575L) << (44 - 20)); + out[63 + outpos] = (in[43 + inpos] >>> 20); + } + + protected static void fastunpack45(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 35184372088831L); + out[1 + outpos] = (in[inpos] >>> 45) + | ((in[1 + inpos] & 67108863L) << (45 - 26)); + out[2 + outpos] = (in[1 + inpos] >>> 26) + | ((in[2 + inpos] & 127L) << (45 - 7)); + out[3 + outpos] = ((in[2 + inpos] >>> 7) & 35184372088831L); + out[4 + outpos] = (in[2 + inpos] >>> 52) + | ((in[3 + inpos] & 8589934591L) << (45 - 33)); + out[5 + outpos] = (in[3 + inpos] >>> 33) + | ((in[4 + inpos] & 16383L) << (45 - 14)); + out[6 + outpos] = ((in[4 + inpos] >>> 14) & 35184372088831L); + out[7 + outpos] = (in[4 + inpos] >>> 59) + | ((in[5 + inpos] & 1099511627775L) << (45 - 40)); + out[8 + outpos] = (in[5 + inpos] >>> 40) + | ((in[6 + inpos] & 2097151L) << (45 - 21)); + out[9 + outpos] = (in[6 + inpos] >>> 21) + | ((in[7 + inpos] & 3L) << (45 - 2)); + out[10 + outpos] = ((in[7 + inpos] >>> 2) & 35184372088831L); + out[11 + outpos] = (in[7 + inpos] >>> 47) + | ((in[8 + inpos] & 268435455L) << (45 - 28)); + out[12 + outpos] = (in[8 + inpos] >>> 28) + | ((in[9 + inpos] & 511L) << (45 - 9)); + out[13 + outpos] = ((in[9 + inpos] >>> 9) & 35184372088831L); + out[14 + outpos] = (in[9 + inpos] >>> 54) + | ((in[10 + inpos] & 34359738367L) << (45 - 35)); + out[15 + outpos] = (in[10 + inpos] >>> 35) + | ((in[11 + inpos] & 65535L) << (45 - 16)); + out[16 + outpos] = ((in[11 + inpos] >>> 16) & 35184372088831L); + out[17 + outpos] = (in[11 + inpos] >>> 61) + | ((in[12 + inpos] & 4398046511103L) << (45 - 42)); + out[18 + outpos] = (in[12 + inpos] >>> 42) + | ((in[13 + inpos] & 8388607L) << (45 - 23)); + out[19 + outpos] = (in[13 + inpos] >>> 23) + | ((in[14 + inpos] & 15L) << (45 - 4)); + out[20 + outpos] = ((in[14 + inpos] >>> 4) & 35184372088831L); + out[21 + outpos] = (in[14 + inpos] >>> 49) + | ((in[15 + inpos] & 1073741823L) << (45 - 30)); + out[22 + outpos] = (in[15 + inpos] >>> 30) + | ((in[16 + inpos] & 2047L) << (45 - 11)); + out[23 + outpos] = ((in[16 + inpos] >>> 11) & 35184372088831L); + out[24 + outpos] = (in[16 + inpos] >>> 56) + | ((in[17 + inpos] & 137438953471L) << (45 - 37)); + out[25 + outpos] = (in[17 + inpos] >>> 37) + | ((in[18 + inpos] & 262143L) << (45 - 18)); + out[26 + outpos] = ((in[18 + inpos] >>> 18) & 35184372088831L); + out[27 + outpos] = (in[18 + inpos] >>> 63) + | ((in[19 + inpos] & 17592186044415L) << (45 - 44)); + out[28 + outpos] = (in[19 + inpos] >>> 44) + | ((in[20 + inpos] & 33554431L) << (45 - 25)); + out[29 + outpos] = (in[20 + inpos] >>> 25) + | ((in[21 + inpos] & 63L) << (45 - 6)); + out[30 + outpos] = ((in[21 + inpos] >>> 6) & 35184372088831L); + out[31 + outpos] = (in[21 + inpos] >>> 51) + | ((in[22 + inpos] & 4294967295L) << (45 - 32)); + out[32 + outpos] = (in[22 + inpos] >>> 32) + | ((in[23 + inpos] & 8191L) << (45 - 13)); + out[33 + outpos] = ((in[23 + inpos] >>> 13) & 35184372088831L); + out[34 + outpos] = (in[23 + inpos] >>> 58) + | ((in[24 + inpos] & 549755813887L) << (45 - 39)); + out[35 + outpos] = (in[24 + inpos] >>> 39) + | ((in[25 + inpos] & 1048575L) << (45 - 20)); + out[36 + outpos] = (in[25 + inpos] >>> 20) + | ((in[26 + inpos] & 1L) << (45 - 1)); + out[37 + outpos] = ((in[26 + inpos] >>> 1) & 35184372088831L); + out[38 + outpos] = (in[26 + inpos] >>> 46) + | ((in[27 + inpos] & 134217727L) << (45 - 27)); + out[39 + outpos] = (in[27 + inpos] >>> 27) + | ((in[28 + inpos] & 255L) << (45 - 8)); + out[40 + outpos] = ((in[28 + inpos] >>> 8) & 35184372088831L); + out[41 + outpos] = (in[28 + inpos] >>> 53) + | ((in[29 + inpos] & 17179869183L) << (45 - 34)); + out[42 + outpos] = (in[29 + inpos] >>> 34) + | ((in[30 + inpos] & 32767L) << (45 - 15)); + out[43 + outpos] = ((in[30 + inpos] >>> 15) & 35184372088831L); + out[44 + outpos] = (in[30 + inpos] >>> 60) + | ((in[31 + inpos] & 2199023255551L) << (45 - 41)); + out[45 + outpos] = (in[31 + inpos] >>> 41) + | ((in[32 + inpos] & 4194303L) << (45 - 22)); + out[46 + outpos] = (in[32 + inpos] >>> 22) + | ((in[33 + inpos] & 7L) << (45 - 3)); + out[47 + outpos] = ((in[33 + inpos] >>> 3) & 35184372088831L); + out[48 + outpos] = (in[33 + inpos] >>> 48) + | ((in[34 + inpos] & 536870911L) << (45 - 29)); + out[49 + outpos] = (in[34 + inpos] >>> 29) + | ((in[35 + inpos] & 1023L) << (45 - 10)); + out[50 + outpos] = ((in[35 + inpos] >>> 10) & 35184372088831L); + out[51 + outpos] = (in[35 + inpos] >>> 55) + | ((in[36 + inpos] & 68719476735L) << (45 - 36)); + out[52 + outpos] = (in[36 + inpos] >>> 36) + | ((in[37 + inpos] & 131071L) << (45 - 17)); + out[53 + outpos] = ((in[37 + inpos] >>> 17) & 35184372088831L); + out[54 + outpos] = (in[37 + inpos] >>> 62) + | ((in[38 + inpos] & 8796093022207L) << (45 - 43)); + out[55 + outpos] = (in[38 + inpos] >>> 43) + | ((in[39 + inpos] & 16777215L) << (45 - 24)); + out[56 + outpos] = (in[39 + inpos] >>> 24) + | ((in[40 + inpos] & 31L) << (45 - 5)); + out[57 + outpos] = ((in[40 + inpos] >>> 5) & 35184372088831L); + out[58 + outpos] = (in[40 + inpos] >>> 50) + | ((in[41 + inpos] & 2147483647L) << (45 - 31)); + out[59 + outpos] = (in[41 + inpos] >>> 31) + | ((in[42 + inpos] & 4095L) << (45 - 12)); + out[60 + outpos] = ((in[42 + inpos] >>> 12) & 35184372088831L); + out[61 + outpos] = (in[42 + inpos] >>> 57) + | ((in[43 + inpos] & 274877906943L) << (45 - 38)); + out[62 + outpos] = (in[43 + inpos] >>> 38) + | ((in[44 + inpos] & 524287L) << (45 - 19)); + out[63 + outpos] = (in[44 + inpos] >>> 19); + } + + protected static void fastunpack46(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 70368744177663L); + out[1 + outpos] = (in[inpos] >>> 46) + | ((in[1 + inpos] & 268435455L) << (46 - 28)); + out[2 + outpos] = (in[1 + inpos] >>> 28) + | ((in[2 + inpos] & 1023L) << (46 - 10)); + out[3 + outpos] = ((in[2 + inpos] >>> 10) & 70368744177663L); + out[4 + outpos] = (in[2 + inpos] >>> 56) + | ((in[3 + inpos] & 274877906943L) << (46 - 38)); + out[5 + outpos] = (in[3 + inpos] >>> 38) + | ((in[4 + inpos] & 1048575L) << (46 - 20)); + out[6 + outpos] = (in[4 + inpos] >>> 20) + | ((in[5 + inpos] & 3L) << (46 - 2)); + out[7 + outpos] = ((in[5 + inpos] >>> 2) & 70368744177663L); + out[8 + outpos] = (in[5 + inpos] >>> 48) + | ((in[6 + inpos] & 1073741823L) << (46 - 30)); + out[9 + outpos] = (in[6 + inpos] >>> 30) + | ((in[7 + inpos] & 4095L) << (46 - 12)); + out[10 + outpos] = ((in[7 + inpos] >>> 12) & 70368744177663L); + out[11 + outpos] = (in[7 + inpos] >>> 58) + | ((in[8 + inpos] & 1099511627775L) << (46 - 40)); + out[12 + outpos] = (in[8 + inpos] >>> 40) + | ((in[9 + inpos] & 4194303L) << (46 - 22)); + out[13 + outpos] = (in[9 + inpos] >>> 22) + | ((in[10 + inpos] & 15L) << (46 - 4)); + out[14 + outpos] = ((in[10 + inpos] >>> 4) & 70368744177663L); + out[15 + outpos] = (in[10 + inpos] >>> 50) + | ((in[11 + inpos] & 4294967295L) << (46 - 32)); + out[16 + outpos] = (in[11 + inpos] >>> 32) + | ((in[12 + inpos] & 16383L) << (46 - 14)); + out[17 + outpos] = ((in[12 + inpos] >>> 14) & 70368744177663L); + out[18 + outpos] = (in[12 + inpos] >>> 60) + | ((in[13 + inpos] & 4398046511103L) << (46 - 42)); + out[19 + outpos] = (in[13 + inpos] >>> 42) + | ((in[14 + inpos] & 16777215L) << (46 - 24)); + out[20 + outpos] = (in[14 + inpos] >>> 24) + | ((in[15 + inpos] & 63L) << (46 - 6)); + out[21 + outpos] = ((in[15 + inpos] >>> 6) & 70368744177663L); + out[22 + outpos] = (in[15 + inpos] >>> 52) + | ((in[16 + inpos] & 17179869183L) << (46 - 34)); + out[23 + outpos] = (in[16 + inpos] >>> 34) + | ((in[17 + inpos] & 65535L) << (46 - 16)); + out[24 + outpos] = ((in[17 + inpos] >>> 16) & 70368744177663L); + out[25 + outpos] = (in[17 + inpos] >>> 62) + | ((in[18 + inpos] & 17592186044415L) << (46 - 44)); + out[26 + outpos] = (in[18 + inpos] >>> 44) + | ((in[19 + inpos] & 67108863L) << (46 - 26)); + out[27 + outpos] = (in[19 + inpos] >>> 26) + | ((in[20 + inpos] & 255L) << (46 - 8)); + out[28 + outpos] = ((in[20 + inpos] >>> 8) & 70368744177663L); + out[29 + outpos] = (in[20 + inpos] >>> 54) + | ((in[21 + inpos] & 68719476735L) << (46 - 36)); + out[30 + outpos] = (in[21 + inpos] >>> 36) + | ((in[22 + inpos] & 262143L) << (46 - 18)); + out[31 + outpos] = (in[22 + inpos] >>> 18); + out[32 + outpos] = (in[23 + inpos] & 70368744177663L); + out[33 + outpos] = (in[23 + inpos] >>> 46) + | ((in[24 + inpos] & 268435455L) << (46 - 28)); + out[34 + outpos] = (in[24 + inpos] >>> 28) + | ((in[25 + inpos] & 1023L) << (46 - 10)); + out[35 + outpos] = ((in[25 + inpos] >>> 10) & 70368744177663L); + out[36 + outpos] = (in[25 + inpos] >>> 56) + | ((in[26 + inpos] & 274877906943L) << (46 - 38)); + out[37 + outpos] = (in[26 + inpos] >>> 38) + | ((in[27 + inpos] & 1048575L) << (46 - 20)); + out[38 + outpos] = (in[27 + inpos] >>> 20) + | ((in[28 + inpos] & 3L) << (46 - 2)); + out[39 + outpos] = ((in[28 + inpos] >>> 2) & 70368744177663L); + out[40 + outpos] = (in[28 + inpos] >>> 48) + | ((in[29 + inpos] & 1073741823L) << (46 - 30)); + out[41 + outpos] = (in[29 + inpos] >>> 30) + | ((in[30 + inpos] & 4095L) << (46 - 12)); + out[42 + outpos] = ((in[30 + inpos] >>> 12) & 70368744177663L); + out[43 + outpos] = (in[30 + inpos] >>> 58) + | ((in[31 + inpos] & 1099511627775L) << (46 - 40)); + out[44 + outpos] = (in[31 + inpos] >>> 40) + | ((in[32 + inpos] & 4194303L) << (46 - 22)); + out[45 + outpos] = (in[32 + inpos] >>> 22) + | ((in[33 + inpos] & 15L) << (46 - 4)); + out[46 + outpos] = ((in[33 + inpos] >>> 4) & 70368744177663L); + out[47 + outpos] = (in[33 + inpos] >>> 50) + | ((in[34 + inpos] & 4294967295L) << (46 - 32)); + out[48 + outpos] = (in[34 + inpos] >>> 32) + | ((in[35 + inpos] & 16383L) << (46 - 14)); + out[49 + outpos] = ((in[35 + inpos] >>> 14) & 70368744177663L); + out[50 + outpos] = (in[35 + inpos] >>> 60) + | ((in[36 + inpos] & 4398046511103L) << (46 - 42)); + out[51 + outpos] = (in[36 + inpos] >>> 42) + | ((in[37 + inpos] & 16777215L) << (46 - 24)); + out[52 + outpos] = (in[37 + inpos] >>> 24) + | ((in[38 + inpos] & 63L) << (46 - 6)); + out[53 + outpos] = ((in[38 + inpos] >>> 6) & 70368744177663L); + out[54 + outpos] = (in[38 + inpos] >>> 52) + | ((in[39 + inpos] & 17179869183L) << (46 - 34)); + out[55 + outpos] = (in[39 + inpos] >>> 34) + | ((in[40 + inpos] & 65535L) << (46 - 16)); + out[56 + outpos] = ((in[40 + inpos] >>> 16) & 70368744177663L); + out[57 + outpos] = (in[40 + inpos] >>> 62) + | ((in[41 + inpos] & 17592186044415L) << (46 - 44)); + out[58 + outpos] = (in[41 + inpos] >>> 44) + | ((in[42 + inpos] & 67108863L) << (46 - 26)); + out[59 + outpos] = (in[42 + inpos] >>> 26) + | ((in[43 + inpos] & 255L) << (46 - 8)); + out[60 + outpos] = ((in[43 + inpos] >>> 8) & 70368744177663L); + out[61 + outpos] = (in[43 + inpos] >>> 54) + | ((in[44 + inpos] & 68719476735L) << (46 - 36)); + out[62 + outpos] = (in[44 + inpos] >>> 36) + | ((in[45 + inpos] & 262143L) << (46 - 18)); + out[63 + outpos] = (in[45 + inpos] >>> 18); + } + + protected static void fastunpack47(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 140737488355327L); + out[1 + outpos] = (in[inpos] >>> 47) + | ((in[1 + inpos] & 1073741823L) << (47 - 30)); + out[2 + outpos] = (in[1 + inpos] >>> 30) + | ((in[2 + inpos] & 8191L) << (47 - 13)); + out[3 + outpos] = ((in[2 + inpos] >>> 13) & 140737488355327L); + out[4 + outpos] = (in[2 + inpos] >>> 60) + | ((in[3 + inpos] & 8796093022207L) << (47 - 43)); + out[5 + outpos] = (in[3 + inpos] >>> 43) + | ((in[4 + inpos] & 67108863L) << (47 - 26)); + out[6 + outpos] = (in[4 + inpos] >>> 26) + | ((in[5 + inpos] & 511L) << (47 - 9)); + out[7 + outpos] = ((in[5 + inpos] >>> 9) & 140737488355327L); + out[8 + outpos] = (in[5 + inpos] >>> 56) + | ((in[6 + inpos] & 549755813887L) << (47 - 39)); + out[9 + outpos] = (in[6 + inpos] >>> 39) + | ((in[7 + inpos] & 4194303L) << (47 - 22)); + out[10 + outpos] = (in[7 + inpos] >>> 22) + | ((in[8 + inpos] & 31L) << (47 - 5)); + out[11 + outpos] = ((in[8 + inpos] >>> 5) & 140737488355327L); + out[12 + outpos] = (in[8 + inpos] >>> 52) + | ((in[9 + inpos] & 34359738367L) << (47 - 35)); + out[13 + outpos] = (in[9 + inpos] >>> 35) + | ((in[10 + inpos] & 262143L) << (47 - 18)); + out[14 + outpos] = (in[10 + inpos] >>> 18) + | ((in[11 + inpos] & 1L) << (47 - 1)); + out[15 + outpos] = ((in[11 + inpos] >>> 1) & 140737488355327L); + out[16 + outpos] = (in[11 + inpos] >>> 48) + | ((in[12 + inpos] & 2147483647L) << (47 - 31)); + out[17 + outpos] = (in[12 + inpos] >>> 31) + | ((in[13 + inpos] & 16383L) << (47 - 14)); + out[18 + outpos] = ((in[13 + inpos] >>> 14) & 140737488355327L); + out[19 + outpos] = (in[13 + inpos] >>> 61) + | ((in[14 + inpos] & 17592186044415L) << (47 - 44)); + out[20 + outpos] = (in[14 + inpos] >>> 44) + | ((in[15 + inpos] & 134217727L) << (47 - 27)); + out[21 + outpos] = (in[15 + inpos] >>> 27) + | ((in[16 + inpos] & 1023L) << (47 - 10)); + out[22 + outpos] = ((in[16 + inpos] >>> 10) & 140737488355327L); + out[23 + outpos] = (in[16 + inpos] >>> 57) + | ((in[17 + inpos] & 1099511627775L) << (47 - 40)); + out[24 + outpos] = (in[17 + inpos] >>> 40) + | ((in[18 + inpos] & 8388607L) << (47 - 23)); + out[25 + outpos] = (in[18 + inpos] >>> 23) + | ((in[19 + inpos] & 63L) << (47 - 6)); + out[26 + outpos] = ((in[19 + inpos] >>> 6) & 140737488355327L); + out[27 + outpos] = (in[19 + inpos] >>> 53) + | ((in[20 + inpos] & 68719476735L) << (47 - 36)); + out[28 + outpos] = (in[20 + inpos] >>> 36) + | ((in[21 + inpos] & 524287L) << (47 - 19)); + out[29 + outpos] = (in[21 + inpos] >>> 19) + | ((in[22 + inpos] & 3L) << (47 - 2)); + out[30 + outpos] = ((in[22 + inpos] >>> 2) & 140737488355327L); + out[31 + outpos] = (in[22 + inpos] >>> 49) + | ((in[23 + inpos] & 4294967295L) << (47 - 32)); + out[32 + outpos] = (in[23 + inpos] >>> 32) + | ((in[24 + inpos] & 32767L) << (47 - 15)); + out[33 + outpos] = ((in[24 + inpos] >>> 15) & 140737488355327L); + out[34 + outpos] = (in[24 + inpos] >>> 62) + | ((in[25 + inpos] & 35184372088831L) << (47 - 45)); + out[35 + outpos] = (in[25 + inpos] >>> 45) + | ((in[26 + inpos] & 268435455L) << (47 - 28)); + out[36 + outpos] = (in[26 + inpos] >>> 28) + | ((in[27 + inpos] & 2047L) << (47 - 11)); + out[37 + outpos] = ((in[27 + inpos] >>> 11) & 140737488355327L); + out[38 + outpos] = (in[27 + inpos] >>> 58) + | ((in[28 + inpos] & 2199023255551L) << (47 - 41)); + out[39 + outpos] = (in[28 + inpos] >>> 41) + | ((in[29 + inpos] & 16777215L) << (47 - 24)); + out[40 + outpos] = (in[29 + inpos] >>> 24) + | ((in[30 + inpos] & 127L) << (47 - 7)); + out[41 + outpos] = ((in[30 + inpos] >>> 7) & 140737488355327L); + out[42 + outpos] = (in[30 + inpos] >>> 54) + | ((in[31 + inpos] & 137438953471L) << (47 - 37)); + out[43 + outpos] = (in[31 + inpos] >>> 37) + | ((in[32 + inpos] & 1048575L) << (47 - 20)); + out[44 + outpos] = (in[32 + inpos] >>> 20) + | ((in[33 + inpos] & 7L) << (47 - 3)); + out[45 + outpos] = ((in[33 + inpos] >>> 3) & 140737488355327L); + out[46 + outpos] = (in[33 + inpos] >>> 50) + | ((in[34 + inpos] & 8589934591L) << (47 - 33)); + out[47 + outpos] = (in[34 + inpos] >>> 33) + | ((in[35 + inpos] & 65535L) << (47 - 16)); + out[48 + outpos] = ((in[35 + inpos] >>> 16) & 140737488355327L); + out[49 + outpos] = (in[35 + inpos] >>> 63) + | ((in[36 + inpos] & 70368744177663L) << (47 - 46)); + out[50 + outpos] = (in[36 + inpos] >>> 46) + | ((in[37 + inpos] & 536870911L) << (47 - 29)); + out[51 + outpos] = (in[37 + inpos] >>> 29) + | ((in[38 + inpos] & 4095L) << (47 - 12)); + out[52 + outpos] = ((in[38 + inpos] >>> 12) & 140737488355327L); + out[53 + outpos] = (in[38 + inpos] >>> 59) + | ((in[39 + inpos] & 4398046511103L) << (47 - 42)); + out[54 + outpos] = (in[39 + inpos] >>> 42) + | ((in[40 + inpos] & 33554431L) << (47 - 25)); + out[55 + outpos] = (in[40 + inpos] >>> 25) + | ((in[41 + inpos] & 255L) << (47 - 8)); + out[56 + outpos] = ((in[41 + inpos] >>> 8) & 140737488355327L); + out[57 + outpos] = (in[41 + inpos] >>> 55) + | ((in[42 + inpos] & 274877906943L) << (47 - 38)); + out[58 + outpos] = (in[42 + inpos] >>> 38) + | ((in[43 + inpos] & 2097151L) << (47 - 21)); + out[59 + outpos] = (in[43 + inpos] >>> 21) + | ((in[44 + inpos] & 15L) << (47 - 4)); + out[60 + outpos] = ((in[44 + inpos] >>> 4) & 140737488355327L); + out[61 + outpos] = (in[44 + inpos] >>> 51) + | ((in[45 + inpos] & 17179869183L) << (47 - 34)); + out[62 + outpos] = (in[45 + inpos] >>> 34) + | ((in[46 + inpos] & 131071L) << (47 - 17)); + out[63 + outpos] = (in[46 + inpos] >>> 17); + } + + protected static void fastunpack48(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 281474976710655L); + out[1 + outpos] = (in[inpos] >>> 48) + | ((in[1 + inpos] & 4294967295L) << (48 - 32)); + out[2 + outpos] = (in[1 + inpos] >>> 32) + | ((in[2 + inpos] & 65535L) << (48 - 16)); + out[3 + outpos] = (in[2 + inpos] >>> 16); + out[4 + outpos] = (in[3 + inpos] & 281474976710655L); + out[5 + outpos] = (in[3 + inpos] >>> 48) + | ((in[4 + inpos] & 4294967295L) << (48 - 32)); + out[6 + outpos] = (in[4 + inpos] >>> 32) + | ((in[5 + inpos] & 65535L) << (48 - 16)); + out[7 + outpos] = (in[5 + inpos] >>> 16); + out[8 + outpos] = (in[6 + inpos] & 281474976710655L); + out[9 + outpos] = (in[6 + inpos] >>> 48) + | ((in[7 + inpos] & 4294967295L) << (48 - 32)); + out[10 + outpos] = (in[7 + inpos] >>> 32) + | ((in[8 + inpos] & 65535L) << (48 - 16)); + out[11 + outpos] = (in[8 + inpos] >>> 16); + out[12 + outpos] = (in[9 + inpos] & 281474976710655L); + out[13 + outpos] = (in[9 + inpos] >>> 48) + | ((in[10 + inpos] & 4294967295L) << (48 - 32)); + out[14 + outpos] = (in[10 + inpos] >>> 32) + | ((in[11 + inpos] & 65535L) << (48 - 16)); + out[15 + outpos] = (in[11 + inpos] >>> 16); + out[16 + outpos] = (in[12 + inpos] & 281474976710655L); + out[17 + outpos] = (in[12 + inpos] >>> 48) + | ((in[13 + inpos] & 4294967295L) << (48 - 32)); + out[18 + outpos] = (in[13 + inpos] >>> 32) + | ((in[14 + inpos] & 65535L) << (48 - 16)); + out[19 + outpos] = (in[14 + inpos] >>> 16); + out[20 + outpos] = (in[15 + inpos] & 281474976710655L); + out[21 + outpos] = (in[15 + inpos] >>> 48) + | ((in[16 + inpos] & 4294967295L) << (48 - 32)); + out[22 + outpos] = (in[16 + inpos] >>> 32) + | ((in[17 + inpos] & 65535L) << (48 - 16)); + out[23 + outpos] = (in[17 + inpos] >>> 16); + out[24 + outpos] = (in[18 + inpos] & 281474976710655L); + out[25 + outpos] = (in[18 + inpos] >>> 48) + | ((in[19 + inpos] & 4294967295L) << (48 - 32)); + out[26 + outpos] = (in[19 + inpos] >>> 32) + | ((in[20 + inpos] & 65535L) << (48 - 16)); + out[27 + outpos] = (in[20 + inpos] >>> 16); + out[28 + outpos] = (in[21 + inpos] & 281474976710655L); + out[29 + outpos] = (in[21 + inpos] >>> 48) + | ((in[22 + inpos] & 4294967295L) << (48 - 32)); + out[30 + outpos] = (in[22 + inpos] >>> 32) + | ((in[23 + inpos] & 65535L) << (48 - 16)); + out[31 + outpos] = (in[23 + inpos] >>> 16); + out[32 + outpos] = (in[24 + inpos] & 281474976710655L); + out[33 + outpos] = (in[24 + inpos] >>> 48) + | ((in[25 + inpos] & 4294967295L) << (48 - 32)); + out[34 + outpos] = (in[25 + inpos] >>> 32) + | ((in[26 + inpos] & 65535L) << (48 - 16)); + out[35 + outpos] = (in[26 + inpos] >>> 16); + out[36 + outpos] = (in[27 + inpos] & 281474976710655L); + out[37 + outpos] = (in[27 + inpos] >>> 48) + | ((in[28 + inpos] & 4294967295L) << (48 - 32)); + out[38 + outpos] = (in[28 + inpos] >>> 32) + | ((in[29 + inpos] & 65535L) << (48 - 16)); + out[39 + outpos] = (in[29 + inpos] >>> 16); + out[40 + outpos] = (in[30 + inpos] & 281474976710655L); + out[41 + outpos] = (in[30 + inpos] >>> 48) + | ((in[31 + inpos] & 4294967295L) << (48 - 32)); + out[42 + outpos] = (in[31 + inpos] >>> 32) + | ((in[32 + inpos] & 65535L) << (48 - 16)); + out[43 + outpos] = (in[32 + inpos] >>> 16); + out[44 + outpos] = (in[33 + inpos] & 281474976710655L); + out[45 + outpos] = (in[33 + inpos] >>> 48) + | ((in[34 + inpos] & 4294967295L) << (48 - 32)); + out[46 + outpos] = (in[34 + inpos] >>> 32) + | ((in[35 + inpos] & 65535L) << (48 - 16)); + out[47 + outpos] = (in[35 + inpos] >>> 16); + out[48 + outpos] = (in[36 + inpos] & 281474976710655L); + out[49 + outpos] = (in[36 + inpos] >>> 48) + | ((in[37 + inpos] & 4294967295L) << (48 - 32)); + out[50 + outpos] = (in[37 + inpos] >>> 32) + | ((in[38 + inpos] & 65535L) << (48 - 16)); + out[51 + outpos] = (in[38 + inpos] >>> 16); + out[52 + outpos] = (in[39 + inpos] & 281474976710655L); + out[53 + outpos] = (in[39 + inpos] >>> 48) + | ((in[40 + inpos] & 4294967295L) << (48 - 32)); + out[54 + outpos] = (in[40 + inpos] >>> 32) + | ((in[41 + inpos] & 65535L) << (48 - 16)); + out[55 + outpos] = (in[41 + inpos] >>> 16); + out[56 + outpos] = (in[42 + inpos] & 281474976710655L); + out[57 + outpos] = (in[42 + inpos] >>> 48) + | ((in[43 + inpos] & 4294967295L) << (48 - 32)); + out[58 + outpos] = (in[43 + inpos] >>> 32) + | ((in[44 + inpos] & 65535L) << (48 - 16)); + out[59 + outpos] = (in[44 + inpos] >>> 16); + out[60 + outpos] = (in[45 + inpos] & 281474976710655L); + out[61 + outpos] = (in[45 + inpos] >>> 48) + | ((in[46 + inpos] & 4294967295L) << (48 - 32)); + out[62 + outpos] = (in[46 + inpos] >>> 32) + | ((in[47 + inpos] & 65535L) << (48 - 16)); + out[63 + outpos] = (in[47 + inpos] >>> 16); + } + + protected static void fastunpack49(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 562949953421311L); + out[1 + outpos] = (in[inpos] >>> 49) + | ((in[1 + inpos] & 17179869183L) << (49 - 34)); + out[2 + outpos] = (in[1 + inpos] >>> 34) + | ((in[2 + inpos] & 524287L) << (49 - 19)); + out[3 + outpos] = (in[2 + inpos] >>> 19) + | ((in[3 + inpos] & 15L) << (49 - 4)); + out[4 + outpos] = ((in[3 + inpos] >>> 4) & 562949953421311L); + out[5 + outpos] = (in[3 + inpos] >>> 53) + | ((in[4 + inpos] & 274877906943L) << (49 - 38)); + out[6 + outpos] = (in[4 + inpos] >>> 38) + | ((in[5 + inpos] & 8388607L) << (49 - 23)); + out[7 + outpos] = (in[5 + inpos] >>> 23) + | ((in[6 + inpos] & 255L) << (49 - 8)); + out[8 + outpos] = ((in[6 + inpos] >>> 8) & 562949953421311L); + out[9 + outpos] = (in[6 + inpos] >>> 57) + | ((in[7 + inpos] & 4398046511103L) << (49 - 42)); + out[10 + outpos] = (in[7 + inpos] >>> 42) + | ((in[8 + inpos] & 134217727L) << (49 - 27)); + out[11 + outpos] = (in[8 + inpos] >>> 27) + | ((in[9 + inpos] & 4095L) << (49 - 12)); + out[12 + outpos] = ((in[9 + inpos] >>> 12) & 562949953421311L); + out[13 + outpos] = (in[9 + inpos] >>> 61) + | ((in[10 + inpos] & 70368744177663L) << (49 - 46)); + out[14 + outpos] = (in[10 + inpos] >>> 46) + | ((in[11 + inpos] & 2147483647L) << (49 - 31)); + out[15 + outpos] = (in[11 + inpos] >>> 31) + | ((in[12 + inpos] & 65535L) << (49 - 16)); + out[16 + outpos] = (in[12 + inpos] >>> 16) + | ((in[13 + inpos] & 1L) << (49 - 1)); + out[17 + outpos] = ((in[13 + inpos] >>> 1) & 562949953421311L); + out[18 + outpos] = (in[13 + inpos] >>> 50) + | ((in[14 + inpos] & 34359738367L) << (49 - 35)); + out[19 + outpos] = (in[14 + inpos] >>> 35) + | ((in[15 + inpos] & 1048575L) << (49 - 20)); + out[20 + outpos] = (in[15 + inpos] >>> 20) + | ((in[16 + inpos] & 31L) << (49 - 5)); + out[21 + outpos] = ((in[16 + inpos] >>> 5) & 562949953421311L); + out[22 + outpos] = (in[16 + inpos] >>> 54) + | ((in[17 + inpos] & 549755813887L) << (49 - 39)); + out[23 + outpos] = (in[17 + inpos] >>> 39) + | ((in[18 + inpos] & 16777215L) << (49 - 24)); + out[24 + outpos] = (in[18 + inpos] >>> 24) + | ((in[19 + inpos] & 511L) << (49 - 9)); + out[25 + outpos] = ((in[19 + inpos] >>> 9) & 562949953421311L); + out[26 + outpos] = (in[19 + inpos] >>> 58) + | ((in[20 + inpos] & 8796093022207L) << (49 - 43)); + out[27 + outpos] = (in[20 + inpos] >>> 43) + | ((in[21 + inpos] & 268435455L) << (49 - 28)); + out[28 + outpos] = (in[21 + inpos] >>> 28) + | ((in[22 + inpos] & 8191L) << (49 - 13)); + out[29 + outpos] = ((in[22 + inpos] >>> 13) & 562949953421311L); + out[30 + outpos] = (in[22 + inpos] >>> 62) + | ((in[23 + inpos] & 140737488355327L) << (49 - 47)); + out[31 + outpos] = (in[23 + inpos] >>> 47) + | ((in[24 + inpos] & 4294967295L) << (49 - 32)); + out[32 + outpos] = (in[24 + inpos] >>> 32) + | ((in[25 + inpos] & 131071L) << (49 - 17)); + out[33 + outpos] = (in[25 + inpos] >>> 17) + | ((in[26 + inpos] & 3L) << (49 - 2)); + out[34 + outpos] = ((in[26 + inpos] >>> 2) & 562949953421311L); + out[35 + outpos] = (in[26 + inpos] >>> 51) + | ((in[27 + inpos] & 68719476735L) << (49 - 36)); + out[36 + outpos] = (in[27 + inpos] >>> 36) + | ((in[28 + inpos] & 2097151L) << (49 - 21)); + out[37 + outpos] = (in[28 + inpos] >>> 21) + | ((in[29 + inpos] & 63L) << (49 - 6)); + out[38 + outpos] = ((in[29 + inpos] >>> 6) & 562949953421311L); + out[39 + outpos] = (in[29 + inpos] >>> 55) + | ((in[30 + inpos] & 1099511627775L) << (49 - 40)); + out[40 + outpos] = (in[30 + inpos] >>> 40) + | ((in[31 + inpos] & 33554431L) << (49 - 25)); + out[41 + outpos] = (in[31 + inpos] >>> 25) + | ((in[32 + inpos] & 1023L) << (49 - 10)); + out[42 + outpos] = ((in[32 + inpos] >>> 10) & 562949953421311L); + out[43 + outpos] = (in[32 + inpos] >>> 59) + | ((in[33 + inpos] & 17592186044415L) << (49 - 44)); + out[44 + outpos] = (in[33 + inpos] >>> 44) + | ((in[34 + inpos] & 536870911L) << (49 - 29)); + out[45 + outpos] = (in[34 + inpos] >>> 29) + | ((in[35 + inpos] & 16383L) << (49 - 14)); + out[46 + outpos] = ((in[35 + inpos] >>> 14) & 562949953421311L); + out[47 + outpos] = (in[35 + inpos] >>> 63) + | ((in[36 + inpos] & 281474976710655L) << (49 - 48)); + out[48 + outpos] = (in[36 + inpos] >>> 48) + | ((in[37 + inpos] & 8589934591L) << (49 - 33)); + out[49 + outpos] = (in[37 + inpos] >>> 33) + | ((in[38 + inpos] & 262143L) << (49 - 18)); + out[50 + outpos] = (in[38 + inpos] >>> 18) + | ((in[39 + inpos] & 7L) << (49 - 3)); + out[51 + outpos] = ((in[39 + inpos] >>> 3) & 562949953421311L); + out[52 + outpos] = (in[39 + inpos] >>> 52) + | ((in[40 + inpos] & 137438953471L) << (49 - 37)); + out[53 + outpos] = (in[40 + inpos] >>> 37) + | ((in[41 + inpos] & 4194303L) << (49 - 22)); + out[54 + outpos] = (in[41 + inpos] >>> 22) + | ((in[42 + inpos] & 127L) << (49 - 7)); + out[55 + outpos] = ((in[42 + inpos] >>> 7) & 562949953421311L); + out[56 + outpos] = (in[42 + inpos] >>> 56) + | ((in[43 + inpos] & 2199023255551L) << (49 - 41)); + out[57 + outpos] = (in[43 + inpos] >>> 41) + | ((in[44 + inpos] & 67108863L) << (49 - 26)); + out[58 + outpos] = (in[44 + inpos] >>> 26) + | ((in[45 + inpos] & 2047L) << (49 - 11)); + out[59 + outpos] = ((in[45 + inpos] >>> 11) & 562949953421311L); + out[60 + outpos] = (in[45 + inpos] >>> 60) + | ((in[46 + inpos] & 35184372088831L) << (49 - 45)); + out[61 + outpos] = (in[46 + inpos] >>> 45) + | ((in[47 + inpos] & 1073741823L) << (49 - 30)); + out[62 + outpos] = (in[47 + inpos] >>> 30) + | ((in[48 + inpos] & 32767L) << (49 - 15)); + out[63 + outpos] = (in[48 + inpos] >>> 15); + } + + protected static void fastunpack50(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 1125899906842623L); + out[1 + outpos] = (in[inpos] >>> 50) + | ((in[1 + inpos] & 68719476735L) << (50 - 36)); + out[2 + outpos] = (in[1 + inpos] >>> 36) + | ((in[2 + inpos] & 4194303L) << (50 - 22)); + out[3 + outpos] = (in[2 + inpos] >>> 22) + | ((in[3 + inpos] & 255L) << (50 - 8)); + out[4 + outpos] = ((in[3 + inpos] >>> 8) & 1125899906842623L); + out[5 + outpos] = (in[3 + inpos] >>> 58) + | ((in[4 + inpos] & 17592186044415L) << (50 - 44)); + out[6 + outpos] = (in[4 + inpos] >>> 44) + | ((in[5 + inpos] & 1073741823L) << (50 - 30)); + out[7 + outpos] = (in[5 + inpos] >>> 30) + | ((in[6 + inpos] & 65535L) << (50 - 16)); + out[8 + outpos] = (in[6 + inpos] >>> 16) + | ((in[7 + inpos] & 3L) << (50 - 2)); + out[9 + outpos] = ((in[7 + inpos] >>> 2) & 1125899906842623L); + out[10 + outpos] = (in[7 + inpos] >>> 52) + | ((in[8 + inpos] & 274877906943L) << (50 - 38)); + out[11 + outpos] = (in[8 + inpos] >>> 38) + | ((in[9 + inpos] & 16777215L) << (50 - 24)); + out[12 + outpos] = (in[9 + inpos] >>> 24) + | ((in[10 + inpos] & 1023L) << (50 - 10)); + out[13 + outpos] = ((in[10 + inpos] >>> 10) & 1125899906842623L); + out[14 + outpos] = (in[10 + inpos] >>> 60) + | ((in[11 + inpos] & 70368744177663L) << (50 - 46)); + out[15 + outpos] = (in[11 + inpos] >>> 46) + | ((in[12 + inpos] & 4294967295L) << (50 - 32)); + out[16 + outpos] = (in[12 + inpos] >>> 32) + | ((in[13 + inpos] & 262143L) << (50 - 18)); + out[17 + outpos] = (in[13 + inpos] >>> 18) + | ((in[14 + inpos] & 15L) << (50 - 4)); + out[18 + outpos] = ((in[14 + inpos] >>> 4) & 1125899906842623L); + out[19 + outpos] = (in[14 + inpos] >>> 54) + | ((in[15 + inpos] & 1099511627775L) << (50 - 40)); + out[20 + outpos] = (in[15 + inpos] >>> 40) + | ((in[16 + inpos] & 67108863L) << (50 - 26)); + out[21 + outpos] = (in[16 + inpos] >>> 26) + | ((in[17 + inpos] & 4095L) << (50 - 12)); + out[22 + outpos] = ((in[17 + inpos] >>> 12) & 1125899906842623L); + out[23 + outpos] = (in[17 + inpos] >>> 62) + | ((in[18 + inpos] & 281474976710655L) << (50 - 48)); + out[24 + outpos] = (in[18 + inpos] >>> 48) + | ((in[19 + inpos] & 17179869183L) << (50 - 34)); + out[25 + outpos] = (in[19 + inpos] >>> 34) + | ((in[20 + inpos] & 1048575L) << (50 - 20)); + out[26 + outpos] = (in[20 + inpos] >>> 20) + | ((in[21 + inpos] & 63L) << (50 - 6)); + out[27 + outpos] = ((in[21 + inpos] >>> 6) & 1125899906842623L); + out[28 + outpos] = (in[21 + inpos] >>> 56) + | ((in[22 + inpos] & 4398046511103L) << (50 - 42)); + out[29 + outpos] = (in[22 + inpos] >>> 42) + | ((in[23 + inpos] & 268435455L) << (50 - 28)); + out[30 + outpos] = (in[23 + inpos] >>> 28) + | ((in[24 + inpos] & 16383L) << (50 - 14)); + out[31 + outpos] = (in[24 + inpos] >>> 14); + out[32 + outpos] = (in[25 + inpos] & 1125899906842623L); + out[33 + outpos] = (in[25 + inpos] >>> 50) + | ((in[26 + inpos] & 68719476735L) << (50 - 36)); + out[34 + outpos] = (in[26 + inpos] >>> 36) + | ((in[27 + inpos] & 4194303L) << (50 - 22)); + out[35 + outpos] = (in[27 + inpos] >>> 22) + | ((in[28 + inpos] & 255L) << (50 - 8)); + out[36 + outpos] = ((in[28 + inpos] >>> 8) & 1125899906842623L); + out[37 + outpos] = (in[28 + inpos] >>> 58) + | ((in[29 + inpos] & 17592186044415L) << (50 - 44)); + out[38 + outpos] = (in[29 + inpos] >>> 44) + | ((in[30 + inpos] & 1073741823L) << (50 - 30)); + out[39 + outpos] = (in[30 + inpos] >>> 30) + | ((in[31 + inpos] & 65535L) << (50 - 16)); + out[40 + outpos] = (in[31 + inpos] >>> 16) + | ((in[32 + inpos] & 3L) << (50 - 2)); + out[41 + outpos] = ((in[32 + inpos] >>> 2) & 1125899906842623L); + out[42 + outpos] = (in[32 + inpos] >>> 52) + | ((in[33 + inpos] & 274877906943L) << (50 - 38)); + out[43 + outpos] = (in[33 + inpos] >>> 38) + | ((in[34 + inpos] & 16777215L) << (50 - 24)); + out[44 + outpos] = (in[34 + inpos] >>> 24) + | ((in[35 + inpos] & 1023L) << (50 - 10)); + out[45 + outpos] = ((in[35 + inpos] >>> 10) & 1125899906842623L); + out[46 + outpos] = (in[35 + inpos] >>> 60) + | ((in[36 + inpos] & 70368744177663L) << (50 - 46)); + out[47 + outpos] = (in[36 + inpos] >>> 46) + | ((in[37 + inpos] & 4294967295L) << (50 - 32)); + out[48 + outpos] = (in[37 + inpos] >>> 32) + | ((in[38 + inpos] & 262143L) << (50 - 18)); + out[49 + outpos] = (in[38 + inpos] >>> 18) + | ((in[39 + inpos] & 15L) << (50 - 4)); + out[50 + outpos] = ((in[39 + inpos] >>> 4) & 1125899906842623L); + out[51 + outpos] = (in[39 + inpos] >>> 54) + | ((in[40 + inpos] & 1099511627775L) << (50 - 40)); + out[52 + outpos] = (in[40 + inpos] >>> 40) + | ((in[41 + inpos] & 67108863L) << (50 - 26)); + out[53 + outpos] = (in[41 + inpos] >>> 26) + | ((in[42 + inpos] & 4095L) << (50 - 12)); + out[54 + outpos] = ((in[42 + inpos] >>> 12) & 1125899906842623L); + out[55 + outpos] = (in[42 + inpos] >>> 62) + | ((in[43 + inpos] & 281474976710655L) << (50 - 48)); + out[56 + outpos] = (in[43 + inpos] >>> 48) + | ((in[44 + inpos] & 17179869183L) << (50 - 34)); + out[57 + outpos] = (in[44 + inpos] >>> 34) + | ((in[45 + inpos] & 1048575L) << (50 - 20)); + out[58 + outpos] = (in[45 + inpos] >>> 20) + | ((in[46 + inpos] & 63L) << (50 - 6)); + out[59 + outpos] = ((in[46 + inpos] >>> 6) & 1125899906842623L); + out[60 + outpos] = (in[46 + inpos] >>> 56) + | ((in[47 + inpos] & 4398046511103L) << (50 - 42)); + out[61 + outpos] = (in[47 + inpos] >>> 42) + | ((in[48 + inpos] & 268435455L) << (50 - 28)); + out[62 + outpos] = (in[48 + inpos] >>> 28) + | ((in[49 + inpos] & 16383L) << (50 - 14)); + out[63 + outpos] = (in[49 + inpos] >>> 14); + } + + protected static void fastunpack51(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 2251799813685247L); + out[1 + outpos] = (in[inpos] >>> 51) + | ((in[1 + inpos] & 274877906943L) << (51 - 38)); + out[2 + outpos] = (in[1 + inpos] >>> 38) + | ((in[2 + inpos] & 33554431L) << (51 - 25)); + out[3 + outpos] = (in[2 + inpos] >>> 25) + | ((in[3 + inpos] & 4095L) << (51 - 12)); + out[4 + outpos] = ((in[3 + inpos] >>> 12) & 2251799813685247L); + out[5 + outpos] = (in[3 + inpos] >>> 63) + | ((in[4 + inpos] & 1125899906842623L) << (51 - 50)); + out[6 + outpos] = (in[4 + inpos] >>> 50) + | ((in[5 + inpos] & 137438953471L) << (51 - 37)); + out[7 + outpos] = (in[5 + inpos] >>> 37) + | ((in[6 + inpos] & 16777215L) << (51 - 24)); + out[8 + outpos] = (in[6 + inpos] >>> 24) + | ((in[7 + inpos] & 2047L) << (51 - 11)); + out[9 + outpos] = ((in[7 + inpos] >>> 11) & 2251799813685247L); + out[10 + outpos] = (in[7 + inpos] >>> 62) + | ((in[8 + inpos] & 562949953421311L) << (51 - 49)); + out[11 + outpos] = (in[8 + inpos] >>> 49) + | ((in[9 + inpos] & 68719476735L) << (51 - 36)); + out[12 + outpos] = (in[9 + inpos] >>> 36) + | ((in[10 + inpos] & 8388607L) << (51 - 23)); + out[13 + outpos] = (in[10 + inpos] >>> 23) + | ((in[11 + inpos] & 1023L) << (51 - 10)); + out[14 + outpos] = ((in[11 + inpos] >>> 10) & 2251799813685247L); + out[15 + outpos] = (in[11 + inpos] >>> 61) + | ((in[12 + inpos] & 281474976710655L) << (51 - 48)); + out[16 + outpos] = (in[12 + inpos] >>> 48) + | ((in[13 + inpos] & 34359738367L) << (51 - 35)); + out[17 + outpos] = (in[13 + inpos] >>> 35) + | ((in[14 + inpos] & 4194303L) << (51 - 22)); + out[18 + outpos] = (in[14 + inpos] >>> 22) + | ((in[15 + inpos] & 511L) << (51 - 9)); + out[19 + outpos] = ((in[15 + inpos] >>> 9) & 2251799813685247L); + out[20 + outpos] = (in[15 + inpos] >>> 60) + | ((in[16 + inpos] & 140737488355327L) << (51 - 47)); + out[21 + outpos] = (in[16 + inpos] >>> 47) + | ((in[17 + inpos] & 17179869183L) << (51 - 34)); + out[22 + outpos] = (in[17 + inpos] >>> 34) + | ((in[18 + inpos] & 2097151L) << (51 - 21)); + out[23 + outpos] = (in[18 + inpos] >>> 21) + | ((in[19 + inpos] & 255L) << (51 - 8)); + out[24 + outpos] = ((in[19 + inpos] >>> 8) & 2251799813685247L); + out[25 + outpos] = (in[19 + inpos] >>> 59) + | ((in[20 + inpos] & 70368744177663L) << (51 - 46)); + out[26 + outpos] = (in[20 + inpos] >>> 46) + | ((in[21 + inpos] & 8589934591L) << (51 - 33)); + out[27 + outpos] = (in[21 + inpos] >>> 33) + | ((in[22 + inpos] & 1048575L) << (51 - 20)); + out[28 + outpos] = (in[22 + inpos] >>> 20) + | ((in[23 + inpos] & 127L) << (51 - 7)); + out[29 + outpos] = ((in[23 + inpos] >>> 7) & 2251799813685247L); + out[30 + outpos] = (in[23 + inpos] >>> 58) + | ((in[24 + inpos] & 35184372088831L) << (51 - 45)); + out[31 + outpos] = (in[24 + inpos] >>> 45) + | ((in[25 + inpos] & 4294967295L) << (51 - 32)); + out[32 + outpos] = (in[25 + inpos] >>> 32) + | ((in[26 + inpos] & 524287L) << (51 - 19)); + out[33 + outpos] = (in[26 + inpos] >>> 19) + | ((in[27 + inpos] & 63L) << (51 - 6)); + out[34 + outpos] = ((in[27 + inpos] >>> 6) & 2251799813685247L); + out[35 + outpos] = (in[27 + inpos] >>> 57) + | ((in[28 + inpos] & 17592186044415L) << (51 - 44)); + out[36 + outpos] = (in[28 + inpos] >>> 44) + | ((in[29 + inpos] & 2147483647L) << (51 - 31)); + out[37 + outpos] = (in[29 + inpos] >>> 31) + | ((in[30 + inpos] & 262143L) << (51 - 18)); + out[38 + outpos] = (in[30 + inpos] >>> 18) + | ((in[31 + inpos] & 31L) << (51 - 5)); + out[39 + outpos] = ((in[31 + inpos] >>> 5) & 2251799813685247L); + out[40 + outpos] = (in[31 + inpos] >>> 56) + | ((in[32 + inpos] & 8796093022207L) << (51 - 43)); + out[41 + outpos] = (in[32 + inpos] >>> 43) + | ((in[33 + inpos] & 1073741823L) << (51 - 30)); + out[42 + outpos] = (in[33 + inpos] >>> 30) + | ((in[34 + inpos] & 131071L) << (51 - 17)); + out[43 + outpos] = (in[34 + inpos] >>> 17) + | ((in[35 + inpos] & 15L) << (51 - 4)); + out[44 + outpos] = ((in[35 + inpos] >>> 4) & 2251799813685247L); + out[45 + outpos] = (in[35 + inpos] >>> 55) + | ((in[36 + inpos] & 4398046511103L) << (51 - 42)); + out[46 + outpos] = (in[36 + inpos] >>> 42) + | ((in[37 + inpos] & 536870911L) << (51 - 29)); + out[47 + outpos] = (in[37 + inpos] >>> 29) + | ((in[38 + inpos] & 65535L) << (51 - 16)); + out[48 + outpos] = (in[38 + inpos] >>> 16) + | ((in[39 + inpos] & 7L) << (51 - 3)); + out[49 + outpos] = ((in[39 + inpos] >>> 3) & 2251799813685247L); + out[50 + outpos] = (in[39 + inpos] >>> 54) + | ((in[40 + inpos] & 2199023255551L) << (51 - 41)); + out[51 + outpos] = (in[40 + inpos] >>> 41) + | ((in[41 + inpos] & 268435455L) << (51 - 28)); + out[52 + outpos] = (in[41 + inpos] >>> 28) + | ((in[42 + inpos] & 32767L) << (51 - 15)); + out[53 + outpos] = (in[42 + inpos] >>> 15) + | ((in[43 + inpos] & 3L) << (51 - 2)); + out[54 + outpos] = ((in[43 + inpos] >>> 2) & 2251799813685247L); + out[55 + outpos] = (in[43 + inpos] >>> 53) + | ((in[44 + inpos] & 1099511627775L) << (51 - 40)); + out[56 + outpos] = (in[44 + inpos] >>> 40) + | ((in[45 + inpos] & 134217727L) << (51 - 27)); + out[57 + outpos] = (in[45 + inpos] >>> 27) + | ((in[46 + inpos] & 16383L) << (51 - 14)); + out[58 + outpos] = (in[46 + inpos] >>> 14) + | ((in[47 + inpos] & 1L) << (51 - 1)); + out[59 + outpos] = ((in[47 + inpos] >>> 1) & 2251799813685247L); + out[60 + outpos] = (in[47 + inpos] >>> 52) + | ((in[48 + inpos] & 549755813887L) << (51 - 39)); + out[61 + outpos] = (in[48 + inpos] >>> 39) + | ((in[49 + inpos] & 67108863L) << (51 - 26)); + out[62 + outpos] = (in[49 + inpos] >>> 26) + | ((in[50 + inpos] & 8191L) << (51 - 13)); + out[63 + outpos] = (in[50 + inpos] >>> 13); + } + + protected static void fastunpack52(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 4503599627370495L); + out[1 + outpos] = (in[inpos] >>> 52) + | ((in[1 + inpos] & 1099511627775L) << (52 - 40)); + out[2 + outpos] = (in[1 + inpos] >>> 40) + | ((in[2 + inpos] & 268435455L) << (52 - 28)); + out[3 + outpos] = (in[2 + inpos] >>> 28) + | ((in[3 + inpos] & 65535L) << (52 - 16)); + out[4 + outpos] = (in[3 + inpos] >>> 16) + | ((in[4 + inpos] & 15L) << (52 - 4)); + out[5 + outpos] = ((in[4 + inpos] >>> 4) & 4503599627370495L); + out[6 + outpos] = (in[4 + inpos] >>> 56) + | ((in[5 + inpos] & 17592186044415L) << (52 - 44)); + out[7 + outpos] = (in[5 + inpos] >>> 44) + | ((in[6 + inpos] & 4294967295L) << (52 - 32)); + out[8 + outpos] = (in[6 + inpos] >>> 32) + | ((in[7 + inpos] & 1048575L) << (52 - 20)); + out[9 + outpos] = (in[7 + inpos] >>> 20) + | ((in[8 + inpos] & 255L) << (52 - 8)); + out[10 + outpos] = ((in[8 + inpos] >>> 8) & 4503599627370495L); + out[11 + outpos] = (in[8 + inpos] >>> 60) + | ((in[9 + inpos] & 281474976710655L) << (52 - 48)); + out[12 + outpos] = (in[9 + inpos] >>> 48) + | ((in[10 + inpos] & 68719476735L) << (52 - 36)); + out[13 + outpos] = (in[10 + inpos] >>> 36) + | ((in[11 + inpos] & 16777215L) << (52 - 24)); + out[14 + outpos] = (in[11 + inpos] >>> 24) + | ((in[12 + inpos] & 4095L) << (52 - 12)); + out[15 + outpos] = (in[12 + inpos] >>> 12); + out[16 + outpos] = (in[13 + inpos] & 4503599627370495L); + out[17 + outpos] = (in[13 + inpos] >>> 52) + | ((in[14 + inpos] & 1099511627775L) << (52 - 40)); + out[18 + outpos] = (in[14 + inpos] >>> 40) + | ((in[15 + inpos] & 268435455L) << (52 - 28)); + out[19 + outpos] = (in[15 + inpos] >>> 28) + | ((in[16 + inpos] & 65535L) << (52 - 16)); + out[20 + outpos] = (in[16 + inpos] >>> 16) + | ((in[17 + inpos] & 15L) << (52 - 4)); + out[21 + outpos] = ((in[17 + inpos] >>> 4) & 4503599627370495L); + out[22 + outpos] = (in[17 + inpos] >>> 56) + | ((in[18 + inpos] & 17592186044415L) << (52 - 44)); + out[23 + outpos] = (in[18 + inpos] >>> 44) + | ((in[19 + inpos] & 4294967295L) << (52 - 32)); + out[24 + outpos] = (in[19 + inpos] >>> 32) + | ((in[20 + inpos] & 1048575L) << (52 - 20)); + out[25 + outpos] = (in[20 + inpos] >>> 20) + | ((in[21 + inpos] & 255L) << (52 - 8)); + out[26 + outpos] = ((in[21 + inpos] >>> 8) & 4503599627370495L); + out[27 + outpos] = (in[21 + inpos] >>> 60) + | ((in[22 + inpos] & 281474976710655L) << (52 - 48)); + out[28 + outpos] = (in[22 + inpos] >>> 48) + | ((in[23 + inpos] & 68719476735L) << (52 - 36)); + out[29 + outpos] = (in[23 + inpos] >>> 36) + | ((in[24 + inpos] & 16777215L) << (52 - 24)); + out[30 + outpos] = (in[24 + inpos] >>> 24) + | ((in[25 + inpos] & 4095L) << (52 - 12)); + out[31 + outpos] = (in[25 + inpos] >>> 12); + out[32 + outpos] = (in[26 + inpos] & 4503599627370495L); + out[33 + outpos] = (in[26 + inpos] >>> 52) + | ((in[27 + inpos] & 1099511627775L) << (52 - 40)); + out[34 + outpos] = (in[27 + inpos] >>> 40) + | ((in[28 + inpos] & 268435455L) << (52 - 28)); + out[35 + outpos] = (in[28 + inpos] >>> 28) + | ((in[29 + inpos] & 65535L) << (52 - 16)); + out[36 + outpos] = (in[29 + inpos] >>> 16) + | ((in[30 + inpos] & 15L) << (52 - 4)); + out[37 + outpos] = ((in[30 + inpos] >>> 4) & 4503599627370495L); + out[38 + outpos] = (in[30 + inpos] >>> 56) + | ((in[31 + inpos] & 17592186044415L) << (52 - 44)); + out[39 + outpos] = (in[31 + inpos] >>> 44) + | ((in[32 + inpos] & 4294967295L) << (52 - 32)); + out[40 + outpos] = (in[32 + inpos] >>> 32) + | ((in[33 + inpos] & 1048575L) << (52 - 20)); + out[41 + outpos] = (in[33 + inpos] >>> 20) + | ((in[34 + inpos] & 255L) << (52 - 8)); + out[42 + outpos] = ((in[34 + inpos] >>> 8) & 4503599627370495L); + out[43 + outpos] = (in[34 + inpos] >>> 60) + | ((in[35 + inpos] & 281474976710655L) << (52 - 48)); + out[44 + outpos] = (in[35 + inpos] >>> 48) + | ((in[36 + inpos] & 68719476735L) << (52 - 36)); + out[45 + outpos] = (in[36 + inpos] >>> 36) + | ((in[37 + inpos] & 16777215L) << (52 - 24)); + out[46 + outpos] = (in[37 + inpos] >>> 24) + | ((in[38 + inpos] & 4095L) << (52 - 12)); + out[47 + outpos] = (in[38 + inpos] >>> 12); + out[48 + outpos] = (in[39 + inpos] & 4503599627370495L); + out[49 + outpos] = (in[39 + inpos] >>> 52) + | ((in[40 + inpos] & 1099511627775L) << (52 - 40)); + out[50 + outpos] = (in[40 + inpos] >>> 40) + | ((in[41 + inpos] & 268435455L) << (52 - 28)); + out[51 + outpos] = (in[41 + inpos] >>> 28) + | ((in[42 + inpos] & 65535L) << (52 - 16)); + out[52 + outpos] = (in[42 + inpos] >>> 16) + | ((in[43 + inpos] & 15L) << (52 - 4)); + out[53 + outpos] = ((in[43 + inpos] >>> 4) & 4503599627370495L); + out[54 + outpos] = (in[43 + inpos] >>> 56) + | ((in[44 + inpos] & 17592186044415L) << (52 - 44)); + out[55 + outpos] = (in[44 + inpos] >>> 44) + | ((in[45 + inpos] & 4294967295L) << (52 - 32)); + out[56 + outpos] = (in[45 + inpos] >>> 32) + | ((in[46 + inpos] & 1048575L) << (52 - 20)); + out[57 + outpos] = (in[46 + inpos] >>> 20) + | ((in[47 + inpos] & 255L) << (52 - 8)); + out[58 + outpos] = ((in[47 + inpos] >>> 8) & 4503599627370495L); + out[59 + outpos] = (in[47 + inpos] >>> 60) + | ((in[48 + inpos] & 281474976710655L) << (52 - 48)); + out[60 + outpos] = (in[48 + inpos] >>> 48) + | ((in[49 + inpos] & 68719476735L) << (52 - 36)); + out[61 + outpos] = (in[49 + inpos] >>> 36) + | ((in[50 + inpos] & 16777215L) << (52 - 24)); + out[62 + outpos] = (in[50 + inpos] >>> 24) + | ((in[51 + inpos] & 4095L) << (52 - 12)); + out[63 + outpos] = (in[51 + inpos] >>> 12); + } + + protected static void fastunpack53(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 9007199254740991L); + out[1 + outpos] = (in[inpos] >>> 53) + | ((in[1 + inpos] & 4398046511103L) << (53 - 42)); + out[2 + outpos] = (in[1 + inpos] >>> 42) + | ((in[2 + inpos] & 2147483647L) << (53 - 31)); + out[3 + outpos] = (in[2 + inpos] >>> 31) + | ((in[3 + inpos] & 1048575L) << (53 - 20)); + out[4 + outpos] = (in[3 + inpos] >>> 20) + | ((in[4 + inpos] & 511L) << (53 - 9)); + out[5 + outpos] = ((in[4 + inpos] >>> 9) & 9007199254740991L); + out[6 + outpos] = (in[4 + inpos] >>> 62) + | ((in[5 + inpos] & 2251799813685247L) << (53 - 51)); + out[7 + outpos] = (in[5 + inpos] >>> 51) + | ((in[6 + inpos] & 1099511627775L) << (53 - 40)); + out[8 + outpos] = (in[6 + inpos] >>> 40) + | ((in[7 + inpos] & 536870911L) << (53 - 29)); + out[9 + outpos] = (in[7 + inpos] >>> 29) + | ((in[8 + inpos] & 262143L) << (53 - 18)); + out[10 + outpos] = (in[8 + inpos] >>> 18) + | ((in[9 + inpos] & 127L) << (53 - 7)); + out[11 + outpos] = ((in[9 + inpos] >>> 7) & 9007199254740991L); + out[12 + outpos] = (in[9 + inpos] >>> 60) + | ((in[10 + inpos] & 562949953421311L) << (53 - 49)); + out[13 + outpos] = (in[10 + inpos] >>> 49) + | ((in[11 + inpos] & 274877906943L) << (53 - 38)); + out[14 + outpos] = (in[11 + inpos] >>> 38) + | ((in[12 + inpos] & 134217727L) << (53 - 27)); + out[15 + outpos] = (in[12 + inpos] >>> 27) + | ((in[13 + inpos] & 65535L) << (53 - 16)); + out[16 + outpos] = (in[13 + inpos] >>> 16) + | ((in[14 + inpos] & 31L) << (53 - 5)); + out[17 + outpos] = ((in[14 + inpos] >>> 5) & 9007199254740991L); + out[18 + outpos] = (in[14 + inpos] >>> 58) + | ((in[15 + inpos] & 140737488355327L) << (53 - 47)); + out[19 + outpos] = (in[15 + inpos] >>> 47) + | ((in[16 + inpos] & 68719476735L) << (53 - 36)); + out[20 + outpos] = (in[16 + inpos] >>> 36) + | ((in[17 + inpos] & 33554431L) << (53 - 25)); + out[21 + outpos] = (in[17 + inpos] >>> 25) + | ((in[18 + inpos] & 16383L) << (53 - 14)); + out[22 + outpos] = (in[18 + inpos] >>> 14) + | ((in[19 + inpos] & 7L) << (53 - 3)); + out[23 + outpos] = ((in[19 + inpos] >>> 3) & 9007199254740991L); + out[24 + outpos] = (in[19 + inpos] >>> 56) + | ((in[20 + inpos] & 35184372088831L) << (53 - 45)); + out[25 + outpos] = (in[20 + inpos] >>> 45) + | ((in[21 + inpos] & 17179869183L) << (53 - 34)); + out[26 + outpos] = (in[21 + inpos] >>> 34) + | ((in[22 + inpos] & 8388607L) << (53 - 23)); + out[27 + outpos] = (in[22 + inpos] >>> 23) + | ((in[23 + inpos] & 4095L) << (53 - 12)); + out[28 + outpos] = (in[23 + inpos] >>> 12) + | ((in[24 + inpos] & 1L) << (53 - 1)); + out[29 + outpos] = ((in[24 + inpos] >>> 1) & 9007199254740991L); + out[30 + outpos] = (in[24 + inpos] >>> 54) + | ((in[25 + inpos] & 8796093022207L) << (53 - 43)); + out[31 + outpos] = (in[25 + inpos] >>> 43) + | ((in[26 + inpos] & 4294967295L) << (53 - 32)); + out[32 + outpos] = (in[26 + inpos] >>> 32) + | ((in[27 + inpos] & 2097151L) << (53 - 21)); + out[33 + outpos] = (in[27 + inpos] >>> 21) + | ((in[28 + inpos] & 1023L) << (53 - 10)); + out[34 + outpos] = ((in[28 + inpos] >>> 10) & 9007199254740991L); + out[35 + outpos] = (in[28 + inpos] >>> 63) + | ((in[29 + inpos] & 4503599627370495L) << (53 - 52)); + out[36 + outpos] = (in[29 + inpos] >>> 52) + | ((in[30 + inpos] & 2199023255551L) << (53 - 41)); + out[37 + outpos] = (in[30 + inpos] >>> 41) + | ((in[31 + inpos] & 1073741823L) << (53 - 30)); + out[38 + outpos] = (in[31 + inpos] >>> 30) + | ((in[32 + inpos] & 524287L) << (53 - 19)); + out[39 + outpos] = (in[32 + inpos] >>> 19) + | ((in[33 + inpos] & 255L) << (53 - 8)); + out[40 + outpos] = ((in[33 + inpos] >>> 8) & 9007199254740991L); + out[41 + outpos] = (in[33 + inpos] >>> 61) + | ((in[34 + inpos] & 1125899906842623L) << (53 - 50)); + out[42 + outpos] = (in[34 + inpos] >>> 50) + | ((in[35 + inpos] & 549755813887L) << (53 - 39)); + out[43 + outpos] = (in[35 + inpos] >>> 39) + | ((in[36 + inpos] & 268435455L) << (53 - 28)); + out[44 + outpos] = (in[36 + inpos] >>> 28) + | ((in[37 + inpos] & 131071L) << (53 - 17)); + out[45 + outpos] = (in[37 + inpos] >>> 17) + | ((in[38 + inpos] & 63L) << (53 - 6)); + out[46 + outpos] = ((in[38 + inpos] >>> 6) & 9007199254740991L); + out[47 + outpos] = (in[38 + inpos] >>> 59) + | ((in[39 + inpos] & 281474976710655L) << (53 - 48)); + out[48 + outpos] = (in[39 + inpos] >>> 48) + | ((in[40 + inpos] & 137438953471L) << (53 - 37)); + out[49 + outpos] = (in[40 + inpos] >>> 37) + | ((in[41 + inpos] & 67108863L) << (53 - 26)); + out[50 + outpos] = (in[41 + inpos] >>> 26) + | ((in[42 + inpos] & 32767L) << (53 - 15)); + out[51 + outpos] = (in[42 + inpos] >>> 15) + | ((in[43 + inpos] & 15L) << (53 - 4)); + out[52 + outpos] = ((in[43 + inpos] >>> 4) & 9007199254740991L); + out[53 + outpos] = (in[43 + inpos] >>> 57) + | ((in[44 + inpos] & 70368744177663L) << (53 - 46)); + out[54 + outpos] = (in[44 + inpos] >>> 46) + | ((in[45 + inpos] & 34359738367L) << (53 - 35)); + out[55 + outpos] = (in[45 + inpos] >>> 35) + | ((in[46 + inpos] & 16777215L) << (53 - 24)); + out[56 + outpos] = (in[46 + inpos] >>> 24) + | ((in[47 + inpos] & 8191L) << (53 - 13)); + out[57 + outpos] = (in[47 + inpos] >>> 13) + | ((in[48 + inpos] & 3L) << (53 - 2)); + out[58 + outpos] = ((in[48 + inpos] >>> 2) & 9007199254740991L); + out[59 + outpos] = (in[48 + inpos] >>> 55) + | ((in[49 + inpos] & 17592186044415L) << (53 - 44)); + out[60 + outpos] = (in[49 + inpos] >>> 44) + | ((in[50 + inpos] & 8589934591L) << (53 - 33)); + out[61 + outpos] = (in[50 + inpos] >>> 33) + | ((in[51 + inpos] & 4194303L) << (53 - 22)); + out[62 + outpos] = (in[51 + inpos] >>> 22) + | ((in[52 + inpos] & 2047L) << (53 - 11)); + out[63 + outpos] = (in[52 + inpos] >>> 11); + } + + protected static void fastunpack54(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 18014398509481983L); + out[1 + outpos] = (in[inpos] >>> 54) + | ((in[1 + inpos] & 17592186044415L) << (54 - 44)); + out[2 + outpos] = (in[1 + inpos] >>> 44) + | ((in[2 + inpos] & 17179869183L) << (54 - 34)); + out[3 + outpos] = (in[2 + inpos] >>> 34) + | ((in[3 + inpos] & 16777215L) << (54 - 24)); + out[4 + outpos] = (in[3 + inpos] >>> 24) + | ((in[4 + inpos] & 16383L) << (54 - 14)); + out[5 + outpos] = (in[4 + inpos] >>> 14) + | ((in[5 + inpos] & 15L) << (54 - 4)); + out[6 + outpos] = ((in[5 + inpos] >>> 4) & 18014398509481983L); + out[7 + outpos] = (in[5 + inpos] >>> 58) + | ((in[6 + inpos] & 281474976710655L) << (54 - 48)); + out[8 + outpos] = (in[6 + inpos] >>> 48) + | ((in[7 + inpos] & 274877906943L) << (54 - 38)); + out[9 + outpos] = (in[7 + inpos] >>> 38) + | ((in[8 + inpos] & 268435455L) << (54 - 28)); + out[10 + outpos] = (in[8 + inpos] >>> 28) + | ((in[9 + inpos] & 262143L) << (54 - 18)); + out[11 + outpos] = (in[9 + inpos] >>> 18) + | ((in[10 + inpos] & 255L) << (54 - 8)); + out[12 + outpos] = ((in[10 + inpos] >>> 8) & 18014398509481983L); + out[13 + outpos] = (in[10 + inpos] >>> 62) + | ((in[11 + inpos] & 4503599627370495L) << (54 - 52)); + out[14 + outpos] = (in[11 + inpos] >>> 52) + | ((in[12 + inpos] & 4398046511103L) << (54 - 42)); + out[15 + outpos] = (in[12 + inpos] >>> 42) + | ((in[13 + inpos] & 4294967295L) << (54 - 32)); + out[16 + outpos] = (in[13 + inpos] >>> 32) + | ((in[14 + inpos] & 4194303L) << (54 - 22)); + out[17 + outpos] = (in[14 + inpos] >>> 22) + | ((in[15 + inpos] & 4095L) << (54 - 12)); + out[18 + outpos] = (in[15 + inpos] >>> 12) + | ((in[16 + inpos] & 3L) << (54 - 2)); + out[19 + outpos] = ((in[16 + inpos] >>> 2) & 18014398509481983L); + out[20 + outpos] = (in[16 + inpos] >>> 56) + | ((in[17 + inpos] & 70368744177663L) << (54 - 46)); + out[21 + outpos] = (in[17 + inpos] >>> 46) + | ((in[18 + inpos] & 68719476735L) << (54 - 36)); + out[22 + outpos] = (in[18 + inpos] >>> 36) + | ((in[19 + inpos] & 67108863L) << (54 - 26)); + out[23 + outpos] = (in[19 + inpos] >>> 26) + | ((in[20 + inpos] & 65535L) << (54 - 16)); + out[24 + outpos] = (in[20 + inpos] >>> 16) + | ((in[21 + inpos] & 63L) << (54 - 6)); + out[25 + outpos] = ((in[21 + inpos] >>> 6) & 18014398509481983L); + out[26 + outpos] = (in[21 + inpos] >>> 60) + | ((in[22 + inpos] & 1125899906842623L) << (54 - 50)); + out[27 + outpos] = (in[22 + inpos] >>> 50) + | ((in[23 + inpos] & 1099511627775L) << (54 - 40)); + out[28 + outpos] = (in[23 + inpos] >>> 40) + | ((in[24 + inpos] & 1073741823L) << (54 - 30)); + out[29 + outpos] = (in[24 + inpos] >>> 30) + | ((in[25 + inpos] & 1048575L) << (54 - 20)); + out[30 + outpos] = (in[25 + inpos] >>> 20) + | ((in[26 + inpos] & 1023L) << (54 - 10)); + out[31 + outpos] = (in[26 + inpos] >>> 10); + out[32 + outpos] = (in[27 + inpos] & 18014398509481983L); + out[33 + outpos] = (in[27 + inpos] >>> 54) + | ((in[28 + inpos] & 17592186044415L) << (54 - 44)); + out[34 + outpos] = (in[28 + inpos] >>> 44) + | ((in[29 + inpos] & 17179869183L) << (54 - 34)); + out[35 + outpos] = (in[29 + inpos] >>> 34) + | ((in[30 + inpos] & 16777215L) << (54 - 24)); + out[36 + outpos] = (in[30 + inpos] >>> 24) + | ((in[31 + inpos] & 16383L) << (54 - 14)); + out[37 + outpos] = (in[31 + inpos] >>> 14) + | ((in[32 + inpos] & 15L) << (54 - 4)); + out[38 + outpos] = ((in[32 + inpos] >>> 4) & 18014398509481983L); + out[39 + outpos] = (in[32 + inpos] >>> 58) + | ((in[33 + inpos] & 281474976710655L) << (54 - 48)); + out[40 + outpos] = (in[33 + inpos] >>> 48) + | ((in[34 + inpos] & 274877906943L) << (54 - 38)); + out[41 + outpos] = (in[34 + inpos] >>> 38) + | ((in[35 + inpos] & 268435455L) << (54 - 28)); + out[42 + outpos] = (in[35 + inpos] >>> 28) + | ((in[36 + inpos] & 262143L) << (54 - 18)); + out[43 + outpos] = (in[36 + inpos] >>> 18) + | ((in[37 + inpos] & 255L) << (54 - 8)); + out[44 + outpos] = ((in[37 + inpos] >>> 8) & 18014398509481983L); + out[45 + outpos] = (in[37 + inpos] >>> 62) + | ((in[38 + inpos] & 4503599627370495L) << (54 - 52)); + out[46 + outpos] = (in[38 + inpos] >>> 52) + | ((in[39 + inpos] & 4398046511103L) << (54 - 42)); + out[47 + outpos] = (in[39 + inpos] >>> 42) + | ((in[40 + inpos] & 4294967295L) << (54 - 32)); + out[48 + outpos] = (in[40 + inpos] >>> 32) + | ((in[41 + inpos] & 4194303L) << (54 - 22)); + out[49 + outpos] = (in[41 + inpos] >>> 22) + | ((in[42 + inpos] & 4095L) << (54 - 12)); + out[50 + outpos] = (in[42 + inpos] >>> 12) + | ((in[43 + inpos] & 3L) << (54 - 2)); + out[51 + outpos] = ((in[43 + inpos] >>> 2) & 18014398509481983L); + out[52 + outpos] = (in[43 + inpos] >>> 56) + | ((in[44 + inpos] & 70368744177663L) << (54 - 46)); + out[53 + outpos] = (in[44 + inpos] >>> 46) + | ((in[45 + inpos] & 68719476735L) << (54 - 36)); + out[54 + outpos] = (in[45 + inpos] >>> 36) + | ((in[46 + inpos] & 67108863L) << (54 - 26)); + out[55 + outpos] = (in[46 + inpos] >>> 26) + | ((in[47 + inpos] & 65535L) << (54 - 16)); + out[56 + outpos] = (in[47 + inpos] >>> 16) + | ((in[48 + inpos] & 63L) << (54 - 6)); + out[57 + outpos] = ((in[48 + inpos] >>> 6) & 18014398509481983L); + out[58 + outpos] = (in[48 + inpos] >>> 60) + | ((in[49 + inpos] & 1125899906842623L) << (54 - 50)); + out[59 + outpos] = (in[49 + inpos] >>> 50) + | ((in[50 + inpos] & 1099511627775L) << (54 - 40)); + out[60 + outpos] = (in[50 + inpos] >>> 40) + | ((in[51 + inpos] & 1073741823L) << (54 - 30)); + out[61 + outpos] = (in[51 + inpos] >>> 30) + | ((in[52 + inpos] & 1048575L) << (54 - 20)); + out[62 + outpos] = (in[52 + inpos] >>> 20) + | ((in[53 + inpos] & 1023L) << (54 - 10)); + out[63 + outpos] = (in[53 + inpos] >>> 10); + } + + protected static void fastunpack55(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 36028797018963967L); + out[1 + outpos] = (in[inpos] >>> 55) + | ((in[1 + inpos] & 70368744177663L) << (55 - 46)); + out[2 + outpos] = (in[1 + inpos] >>> 46) + | ((in[2 + inpos] & 137438953471L) << (55 - 37)); + out[3 + outpos] = (in[2 + inpos] >>> 37) + | ((in[3 + inpos] & 268435455L) << (55 - 28)); + out[4 + outpos] = (in[3 + inpos] >>> 28) + | ((in[4 + inpos] & 524287L) << (55 - 19)); + out[5 + outpos] = (in[4 + inpos] >>> 19) + | ((in[5 + inpos] & 1023L) << (55 - 10)); + out[6 + outpos] = (in[5 + inpos] >>> 10) + | ((in[6 + inpos] & 1L) << (55 - 1)); + out[7 + outpos] = ((in[6 + inpos] >>> 1) & 36028797018963967L); + out[8 + outpos] = (in[6 + inpos] >>> 56) + | ((in[7 + inpos] & 140737488355327L) << (55 - 47)); + out[9 + outpos] = (in[7 + inpos] >>> 47) + | ((in[8 + inpos] & 274877906943L) << (55 - 38)); + out[10 + outpos] = (in[8 + inpos] >>> 38) + | ((in[9 + inpos] & 536870911L) << (55 - 29)); + out[11 + outpos] = (in[9 + inpos] >>> 29) + | ((in[10 + inpos] & 1048575L) << (55 - 20)); + out[12 + outpos] = (in[10 + inpos] >>> 20) + | ((in[11 + inpos] & 2047L) << (55 - 11)); + out[13 + outpos] = (in[11 + inpos] >>> 11) + | ((in[12 + inpos] & 3L) << (55 - 2)); + out[14 + outpos] = ((in[12 + inpos] >>> 2) & 36028797018963967L); + out[15 + outpos] = (in[12 + inpos] >>> 57) + | ((in[13 + inpos] & 281474976710655L) << (55 - 48)); + out[16 + outpos] = (in[13 + inpos] >>> 48) + | ((in[14 + inpos] & 549755813887L) << (55 - 39)); + out[17 + outpos] = (in[14 + inpos] >>> 39) + | ((in[15 + inpos] & 1073741823L) << (55 - 30)); + out[18 + outpos] = (in[15 + inpos] >>> 30) + | ((in[16 + inpos] & 2097151L) << (55 - 21)); + out[19 + outpos] = (in[16 + inpos] >>> 21) + | ((in[17 + inpos] & 4095L) << (55 - 12)); + out[20 + outpos] = (in[17 + inpos] >>> 12) + | ((in[18 + inpos] & 7L) << (55 - 3)); + out[21 + outpos] = ((in[18 + inpos] >>> 3) & 36028797018963967L); + out[22 + outpos] = (in[18 + inpos] >>> 58) + | ((in[19 + inpos] & 562949953421311L) << (55 - 49)); + out[23 + outpos] = (in[19 + inpos] >>> 49) + | ((in[20 + inpos] & 1099511627775L) << (55 - 40)); + out[24 + outpos] = (in[20 + inpos] >>> 40) + | ((in[21 + inpos] & 2147483647L) << (55 - 31)); + out[25 + outpos] = (in[21 + inpos] >>> 31) + | ((in[22 + inpos] & 4194303L) << (55 - 22)); + out[26 + outpos] = (in[22 + inpos] >>> 22) + | ((in[23 + inpos] & 8191L) << (55 - 13)); + out[27 + outpos] = (in[23 + inpos] >>> 13) + | ((in[24 + inpos] & 15L) << (55 - 4)); + out[28 + outpos] = ((in[24 + inpos] >>> 4) & 36028797018963967L); + out[29 + outpos] = (in[24 + inpos] >>> 59) + | ((in[25 + inpos] & 1125899906842623L) << (55 - 50)); + out[30 + outpos] = (in[25 + inpos] >>> 50) + | ((in[26 + inpos] & 2199023255551L) << (55 - 41)); + out[31 + outpos] = (in[26 + inpos] >>> 41) + | ((in[27 + inpos] & 4294967295L) << (55 - 32)); + out[32 + outpos] = (in[27 + inpos] >>> 32) + | ((in[28 + inpos] & 8388607L) << (55 - 23)); + out[33 + outpos] = (in[28 + inpos] >>> 23) + | ((in[29 + inpos] & 16383L) << (55 - 14)); + out[34 + outpos] = (in[29 + inpos] >>> 14) + | ((in[30 + inpos] & 31L) << (55 - 5)); + out[35 + outpos] = ((in[30 + inpos] >>> 5) & 36028797018963967L); + out[36 + outpos] = (in[30 + inpos] >>> 60) + | ((in[31 + inpos] & 2251799813685247L) << (55 - 51)); + out[37 + outpos] = (in[31 + inpos] >>> 51) + | ((in[32 + inpos] & 4398046511103L) << (55 - 42)); + out[38 + outpos] = (in[32 + inpos] >>> 42) + | ((in[33 + inpos] & 8589934591L) << (55 - 33)); + out[39 + outpos] = (in[33 + inpos] >>> 33) + | ((in[34 + inpos] & 16777215L) << (55 - 24)); + out[40 + outpos] = (in[34 + inpos] >>> 24) + | ((in[35 + inpos] & 32767L) << (55 - 15)); + out[41 + outpos] = (in[35 + inpos] >>> 15) + | ((in[36 + inpos] & 63L) << (55 - 6)); + out[42 + outpos] = ((in[36 + inpos] >>> 6) & 36028797018963967L); + out[43 + outpos] = (in[36 + inpos] >>> 61) + | ((in[37 + inpos] & 4503599627370495L) << (55 - 52)); + out[44 + outpos] = (in[37 + inpos] >>> 52) + | ((in[38 + inpos] & 8796093022207L) << (55 - 43)); + out[45 + outpos] = (in[38 + inpos] >>> 43) + | ((in[39 + inpos] & 17179869183L) << (55 - 34)); + out[46 + outpos] = (in[39 + inpos] >>> 34) + | ((in[40 + inpos] & 33554431L) << (55 - 25)); + out[47 + outpos] = (in[40 + inpos] >>> 25) + | ((in[41 + inpos] & 65535L) << (55 - 16)); + out[48 + outpos] = (in[41 + inpos] >>> 16) + | ((in[42 + inpos] & 127L) << (55 - 7)); + out[49 + outpos] = ((in[42 + inpos] >>> 7) & 36028797018963967L); + out[50 + outpos] = (in[42 + inpos] >>> 62) + | ((in[43 + inpos] & 9007199254740991L) << (55 - 53)); + out[51 + outpos] = (in[43 + inpos] >>> 53) + | ((in[44 + inpos] & 17592186044415L) << (55 - 44)); + out[52 + outpos] = (in[44 + inpos] >>> 44) + | ((in[45 + inpos] & 34359738367L) << (55 - 35)); + out[53 + outpos] = (in[45 + inpos] >>> 35) + | ((in[46 + inpos] & 67108863L) << (55 - 26)); + out[54 + outpos] = (in[46 + inpos] >>> 26) + | ((in[47 + inpos] & 131071L) << (55 - 17)); + out[55 + outpos] = (in[47 + inpos] >>> 17) + | ((in[48 + inpos] & 255L) << (55 - 8)); + out[56 + outpos] = ((in[48 + inpos] >>> 8) & 36028797018963967L); + out[57 + outpos] = (in[48 + inpos] >>> 63) + | ((in[49 + inpos] & 18014398509481983L) << (55 - 54)); + out[58 + outpos] = (in[49 + inpos] >>> 54) + | ((in[50 + inpos] & 35184372088831L) << (55 - 45)); + out[59 + outpos] = (in[50 + inpos] >>> 45) + | ((in[51 + inpos] & 68719476735L) << (55 - 36)); + out[60 + outpos] = (in[51 + inpos] >>> 36) + | ((in[52 + inpos] & 134217727L) << (55 - 27)); + out[61 + outpos] = (in[52 + inpos] >>> 27) + | ((in[53 + inpos] & 262143L) << (55 - 18)); + out[62 + outpos] = (in[53 + inpos] >>> 18) + | ((in[54 + inpos] & 511L) << (55 - 9)); + out[63 + outpos] = (in[54 + inpos] >>> 9); + } + + protected static void fastunpack56(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 72057594037927935L); + out[1 + outpos] = (in[inpos] >>> 56) + | ((in[1 + inpos] & 281474976710655L) << (56 - 48)); + out[2 + outpos] = (in[1 + inpos] >>> 48) + | ((in[2 + inpos] & 1099511627775L) << (56 - 40)); + out[3 + outpos] = (in[2 + inpos] >>> 40) + | ((in[3 + inpos] & 4294967295L) << (56 - 32)); + out[4 + outpos] = (in[3 + inpos] >>> 32) + | ((in[4 + inpos] & 16777215L) << (56 - 24)); + out[5 + outpos] = (in[4 + inpos] >>> 24) + | ((in[5 + inpos] & 65535L) << (56 - 16)); + out[6 + outpos] = (in[5 + inpos] >>> 16) + | ((in[6 + inpos] & 255L) << (56 - 8)); + out[7 + outpos] = (in[6 + inpos] >>> 8); + out[8 + outpos] = (in[7 + inpos] & 72057594037927935L); + out[9 + outpos] = (in[7 + inpos] >>> 56) + | ((in[8 + inpos] & 281474976710655L) << (56 - 48)); + out[10 + outpos] = (in[8 + inpos] >>> 48) + | ((in[9 + inpos] & 1099511627775L) << (56 - 40)); + out[11 + outpos] = (in[9 + inpos] >>> 40) + | ((in[10 + inpos] & 4294967295L) << (56 - 32)); + out[12 + outpos] = (in[10 + inpos] >>> 32) + | ((in[11 + inpos] & 16777215L) << (56 - 24)); + out[13 + outpos] = (in[11 + inpos] >>> 24) + | ((in[12 + inpos] & 65535L) << (56 - 16)); + out[14 + outpos] = (in[12 + inpos] >>> 16) + | ((in[13 + inpos] & 255L) << (56 - 8)); + out[15 + outpos] = (in[13 + inpos] >>> 8); + out[16 + outpos] = (in[14 + inpos] & 72057594037927935L); + out[17 + outpos] = (in[14 + inpos] >>> 56) + | ((in[15 + inpos] & 281474976710655L) << (56 - 48)); + out[18 + outpos] = (in[15 + inpos] >>> 48) + | ((in[16 + inpos] & 1099511627775L) << (56 - 40)); + out[19 + outpos] = (in[16 + inpos] >>> 40) + | ((in[17 + inpos] & 4294967295L) << (56 - 32)); + out[20 + outpos] = (in[17 + inpos] >>> 32) + | ((in[18 + inpos] & 16777215L) << (56 - 24)); + out[21 + outpos] = (in[18 + inpos] >>> 24) + | ((in[19 + inpos] & 65535L) << (56 - 16)); + out[22 + outpos] = (in[19 + inpos] >>> 16) + | ((in[20 + inpos] & 255L) << (56 - 8)); + out[23 + outpos] = (in[20 + inpos] >>> 8); + out[24 + outpos] = (in[21 + inpos] & 72057594037927935L); + out[25 + outpos] = (in[21 + inpos] >>> 56) + | ((in[22 + inpos] & 281474976710655L) << (56 - 48)); + out[26 + outpos] = (in[22 + inpos] >>> 48) + | ((in[23 + inpos] & 1099511627775L) << (56 - 40)); + out[27 + outpos] = (in[23 + inpos] >>> 40) + | ((in[24 + inpos] & 4294967295L) << (56 - 32)); + out[28 + outpos] = (in[24 + inpos] >>> 32) + | ((in[25 + inpos] & 16777215L) << (56 - 24)); + out[29 + outpos] = (in[25 + inpos] >>> 24) + | ((in[26 + inpos] & 65535L) << (56 - 16)); + out[30 + outpos] = (in[26 + inpos] >>> 16) + | ((in[27 + inpos] & 255L) << (56 - 8)); + out[31 + outpos] = (in[27 + inpos] >>> 8); + out[32 + outpos] = (in[28 + inpos] & 72057594037927935L); + out[33 + outpos] = (in[28 + inpos] >>> 56) + | ((in[29 + inpos] & 281474976710655L) << (56 - 48)); + out[34 + outpos] = (in[29 + inpos] >>> 48) + | ((in[30 + inpos] & 1099511627775L) << (56 - 40)); + out[35 + outpos] = (in[30 + inpos] >>> 40) + | ((in[31 + inpos] & 4294967295L) << (56 - 32)); + out[36 + outpos] = (in[31 + inpos] >>> 32) + | ((in[32 + inpos] & 16777215L) << (56 - 24)); + out[37 + outpos] = (in[32 + inpos] >>> 24) + | ((in[33 + inpos] & 65535L) << (56 - 16)); + out[38 + outpos] = (in[33 + inpos] >>> 16) + | ((in[34 + inpos] & 255L) << (56 - 8)); + out[39 + outpos] = (in[34 + inpos] >>> 8); + out[40 + outpos] = (in[35 + inpos] & 72057594037927935L); + out[41 + outpos] = (in[35 + inpos] >>> 56) + | ((in[36 + inpos] & 281474976710655L) << (56 - 48)); + out[42 + outpos] = (in[36 + inpos] >>> 48) + | ((in[37 + inpos] & 1099511627775L) << (56 - 40)); + out[43 + outpos] = (in[37 + inpos] >>> 40) + | ((in[38 + inpos] & 4294967295L) << (56 - 32)); + out[44 + outpos] = (in[38 + inpos] >>> 32) + | ((in[39 + inpos] & 16777215L) << (56 - 24)); + out[45 + outpos] = (in[39 + inpos] >>> 24) + | ((in[40 + inpos] & 65535L) << (56 - 16)); + out[46 + outpos] = (in[40 + inpos] >>> 16) + | ((in[41 + inpos] & 255L) << (56 - 8)); + out[47 + outpos] = (in[41 + inpos] >>> 8); + out[48 + outpos] = (in[42 + inpos] & 72057594037927935L); + out[49 + outpos] = (in[42 + inpos] >>> 56) + | ((in[43 + inpos] & 281474976710655L) << (56 - 48)); + out[50 + outpos] = (in[43 + inpos] >>> 48) + | ((in[44 + inpos] & 1099511627775L) << (56 - 40)); + out[51 + outpos] = (in[44 + inpos] >>> 40) + | ((in[45 + inpos] & 4294967295L) << (56 - 32)); + out[52 + outpos] = (in[45 + inpos] >>> 32) + | ((in[46 + inpos] & 16777215L) << (56 - 24)); + out[53 + outpos] = (in[46 + inpos] >>> 24) + | ((in[47 + inpos] & 65535L) << (56 - 16)); + out[54 + outpos] = (in[47 + inpos] >>> 16) + | ((in[48 + inpos] & 255L) << (56 - 8)); + out[55 + outpos] = (in[48 + inpos] >>> 8); + out[56 + outpos] = (in[49 + inpos] & 72057594037927935L); + out[57 + outpos] = (in[49 + inpos] >>> 56) + | ((in[50 + inpos] & 281474976710655L) << (56 - 48)); + out[58 + outpos] = (in[50 + inpos] >>> 48) + | ((in[51 + inpos] & 1099511627775L) << (56 - 40)); + out[59 + outpos] = (in[51 + inpos] >>> 40) + | ((in[52 + inpos] & 4294967295L) << (56 - 32)); + out[60 + outpos] = (in[52 + inpos] >>> 32) + | ((in[53 + inpos] & 16777215L) << (56 - 24)); + out[61 + outpos] = (in[53 + inpos] >>> 24) + | ((in[54 + inpos] & 65535L) << (56 - 16)); + out[62 + outpos] = (in[54 + inpos] >>> 16) + | ((in[55 + inpos] & 255L) << (56 - 8)); + out[63 + outpos] = (in[55 + inpos] >>> 8); + } + + protected static void fastunpack57(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 144115188075855871L); + out[1 + outpos] = (in[inpos] >>> 57) + | ((in[1 + inpos] & 1125899906842623L) << (57 - 50)); + out[2 + outpos] = (in[1 + inpos] >>> 50) + | ((in[2 + inpos] & 8796093022207L) << (57 - 43)); + out[3 + outpos] = (in[2 + inpos] >>> 43) + | ((in[3 + inpos] & 68719476735L) << (57 - 36)); + out[4 + outpos] = (in[3 + inpos] >>> 36) + | ((in[4 + inpos] & 536870911L) << (57 - 29)); + out[5 + outpos] = (in[4 + inpos] >>> 29) + | ((in[5 + inpos] & 4194303L) << (57 - 22)); + out[6 + outpos] = (in[5 + inpos] >>> 22) + | ((in[6 + inpos] & 32767L) << (57 - 15)); + out[7 + outpos] = (in[6 + inpos] >>> 15) + | ((in[7 + inpos] & 255L) << (57 - 8)); + out[8 + outpos] = (in[7 + inpos] >>> 8) + | ((in[8 + inpos] & 1L) << (57 - 1)); + out[9 + outpos] = ((in[8 + inpos] >>> 1) & 144115188075855871L); + out[10 + outpos] = (in[8 + inpos] >>> 58) + | ((in[9 + inpos] & 2251799813685247L) << (57 - 51)); + out[11 + outpos] = (in[9 + inpos] >>> 51) + | ((in[10 + inpos] & 17592186044415L) << (57 - 44)); + out[12 + outpos] = (in[10 + inpos] >>> 44) + | ((in[11 + inpos] & 137438953471L) << (57 - 37)); + out[13 + outpos] = (in[11 + inpos] >>> 37) + | ((in[12 + inpos] & 1073741823L) << (57 - 30)); + out[14 + outpos] = (in[12 + inpos] >>> 30) + | ((in[13 + inpos] & 8388607L) << (57 - 23)); + out[15 + outpos] = (in[13 + inpos] >>> 23) + | ((in[14 + inpos] & 65535L) << (57 - 16)); + out[16 + outpos] = (in[14 + inpos] >>> 16) + | ((in[15 + inpos] & 511L) << (57 - 9)); + out[17 + outpos] = (in[15 + inpos] >>> 9) + | ((in[16 + inpos] & 3L) << (57 - 2)); + out[18 + outpos] = ((in[16 + inpos] >>> 2) & 144115188075855871L); + out[19 + outpos] = (in[16 + inpos] >>> 59) + | ((in[17 + inpos] & 4503599627370495L) << (57 - 52)); + out[20 + outpos] = (in[17 + inpos] >>> 52) + | ((in[18 + inpos] & 35184372088831L) << (57 - 45)); + out[21 + outpos] = (in[18 + inpos] >>> 45) + | ((in[19 + inpos] & 274877906943L) << (57 - 38)); + out[22 + outpos] = (in[19 + inpos] >>> 38) + | ((in[20 + inpos] & 2147483647L) << (57 - 31)); + out[23 + outpos] = (in[20 + inpos] >>> 31) + | ((in[21 + inpos] & 16777215L) << (57 - 24)); + out[24 + outpos] = (in[21 + inpos] >>> 24) + | ((in[22 + inpos] & 131071L) << (57 - 17)); + out[25 + outpos] = (in[22 + inpos] >>> 17) + | ((in[23 + inpos] & 1023L) << (57 - 10)); + out[26 + outpos] = (in[23 + inpos] >>> 10) + | ((in[24 + inpos] & 7L) << (57 - 3)); + out[27 + outpos] = ((in[24 + inpos] >>> 3) & 144115188075855871L); + out[28 + outpos] = (in[24 + inpos] >>> 60) + | ((in[25 + inpos] & 9007199254740991L) << (57 - 53)); + out[29 + outpos] = (in[25 + inpos] >>> 53) + | ((in[26 + inpos] & 70368744177663L) << (57 - 46)); + out[30 + outpos] = (in[26 + inpos] >>> 46) + | ((in[27 + inpos] & 549755813887L) << (57 - 39)); + out[31 + outpos] = (in[27 + inpos] >>> 39) + | ((in[28 + inpos] & 4294967295L) << (57 - 32)); + out[32 + outpos] = (in[28 + inpos] >>> 32) + | ((in[29 + inpos] & 33554431L) << (57 - 25)); + out[33 + outpos] = (in[29 + inpos] >>> 25) + | ((in[30 + inpos] & 262143L) << (57 - 18)); + out[34 + outpos] = (in[30 + inpos] >>> 18) + | ((in[31 + inpos] & 2047L) << (57 - 11)); + out[35 + outpos] = (in[31 + inpos] >>> 11) + | ((in[32 + inpos] & 15L) << (57 - 4)); + out[36 + outpos] = ((in[32 + inpos] >>> 4) & 144115188075855871L); + out[37 + outpos] = (in[32 + inpos] >>> 61) + | ((in[33 + inpos] & 18014398509481983L) << (57 - 54)); + out[38 + outpos] = (in[33 + inpos] >>> 54) + | ((in[34 + inpos] & 140737488355327L) << (57 - 47)); + out[39 + outpos] = (in[34 + inpos] >>> 47) + | ((in[35 + inpos] & 1099511627775L) << (57 - 40)); + out[40 + outpos] = (in[35 + inpos] >>> 40) + | ((in[36 + inpos] & 8589934591L) << (57 - 33)); + out[41 + outpos] = (in[36 + inpos] >>> 33) + | ((in[37 + inpos] & 67108863L) << (57 - 26)); + out[42 + outpos] = (in[37 + inpos] >>> 26) + | ((in[38 + inpos] & 524287L) << (57 - 19)); + out[43 + outpos] = (in[38 + inpos] >>> 19) + | ((in[39 + inpos] & 4095L) << (57 - 12)); + out[44 + outpos] = (in[39 + inpos] >>> 12) + | ((in[40 + inpos] & 31L) << (57 - 5)); + out[45 + outpos] = ((in[40 + inpos] >>> 5) & 144115188075855871L); + out[46 + outpos] = (in[40 + inpos] >>> 62) + | ((in[41 + inpos] & 36028797018963967L) << (57 - 55)); + out[47 + outpos] = (in[41 + inpos] >>> 55) + | ((in[42 + inpos] & 281474976710655L) << (57 - 48)); + out[48 + outpos] = (in[42 + inpos] >>> 48) + | ((in[43 + inpos] & 2199023255551L) << (57 - 41)); + out[49 + outpos] = (in[43 + inpos] >>> 41) + | ((in[44 + inpos] & 17179869183L) << (57 - 34)); + out[50 + outpos] = (in[44 + inpos] >>> 34) + | ((in[45 + inpos] & 134217727L) << (57 - 27)); + out[51 + outpos] = (in[45 + inpos] >>> 27) + | ((in[46 + inpos] & 1048575L) << (57 - 20)); + out[52 + outpos] = (in[46 + inpos] >>> 20) + | ((in[47 + inpos] & 8191L) << (57 - 13)); + out[53 + outpos] = (in[47 + inpos] >>> 13) + | ((in[48 + inpos] & 63L) << (57 - 6)); + out[54 + outpos] = ((in[48 + inpos] >>> 6) & 144115188075855871L); + out[55 + outpos] = (in[48 + inpos] >>> 63) + | ((in[49 + inpos] & 72057594037927935L) << (57 - 56)); + out[56 + outpos] = (in[49 + inpos] >>> 56) + | ((in[50 + inpos] & 562949953421311L) << (57 - 49)); + out[57 + outpos] = (in[50 + inpos] >>> 49) + | ((in[51 + inpos] & 4398046511103L) << (57 - 42)); + out[58 + outpos] = (in[51 + inpos] >>> 42) + | ((in[52 + inpos] & 34359738367L) << (57 - 35)); + out[59 + outpos] = (in[52 + inpos] >>> 35) + | ((in[53 + inpos] & 268435455L) << (57 - 28)); + out[60 + outpos] = (in[53 + inpos] >>> 28) + | ((in[54 + inpos] & 2097151L) << (57 - 21)); + out[61 + outpos] = (in[54 + inpos] >>> 21) + | ((in[55 + inpos] & 16383L) << (57 - 14)); + out[62 + outpos] = (in[55 + inpos] >>> 14) + | ((in[56 + inpos] & 127L) << (57 - 7)); + out[63 + outpos] = (in[56 + inpos] >>> 7); + } + + protected static void fastunpack58(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 288230376151711743L); + out[1 + outpos] = (in[inpos] >>> 58) + | ((in[1 + inpos] & 4503599627370495L) << (58 - 52)); + out[2 + outpos] = (in[1 + inpos] >>> 52) + | ((in[2 + inpos] & 70368744177663L) << (58 - 46)); + out[3 + outpos] = (in[2 + inpos] >>> 46) + | ((in[3 + inpos] & 1099511627775L) << (58 - 40)); + out[4 + outpos] = (in[3 + inpos] >>> 40) + | ((in[4 + inpos] & 17179869183L) << (58 - 34)); + out[5 + outpos] = (in[4 + inpos] >>> 34) + | ((in[5 + inpos] & 268435455L) << (58 - 28)); + out[6 + outpos] = (in[5 + inpos] >>> 28) + | ((in[6 + inpos] & 4194303L) << (58 - 22)); + out[7 + outpos] = (in[6 + inpos] >>> 22) + | ((in[7 + inpos] & 65535L) << (58 - 16)); + out[8 + outpos] = (in[7 + inpos] >>> 16) + | ((in[8 + inpos] & 1023L) << (58 - 10)); + out[9 + outpos] = (in[8 + inpos] >>> 10) + | ((in[9 + inpos] & 15L) << (58 - 4)); + out[10 + outpos] = ((in[9 + inpos] >>> 4) & 288230376151711743L); + out[11 + outpos] = (in[9 + inpos] >>> 62) + | ((in[10 + inpos] & 72057594037927935L) << (58 - 56)); + out[12 + outpos] = (in[10 + inpos] >>> 56) + | ((in[11 + inpos] & 1125899906842623L) << (58 - 50)); + out[13 + outpos] = (in[11 + inpos] >>> 50) + | ((in[12 + inpos] & 17592186044415L) << (58 - 44)); + out[14 + outpos] = (in[12 + inpos] >>> 44) + | ((in[13 + inpos] & 274877906943L) << (58 - 38)); + out[15 + outpos] = (in[13 + inpos] >>> 38) + | ((in[14 + inpos] & 4294967295L) << (58 - 32)); + out[16 + outpos] = (in[14 + inpos] >>> 32) + | ((in[15 + inpos] & 67108863L) << (58 - 26)); + out[17 + outpos] = (in[15 + inpos] >>> 26) + | ((in[16 + inpos] & 1048575L) << (58 - 20)); + out[18 + outpos] = (in[16 + inpos] >>> 20) + | ((in[17 + inpos] & 16383L) << (58 - 14)); + out[19 + outpos] = (in[17 + inpos] >>> 14) + | ((in[18 + inpos] & 255L) << (58 - 8)); + out[20 + outpos] = (in[18 + inpos] >>> 8) + | ((in[19 + inpos] & 3L) << (58 - 2)); + out[21 + outpos] = ((in[19 + inpos] >>> 2) & 288230376151711743L); + out[22 + outpos] = (in[19 + inpos] >>> 60) + | ((in[20 + inpos] & 18014398509481983L) << (58 - 54)); + out[23 + outpos] = (in[20 + inpos] >>> 54) + | ((in[21 + inpos] & 281474976710655L) << (58 - 48)); + out[24 + outpos] = (in[21 + inpos] >>> 48) + | ((in[22 + inpos] & 4398046511103L) << (58 - 42)); + out[25 + outpos] = (in[22 + inpos] >>> 42) + | ((in[23 + inpos] & 68719476735L) << (58 - 36)); + out[26 + outpos] = (in[23 + inpos] >>> 36) + | ((in[24 + inpos] & 1073741823L) << (58 - 30)); + out[27 + outpos] = (in[24 + inpos] >>> 30) + | ((in[25 + inpos] & 16777215L) << (58 - 24)); + out[28 + outpos] = (in[25 + inpos] >>> 24) + | ((in[26 + inpos] & 262143L) << (58 - 18)); + out[29 + outpos] = (in[26 + inpos] >>> 18) + | ((in[27 + inpos] & 4095L) << (58 - 12)); + out[30 + outpos] = (in[27 + inpos] >>> 12) + | ((in[28 + inpos] & 63L) << (58 - 6)); + out[31 + outpos] = (in[28 + inpos] >>> 6); + out[32 + outpos] = (in[29 + inpos] & 288230376151711743L); + out[33 + outpos] = (in[29 + inpos] >>> 58) + | ((in[30 + inpos] & 4503599627370495L) << (58 - 52)); + out[34 + outpos] = (in[30 + inpos] >>> 52) + | ((in[31 + inpos] & 70368744177663L) << (58 - 46)); + out[35 + outpos] = (in[31 + inpos] >>> 46) + | ((in[32 + inpos] & 1099511627775L) << (58 - 40)); + out[36 + outpos] = (in[32 + inpos] >>> 40) + | ((in[33 + inpos] & 17179869183L) << (58 - 34)); + out[37 + outpos] = (in[33 + inpos] >>> 34) + | ((in[34 + inpos] & 268435455L) << (58 - 28)); + out[38 + outpos] = (in[34 + inpos] >>> 28) + | ((in[35 + inpos] & 4194303L) << (58 - 22)); + out[39 + outpos] = (in[35 + inpos] >>> 22) + | ((in[36 + inpos] & 65535L) << (58 - 16)); + out[40 + outpos] = (in[36 + inpos] >>> 16) + | ((in[37 + inpos] & 1023L) << (58 - 10)); + out[41 + outpos] = (in[37 + inpos] >>> 10) + | ((in[38 + inpos] & 15L) << (58 - 4)); + out[42 + outpos] = ((in[38 + inpos] >>> 4) & 288230376151711743L); + out[43 + outpos] = (in[38 + inpos] >>> 62) + | ((in[39 + inpos] & 72057594037927935L) << (58 - 56)); + out[44 + outpos] = (in[39 + inpos] >>> 56) + | ((in[40 + inpos] & 1125899906842623L) << (58 - 50)); + out[45 + outpos] = (in[40 + inpos] >>> 50) + | ((in[41 + inpos] & 17592186044415L) << (58 - 44)); + out[46 + outpos] = (in[41 + inpos] >>> 44) + | ((in[42 + inpos] & 274877906943L) << (58 - 38)); + out[47 + outpos] = (in[42 + inpos] >>> 38) + | ((in[43 + inpos] & 4294967295L) << (58 - 32)); + out[48 + outpos] = (in[43 + inpos] >>> 32) + | ((in[44 + inpos] & 67108863L) << (58 - 26)); + out[49 + outpos] = (in[44 + inpos] >>> 26) + | ((in[45 + inpos] & 1048575L) << (58 - 20)); + out[50 + outpos] = (in[45 + inpos] >>> 20) + | ((in[46 + inpos] & 16383L) << (58 - 14)); + out[51 + outpos] = (in[46 + inpos] >>> 14) + | ((in[47 + inpos] & 255L) << (58 - 8)); + out[52 + outpos] = (in[47 + inpos] >>> 8) + | ((in[48 + inpos] & 3L) << (58 - 2)); + out[53 + outpos] = ((in[48 + inpos] >>> 2) & 288230376151711743L); + out[54 + outpos] = (in[48 + inpos] >>> 60) + | ((in[49 + inpos] & 18014398509481983L) << (58 - 54)); + out[55 + outpos] = (in[49 + inpos] >>> 54) + | ((in[50 + inpos] & 281474976710655L) << (58 - 48)); + out[56 + outpos] = (in[50 + inpos] >>> 48) + | ((in[51 + inpos] & 4398046511103L) << (58 - 42)); + out[57 + outpos] = (in[51 + inpos] >>> 42) + | ((in[52 + inpos] & 68719476735L) << (58 - 36)); + out[58 + outpos] = (in[52 + inpos] >>> 36) + | ((in[53 + inpos] & 1073741823L) << (58 - 30)); + out[59 + outpos] = (in[53 + inpos] >>> 30) + | ((in[54 + inpos] & 16777215L) << (58 - 24)); + out[60 + outpos] = (in[54 + inpos] >>> 24) + | ((in[55 + inpos] & 262143L) << (58 - 18)); + out[61 + outpos] = (in[55 + inpos] >>> 18) + | ((in[56 + inpos] & 4095L) << (58 - 12)); + out[62 + outpos] = (in[56 + inpos] >>> 12) + | ((in[57 + inpos] & 63L) << (58 - 6)); + out[63 + outpos] = (in[57 + inpos] >>> 6); + } + + protected static void fastunpack59(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 576460752303423487L); + out[1 + outpos] = (in[inpos] >>> 59) + | ((in[1 + inpos] & 18014398509481983L) << (59 - 54)); + out[2 + outpos] = (in[1 + inpos] >>> 54) + | ((in[2 + inpos] & 562949953421311L) << (59 - 49)); + out[3 + outpos] = (in[2 + inpos] >>> 49) + | ((in[3 + inpos] & 17592186044415L) << (59 - 44)); + out[4 + outpos] = (in[3 + inpos] >>> 44) + | ((in[4 + inpos] & 549755813887L) << (59 - 39)); + out[5 + outpos] = (in[4 + inpos] >>> 39) + | ((in[5 + inpos] & 17179869183L) << (59 - 34)); + out[6 + outpos] = (in[5 + inpos] >>> 34) + | ((in[6 + inpos] & 536870911L) << (59 - 29)); + out[7 + outpos] = (in[6 + inpos] >>> 29) + | ((in[7 + inpos] & 16777215L) << (59 - 24)); + out[8 + outpos] = (in[7 + inpos] >>> 24) + | ((in[8 + inpos] & 524287L) << (59 - 19)); + out[9 + outpos] = (in[8 + inpos] >>> 19) + | ((in[9 + inpos] & 16383L) << (59 - 14)); + out[10 + outpos] = (in[9 + inpos] >>> 14) + | ((in[10 + inpos] & 511L) << (59 - 9)); + out[11 + outpos] = (in[10 + inpos] >>> 9) + | ((in[11 + inpos] & 15L) << (59 - 4)); + out[12 + outpos] = ((in[11 + inpos] >>> 4) & 576460752303423487L); + out[13 + outpos] = (in[11 + inpos] >>> 63) + | ((in[12 + inpos] & 288230376151711743L) << (59 - 58)); + out[14 + outpos] = (in[12 + inpos] >>> 58) + | ((in[13 + inpos] & 9007199254740991L) << (59 - 53)); + out[15 + outpos] = (in[13 + inpos] >>> 53) + | ((in[14 + inpos] & 281474976710655L) << (59 - 48)); + out[16 + outpos] = (in[14 + inpos] >>> 48) + | ((in[15 + inpos] & 8796093022207L) << (59 - 43)); + out[17 + outpos] = (in[15 + inpos] >>> 43) + | ((in[16 + inpos] & 274877906943L) << (59 - 38)); + out[18 + outpos] = (in[16 + inpos] >>> 38) + | ((in[17 + inpos] & 8589934591L) << (59 - 33)); + out[19 + outpos] = (in[17 + inpos] >>> 33) + | ((in[18 + inpos] & 268435455L) << (59 - 28)); + out[20 + outpos] = (in[18 + inpos] >>> 28) + | ((in[19 + inpos] & 8388607L) << (59 - 23)); + out[21 + outpos] = (in[19 + inpos] >>> 23) + | ((in[20 + inpos] & 262143L) << (59 - 18)); + out[22 + outpos] = (in[20 + inpos] >>> 18) + | ((in[21 + inpos] & 8191L) << (59 - 13)); + out[23 + outpos] = (in[21 + inpos] >>> 13) + | ((in[22 + inpos] & 255L) << (59 - 8)); + out[24 + outpos] = (in[22 + inpos] >>> 8) + | ((in[23 + inpos] & 7L) << (59 - 3)); + out[25 + outpos] = ((in[23 + inpos] >>> 3) & 576460752303423487L); + out[26 + outpos] = (in[23 + inpos] >>> 62) + | ((in[24 + inpos] & 144115188075855871L) << (59 - 57)); + out[27 + outpos] = (in[24 + inpos] >>> 57) + | ((in[25 + inpos] & 4503599627370495L) << (59 - 52)); + out[28 + outpos] = (in[25 + inpos] >>> 52) + | ((in[26 + inpos] & 140737488355327L) << (59 - 47)); + out[29 + outpos] = (in[26 + inpos] >>> 47) + | ((in[27 + inpos] & 4398046511103L) << (59 - 42)); + out[30 + outpos] = (in[27 + inpos] >>> 42) + | ((in[28 + inpos] & 137438953471L) << (59 - 37)); + out[31 + outpos] = (in[28 + inpos] >>> 37) + | ((in[29 + inpos] & 4294967295L) << (59 - 32)); + out[32 + outpos] = (in[29 + inpos] >>> 32) + | ((in[30 + inpos] & 134217727L) << (59 - 27)); + out[33 + outpos] = (in[30 + inpos] >>> 27) + | ((in[31 + inpos] & 4194303L) << (59 - 22)); + out[34 + outpos] = (in[31 + inpos] >>> 22) + | ((in[32 + inpos] & 131071L) << (59 - 17)); + out[35 + outpos] = (in[32 + inpos] >>> 17) + | ((in[33 + inpos] & 4095L) << (59 - 12)); + out[36 + outpos] = (in[33 + inpos] >>> 12) + | ((in[34 + inpos] & 127L) << (59 - 7)); + out[37 + outpos] = (in[34 + inpos] >>> 7) + | ((in[35 + inpos] & 3L) << (59 - 2)); + out[38 + outpos] = ((in[35 + inpos] >>> 2) & 576460752303423487L); + out[39 + outpos] = (in[35 + inpos] >>> 61) + | ((in[36 + inpos] & 72057594037927935L) << (59 - 56)); + out[40 + outpos] = (in[36 + inpos] >>> 56) + | ((in[37 + inpos] & 2251799813685247L) << (59 - 51)); + out[41 + outpos] = (in[37 + inpos] >>> 51) + | ((in[38 + inpos] & 70368744177663L) << (59 - 46)); + out[42 + outpos] = (in[38 + inpos] >>> 46) + | ((in[39 + inpos] & 2199023255551L) << (59 - 41)); + out[43 + outpos] = (in[39 + inpos] >>> 41) + | ((in[40 + inpos] & 68719476735L) << (59 - 36)); + out[44 + outpos] = (in[40 + inpos] >>> 36) + | ((in[41 + inpos] & 2147483647L) << (59 - 31)); + out[45 + outpos] = (in[41 + inpos] >>> 31) + | ((in[42 + inpos] & 67108863L) << (59 - 26)); + out[46 + outpos] = (in[42 + inpos] >>> 26) + | ((in[43 + inpos] & 2097151L) << (59 - 21)); + out[47 + outpos] = (in[43 + inpos] >>> 21) + | ((in[44 + inpos] & 65535L) << (59 - 16)); + out[48 + outpos] = (in[44 + inpos] >>> 16) + | ((in[45 + inpos] & 2047L) << (59 - 11)); + out[49 + outpos] = (in[45 + inpos] >>> 11) + | ((in[46 + inpos] & 63L) << (59 - 6)); + out[50 + outpos] = (in[46 + inpos] >>> 6) + | ((in[47 + inpos] & 1L) << (59 - 1)); + out[51 + outpos] = ((in[47 + inpos] >>> 1) & 576460752303423487L); + out[52 + outpos] = (in[47 + inpos] >>> 60) + | ((in[48 + inpos] & 36028797018963967L) << (59 - 55)); + out[53 + outpos] = (in[48 + inpos] >>> 55) + | ((in[49 + inpos] & 1125899906842623L) << (59 - 50)); + out[54 + outpos] = (in[49 + inpos] >>> 50) + | ((in[50 + inpos] & 35184372088831L) << (59 - 45)); + out[55 + outpos] = (in[50 + inpos] >>> 45) + | ((in[51 + inpos] & 1099511627775L) << (59 - 40)); + out[56 + outpos] = (in[51 + inpos] >>> 40) + | ((in[52 + inpos] & 34359738367L) << (59 - 35)); + out[57 + outpos] = (in[52 + inpos] >>> 35) + | ((in[53 + inpos] & 1073741823L) << (59 - 30)); + out[58 + outpos] = (in[53 + inpos] >>> 30) + | ((in[54 + inpos] & 33554431L) << (59 - 25)); + out[59 + outpos] = (in[54 + inpos] >>> 25) + | ((in[55 + inpos] & 1048575L) << (59 - 20)); + out[60 + outpos] = (in[55 + inpos] >>> 20) + | ((in[56 + inpos] & 32767L) << (59 - 15)); + out[61 + outpos] = (in[56 + inpos] >>> 15) + | ((in[57 + inpos] & 1023L) << (59 - 10)); + out[62 + outpos] = (in[57 + inpos] >>> 10) + | ((in[58 + inpos] & 31L) << (59 - 5)); + out[63 + outpos] = (in[58 + inpos] >>> 5); + } + + protected static void fastunpack60(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 1152921504606846975L); + out[1 + outpos] = (in[inpos] >>> 60) + | ((in[1 + inpos] & 72057594037927935L) << (60 - 56)); + out[2 + outpos] = (in[1 + inpos] >>> 56) + | ((in[2 + inpos] & 4503599627370495L) << (60 - 52)); + out[3 + outpos] = (in[2 + inpos] >>> 52) + | ((in[3 + inpos] & 281474976710655L) << (60 - 48)); + out[4 + outpos] = (in[3 + inpos] >>> 48) + | ((in[4 + inpos] & 17592186044415L) << (60 - 44)); + out[5 + outpos] = (in[4 + inpos] >>> 44) + | ((in[5 + inpos] & 1099511627775L) << (60 - 40)); + out[6 + outpos] = (in[5 + inpos] >>> 40) + | ((in[6 + inpos] & 68719476735L) << (60 - 36)); + out[7 + outpos] = (in[6 + inpos] >>> 36) + | ((in[7 + inpos] & 4294967295L) << (60 - 32)); + out[8 + outpos] = (in[7 + inpos] >>> 32) + | ((in[8 + inpos] & 268435455L) << (60 - 28)); + out[9 + outpos] = (in[8 + inpos] >>> 28) + | ((in[9 + inpos] & 16777215L) << (60 - 24)); + out[10 + outpos] = (in[9 + inpos] >>> 24) + | ((in[10 + inpos] & 1048575L) << (60 - 20)); + out[11 + outpos] = (in[10 + inpos] >>> 20) + | ((in[11 + inpos] & 65535L) << (60 - 16)); + out[12 + outpos] = (in[11 + inpos] >>> 16) + | ((in[12 + inpos] & 4095L) << (60 - 12)); + out[13 + outpos] = (in[12 + inpos] >>> 12) + | ((in[13 + inpos] & 255L) << (60 - 8)); + out[14 + outpos] = (in[13 + inpos] >>> 8) + | ((in[14 + inpos] & 15L) << (60 - 4)); + out[15 + outpos] = (in[14 + inpos] >>> 4); + out[16 + outpos] = (in[15 + inpos] & 1152921504606846975L); + out[17 + outpos] = (in[15 + inpos] >>> 60) + | ((in[16 + inpos] & 72057594037927935L) << (60 - 56)); + out[18 + outpos] = (in[16 + inpos] >>> 56) + | ((in[17 + inpos] & 4503599627370495L) << (60 - 52)); + out[19 + outpos] = (in[17 + inpos] >>> 52) + | ((in[18 + inpos] & 281474976710655L) << (60 - 48)); + out[20 + outpos] = (in[18 + inpos] >>> 48) + | ((in[19 + inpos] & 17592186044415L) << (60 - 44)); + out[21 + outpos] = (in[19 + inpos] >>> 44) + | ((in[20 + inpos] & 1099511627775L) << (60 - 40)); + out[22 + outpos] = (in[20 + inpos] >>> 40) + | ((in[21 + inpos] & 68719476735L) << (60 - 36)); + out[23 + outpos] = (in[21 + inpos] >>> 36) + | ((in[22 + inpos] & 4294967295L) << (60 - 32)); + out[24 + outpos] = (in[22 + inpos] >>> 32) + | ((in[23 + inpos] & 268435455L) << (60 - 28)); + out[25 + outpos] = (in[23 + inpos] >>> 28) + | ((in[24 + inpos] & 16777215L) << (60 - 24)); + out[26 + outpos] = (in[24 + inpos] >>> 24) + | ((in[25 + inpos] & 1048575L) << (60 - 20)); + out[27 + outpos] = (in[25 + inpos] >>> 20) + | ((in[26 + inpos] & 65535L) << (60 - 16)); + out[28 + outpos] = (in[26 + inpos] >>> 16) + | ((in[27 + inpos] & 4095L) << (60 - 12)); + out[29 + outpos] = (in[27 + inpos] >>> 12) + | ((in[28 + inpos] & 255L) << (60 - 8)); + out[30 + outpos] = (in[28 + inpos] >>> 8) + | ((in[29 + inpos] & 15L) << (60 - 4)); + out[31 + outpos] = (in[29 + inpos] >>> 4); + out[32 + outpos] = (in[30 + inpos] & 1152921504606846975L); + out[33 + outpos] = (in[30 + inpos] >>> 60) + | ((in[31 + inpos] & 72057594037927935L) << (60 - 56)); + out[34 + outpos] = (in[31 + inpos] >>> 56) + | ((in[32 + inpos] & 4503599627370495L) << (60 - 52)); + out[35 + outpos] = (in[32 + inpos] >>> 52) + | ((in[33 + inpos] & 281474976710655L) << (60 - 48)); + out[36 + outpos] = (in[33 + inpos] >>> 48) + | ((in[34 + inpos] & 17592186044415L) << (60 - 44)); + out[37 + outpos] = (in[34 + inpos] >>> 44) + | ((in[35 + inpos] & 1099511627775L) << (60 - 40)); + out[38 + outpos] = (in[35 + inpos] >>> 40) + | ((in[36 + inpos] & 68719476735L) << (60 - 36)); + out[39 + outpos] = (in[36 + inpos] >>> 36) + | ((in[37 + inpos] & 4294967295L) << (60 - 32)); + out[40 + outpos] = (in[37 + inpos] >>> 32) + | ((in[38 + inpos] & 268435455L) << (60 - 28)); + out[41 + outpos] = (in[38 + inpos] >>> 28) + | ((in[39 + inpos] & 16777215L) << (60 - 24)); + out[42 + outpos] = (in[39 + inpos] >>> 24) + | ((in[40 + inpos] & 1048575L) << (60 - 20)); + out[43 + outpos] = (in[40 + inpos] >>> 20) + | ((in[41 + inpos] & 65535L) << (60 - 16)); + out[44 + outpos] = (in[41 + inpos] >>> 16) + | ((in[42 + inpos] & 4095L) << (60 - 12)); + out[45 + outpos] = (in[42 + inpos] >>> 12) + | ((in[43 + inpos] & 255L) << (60 - 8)); + out[46 + outpos] = (in[43 + inpos] >>> 8) + | ((in[44 + inpos] & 15L) << (60 - 4)); + out[47 + outpos] = (in[44 + inpos] >>> 4); + out[48 + outpos] = (in[45 + inpos] & 1152921504606846975L); + out[49 + outpos] = (in[45 + inpos] >>> 60) + | ((in[46 + inpos] & 72057594037927935L) << (60 - 56)); + out[50 + outpos] = (in[46 + inpos] >>> 56) + | ((in[47 + inpos] & 4503599627370495L) << (60 - 52)); + out[51 + outpos] = (in[47 + inpos] >>> 52) + | ((in[48 + inpos] & 281474976710655L) << (60 - 48)); + out[52 + outpos] = (in[48 + inpos] >>> 48) + | ((in[49 + inpos] & 17592186044415L) << (60 - 44)); + out[53 + outpos] = (in[49 + inpos] >>> 44) + | ((in[50 + inpos] & 1099511627775L) << (60 - 40)); + out[54 + outpos] = (in[50 + inpos] >>> 40) + | ((in[51 + inpos] & 68719476735L) << (60 - 36)); + out[55 + outpos] = (in[51 + inpos] >>> 36) + | ((in[52 + inpos] & 4294967295L) << (60 - 32)); + out[56 + outpos] = (in[52 + inpos] >>> 32) + | ((in[53 + inpos] & 268435455L) << (60 - 28)); + out[57 + outpos] = (in[53 + inpos] >>> 28) + | ((in[54 + inpos] & 16777215L) << (60 - 24)); + out[58 + outpos] = (in[54 + inpos] >>> 24) + | ((in[55 + inpos] & 1048575L) << (60 - 20)); + out[59 + outpos] = (in[55 + inpos] >>> 20) + | ((in[56 + inpos] & 65535L) << (60 - 16)); + out[60 + outpos] = (in[56 + inpos] >>> 16) + | ((in[57 + inpos] & 4095L) << (60 - 12)); + out[61 + outpos] = (in[57 + inpos] >>> 12) + | ((in[58 + inpos] & 255L) << (60 - 8)); + out[62 + outpos] = (in[58 + inpos] >>> 8) + | ((in[59 + inpos] & 15L) << (60 - 4)); + out[63 + outpos] = (in[59 + inpos] >>> 4); + } + + protected static void fastunpack61(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 2305843009213693951L); + out[1 + outpos] = (in[inpos] >>> 61) + | ((in[1 + inpos] & 288230376151711743L) << (61 - 58)); + out[2 + outpos] = (in[1 + inpos] >>> 58) + | ((in[2 + inpos] & 36028797018963967L) << (61 - 55)); + out[3 + outpos] = (in[2 + inpos] >>> 55) + | ((in[3 + inpos] & 4503599627370495L) << (61 - 52)); + out[4 + outpos] = (in[3 + inpos] >>> 52) + | ((in[4 + inpos] & 562949953421311L) << (61 - 49)); + out[5 + outpos] = (in[4 + inpos] >>> 49) + | ((in[5 + inpos] & 70368744177663L) << (61 - 46)); + out[6 + outpos] = (in[5 + inpos] >>> 46) + | ((in[6 + inpos] & 8796093022207L) << (61 - 43)); + out[7 + outpos] = (in[6 + inpos] >>> 43) + | ((in[7 + inpos] & 1099511627775L) << (61 - 40)); + out[8 + outpos] = (in[7 + inpos] >>> 40) + | ((in[8 + inpos] & 137438953471L) << (61 - 37)); + out[9 + outpos] = (in[8 + inpos] >>> 37) + | ((in[9 + inpos] & 17179869183L) << (61 - 34)); + out[10 + outpos] = (in[9 + inpos] >>> 34) + | ((in[10 + inpos] & 2147483647L) << (61 - 31)); + out[11 + outpos] = (in[10 + inpos] >>> 31) + | ((in[11 + inpos] & 268435455L) << (61 - 28)); + out[12 + outpos] = (in[11 + inpos] >>> 28) + | ((in[12 + inpos] & 33554431L) << (61 - 25)); + out[13 + outpos] = (in[12 + inpos] >>> 25) + | ((in[13 + inpos] & 4194303L) << (61 - 22)); + out[14 + outpos] = (in[13 + inpos] >>> 22) + | ((in[14 + inpos] & 524287L) << (61 - 19)); + out[15 + outpos] = (in[14 + inpos] >>> 19) + | ((in[15 + inpos] & 65535L) << (61 - 16)); + out[16 + outpos] = (in[15 + inpos] >>> 16) + | ((in[16 + inpos] & 8191L) << (61 - 13)); + out[17 + outpos] = (in[16 + inpos] >>> 13) + | ((in[17 + inpos] & 1023L) << (61 - 10)); + out[18 + outpos] = (in[17 + inpos] >>> 10) + | ((in[18 + inpos] & 127L) << (61 - 7)); + out[19 + outpos] = (in[18 + inpos] >>> 7) + | ((in[19 + inpos] & 15L) << (61 - 4)); + out[20 + outpos] = (in[19 + inpos] >>> 4) + | ((in[20 + inpos] & 1L) << (61 - 1)); + out[21 + outpos] = ((in[20 + inpos] >>> 1) & 2305843009213693951L); + out[22 + outpos] = (in[20 + inpos] >>> 62) + | ((in[21 + inpos] & 576460752303423487L) << (61 - 59)); + out[23 + outpos] = (in[21 + inpos] >>> 59) + | ((in[22 + inpos] & 72057594037927935L) << (61 - 56)); + out[24 + outpos] = (in[22 + inpos] >>> 56) + | ((in[23 + inpos] & 9007199254740991L) << (61 - 53)); + out[25 + outpos] = (in[23 + inpos] >>> 53) + | ((in[24 + inpos] & 1125899906842623L) << (61 - 50)); + out[26 + outpos] = (in[24 + inpos] >>> 50) + | ((in[25 + inpos] & 140737488355327L) << (61 - 47)); + out[27 + outpos] = (in[25 + inpos] >>> 47) + | ((in[26 + inpos] & 17592186044415L) << (61 - 44)); + out[28 + outpos] = (in[26 + inpos] >>> 44) + | ((in[27 + inpos] & 2199023255551L) << (61 - 41)); + out[29 + outpos] = (in[27 + inpos] >>> 41) + | ((in[28 + inpos] & 274877906943L) << (61 - 38)); + out[30 + outpos] = (in[28 + inpos] >>> 38) + | ((in[29 + inpos] & 34359738367L) << (61 - 35)); + out[31 + outpos] = (in[29 + inpos] >>> 35) + | ((in[30 + inpos] & 4294967295L) << (61 - 32)); + out[32 + outpos] = (in[30 + inpos] >>> 32) + | ((in[31 + inpos] & 536870911L) << (61 - 29)); + out[33 + outpos] = (in[31 + inpos] >>> 29) + | ((in[32 + inpos] & 67108863L) << (61 - 26)); + out[34 + outpos] = (in[32 + inpos] >>> 26) + | ((in[33 + inpos] & 8388607L) << (61 - 23)); + out[35 + outpos] = (in[33 + inpos] >>> 23) + | ((in[34 + inpos] & 1048575L) << (61 - 20)); + out[36 + outpos] = (in[34 + inpos] >>> 20) + | ((in[35 + inpos] & 131071L) << (61 - 17)); + out[37 + outpos] = (in[35 + inpos] >>> 17) + | ((in[36 + inpos] & 16383L) << (61 - 14)); + out[38 + outpos] = (in[36 + inpos] >>> 14) + | ((in[37 + inpos] & 2047L) << (61 - 11)); + out[39 + outpos] = (in[37 + inpos] >>> 11) + | ((in[38 + inpos] & 255L) << (61 - 8)); + out[40 + outpos] = (in[38 + inpos] >>> 8) + | ((in[39 + inpos] & 31L) << (61 - 5)); + out[41 + outpos] = (in[39 + inpos] >>> 5) + | ((in[40 + inpos] & 3L) << (61 - 2)); + out[42 + outpos] = ((in[40 + inpos] >>> 2) & 2305843009213693951L); + out[43 + outpos] = (in[40 + inpos] >>> 63) + | ((in[41 + inpos] & 1152921504606846975L) << (61 - 60)); + out[44 + outpos] = (in[41 + inpos] >>> 60) + | ((in[42 + inpos] & 144115188075855871L) << (61 - 57)); + out[45 + outpos] = (in[42 + inpos] >>> 57) + | ((in[43 + inpos] & 18014398509481983L) << (61 - 54)); + out[46 + outpos] = (in[43 + inpos] >>> 54) + | ((in[44 + inpos] & 2251799813685247L) << (61 - 51)); + out[47 + outpos] = (in[44 + inpos] >>> 51) + | ((in[45 + inpos] & 281474976710655L) << (61 - 48)); + out[48 + outpos] = (in[45 + inpos] >>> 48) + | ((in[46 + inpos] & 35184372088831L) << (61 - 45)); + out[49 + outpos] = (in[46 + inpos] >>> 45) + | ((in[47 + inpos] & 4398046511103L) << (61 - 42)); + out[50 + outpos] = (in[47 + inpos] >>> 42) + | ((in[48 + inpos] & 549755813887L) << (61 - 39)); + out[51 + outpos] = (in[48 + inpos] >>> 39) + | ((in[49 + inpos] & 68719476735L) << (61 - 36)); + out[52 + outpos] = (in[49 + inpos] >>> 36) + | ((in[50 + inpos] & 8589934591L) << (61 - 33)); + out[53 + outpos] = (in[50 + inpos] >>> 33) + | ((in[51 + inpos] & 1073741823L) << (61 - 30)); + out[54 + outpos] = (in[51 + inpos] >>> 30) + | ((in[52 + inpos] & 134217727L) << (61 - 27)); + out[55 + outpos] = (in[52 + inpos] >>> 27) + | ((in[53 + inpos] & 16777215L) << (61 - 24)); + out[56 + outpos] = (in[53 + inpos] >>> 24) + | ((in[54 + inpos] & 2097151L) << (61 - 21)); + out[57 + outpos] = (in[54 + inpos] >>> 21) + | ((in[55 + inpos] & 262143L) << (61 - 18)); + out[58 + outpos] = (in[55 + inpos] >>> 18) + | ((in[56 + inpos] & 32767L) << (61 - 15)); + out[59 + outpos] = (in[56 + inpos] >>> 15) + | ((in[57 + inpos] & 4095L) << (61 - 12)); + out[60 + outpos] = (in[57 + inpos] >>> 12) + | ((in[58 + inpos] & 511L) << (61 - 9)); + out[61 + outpos] = (in[58 + inpos] >>> 9) + | ((in[59 + inpos] & 63L) << (61 - 6)); + out[62 + outpos] = (in[59 + inpos] >>> 6) + | ((in[60 + inpos] & 7L) << (61 - 3)); + out[63 + outpos] = (in[60 + inpos] >>> 3); + } + + protected static void fastunpack62(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 4611686018427387903L); + out[1 + outpos] = (in[inpos] >>> 62) + | ((in[1 + inpos] & 1152921504606846975L) << (62 - 60)); + out[2 + outpos] = (in[1 + inpos] >>> 60) + | ((in[2 + inpos] & 288230376151711743L) << (62 - 58)); + out[3 + outpos] = (in[2 + inpos] >>> 58) + | ((in[3 + inpos] & 72057594037927935L) << (62 - 56)); + out[4 + outpos] = (in[3 + inpos] >>> 56) + | ((in[4 + inpos] & 18014398509481983L) << (62 - 54)); + out[5 + outpos] = (in[4 + inpos] >>> 54) + | ((in[5 + inpos] & 4503599627370495L) << (62 - 52)); + out[6 + outpos] = (in[5 + inpos] >>> 52) + | ((in[6 + inpos] & 1125899906842623L) << (62 - 50)); + out[7 + outpos] = (in[6 + inpos] >>> 50) + | ((in[7 + inpos] & 281474976710655L) << (62 - 48)); + out[8 + outpos] = (in[7 + inpos] >>> 48) + | ((in[8 + inpos] & 70368744177663L) << (62 - 46)); + out[9 + outpos] = (in[8 + inpos] >>> 46) + | ((in[9 + inpos] & 17592186044415L) << (62 - 44)); + out[10 + outpos] = (in[9 + inpos] >>> 44) + | ((in[10 + inpos] & 4398046511103L) << (62 - 42)); + out[11 + outpos] = (in[10 + inpos] >>> 42) + | ((in[11 + inpos] & 1099511627775L) << (62 - 40)); + out[12 + outpos] = (in[11 + inpos] >>> 40) + | ((in[12 + inpos] & 274877906943L) << (62 - 38)); + out[13 + outpos] = (in[12 + inpos] >>> 38) + | ((in[13 + inpos] & 68719476735L) << (62 - 36)); + out[14 + outpos] = (in[13 + inpos] >>> 36) + | ((in[14 + inpos] & 17179869183L) << (62 - 34)); + out[15 + outpos] = (in[14 + inpos] >>> 34) + | ((in[15 + inpos] & 4294967295L) << (62 - 32)); + out[16 + outpos] = (in[15 + inpos] >>> 32) + | ((in[16 + inpos] & 1073741823L) << (62 - 30)); + out[17 + outpos] = (in[16 + inpos] >>> 30) + | ((in[17 + inpos] & 268435455L) << (62 - 28)); + out[18 + outpos] = (in[17 + inpos] >>> 28) + | ((in[18 + inpos] & 67108863L) << (62 - 26)); + out[19 + outpos] = (in[18 + inpos] >>> 26) + | ((in[19 + inpos] & 16777215L) << (62 - 24)); + out[20 + outpos] = (in[19 + inpos] >>> 24) + | ((in[20 + inpos] & 4194303L) << (62 - 22)); + out[21 + outpos] = (in[20 + inpos] >>> 22) + | ((in[21 + inpos] & 1048575L) << (62 - 20)); + out[22 + outpos] = (in[21 + inpos] >>> 20) + | ((in[22 + inpos] & 262143L) << (62 - 18)); + out[23 + outpos] = (in[22 + inpos] >>> 18) + | ((in[23 + inpos] & 65535L) << (62 - 16)); + out[24 + outpos] = (in[23 + inpos] >>> 16) + | ((in[24 + inpos] & 16383L) << (62 - 14)); + out[25 + outpos] = (in[24 + inpos] >>> 14) + | ((in[25 + inpos] & 4095L) << (62 - 12)); + out[26 + outpos] = (in[25 + inpos] >>> 12) + | ((in[26 + inpos] & 1023L) << (62 - 10)); + out[27 + outpos] = (in[26 + inpos] >>> 10) + | ((in[27 + inpos] & 255L) << (62 - 8)); + out[28 + outpos] = (in[27 + inpos] >>> 8) + | ((in[28 + inpos] & 63L) << (62 - 6)); + out[29 + outpos] = (in[28 + inpos] >>> 6) + | ((in[29 + inpos] & 15L) << (62 - 4)); + out[30 + outpos] = (in[29 + inpos] >>> 4) + | ((in[30 + inpos] & 3L) << (62 - 2)); + out[31 + outpos] = (in[30 + inpos] >>> 2); + out[32 + outpos] = (in[31 + inpos] & 4611686018427387903L); + out[33 + outpos] = (in[31 + inpos] >>> 62) + | ((in[32 + inpos] & 1152921504606846975L) << (62 - 60)); + out[34 + outpos] = (in[32 + inpos] >>> 60) + | ((in[33 + inpos] & 288230376151711743L) << (62 - 58)); + out[35 + outpos] = (in[33 + inpos] >>> 58) + | ((in[34 + inpos] & 72057594037927935L) << (62 - 56)); + out[36 + outpos] = (in[34 + inpos] >>> 56) + | ((in[35 + inpos] & 18014398509481983L) << (62 - 54)); + out[37 + outpos] = (in[35 + inpos] >>> 54) + | ((in[36 + inpos] & 4503599627370495L) << (62 - 52)); + out[38 + outpos] = (in[36 + inpos] >>> 52) + | ((in[37 + inpos] & 1125899906842623L) << (62 - 50)); + out[39 + outpos] = (in[37 + inpos] >>> 50) + | ((in[38 + inpos] & 281474976710655L) << (62 - 48)); + out[40 + outpos] = (in[38 + inpos] >>> 48) + | ((in[39 + inpos] & 70368744177663L) << (62 - 46)); + out[41 + outpos] = (in[39 + inpos] >>> 46) + | ((in[40 + inpos] & 17592186044415L) << (62 - 44)); + out[42 + outpos] = (in[40 + inpos] >>> 44) + | ((in[41 + inpos] & 4398046511103L) << (62 - 42)); + out[43 + outpos] = (in[41 + inpos] >>> 42) + | ((in[42 + inpos] & 1099511627775L) << (62 - 40)); + out[44 + outpos] = (in[42 + inpos] >>> 40) + | ((in[43 + inpos] & 274877906943L) << (62 - 38)); + out[45 + outpos] = (in[43 + inpos] >>> 38) + | ((in[44 + inpos] & 68719476735L) << (62 - 36)); + out[46 + outpos] = (in[44 + inpos] >>> 36) + | ((in[45 + inpos] & 17179869183L) << (62 - 34)); + out[47 + outpos] = (in[45 + inpos] >>> 34) + | ((in[46 + inpos] & 4294967295L) << (62 - 32)); + out[48 + outpos] = (in[46 + inpos] >>> 32) + | ((in[47 + inpos] & 1073741823L) << (62 - 30)); + out[49 + outpos] = (in[47 + inpos] >>> 30) + | ((in[48 + inpos] & 268435455L) << (62 - 28)); + out[50 + outpos] = (in[48 + inpos] >>> 28) + | ((in[49 + inpos] & 67108863L) << (62 - 26)); + out[51 + outpos] = (in[49 + inpos] >>> 26) + | ((in[50 + inpos] & 16777215L) << (62 - 24)); + out[52 + outpos] = (in[50 + inpos] >>> 24) + | ((in[51 + inpos] & 4194303L) << (62 - 22)); + out[53 + outpos] = (in[51 + inpos] >>> 22) + | ((in[52 + inpos] & 1048575L) << (62 - 20)); + out[54 + outpos] = (in[52 + inpos] >>> 20) + | ((in[53 + inpos] & 262143L) << (62 - 18)); + out[55 + outpos] = (in[53 + inpos] >>> 18) + | ((in[54 + inpos] & 65535L) << (62 - 16)); + out[56 + outpos] = (in[54 + inpos] >>> 16) + | ((in[55 + inpos] & 16383L) << (62 - 14)); + out[57 + outpos] = (in[55 + inpos] >>> 14) + | ((in[56 + inpos] & 4095L) << (62 - 12)); + out[58 + outpos] = (in[56 + inpos] >>> 12) + | ((in[57 + inpos] & 1023L) << (62 - 10)); + out[59 + outpos] = (in[57 + inpos] >>> 10) + | ((in[58 + inpos] & 255L) << (62 - 8)); + out[60 + outpos] = (in[58 + inpos] >>> 8) + | ((in[59 + inpos] & 63L) << (62 - 6)); + out[61 + outpos] = (in[59 + inpos] >>> 6) + | ((in[60 + inpos] & 15L) << (62 - 4)); + out[62 + outpos] = (in[60 + inpos] >>> 4) + | ((in[61 + inpos] & 3L) << (62 - 2)); + out[63 + outpos] = (in[61 + inpos] >>> 2); + } + + protected static void fastunpack63(final long[] in, int inpos, + final long[] out, int outpos) { + out[outpos] = (in[inpos] & 9223372036854775807L); + out[1 + outpos] = (in[inpos] >>> 63) + | ((in[1 + inpos] & 4611686018427387903L) << (63 - 62)); + out[2 + outpos] = (in[1 + inpos] >>> 62) + | ((in[2 + inpos] & 2305843009213693951L) << (63 - 61)); + out[3 + outpos] = (in[2 + inpos] >>> 61) + | ((in[3 + inpos] & 1152921504606846975L) << (63 - 60)); + out[4 + outpos] = (in[3 + inpos] >>> 60) + | ((in[4 + inpos] & 576460752303423487L) << (63 - 59)); + out[5 + outpos] = (in[4 + inpos] >>> 59) + | ((in[5 + inpos] & 288230376151711743L) << (63 - 58)); + out[6 + outpos] = (in[5 + inpos] >>> 58) + | ((in[6 + inpos] & 144115188075855871L) << (63 - 57)); + out[7 + outpos] = (in[6 + inpos] >>> 57) + | ((in[7 + inpos] & 72057594037927935L) << (63 - 56)); + out[8 + outpos] = (in[7 + inpos] >>> 56) + | ((in[8 + inpos] & 36028797018963967L) << (63 - 55)); + out[9 + outpos] = (in[8 + inpos] >>> 55) + | ((in[9 + inpos] & 18014398509481983L) << (63 - 54)); + out[10 + outpos] = (in[9 + inpos] >>> 54) + | ((in[10 + inpos] & 9007199254740991L) << (63 - 53)); + out[11 + outpos] = (in[10 + inpos] >>> 53) + | ((in[11 + inpos] & 4503599627370495L) << (63 - 52)); + out[12 + outpos] = (in[11 + inpos] >>> 52) + | ((in[12 + inpos] & 2251799813685247L) << (63 - 51)); + out[13 + outpos] = (in[12 + inpos] >>> 51) + | ((in[13 + inpos] & 1125899906842623L) << (63 - 50)); + out[14 + outpos] = (in[13 + inpos] >>> 50) + | ((in[14 + inpos] & 562949953421311L) << (63 - 49)); + out[15 + outpos] = (in[14 + inpos] >>> 49) + | ((in[15 + inpos] & 281474976710655L) << (63 - 48)); + out[16 + outpos] = (in[15 + inpos] >>> 48) + | ((in[16 + inpos] & 140737488355327L) << (63 - 47)); + out[17 + outpos] = (in[16 + inpos] >>> 47) + | ((in[17 + inpos] & 70368744177663L) << (63 - 46)); + out[18 + outpos] = (in[17 + inpos] >>> 46) + | ((in[18 + inpos] & 35184372088831L) << (63 - 45)); + out[19 + outpos] = (in[18 + inpos] >>> 45) + | ((in[19 + inpos] & 17592186044415L) << (63 - 44)); + out[20 + outpos] = (in[19 + inpos] >>> 44) + | ((in[20 + inpos] & 8796093022207L) << (63 - 43)); + out[21 + outpos] = (in[20 + inpos] >>> 43) + | ((in[21 + inpos] & 4398046511103L) << (63 - 42)); + out[22 + outpos] = (in[21 + inpos] >>> 42) + | ((in[22 + inpos] & 2199023255551L) << (63 - 41)); + out[23 + outpos] = (in[22 + inpos] >>> 41) + | ((in[23 + inpos] & 1099511627775L) << (63 - 40)); + out[24 + outpos] = (in[23 + inpos] >>> 40) + | ((in[24 + inpos] & 549755813887L) << (63 - 39)); + out[25 + outpos] = (in[24 + inpos] >>> 39) + | ((in[25 + inpos] & 274877906943L) << (63 - 38)); + out[26 + outpos] = (in[25 + inpos] >>> 38) + | ((in[26 + inpos] & 137438953471L) << (63 - 37)); + out[27 + outpos] = (in[26 + inpos] >>> 37) + | ((in[27 + inpos] & 68719476735L) << (63 - 36)); + out[28 + outpos] = (in[27 + inpos] >>> 36) + | ((in[28 + inpos] & 34359738367L) << (63 - 35)); + out[29 + outpos] = (in[28 + inpos] >>> 35) + | ((in[29 + inpos] & 17179869183L) << (63 - 34)); + out[30 + outpos] = (in[29 + inpos] >>> 34) + | ((in[30 + inpos] & 8589934591L) << (63 - 33)); + out[31 + outpos] = (in[30 + inpos] >>> 33) + | ((in[31 + inpos] & 4294967295L) << (63 - 32)); + out[32 + outpos] = (in[31 + inpos] >>> 32) + | ((in[32 + inpos] & 2147483647L) << (63 - 31)); + out[33 + outpos] = (in[32 + inpos] >>> 31) + | ((in[33 + inpos] & 1073741823L) << (63 - 30)); + out[34 + outpos] = (in[33 + inpos] >>> 30) + | ((in[34 + inpos] & 536870911L) << (63 - 29)); + out[35 + outpos] = (in[34 + inpos] >>> 29) + | ((in[35 + inpos] & 268435455L) << (63 - 28)); + out[36 + outpos] = (in[35 + inpos] >>> 28) + | ((in[36 + inpos] & 134217727L) << (63 - 27)); + out[37 + outpos] = (in[36 + inpos] >>> 27) + | ((in[37 + inpos] & 67108863L) << (63 - 26)); + out[38 + outpos] = (in[37 + inpos] >>> 26) + | ((in[38 + inpos] & 33554431L) << (63 - 25)); + out[39 + outpos] = (in[38 + inpos] >>> 25) + | ((in[39 + inpos] & 16777215L) << (63 - 24)); + out[40 + outpos] = (in[39 + inpos] >>> 24) + | ((in[40 + inpos] & 8388607L) << (63 - 23)); + out[41 + outpos] = (in[40 + inpos] >>> 23) + | ((in[41 + inpos] & 4194303L) << (63 - 22)); + out[42 + outpos] = (in[41 + inpos] >>> 22) + | ((in[42 + inpos] & 2097151L) << (63 - 21)); + out[43 + outpos] = (in[42 + inpos] >>> 21) + | ((in[43 + inpos] & 1048575L) << (63 - 20)); + out[44 + outpos] = (in[43 + inpos] >>> 20) + | ((in[44 + inpos] & 524287L) << (63 - 19)); + out[45 + outpos] = (in[44 + inpos] >>> 19) + | ((in[45 + inpos] & 262143L) << (63 - 18)); + out[46 + outpos] = (in[45 + inpos] >>> 18) + | ((in[46 + inpos] & 131071L) << (63 - 17)); + out[47 + outpos] = (in[46 + inpos] >>> 17) + | ((in[47 + inpos] & 65535L) << (63 - 16)); + out[48 + outpos] = (in[47 + inpos] >>> 16) + | ((in[48 + inpos] & 32767L) << (63 - 15)); + out[49 + outpos] = (in[48 + inpos] >>> 15) + | ((in[49 + inpos] & 16383L) << (63 - 14)); + out[50 + outpos] = (in[49 + inpos] >>> 14) + | ((in[50 + inpos] & 8191L) << (63 - 13)); + out[51 + outpos] = (in[50 + inpos] >>> 13) + | ((in[51 + inpos] & 4095L) << (63 - 12)); + out[52 + outpos] = (in[51 + inpos] >>> 12) + | ((in[52 + inpos] & 2047L) << (63 - 11)); + out[53 + outpos] = (in[52 + inpos] >>> 11) + | ((in[53 + inpos] & 1023L) << (63 - 10)); + out[54 + outpos] = (in[53 + inpos] >>> 10) + | ((in[54 + inpos] & 511L) << (63 - 9)); + out[55 + outpos] = (in[54 + inpos] >>> 9) + | ((in[55 + inpos] & 255L) << (63 - 8)); + out[56 + outpos] = (in[55 + inpos] >>> 8) + | ((in[56 + inpos] & 127L) << (63 - 7)); + out[57 + outpos] = (in[56 + inpos] >>> 7) + | ((in[57 + inpos] & 63L) << (63 - 6)); + out[58 + outpos] = (in[57 + inpos] >>> 6) + | ((in[58 + inpos] & 31L) << (63 - 5)); + out[59 + outpos] = (in[58 + inpos] >>> 5) + | ((in[59 + inpos] & 15L) << (63 - 4)); + out[60 + outpos] = (in[59 + inpos] >>> 4) + | ((in[60 + inpos] & 7L) << (63 - 3)); + out[61 + outpos] = (in[60 + inpos] >>> 3) + | ((in[61 + inpos] & 3L) << (63 - 2)); + out[62 + outpos] = (in[61 + inpos] >>> 2) + | ((in[62 + inpos] & 1L) << (63 - 1)); + out[63 + outpos] = (in[62 + inpos] >>> 1); + } protected static void fastunpack64(final long[] in, int inpos, final long[] out, int outpos) { diff --git a/src/test/java/me/lemire/longcompression/TestLongBitPacking.java b/src/test/java/me/lemire/longcompression/TestLongBitPacking.java new file mode 100644 index 0000000..a713faa --- /dev/null +++ b/src/test/java/me/lemire/longcompression/TestLongBitPacking.java @@ -0,0 +1,140 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ + +package me.lemire.longcompression; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; +import java.util.Random; + +import org.junit.Test; + +/** + * Validates the unrolled {@link LongBitPacking} kernels. + */ +public class TestLongBitPacking { + + private static final int BLOCK = 64; + private static final int TRIALS = 64; + + private static long[] randomBlock(Random random, int bit) { + long mask; + if (bit == 64) { + mask = -1L; + } else { + mask = (1L << bit) - 1; + } + long[] data = new long[BLOCK]; + for (int i = 0; i < BLOCK; i++) { + data[i] = random.nextLong() & mask; + } + return data; + } + + @Test + public void roundTrip() { + Random random = new Random(0); + for (int bit = 0; bit <= 64; bit++) { + for (int trial = 0; trial < TRIALS; trial++) { + long[] data = randomBlock(random, bit); + long[] packed = new long[bit]; + LongBitPacking.fastpackwithoutmask(data, 0, packed, 0, bit); + long[] unpacked = new long[BLOCK]; + LongBitPacking.fastunpack(packed, 0, unpacked, 0, bit); + assertArrayEquals("bit width " + bit, data, unpacked); + } + } + } + + @Test + public void layoutMatchesSlowPack() { + Random random = new Random(1); + for (int bit = 1; bit < 64; bit++) { + for (int trial = 0; trial < TRIALS; trial++) { + long[] data = randomBlock(random, bit); + long[] fast = new long[bit]; + long[] slow = new long[bit]; + LongBitPacking.fastpackwithoutmask(data, 0, fast, 0, bit); + LongBitPacking.slowpackwithoutmask(data, 0, slow, 0, bit); + assertArrayEquals("bit width " + bit, slow, fast); + } + } + } + + @Test + public void layoutMatchesSlowUnpack() { + Random random = new Random(2); + for (int bit = 1; bit < 64; bit++) { + for (int trial = 0; trial < TRIALS; trial++) { + long[] data = randomBlock(random, bit); + long[] packed = new long[bit]; + LongBitPacking.slowpackwithoutmask(data, 0, packed, 0, bit); + long[] fast = new long[BLOCK]; + long[] slow = new long[BLOCK]; + LongBitPacking.fastunpack(packed, 0, fast, 0, bit); + LongBitPacking.slowunpack(packed, 0, slow, 0, bit); + assertArrayEquals("bit width " + bit, slow, fast); + } + } + } + + @Test + public void extremeValues() { + for (int bit = 0; bit <= 64; bit++) { + long mask; + if (bit == 64) { + mask = -1L; + } else { + mask = (1L << bit) - 1; + } + long[] data = new long[BLOCK]; + Arrays.fill(data, mask); + long[] packed = new long[bit]; + LongBitPacking.fastpackwithoutmask(data, 0, packed, 0, bit); + long[] unpacked = new long[BLOCK]; + LongBitPacking.fastunpack(packed, 0, unpacked, 0, bit); + assertArrayEquals("bit width " + bit, data, unpacked); + if (bit > 0 && bit < 64) { + long[] slow = new long[bit]; + LongBitPacking.slowpackwithoutmask(data, 0, slow, 0, bit); + assertArrayEquals("bit width " + bit, slow, packed); + } + } + } + + @Test + public void roundTripWithOffsets() { + Random random = new Random(3); + int inOffset = 7; + int outOffset = 5; + long sentinel = 0x5555555555555555L; + for (int bit = 0; bit <= 64; bit++) { + long[] data = randomBlock(random, bit); + long[] in = new long[BLOCK + inOffset]; + System.arraycopy(data, 0, in, inOffset, BLOCK); + long[] packed = new long[bit + outOffset]; + Arrays.fill(packed, 0, outOffset, sentinel); + LongBitPacking.fastpackwithoutmask(in, inOffset, packed, outOffset, bit); + long[] unpacked = new long[BLOCK + inOffset]; + Arrays.fill(unpacked, 0, inOffset, sentinel); + LongBitPacking.fastunpack(packed, outOffset, unpacked, inOffset, bit); + long[] result = new long[BLOCK]; + System.arraycopy(unpacked, inOffset, result, 0, BLOCK); + assertArrayEquals("bit width " + bit, data, result); + for (int i = 0; i < outOffset; i++) { + assertEquals("pack wrote before outpos at bit " + bit, + sentinel, packed[i]); + } + for (int i = 0; i < inOffset; i++) { + assertEquals("unpack wrote before outpos at bit " + bit, + sentinel, unpacked[i]); + } + } + } +} From aa73c533bec074f9d1241812cb963fbb76e48a8f Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Wed, 17 Jun 2026 14:44:55 +0000 Subject: [PATCH 401/412] [maven-release-plugin] prepare release JavaFastPFOR-0.3.12 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 7783d45..a2cb26d 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.12-SNAPSHOT + 0.3.12 jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - HEAD + JavaFastPFOR-0.3.12 From 933a84da83dd497d0ff77b2e976839a6a2806f03 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Wed, 17 Jun 2026 14:44:58 +0000 Subject: [PATCH 402/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index a2cb26d..180a49d 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.12 + 0.3.13-SNAPSHOT jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - JavaFastPFOR-0.3.12 + HEAD From 40e2c33e48ee810c8062a779915c7c79b3ef9685 Mon Sep 17 00:00:00 2001 From: Raunaq Morarka Date: Mon, 22 Jun 2026 11:53:39 +0530 Subject: [PATCH 403/412] Fix VectorFastPFOR corruption on reused output buffers slowpack OR-accumulates into the output, so a reused buffer kept stale bits. Zero the target words first. --- pom.xml | 12 +++++ .../vector/VectorBitPacker.java | 6 +++ .../vector/VectorFastPFORTest.java | 49 +++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 src/test/java/me/lemire/integercompression/vector/VectorFastPFORTest.java diff --git a/pom.xml b/pom.xml index 180a49d..ccdc909 100644 --- a/pom.xml +++ b/pom.xml @@ -105,6 +105,18 @@
    + + default-testCompile + test-compile + + testCompile + + + + me/lemire/integercompression/vector/* + + + - -
    org.apache.felix diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index f134601..4d652dd 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -2,11 +2,13 @@ // SPDX-License-Identifier: Apache-2.0 module me.lemire.integercompression { - // This is currently only for advanced users: - // requires jdk.incubator.vector; + // Optional at runtime: only consumers of the vector package (VectorFastPFOR) + // need jdk.incubator.vector resolved (e.g. --add-modules jdk.incubator.vector). + // Scalar consumers resolve without it. + requires static jdk.incubator.vector; exports me.lemire.integercompression; exports me.lemire.longcompression; exports me.lemire.longcompression.differential; exports me.lemire.integercompression.differential; - // exports me.lemire.integercompression.vector; + exports me.lemire.integercompression.vector; } From 9093b1ad4e3a526a333825b2de1392f064251227 Mon Sep 17 00:00:00 2001 From: Raunaq Morarka Date: Fri, 19 Jun 2026 22:58:51 +0530 Subject: [PATCH 407/412] Cover VectorFastPFOR with the shared codec test suites SkippableBasicTest exercises maxHeadlessCompressedLength, so implement it (mirroring FastPFOR) rather than throwing. --- .../lemire/integercompression/vector/VectorFastPFOR.java | 8 +++++++- src/test/java/me/lemire/integercompression/BasicTest.java | 2 ++ .../me/lemire/integercompression/SkippableBasicTest.java | 2 ++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/me/lemire/integercompression/vector/VectorFastPFOR.java b/src/main/java/me/lemire/integercompression/vector/VectorFastPFOR.java index adbe432..cc755c8 100644 --- a/src/main/java/me/lemire/integercompression/vector/VectorFastPFOR.java +++ b/src/main/java/me/lemire/integercompression/vector/VectorFastPFOR.java @@ -54,6 +54,8 @@ */ public class VectorFastPFOR implements IntegerCODEC, SkippableIntegerCODEC { private final static int OVERHEAD_OF_EACH_EXCEPT = 8; + private static final int OVERHEAD_OF_EACH_PAGE_IN_INTS = 36; + private static final int OVERHEAD_OF_EACH_BLOCK_IN_INTS = 1; public final static int DEFAULT_PAGE_SIZE = 64 << 10; public final static int BLOCK_SIZE = 256; @@ -257,7 +259,11 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, @Override public int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength) { - throw new UnsupportedOperationException("Calculating the max compressed length is not supported yet."); + inlength = inlength - inlength % BLOCK_SIZE; + int pageCount = (inlength + pageSize - 1) / pageSize; + int blockCount = inlength / BLOCK_SIZE; + int blockSizeInInts = OVERHEAD_OF_EACH_BLOCK_IN_INTS + BLOCK_SIZE; + return OVERHEAD_OF_EACH_PAGE_IN_INTS * pageCount + blockSizeInInts * blockCount + 24; } private void loadMetaData(int[] in, int inexcept, int bytesize) { diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index b29ae0d..6743017 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -17,6 +17,7 @@ import me.lemire.integercompression.differential.IntegratedVariableByte; import me.lemire.integercompression.differential.XorBinaryPacking; import me.lemire.integercompression.synth.ClusteredDataGenerator; +import me.lemire.integercompression.vector.VectorFastPFOR; import org.junit.Test; @@ -43,6 +44,7 @@ public class BasicTest { new Composition(new OptPFDS16(), new VariableByte()), new Composition(new FastPFOR128(), new VariableByte()), new Composition(new FastPFOR(), new VariableByte()), + new Composition(new VectorFastPFOR(), new VariableByte()), new Simple9(), new Simple16(), new GroupSimple9(), diff --git a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java index 881dada..ca919d4 100644 --- a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java +++ b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java @@ -13,6 +13,7 @@ import me.lemire.integercompression.differential.IntegratedVariableByte; import me.lemire.integercompression.differential.SkippableIntegratedComposition; import me.lemire.integercompression.differential.SkippableIntegratedIntegerCODEC; +import me.lemire.integercompression.vector.VectorFastPFOR; import org.junit.Test; import static org.junit.Assert.assertArrayEquals; @@ -37,6 +38,7 @@ public class SkippableBasicTest { new SkippableComposition(new OptPFDS16(), new VariableByte()), new SkippableComposition(new FastPFOR128(), new VariableByte()), new SkippableComposition(new FastPFOR(), new VariableByte()), + new SkippableComposition(new VectorFastPFOR(), new VariableByte()), new Simple9(), new Simple16() }; From e291cf369643c879938e9d10bb0f16b38ecda626 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Tue, 23 Jun 2026 03:36:50 +0000 Subject: [PATCH 408/412] [maven-release-plugin] prepare release JavaFastPFOR-0.3.13 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 5594a43..e1ea6fc 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.13-SNAPSHOT + 0.3.13 jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - HEAD + JavaFastPFOR-0.3.13 From acc89e2e7b1defc748c1e4fe0cd20c2113280e66 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Tue, 23 Jun 2026 03:36:52 +0000 Subject: [PATCH 409/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index e1ea6fc..5535a25 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.13 + 0.3.14-SNAPSHOT jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - JavaFastPFOR-0.3.13 + HEAD From 7d7c36bab86eb6432989943ac8e6a2cfb19ff57f Mon Sep 17 00:00:00 2001 From: Raunaq Morarka Date: Wed, 24 Jun 2026 17:54:42 +0530 Subject: [PATCH 410/412] Add vectorized BinaryPacking int codec BinaryPacking using the Vector API pack/unpack kernels: each block is packed at its own maxbits with no exceptions. The maxbits computation is vectorized via an OR-reduction over the block. On Graviton4 (Neoverse V2, SVE2 128-bit), full codec round trip vs scalar BinaryPacking over 256K random ints: compress 2.5-3.0x faster across all bit widths; decompress 4.0x at low widths, tapering to 2.4x near width 31. --- .../vector/VectorBinaryPacking.java | 166 ++++++++++++++++++ .../lemire/integercompression/BasicTest.java | 2 + .../SkippableBasicTest.java | 4 + .../vector/VectorBinaryPackingTest.java | 48 +++++ 4 files changed, 220 insertions(+) create mode 100644 src/main/java/me/lemire/integercompression/vector/VectorBinaryPacking.java create mode 100644 src/test/java/me/lemire/integercompression/vector/VectorBinaryPackingTest.java diff --git a/src/main/java/me/lemire/integercompression/vector/VectorBinaryPacking.java b/src/main/java/me/lemire/integercompression/vector/VectorBinaryPacking.java new file mode 100644 index 0000000..6517357 --- /dev/null +++ b/src/main/java/me/lemire/integercompression/vector/VectorBinaryPacking.java @@ -0,0 +1,166 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + * (c) Intel Corp. (for Vector implementation) + */ +package me.lemire.integercompression.vector; + +import jdk.incubator.vector.IntVector; +import jdk.incubator.vector.VectorOperators; +import jdk.incubator.vector.VectorSpecies; +import me.lemire.integercompression.IntWrapper; +import me.lemire.integercompression.IntegerCODEC; +import me.lemire.integercompression.SkippableIntegerCODEC; +import me.lemire.integercompression.Util; +import me.lemire.integercompression.vector.VectorBitPackerKernels.LaneWidth; + +/** + * BinaryPacking using the Vector API pack/unpack kernels: each block is packed at + * its own maximum bit width with no exceptions, so encoding is a single maxbits + * pass plus a vectorized pack. It encodes integers in blocks of BLOCK_SIZE + * integers. For arrays containing an arbitrary number of integers, you should use + * it in conjunction with another CODEC: + * + *
    IntegerCODEC ic =
    + *  new Composition(new VectorBinaryPacking(), new VariableByte()).
    + * + * Note that this does not use differential coding: if you are working on sorted + * lists, use IntegratedBinaryPacking instead. + * + * Blocks are packed in a vectorized layout that differs by hardware vector lane + * width. The lane width is fixed at construction and not stored on the wire, so a + * stream must be decoded at the same lane width it was encoded at. The default + * constructor packs at this machine's preferred width; the {@code (LaneWidth)} + * constructor pins a width so a heterogeneous cluster can decode on its narrowest + * node. + * + * @author Daniel Lemire + */ +public final class VectorBinaryPacking implements IntegerCODEC, SkippableIntegerCODEC { + public final static int BLOCK_SIZE = 256; + private static final int MAX_BIT_WIDTH = Integer.SIZE; + // Output words a packed block occupies per bit of width (BLOCK_SIZE / Integer.SIZE). + private static final int WORDS_PER_BLOCK_BIT = BLOCK_SIZE / Integer.SIZE; + // Blocks sharing one packed header word (four max-bit values, one byte each). + private static final int GROUP_SIZE_IN_BLOCKS = 4; + // The OR-reduction result is independent of vector width, so it uses the widest + // available species regardless of the wire lane width. + private static final VectorSpecies MAXBITS_SPECIES = IntVector.SPECIES_PREFERRED; + + private final VectorBitPackerKernels kernel; + + /** Packs at this machine's preferred vector lane width. */ + public VectorBinaryPacking() { + this(LaneWidth.PREFERRED); + } + + /** Pins the lane width so a heterogeneous cluster can decode on its narrowest node. */ + public VectorBinaryPacking(LaneWidth laneWidth) { + this.kernel = laneWidth.kernel; + } + + @Override + public void compress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); + if (inlength == 0) + return; + out[outpos.get()] = inlength; + outpos.increment(); + headlessCompress(in, inpos, inlength, out, outpos); + } + + @Override + public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + inlength = Util.greatestMultiple(inlength, BLOCK_SIZE); + int tmpoutpos = outpos.get(); + int s = inpos.get(); + for (; s + BLOCK_SIZE * 4 - 1 < inpos.get() + inlength; s += BLOCK_SIZE * 4) { + final int mbits1 = maxbits(in, s); + final int mbits2 = maxbits(in, s + BLOCK_SIZE); + final int mbits3 = maxbits(in, s + 2 * BLOCK_SIZE); + final int mbits4 = maxbits(in, s + 3 * BLOCK_SIZE); + out[tmpoutpos++] = (mbits1 << 24) | (mbits2 << 16) | (mbits3 << 8) | (mbits4); + kernel.fastpackNoMask(in, s, out, tmpoutpos, mbits1); + tmpoutpos += WORDS_PER_BLOCK_BIT * mbits1; + kernel.fastpackNoMask(in, s + BLOCK_SIZE, out, tmpoutpos, mbits2); + tmpoutpos += WORDS_PER_BLOCK_BIT * mbits2; + kernel.fastpackNoMask(in, s + 2 * BLOCK_SIZE, out, tmpoutpos, mbits3); + tmpoutpos += WORDS_PER_BLOCK_BIT * mbits3; + kernel.fastpackNoMask(in, s + 3 * BLOCK_SIZE, out, tmpoutpos, mbits4); + tmpoutpos += WORDS_PER_BLOCK_BIT * mbits4; + } + for (; s < inpos.get() + inlength; s += BLOCK_SIZE) { + final int mbits = maxbits(in, s); + out[tmpoutpos++] = mbits; + kernel.fastpackNoMask(in, s, out, tmpoutpos, mbits); + tmpoutpos += WORDS_PER_BLOCK_BIT * mbits; + } + inpos.add(inlength); + outpos.set(tmpoutpos); + } + + @Override + public void uncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos) { + if (inlength == 0) + return; + final int outlength = in[inpos.get()]; + inpos.increment(); + headlessUncompress(in, inpos, inlength, out, outpos, outlength); + } + + @Override + public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num) { + final int outlength = Util.greatestMultiple(num, BLOCK_SIZE); + int tmpinpos = inpos.get(); + int s = outpos.get(); + for (; s + BLOCK_SIZE * 4 - 1 < outpos.get() + outlength; s += BLOCK_SIZE * 4) { + final int mbits1 = (in[tmpinpos] >>> 24); + final int mbits2 = (in[tmpinpos] >>> 16) & 0xFF; + final int mbits3 = (in[tmpinpos] >>> 8) & 0xFF; + final int mbits4 = (in[tmpinpos]) & 0xFF; + ++tmpinpos; + kernel.fastunpack(in, tmpinpos, out, s, mbits1); + tmpinpos += WORDS_PER_BLOCK_BIT * mbits1; + kernel.fastunpack(in, tmpinpos, out, s + BLOCK_SIZE, mbits2); + tmpinpos += WORDS_PER_BLOCK_BIT * mbits2; + kernel.fastunpack(in, tmpinpos, out, s + 2 * BLOCK_SIZE, mbits3); + tmpinpos += WORDS_PER_BLOCK_BIT * mbits3; + kernel.fastunpack(in, tmpinpos, out, s + 3 * BLOCK_SIZE, mbits4); + tmpinpos += WORDS_PER_BLOCK_BIT * mbits4; + } + for (; s < outpos.get() + outlength; s += BLOCK_SIZE) { + final int mbits = in[tmpinpos]; + ++tmpinpos; + kernel.fastunpack(in, tmpinpos, out, s, mbits); + tmpinpos += WORDS_PER_BLOCK_BIT * mbits; + } + outpos.add(outlength); + inpos.set(tmpinpos); + } + + @Override + public int maxHeadlessCompressedLength(IntWrapper compressedPositions, int inlength) { + int blockCount = inlength / BLOCK_SIZE; + int headersSizeInInts = blockCount / GROUP_SIZE_IN_BLOCKS + (blockCount % GROUP_SIZE_IN_BLOCKS); + int blocksSizeInInts = blockCount * MAX_BIT_WIDTH * WORDS_PER_BLOCK_BIT; + compressedPositions.add(blockCount * BLOCK_SIZE); + return headersSizeInInts + blocksSizeInInts; + } + + // Maximum bit width needed for a BLOCK_SIZE-value block: OR-reduce the values, then count significant bits. + private static int maxbits(int[] in, int pos) { + IntVector accumulator = IntVector.zero(MAXBITS_SPECIES); + for (int offset = 0; offset < BLOCK_SIZE; offset += MAXBITS_SPECIES.length()) { + accumulator = accumulator.or(IntVector.fromArray(MAXBITS_SPECIES, in, pos + offset)); + } + int mask = accumulator.reduceLanes(VectorOperators.OR); + return Integer.SIZE - Integer.numberOfLeadingZeros(mask); + } + + @Override + public String toString() { + return this.getClass().getSimpleName() + "(" + kernel.getClass().getSimpleName() + ")"; + } +} diff --git a/src/test/java/me/lemire/integercompression/BasicTest.java b/src/test/java/me/lemire/integercompression/BasicTest.java index 6743017..51f90ee 100644 --- a/src/test/java/me/lemire/integercompression/BasicTest.java +++ b/src/test/java/me/lemire/integercompression/BasicTest.java @@ -17,6 +17,7 @@ import me.lemire.integercompression.differential.IntegratedVariableByte; import me.lemire.integercompression.differential.XorBinaryPacking; import me.lemire.integercompression.synth.ClusteredDataGenerator; +import me.lemire.integercompression.vector.VectorBinaryPacking; import me.lemire.integercompression.vector.VectorFastPFOR; import org.junit.Test; @@ -45,6 +46,7 @@ public class BasicTest { new Composition(new FastPFOR128(), new VariableByte()), new Composition(new FastPFOR(), new VariableByte()), new Composition(new VectorFastPFOR(), new VariableByte()), + new Composition(new VectorBinaryPacking(), new VariableByte()), new Simple9(), new Simple16(), new GroupSimple9(), diff --git a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java index ca919d4..252cfea 100644 --- a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java +++ b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java @@ -13,6 +13,7 @@ import me.lemire.integercompression.differential.IntegratedVariableByte; import me.lemire.integercompression.differential.SkippableIntegratedComposition; import me.lemire.integercompression.differential.SkippableIntegratedIntegerCODEC; +import me.lemire.integercompression.vector.VectorBinaryPacking; import me.lemire.integercompression.vector.VectorFastPFOR; import org.junit.Test; @@ -39,6 +40,7 @@ public class SkippableBasicTest { new SkippableComposition(new FastPFOR128(), new VariableByte()), new SkippableComposition(new FastPFOR(), new VariableByte()), new SkippableComposition(new VectorFastPFOR(), new VariableByte()), + new SkippableComposition(new VectorBinaryPacking(), new VariableByte()), new Simple9(), new Simple16() }; @@ -165,6 +167,8 @@ public void testMaxHeadlessCompressedLength() { testMaxHeadlessCompressedLength(new BinaryPacking(), 16 * BinaryPacking.BLOCK_SIZE, 32); testMaxHeadlessCompressedLength(new VariableByte(), 128, 32); testMaxHeadlessCompressedLength(new SkippableComposition(new BinaryPacking(), new VariableByte()), 16 * BinaryPacking.BLOCK_SIZE + 10, 32); + testMaxHeadlessCompressedLength(new VectorBinaryPacking(), 4 * VectorBinaryPacking.BLOCK_SIZE, 32); + testMaxHeadlessCompressedLength(new SkippableComposition(new VectorBinaryPacking(), new VariableByte()), 4 * VectorBinaryPacking.BLOCK_SIZE + 10, 32); testMaxHeadlessCompressedLength(new JustCopy(), 128, 32); testMaxHeadlessCompressedLength(new Simple9(), 128, 28); testMaxHeadlessCompressedLength(new Simple16(), 128, 28); diff --git a/src/test/java/me/lemire/integercompression/vector/VectorBinaryPackingTest.java b/src/test/java/me/lemire/integercompression/vector/VectorBinaryPackingTest.java new file mode 100644 index 0000000..2746b11 --- /dev/null +++ b/src/test/java/me/lemire/integercompression/vector/VectorBinaryPackingTest.java @@ -0,0 +1,48 @@ +/** + * This code is released under the + * Apache License Version 2.0 http://www.apache.org/licenses/. + * + * (c) Daniel Lemire, http://lemire.me/en/ + */ +package me.lemire.integercompression.vector; + +import static org.junit.Assert.assertArrayEquals; + +import org.junit.Test; + +import me.lemire.integercompression.IntWrapper; +import me.lemire.integercompression.vector.VectorBitPackerKernels.LaneWidth; + +/** + * Tests for the vectorized BinaryPacking codec. + */ +public class VectorBinaryPackingTest { + + /** Every lane width packs and unpacks back to the original values. */ + @Test + public void roundTripAcrossLaneWidths() { + for (LaneWidth laneWidth : LaneWidth.values()) { + roundTrip(new VectorBinaryPacking(laneWidth)); + } + } + + private static void roundTrip(VectorBinaryPacking codec) { + int[] data = new int[3 * VectorBinaryPacking.BLOCK_SIZE]; + for (int i = 0; i < data.length; i++) { + data[i] = i % 8; // mix of bit widths across blocks + } + data[5] = 1 << 20; + data[600] = 1 << 30; + + int[] compressed = new int[2 * data.length]; + IntWrapper inpos = new IntWrapper(0); + IntWrapper outpos = new IntWrapper(0); + codec.headlessCompress(data, inpos, data.length, compressed, outpos); + + int[] recovered = new int[data.length]; + codec.headlessUncompress(compressed, new IntWrapper(0), outpos.get(), + recovered, new IntWrapper(0), data.length); + + assertArrayEquals(data, recovered); + } +} From 53bec6f2c155c26d83b9b97854b5796d034796be Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Wed, 24 Jun 2026 16:32:22 +0000 Subject: [PATCH 411/412] [maven-release-plugin] prepare release JavaFastPFOR-0.3.14 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 5535a25..0d52d1c 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.14-SNAPSHOT + 0.3.14 jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - HEAD + JavaFastPFOR-0.3.14 From a6518ff792317dc029530cdf4e05af3c4e4fe19e Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Wed, 24 Jun 2026 16:32:24 +0000 Subject: [PATCH 412/412] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 0d52d1c..04b8995 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.14 + 0.3.15-SNAPSHOT jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - JavaFastPFOR-0.3.14 + HEAD

    + * Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second + * through vectorization Software: Practice & Experience + * http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract + * http://arxiv.org/abs/1209.2137 + *

    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%0D$ETfl)fGIi9Lv!K;q0w?v%PUQlAc2I)s^dyAo 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�YSS?3U9RV6sayfiY`KQ zipjQAvhXr1dMqt^(Fe3VFlS-Up?azI+DirG->Zpn8Y=Y_IKB{);Og2toQ~{pWD$w$ zGJ`iU6x_^+P)$c3)231jydIieA*n7Bm@dyd6jP^{YO+(A*zJ+j9Y;0Fnv0EKjD!WQ zNJZ!`P_+7XC25zS`5ze%GF0KN)*iL$%86ywncWO|szCLCbr76Qrgkef5han7@j$;+ zc3}y}?`O5rBSC`Wl2cnWC;ePHR9!8OWeH*d6|T8KxI(fQq87}oBxTdI#4?d-)UB(C z3CdUeKOM{_uGcT}nJiBgYVfH?mRsxts&4%|2{OxUr3y{*rGUgFc_ckm8(Qs zOazhlYIIPqw%X&%AX5ZlFI`ShZJ6BI{MOdNKBjPihrX z1@>DGv<5yl5NQvB@P++UKB=JI`mXhXcIcUR9$r@1RhAsaf(I?`wz$xq|p- zgY%THQB9I1e8S012z910P{N(EvH|glI<+&o*M-QAx1=*RlSZV~GDVERTg9iI;wwfD zql29jiSrXf$?@@22#cU0^b&tWYy))J1oFj~M9ovYQv+TM#IsX!a{#+mQ6>RvD;!k= zc5o+?Syd{aAet@~;L%Cv1{zjd+7kq)O2kw{fs@~o7-$a`ibt3$o&qSkCza$&fCs$Z zvp?%c=DU5^$sML?3HuE%aZ%%?zF#Tr#VZ)<;Vfpn4)oP!>+wukw>Oby zR}ZAQj3Swy={G|xQI}XUd@6H8uBX!VL~_m2YPS($gxcK@=}n&`I=)zLUN(^r)l6AB zW!IW`?LaDnK;fuL%KQ%;e5$rMgf%A%R1YLP=KXiLQ&B7w*;#^}NOHocRtSHM^b{XPOiai@=3%%7Z& z^t$w?dx30sjgXtfleb`naZKiX~)QuBfG8in+_4xrD_qimwpI| zKG5q#1-!Y#3kQri)`N7R@T^ot3qS)@B3&6$UzHiYt#e7R7t^KaZo=t((c~MYnjK?} zm^~Ges-5y?05OzQtb`U;IX1R=vVwCEjsu~@m+Zwz)vV{)NF^;A14KR%OxSCugb#wP zJ&Mtq1MgLh7jnxnL8Ss%B7t5|i(vO2Gj)p0JGE<|P`G)qP^5*G3PB+0;>yiaR*}>j zC(Rd{r`k0+q#^F;mpYr%K-Vzm(vmoDVcXk{#cxb-S78M=je(`7c_b}o z_rdtI7xU6&jCg}wwQC-?N>GMGs_ns(Pr{&lC<{ARnU{UpjpCMpk#aFUy?G)McIIIsPIL zSMX}^B5IRBRjDpGo>s7R<=zF-02u+XC4>aG81+b8u>W~>P>9O}I z;!mzd(ggi~E!7#Qpz$I{sCBC#D}?Ji``taSqw;-9bdanAV!LFz1jdcVoDj3sRgFM1 z9f+jTP6|^?|3^{`Rkn!!Oup0&P-v5c*Cd%NoI~~?nH&hE(3%qzq&%cok^)o$G!F`x zCrP!%GH()ue9YKopLAfH|5qv@F^FaXf!@aJyFxVGdxZ8#lV;5j|=IXi(VYBO!L-HkiY?q=TLf zqpEnZFDYO2EFX)D74EJrUtbY7XOK}LNKbM+kusSy{4E3Uxz|Uzf;g2teHa0HIu>e3G(4_A ze0+nNO9@5Ij{FTocVa-8Ce;K~66g$>*EdN$L$Bd8tC4V0zGXMHh*z^dlont4&lY|! zGO@f>ZE}%~ZUY=dAD5vtJW_Ig0ro{`mfXd{eIpVEY^@-L4Z^_)LkcZwR4!A{jf}24 zGSLXE0>VfKl`MUQD+z0-*H)qesbERWY91O@mgpxuip>*-btR{6VSXF%hSX)G>^=74 ze5b&vGuQ+erA6OKfk#B!iXYrZ&Ie22@hm4HKF=DN{q}iU!>tFzQ=l%Q=Z7B;A`^aT zU%w06k!GY)Y$b;59MuCheb~{Q!YiboKm&9F6z0y;dUfeT6kI=eDU`n0f~}q1hfdE_ ztWVy!8K$5#Nl`!P)XOJigCYz<3Z%nGuMpm+ek8Ehm{K4+~Otf;1Fk z839jlgwONH75R@j-coc3|MBtERZ}&6WP?}K)-~k#*|Cl>p)H4(68(yt`NteE zt}5nh#O&Zd>ZXOQi>U%$$KQ6pjh9Fqr%T1!mtdo zEi@{S3U(_F7O5q{da#6OcdBdJ@v_2m(KY2xxrAWU{5!RsDs;9cA&-7j+0OR{1Ox!i zI+&4406bYcflF~GM_S%FCvmD!h?wN4MB16Qv`VR?{TM!Oi3*<#v1AKfYNLki0p07G zqRrcZJb+`H?-a=L<}s)rf4rciQ_|?jbg_G3=A@dOnF}Xv`gMv3N8*HH{Hy@}8Hzeb zJ^P-dnG!Ee7*+e8a+<8izyd-+tp_t{{QfoazbPiyYMh$Hr(Wyx@8m#BVqKqc5-ytH zKSAqU^O^p*qkxx2p-qb1l@lE)LS#d}89hjCl&8wNl9XunQgNxmA~jrugu?&cH6D1y zWq_H}l!P`XPDCr{NfJQqWpHQKV+@A2#!^z115M5eYBf?$en6k&Fb^_XtxuBa{eUrj z`N=KCCupcJht82^c!brK`YLN;cE(9BN>m&)zcTnQo=O3O5YRgByC)qr;OPzikO^sj z5RJ7~I$((t?Dc!d&i;qpDc%HF*L<@_Erc=(Q2Q`vx7{Tf*S_QunOsf7ouAjp=kz_K z*9k})j%nd%-Tqpc(t}vv{-GL_Z{V~|zOAIOngg8f-U6DxMZ=zsW@Q%NKyq?K4JkSX z-#F-O(FBKj#?(k5YVRv*weV#Nr1Z9joPQ2UWe zRX?E^zxS%z=v*W4XpYRK1}^zKF_jsLWUr2(Y?@&F_Ay1I4IB*4N$3G!)fl4F&}DiA zt^8A{e6h7}(8N!wb!Eg&-AlQ)_JQ*RD=x%mwWtVO#qm8wy?7=v1r7^Mc`?G3Dg%gK z8#DHYryLPoZ*((n4lY(W($jSYt<1HY&nFNw|azDkz`2=n$D?K55JM*9Wv<_?t)7bMRDLcToe5R*%HzD8Z#l*zpe>UF_@W zol*{zqb5el&^`)aeK&ROx!*F=p$ctRlrSm8buM10Q7kMys@418Y~B5M?l;@pAT0orDPgHjIs3dXJ~d}?zHh90!qf|2x(HTd&a4*(FxY9lDAUk zzde<1e`+CyjWk=0X(YWs=YeIH`u-}aav355xm4R& zrunY$*6t`BpRuH|+KD@V8ZB`8q?mFynINHQL1Jjcl6Twwo*3vHxl=%C`9xLYe`8OZ z`#F&*rAoMBvp-v*B+cGA8B`PpQ`+P(0L|&*Yb$cj-|?EnDx0Y$kZ;gWX-EZn56g+! z?~JnG*QAVw)dl#ot-1=m<(sAF5-@N^2evIT)1VUS;ia@q1V3O>Nk(c2xRG)pB=e z8WaqNS6(;;0ft=Ep5M<=QAqSRZ(6|lKRL;f>Zj&>RT>i5i+|&t+lz( zDCy+BX&)vLz~-pp`xVL@NgimU6+cx&3jr;cqXu&-d4*0s#kz>to7uA{A5)6BY5-3X zC%s3WR2R0&7TZ!!!~R82jZw4Y0E(@~t*EDCBGDNAEUqKO)0`R%Os8N1=LEHfa+AUQ zP}sW)tC>#n+|GEwAD-2eY82R^q6t$yvmhJQl&Y&jH8IA|x|G!5YL{8mpc94W-M|$& zy4MLG<{EHn)UKHw?3(hV4DtMHRI;iOfFzOx8BD|DA(4-q2SUabkP3k2O#8U9NBwB6 zG+~A#>f&L??Bm&J@p|vUM$+1Q=;1T|cN<^k*F`&w5)8T^!pDQ{NnNk)BBR!tMZK1# zN=0!RA2ULA7rp{BDq)11SeO3rT#xyixguEF21!B1(c9@#Zr4H`DkP>401cIU`*4La zZ5%+1RG-J*8tFRCX$~5P$K%b!vl)=*qcb&JJ<0Ds2CwSO zQn>yRlJXh|r}mhX!lHt-ILU^&t6x!5Jc>UtzGJ;1e!UzLul4e9P2!rB%JZ5l2OpKN zgcr2|cM1Q>;q;B%rcMQ9?v0zC^14H7TH9+l=fU2%N4z;}3Q0&Dct{7sx$T5d7MNl2*A`d#d(dhlxm%>bA<3y>pzv!9Bw>EU zvPycgSnM0yDX@9&39u<7M2zf$n%_rc$lW)X_~nsfGgRf zxb5+JklkqTXua13U6dIdhgN&T#-t@zV!laAm6wZ7cOoKB*YWp0L_}6jk>MWvnK=gw zdDMw-+>oKx@@y~^C;>3b)ROT*$(`ZK)|+R`u(3V$LlO8ZF{~y8KLgU+-}9b!DSbb% zE^KW_qfhPb_s#}D2K@g}hi1*WF`$}~rKGKv;z<=JP_MAay=bFt+sGo0jnm6lp?wNJ z#v>7B1aVs{Q#`Lpz%GUqsX$v67+|c@4H4JL z4WAR2x3yoKW_ys)@a3+ma~M=rNfb_dkRb9Z#yIxwn|71r!u}k*mH}jg=yrL>+Fh(( z^FU?5&XzbCmmZF<)TeoLSBQefj!`v9P&6g{3l${kx5b?&9#F9#{6Q>(5~6|>;Wa4b zQ%ANQ#9{}(oP&=nbm8NOsk=&TQ(;rZq3?+8$@98kkV>K7dJ zE&uRn$e?-@YiD`l$r5a`j z%SXBQ+L9B&gMXggXwsKCt+(20BKxE03s!_;BoQR=ql3M3F??tLT58PG4o49L7pV01 zs|09`$^&k&XdtE{h@C9?F+FQnjBI75=KAnLfwZW{CxRyDa^En(+O@k z`}EhmRILFUNlkn;;3ZC}Usw``i>s}qLXaRX6>bq18;1Z42L_g&fa}7(w}{H2MW}h) z{7^mD8Y5vy591vEJu%QH1>kR2hDC^qu=*yjKcXp`_ey-_F-uca*f>F&=1b~In2G5VGLm3hA;n`Y1hOX zw!2~tICSZrv_#oAnTi0&YQhA5hqOw=l5lAF-l2mKb3~9V7@q=hj~wNe_AB+o!>5Au zXU2uN^df6c#7MuXoS4P~RfKi_`9tAbJwz;m!TvMeSPNx42 zqlXgI1TU`0P1~0#e-ZybRd3T z%_cEd)o>B6M00~^peT)-C?8xn4I^vYG&I_}3Cvq`2lv^c2jFP+5t9dvi~ton|u0p?q82 zf0M@z4*?S=_)2Ak$MwEVCIr3)Pn92NIc>Ct=P~I$v_P1 zWdbL~HW^i_5nF-42pY=a(^MPrXB_P4?4MN3+n1f<(d#z9jrko(LD6p%d9UMc;{v@v zYyUG&B})I%Cc%GfX(RoWIbwq^- z8iSjgBz_O8{52%Pv~smmrLa+Ok5(Xytcl@Rk9JT!r?}DG&a`D=tO4MSQf^a|>|pvO zH7~ofk(j|KBwV~zCL`_tiHuQ4^TUjhi2a9!P#QP-{nAG41NY$dlO|+r z5Y39<{{(F4NWCPA{-%>EVfz7r*|1Ug>iT5{pyot$txUO@2hXCD%%eWz-ypF(%2Ukf z|Df#<%OF1HpalvAj}#Q{6~Lw`C79e6g;*TG8%GLmReFbzxTI?r~Dg2H=# zzvNj=__G2#1c0)a)lk?ub1FSNJpj52$v5;q9JMf00Hq;ow9<(Xz95Dk$LAhy)nJk< z&gs-8pqbkCFMvpapg3kEN(k%lpp5%Ux^J<=QM%D(J3AF(?+r>A)20cvW>DuXT_xjS zoS7w|Ou{IX$%FHXp!G=v4R>`J@sBVpy3u{lEZHbAYy2tk4#9eWdpoyJ1LZ_XS}J&v zaXFKvmPDb^zh_`%qQ+=UjN7Tz_X*DV90u{I?%TE(r$qcOq8gj3uPcVh?!+kuS;Fo> zk!8CnyW@qFQA}z~l?qhRqxsZ!y4lJ!O(V?JvArdUV;#&MBZtzfXsSpaAe>r$X_(%) z@)|PPhzhzrksLrNfW#8YkC}mBkW1fFV}}D5K2ycmTx#bmCWQkuYrY6Yhr+@=I}HCK zc2%PO1*7N_*tC))4!zjW<;bSeR=|zp2`8JHmlgm21!#hExs3tFSo}<8L5!&=q_F=~ zDeM4C5~v!S(L#WHY(>MIYTA)BQq{z*dWM7>!IwsaHUu1;)bYTtRi5vOB)k8V1Xxw*?AvF|M!!R0Wk>9_+#NzF z;B&KmmQNdDq(1MUx&rks6rvk?p09*Kyz@6BkjshPy+-Q8=4Wel+!YRh%M0@GYFmrZ z;f`+hCFcQA+bQF&R6xPlycGQTRcTF0oIpvjucHZ}1NN^t-FMO!O&1%a1Bs`l=B583 z6It19S_s(W6=A9B4Sc?N6~7BaKP-3eo54r>ZytUppU<@H4O4O$c?bA`K65BTX5pcW1IL}m{cyiZ|! zGPl;3bT(x}qUisaN7gx+OHsBn=|DYrD=XCpy}wOTyyp>d@g2yU_%~)MsalmF zG2i;Zp3O>WGJ$jm?Nv+mfIsd*Cyn~9jJ>8Tm3fSZY4D{QvY(XDt;Z-~Nwa~d_6CsP z{{%EXfT~9r{!xkV@qsC+F4es>Z~j*zNp}&b5Hwj6P1iUXe>_@%fyw}2ax8K#I3oQa z8(nCUZY|7DT2_w5T+!&8;!13?#6KLMEl*b{C*|A{mGIDE#gpi%otap77?g9v8sC}- z-h`FSV4|CWq{M_^8&dS3czvRvCs0dpq)QH_3j^%oVYBF9 zo8ezY6sb)&{aiz)ly#1d;f;C>4X|SpLv1FwM65tsfnunrg{A9tVV1*QrW7<3zOTdf z@fguP&UI?0fotEXT!uks?Zsfs*0Kg#+1m1%A|_9`YP1oaUd{r$I_&M;%G_TeJjWg$$PBnu6gqJdCPale!}vy_F-qrxJfSV_p+Dgt$I`6J-hM@VSB z;-5`CK^K8~bfbQI>Hx||38$(frtb4<2HP63_82UjB0Y>Kr8Xw7Ye= z<4R~eQCH>vm@4>fY3!9LlQjHuTq*hj3A$SdeD9G$VFU+UY_MIt5cUQO>{6JtTyU}l zxmS2@#lkwMSOAxrTn!TdQSG)KKG7dixu6fj>%t1`dhs6nKrj@$1r zAX0ru;I z*lEU^QX0n0XNsN)gzZjC**X9e8MSHx>`G;n;!c8M;>G|!;FG26i2@j~a$`emW#Z4n z-Nbprd>Xgv+-X}hyyv5aHT6ffObvq$f!XM?ps9zX>Bt`XCA+Tun2)gI99PmG*pJYs z0n#ilOFzleO8@#qFL6X+U*P43hUuU2_7&C*x=5?4Z1JLAB^8NfQnZM_kNGoAP7nj+{5qyTxo z#pc{AVfh^>d-{>`n?sh$MI02E#cRhdh7xhX^lR~5@(w7&q!bs2yFe`sW|?DJBiU$3 z{fbpm>E55_A|}DC>A>V^iD2xy-h&pWv%%U_WKufbLw&&q6ufrM+v5iTAt zGrg?6xE{!w?l5QbFvJ~)fK4Jg0IgXe9nE1Vs~O55lt*rv5m!_>IWh8q`=J-CIi%!y zP*|Ba7k>hlVZ9IF>lX!;Y5CP+$*P8 znc|ETE&Y%;H799id4*USqdY-xmDWtpGyz6g42-haJ`KDWur!%Afwo-90JwBKM?Rqy z#`AZtgb`U(C3jG$4gST3EDS;*2tK4jZPm8le|n-%T`29d^=P$PDg`i(B(f~=Upnnl zJke{_ajAuCm1?59Ey<*DAiD-%u1HU~a4Gj_HxVV^_w1(J%mE>J;AJ%3`Hs9x4h%M0 z|8%&Bg0I;<(naAPurN0Hh(flLsZe>_!?HO`C9%r)6f?g4<56ysf~MN4;vEL!RA$6N zh7D{*UM+p?xgz5~lD~ZTWX)b0q{fX3au#`#e0;1FbeynYN!eECNJRKQOrl16_+U+QtU$4BT&kT`S$<)GJ}~Oiy0}sf?qr6Ks#eOCIuA zD{aQdZgGm)*DOxVqWI}>IX8gP&9^uTMLQ9TOnk5j3i=vlK&vREJD!cHKcs4sJi&X3 zpFrc;fXGgWJYP6^6a-Ag?vl;{Ou5NpGBag$)7PEpTJ%bi#M4f(i>PUy2?1?xA!@yp zQBVTzW{Q%8y6E(rN9j!ZPsAZ(^9SV25#$0FFOMOf@Vh&; z>`U~8$hf|11~h&)BA>o*L#nufJS*=D>@^Z_hyXA6Vs9!OTfN3b`J}4l*Bzx!Aig4^ zn&^%blZA^$hi6Dwi4EaBa6b*Hc1j+O`h#kcDx~7M#m!#pB0$iw40bRa*w@g?h~oP0 zJ=mgfo$5>&b_v6eI^+R&eC|scbPf&t6xX#%1^&lI3j8HtHJ6THLXx*b-?K`B@afw;u_5Ds3AOlui0Sp{j@ys0w$&#w<_7+R^aNDsw*cKoRGUNU4FyQbmlxS4)E#Cc-A*UyO+8o)$A; zuBTq?$NqS*s?xs!s_PR}1P&Go)_%kz1Hzz3qyj;)+ejP{{1Nl4EDWdc0h$i)j3nAz zna_C#Cj9zAx3?*S#TPj%m!n1#35BxM&RnG&4p)t1f~nhS_8Noa(jr8vP-95}P~>&%*xoM{{~H)aFQYCJlyA>o5&a+k=mDw@H^upl>aACzqC(ulMfWCCtAW% z;OnKx9#jYv_5`mqS&c+1A9u8?1Ugd9Ik}2kwn;;7rb(*J$=M_~*TgN7RymdGf|E)F z?qK%FE!wR_8PF$0mO`we&=g`HLH46?K|9pdNua6URv$2{+$yL5;}c+r=7Ttw`O>tz zc%r@9{D@3s6$c80O5J4<1HWbJz=M_bbb2`K^20Ao+s-ZWmX(he6iS*X;7QVL8~?;q zbumcAn*>^2>;qkHg?H-WGhfKQ+?i5?-il;svj<&A2pvC^+VaCo zZwO`ALEiI1zJ=ErX&4zFRmce-)EN#DOqsV1fT;-tBr>!(T|3zGaf zY*4su~Sx3&e>h6B=lHz}zMbb{PL z6VTxXtPbS5Tif2PBUt{~KJPIG1wri!8tgYCxaKi+ZmBMFQ@;4CG6A2tV|v%oEpJ z=Eq6GZ~NedTBE<%h-yr`?mTtWsi9EXsT6+$HuK##6!*wcR0AdKkaV8XK9PGJcA(jw z@=PDSWU$H~=^h+Y)<}CcTdNg{_8uoCo5$n|gV=z19`OjROlUccjIIr?@aDsbP$xt> z*0pBo6S1Ua>gC6AR}$sOXGYK{Bx)rE+$ggyc~idD#xt21gz23Qu`AQ&2`&P%TAaKz;P=w-!IV_dNP+G-t0+~F&3g%)D}Z}IoMm( z0lD9R^6>ga>ck_E@y(&Q^54rvU=&%pwALgSO{P==z`6`=w4Ke)4{ENwqA)y2uAF)m z*YoIwDZCWGC9DZ`#1&GCVNHe1YzO;gr|kCo?~5)1vM} zSz$?NC`be57 z9{f6q*&u7&qqUAE?8MK{w~buQ){8gsO565-j$&2>3*r;=Aa#^Dd%z!dDRZgx-Tq_% z{v*_=#1GyB_Ef9=*j(CQ$jp|PFueVzqIsuC+ui{qd*EDXM*(YSN)2MfV0=}Fi=_27 zlCQPg;xPY9Jc)(p`dcC!+I&Ss<-u=J;XKDfKMnv@!jtr`pz;=E1`fkY^e2)k8@dRV zEmvG2C@TwYl}sxc1p-vH*Q++E;%Qis4Fk(xa-E(Rw`h9(MeB@CmYtRaufLA6NTW5$ zMZuTuH!@6T3H7v3ajC~LW606fA>t{npUFK-8j8*1FaoufMQnm!RgZt99Kah9LXy6} zD|Ap929`iM#p8gsQYJ3xL?Y`#%U4y2fZx5*dQ97Y6RuSmjh;1@_1j9vR&rIjCrUTIinl6FccdX1q;nbt}HQbk9Q~W)lEDoB6vG%WPa>$V! zt-hB+^o=6TMMiSqLc*Cjxu`959_vx}WYXFIt|{X21*^Y1m9n9I&l7GO6MSursryvf z$d$i!J`^;zIuaYFXB_dW;aM=^L3AXkfhS!GNH$?&(o1r|MPHN$$S6meQ9@TNwXwvR z9J$pU-DG_OMveRiOm(Up>nQPjz1+1l01D|B?Jm>$4QALD)Y9Y0!goGgNsf$wxq|JH z6bQzHjKe%zc&6`Gv*S7qLVO3$ll;X?_tWDYO9)f*Ea^~x&?3n{gt>Ha2dR{^OJ4>h z&~|U)NM?R_DRoBFQOob3eq^z4uaD+B?bxK6H@l>^tos2Ym;joC%v@0r)AJ@0*G`uc z3bqck>#9qB*~86+oE4DG|Ik^Yl@^He1?)rh=3?Yvh$1RGDqgrplgO|v>>#fFs#={z z?As|(sZMJVNRoV2RB^VR!xXrFI6$Kb*v!~%)scI?)JzIi@CSY#W6DWP)UEu8{^?m9 zR0=;mt8a8@=1*0{ci`d{E>#Do9jEk$k{@#KVcj=$iq13Qo2!y`pjbKna+q;C5H7H> zu1^e!mqC9dvW+P*%ryxu>;^lkZn$$27d}tdN$rZAO+l!1OMU>sf7^ms>(vz2{ml~d z5grtlB0?3XB){CbKhgnpFFg5UH!92ggGW1jidJWxR~MlxPqSMoR*#Ka8jY9OdPx#0 zprI#6-Uw0lQi`c^n}gv8&c+r3x@9CPJ@i30anSwMvTPSsP;wLp0P|6CQW4cw1BRzJ zh;|BHp@xXG4~}Sgi4`DYcDN9&jLa*vryZvUCE44HrOEG>g6R{h0z}wXB~8!V%!$H# zQ5(9T>CCQGLiIwxcZJcU0**y-qg!$j$)CopKjo5EJtT&iB)4o77MB7g3;tk?YCKjb z&0%=t4N6y#*F{DjpH)M6&1OY8Zsl^1;H?<=mu;po^J1Q;!}+!MG|? ztd74;ID&@K!*eboE~(p14}5Tryri^;(!c_CVp={y#Cd`(O3}}l2VjmWBwC3Bfh<14 zSuQq4#x;xeBwVG^?BZu4KIao$JWPU!AoYI}AFHJ{7#Ly1W6cYm3N%B`y1G&n9m{PY zo+Zx8I=#)o+OmT(^;d{2Pa2e2Mt>KIqpqQtk;c8Oc0Gu}ur;B6ieJGm4Rj7Jp z1tvfQ{98QEpYc!e3`4oJQZ86u>nJC9Sq%>`q`ow(%fJuZHPQ$snO6E$LmHqJ4w_Hx zsD|H%N{cos$oTeY0q`UO-*koc`JKEKd?@x8#Hqq*t}TwuZxX~*af~Nn3}t(vX>9bv zj=y$>*;Nz6O=#?%rJJJ^qd1j-o`ljvd{?DX$gpcm44)n~#b|1S!R-MG``0@cSVX#% z@wnD1u9oh3RWd0%qUZ?kqlH2t#<*H!1#qf$B*;`3-BLvCq`VR7LfL%f#D=Jl%ROlq zk3rok*gh#sV#@tOnKE|T^|{c4NZ2e`wl_^F;)4?7SXx>Juv}cl@_2^Ih$l=hugEs9 znuGK7bH;wTkgrX?s`F2Xte05s@?ahRCt6#Nv#4_T8ORzS(*8|IMlDl5b)=1TWe~19 zcG)Xu64!r1;F58grCA}kMXEJm)(_-zwL7(8SvI|`5Wox-CZfX+nT85pMRvO6R9BQGJX>k)b#RdKXGGAd;VC9H!RTj@n>-wH1k08 zw!$`(kpPiTU?_i&{v>{68&ELLk6-aSCkHs^2}b0urrd1qTm4gvK<#J)5=Q!MQWn>>$|&%3iEq5sjK|W&LoxIO4seYU@4DfDmj@+l#tbc7Eb1Jvs}l&b zkPJY9S{J3pVL)R_S1zw?+ zZx)_p$vfI@J6nuvK1UB+jHaC+bJhldqs*wn`pwP?G&YtRiB=~{>VjRuLpDA2jFfBP zk&zM=ca?bO@_(4r+%T6G=Mu`07VuGUE?^!dCl}L4X8fKS_BQmeaq2G*ER{s`g)z)N%TXYU0-0(Y5QQr zaa9nicEW&M(D~@6M(L$@(jilc|0)j4{R;{A@&<7+4iuKYp~?|2i9v_`^HQ&ye1xt& znJWG$Q#ji*x|czNG4>olkAlI{Hb>xQ^jwAKm?n5J22QyqM1ZC**c(c3LM)Ccz{01a z21#4ZWL~$nN72Y;oLqd8X8Kn#8Hujs;<7Nbe#A`hGLOlfWrlM~@y-~6Ev!IMK!F;7W6bJ!>m^`sPVtAH%$=29(zm_#Lpu0F_h5_*Wt zr};oWHUU7pj)ICGFQ!ZQ2W&UHiVG*(+Jx!~$M6jrgnT_e4^W0Y#vE>FBC#@@)dLz_ zPrkww!@3)vey?VGCvuw7iTZc&F=nBP27hw=ApYI32?-v49>N7Yu&zBrXr&qxZjytf zz|gL5*#M7n#O0h@X&F4M3VAT>F^?2H7CT|Z#TJoNYEgZ`AQDTZ&r^q()pisa(a)9{ z38neGwn_MKyY8e3B^Qn*Jkae&VB%@sxKYC5id4mJ)kzf%@UV!kN~y&+e0ZBIO(Cc?Q@QFv_8l@=O!~~;5L$ek)k?)S{%@ZE?hqe)80R8J}!l3fWi6L9Mr!5r0mTa7!LFca|zN zPu17hpw|IpRmNRm5dSkBhuawfac7i@xRyE#?BL#c9v9%&Qmzsv0H3Lun?BKcox63R z0o5E|8hK7qOn&pAXSwuZ;louL4#Ftssoh6osW;N03bM{g+6+bBD*Z~vaPx*PDG*c2 z5|u{`X5WOp!OUa;oNH79Oh59M8jFi#t0IIWb{?-ij8FRQAN6B>2w#U4u#u2>Gi4<#eD{rVgfQ4oY8mE!ss;Ux# zS?1WzH8Xd*YmzRsUE-S3Z5=9&bTxxgWbn(T_O zp~`w$iFV)g<5OCS2br4JgA%QUap~5<_1il|O#F161YyC8Mf#~S3>-mJ&eJ4>Yro1y zi}P@56Af(4c=Q1Kd>9wT#q2Z;!+@0M_)e(QVLGql>eRa;4s2TnSs}VTj#G%78QPdS zl~xm)z*o=48hJ38Cu_~XJNu`45S`Yx8uq}f$wKGi8N%;IZPE18R>`KEHkY5PY08U5 z`;of<8Z(rf5*K|!)r8sRFKmZMz^#JUO@D-yny6Qim;tMiWPVQd*+R}xH`3x8GBbo4 z#OCXSVDn24N9PyOA?^7re9V8EN@96vVLB4`3XO-*eUTW_jmSHW)uK7o$xr9s+Kgxm z0!h$RNUK)fDOFKPMnM*^J!OGR;|dlg?^KdesEDHUL`-7LmpZ*GQIdmrtjk3r>TZyP zpI|NRDH-YxycQd^Z_!G1@ZSo^r;E^)Wl7VQVE#=Z} z{l5@X)sPJ=n1AY2UkF{ADm02}VqE?i+4Lfl3pNgat*1YqxQ1T+RsjxTg> zd6es@yGs%!n=IuxUmyT|82xK8d$VXKojhk1zCl=2MhwBCmww{&mRnhS5?I(1^MJ(S`A7P2l+E~SQg z{3M-`Y?WAE6{SiX$Mw|zv7frR?B;on6uBxP$J2t0KPZ8&J8A6 zd|W9QJhgPY=u2BA#cDB4vI-U&y-5t9?^dG?SaRiV$Q3gZ5a$b$altke6EkiMo1m-5^O6L%VOEOscmke<^z zTGCuH&=JjMaddqREX_e|cm+J;Q(EB0vykor@oPM`k8pkk8R*zK){MeEQWbG7f{JdU zISB+~W32deoXqH||E%A#I$KTp*C`lz1xjcs zmSA<_XOm<|uhWSsT9ql}1Y=9d1ma$*Li0?(*B9tSV*9dCZSEE3-yJmenDP{Q3WJG; z+%4L?LfR9kmIU%uT}00n)R=tIjc}355uB#=A+Xj$z->pxfg#zF$BL(@b~Fa-C9J2y zyh8sbY;^8FE=l)^US8-%YNo8iZgj>08|03x%AbP#4*7H357NGflfxo*=O18azcDFC zMY*F}fJ?`bV`@+sRSnRRnSO;LPO>&D<>=*8owAZF!`*L74@`AL#rE7OQC?ah0~F^5 zim4LGmzbdye*==J6|nj!R1H#qB7PQ{Bm`CRr18`pOce3U^W;#*cC)!AvYJ^2t~r2q zNMPNhJC+|Zd6*F=1x+UDY2hL6paGp{QKs~rSypK=i;zg9X?`9QA#*7}=hy#tEntaa zo1M4+=l1dG%>}a5`LW``Gm1Dy7PLa@g*pHYJr`Ck=bL>x#U9l-vGY0u7nN742P@)k zo2td2CsgVD9ukF`+gyE+w#KysvvX{ImlWQx7SKUt&rWae;yZa#`v;V3tfKZt?hm)e z)A|q@I7lK7;6N*GD--t2^T3Mz9T$wX7)q3&Ks5g4=#$7cv=954aA};6r)QOC;Yf&@ zo1$8T1Y320%$IgZyK0mS4wXur^jp5MR*7mc}p^WnB!iq zAuKW;U&<{WO8LoSO*vooYp<$R;IEN^1!#^jK`I4Q*@se2x!EBe-Y20zQgWE-y40#b zDbTjTb(~68DV#i#2a|l9q3IY1Pt(CU5!C z&`&1xj|)m`)gQ~X_+6(BQIJ*+QYL$)`)6g)lF4I_Me$!+1~dW&Xv*m?)!X#(L=%7f z+k#w}aw2TqR%j3xdtP;DlAMh5cB3+3kqig_DMC%!1_OFLoN7j3Y4W5r;_e{E+1>3f z`Xfz9CIn{-jXkdL8)8*TOb*4)`zAA|^YMxAKcQKWUClO~Zn3!=IvPE#=Au5IOA!XN z52k(+9YV-bfE%}KsjkS#7Nt*p3{O9Bfx$J(Yo>Ec#9hyWzA(-V-Sh>SDei|2K zbQTS2h}HY81=QC#H2VBYANm zt?Hdb%1xk_FH>ssLa)XvB`cNhkAv}1p@=`jM$8xlREshS>_)^usivNlLoF1~+qCUZ zp4o;Nd2LxZ73;pr=^-i8%^)nnzKWNdvD}fsDHPu;6zXJ+Mq{(0IfoWODO*;IM}E!c z;FvfBBr$u&L5#s9jt!677O~oyi=>(C)Je;I%FskWb0l3|a8U#wPC0V0A!vROl%E;D z09*Q!aL-ZGKYWTCc{O_4qPfXXLzeES2Bso;XxP5?G+c&j=5I@>B;cUd>pdbAW3}bO zfQix#J4%kd7xZfR??aAFY}+r0{XzP zq9hkycS!^4K*};KXj(RZD}v@X#I@R4HJa2zCXuzvP>lkqg(GE#Z|F^;Eb%vziRbk? zhiJI2^`*f$$xt!R9FiuHaNhQT$!J=hOmFH>Q}i9oA!UYiNUi&MjWuIFs{3rER;~e4 z7KI?OK7d_PxjW-GII8VKhK;ClZiLH7)LtQ{nJUYqo#3!tn`qKS5=ZERM{qqbLkr7= z#%x-|we9+GJy22v_9L$}&zbKV_y16Li;6@G8yc9Y$f>LgCnx~s`c*D#4@)%@t{^Ad zJYQc2EC99Wcyd?@(L%l%-0cRv8>ejlO)d%B&AdeAgO6HK<)p7qAWnT3-a%psr`Eexlhn7ZpdZuE0~2q+vsJ_ya!1!IUqTaY+r|T|+661(%dZ6DBSv zN$>&eGaIe?-g=p$uzy)fn_~@&8Os(1%`WdIHM(EP5Erc_cJDTpRd%k>l<{{IOcSOd zA)Lm3WHHz>@&?-VhnS=6mjX>XMSPO$9v+ahtjh>n)Lg$h!>D8^4!B*{L&o9q6G)2> z3aHP4{%y}xnF8jR!B1$XRtL$*ks(25VFd#f2F@;*rD}fTNB&7yxNsZ#YbHWe2$7%_ zEdN5lBT^^NBUhcJ29!6lFdRx|+$Qx7Vy{M$v;a;z?Z7oR0z8d6@AOsC%siqb#80D>5c#`_%nX#>0B@{M^c?q8T)pEZA zL$3A9X>Umo<#L!Q5voM`wJXt`4ZU3}7V45Cz@#^R;KdA-X$LR=f?|yZByAY+*deSW z^Xj8>n)lH+{Gs`W6A*N6N)nhHGA|`aKEN#rL=+li0OzULK`P(s!a<55(waYd9w%Gs zb!R7|){sp%eGq&6>KUy)j}2YyUN+?HUZBU$t%1&ISg~KOv*?xLIfeD&=9Ny&M@j!P z=oC%4V$7KDrHRST0`gf&f~MtK3CgLB&;Swm?tI5y_ZY`?N~Cc}{SQCp!j||vBCwGp z1iw)HwHoVP!TEKM`iAKl*@l+H`>{#wDQJA@{By4-fqenPocG3$@c_Qc%dVgmjH;lL zkw4>z;+W$v2wAzQM}NTDLrzmX?pfTb*3OYilrkhAsXzmj`H=(_+oUB$5^@$wumS4w z@pT3fdUtYWAJavJb%_PZ1@%%eQjXguS2E*^Z--R#4V!~hExG{8N};M+&u823XPXs1TI?DKkJ=Mf~i(4V7v0-6bD8_3Mq(fEO!k@vPQQ$i>lv>p5 z`U$I|wCeLFV;?A9{GO4Ek_A?S~)p2y+BhAXXK#4?!CVG7gN6a zgpkbSa1p4!db)EO5@2De!rh=q!0>5l;ezkV@dnXhAicVz=-xWE8?42wTQR+tzelW0 zS8p!oa*+Bb4q$TwTN`!I@pCJcalOpUu$XuW(BKTt6lUF6r1?mTl&Psu&KAcTvXhaof-DwRqCXV-5X?)>LTwRd z+P!k#Kzarr_nPmN=;7~AMF$6Rlu4+DkjiIhY60XhQuEMLnqa^`4K+9k&lMHng6;;d zN*eA7Dh1^jFg5QyE#TUHHB37AqaHO8tc)lZ51Sc%TxRndhz|{X_y+QIul2>;OmQ)< ziH*jg9I2vC4c7&SXK?5MAl^4pR2u{tysf)ME8DjKI=-1Fd=^o6i zDmwz@D#^%nr%*#pkDRg0e?dOLLfFGhIn75^oCAwa`+`XGpMJooR&ns-=SVh#r{jvnPt`@vaNnk0V?Ge0cA&fnPCLR31~%C>lgK? zwy~z#`QqBrF{ZUkVre5Azyo~RyjG{M0j@Vty!rwvtYP(&Ok4rzDArR$8ARlzg0~up z2a`7gcFyUO1)oXsRCY?o2@W8)sXAO8sONd#t~yPFJ#i<~YVTpx`;rkEK6%HFlR1c* zagCt#!=7dZ(}|`!I&pOb|KfXZhd$7DiCZSZ1HQVF482$JOpsay z6Yv}vKCIrTIHOaf@&tVN9esmWf-pC)Dh*)JUM%rLyS0*tZnjg76p;s-lk9-mOO1>@ zW*)AMKdYi(;8OAt>d+-iz@`))IG!-OUAsHaixW1z<$)Ktj#qo`Odj(&Ea zT@#G5{AOB1%~Hj6sOaB; z53aF86oQZ^apIk%ctb!WLB>1jleawRPlwy3Ql-lR8eo)@4x7!CjaEo~?B4W5;!5O$#nL5#*Nt{`5S(&##PmRo9foEI~ zj9CgMBpALl%Z&&mGS*+mk@Ik~`8B5-AraYgoFJJPxHA9ag&Ao=4>el^+oPtT2BR$c zgdOm^q)X}OCX!NBd4g-(P;7Ol;iY7fPALxdm((GhhLXz8Xsenke z7*mz-7wX_-Ul7pIaEgt^@To+3S*V?Bs5knml$u%&cAWf%S*p>Nb0g@4G-B@2gT3YV zJs)pW1v*qVxPHNj=#q%{tBT(kVBo{UL9h+2BRU%tx(ED3^y4 zoM1VCaWR%`_mYls7P|JGk)m^~zGNI?DW!Ld%u3PT_MzRwx}G)sP(>^$hU1{JBNx`A zo#pDGq!T^3$M^IeWvnSUO`%WaULnEsK(=St8ujiZ0gD2C;RMv@NIc^I1x@tQ=9wCIA^Oh<0d5D1(WO!3L<&pw@JA48Zd^frbEK5d@Zl!DU?}Lr zR31Pi(?u8;4p_u+2`%*Ttm-kHQ4SzKD)dO#FwRl}yN)Yu8_7@0-0V4Mk1JGft~D+b z@63i?E0^F2$dFAk%65bNV4ZSew#}fDZ{#TfDhk1Nu#%m=@zbQ8c=2qkx$2l@Wiik^BbtO1M);RbpWx zPq%?{3M=v(hYE{Yi#9)GFZhL{n~a8I7@w5lm!skxCvS!jIz# zmcOKKH_xAy(F%Z0ZKZ=18NavJ6|b&mOhnv~?fHb%7lq1U38FA4Cj$Za6pV)tu9@x{ z2lJW!pIN-rsr((;qT+H9ow~~uWVQ&ei!up-DG4xJRL%rL;Z-qO zojtU%O@+a21uG_Bp(lSe^wqm9m$(v*xP->|l|TM~hZk|b1zR@ z-iA-(Qb=bh0@lZx`F&ov$2P?DrVD4ZYLT&eoAD^}I0?;h;z&td3E`@SNc$WMtC z&hSztJFxXIlustlqhk5#oTq025oog2Zoezx0UzF{#eQ%1=rBco|>M)v|vJ1t{wtR-c;2{adp zm07@-$;h!%nFB^KE|L7{Hwoe10c8`nS0h8pWPVk*=T}-)l7VUAjUtp%O|FIs@5aaigUG>k9#;Na zN~4y&A(YE&rFn-ztKcm#|2jQU43~*G|1=pXj(ro~b6^pMCf;sAFd!SZ8+iH%7W%@Z zI!$czPM;5xCB`K{@4sQEx|K?ta!K$gl~<5h+@V@q<62 zk>DsoT=1N&;i0raj;om$*-s0vXY4ow8PI@!VLs0->8m-rh%ezmF&-C1<6)zjYbMF`tvQgdKfb~fJ1L*(IaD4kf|OQsp!xZq zA`%{vrE4A8pQR3`c|{e~02BbTi6Yl7Nq87h%1E>u0WV54=ctE_XJwP6+>Re`h3!rh zipL{uRyTWgc$8*Aam)n!JrfS_ac)HbJF`h@Y*gzvOQOOFQQc?-QLV|2V1y&ilXhh+ zO(4$CQwqV`cDxk*FBb6R_$|?1b|gy}P`4G&NyktNjSI$Lh# z=8Dj811sBOjr}s8y`vCti2k2t~%+mAdNU2 zRUQk;gBok%SZsx6c0Y*J)J}I)0R$Imuf`m<2zL&W^2wlq$WXs_3|c;;K>n$EEO0O& zAeqcm5f8q?q=)!8W99vQWuj|R?A?wX*O^RJB(4uyW!winR;cPZ_!lP@0>*z#kf|`0(1u!Am~yU3)3) zCkmE$t|Gp)w_Ju1r&n9$+7f-f-9&GaaZ64OjTRVucxPe~ChO*a1#*IN>|NoY<>m?s zsxufC+0c!P0yPlx52(rBvBTEhAg&jYUL1}NA*G4n$+3Gzb9*TJ`cE8(ejl&`#|fCW2_b+ zphGP2<1_r(fm5-Ie~WWQ&K(Jsi|}F*->AEKbGBl>&RHFCz-6JF>#6G98j~NVbh-9q zvmeTB*Ju=#*`92#LzxD=X)^Ruw6p|`0-OXUG->SZrE%gFeq|KL%-@mtJP80y%;Gr- zM)8FsC8jSll4~^(6?yl_(2E94-er#W>XX7DXpm1IZ;XzPFq)X`9t_cVc)$JZIaqZ8 zeY4IKOGP0s*u?cf+&XTlAe9*2@k;dEs~(1T(zN0^WA*SRLD8Dc zimROsEvfAe3Mc8yD*{{=nkoQyGD0+VjWU7Pk1xr@aT;XgHS~oOaXYb26Bn*QxB=ew z)BKa5&7qFIp*6`YCvC4I3yOT8YKP#+9Yy;Ux4W+Cl{Llp)#s9wL{7jwI^l{gom!Vx zO}HA@U%$zxGPd)~eJb*}&Z|<2{J_C2k(DDBYmjI4Y*AK5I^rq2L6YNZE{$j8FAWwe z0)<355Fl3R6bUL;T_b5985<4vh6aK2YEqW!zFag|imUmVR5;m84$9LB^qy!gvnvPP z>xupMP}bK8N#NQjqoFMY3R}!TBIi|R_I`t9MpQw$I$ORE19zfA{4nAXk~N#PGUG9I zAqpL;qMRRP$nc20uWR7GOoqs;#X{2`P#m5@(bnFebA5l_eng&PHBMcnSmZ6hJiS7z z1pKcA=gR6#Ay311{E&h!Fafd$*LG*JXXf`3jZKWpCVW6T z-72|YI%R9yG)O~|iSXbbt3!kA>0n>RzGW+hM?4vjr`TS(bd5}K<6SxQ+nHz8xG*EA-^LN-7~<;OJ0W)oBk}l`@)Qg?6{h4Heb5T&^dhILMghGvYX3YbEZKvRkXS zW4?=M=#a>2XU{BhV$sWV0`YCWT|$-rz@hAPX=I6ywYkfH@jP(c|%;F5aq1W0KFDN@o; zTnMRDxJZyjWj;oJ|NpE_9@!akuQh9C*37K;wO=o1lg;F>!gZIVtG#w!xG)lB8c1~L zXF3!ZVs8UyA3&N8F!H`SlCh8lUN}_33CjH~@XW~a&JNpbcaQ$<8x%cYoNSS*LGPZc zB}P0^PpKakA)~WCEsNR(Il+-{jLb_JfuQ|h!R^so?lo5>L4zL~By)NMP|z-pdDIBM zVL|(ARrsJ`4aKulzYXL;5)$pHZZ-*N)h^JXeo|9U$;dy?S`V+@ZBKDm&fzLCgZkE_ zgp2dDno5S6EBKqU5NU&?&dIiorzf9G(`D8XF-q(OPNM3&dlD(i4t?6?eUV6NXHMfn zqeQX*?j6Q2Q*&x!`C6jdDA z1;TdwaJGHU8nV$&6NgiKxgns1d_M(a@N4qb;}V^R*a%rt_z&wj;Uh;3O=kf{0~UYD zh|=%`@@~(KYE+K;1I5BjF!yl1NhiBTgPjsa>u5BLmo-^e^Eb~s*M7E#C4=PkvWL2~ zD$Z({T)!g~V@kC(hYT{!P$Rfv&!F=Oi_)Eu=1NLegj8CFo$f-=sU!x_(Yq3Be9%fT zL7pIUpYM{B^L?p3Tv0vxNt7K8(G5~_yq*b12>3mLpkKH;##ZfS4&Z?tS1K=alHhxM zUJB&Xt4j_xRG1Q5ZA9FXq{)j*!QT$dwcE-fa3g}gzC+)wW@ak(B7;w@P@^?00jVVU zAf;%KL^)bQ^s)W6zp?~cyFC{cRyP_PR_}kqd;;l$qvYqjJ+gti9}s`kcT)<)ua#DiC*vB54x4$&vqDX-a)55hW?F^PM`26dwB!}`47u!L!DJ2|fxQh_Jg zimu@x!oMr9VMHpKUiL24|-ykkOM4>ho+yJ=9CF{T5=n{g(M zJ0iPL?&7P`7z$Ns`y*Eyoeo<$ja%#bO&5@iIDz|GGD5ytXF?Sel=mE9BXuNLfDowG zQm6r6`wZUmo%4!5cXKWC$_29J2X)z_AHP-|@LC!L`?*R`1n}M=lnNZdH)`IzPjuBe z(BB0y-f$St(t)Clj0I7%eG*4>)%_!ISWHLbSi<>)g`_1BOdW!9cw3rARP#`fq2%I_ z?+4av2zSs*?crQ09YAu_Y>azwK+~z;g!mVg*dDh?AWcpK6a$q}LP7zK>9;I^^~hFa zDnC5jwKW-t$2QY?E+t!Cl&wcH1d8yl#h6gCsuMx~un|P`%E<9$nG%C9rR-l^4j4CY zZXV-im+^dYsR{s4!GA*$rK)5xMy#}| zPQGiW5r+%4Q;PD)8;Zog#<}wc7^r?cId4pPZ)D_#9+gaDbo;4Ep>s9VHbokrMKdVF zwuJER2OudK?I#RDn8tWLW8;NfK6*j*O==PAu%mj<;Qt?rg@oZ)Xa*e*V~v`wlY~a2 zL<((*6N@=r6rT2B3KTEK`rDS5gm=QptCBH{jrer6t0 z7a-Q4ca_NpX(T0cB|qxsxp=htQPI0-!hs>ictK{KLFsWGxQDb$Y}Yci})Q{yMP`#|K)6=?zT+%<*xaa@X^ zQH0}xAGDZ8FKLBQEh!FT`?XVeLz+CwwJTSv&7o~SlD>7fM2j)Q=Lr4)vdVA@Z++wC z4d09@NL5LJ@NIVeHd|}5Q})shCH%44p3Nh?@lC_-cV;qwcwDwnNx$f4 z@AR=u_lvG@y_)&fiw>V}kaG3>IhhKj1{I0DT*gsFc^G@E6HRLX&0o~_C#Mz&b;s8j65?NpJ;sadS@g!~urAOd zTP2|(XH4|IRjNr$5lf017QDfUdzipAO)`Ie%%6b=;vCeJ6+uycJ!A(^BK{ZaecOA9u~#ria3+vaBMAQ+?GzzT zDWQywu)t@g$$4Ih2(y+tGFVmJLHqdQ!67+Is(pdQq1>ozP+yLJ9}V~z^V&D-m(|)I zTvtW-shw12PvOlMkNr|ZPgCPht4QCr00kkhU@k0RGV(`TvA?3D>Le2d@uHIaOE`y$ zfU? zKc7v@ZbgVg@W6C2=S~!*SB{AeT~oqq8} zqR(Qfbi#8=zK`S%?o!z5wd=ztE3z(l%0fWj5koEiRC8i~TXYc%p*sl))Y&*8mpkp0 z#MPi4fgz8&Jkp}^*E3cUYS#HtZB|KypbclF_nuuf(mYfn{K5HkCNO9F|XD@}@Y{EK4{^s$A&LVC`k1 z3UFRiFvOe|riueEP8B^XkdIO-9z~%g((7#iCu#<}6uDj*u zk+?ZHfeEo3kgfL%*HDrJu=_>jv)uvy?l(_-n1J@%mbwf0E*BpWP3`0;82={0vN%_= z#4!F7tY*Mz@PlrR2HS{MI)2oYSSGh3hXg9)H!wRi6y)E**UzZJ0}oD{`eEdFc;^et zJxN*lr^@P0%i5RVBoY_wjQ_o4sl-4Mo*|#NU%UWI@`Wi1i}~l_Mm2k`6o;6r_pZwo z{xjvBxDY8Gz}|kb;b?KBYh;;+azNdzOP;chwCMj65h?zerTcsoK_#uNTH6ahD(^yu)BqoKtD6 z3OIRcWE}oZl+fV#NJ;pAhhRW`j5k_g!?2Z#l%tqEo1*;nCMYh+J~iQc08A4W)AMHu z#>)iA_Q{kO>OU_pHI~AWTJA)^!Q7A}XMYC76)NfANW~1PhM&&3BdYRTSV^iV(ncaU z4Bl3t9JqHl#^rZNE~|whrMR@NKwm$gFVj23ixVKNRmZ6nEug)eVoo4Ux+I z4J3pK*b7QXS(YvV^n#Wo(M)|a1JcD$!I4}nf8;beNUsh-fUvkx1^?MKK4@JzCAKp@ zqCn2d8F50m5NN3%Fe6+WHIP_(C2+I?+B3AxK?FS#oHOIQ%}T5E(c;f#`;N zwQh8lgzd_LZs77rhbSdbG&vvD#qo6-T#|%@fct%Jqp&%!P%?tgp4v!wbO$kJ zLQ6TzUrLG|!@RP1cG6b+TL_{o(JIKez6HpFc?PUUB&$C75%CW^xb znk6BHVtdb+Ln3et>rS3&rZ9Ejl8oKb>UHj!z!Gho^9zBaCt23?sC)m9pm*)4 z@dPanubvdY?h^+@B^p~0H01atRad4175_SR9#v1hT~WmSx(1^Grsr74oGXdYz(Og+ z14q_-3slYA!^)9}F^)Y}?2al}OK|9SJ{Qs5Db67`Cgh2EBd`T5rQkUT z4V6U2;e|Cij~n7`mXt?UiWIQTQef(C;00&1TS3S9%eSlBO8+L@pJJ8D0i=P~t@X6O zAsv=O2QAiKip=Lh$3t)H%u?MjX~ZAHOO_}XaU`0Rr*ls;2>cY<1pgMxo=}|hkTscE z_fpYRQiPUS`PGUvESPsx;QCWMl8Aw!B=`vj*A$Y-8LG1p4IN|q3x&={M<>q@N~~9V zs}G8#$vq?$yEn^UD%rhfy))W+cj7E;OqQb5nZ^s=pJN%P8-!3X0nOE(uu?1qF@h;z z0n>NQ+uWfVJaC)FuDa-dHBx@g7 z4t^L{$?heG?W-hUBRN)Hp=9skuLPtNkfY1NIn4-mo(~cXQQsg`W6@,>&2JJ;rY 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

* Daniel Lemire and Leonid Boytsov, Decoding billions of integers per second * through vectorization Software: Practice & Experience - * http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract - * http://arxiv.org/abs/1209.2137 + * http://onlinelibrary.wiley.com/doi/10.1002/spe.2203/abstract + * http://arxiv.org/abs/1209.2137 *